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