openedx-learning 0.9.1__tar.gz → 0.9.3__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 (114) hide show
  1. {openedx_learning-0.9.1/openedx_learning.egg-info → openedx_learning-0.9.3}/PKG-INFO +3 -3
  2. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/__init__.py +1 -1
  3. {openedx_learning-0.9.1 → openedx_learning-0.9.3/openedx_learning.egg-info}/PKG-INFO +3 -3
  4. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/v1/serializers.py +9 -2
  5. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/v1/views.py +8 -2
  6. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rules.py +11 -0
  7. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/CHANGELOG.rst +0 -0
  8. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/LICENSE.txt +0 -0
  9. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/MANIFEST.in +0 -0
  10. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/README.rst +0 -0
  11. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/contrib/__init__.py +0 -0
  12. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/contrib/media_server/__init__.py +0 -0
  13. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/contrib/media_server/apps.py +0 -0
  14. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/contrib/media_server/urls.py +0 -0
  15. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/contrib/media_server/views.py +0 -0
  16. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/__init__.py +0 -0
  17. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/__init__.py +0 -0
  18. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/admin.py +0 -0
  19. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/api.py +0 -0
  20. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/apps.py +0 -0
  21. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/migrations/0001_initial.py +0 -0
  22. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/migrations/0002_alter_componentversioncontent_key.py +0 -0
  23. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/migrations/__init__.py +0 -0
  24. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/components/models.py +0 -0
  25. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/contents/__init__.py +0 -0
  26. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/contents/admin.py +0 -0
  27. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/contents/api.py +0 -0
  28. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/contents/apps.py +0 -0
  29. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/contents/migrations/0001_initial.py +0 -0
  30. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/contents/migrations/__init__.py +0 -0
  31. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/contents/models.py +0 -0
  32. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/__init__.py +0 -0
  33. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/admin.py +0 -0
  34. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/api.py +0 -0
  35. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/apps.py +0 -0
  36. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/migrations/0001_initial.py +0 -0
  37. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/migrations/0002_alter_learningpackage_key_and_more.py +0 -0
  38. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/migrations/__init__.py +0 -0
  39. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/model_mixins.py +0 -0
  40. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/core/publishing/models.py +0 -0
  41. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/__init__.py +0 -0
  42. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/admin_utils.py +0 -0
  43. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/cache.py +0 -0
  44. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/collations.py +0 -0
  45. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/fields.py +0 -0
  46. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/managers.py +0 -0
  47. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/test_utils.py +0 -0
  48. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/lib/validators.py +0 -0
  49. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/py.typed +0 -0
  50. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/rest_api/__init__.py +0 -0
  51. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/rest_api/apps.py +0 -0
  52. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/rest_api/urls.py +0 -0
  53. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/rest_api/v1/__init__.py +0 -0
  54. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/rest_api/v1/components.py +0 -0
  55. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning/rest_api/v1/urls.py +0 -0
  56. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning.egg-info/SOURCES.txt +0 -0
  57. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning.egg-info/dependency_links.txt +0 -0
  58. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning.egg-info/not-zip-safe +0 -0
  59. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning.egg-info/requires.txt +2 -2
  60. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_learning.egg-info/top_level.txt +0 -0
  61. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/__init__.py +0 -0
  62. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/__init__.py +0 -0
  63. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/__init__.py +0 -0
  64. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/admin.py +0 -0
  65. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/api.py +0 -0
  66. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/apps.py +0 -0
  67. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/data.py +0 -0
  68. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/__init__.py +0 -0
  69. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/actions.py +0 -0
  70. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/api.py +0 -0
  71. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/exceptions.py +0 -0
  72. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/import_plan.py +0 -0
  73. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/parsers.py +0 -0
  74. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/tasks.py +0 -0
  75. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/template.csv +0 -0
  76. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/import_export/template.json +0 -0
  77. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0001_initial.py +0 -0
  78. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0001_squashed.py +0 -0
  79. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0002_auto_20230718_2026.py +0 -0
  80. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0003_auto_20230721_1238.py +0 -0
  81. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0004_auto_20230723_2001.py +0 -0
  82. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0005_language_taxonomy.py +0 -0
  83. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0006_alter_objecttag_unique_together.py +0 -0
  84. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0006_auto_20230802_1631.py +0 -0
  85. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0007_tag_import_task_log_null_fix.py +0 -0
  86. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0008_taxonomy_description_not_null.py +0 -0
  87. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0009_alter_objecttag_object_id.py +0 -0
  88. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0010_cleanups.py +0 -0
  89. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0011_remove_required.py +0 -0
  90. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0012_language_taxonomy.py +0 -0
  91. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0013_tag_parent_blank.py +0 -0
  92. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0014_minor_fixes.py +0 -0
  93. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0015_taxonomy_export_id.py +0 -0
  94. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0016_object_tag_export_id.py +0 -0
  95. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/0017_alter_tagimporttask_status.py +0 -0
  96. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/migrations/__init__.py +0 -0
  97. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/models/__init__.py +0 -0
  98. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/models/base.py +0 -0
  99. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/models/import_export.py +0 -0
  100. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/models/system_defined.py +0 -0
  101. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/models/utils.py +0 -0
  102. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/__init__.py +0 -0
  103. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/paginators.py +0 -0
  104. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/urls.py +0 -0
  105. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/utils.py +0 -0
  106. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/v1/__init__.py +0 -0
  107. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/v1/permissions.py +0 -0
  108. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/v1/urls.py +0 -0
  109. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/rest_api/v1/views_import.py +0 -0
  110. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/core/tagging/urls.py +0 -0
  111. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/openedx_tagging/py.typed +0 -0
  112. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/requirements/base.in +0 -0
  113. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/setup.cfg +0 -0
  114. {openedx_learning-0.9.1 → openedx_learning-0.9.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openedx-learning
3
- Version: 0.9.1
3
+ Version: 0.9.3
4
4
  Summary: An experiment.
5
5
  Home-page: https://github.com/openedx/openedx-learning
6
6
  Author: David Ormsbee
@@ -20,9 +20,9 @@ Classifier: Programming Language :: Python :: 3.12
20
20
  Requires-Python: >=3.8
21
21
  License-File: LICENSE.txt
22
22
  Requires-Dist: djangorestframework<4.0
23
- Requires-Dist: attrs
24
- Requires-Dist: edx-drf-extensions
25
23
  Requires-Dist: Django<5.0
24
+ Requires-Dist: edx-drf-extensions
25
+ Requires-Dist: attrs
26
26
  Requires-Dist: celery
27
27
  Requires-Dist: rules<4.0
28
28
 
@@ -1,4 +1,4 @@
1
1
  """
2
2
  Open edX Learning ("Learning Core").
3
3
  """
4
- __version__ = "0.9.1"
4
+ __version__ = "0.9.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openedx-learning
3
- Version: 0.9.1
3
+ Version: 0.9.3
4
4
  Summary: An experiment.
5
5
  Home-page: https://github.com/openedx/openedx-learning
6
6
  Author: David Ormsbee
@@ -20,9 +20,9 @@ Classifier: Programming Language :: Python :: 3.12
20
20
  Requires-Python: >=3.8
21
21
  License-File: LICENSE.txt
22
22
  Requires-Dist: djangorestframework<4.0
23
- Requires-Dist: attrs
24
- Requires-Dist: edx-drf-extensions
25
23
  Requires-Dist: Django<5.0
24
+ Requires-Dist: edx-drf-extensions
25
+ Requires-Dist: attrs
26
26
  Requires-Dist: celery
27
27
  Requires-Dist: rules<4.0
28
28
 
@@ -140,7 +140,14 @@ class ObjectTagMinimalSerializer(UserPermissionsSerializerMixin, serializers.Mod
140
140
  fields = ["value", "lineage", "can_delete_objecttag"]
141
141
 
142
142
  lineage = serializers.ListField(child=serializers.CharField(), source="get_lineage", read_only=True)
143
- can_delete_objecttag = serializers.SerializerMethodField(method_name='get_can_delete')
143
+ can_delete_objecttag = serializers.SerializerMethodField()
144
+
145
+ def get_can_delete_objecttag(self, instance) -> bool | None:
146
+ """
147
+ Returns True if the current request user may delete object tags on this taxonomy
148
+ """
149
+ perm_name = f'{self.app_label}.remove_objecttag_objectid'
150
+ return self._can(perm_name, instance.object_id)
144
151
 
145
152
 
146
153
  class ObjectTagSerializer(ObjectTagMinimalSerializer):
@@ -342,7 +349,7 @@ class TaxonomyImportNewBodySerializer(TaxonomyImportBodySerializer): # pylint:
342
349
  """
343
350
  taxonomy_name = serializers.CharField(required=True)
344
351
  taxonomy_description = serializers.CharField(default="")
345
- taxonomy_export_id = serializers.CharField(required=True)
352
+ taxonomy_export_id = serializers.CharField(required=False)
346
353
 
347
354
 
348
355
  class TagImportTaskSerializer(serializers.ModelSerializer):
@@ -304,12 +304,18 @@ class TaxonomyView(ModelViewSet):
304
304
  body.is_valid(raise_exception=True)
305
305
 
306
306
  taxonomy_name = body.validated_data["taxonomy_name"]
307
- taxonomy_export_id = body.validated_data["taxonomy_export_id"]
307
+ taxonomy_export_id = body.validated_data.get("taxonomy_export_id")
308
308
  taxonomy_description = body.validated_data["taxonomy_description"]
309
309
  file = body.validated_data["file"].file
310
310
  parser_format = body.validated_data["parser_format"]
311
311
 
312
- taxonomy = create_taxonomy(taxonomy_name, taxonomy_description, export_id=taxonomy_export_id)
312
+ # If no taxonomy_export_id provided, a unique export id will be generated
313
+ taxonomy = create_taxonomy(
314
+ taxonomy_name,
315
+ taxonomy_description,
316
+ export_id=taxonomy_export_id,
317
+ )
318
+
313
319
  try:
314
320
  import_success, task, _plan = import_tags(taxonomy, file, parser_format)
315
321
 
@@ -137,6 +137,16 @@ def can_change_object_tag_objectid(_user: UserType, _object_id: str) -> bool:
137
137
  return False
138
138
 
139
139
 
140
+ @rules.predicate
141
+ def can_remove_object_tag_objectid(_user: UserType, _object_id: str) -> bool:
142
+ """
143
+ Nobody can remove object tags without checking the permission for the tagged object.
144
+
145
+ This rule could be defined in other apps for proper permission checking.
146
+ """
147
+ return can_change_object_tag_objectid(_user, _object_id)
148
+
149
+
140
150
  @rules.predicate
141
151
  def can_change_object_tag(
142
152
  user: UserType, perm_obj: ObjectTagPermissionItem | None = None
@@ -194,3 +204,4 @@ rules.add_perm("oel_tagging.view_objecttag_objectid", can_view_object_tag_object
194
204
  rules.add_perm("oel_tagging.view_objecttag_taxonomy", can_view_object_tag_taxonomy)
195
205
  rules.add_perm("oel_tagging.change_objecttag_taxonomy", can_view_object_tag_taxonomy)
196
206
  rules.add_perm("oel_tagging.change_objecttag_objectid", can_change_object_tag_objectid)
207
+ rules.add_perm("oel_tagging.remove_objecttag_objectid", can_remove_object_tag_objectid)
@@ -1,6 +1,6 @@
1
1
  djangorestframework<4.0
2
- attrs
3
- edx-drf-extensions
4
2
  Django<5.0
3
+ edx-drf-extensions
4
+ attrs
5
5
  celery
6
6
  rules<4.0