From 741af8b3da825a8cb67f6ca179c47d0ad92a3b87 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Fri, 10 Apr 2020 16:41:37 -0400 Subject: [PATCH 1/2] Squash migrations for edxval. --- ...d_0016_add_transcript_credentials_model.py | 187 ++++++++++++++++++ edxval/settings.py | 14 ++ 2 files changed, 201 insertions(+) create mode 100644 edxval/migrations/0001_squashed_0016_add_transcript_credentials_model.py diff --git a/edxval/migrations/0001_squashed_0016_add_transcript_credentials_model.py b/edxval/migrations/0001_squashed_0016_add_transcript_credentials_model.py new file mode 100644 index 00000000..b4d83c5f --- /dev/null +++ b/edxval/migrations/0001_squashed_0016_add_transcript_credentials_model.py @@ -0,0 +1,187 @@ +# Generated by Django 2.2.11 on 2020-04-10 17:42 + +import django.core.validators +from django.db import migrations, models +import django.db.migrations.operations.special +import django.db.models.deletion +import django.utils.timezone +import edxval.models +import fernet_fields.fields +import model_utils.fields + + +# This copied fields from one column to another, then deleted the original column. +# I merged these operations such that the model is created without the deleted column. +# Therefore, this data migration is not needed. +# edxval.migrations.0013_thirdpartytranscriptcredentialsstate_copy_values + +DEFAULT_PROFILES = [ + "audio_mp3", + "hls", + "desktop_mp4", + "desktop_webm", + "mobile_high", + "mobile_low", + "youtube", +] + + +def create_default_profiles(apps, schema_editor): + """ Add default profiles """ + # Adds profiles for: 0002_data__default_profiles, 0004_data__add_hls_profile, 0011_data__add_audio_mp3_profile + Profile = apps.get_model("edxval", "Profile") + for profile in DEFAULT_PROFILES: + Profile.objects.get_or_create(profile_name=profile) + + +def delete_default_profiles(apps, schema_editor): + """ Remove default profiles """ + Profile = apps.get_model("edxval", "Profile") + Profile.objects.filter(profile_name__in=DEFAULT_PROFILES).delete() + + +class Migration(migrations.Migration): + + replaces = [('edxval', '0001_initial'), ('edxval', '0002_data__default_profiles'), ('edxval', '0003_coursevideo_is_hidden'), ('edxval', '0004_data__add_hls_profile'), ('edxval', '0005_videoimage'), ('edxval', '0006_auto_20171009_0725'), ('edxval', '0007_transcript_credentials_state'), ('edxval', '0008_remove_subtitles'), ('edxval', '0009_auto_20171127_0406'), ('edxval', '0010_add_video_as_foreign_key'), ('edxval', '0011_data__add_audio_mp3_profile'), ('edxval', '0012_thirdpartytranscriptcredentialsstate_has_creds'), ('edxval', '0013_thirdpartytranscriptcredentialsstate_copy_values'), ('edxval', '0014_transcript_credentials_state_retype_exists'), ('edxval', '0015_remove_thirdpartytranscriptcredentialsstate_exists'), ('edxval', '0016_add_transcript_credentials_model')] + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('profile_name', models.CharField(max_length=50, unique=True, validators=[django.core.validators.RegexValidator(code='invalid profile_name', message='profile_name has invalid characters', regex='^[a-zA-Z0-9\\-_]*$')])), + ], + ), + migrations.CreateModel( + name='Video', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('edx_video_id', models.CharField(max_length=100, unique=True, validators=[django.core.validators.RegexValidator(code='invalid edx_video_id', message='edx_video_id has invalid characters', regex='^[a-zA-Z0-9\\-_]*$')])), + ('client_video_id', models.CharField(blank=True, db_index=True, max_length=255)), + ('duration', models.FloatField(validators=[django.core.validators.MinValueValidator(0)])), + ('status', models.CharField(db_index=True, max_length=255)), + ], + ), + migrations.CreateModel( + name='EncodedVideo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('modified', models.DateTimeField(auto_now=True)), + ('url', models.CharField(max_length=200)), + ('file_size', models.PositiveIntegerField()), + ('bitrate', models.PositiveIntegerField()), + ('profile', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to='edxval.Profile')), + ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='encoded_videos', to='edxval.Video')), + ], + ), + migrations.CreateModel( + name='CourseVideo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('course_id', models.CharField(max_length=255)), + ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='courses', to='edxval.Video')), + ], + options={ + 'unique_together': {('course_id', 'video')}, + }, + bases=(models.Model, edxval.models.ModelFactoryWithValidation), + ), + migrations.AddField( + model_name='coursevideo', + name='is_hidden', + field=models.BooleanField(default=False, help_text='Hide video for course.'), + ), + migrations.CreateModel( + name='VideoImage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, 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')), + ('image', edxval.models.CustomizableImageField(blank=True, null=True)), + ('generated_images', edxval.models.ListField()), + ('course_video', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='video_image', to='edxval.CourseVideo')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='TranscriptPreference', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, 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')), + ('course_id', models.CharField(max_length=255, unique=True, verbose_name='Course ID')), + ('provider', models.CharField(choices=[('Custom', 'Custom'), ('3PlayMedia', '3PlayMedia'), ('Cielo24', 'Cielo24')], max_length=20, verbose_name='Provider')), + ('cielo24_fidelity', models.CharField(blank=True, choices=[('MECHANICAL', 'Mechanical, 75% Accuracy'), ('PREMIUM', 'Premium, 95% Accuracy'), ('PROFESSIONAL', 'Professional, 99% Accuracy')], max_length=20, null=True, verbose_name='Cielo24 Fidelity')), + ('cielo24_turnaround', models.CharField(blank=True, choices=[('STANDARD', 'Standard, 48h'), ('PRIORITY', 'Priority, 24h')], max_length=20, null=True, verbose_name='Cielo24 Turnaround')), + ('three_play_turnaround', models.CharField(blank=True, choices=[('extended', '10-Day/Extended'), ('standard', '4-Day/Standard'), ('expedited', '2-Day/Expedited'), ('rush', '24 hour/Rush'), ('same_day', 'Same Day'), ('two_hour', '2 Hour')], max_length=20, null=True, verbose_name='3PlayMedia Turnaround')), + ('preferred_languages', edxval.models.ListField(blank=True, default=[], max_items=50, verbose_name='Preferred Languages')), + ('video_source_language', models.CharField(blank=True, help_text='This specifies the speech language of a Video.', max_length=50, null=True, verbose_name='Video Source Language')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='VideoTranscript', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, 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')), + ('transcript', edxval.models.CustomizableFileField(blank=True, null=True)), + ('language_code', models.CharField(db_index=True, max_length=50)), + ('provider', models.CharField(choices=[('Custom', 'Custom'), ('3PlayMedia', '3PlayMedia'), ('Cielo24', 'Cielo24')], default='Custom', max_length=30)), + ('file_format', models.CharField(choices=[('srt', 'SubRip'), ('sjson', 'SRT JSON')], db_index=True, max_length=20)), + ('video', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='video_transcripts', to='edxval.Video')), + ], + options={ + 'unique_together': {('video', 'language_code')}, + }, + ), + migrations.CreateModel( + name='ThirdPartyTranscriptCredentialsState', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, 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')), + ('org', models.CharField(max_length=32, verbose_name='Course Organization')), + ('provider', models.CharField(choices=[('Custom', 'Custom'), ('3PlayMedia', '3PlayMedia'), ('Cielo24', 'Cielo24')], max_length=20, verbose_name='Transcript Provider')), + ], + options={ + 'unique_together': {('org', 'provider')}, + }, + ), + migrations.AddField( + model_name='thirdpartytranscriptcredentialsstate', + name='has_creds', + field=models.BooleanField(default=False, help_text='Transcript credentials state'), + ), + migrations.CreateModel( + name='TranscriptCredentials', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, 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')), + ('org', models.CharField(help_text='This value must match the value of organization in studio/edx-platform.', max_length=50, verbose_name='Organization')), + ('provider', models.CharField(choices=[('Custom', 'Custom'), ('3PlayMedia', '3PlayMedia'), ('Cielo24', 'Cielo24')], max_length=50, verbose_name='Transcript provider')), + ('api_key', fernet_fields.fields.EncryptedTextField(max_length=255, verbose_name='API key')), + ('api_secret', fernet_fields.fields.EncryptedTextField(max_length=255, verbose_name='API secret')), + ], + options={ + 'verbose_name_plural': 'Transcript Credentials', + 'unique_together': {('org', 'provider')}, + }, + ), + migrations.RunPython( + code=create_default_profiles, + reverse_code=delete_default_profiles, + ), + ] diff --git a/edxval/settings.py b/edxval/settings.py index 1b9db652..8614ee32 100644 --- a/edxval/settings.py +++ b/edxval/settings.py @@ -187,3 +187,17 @@ CIELO24_BASE_API_URL="https://sandbox.cielo24.com/api", CIELO24_LOGIN_URL="https://sandbox.cielo24.com/api/account/login" ) + +# Required by Django 2.2 to run management commands. +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "APP_DIRS": True, + "OPTIONS": { + "context_processors": { + "django.contrib.auth.context_processors.auth", # this is required for admin + "django.contrib.messages.context_processors.messages", + } + } + }, +] From 5c8c1667efe9b5d6aa14c8d12d9febd9a62817af Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Mon, 13 Apr 2020 09:49:48 -0400 Subject: [PATCH 2/2] Bump version number. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c015d564..62bad0e7 100644 --- a/setup.py +++ b/setup.py @@ -46,7 +46,7 @@ def load_requirements(*requirements_paths): return list(requirements) -VERSION = '1.2.9' +VERSION = '1.3.0' if sys.argv[-1] == 'tag': print("Tagging the version on github:")