From 97748e56ea103320dba54e5dca9c313e654ac149 Mon Sep 17 00:00:00 2001 From: Carlos de la Guardia Date: Wed, 14 Jan 2015 21:35:15 -0600 Subject: [PATCH] MIT: CCX. Fix test failures Django double-importing overwrites the TESTUSER object, invalidating identity comparisons. Use a string instead to avoid the problem. The get_current_poc function operates using a threadlocal and so no longer requires the user as an argument --- .../courseware/tests/test_field_overrides.py | 2 +- lms/djangoapps/pocs/overrides.py | 4 +- lms/djangoapps/pocs/utils.py | 2 +- lms/static/js/pocs/schedule.js | 167 ++++-------------- lms/templates/navigation.html | 2 +- 5 files changed, 41 insertions(+), 136 deletions(-) diff --git a/lms/djangoapps/courseware/tests/test_field_overrides.py b/lms/djangoapps/courseware/tests/test_field_overrides.py index 77ea374f4c..4d0af91970 100644 --- a/lms/djangoapps/courseware/tests/test_field_overrides.py +++ b/lms/djangoapps/courseware/tests/test_field_overrides.py @@ -15,7 +15,7 @@ from ..field_overrides import ( ) -TESTUSER = object() +TESTUSER = "testuser" @override_settings(FIELD_OVERRIDE_PROVIDERS=( diff --git a/lms/djangoapps/pocs/overrides.py b/lms/djangoapps/pocs/overrides.py index f93713dc7f..c7fa1ab2bf 100644 --- a/lms/djangoapps/pocs/overrides.py +++ b/lms/djangoapps/pocs/overrides.py @@ -20,7 +20,7 @@ class PersonalOnlineCoursesOverrideProvider(FieldOverrideProvider): overrides to be made on a per user basis. """ def get(self, block, name, default): - poc = get_current_poc(self.user) + poc = get_current_poc() if poc: return get_override_for_poc(poc, block, name, default) return default @@ -51,7 +51,7 @@ def poc_context(poc): _POC_CONTEXT.poc = prev -def get_current_poc(user): +def get_current_poc(): """ Return the poc that is active for this request. """ diff --git a/lms/djangoapps/pocs/utils.py b/lms/djangoapps/pocs/utils.py index 1c79c9e5e8..0678d4021c 100644 --- a/lms/djangoapps/pocs/utils.py +++ b/lms/djangoapps/pocs/utils.py @@ -237,9 +237,9 @@ def get_all_pocs_for_user(user): mooc_url: } """ - current_active_poc = get_current_poc(user) if user.is_anonymous(): return [] + current_active_poc = get_current_poc() memberships = [] for membership in PocMembership.memberships_for_user(user): course = get_course_by_id(membership.poc.course_id) diff --git a/lms/static/js/pocs/schedule.js b/lms/static/js/pocs/schedule.js index 9e168dd867..ee234053aa 100644 --- a/lms/static/js/pocs/schedule.js +++ b/lms/static/js/pocs/schedule.js @@ -49,17 +49,18 @@ var edx = edx || {}; self = this; $('#add-all').on('click', function(event) { event.preventDefault(); - this.schedule_apply(self.schedule, show); + self.schedule_apply(self.schedule, self.show); self.dirty = true; + self.schedule_collection.set(self.schedule); self.render(); }); }, render: function() { - this.schedule = this.schedule_collection.toJSON(); - this.hidden = this.pruned(this.schedule, function(node) { + self.schedule = this.schedule_collection.toJSON(); + self.hidden = this.pruned(self.schedule, function(node) { return node.hidden || node.category !== 'vertical'}); - this.showing = this.pruned(this.schedule, function(node) { + this.showing = this.pruned(self.schedule, function(node) { return !node.hidden}); this.$el.html(schedule_template({chapters: this.showing})); $('table.poc-schedule .sequential,.vertical').hide(); @@ -80,8 +81,9 @@ var edx = edx || {}; // Click handler for remove all $('table.poc-schedule a#remove-all').on('click', function(event) { event.preventDefault(); - this.schedule_apply(self.schedule, hide); + self.schedule_apply(self.schedule, self.hide); self.dirty = true; + self.schedule_collection.set(self.schedule); self.render(); }); @@ -90,7 +92,7 @@ var edx = edx || {}; // Populate chapters select, depopulate others this.chapter_select.html('') .append('') - .append(this.schedule_options(this.hidden)); + .append(self.schedule_options(this.hidden)); this.sequential_select.html('').prop('disabled', true); this.vertical_select.html('').prop('disabled', true); $('form#add-unit').show(); @@ -124,11 +126,11 @@ var edx = edx || {}; this.sequential_select.on('change', function(event) { var sequential_location = self.sequential_select.val(); if (sequential_location !== 'all') { - var chapter = self.chapter_select.val(); + var chapter = self.chapter_select.val(), sequential = self.find_unit(self.hidden, chapter, sequential_location); self.vertical_select.html('') .append('') - .append(schedule_options(sequential.children)); + .append(self.schedule_options(sequential.children)); self.vertical_select.prop('disabled', false); self.set_datetime('start', sequential.start); self.set_datetime('due', sequential.due); @@ -141,9 +143,9 @@ var edx = edx || {}; this.vertical_select.on('change', function(event) { var vertical_location = self.vertical_select.val(); if (vertical_location !== 'all') { - var chapter = chapter_select.val(), + var chapter = self.chapter_select.val(), sequential = self.sequential_select.val(); - vertical = self.find_unit( + var vertical = self.find_unit( self.hidden, chapter, sequential, vertical_location); self.set_datetime('start', vertical.start); self.set_datetime('due', vertical.due); @@ -162,11 +164,12 @@ var edx = edx || {}; vertical == 'all' ? null: vertical), start = self.get_datetime('start'), due = self.get_datetime('due'); - units.map(show); - unit = units[units.length - 1] - self.schedule_apply([unit], show); - if (start) unit.start = start; - if (due) unit.due = due; + units.map(self.show); + var unit = units[units.length - 1] + self.schedule_apply([unit], self.show); + if (unit !== undefined && start) unit.start = start; + if (unit !== undefined && due) unit.due = due; + self.schedule_collection.set(self.schedule); self.dirty = true; self.render(); }); @@ -177,6 +180,7 @@ var edx = edx || {}; path = row.data('location').split(' '), unit = self.find_unit(self.schedule, path[0], path[1], path[2]); self.schedule_apply([unit], self.hide); + self.schedule_collection.set(self.schedule); self.dirty = true; self.render(); }); @@ -197,6 +201,7 @@ var edx = edx || {}; }, save: function() { + self.schedule_collection.set(self.schedule); var button = $('#dirty-schedule #save-changes'); button.prop('disabled', true).text(gettext("Saving")+'...'); @@ -204,9 +209,8 @@ var edx = edx || {}; url: save_url, type: 'POST', contentType: 'application/json', - data: JSON.stringify(this.schedule), + data: JSON.stringify(self.schedule), success: function(data, textStatus, jqXHR) { - self.schedule = data.schedule; self.dirty = false; self.render(); button.prop('disabled', false).text(gettext("Save changes")); @@ -220,16 +224,21 @@ var edx = edx || {}; $('#ajax-error').show(); $('#dirty-schedule').hide(); $('form#add-unit select,input,button').prop('disabled', true); + button.prop('disabled', false).text(gettext("Save changes")); } }); }, hide: function(unit) { - unit.hidden = true; + if (unit !== undefined) { + unit.hidden = true; + } }, show: function(unit) { - unit.hidden = false; + if (unit !== undefined) { + unit.hidden = false; + } }, get_datetime: function(which) { @@ -259,7 +268,7 @@ var edx = edx || {}; schedule_apply: function(nodes, f) { nodes.map(function(node) { f(node); - if (node.children !== undefined) self.schedule_apply(node.children, f); + if (node !== undefined && node.children !== undefined) self.schedule_apply(node.children, f); }); }, @@ -331,9 +340,14 @@ var edx = edx || {}; alert('Please enter a valid time'); return; } - unit[what] = date + ' ' + time; + if (what == 'start') { + unit.start = date + ' ' + time; + } else { + unit.due = date + ' ' + time; + } modal.find('.close-modal').click(); self.dirty = true; + self.schedule_collection.set(self.schedule); self.render(); }); } @@ -374,116 +388,7 @@ var edx = edx || {}; }); - edx.pocs.schedule.XScheduleView = Backbone.View.extend({ - - events: { - 'submit': 'submit', - 'change': 'change' - }, - - initialize: function() { - _.bindAll(this, 'render', 'change', 'submit', 'invalidProfile', 'invalidPreference', 'error', 'sync', 'clearStatus'); - - this.scheduleModel = new edx.pocs.schedule.ProfileModel(); - this.scheduleModel.on('invalid', this.invalidProfile); - this.scheduleModel.on('error', this.error); - this.scheduleModel.on('sync', this.sync); - - this.preferencesModel = new edx.pocs.schedule.PreferencesModel(); - this.preferencesModel.on('invalid', this.invalidPreference); - this.preferencesModel.on('error', this.error); - this.preferencesModel.on('sync', this.sync); - }, - - render: function() { - this.$el.html(_.template($('#schedule-tpl').html())); - - this.$nameField = $('#schedule-name', this.$el); - this.$nameStatus = $('#schedule-name-status', this.$el); - - this.$languageChoices = $('#preference-language', this.$el); - this.$languageStatus = $('#preference-language-status', this.$el); - - this.$submitStatus = $('#submit-status', this.$el); - - var self = this; - $.getJSON('preferences/languages') - .done(function(json) { - /** Asynchronously populate the language choices. */ - self.$languageChoices.html(_.template($('#languages-tpl').html(), {languageInfo: json})); - }) - .fail(function() { - self.$languageStatus - .addClass('language-list-error') - .text(gettext("We couldn't populate the list of language choices.")); - }); - - return this; - }, - - change: function() { - this.scheduleModel.set({ - fullName: this.$nameField.val() - }); - - this.preferencesModel.set({ - language: this.$languageChoices.val() - }); - }, - - submit: function(event) { - event.preventDefault(); - this.clearStatus(); - this.scheduleModel.save(); - this.preferencesModel.save(); - }, - - invalidProfile: function(model) { - var errors = model.validationError; - if (errors.hasOwnProperty('fullName')) { - this.$nameStatus - .addClass('validation-error') - .text(errors.fullName); - } - }, - - invalidPreference: function(model) { - var errors = model.validationError; - if (errors.hasOwnProperty('language')) { - this.$languageStatus - .addClass('validation-error') - .text(errors.language); - } - }, - - error: function(error) { - this.$submitStatus - .addClass('error') - .text(error); - }, - - sync: function() { - this.$submitStatus - .addClass('success') - .text(gettext("Saved")); - }, - - clearStatus: function() { - this.$nameStatus - .removeClass('validation-error') - .text(""); - - this.$languageStatus - .removeClass('validation-error') - .text(""); - - this.$submitStatus - .removeClass('error') - .text(""); - } - }); - - })(jQuery, _, Backbone, gettext); +})(jQuery, _, Backbone, gettext); diff --git a/lms/templates/navigation.html b/lms/templates/navigation.html index 18cab9a321..f011effa7f 100644 --- a/lms/templates/navigation.html +++ b/lms/templates/navigation.html @@ -53,7 +53,7 @@ site_status_msg = get_site_status_msg(course_id) <% display_name = course.display_name_with_default if settings.FEATURES.get('PERSONAL_ONLINE_COURSES', False): - poc = get_current_poc(user) + poc = get_current_poc() if poc: display_name = poc.display_name %>