diff --git a/lms/djangoapps/grades/api.py b/lms/djangoapps/grades/api.py index d9b76afe4b..1d438bfff5 100644 --- a/lms/djangoapps/grades/api.py +++ b/lms/djangoapps/grades/api.py @@ -110,7 +110,7 @@ def undo_override_subsection_grade(user_id, course_key_or_id, usage_key_or_id, f if override is not None and ( not feature or not override.system or feature == override.system): - override.delete(feature=feature) + override.delete() else: return diff --git a/lms/djangoapps/grades/models.py b/lms/djangoapps/grades/models.py index d433eb2a68..6be3c50424 100644 --- a/lms/djangoapps/grades/models.py +++ b/lms/djangoapps/grades/models.py @@ -686,9 +686,6 @@ class PersistentSubsectionGradeOverride(models.Model): u"possible_graded_override: {}".format(self.possible_graded_override), ]) - def get_history(self): - return PersistentSubsectionGradeOverrideHistory.get_override_history(self.id) - @classmethod def prefetch(cls, user_id, course_key): get_cache(cls._CACHE_NAMESPACE)[(user_id, str(course_key))] = { @@ -718,8 +715,7 @@ class PersistentSubsectionGradeOverride(models.Model): """ Creates or updates an override object for the given PersistentSubsectionGrade. Args: - requesting_user: The user that is creating the override (so we can record this action in - a PersistentSubsectionGradeOverrideHistory record). + requesting_user: The user that is creating the override. subsection_grade_model: The PersistentSubsectionGrade object associated with this override. override_data: The parameters of score values used to create the override record. """ @@ -742,14 +738,6 @@ class PersistentSubsectionGradeOverride(models.Model): override_history_entry.history_user = requesting_user override_history_entry.save() - action = action or PersistentSubsectionGradeOverrideHistory.CREATE_OR_UPDATE - - PersistentSubsectionGradeOverrideHistory.objects.create( - override_id=override.id, - user=requesting_user, - feature=feature, - action=action, - ) return override @staticmethod @@ -773,68 +761,3 @@ class PersistentSubsectionGradeOverride(models.Model): getattr(subsection_grade_model, field_name) ) return cleaned_data - - def delete(self, **kwargs): # pylint: disable=arguments-differ - # TODO: a proper history table - PersistentSubsectionGradeOverrideHistory.objects.create( - override_id=self.id, - feature=kwargs.pop('feature', ''), - action=PersistentSubsectionGradeOverrideHistory.DELETE - ) - super(PersistentSubsectionGradeOverride, self).delete(**kwargs) - - -class PersistentSubsectionGradeOverrideHistory(models.Model): - """ - A django model tracking persistent grades override audit records. - - .. no_pii: - """ - OVERRIDE_FEATURES = ( - (constants.GradeOverrideFeatureEnum.proctoring, 'proctoring'), - (constants.GradeOverrideFeatureEnum.gradebook, 'gradebook'), - ) - - CREATE_OR_UPDATE = 'CREATEORUPDATE' - DELETE = 'DELETE' - OVERRIDE_ACTIONS = ( - (CREATE_OR_UPDATE, 'create_or_update'), - (DELETE, 'delete') - ) - - class Meta(object): - app_label = "grades" - - override_id = models.IntegerField(db_index=True) - feature = models.CharField( - max_length=32, - choices=OVERRIDE_FEATURES, - default=constants.GradeOverrideFeatureEnum.proctoring, - ) - action = models.CharField( - max_length=32, - choices=OVERRIDE_ACTIONS, - default=CREATE_OR_UPDATE - ) - user = models.ForeignKey(User, blank=True, null=True) - comments = models.CharField(max_length=300, blank=True, null=True) - created = models.DateTimeField(auto_now_add=True, db_index=True) - - def __unicode__(self): - """ - String representation of this model. - """ - return ( - u"{} override_id: {}, user_id: {}, feature: {}, action: {}, created: {}" - ).format( - type(self).__name__, - self.override_id, - self.user, - self.feature, - self.action, - self.created - ) - - @classmethod - def get_override_history(cls, override_id): - return cls.objects.filter(override_id=override_id) diff --git a/lms/djangoapps/grades/rest_api/v1/tests/test_gradebook_views.py b/lms/djangoapps/grades/rest_api/v1/tests/test_gradebook_views.py index 36067291fe..ebbde7dab6 100644 --- a/lms/djangoapps/grades/rest_api/v1/tests/test_gradebook_views.py +++ b/lms/djangoapps/grades/rest_api/v1/tests/test_gradebook_views.py @@ -29,7 +29,6 @@ from lms.djangoapps.grades.models import ( BlockRecordList, PersistentSubsectionGrade, PersistentSubsectionGradeOverride, - PersistentSubsectionGradeOverrideHistory, PersistentCourseGrade, ) from lms.djangoapps.grades.rest_api.v1.tests.mixins import GradeViewTestMixin @@ -1581,14 +1580,6 @@ class GradebookBulkUpdateViewTest(GradebookViewTestBase): expected_value = getattr(expected_grades, field_name) self.assertEqual(expected_value, getattr(grade, field_name)) - update_records = PersistentSubsectionGradeOverrideHistory.objects.filter(user=request_user) - self.assertEqual(update_records.count(), 3) - for audit_item in update_records: - self.assertEqual(audit_item.user, request_user) - self.assertIsNotNone(audit_item.created) - self.assertEqual(audit_item.feature, GradeOverrideFeatureEnum.gradebook) - self.assertEqual(audit_item.action, PersistentSubsectionGradeOverrideHistory.CREATE_OR_UPDATE) - def test_update_failing_grade(self): """ Test that when we update a user's grade to failing, their certificate is marked notpassing diff --git a/lms/djangoapps/grades/tests/test_models.py b/lms/djangoapps/grades/tests/test_models.py index a9e718755b..0537b7fab9 100644 --- a/lms/djangoapps/grades/tests/test_models.py +++ b/lms/djangoapps/grades/tests/test_models.py @@ -28,7 +28,6 @@ from lms.djangoapps.grades.models import ( PersistentCourseGrade, PersistentSubsectionGrade, PersistentSubsectionGradeOverride, - PersistentSubsectionGradeOverrideHistory, VisibleBlocks ) from student.tests.factories import UserFactory @@ -327,9 +326,6 @@ class PersistentSubsectionGradeTest(GradesModelTestCase): self.assertEqual(grade.possible_all, override.possible_all_override) self.assertEqual(grade.possible_graded, override.possible_graded_override) - # An override history record should be created - self.assertEqual(1, PersistentSubsectionGradeOverrideHistory.objects.filter(override_id=override.id).count()) - def _assert_tracker_emitted_event(self, tracker_mock, grade): """ Helper function to ensure that the mocked event tracker diff --git a/lms/djangoapps/grades/tests/test_services.py b/lms/djangoapps/grades/tests/test_services.py index 27be6bf319..f88296f49b 100644 --- a/lms/djangoapps/grades/tests/test_services.py +++ b/lms/djangoapps/grades/tests/test_services.py @@ -14,8 +14,7 @@ from mock import call, patch from lms.djangoapps.grades.constants import GradeOverrideFeatureEnum from lms.djangoapps.grades.models import ( PersistentSubsectionGrade, - PersistentSubsectionGradeOverride, - PersistentSubsectionGradeOverrideHistory + PersistentSubsectionGradeOverride ) from lms.djangoapps.grades.services import GradesService from student.tests.factories import UserFactory @@ -148,12 +147,6 @@ class GradesServiceTests(ModuleStoreTestCase): 'earned_graded_override': override.earned_graded_override }) - def _verify_override_history(self, override_history, history_action): - self.assertIsNone(override_history.user) - self.assertIsNotNone(override_history.created) - self.assertEqual(override_history.feature, GradeOverrideFeatureEnum.proctoring) - self.assertEqual(override_history.action, history_action) - @ddt.data( { 'earned_all': 0.0, @@ -203,8 +196,6 @@ class GradesServiceTests(ModuleStoreTestCase): score_db_table=ScoreDatabaseTableEnum.overrides ) ) - override_history = PersistentSubsectionGradeOverrideHistory.objects.filter(override_id=override_obj.id).first() - self._verify_override_history(override_history, PersistentSubsectionGradeOverrideHistory.CREATE_OR_UPDATE) def test_override_subsection_grade_no_psg(self): """ @@ -254,8 +245,6 @@ class GradesServiceTests(ModuleStoreTestCase): score_db_table=ScoreDatabaseTableEnum.overrides ) ) - override_history = PersistentSubsectionGradeOverrideHistory.objects.filter(override_id=override_obj.id).first() - self._verify_override_history(override_history, PersistentSubsectionGradeOverrideHistory.CREATE_OR_UPDATE) @freeze_time('2017-01-01') def test_undo_override_subsection_grade(self): @@ -286,8 +275,6 @@ class GradesServiceTests(ModuleStoreTestCase): score_db_table=ScoreDatabaseTableEnum.overrides ) ) - override_history = PersistentSubsectionGradeOverrideHistory.objects.filter(override_id=override_id).first() - self._verify_override_history(override_history, PersistentSubsectionGradeOverrideHistory.DELETE) def test_undo_override_subsection_grade_across_features(self): """