From 2d33b9eb3c8801635f04f169dffc2ace3242372f Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Wed, 19 Mar 2014 11:00:55 -0400 Subject: [PATCH 01/31] Change .gitignore to ignore the bower_components directory --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index f71ae6f4bf..038c4f251c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,7 @@ library-directory-tree.json library-subject-tree.json textbook-tree.json development.yml +production.yml +webwork3/public/js/bower_components *~ From 9aa9d73baae816a3faabda7958fe7886020f6c1a Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Wed, 19 Mar 2014 11:01:21 -0400 Subject: [PATCH 02/31] Change the comments in the OPL-update file to reflect where the library variable is stored. --- bin/OPL-update | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/OPL-update b/bin/OPL-update index fb0c35b1ee..10373be137 100755 --- a/bin/OPL-update +++ b/bin/OPL-update @@ -11,7 +11,7 @@ # 1) The OPL downloaded to your machine (the .pg files) # 2) The environment variable WEBWORK_ROOT needs to be # correctly defined (as with other scripts here). -# 3) Configuration for the OPL in site.conf needs to be +# 3) Configuration for the OPL in localOverrides.conf needs to be # done (basically just setting the path to the OPL files). #use strict; @@ -406,7 +406,7 @@ if(open(IN, "$libraryRoot/Textbooks")) { close(IN); } else { print "Textbooks file was not found in library $libraryRoot. If the path to the problem library doesn't seem - correct, make modifications in webwork2/conf/site.conf (\$problemLibrary{root}). If that is correct then + correct, make modifications in webwork2/conf/localOverrides.conf (\$problemLibrary{root}). If that is correct then updating from git should download the Textbooks file.\n"; } #### End of textbooks From c9c8c48420fb56bc91461aa0fca3a3096232a68b Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Sun, 18 May 2014 12:13:02 -0400 Subject: [PATCH 03/31] Initial work on reduced_credit in WW3 --- webwork3/public/js/models/ProblemSet.js | 2 ++ webwork3/views/main/problem_set_details.tt | 1 + 2 files changed, 3 insertions(+) diff --git a/webwork3/public/js/models/ProblemSet.js b/webwork3/public/js/models/ProblemSet.js index a92797332f..09836dcbf9 100644 --- a/webwork3/public/js/models/ProblemSet.js +++ b/webwork3/public/js/models/ProblemSet.js @@ -15,6 +15,7 @@ define(['backbone', 'underscore','moment','./ProblemList','./Problem','config'], open_date: "", due_date: "", answer_date: "", + reduced_scoring_date: "", visible: 0, enable_reduced_scoring: 0, assignment_type: "", @@ -40,6 +41,7 @@ define(['backbone', 'underscore','moment','./ProblemList','./Problem','config'], open_date: "checkDates", due_date: "checkDates", answer_date: "checkDates", + reduced_scoring_date: "checkDates", set_id: { setNameValidator: 1 // uses your custom validator } diff --git a/webwork3/views/main/problem_set_details.tt b/webwork3/views/main/problem_set_details.tt index b882e39eff..1d57487a3c 100644 --- a/webwork3/views/main/problem_set_details.tt +++ b/webwork3/views/main/problem_set_details.tt @@ -174,6 +174,7 @@ Loading sets for users... Set Name Open Date +Reduced Credit Date Due Date Answer Date Problem Set visible to Users From 4dd0660b80f17a6856a62708461d0cc268dc2c0b Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Mon, 19 May 2014 05:35:54 -0400 Subject: [PATCH 04/31] Initial work done to include Reduced Scoring in WW3 --- webwork3/lib/Routes/ProblemSets.pm | 4 ++-- .../js/apps/CourseManager/main-views/ProblemSetDetailView.js | 1 + .../js/apps/CourseManager/main-views/ProblemSetsManager.js | 2 ++ webwork3/views/main/problem_set_details.tt | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/webwork3/lib/Routes/ProblemSets.pm b/webwork3/lib/Routes/ProblemSets.pm index c2c6586046..a036049aad 100644 --- a/webwork3/lib/Routes/ProblemSets.pm +++ b/webwork3/lib/Routes/ProblemSets.pm @@ -19,8 +19,8 @@ use Dancer::Plugin::Database; use Dancer::Plugin::Ajax; use List::Util qw(first max ); -our @set_props = qw/set_id set_header hardcopy_header open_date due_date answer_date visible enable_reduced_scoring assignment_type attempts_per_version time_interval versions_per_interval version_time_limit version_creation_time version_last_attempt_time problem_randorder hide_score hide_score_by_problem hide_work time_limit_cap restrict_ip relax_restrict_ip restricted_login_proctor/; -our @user_set_props = qw/user_id set_id psvn set_header hardcopy_header open_date due_date answer_date visible enable_reduced_scoring assignment_type description restricted_release restricted_status attempts_per_version time_interval versions_per_interval version_time_limit version_creation_time problem_randorder version_last_attempt_time problems_per_page hide_score hide_score_by_problem hide_work time_limit_cap restrict_ip relax_restrict_ip restricted_login_proctor hide_hint/; +our @set_props = qw/set_id set_header hardcopy_header open_date reduced_credit_date due_date answer_date visible enable_reduced_scoring assignment_type attempts_per_version time_interval versions_per_interval version_time_limit version_creation_time version_last_attempt_time problem_randorder hide_score hide_score_by_problem hide_work time_limit_cap restrict_ip relax_restrict_ip restricted_login_proctor/; +our @user_set_props = qw/user_id set_id psvn set_header hardcopy_header open_date reduced_credit_date due_date answer_date visible enable_reduced_scoring assignment_type description restricted_release restricted_status attempts_per_version time_interval versions_per_interval version_time_limit version_creation_time problem_randorder version_last_attempt_time problems_per_page hide_score hide_score_by_problem hide_work time_limit_cap restrict_ip relax_restrict_ip restricted_login_proctor hide_hint/; our @problem_props = qw/problem_id flags value max_attempts source_file/; ### diff --git a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js index f490257051..b362d4eba9 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js +++ b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js @@ -196,6 +196,7 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ ".open-date" : "open_date", ".due-date" : "due_date", ".answer-date": "answer_date", + ".reduced-scoring-date": "reduced_scoring_date", ".prob-set-visible": {observe: "visible", selectOptions: { collection : [{value: "0", label: "No"},{value: "1", label: "Yes"}] }}, diff --git a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js index c7f16afbe9..67c76ea927 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js +++ b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js @@ -123,6 +123,8 @@ define(['backbone', 'underscore','views/MainView', 'views/CollectionTableView',' stickit_options: { selectOptions: { collection: [{value: 0, label: "No"},{value: 1, label: "Yes"}]}}}, {name: "Open Date", key: "open_date", classname: ["open-date","edit-datetime"], editable: false, datatype: "integer", use_contenteditable: false}, + {name: "Red. Scoring Date", key: "reduced_scoring_date", classname: ["reduced-scoring-date","edit-datetime"], + editable: false, datatype: "integer", use_contenteditable: false}, {name: "Due Date", key: "due_date", classname: ["due-date","edit-datetime"], editable: false, datatype: "integer", use_contenteditable: false}, {name: "Answer Date", key: "answer_date", classname: ["answer-date","edit-datetime"], diff --git a/webwork3/views/main/problem_set_details.tt b/webwork3/views/main/problem_set_details.tt index 1d57487a3c..e7b94d9726 100644 --- a/webwork3/views/main/problem_set_details.tt +++ b/webwork3/views/main/problem_set_details.tt @@ -174,7 +174,7 @@ Loading sets for users... Set Name Open Date -Reduced Credit Date +Reduced scoring Date Due Date Answer Date Problem Set visible to Users From 66fbac059264ea5db3ef17f72d37200acda555a0 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Mon, 19 May 2014 05:47:52 -0400 Subject: [PATCH 05/31] Fixed a bug in which the yes/no or 0/1 needed to be changed to "0"/"1" --- .../js/apps/CourseManager/main-views/ProblemSetsManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js index 67c76ea927..95f94e3283 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js +++ b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js @@ -118,9 +118,9 @@ define(['backbone', 'underscore','views/MainView', 'views/CollectionTableView',' } }, {name: "Reduced Scoring", key: "enable_reduced_scoring", classname: "enable-reduced-scoring", - datatype: "string", stickit_options: { selectOptions: { collection: [{value: 0, label: "No"},{value: 1, label: "Yes"}]}}}, + datatype: "string", stickit_options: { selectOptions: { collection: [{value: "0", label: "No"},{value: "1", label: "Yes"}]}}}, {name: "Visible", key: "visible", classname: "is-visible", datatype: "string", - stickit_options: { selectOptions: { collection: [{value: 0, label: "No"},{value: 1, label: "Yes"}]}}}, + stickit_options: { selectOptions: { collection: [{value: "0", label: "No"},{value: "1", label: "Yes"}]}}}, {name: "Open Date", key: "open_date", classname: ["open-date","edit-datetime"], editable: false, datatype: "integer", use_contenteditable: false}, {name: "Red. Scoring Date", key: "reduced_scoring_date", classname: ["reduced-scoring-date","edit-datetime"], From af44950252a9fd01e26952e96584729440b8f77a Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Mon, 19 May 2014 06:09:45 -0400 Subject: [PATCH 06/31] Show/Hide Reduced Scoring info based on global setting --- .../apps/CourseManager/main-views/ProblemSetDetailView.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js index b362d4eba9..2743a467ae 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js +++ b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js @@ -28,7 +28,7 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ problemSetView : new ProblemSetView({problemSet: this.problemSet, settings: this.settings, messageTemplate: this.messageTemplate}), usersAssignedView : new AssignUsersView({problemSet: this.problemSet, users: this.users}), - propertiesView : new DetailsView({users: this.users, problemSet: this.problemSet}), + propertiesView : new DetailsView({users: this.users, problemSet: this.problemSet, settings: this.settings}), customizeUserAssignView : new CustomizeUserAssignView({users: this.users, problemSet: this.problemSet}), unassignUsersView: new UnassignUserView({users:this.users}) }; @@ -174,10 +174,15 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ initialize: function (options) { _.bindAll(this,'render','setProblemSet'); this.users = options.users; + this.settings = options.settings; }, render: function () { this.$el.html($("#set-properties-tab-template").html()); + if(this.settings.getSettingValue("pg{ansEvalDefaults}{enableReducedScoring}")==0){ + this.$(".reduced-scoring-date,.reduced-credit").closest("tr").css("display","none") + } + if(this.model){ this.stickit(); } From b6c43b62536d25e4555e3b71035117dce4721982 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Tue, 20 May 2014 09:47:10 -0400 Subject: [PATCH 07/31] Added dynamic reduced credit scoring date to the Problem details --- conf/defaults.config | 9 ++++ .../js/apps/CourseManager/CourseManager.js | 5 ++ .../main-views/AssignmentCalendar.js | 2 +- .../main-views/ProblemSetDetailView.js | 48 ++++++++++++------- 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/conf/defaults.config b/conf/defaults.config index bcbecdd495..0beda3bc9a 100644 --- a/conf/defaults.config +++ b/conf/defaults.config @@ -1177,6 +1177,9 @@ $pg{timeAssignDue} = '11:59pm'; # number of minutes prior to due date that the assignment is open. $pg{assignOpenPriorToDue} = 14400; +#number of minutes after due date are the answers open; +$pg{reducedScoringBeforeDueDate} = 2880; + #number of minutes after due date are the answers open; $pg{answersOpenAfterDueDate} = 2880; @@ -1410,6 +1413,12 @@ $ConfigValues = [ doc2 => 'The amount of time (in minutes) before the due date when the assignment is opened.', type => 'number' }, + { + var => 'pg{reducedScoringBeforeDueDate}', + doc => 'Amount of time (in minutes) before Due Date that the Reduced Scoring begins by default.', + doc2 => 'For Example, if this value is 24*60=1440, then the reduced scoring will default to one day before the due date', + type => 'number' + }, { var => 'pg{answersOpenAfterDueDate}', doc => 'Amount of Time (in minutes) after Due Date that Answers are Open', doc2 => 'The amount of time (in minutes) after the due date that the Answers are available to student to view.', diff --git a/webwork3/public/js/apps/CourseManager/CourseManager.js b/webwork3/public/js/apps/CourseManager/CourseManager.js index faa7f2cfd1..938f50b8bf 100644 --- a/webwork3/public/js/apps/CourseManager/CourseManager.js +++ b/webwork3/public/js/apps/CourseManager/CourseManager.js @@ -297,6 +297,11 @@ var CourseManager = WebPage.extend({ date: moment.unix(_set.get("due_date")).format("YYYY-MM-DD")})); self.assignmentDateList.add(new AssignmentDate({type: "answer", problemSet: _set, date: moment.unix(_set.get("answer_date")).format("YYYY-MM-DD")})); + if(parseInt(self.settings.getSettingValue("pg{ansEvalDefaults}{enableReducedScoring}"))===1 + && _.isNumber(_set.get("reduced_scoring_date"))) { + self.assignmentDateList.add(new AssignmentDate({type: "reduced", problemSet: _set, + date: moment.unix(_set.get("reduced_scoring_date")).format("YYYY-MM-DD")}) ); + } }); }, }); diff --git a/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js b/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js index 2c51076a58..a0b0e0ac49 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js +++ b/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js @@ -24,7 +24,7 @@ define(['backbone', 'underscore', 'moment','views/MainView', 'views/CalendarView return this; }, render: function (){ - this.constructor.__super__.render.apply(this); + CalendarView.prototype.render.apply(this); this.update(); this.$(".assign").popover({html: true}); diff --git a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js index 2743a467ae..b6e5a69b19 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js +++ b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js @@ -188,7 +188,10 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ } return this; }, - events: {"click .assign-all-users": "assignAllUsers"}, + events: { + "click .assign-all-users": "assignAllUsers", + "change .reduced-credit": "showHideReducedCreditDate" + }, assignAllUsers: function(){ this.model.set({assigned_users: this.users.pluck("user_id")}); }, @@ -197,22 +200,33 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ this.model = _set; return this; }, - bindings: { ".set-name" : "set_id", - ".open-date" : "open_date", - ".due-date" : "due_date", - ".answer-date": "answer_date", - ".reduced-scoring-date": "reduced_scoring_date", - ".prob-set-visible": {observe: "visible", selectOptions: { - collection : [{value: "0", label: "No"},{value: "1", label: "Yes"}] - }}, - ".reduced-credit": {observe: "enable_reduced_scoring", selectOptions: { - collection : [{value: "0", label: "No"},{value: "1", label: "Yes"}] - }}, - ".users-assigned": { - observe: "assigned_users", - onGet: function(value, options){ return value.length + "/" +this.users.size();} - } - } + bindings: { + ".set-name" : "set_id", + ".open-date" : "open_date", + ".due-date" : "due_date", + ".answer-date": "answer_date", + ".reduced-scoring-date": "reduced_scoring_date", + ".prob-set-visible": {observe: "visible", selectOptions: { + collection : [{value: "0", label: "No"},{value: "1", label: "Yes"}] + }}, + ".reduced-credit": {observe: "enable_reduced_scoring", selectOptions: { + collection : [{value: "0", label: "No"},{value: "1", label: "Yes"}] + }}, + ".users-assigned": { + observe: "assigned_users", + onGet: function(value, options){ return value.length + "/" +this.users.size();} + } + }, + showHideReducedCreditDate: function(evt){ + if($(evt.target).val()==="1") { // show reduced credit field + var rcDate = moment.unix(this.model.get("due_date")).subtract("minutes", + this.settings.getSettingValue("pg{reducedScoringBeforeDueDate}")); + this.model.set({reduced_scoring_date: rcDate.unix()},{silent: true}); + this.$(".reduced-scoring-date").closest("tr").removeAttr("style"); + } else { + this.$(".reduced-scoring-date").closest("tr").css("display","none"); + } + } }); From 3bf3e274979bd64ce8e85cfcb91b6d7cb4c60222 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Tue, 20 May 2014 11:04:58 -0400 Subject: [PATCH 08/31] calendar fixes --- .../main-views/AssignmentCalendar.js | 22 ++++++++++ webwork3/views/main/calendar.tt | 41 ++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js b/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js index a0b0e0ac49..344785a218 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js +++ b/webwork3/public/js/apps/CourseManager/main-views/AssignmentCalendar.js @@ -21,6 +21,13 @@ define(['backbone', 'underscore', 'moment','views/MainView', 'views/CalendarView _.bindAll(this,"render","renderDay","update"); this.problemSets.on({sync: this.render}); + var DateTypeModel = Backbone.Model.extend({}); + this.model = new DateTypeModel({ + answer_date: true, + due_date: true, + reduced_credit_date: true, + open_date: true + }); return this; }, render: function (){ @@ -31,9 +38,24 @@ define(['backbone', 'underscore', 'moment','views/MainView', 'views/CalendarView this.$(".assign").truncate({width: 100}); // set up the calendar to scroll correctly this.$(".calendar-container").height($(window).height()-160); + $('.show-date-types input, .show-date-types label').click(function(e) { + e.stopPropagation(); + }); + + // show/hide the desired date types + + + MainView.prototype.render.apply(this); + this.stickit(); return this; }, + bindings: { + ".show-open-date": "open_date", + ".show-due-date": "due_date", + ".show-reduced-credit-date": "reduced_credit_date", + ".show-answer-date": "answer_date" + }, renderDay: function (day){ var self = this; var assignments = this.assignmentDates.where({date: day.model.format("YYYY-MM-DD")}); diff --git a/webwork3/views/main/calendar.tt b/webwork3/views/main/calendar.tt index 19edb256f8..c40e1cd1d5 100644 --- a/webwork3/views/main/calendar.tt +++ b/webwork3/views/main/calendar.tt @@ -1,14 +1,51 @@ + + + \ No newline at end of file From 5cca4e28ea8fbb6b4163ce0c30d7f58871b56872 Mon Sep 17 00:00:00 2001 From: Peter Staab Date: Thu, 22 May 2014 08:48:09 -0400 Subject: [PATCH 13/31] Validation of all dates in a ProblemSet and improved messaging on errors. --- .../main-views/ProblemSetDetailView.js | 22 +++++++-------- .../main-views/ProblemSetsManager.js | 9 ++++--- webwork3/public/js/models/ProblemSet.js | 27 ++++++++++++++++--- webwork3/views/main/problem_set_details.tt | 2 +- webwork3/views/main/problem_set_manager.tt | 3 ++- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js index 9b7f16d2ec..3e1806f8ef 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js +++ b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetDetailView.js @@ -30,7 +30,7 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ usersAssignedView : new AssignUsersView({problemSet: this.problemSet, users: this.users}), propertiesView : new DetailsView({users: this.users, problemSet: this.problemSet, settings: this.settings}), customizeUserAssignView : new CustomizeUserAssignView({users: this.users, problemSet: this.problemSet, - eventDispatcher: this.eventDispatcher}), + eventDispatcher: this.eventDispatcher, settings: this.settings}), unassignUsersView: new UnassignUserView({users:this.users}) }; @@ -186,7 +186,7 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ this.$(".reduced-scoring-date").closest("tr").addClass("hidden") } if(this.settings.getSettingValue("pg{ansEvalDefaults}{enableReducedScoring}")==0){ - this.$(".reduced-credit").closest("tr").addClass("hidden") + this.$(".reduced-scoring").closest("tr").addClass("hidden") } if(this.model){ this.stickit(); @@ -195,7 +195,7 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ }, events: { "click .assign-all-users": "assignAllUsers", - "change .reduced-credit": "showHideReducedCreditDate" + "change .reduced-scoring": "showHideReducedScoringDate" }, assignAllUsers: function(){ this.model.set({assigned_users: this.users.pluck("user_id")}); @@ -214,7 +214,7 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ ".prob-set-visible": {observe: "visible", selectOptions: { collection : [{value: "0", label: "No"},{value: "1", label: "Yes"}] }}, - ".reduced-credit": {observe: "enable_reduced_scoring", updateModel: false, selectOptions: { + ".reduced-scoring": {observe: "enable_reduced_scoring", updateModel: false, selectOptions: { collection : [{value: "0", label: "No"},{value: "1", label: "Yes"}] }}, ".users-assigned": { @@ -222,7 +222,7 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ onGet: function(value, options){ return value.length + "/" +this.users.size();} } }, - showHideReducedCreditDate: function(evt){ + showHideReducedScoringDate: function(evt){ if($(evt.target).val()==="1") { // show reduced credit field var rcDate = moment.unix(this.model.get("due_date")).subtract("minutes", this.settings.getSettingValue("pg{reducedScoringBeforeDueDate}")); @@ -345,16 +345,14 @@ define(['backbone','underscore','views/MainView','views/ProblemSetView','models/ var CustomizeUserAssignView = Backbone.View.extend({ initialize: function(options){ _.bindAll(this,"render","updateTable","saveChanges","filter","buildCollection","setProblemSet"); - this.model = this.model = options.problemSet ? new ProblemSet(options.problemSet.attributes): null; - this.users = options.users; - this.eventDispatcher = options.eventDispatcher; - this.tableSetup({show_reduced_scoring: true}); - - - + this.model = options.problemSet ? new ProblemSet(options.problemSet.attributes): null; + _.extend(this,_(options).pick("users","settings","eventDispatcher")); }, render: function () { var self = this; + var reducedScoring = this.settings.getSettingValue("pg{ansEvalDefaults}{enableReducedScoring}")==1 + && this.problemSet.get("enable_reduced_scoring") == 1; + this.tableSetup({show_reduced_scoring: reducedScoring}); this.$el.html($("#loading-usersets-template").html()); if (this.collection.size()>0){ this.$el.html($("#customize-assignment-template").html()); diff --git a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js index e418e1d30a..0d657a7b95 100644 --- a/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js +++ b/webwork3/public/js/apps/CourseManager/main-views/ProblemSetsManager.js @@ -168,11 +168,14 @@ define(['backbone', 'underscore','views/MainView', 'views/CollectionTableView',' "change:problems": function(_set){ _set.save(); }, - "set_date_error": function(opt){ + "set_date_error": function(_opts, model){ self.eventDispatcher.trigger("add-message",{type: "danger", - short: self.messageTemplate({type: "date_set_error", opts: {set_id: opt.set_id}}), - text: self.messageTemplate({type: opt.type, opts: {set_id: opt.set_id}}) + short: self.messageTemplate({type: "date_set_error", opts: _opts}), + text: self.messageTemplate({type: "date_set_error", opts: _opts}) }); + _(model.changed).chain().keys().each(function(key) { + model.set(key,model.changingAttributes[key]); + }) }, change: function(_set){ _set.changingAttributes=_.pick(_set._previousAttributes,_.keys(_set.changed)); diff --git a/webwork3/public/js/models/ProblemSet.js b/webwork3/public/js/models/ProblemSet.js index 09836dcbf9..383e379190 100644 --- a/webwork3/public/js/models/ProblemSet.js +++ b/webwork3/public/js/models/ProblemSet.js @@ -125,16 +125,37 @@ define(['backbone', 'underscore','moment','./ProblemList','./Problem','config'], checkDates: function(value, attr, computedState){ var openDate = moment.unix(computedState.open_date) , dueDate = moment.unix(computedState.due_date) - , answerDate = moment.unix(computedState.answer_date); + , answerDate = moment.unix(computedState.answer_date) + , reducedScoringDate = moment.unix(computedState.reduced_scoring_date); + + // the following prevents the rest of the code from checking more than once per validation. + // since there are 4 fields that use this method for validation, it gets called 4 times. + this.numChecks = this.numChecks? this.numChecks+=1: 1; + if(this.numChecks==4){ delete this.numChecks;} + if(this.numChecks>1) { return;} if(openDate.isAfter(dueDate)){ - this.trigger("set_date_error",{set_id: this.get("set_id"), type: "openDate_after_dueDate"}); + this.trigger("set_date_error",{type: "date_error", set_id: this.get("set_id"), date1: "open date", + date2: "due date"},this); return "open date is after due date"; } if (dueDate.isAfter(answerDate)){ - this.trigger("set_date_error",{set_id: this.get("set_id"), type: "dueDate_after_answerDate"}); + this.trigger("set_date_error",{type: "date_error", set_id: this.get("set_id"), date1: "due date", + date2: "answer date"},this); return "due date is after answer date"; } + if(computedState.enable_reduced_scoring==1){ + if(reducedScoringDate.isAfter(dueDate)){ + this.trigger("set_date_error",{type: "date_error", set_id: this.get("set_id"), + date1: "reduced scoring date", date2: "due date"},this); + return "reduced scoring date is after due date"; + } + if(openDate.isAfter(reducedScoringDate)){ + this.trigger("set_date_error",{type: "date_error", set_id: this.get("set_id"), date1: "open date", + date2: "reduced scoring date"},this); + return "due date is after reduced scoring date"; + } + } } }); diff --git a/webwork3/views/main/problem_set_details.tt b/webwork3/views/main/problem_set_details.tt index bae5098d88..a821c8350a 100644 --- a/webwork3/views/main/problem_set_details.tt +++ b/webwork3/views/main/problem_set_details.tt @@ -185,7 +185,7 @@ Loading sets for users... Due Date Answer Date Problem Set visible to Users -Reduced Credit Enabled +Reduced Scoring Enabled Users Assigned