Files
edx-platform/cms/static/js/models/settings/course_grading_policy.js
SaadYousaf 684be2382e PROD-1284
2020-06-10 14:40:58 +05:00

99 lines
4.5 KiB
JavaScript

/* globals _ */
define(['backbone', 'js/models/location', 'js/collections/course_grader', 'edx-ui-toolkit/js/utils/string-utils'],
function(Backbone, Location, CourseGraderCollection, StringUtils) {
'use strict';
var CourseGradingPolicy = Backbone.Model.extend({
defaults: {
graders: null, // CourseGraderCollection
grade_cutoffs: null, // CourseGradeCutoff model
grace_period: null, // either null or { hours: n, minutes: m, ...}
minimum_grade_credit: null // either null or percentage
},
parse: function(attributes) {
if (attributes.graders) {
var graderCollection;
// interesting race condition: if {parse:true} when newing, then parse called before .attributes created
if (this.attributes && this.has('graders')) {
graderCollection = this.get('graders');
graderCollection.reset(attributes.graders, {parse: true});
} else {
graderCollection = new CourseGraderCollection(attributes.graders, {parse: true});
}
attributes.graders = graderCollection;
}
// If grace period is unset or equal to 00:00 on the server,
// it's received as null
if (attributes.grace_period === null) {
attributes.grace_period = {
hours: 0,
minutes: 0
};
}
// If minimum_grade_credit is unset or equal to 0 on the server,
// it's received as 0
if (attributes.minimum_grade_credit === null) {
attributes.minimum_grade_credit = 0;
}
return attributes;
},
gracePeriodToDate: function() {
var newDate = new Date();
if (this.has('grace_period') && this.get('grace_period').hours) {
newDate.setHours(this.get('grace_period').hours);
} else newDate.setHours(0);
if (this.has('grace_period') && this.get('grace_period').minutes) {
newDate.setMinutes(this.get('grace_period').minutes);
} else newDate.setMinutes(0);
if (this.has('grace_period') && this.get('grace_period').seconds) {
newDate.setSeconds(this.get('grace_period').seconds);
} else newDate.setSeconds(0);
return newDate;
},
parseGracePeriod: function(grace_period) {
// Enforce hours:minutes format
if (!/^\d{2,3}:\d{2}$/.test(grace_period)) {
return null;
}
var pieces = grace_period.split(/:/);
return {
hours: parseInt(pieces[0], 10),
minutes: parseInt(pieces[1], 10)
};
},
parseMinimumGradeCredit: function(minimum_grade_credit) {
// get the value of minimum grade credit value in percentage
if (isNaN(minimum_grade_credit)) {
return 0;
}
return parseInt(minimum_grade_credit);
},
validate: function(attrs) {
var minimumGradeCutoff;
if (_.has(attrs, 'grace_period')) {
if (attrs.grace_period === null) {
return {
grace_period: gettext('Grace period must be specified in HH:MM format.')
};
}
}
if (this.get('is_credit_course') && _.has(attrs, 'minimum_grade_credit')) {
// Getting minimum grade cutoff value
minimumGradeCutoff = _.min(_.values(attrs.grade_cutoffs));
if (isNaN(attrs.minimum_grade_credit) || attrs.minimum_grade_credit === null ||
attrs.minimum_grade_credit < minimumGradeCutoff) {
return {
minimum_grade_credit: StringUtils.interpolate(
gettext('Not able to set passing grade to less than %(minimum_grade_cutoff)s%.'),
{minimum_grade_cutoff: minimumGradeCutoff * 100},
true
)
};
}
}
}
});
return CourseGradingPolicy;
}); // end define()