From 4500536151bda1168839ddeea56c0dabc4af7580 Mon Sep 17 00:00:00 2001 From: Troy Sankey Date: Mon, 3 Jun 2019 18:06:45 -0400 Subject: [PATCH] Add history to CourseOverview --- .../0015_historicalcourseoverview.py | 79 +++++++++++++++++++ .../content/course_overviews/models.py | 3 + 2 files changed, 82 insertions(+) create mode 100644 openedx/core/djangoapps/content/course_overviews/migrations/0015_historicalcourseoverview.py diff --git a/openedx/core/djangoapps/content/course_overviews/migrations/0015_historicalcourseoverview.py b/openedx/core/djangoapps/content/course_overviews/migrations/0015_historicalcourseoverview.py new file mode 100644 index 0000000000..28a3ed9d61 --- /dev/null +++ b/openedx/core/djangoapps/content/course_overviews/migrations/0015_historicalcourseoverview.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-05-30 21:13 +from __future__ import unicode_literals + +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 opaque_keys.edx.django.models +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('course_overviews', '0014_courseoverview_certificate_available_date'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalCourseOverview', + fields=[ + ('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')), + ('version', models.IntegerField()), + ('id', opaque_keys.edx.django.models.CourseKeyField(db_index=True, max_length=255)), + ('_location', opaque_keys.edx.django.models.UsageKeyField(max_length=255)), + ('org', models.TextField(default=b'outdated_entry', max_length=255)), + ('display_name', models.TextField(null=True)), + ('display_number_with_default', models.TextField()), + ('display_org_with_default', models.TextField()), + ('start', models.DateTimeField(null=True)), + ('end', models.DateTimeField(null=True)), + ('advertised_start', models.TextField(null=True)), + ('announcement', models.DateTimeField(null=True)), + ('course_image_url', models.TextField()), + ('social_sharing_url', models.TextField(null=True)), + ('end_of_course_survey_url', models.TextField(null=True)), + ('certificates_display_behavior', models.TextField(null=True)), + ('certificates_show_before_end', models.BooleanField(default=False)), + ('cert_html_view_enabled', models.BooleanField(default=False)), + ('has_any_active_web_certificate', models.BooleanField(default=False)), + ('cert_name_short', models.TextField()), + ('cert_name_long', models.TextField()), + ('certificate_available_date', models.DateTimeField(default=None, null=True)), + ('lowest_passing_grade', models.DecimalField(decimal_places=2, max_digits=5, null=True)), + ('days_early_for_beta', models.FloatField(null=True)), + ('mobile_available', models.BooleanField(default=False)), + ('visible_to_staff_only', models.BooleanField(default=False)), + ('_pre_requisite_courses_json', models.TextField()), + ('enrollment_start', models.DateTimeField(null=True)), + ('enrollment_end', models.DateTimeField(null=True)), + ('enrollment_domain', models.TextField(null=True)), + ('invitation_only', models.BooleanField(default=False)), + ('max_student_enrollments_allowed', models.IntegerField(null=True)), + ('catalog_visibility', models.TextField(null=True)), + ('short_description', models.TextField(null=True)), + ('course_video_url', models.TextField(null=True)), + ('effort', models.TextField(null=True)), + ('self_paced', models.BooleanField(default=False)), + ('marketing_url', models.TextField(null=True)), + ('eligible_for_financial_aid', models.BooleanField(default=True)), + ('language', models.TextField(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)), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + 'verbose_name': 'historical course overview', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/openedx/core/djangoapps/content/course_overviews/models.py b/openedx/core/djangoapps/content/course_overviews/models.py index 16514274e4..624015010e 100644 --- a/openedx/core/djangoapps/content/course_overviews/models.py +++ b/openedx/core/djangoapps/content/course_overviews/models.py @@ -18,6 +18,7 @@ from model_utils.models import TimeStampedModel from opaque_keys.edx.django.models import CourseKeyField, UsageKeyField from six import text_type # pylint: disable=ungrouped-imports from six.moves.urllib.parse import urlparse, urlunparse # pylint: disable=import-error +from simple_history.models import HistoricalRecords from lms.djangoapps.discussion import django_comment_client from openedx.core.djangoapps.catalog.models import CatalogIntegration @@ -110,6 +111,8 @@ class CourseOverview(TimeStampedModel): language = TextField(null=True) + history = HistoricalRecords() + @classmethod def _create_or_update(cls, course): """