Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions app/controllers/course/external_assessment_imports_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# frozen_string_literal: true
class Course::ExternalAssessmentImportsController < Course::ComponentController
Service = Course::Gradebook::ExternalAssessmentImportService

def preview
authorize! :manage_gradebook_weights, current_course
@result = build_service.preview
render 'preview'
rescue Service::ImportError => e
render json: { errors: e.payload }, status: :unprocessable_entity
end

def create
authorize! :manage_gradebook_weights, current_course
@summary = build_service.commit(on_conflict: import_params[:onConflict])
render 'create'
rescue Service::ImportError => e
render json: { errors: e.payload }, status: :unprocessable_entity
end

private

def component
current_component_host[:course_gradebook_component]
end

def build_service
permitted_params = import_params
weighted_view_enabled = gradebook_settings.weighted_view_enabled
Service.new(
course: current_course,
actor: current_user,
components: permitted_params[:components].map do |c|
{ name: c[:name],
weightage: weighted_view_enabled ? c[:weightage].to_i : 0,
maximum_grade: c[:maximumGrade].to_f }
end,
identifier_mode: permitted_params[:identifierMode],
csv_data: permitted_params[:csvData]
)
end

def gradebook_settings
@gradebook_settings ||= Course::Settings::GradebookComponent.new(component)
end

def import_params
@import_params ||= params.slice(:identifierMode, :csvData, :onConflict, :components).permit(
:identifierMode, :csvData, :onConflict,
components: [:name, :weightage, :maximumGrade]
)
end
end
11 changes: 11 additions & 0 deletions app/controllers/course/gradebook_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def update_weights
level_config = persist_weight_updates(updates)
response_body = { weights: serialize_weight_updates(updates) }
response_body[:levelContribution] = serialize_level_contribution(level_config) if level_config
response_body[:capTotal] = @settings.cap_weighted_total
render json: response_body
rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotFound => e
render json: { errors: { base: e.message } }, status: :unprocessable_entity
Expand All @@ -43,10 +44,20 @@ def persist_weight_updates(updates)
Course::Gradebook::TabContribution.bulk_update(course: current_course, updates: tab_updates)
Course::Gradebook::ExternalContribution.bulk_update(course: current_course, updates: external_updates)
level_config = persist_level_contribution
persist_cap_total
end
level_config
end

# Persists the gradebook-wide cap-at-100 policy flag. Skipped when the client
# didn't send it, so unrelated weight saves leave the setting untouched.
def persist_cap_total
return unless params.key?(:capTotal)

@settings.cap_weighted_total = params[:capTotal]
current_course.save!
end

def authorize_read_gradebook!
authorize! :read_gradebook, current_course
end
Expand Down
15 changes: 15 additions & 0 deletions app/models/course/settings/gradebook_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,19 @@ def weighted_view_enabled
def weighted_view_enabled=(value)
settings.weighted_view_enabled = ActiveRecord::Type::Boolean.new.cast(value)
end

# Returns whether the weighted total is capped at 100% (disabled by default). A
# gradebook-wide grading policy, so it lives beside weighted_view_enabled.
#
# @return [Boolean] Setting on whether the weighted total is capped at 100%.
def cap_weighted_total
ActiveRecord::Type::Boolean.new.cast(settings.cap_weighted_total) || false
end

# Enable or disable capping the weighted total at 100%.
#
# @param [Boolean|Integer|String] value Setting on whether the weighted total is capped.
def cap_weighted_total=(value)
settings.cap_weighted_total = ActiveRecord::Type::Boolean.new.cast(value)
end
end
Loading