openedx-learning 0.30.2__py2.py3-none-any.whl → 0.31.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. openedx_learning/__init__.py +1 -1
  2. openedx_learning/api/authoring.py +2 -9
  3. openedx_learning/api/authoring_models.py +7 -7
  4. openedx_learning/api/django.py +24 -0
  5. openedx_learning/apps/openedx_content/admin.py +13 -0
  6. openedx_learning/apps/openedx_content/api.py +16 -0
  7. openedx_learning/apps/{authoring → openedx_content/applets}/backup_restore/api.py +2 -2
  8. openedx_learning/apps/{authoring → openedx_content/applets}/backup_restore/serializers.py +1 -1
  9. openedx_learning/apps/{authoring → openedx_content/applets}/backup_restore/toml.py +4 -4
  10. openedx_learning/apps/{authoring → openedx_content/applets}/backup_restore/zipper.py +10 -9
  11. openedx_learning/apps/{authoring → openedx_content/applets}/collections/api.py +1 -1
  12. openedx_learning/apps/{authoring → openedx_content/applets}/collections/models.py +4 -1
  13. openedx_learning/apps/{authoring → openedx_content/applets}/components/admin.py +1 -1
  14. openedx_learning/apps/{authoring → openedx_content/applets}/components/api.py +1 -1
  15. openedx_learning/apps/{authoring → openedx_content/applets}/components/models.py +4 -2
  16. openedx_learning/apps/{authoring → openedx_content/applets}/contents/api.py +3 -2
  17. openedx_learning/apps/{authoring → openedx_content/applets}/contents/models.py +8 -2
  18. openedx_learning/apps/{authoring → openedx_content/applets}/publishing/api.py +1 -1
  19. openedx_learning/apps/{authoring → openedx_content/applets}/publishing/models/entity_list.py +1 -0
  20. openedx_learning/apps/{authoring → openedx_content/applets}/sections/api.py +1 -2
  21. openedx_learning/apps/{authoring → openedx_content/applets}/subsections/api.py +1 -2
  22. openedx_learning/apps/{authoring → openedx_content/applets}/units/api.py +1 -2
  23. openedx_learning/apps/openedx_content/apps.py +52 -0
  24. openedx_learning/apps/{authoring → openedx_content/backcompat}/backup_restore/apps.py +1 -1
  25. openedx_learning/apps/{authoring → openedx_content/backcompat}/collections/apps.py +1 -1
  26. openedx_learning/apps/openedx_content/backcompat/collections/migrations/0006_remove_all_field_state_for_move_to_applet.py +82 -0
  27. openedx_learning/apps/openedx_content/backcompat/collections/models.py +9 -0
  28. openedx_learning/apps/openedx_content/backcompat/components/apps.py +15 -0
  29. openedx_learning/apps/openedx_content/backcompat/components/migrations/0005_remove_all_field_state_for_move_to_applet.py +72 -0
  30. openedx_learning/apps/openedx_content/backcompat/components/models.py +11 -0
  31. openedx_learning/apps/{authoring → openedx_content/backcompat}/contents/apps.py +1 -1
  32. openedx_learning/apps/openedx_content/backcompat/contents/migrations/0002_remove_all_field_state_for_move_to_applet.py +26 -0
  33. openedx_learning/apps/openedx_content/backcompat/publishing/apps.py +15 -0
  34. openedx_learning/apps/openedx_content/backcompat/publishing/migrations/0010_backfill_dependencies.py +432 -0
  35. openedx_learning/apps/openedx_content/backcompat/publishing/migrations/0011_remove_all_field_state_for_move_to_applet.py +288 -0
  36. openedx_learning/apps/openedx_content/backcompat/publishing/models.py +27 -0
  37. openedx_learning/apps/openedx_content/backcompat/sections/__init__.py +0 -0
  38. openedx_learning/apps/openedx_content/backcompat/sections/apps.py +16 -0
  39. openedx_learning/apps/openedx_content/backcompat/sections/migrations/0002_remove_all_field_state_for_move_to_applet.py +29 -0
  40. openedx_learning/apps/openedx_content/backcompat/sections/migrations/__init__.py +0 -0
  41. openedx_learning/apps/openedx_content/backcompat/subsections/__init__.py +0 -0
  42. openedx_learning/apps/openedx_content/backcompat/subsections/apps.py +16 -0
  43. openedx_learning/apps/openedx_content/backcompat/subsections/migrations/0002_remove_all_field_state_for_move_to_applet.py +29 -0
  44. openedx_learning/apps/openedx_content/backcompat/subsections/migrations/__init__.py +0 -0
  45. openedx_learning/apps/openedx_content/backcompat/units/__init__.py +0 -0
  46. openedx_learning/apps/openedx_content/backcompat/units/apps.py +16 -0
  47. openedx_learning/apps/openedx_content/backcompat/units/migrations/0002_remove_all_field_state_for_move_to_applet.py +29 -0
  48. openedx_learning/apps/openedx_content/backcompat/units/migrations/__init__.py +0 -0
  49. openedx_learning/apps/openedx_content/management/__init__.py +0 -0
  50. openedx_learning/apps/openedx_content/management/commands/__init__.py +0 -0
  51. openedx_learning/apps/{authoring/components → openedx_content}/management/commands/add_assets_to_component.py +1 -2
  52. openedx_learning/apps/{authoring/backup_restore → openedx_content}/management/commands/lp_dump.py +2 -2
  53. openedx_learning/apps/{authoring/backup_restore → openedx_content}/management/commands/lp_load.py +1 -1
  54. openedx_learning/apps/openedx_content/migrations/0001_initial.py +654 -0
  55. openedx_learning/apps/openedx_content/migrations/0002_rename_tables_to_openedx_content.py +138 -0
  56. openedx_learning/apps/openedx_content/migrations/__init__.py +0 -0
  57. openedx_learning/apps/openedx_content/models.py +17 -0
  58. openedx_learning/contrib/media_server/views.py +1 -1
  59. {openedx_learning-0.30.2.dist-info → openedx_learning-0.31.0.dist-info}/METADATA +4 -4
  60. openedx_learning-0.31.0.dist-info/RECORD +194 -0
  61. {openedx_learning-0.30.2.dist-info → openedx_learning-0.31.0.dist-info}/WHEEL +1 -1
  62. openedx_learning/apps/authoring/components/apps.py +0 -24
  63. openedx_learning/apps/authoring/publishing/apps.py +0 -25
  64. openedx_learning/apps/authoring/publishing/migrations/0010_backfill_dependencies.py +0 -149
  65. openedx_learning/apps/authoring/sections/apps.py +0 -25
  66. openedx_learning/apps/authoring/subsections/apps.py +0 -25
  67. openedx_learning/apps/authoring/units/apps.py +0 -25
  68. openedx_learning-0.30.2.dist-info/RECORD +0 -168
  69. /openedx_learning/apps/{authoring → openedx_content}/__init__.py +0 -0
  70. /openedx_learning/apps/{authoring/backup_restore → openedx_content/applets}/__init__.py +0 -0
  71. /openedx_learning/apps/{authoring/backup_restore/management → openedx_content/applets/backup_restore}/__init__.py +0 -0
  72. /openedx_learning/apps/{authoring → openedx_content/applets}/backup_restore/admin.py +0 -0
  73. /openedx_learning/apps/{authoring → openedx_content/applets}/backup_restore/models.py +0 -0
  74. /openedx_learning/apps/{authoring/backup_restore/management/commands → openedx_content/applets/collections}/__init__.py +0 -0
  75. /openedx_learning/apps/{authoring → openedx_content/applets}/collections/admin.py +0 -0
  76. /openedx_learning/apps/{authoring/backup_restore/migrations → openedx_content/applets/components}/__init__.py +0 -0
  77. /openedx_learning/apps/{authoring/collections → openedx_content/applets/contents}/__init__.py +0 -0
  78. /openedx_learning/apps/{authoring → openedx_content/applets}/contents/admin.py +0 -0
  79. /openedx_learning/apps/{authoring/collections/migrations → openedx_content/applets/publishing}/__init__.py +0 -0
  80. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/admin.py +0 -0
  81. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/contextmanagers.py +0 -0
  82. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/models/__init__.py +0 -0
  83. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/models/container.py +0 -0
  84. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/models/draft_log.py +0 -0
  85. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/models/learning_package.py +0 -0
  86. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/models/publish_log.py +0 -0
  87. /openedx_learning/apps/{authoring → openedx_content/applets}/publishing/models/publishable_entity.py +0 -0
  88. /openedx_learning/apps/{authoring/components → openedx_content/applets/sections}/__init__.py +0 -0
  89. /openedx_learning/apps/{authoring → openedx_content/applets}/sections/admin.py +0 -0
  90. /openedx_learning/apps/{authoring → openedx_content/applets}/sections/models.py +0 -0
  91. /openedx_learning/apps/{authoring/components/management → openedx_content/applets/subsections}/__init__.py +0 -0
  92. /openedx_learning/apps/{authoring → openedx_content/applets}/subsections/admin.py +0 -0
  93. /openedx_learning/apps/{authoring → openedx_content/applets}/subsections/models.py +0 -0
  94. /openedx_learning/apps/{authoring/components/management/commands → openedx_content/applets/units}/__init__.py +0 -0
  95. /openedx_learning/apps/{authoring → openedx_content/applets}/units/admin.py +0 -0
  96. /openedx_learning/apps/{authoring → openedx_content/applets}/units/models.py +0 -0
  97. /openedx_learning/apps/{authoring/components/migrations → openedx_content/backcompat}/__init__.py +0 -0
  98. /openedx_learning/apps/{authoring/contents → openedx_content/backcompat/backup_restore}/__init__.py +0 -0
  99. /openedx_learning/apps/{authoring/contents → openedx_content/backcompat/backup_restore}/migrations/__init__.py +0 -0
  100. /openedx_learning/apps/{authoring/publishing → openedx_content/backcompat/collections}/__init__.py +0 -0
  101. /openedx_learning/apps/{authoring → openedx_content/backcompat}/collections/migrations/0001_initial.py +0 -0
  102. /openedx_learning/apps/{authoring → openedx_content/backcompat}/collections/migrations/0002_remove_collection_name_collection_created_by_and_more.py +0 -0
  103. /openedx_learning/apps/{authoring → openedx_content/backcompat}/collections/migrations/0003_collection_entities.py +0 -0
  104. /openedx_learning/apps/{authoring → openedx_content/backcompat}/collections/migrations/0004_collection_key.py +0 -0
  105. /openedx_learning/apps/{authoring → openedx_content/backcompat}/collections/migrations/0005_alter_collection_options_alter_collection_enabled.py +0 -0
  106. /openedx_learning/apps/{authoring/publishing → openedx_content/backcompat/collections}/migrations/__init__.py +0 -0
  107. /openedx_learning/apps/{authoring/sections → openedx_content/backcompat/components}/__init__.py +0 -0
  108. /openedx_learning/apps/{authoring → openedx_content/backcompat}/components/migrations/0001_initial.py +0 -0
  109. /openedx_learning/apps/{authoring → openedx_content/backcompat}/components/migrations/0002_alter_componentversioncontent_key.py +0 -0
  110. /openedx_learning/apps/{authoring → openedx_content/backcompat}/components/migrations/0003_remove_componentversioncontent_learner_downloadable.py +0 -0
  111. /openedx_learning/apps/{authoring → openedx_content/backcompat}/components/migrations/0004_remove_componentversioncontent_uuid.py +0 -0
  112. /openedx_learning/apps/{authoring/sections → openedx_content/backcompat/components}/migrations/__init__.py +0 -0
  113. /openedx_learning/apps/{authoring/subsections → openedx_content/backcompat/contents}/__init__.py +0 -0
  114. /openedx_learning/apps/{authoring → openedx_content/backcompat}/contents/migrations/0001_initial.py +0 -0
  115. /openedx_learning/apps/{authoring/subsections → openedx_content/backcompat/contents}/migrations/__init__.py +0 -0
  116. /openedx_learning/apps/{authoring/units → openedx_content/backcompat/publishing}/__init__.py +0 -0
  117. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0001_initial.py +0 -0
  118. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0002_alter_learningpackage_key_and_more.py +0 -0
  119. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0003_containers.py +0 -0
  120. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0004_publishableentity_can_stand_alone.py +0 -0
  121. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0005_alter_entitylistrow_options.py +0 -0
  122. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0006_draftchangelog.py +0 -0
  123. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0007_bootstrap_draftchangelog.py +0 -0
  124. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0008_alter_draftchangelogrecord_options_and_more.py +0 -0
  125. /openedx_learning/apps/{authoring → openedx_content/backcompat}/publishing/migrations/0009_dependencies_and_hashing.py +0 -0
  126. /openedx_learning/apps/{authoring/units → openedx_content/backcompat/publishing}/migrations/__init__.py +0 -0
  127. /openedx_learning/apps/{authoring → openedx_content/backcompat}/sections/migrations/0001_initial.py +0 -0
  128. /openedx_learning/apps/{authoring → openedx_content/backcompat}/subsections/migrations/0001_initial.py +0 -0
  129. /openedx_learning/apps/{authoring → openedx_content/backcompat}/units/migrations/0001_initial.py +0 -0
  130. {openedx_learning-0.30.2.dist-info → openedx_learning-0.31.0.dist-info}/licenses/LICENSE.txt +0 -0
  131. {openedx_learning-0.30.2.dist-info → openedx_learning-0.31.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,654 @@
1
+ """
2
+ This migration effectively moves the models from various authoring apps in the
3
+ backcompat package to the new consolidated openedx_content app. It does *not* do
4
+ any actual database operations.
5
+
6
+ See the ADR 0020-merge-authoring-apps-into-openedx-content.rst for details.
7
+ """
8
+ import uuid
9
+
10
+ import django.core.validators
11
+ import django.db.models.deletion
12
+ from django.conf import settings
13
+ from django.db import migrations, models
14
+ from django.db.migrations.operations.special import SeparateDatabaseAndState
15
+
16
+ import openedx_learning.lib.fields
17
+ import openedx_learning.lib.validators
18
+
19
+
20
+ class Migration(migrations.Migration):
21
+
22
+ initial = True
23
+
24
+ dependencies = [
25
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
26
+ ('oel_collections', '0006_remove_all_field_state_for_move_to_applet'),
27
+ ('oel_components', '0005_remove_all_field_state_for_move_to_applet'),
28
+ ('oel_contents', '0002_remove_all_field_state_for_move_to_applet'),
29
+ ('oel_publishing', '0011_remove_all_field_state_for_move_to_applet'),
30
+ ('oel_sections', '0002_remove_all_field_state_for_move_to_applet'),
31
+ ('oel_subsections', '0002_remove_all_field_state_for_move_to_applet'),
32
+ ('oel_units', '0002_remove_all_field_state_for_move_to_applet'),
33
+ ]
34
+
35
+ operations = [
36
+ SeparateDatabaseAndState(
37
+ database_operations=[],
38
+ state_operations=[
39
+ migrations.CreateModel(
40
+ name='PublishableEntity',
41
+ fields=[
42
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
43
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
44
+ ('key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_column='_key', max_length=500)),
45
+ ('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
46
+ ('can_stand_alone', models.BooleanField(default=True, help_text='Set to True when created independently, False when created as part of a container.')),
47
+ ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
48
+ ],
49
+ options={
50
+ 'verbose_name': 'Publishable Entity',
51
+ 'verbose_name_plural': 'Publishable Entities',
52
+ 'db_table': 'oel_publishing_publishableentity',
53
+ },
54
+ ),
55
+ migrations.CreateModel(
56
+ name='ComponentType',
57
+ fields=[
58
+ ('id', models.AutoField(primary_key=True, serialize=False)),
59
+ ('namespace', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, max_length=100)),
60
+ ('name', openedx_learning.lib.fields.MultiCollationCharField(blank=True, db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, max_length=100)),
61
+ ],
62
+ options={
63
+ 'db_table': 'oel_components_componenttype',
64
+ },
65
+ ),
66
+ migrations.CreateModel(
67
+ name='PublishableEntityVersion',
68
+ fields=[
69
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
70
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
71
+ ('title', openedx_learning.lib.fields.MultiCollationCharField(blank=True, db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, default='', max_length=500)),
72
+ ('version_num', models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1)])),
73
+ ('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
74
+ ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
75
+ ('entity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='openedx_content.publishableentity')),
76
+ ],
77
+ options={
78
+ 'verbose_name': 'Publishable Entity Version',
79
+ 'verbose_name_plural': 'Publishable Entity Versions',
80
+ 'db_table': 'oel_publishing_publishableentityversion',
81
+ },
82
+ ),
83
+ migrations.CreateModel(
84
+ name='Content',
85
+ fields=[
86
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
87
+ ('size', models.PositiveBigIntegerField(validators=[django.core.validators.MaxValueValidator(50000000)])),
88
+ ('hash_digest', models.CharField(editable=False, max_length=40)),
89
+ ('has_file', models.BooleanField()),
90
+ ('text', openedx_learning.lib.fields.MultiCollationTextField(blank=True, db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, max_length=50000, null=True)),
91
+ ('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
92
+ ],
93
+ options={
94
+ 'verbose_name': 'Content',
95
+ 'verbose_name_plural': 'Contents',
96
+ 'db_table': 'oel_contents_content',
97
+ },
98
+ ),
99
+ migrations.CreateModel(
100
+ name='EntityList',
101
+ fields=[
102
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
103
+ ],
104
+ options={
105
+ 'db_table': 'oel_publishing_entitylist',
106
+ },
107
+ ),
108
+ migrations.CreateModel(
109
+ name='LearningPackage',
110
+ fields=[
111
+ ('id', models.AutoField(primary_key=True, serialize=False)),
112
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
113
+ ('key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_column='_key', max_length=500)),
114
+ ('title', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, max_length=500)),
115
+ ('description', openedx_learning.lib.fields.MultiCollationTextField(blank=True, db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, default='', max_length=10000)),
116
+ ('created', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
117
+ ('updated', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
118
+ ],
119
+ options={
120
+ 'verbose_name': 'Learning Package',
121
+ 'verbose_name_plural': 'Learning Packages',
122
+ 'db_table': 'oel_publishing_learningpackage',
123
+ },
124
+ ),
125
+ migrations.CreateModel(
126
+ name='MediaType',
127
+ fields=[
128
+ ('id', models.AutoField(primary_key=True, serialize=False)),
129
+ ('type', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, max_length=127)),
130
+ ('sub_type', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, max_length=127)),
131
+ ('suffix', openedx_learning.lib.fields.MultiCollationCharField(blank=True, db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, max_length=127)),
132
+ ],
133
+ options={
134
+ 'db_table': "oel_contents_mediatype",
135
+ },
136
+ ),
137
+ migrations.CreateModel(
138
+ name='PublishableEntityVersionDependency',
139
+ fields=[
140
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
141
+ ],
142
+ options={
143
+ 'db_table': 'oel_publishing_publishableentityversiondependency',
144
+ },
145
+ ),
146
+ migrations.CreateModel(
147
+ name='PublishLog',
148
+ fields=[
149
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
150
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
151
+ ('message', openedx_learning.lib.fields.MultiCollationCharField(blank=True, db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, default='', max_length=500)),
152
+ ('published_at', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
153
+ ],
154
+ options={
155
+ 'verbose_name': 'Publish Log',
156
+ 'verbose_name_plural': 'Publish Logs',
157
+ 'db_table': 'oel_publishing_publishlog',
158
+ },
159
+ ),
160
+ migrations.CreateModel(
161
+ name='PublishLogRecord',
162
+ fields=[
163
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
164
+ ('dependencies_hash_digest', models.CharField(blank=True, default='', editable=False, max_length=8)),
165
+ ],
166
+ options={
167
+ 'verbose_name': 'Publish Log Record',
168
+ 'verbose_name_plural': 'Publish Log Records',
169
+ 'db_table': 'oel_publishing_publishlogrecord',
170
+ },
171
+ ),
172
+ migrations.CreateModel(
173
+ name='PublishSideEffect',
174
+ fields=[
175
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
176
+ ],
177
+ options={
178
+ 'verbose_name': 'Publish Side Effect',
179
+ 'verbose_name_plural': 'Publish Side Effects',
180
+ 'db_table': 'oel_publishing_publishsideeffect',
181
+ },
182
+ ),
183
+ migrations.CreateModel(
184
+ name='Collection',
185
+ fields=[
186
+ ('id', models.AutoField(primary_key=True, serialize=False)),
187
+ ('key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_column='_key', max_length=500)),
188
+ ('title', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, help_text='The title of the collection.', max_length=500)),
189
+ ('description', openedx_learning.lib.fields.MultiCollationTextField(blank=True, db_collations={'mysql': 'utf8mb4_unicode_ci', 'sqlite': 'NOCASE'}, default='', help_text='Provides extra information for the user about this collection.', max_length=10000)),
190
+ ('enabled', models.BooleanField(default=True, help_text='Disabled collections are "soft deleted", and should be re-enabled before use, or be deleted.')),
191
+ ('created', models.DateTimeField(auto_now_add=True, validators=[openedx_learning.lib.validators.validate_utc_datetime])),
192
+ ('modified', models.DateTimeField(auto_now=True, validators=[openedx_learning.lib.validators.validate_utc_datetime])),
193
+ ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
194
+ ],
195
+ options={
196
+ 'verbose_name_plural': 'Collections',
197
+ 'db_table': 'oel_collections_collection',
198
+ },
199
+ ),
200
+ migrations.CreateModel(
201
+ name='Component',
202
+ fields=[
203
+ ('publishable_entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='openedx_content.publishableentity')),
204
+ ('local_key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, max_length=500)),
205
+ ],
206
+ options={
207
+ 'verbose_name': 'Component',
208
+ 'verbose_name_plural': 'Components',
209
+ 'db_table': 'oel_components_component',
210
+ },
211
+ ),
212
+ migrations.CreateModel(
213
+ name='Container',
214
+ fields=[
215
+ ('publishable_entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='openedx_content.publishableentity')),
216
+ ],
217
+ options={
218
+ 'db_table': 'oel_publishing_container',
219
+ },
220
+ ),
221
+ migrations.CreateModel(
222
+ name='Draft',
223
+ fields=[
224
+ ('entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='openedx_content.publishableentity')),
225
+ ],
226
+ options={
227
+ 'db_table': 'oel_publishing_draft',
228
+ },
229
+ ),
230
+ migrations.CreateModel(
231
+ name='Published',
232
+ fields=[
233
+ ('entity', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='openedx_content.publishableentity')),
234
+ ],
235
+ options={
236
+ 'verbose_name': 'Published Entity',
237
+ 'verbose_name_plural': 'Published Entities',
238
+ 'db_table': 'oel_publishing_published',
239
+ },
240
+ ),
241
+ migrations.CreateModel(
242
+ name='CollectionPublishableEntity',
243
+ fields=[
244
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
245
+ ('created', models.DateTimeField(auto_now_add=True, validators=[openedx_learning.lib.validators.validate_utc_datetime])),
246
+ ('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.collection')),
247
+ ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
248
+ ('entity', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentity')),
249
+ ],
250
+ options={
251
+ 'db_table': 'oel_collections_collectionpublishableentity',
252
+ },
253
+ ),
254
+ migrations.AddField(
255
+ model_name='collection',
256
+ name='entities',
257
+ field=models.ManyToManyField(related_name='collections', through='openedx_content.CollectionPublishableEntity', to='openedx_content.publishableentity'),
258
+ ),
259
+ migrations.CreateModel(
260
+ name='ComponentVersion',
261
+ fields=[
262
+ ('publishable_entity_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='openedx_content.publishableentityversion')),
263
+ ],
264
+ options={
265
+ 'verbose_name': 'Component Version',
266
+ 'verbose_name_plural': 'Component Versions',
267
+ 'db_table': 'oel_components_componentversion',
268
+ },
269
+ ),
270
+ migrations.CreateModel(
271
+ name='ContainerVersion',
272
+ fields=[
273
+ ('publishable_entity_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='openedx_content.publishableentityversion')),
274
+ ],
275
+ options={
276
+ 'db_table': 'oel_publishing_containerversion',
277
+ },
278
+ ),
279
+ migrations.CreateModel(
280
+ name='ComponentVersionContent',
281
+ fields=[
282
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
283
+ ('key', openedx_learning.lib.fields.MultiCollationCharField(db_collations={'mysql': 'utf8mb4_bin', 'sqlite': 'BINARY'}, db_column='_key', max_length=500)),
284
+ ('content', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.content')),
285
+ ],
286
+ options={
287
+ 'db_table': 'oel_components_componentversioncontent',
288
+ },
289
+ ),
290
+ migrations.CreateModel(
291
+ name='DraftChangeLog',
292
+ fields=[
293
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
294
+ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
295
+ ('changed_at', models.DateTimeField(validators=[openedx_learning.lib.validators.validate_utc_datetime])),
296
+ ('changed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
297
+ ],
298
+ options={
299
+ 'verbose_name': 'Draft Change Log',
300
+ 'verbose_name_plural': 'Draft Change Logs',
301
+ 'db_table': 'oel_publishing_draftchangelog',
302
+ },
303
+ ),
304
+ migrations.CreateModel(
305
+ name='DraftChangeLogRecord',
306
+ fields=[
307
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
308
+ ('dependencies_hash_digest', models.CharField(blank=True, default='', editable=False, max_length=8)),
309
+ ('draft_change_log', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='records', to='openedx_content.draftchangelog')),
310
+ ('entity', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentity')),
311
+ ('new_version', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentityversion')),
312
+ ('old_version', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='+', to='openedx_content.publishableentityversion')),
313
+ ],
314
+ options={
315
+ 'verbose_name': 'Draft Change Log Record',
316
+ 'verbose_name_plural': 'Draft Change Log Records',
317
+ 'db_table': 'oel_publishing_draftchangelogrecord',
318
+ },
319
+ ),
320
+ migrations.CreateModel(
321
+ name='DraftSideEffect',
322
+ fields=[
323
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
324
+ ('cause', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='causes', to='openedx_content.draftchangelogrecord')),
325
+ ('effect', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='affected_by', to='openedx_content.draftchangelogrecord')),
326
+ ],
327
+ options={
328
+ 'verbose_name': 'Draft Side Effect',
329
+ 'verbose_name_plural': 'Draft Side Effects',
330
+ 'db_table': 'oel_publishing_draftsideeffect',
331
+ },
332
+ ),
333
+ migrations.CreateModel(
334
+ name='EntityListRow',
335
+ fields=[
336
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
337
+ ('order_num', models.PositiveIntegerField()),
338
+ ('entity', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentity')),
339
+ ('entity_list', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.entitylist')),
340
+ ('entity_version', models.ForeignKey(null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='+', to='openedx_content.publishableentityversion')),
341
+ ],
342
+ options={
343
+ 'db_table': 'oel_publishing_entitylistrow',
344
+ 'ordering': ['order_num'],
345
+ },
346
+ ),
347
+ migrations.AddField(
348
+ model_name='publishableentity',
349
+ name='learning_package',
350
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='publishable_entities', to='openedx_content.learningpackage'),
351
+ ),
352
+ migrations.AddConstraint(
353
+ model_name='learningpackage',
354
+ constraint=models.UniqueConstraint(fields=('key',), name='oel_publishing_lp_uniq_key'),
355
+ ),
356
+ migrations.AddField(
357
+ model_name='draftchangelog',
358
+ name='learning_package',
359
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.learningpackage'),
360
+ ),
361
+ migrations.AddField(
362
+ model_name='content',
363
+ name='learning_package',
364
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.learningpackage'),
365
+ ),
366
+ migrations.AddField(
367
+ model_name='collection',
368
+ name='learning_package',
369
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.learningpackage'),
370
+ ),
371
+ migrations.AddConstraint(
372
+ model_name='mediatype',
373
+ constraint=models.UniqueConstraint(fields=('type', 'sub_type', 'suffix'), name='oel_contents_uniq_t_st_sfx'),
374
+ ),
375
+ migrations.AddField(
376
+ model_name='content',
377
+ name='media_type',
378
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='openedx_content.mediatype'),
379
+ ),
380
+ migrations.AddField(
381
+ model_name='publishableentityversiondependency',
382
+ name='referenced_entity',
383
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentity'),
384
+ ),
385
+ migrations.AddField(
386
+ model_name='publishableentityversiondependency',
387
+ name='referring_version',
388
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.publishableentityversion'),
389
+ ),
390
+ migrations.AddField(
391
+ model_name='publishableentityversion',
392
+ name='dependencies',
393
+ field=models.ManyToManyField(related_name='affects', through='openedx_content.PublishableEntityVersionDependency', to='openedx_content.publishableentity'),
394
+ ),
395
+ migrations.AddField(
396
+ model_name='publishlog',
397
+ name='learning_package',
398
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.learningpackage'),
399
+ ),
400
+ migrations.AddField(
401
+ model_name='publishlog',
402
+ name='published_by',
403
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
404
+ ),
405
+ migrations.AddField(
406
+ model_name='publishlogrecord',
407
+ name='entity',
408
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentity'),
409
+ ),
410
+ migrations.AddField(
411
+ model_name='publishlogrecord',
412
+ name='new_version',
413
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentityversion'),
414
+ ),
415
+ migrations.AddField(
416
+ model_name='publishlogrecord',
417
+ name='old_version',
418
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='+', to='openedx_content.publishableentityversion'),
419
+ ),
420
+ migrations.AddField(
421
+ model_name='publishlogrecord',
422
+ name='publish_log',
423
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='records', to='openedx_content.publishlog'),
424
+ ),
425
+ migrations.AddField(
426
+ model_name='publishsideeffect',
427
+ name='cause',
428
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='causes', to='openedx_content.publishlogrecord'),
429
+ ),
430
+ migrations.AddField(
431
+ model_name='publishsideeffect',
432
+ name='effect',
433
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='affected_by', to='openedx_content.publishlogrecord'),
434
+ ),
435
+ migrations.AddField(
436
+ model_name='component',
437
+ name='component_type',
438
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='openedx_content.componenttype'),
439
+ ),
440
+ migrations.AddField(
441
+ model_name='component',
442
+ name='learning_package',
443
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.learningpackage'),
444
+ ),
445
+ migrations.CreateModel(
446
+ name='Section',
447
+ fields=[
448
+ ('container', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_content.container')),
449
+ ],
450
+ options={
451
+ 'abstract': False,
452
+ 'db_table': "oel_sections_section",
453
+ },
454
+ bases=('openedx_content.container',),
455
+ ),
456
+ migrations.CreateModel(
457
+ name='Subsection',
458
+ fields=[
459
+ ('container', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_content.container')),
460
+ ],
461
+ options={
462
+ 'abstract': False,
463
+ 'db_table': "oel_subsections_subsection",
464
+ },
465
+ bases=('openedx_content.container',),
466
+ ),
467
+ migrations.CreateModel(
468
+ name='Unit',
469
+ fields=[
470
+ ('container', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_content.container')),
471
+ ],
472
+ options={
473
+ 'abstract': False,
474
+ 'db_table': "oel_units_unit",
475
+ },
476
+ bases=('openedx_content.container',),
477
+ ),
478
+ migrations.AddField(
479
+ model_name='draft',
480
+ name='draft_log_record',
481
+ field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='openedx_content.draftchangelogrecord'),
482
+ ),
483
+ migrations.AddField(
484
+ model_name='draft',
485
+ name='version',
486
+ field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentityversion'),
487
+ ),
488
+ migrations.AddField(
489
+ model_name='published',
490
+ name='publish_log_record',
491
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishlogrecord'),
492
+ ),
493
+ migrations.AddField(
494
+ model_name='published',
495
+ name='version',
496
+ field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.RESTRICT, to='openedx_content.publishableentityversion'),
497
+ ),
498
+ migrations.AddConstraint(
499
+ model_name='collectionpublishableentity',
500
+ constraint=models.UniqueConstraint(fields=('collection', 'entity'), name='oel_collections_cpe_uniq_col_ent'),
501
+ ),
502
+ migrations.AddField(
503
+ model_name='componentversioncontent',
504
+ name='component_version',
505
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openedx_content.componentversion'),
506
+ ),
507
+ migrations.AddField(
508
+ model_name='componentversion',
509
+ name='component',
510
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='openedx_content.component'),
511
+ ),
512
+ migrations.AddField(
513
+ model_name='componentversion',
514
+ name='contents',
515
+ field=models.ManyToManyField(related_name='component_versions', through='openedx_content.ComponentVersionContent', to='openedx_content.content'),
516
+ ),
517
+ migrations.CreateModel(
518
+ name='SectionVersion',
519
+ fields=[
520
+ ('container_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_content.containerversion')),
521
+ ],
522
+ options={
523
+ 'abstract': False,
524
+ 'db_table': 'oel_sections_sectionversion',
525
+ },
526
+ bases=('openedx_content.containerversion',),
527
+ ),
528
+ migrations.CreateModel(
529
+ name='SubsectionVersion',
530
+ fields=[
531
+ ('container_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_content.containerversion')),
532
+ ],
533
+ options={
534
+ 'abstract': False,
535
+ 'db_table': 'oel_subsections_subsectionversion',
536
+ },
537
+ bases=('openedx_content.containerversion',),
538
+ ),
539
+ migrations.CreateModel(
540
+ name='UnitVersion',
541
+ fields=[
542
+ ('container_version', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='openedx_content.containerversion')),
543
+ ],
544
+ options={
545
+ 'abstract': False,
546
+ 'db_table': 'oel_units_unitversion',
547
+ },
548
+ bases=('openedx_content.containerversion',),
549
+ ),
550
+ migrations.AddField(
551
+ model_name='containerversion',
552
+ name='container',
553
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='openedx_content.container'),
554
+ ),
555
+ migrations.AddField(
556
+ model_name='containerversion',
557
+ name='entity_list',
558
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='container_versions', to='openedx_content.entitylist'),
559
+ ),
560
+ migrations.AddIndex(
561
+ model_name='draftchangelogrecord',
562
+ index=models.Index(fields=['entity', '-draft_change_log'], name='oel_dlr_idx_entity_rdcl'),
563
+ ),
564
+ migrations.AddConstraint(
565
+ model_name='draftchangelogrecord',
566
+ constraint=models.UniqueConstraint(fields=('draft_change_log', 'entity'), name='oel_dlr_uniq_dcl'),
567
+ ),
568
+ migrations.AddConstraint(
569
+ model_name='draftsideeffect',
570
+ constraint=models.UniqueConstraint(fields=('cause', 'effect'), name='oel_pub_dse_uniq_c_e'),
571
+ ),
572
+ migrations.AddConstraint(
573
+ model_name='entitylistrow',
574
+ constraint=models.UniqueConstraint(fields=('entity_list', 'order_num'), name='oel_publishing_elist_row_order'),
575
+ ),
576
+ migrations.AddIndex(
577
+ model_name='publishableentity',
578
+ index=models.Index(fields=['key'], name='oel_pub_ent_idx_key'),
579
+ ),
580
+ migrations.AddIndex(
581
+ model_name='publishableentity',
582
+ index=models.Index(fields=['learning_package', '-created'], name='oel_pub_ent_idx_lp_rcreated'),
583
+ ),
584
+ migrations.AddConstraint(
585
+ model_name='publishableentity',
586
+ constraint=models.UniqueConstraint(fields=('learning_package', 'key'), name='oel_pub_ent_uniq_lp_key'),
587
+ ),
588
+ migrations.AddIndex(
589
+ model_name='collection',
590
+ index=models.Index(fields=['learning_package', 'title'], name='oel_collect_learnin_dfaf89_idx'),
591
+ ),
592
+ migrations.AddConstraint(
593
+ model_name='collection',
594
+ constraint=models.UniqueConstraint(fields=('learning_package', 'key'), name='oel_coll_uniq_lp_key'),
595
+ ),
596
+ migrations.AddIndex(
597
+ model_name='content',
598
+ index=models.Index(fields=['learning_package', '-size'], name='oel_content_idx_lp_rsize'),
599
+ ),
600
+ migrations.AddConstraint(
601
+ model_name='content',
602
+ constraint=models.UniqueConstraint(fields=('learning_package', 'media_type', 'hash_digest'), name='oel_content_uniq_lc_media_type_hash_digest'),
603
+ ),
604
+ migrations.AddConstraint(
605
+ model_name='publishableentityversiondependency',
606
+ constraint=models.UniqueConstraint(fields=('referring_version', 'referenced_entity'), name='oel_pevd_uniq_rv_re'),
607
+ ),
608
+ migrations.AddIndex(
609
+ model_name='publishableentityversion',
610
+ index=models.Index(fields=['entity', '-created'], name='oel_pv_idx_entity_rcreated'),
611
+ ),
612
+ migrations.AddIndex(
613
+ model_name='publishableentityversion',
614
+ index=models.Index(fields=['title'], name='oel_pv_idx_title'),
615
+ ),
616
+ migrations.AddConstraint(
617
+ model_name='publishableentityversion',
618
+ constraint=models.UniqueConstraint(fields=('entity', 'version_num'), name='oel_pv_uniq_entity_version_num'),
619
+ ),
620
+ migrations.AddIndex(
621
+ model_name='publishlogrecord',
622
+ index=models.Index(fields=['entity', '-publish_log'], name='oel_plr_idx_entity_rplr'),
623
+ ),
624
+ migrations.AddConstraint(
625
+ model_name='publishlogrecord',
626
+ constraint=models.UniqueConstraint(fields=('publish_log', 'entity'), name='oel_plr_uniq_pl_publishable'),
627
+ ),
628
+ migrations.AddConstraint(
629
+ model_name='publishsideeffect',
630
+ constraint=models.UniqueConstraint(fields=('cause', 'effect'), name='oel_pub_pse_uniq_c_e'),
631
+ ),
632
+ migrations.AddIndex(
633
+ model_name='component',
634
+ index=models.Index(fields=['component_type', 'local_key'], name='oel_component_idx_ct_lk'),
635
+ ),
636
+ migrations.AddConstraint(
637
+ model_name='component',
638
+ constraint=models.UniqueConstraint(fields=('learning_package', 'component_type', 'local_key'), name='oel_component_uniq_lc_ct_lk'),
639
+ ),
640
+ migrations.AddIndex(
641
+ model_name='componentversioncontent',
642
+ index=models.Index(fields=['content', 'component_version'], name='oel_cvcontent_c_cv'),
643
+ ),
644
+ migrations.AddIndex(
645
+ model_name='componentversioncontent',
646
+ index=models.Index(fields=['component_version', 'content'], name='oel_cvcontent_cv_d'),
647
+ ),
648
+ migrations.AddConstraint(
649
+ model_name='componentversioncontent',
650
+ constraint=models.UniqueConstraint(fields=('component_version', 'key'), name='oel_cvcontent_uniq_cv_key'),
651
+ ),
652
+ ]
653
+ )
654
+ ]