From 8dc86227b92a96d6b03b38a2870308cd108ad463 Mon Sep 17 00:00:00 2001 From: oliviaruizknott Date: Thu, 28 Jan 2021 15:44:46 -0500 Subject: [PATCH 1/2] MICROBA-905 Add django-simple-history to CertificateInvalidation model --- .../0018_historicalcertificateinvalidation.py | 42 +++++++++++++++++++ lms/djangoapps/certificates/models.py | 6 +++ 2 files changed, 48 insertions(+) create mode 100644 lms/djangoapps/certificates/migrations/0018_historicalcertificateinvalidation.py 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 d0435c178a..c757d209b5 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -514,6 +514,12 @@ 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 it + # imports this models 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" From d33d9a66c8a847787277f1e85e69ff05d0d96053 Mon Sep 17 00:00:00 2001 From: oliviaruizknott Date: Wed, 3 Feb 2021 16:52:34 -0500 Subject: [PATCH 2/2] docs: clarify comment --- lms/djangoapps/certificates/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lms/djangoapps/certificates/models.py b/lms/djangoapps/certificates/models.py index c757d209b5..66e9009ce6 100644 --- a/lms/djangoapps/certificates/models.py +++ b/lms/djangoapps/certificates/models.py @@ -514,8 +514,9 @@ 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 it - # imports this models code. Simple History will attempt to connect to the installed + # 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()