From 6fa794079273e255ca1deb141f83c00c674f99c0 Mon Sep 17 00:00:00 2001 From: Stu Young Date: Thu, 9 Jan 2020 16:29:18 -0500 Subject: [PATCH] Add django simple history to student.ManualEnrollmentAudit (#22629) add django simple history to student.ManualEnrollmentAudit --- .../0028_historicalmanualenrollmentaudit.py | 43 +++++++++++++++++++ common/djangoapps/student/models.py | 10 ++++- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py diff --git a/common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py b/common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py new file mode 100644 index 0000000000..9bf0d37d11 --- /dev/null +++ b/common/djangoapps/student/migrations/0028_historicalmanualenrollmentaudit.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2019-12-27 20:44 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('student', '0027_courseenrollment_mode_callable_default'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalManualEnrollmentAudit', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('enrolled_email', models.CharField(db_index=True, max_length=255)), + ('time_stamp', models.DateTimeField(blank=True, editable=False, null=True)), + ('state_transition', models.CharField(choices=[('from unenrolled to allowed to enroll', 'from unenrolled to allowed to enroll'), ('from allowed to enroll to enrolled', 'from allowed to enroll to enrolled'), ('from enrolled to enrolled', 'from enrolled to enrolled'), ('from enrolled to unenrolled', 'from enrolled to unenrolled'), ('from unenrolled to enrolled', 'from unenrolled to enrolled'), ('from allowed to enroll to enrolled', 'from allowed to enroll to enrolled'), ('from unenrolled to unenrolled', 'from unenrolled to unenrolled'), ('N/A', 'N/A')], max_length=255)), + ('reason', models.TextField(null=True)), + ('role', models.CharField(blank=True, max_length=64, null=True)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('enrolled_by', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)), + ('enrollment', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='student.CourseEnrollment')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical manual enrollment audit', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/common/djangoapps/student/models.py b/common/djangoapps/student/models.py index ea11664594..d460d85f1f 100644 --- a/common/djangoapps/student/models.py +++ b/common/djangoapps/student/models.py @@ -2113,6 +2113,7 @@ class ManualEnrollmentAudit(models.Model): state_transition = models.CharField(max_length=255, choices=TRANSITION_STATES) reason = models.TextField(null=True) role = models.CharField(blank=True, null=True, max_length=64) + history = HistoricalRecords() @classmethod def create_manual_enrollment_audit(cls, user, email, state_transition, reason, enrollment=None, role=None): @@ -2160,8 +2161,15 @@ class ManualEnrollmentAudit(models.Model): # It is possible that this could also be bad if a user has thousands of manual # enrollments, but currently that number tends to be very low. manual_enrollment_ids = list(cls.objects.filter(enrollment__user=user).values_list('id', flat=True)) + manual_enrollment_audits = cls.objects.filter(id__in=manual_enrollment_ids) - return cls.objects.filter(id__in=manual_enrollment_ids).update(reason="", enrolled_email=retired_email) + if not manual_enrollment_audits: + return False + + for manual_enrollment_audit in manual_enrollment_audits: + manual_enrollment_audit.history.update(reason="", enrolled_email=retired_email) + manual_enrollment_audits.update(reason="", enrolled_email=retired_email) + return True @python_2_unicode_compatible