canvas-lms/app/controllers/planner_overrides_controlle...

188 lines
6.7 KiB
Ruby

#
# Copyright (C) 2017 - present Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# @API Planner
# @subtopic Planner Overrides
#
# API for creating, accessing and updating planner override. PlannerOverrides are used
# to control the visibility of objects displayed on the Planner.
#
# @model PlannerOverride
# {
# "id": "PlannerOverride",
# "description": "User-controlled setting for whether an item should be displayed on the planner or not",
# "properties": {
# "id": {
# "description": "The ID of the planner override",
# "example": 234,
# "type": "integer"
# },
# "plannable_type": {
# "description": "The type of the associated object for the planner override",
# "example": "Assignment",
# "type": "string"
# },
# "plannable_id": {
# "description": "The id of the associated object for the planner override",
# "example": 1578941,
# "type": "integer"
# },
# "user_id": {
# "description": "The id of the associated user for the planner override",
# "example": 1578941,
# "type": "integer"
# },
# "assignment_id": {
# "description": "The id of the plannable's associated assignment, if it has one",
# "example": 1578941,
# "type": "integer"
# },
# "workflow_state": {
# "description": "The current published state of the item, synced with the associated object",
# "example": "published",
# "type": "string"
# },
# "marked_complete": {
# "description": "Controls whether or not the associated plannable item is marked complete on the planner",
# "example": false,
# "type": "boolean"
# },
# "dismissed": {
# "description": "Controls whether or not the associated plannable item shows up in the opportunities list",
# "example": false,
# "type": "boolean"
# },
# "created_at": {
# "description": "The datetime of when the planner override was created",
# "example": "2017-05-09T10:12:00Z",
# "type": "datetime"
# },
# "updated_at": {
# "description": "The datetime of when the planner override was updated",
# "example": "2017-05-09T10:12:00Z",
# "type": "datetime"
# },
# "deleted_at": {
# "description": "The datetime of when the planner override was deleted, if applicable",
# "example": "2017-05-15T12:12:00Z",
# "type": "datetime"
# }
# }
# }
#
class PlannerOverridesController < ApplicationController
include Api::V1::PlannerOverride
before_action :require_user
before_action :require_planner_enabled
# @API List planner overrides
#
# Retrieve a planner override for the current user
#
# @returns [PlannerOverride]
def index
planner_overrides = Api.paginate(PlannerOverride.for_user(@current_user).active, self, api_v1_planner_overrides_url)
render :json => planner_overrides.map { |po| planner_override_json(po, @current_user, session) }
end
# @API Show a planner override
#
# Retrieve a planner override for the current user
#
# @returns PlannerOverride
def show
planner_override = PlannerOverride.find(params[:id])
render json: planner_override_json(planner_override, @current_user, session)
end
# @API Update a planner override
#
# Update a planner override's visibilty for the current user
#
# @argument marked_complete
# determines whether the planner item is marked as completed
#
# @argument dismissed
# determines whether the planner item shows in the opportunities list
#
# @returns PlannerOverride
def update
planner_override = PlannerOverride.find(params[:id])
planner_override.marked_complete = value_to_boolean(params[:marked_complete])
planner_override.dismissed = value_to_boolean(params[:dismissed])
sync_module_requirement_done(planner_override.plannable, @current_user, value_to_boolean(params[:marked_complete]))
if planner_override.save
Rails.cache.delete(planner_meta_cache_key)
render json: planner_override_json(planner_override, @current_user, session), status: :ok
else
render json: planner_override.errors, status: :bad_request
end
end
# @API Create a planner override
#
# Create a planner override for the current user
#
# @argument plannable_type [Required, String, "announcement"|"assignment"|"discussion_topic"|"quiz"|"wiki_page"|"planner_note"]
# Type of the item that you are overriding in the planner
#
# @argument plannable_id [Required, Integer]
# ID of the item that you are overriding in the planner
#
# @argument marked_complete [Boolean]
# If this is true, the item will show in the planner as completed
#
# @argument dismissed [Boolean]
# If this is true, the item will not show in the opportunities list
#
#
# @returns PlannerOverride
def create
plannable_type = PlannerHelper::PLANNABLE_TYPES[params[:plannable_type]]
plannable = plannable_type.constantize.find(params[:plannable_id])
planner_override = PlannerOverride.new(plannable: plannable, marked_complete: value_to_boolean(params[:marked_complete]),
user: @current_user, dismissed: value_to_boolean(params[:dismissed]))
sync_module_requirement_done(plannable, @current_user, value_to_boolean(params[:marked_complete]))
if planner_override.save
Rails.cache.delete(planner_meta_cache_key)
render json: planner_override_json(planner_override, @current_user, session), status: :created
else
render json: planner_override.errors, status: :bad_request
end
end
# @API Delete a planner override
#
# Delete a planner override for the current user
#
# @returns PlannerOverride
def destroy
planner_override = PlannerOverride.find(params[:id])
if planner_override.destroy
Rails.cache.delete(planner_meta_cache_key)
render json: planner_override_json(planner_override, @current_user, session), status: :ok
else
render json: planner_override.errors, status: :bad_request
end
end
end