diff --git a/lms/djangoapps/certificates/migrations/0018_historicalcertificateinvalidation.py b/lms/djangoapps/certificates/migrations/0018_historicalcertificateinvalidation.py new file mode 100644 index 0000000000..3bd83e9528 --- /dev/null +++ b/lms/djangoapps/certificates/migrations/0018_historicalcertificateinvalidation.py @@ -0,0 +1,42 @@ +# Generated by Django 2.2.17 on 2021-01-28 20:33 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import model_utils.fields +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('certificates', '0017_add_mode_20201118_1725'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalCertificateInvalidation', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('created', model_utils.fields.AutoCreatedField(default=django.utils.timezone.now, editable=False, verbose_name='created')), + ('modified', model_utils.fields.AutoLastModifiedField(default=django.utils.timezone.now, editable=False, verbose_name='modified')), + ('notes', models.TextField(default=None, null=True)), + ('active', models.BooleanField(default=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)), + ('generated_certificate', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='certificates.GeneratedCertificate')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('invalidated_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)), + ], + options={ + 'verbose_name': 'historical certificate invalidation', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index 33ec4ebe96..18cdb705ab 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -514,6 +514,13 @@ class CertificateInvalidation(TimeStampedModel): notes = models.TextField(default=None, null=True) active = models.BooleanField(default=True) + # This is necessary because CMS does not install the certificates app, but + # this code is run when other models in this file are imported there (or in + # common code). Simple History will attempt to connect to the installed + # model in the certificates app, which will fail. + if 'certificates' in apps.app_configs: + history = HistoricalRecords() + class Meta(object): app_label = "certificates"