openedx-learning 0.12.0__tar.gz → 0.13.0__tar.gz

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 (125) hide show
  1. {openedx_learning-0.12.0/openedx_learning.egg-info → openedx_learning-0.13.0}/PKG-INFO +4 -4
  2. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/__init__.py +1 -1
  3. openedx_learning-0.13.0/openedx_learning/apps/authoring/collections/admin.py +27 -0
  4. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/api.py +38 -0
  5. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/api.py +16 -0
  6. {openedx_learning-0.12.0 → openedx_learning-0.13.0/openedx_learning.egg-info}/PKG-INFO +4 -4
  7. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning.egg-info/SOURCES.txt +1 -0
  8. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/CHANGELOG.rst +0 -0
  9. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/LICENSE.txt +0 -0
  10. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/MANIFEST.in +0 -0
  11. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/README.rst +0 -0
  12. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/api/__init__.py +0 -0
  13. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/api/authoring.py +0 -0
  14. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/api/authoring_models.py +0 -0
  15. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/__init__.py +0 -0
  16. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/__init__.py +0 -0
  17. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/__init__.py +0 -0
  18. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/apps.py +0 -0
  19. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/migrations/0001_initial.py +0 -0
  20. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/migrations/0002_remove_collection_name_collection_created_by_and_more.py +0 -0
  21. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/migrations/0003_collection_entities.py +0 -0
  22. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/migrations/0004_collection_key.py +0 -0
  23. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/migrations/__init__.py +0 -0
  24. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/collections/models.py +0 -0
  25. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/__init__.py +0 -0
  26. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/admin.py +0 -0
  27. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/apps.py +0 -0
  28. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/management/__init__.py +0 -0
  29. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/management/commands/__init__.py +0 -0
  30. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/management/commands/add_assets_to_component.py +0 -0
  31. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/migrations/0001_initial.py +0 -0
  32. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/migrations/0002_alter_componentversioncontent_key.py +0 -0
  33. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/migrations/__init__.py +0 -0
  34. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/components/models.py +0 -0
  35. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/contents/__init__.py +0 -0
  36. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/contents/admin.py +0 -0
  37. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/contents/api.py +0 -0
  38. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/contents/apps.py +0 -0
  39. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/contents/migrations/0001_initial.py +0 -0
  40. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/contents/migrations/__init__.py +0 -0
  41. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/contents/models.py +0 -0
  42. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/__init__.py +0 -0
  43. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/admin.py +0 -0
  44. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/api.py +0 -0
  45. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/apps.py +0 -0
  46. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/migrations/0001_initial.py +0 -0
  47. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/migrations/0002_alter_learningpackage_key_and_more.py +0 -0
  48. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/migrations/__init__.py +0 -0
  49. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/model_mixins.py +0 -0
  50. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/apps/authoring/publishing/models.py +0 -0
  51. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/contrib/__init__.py +0 -0
  52. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/contrib/media_server/__init__.py +0 -0
  53. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/contrib/media_server/apps.py +0 -0
  54. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/contrib/media_server/urls.py +0 -0
  55. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/contrib/media_server/views.py +0 -0
  56. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/__init__.py +0 -0
  57. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/admin_utils.py +0 -0
  58. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/cache.py +0 -0
  59. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/collations.py +0 -0
  60. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/fields.py +0 -0
  61. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/managers.py +0 -0
  62. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/test_utils.py +0 -0
  63. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/lib/validators.py +0 -0
  64. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning/py.typed +0 -0
  65. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning.egg-info/dependency_links.txt +0 -0
  66. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning.egg-info/not-zip-safe +0 -0
  67. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning.egg-info/requires.txt +3 -3
  68. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_learning.egg-info/top_level.txt +0 -0
  69. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/__init__.py +0 -0
  70. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/__init__.py +0 -0
  71. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/__init__.py +0 -0
  72. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/admin.py +0 -0
  73. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/api.py +0 -0
  74. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/apps.py +0 -0
  75. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/data.py +0 -0
  76. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/__init__.py +0 -0
  77. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/actions.py +0 -0
  78. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/api.py +0 -0
  79. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/exceptions.py +0 -0
  80. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/import_plan.py +0 -0
  81. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/parsers.py +0 -0
  82. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/tasks.py +0 -0
  83. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/template.csv +0 -0
  84. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/import_export/template.json +0 -0
  85. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0001_initial.py +0 -0
  86. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0001_squashed.py +0 -0
  87. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0002_auto_20230718_2026.py +0 -0
  88. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0003_auto_20230721_1238.py +0 -0
  89. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0004_auto_20230723_2001.py +0 -0
  90. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0005_language_taxonomy.py +0 -0
  91. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0006_alter_objecttag_unique_together.py +0 -0
  92. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0006_auto_20230802_1631.py +0 -0
  93. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0007_tag_import_task_log_null_fix.py +0 -0
  94. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0008_taxonomy_description_not_null.py +0 -0
  95. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0009_alter_objecttag_object_id.py +0 -0
  96. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0010_cleanups.py +0 -0
  97. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0011_remove_required.py +0 -0
  98. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0012_language_taxonomy.py +0 -0
  99. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0013_tag_parent_blank.py +0 -0
  100. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0014_minor_fixes.py +0 -0
  101. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0015_taxonomy_export_id.py +0 -0
  102. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0016_object_tag_export_id.py +0 -0
  103. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/0017_alter_tagimporttask_status.py +0 -0
  104. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/migrations/__init__.py +0 -0
  105. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/models/__init__.py +0 -0
  106. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/models/base.py +0 -0
  107. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/models/import_export.py +0 -0
  108. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/models/system_defined.py +0 -0
  109. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/models/utils.py +0 -0
  110. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/__init__.py +0 -0
  111. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/paginators.py +0 -0
  112. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/urls.py +0 -0
  113. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/utils.py +0 -0
  114. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/v1/__init__.py +0 -0
  115. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/v1/permissions.py +0 -0
  116. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/v1/serializers.py +0 -0
  117. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/v1/urls.py +0 -0
  118. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/v1/views.py +0 -0
  119. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rest_api/v1/views_import.py +0 -0
  120. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/rules.py +0 -0
  121. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/core/tagging/urls.py +0 -0
  122. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/openedx_tagging/py.typed +0 -0
  123. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/requirements/base.in +0 -0
  124. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/setup.cfg +0 -0
  125. {openedx_learning-0.12.0 → openedx_learning-0.13.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openedx-learning
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: Open edX Learning Core and Tagging.
5
5
  Home-page: https://github.com/openedx/openedx-learning
6
6
  Author: David Ormsbee
@@ -18,11 +18,11 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Requires-Python: >=3.11
20
20
  License-File: LICENSE.txt
21
- Requires-Dist: celery
22
21
  Requires-Dist: Django<5.0
23
- Requires-Dist: djangorestframework<4.0
24
- Requires-Dist: rules<4.0
25
22
  Requires-Dist: edx-drf-extensions
23
+ Requires-Dist: celery
24
+ Requires-Dist: rules<4.0
25
+ Requires-Dist: djangorestframework<4.0
26
26
  Requires-Dist: attrs
27
27
 
28
28
  Open edX Learning Core (and Tagging)
@@ -1,4 +1,4 @@
1
1
  """
2
2
  Open edX Learning ("Learning Core").
3
3
  """
4
- __version__ = "0.12.0"
4
+ __version__ = "0.13.0"
@@ -0,0 +1,27 @@
1
+ """
2
+ Django Admin pages for Collection models.
3
+ """
4
+ from django.contrib import admin
5
+
6
+ from .models import Collection
7
+
8
+
9
+ class CollectionAdmin(admin.ModelAdmin):
10
+ """
11
+ The Collection model admin.
12
+
13
+ Allows users to easily disable/enable (aka soft delete and restore) or bulk delete Collections.
14
+ """
15
+ readonly_fields = ["key", "learning_package"]
16
+ list_filter = ["enabled"]
17
+ list_display = ["key", "title", "enabled", "modified"]
18
+ list_editable = ["enabled"]
19
+
20
+ def has_add_permission(self, request, *args, **kwargs):
21
+ """
22
+ Disallow adding new collections via Django Admin.
23
+ """
24
+ return False # pragma: no cover
25
+
26
+
27
+ admin.site.register(Collection, CollectionAdmin)
@@ -20,10 +20,12 @@ from .models import Collection
20
20
  __all__ = [
21
21
  "add_to_collection",
22
22
  "create_collection",
23
+ "delete_collection",
23
24
  "get_collection",
24
25
  "get_collections",
25
26
  "get_entity_collections",
26
27
  "remove_from_collection",
28
+ "restore_collection",
27
29
  "update_collection",
28
30
  ]
29
31
 
@@ -84,6 +86,42 @@ def update_collection(
84
86
  return collection
85
87
 
86
88
 
89
+ def delete_collection(
90
+ learning_package_id: int,
91
+ key: str,
92
+ *,
93
+ hard_delete=False,
94
+ ) -> Collection:
95
+ """
96
+ Disables or deletes a collection identified by the given learning_package + key.
97
+
98
+ By default (hard_delete=False), the collection is "soft deleted", i.e disabled.
99
+ Soft-deleted collections can be re-enabled using restore_collection.
100
+ """
101
+ collection = get_collection(learning_package_id, key)
102
+
103
+ if hard_delete:
104
+ collection.delete()
105
+ else:
106
+ collection.enabled = False
107
+ collection.save()
108
+ return collection
109
+
110
+
111
+ def restore_collection(
112
+ learning_package_id: int,
113
+ key: str,
114
+ ) -> Collection:
115
+ """
116
+ Undo a "soft delete" by re-enabling a Collection.
117
+ """
118
+ collection = get_collection(learning_package_id, key)
119
+
120
+ collection.enabled = True
121
+ collection.save()
122
+ return collection
123
+
124
+
87
125
  def add_to_collection(
88
126
  learning_package_id: int,
89
127
  key: str,
@@ -42,6 +42,7 @@ __all__ = [
42
42
  "get_component_by_uuid",
43
43
  "get_component_version_by_uuid",
44
44
  "component_exists_by_key",
45
+ "get_collection_components",
45
46
  "get_components",
46
47
  "create_component_version_content",
47
48
  "look_up_component_version_content",
@@ -339,6 +340,21 @@ def get_components(
339
340
  return qset
340
341
 
341
342
 
343
+ def get_collection_components(
344
+ learning_package_id: int,
345
+ collection_key: str,
346
+ ) -> QuerySet[Component]:
347
+ """
348
+ Returns a QuerySet of Components relating to the PublishableEntities in a Collection.
349
+
350
+ Components have a one-to-one relationship with PublishableEntity, but the reverse may not always be true.
351
+ """
352
+ return Component.objects.filter(
353
+ learning_package_id=learning_package_id,
354
+ publishable_entity__collections__key=collection_key,
355
+ ).order_by('pk')
356
+
357
+
342
358
  def look_up_component_version_content(
343
359
  learning_package_key: str,
344
360
  component_key: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openedx-learning
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: Open edX Learning Core and Tagging.
5
5
  Home-page: https://github.com/openedx/openedx-learning
6
6
  Author: David Ormsbee
@@ -18,11 +18,11 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Requires-Python: >=3.11
20
20
  License-File: LICENSE.txt
21
- Requires-Dist: celery
22
21
  Requires-Dist: Django<5.0
23
- Requires-Dist: djangorestframework<4.0
24
- Requires-Dist: rules<4.0
25
22
  Requires-Dist: edx-drf-extensions
23
+ Requires-Dist: celery
24
+ Requires-Dist: rules<4.0
25
+ Requires-Dist: djangorestframework<4.0
26
26
  Requires-Dist: attrs
27
27
 
28
28
  Open edX Learning Core (and Tagging)
@@ -18,6 +18,7 @@ openedx_learning/api/authoring_models.py
18
18
  openedx_learning/apps/__init__.py
19
19
  openedx_learning/apps/authoring/__init__.py
20
20
  openedx_learning/apps/authoring/collections/__init__.py
21
+ openedx_learning/apps/authoring/collections/admin.py
21
22
  openedx_learning/apps/authoring/collections/api.py
22
23
  openedx_learning/apps/authoring/collections/apps.py
23
24
  openedx_learning/apps/authoring/collections/models.py
@@ -1,6 +1,6 @@
1
- celery
2
1
  Django<5.0
3
- djangorestframework<4.0
4
- rules<4.0
5
2
  edx-drf-extensions
3
+ celery
4
+ rules<4.0
5
+ djangorestframework<4.0
6
6
  attrs