openedx-learning 0.29.1__tar.gz → 0.30.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 (177) hide show
  1. {openedx_learning-0.29.1/openedx_learning.egg-info → openedx_learning-0.30.0}/PKG-INFO +6 -6
  2. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/__init__.py +1 -1
  3. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/admin.py +110 -12
  4. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/api.py +676 -200
  5. openedx_learning-0.30.0/openedx_learning/apps/authoring/publishing/migrations/0009_dependencies_and_hashing.py +62 -0
  6. openedx_learning-0.30.0/openedx_learning/apps/authoring/publishing/migrations/0010_backfill_dependencies.py +149 -0
  7. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/models/__init__.py +2 -1
  8. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/models/draft_log.py +77 -1
  9. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/models/entity_list.py +19 -0
  10. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/models/publish_log.py +87 -1
  11. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/models/publishable_entity.py +48 -0
  12. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/units/api.py +1 -1
  13. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/fields.py +13 -11
  14. {openedx_learning-0.29.1 → openedx_learning-0.30.0/openedx_learning.egg-info}/PKG-INFO +6 -6
  15. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning.egg-info/SOURCES.txt +2 -0
  16. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/CHANGELOG.rst +0 -0
  17. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/LICENSE.txt +0 -0
  18. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/MANIFEST.in +0 -0
  19. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/README.rst +0 -0
  20. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/api/__init__.py +0 -0
  21. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/api/authoring.py +0 -0
  22. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/api/authoring_models.py +0 -0
  23. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/__init__.py +0 -0
  24. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/__init__.py +0 -0
  25. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/__init__.py +0 -0
  26. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/admin.py +0 -0
  27. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/api.py +0 -0
  28. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/apps.py +0 -0
  29. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/management/__init__.py +0 -0
  30. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/management/commands/__init__.py +0 -0
  31. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/management/commands/lp_dump.py +0 -0
  32. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/management/commands/lp_load.py +0 -0
  33. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/migrations/__init__.py +0 -0
  34. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/models.py +0 -0
  35. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/serializers.py +0 -0
  36. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/toml.py +0 -0
  37. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/backup_restore/zipper.py +0 -0
  38. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/__init__.py +0 -0
  39. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/admin.py +0 -0
  40. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/api.py +0 -0
  41. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/apps.py +0 -0
  42. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/migrations/0001_initial.py +0 -0
  43. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/migrations/0002_remove_collection_name_collection_created_by_and_more.py +0 -0
  44. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/migrations/0003_collection_entities.py +0 -0
  45. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/migrations/0004_collection_key.py +0 -0
  46. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/migrations/0005_alter_collection_options_alter_collection_enabled.py +0 -0
  47. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/migrations/__init__.py +0 -0
  48. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/collections/models.py +0 -0
  49. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/__init__.py +0 -0
  50. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/admin.py +0 -0
  51. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/api.py +0 -0
  52. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/apps.py +0 -0
  53. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/management/__init__.py +0 -0
  54. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/management/commands/__init__.py +0 -0
  55. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/management/commands/add_assets_to_component.py +0 -0
  56. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/migrations/0001_initial.py +0 -0
  57. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/migrations/0002_alter_componentversioncontent_key.py +0 -0
  58. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/migrations/0003_remove_componentversioncontent_learner_downloadable.py +0 -0
  59. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/migrations/0004_remove_componentversioncontent_uuid.py +0 -0
  60. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/migrations/__init__.py +0 -0
  61. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/components/models.py +0 -0
  62. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/contents/__init__.py +0 -0
  63. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/contents/admin.py +0 -0
  64. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/contents/api.py +0 -0
  65. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/contents/apps.py +0 -0
  66. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/contents/migrations/0001_initial.py +0 -0
  67. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/contents/migrations/__init__.py +0 -0
  68. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/contents/models.py +0 -0
  69. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/__init__.py +0 -0
  70. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/apps.py +0 -0
  71. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/contextmanagers.py +0 -0
  72. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0001_initial.py +0 -0
  73. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0002_alter_learningpackage_key_and_more.py +0 -0
  74. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0003_containers.py +0 -0
  75. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0004_publishableentity_can_stand_alone.py +0 -0
  76. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0005_alter_entitylistrow_options.py +0 -0
  77. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0006_draftchangelog.py +0 -0
  78. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0007_bootstrap_draftchangelog.py +0 -0
  79. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/0008_alter_draftchangelogrecord_options_and_more.py +0 -0
  80. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/migrations/__init__.py +0 -0
  81. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/models/container.py +0 -0
  82. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/publishing/models/learning_package.py +0 -0
  83. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/sections/__init__.py +0 -0
  84. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/sections/admin.py +0 -0
  85. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/sections/api.py +0 -0
  86. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/sections/apps.py +0 -0
  87. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/sections/migrations/0001_initial.py +0 -0
  88. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/sections/migrations/__init__.py +0 -0
  89. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/sections/models.py +0 -0
  90. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/subsections/__init__.py +0 -0
  91. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/subsections/admin.py +0 -0
  92. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/subsections/api.py +0 -0
  93. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/subsections/apps.py +0 -0
  94. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/subsections/migrations/0001_initial.py +0 -0
  95. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/subsections/migrations/__init__.py +0 -0
  96. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/subsections/models.py +0 -0
  97. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/units/__init__.py +0 -0
  98. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/units/admin.py +0 -0
  99. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/units/apps.py +0 -0
  100. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/units/migrations/0001_initial.py +0 -0
  101. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/units/migrations/__init__.py +0 -0
  102. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/apps/authoring/units/models.py +0 -0
  103. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/contrib/__init__.py +0 -0
  104. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/contrib/media_server/__init__.py +0 -0
  105. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/contrib/media_server/apps.py +0 -0
  106. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/contrib/media_server/urls.py +0 -0
  107. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/contrib/media_server/views.py +0 -0
  108. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/__init__.py +0 -0
  109. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/admin_utils.py +0 -0
  110. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/cache.py +0 -0
  111. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/collations.py +0 -0
  112. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/managers.py +0 -0
  113. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/test_utils.py +0 -0
  114. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/lib/validators.py +0 -0
  115. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning/py.typed +0 -0
  116. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning.egg-info/dependency_links.txt +0 -0
  117. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning.egg-info/not-zip-safe +0 -0
  118. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning.egg-info/requires.txt +5 -5
  119. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_learning.egg-info/top_level.txt +0 -0
  120. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/__init__.py +0 -0
  121. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/__init__.py +0 -0
  122. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/__init__.py +0 -0
  123. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/admin.py +0 -0
  124. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/api.py +0 -0
  125. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/apps.py +0 -0
  126. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/data.py +0 -0
  127. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/__init__.py +0 -0
  128. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/actions.py +0 -0
  129. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/api.py +0 -0
  130. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/exceptions.py +0 -0
  131. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/import_plan.py +0 -0
  132. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/parsers.py +0 -0
  133. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/tasks.py +0 -0
  134. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/template.csv +0 -0
  135. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/import_export/template.json +0 -0
  136. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0001_initial.py +0 -0
  137. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0001_squashed.py +0 -0
  138. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0002_auto_20230718_2026.py +0 -0
  139. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0003_auto_20230721_1238.py +0 -0
  140. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0004_auto_20230723_2001.py +0 -0
  141. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0005_language_taxonomy.py +0 -0
  142. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0006_alter_objecttag_unique_together.py +0 -0
  143. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0006_auto_20230802_1631.py +0 -0
  144. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0007_tag_import_task_log_null_fix.py +0 -0
  145. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0008_taxonomy_description_not_null.py +0 -0
  146. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0009_alter_objecttag_object_id.py +0 -0
  147. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0010_cleanups.py +0 -0
  148. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0011_remove_required.py +0 -0
  149. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0012_language_taxonomy.py +0 -0
  150. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0013_tag_parent_blank.py +0 -0
  151. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0014_minor_fixes.py +0 -0
  152. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0015_taxonomy_export_id.py +0 -0
  153. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0016_object_tag_export_id.py +0 -0
  154. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0017_alter_tagimporttask_status.py +0 -0
  155. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/0018_objecttag_is_copied.py +0 -0
  156. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/migrations/__init__.py +0 -0
  157. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/models/__init__.py +0 -0
  158. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/models/base.py +0 -0
  159. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/models/import_export.py +0 -0
  160. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/models/system_defined.py +0 -0
  161. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/models/utils.py +0 -0
  162. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/__init__.py +0 -0
  163. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/paginators.py +0 -0
  164. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/urls.py +0 -0
  165. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/utils.py +0 -0
  166. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/v1/__init__.py +0 -0
  167. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/v1/permissions.py +0 -0
  168. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/v1/serializers.py +0 -0
  169. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/v1/urls.py +0 -0
  170. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/v1/views.py +0 -0
  171. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rest_api/v1/views_import.py +0 -0
  172. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/rules.py +0 -0
  173. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/core/tagging/urls.py +0 -0
  174. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/openedx_tagging/py.typed +0 -0
  175. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/requirements/base.in +0 -0
  176. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/setup.cfg +0 -0
  177. {openedx_learning-0.29.1 → openedx_learning-0.30.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openedx-learning
3
- Version: 0.29.1
3
+ Version: 0.30.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
@@ -19,13 +19,13 @@ Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
20
  Requires-Python: >=3.11
21
21
  License-File: LICENSE.txt
22
- Requires-Dist: rules<4.0
23
- Requires-Dist: edx-drf-extensions
24
- Requires-Dist: Django
25
22
  Requires-Dist: tomlkit
26
- Requires-Dist: djangorestframework<4.0
27
- Requires-Dist: attrs
23
+ Requires-Dist: Django
24
+ Requires-Dist: edx-drf-extensions
28
25
  Requires-Dist: celery
26
+ Requires-Dist: attrs
27
+ Requires-Dist: djangorestframework<4.0
28
+ Requires-Dist: rules<4.0
29
29
  Dynamic: author
30
30
  Dynamic: author-email
31
31
  Dynamic: classifier
@@ -2,4 +2,4 @@
2
2
  Open edX Learning ("Learning Core").
3
3
  """
4
4
 
5
- __version__ = "0.29.1"
5
+ __version__ = "0.30.0"
@@ -6,7 +6,7 @@ from __future__ import annotations
6
6
  import functools
7
7
 
8
8
  from django.contrib import admin
9
- from django.db.models import Count
9
+ from django.db.models import Count, F
10
10
  from django.utils.html import format_html
11
11
  from django.utils.safestring import SafeText
12
12
 
@@ -21,6 +21,7 @@ from .models import (
21
21
  EntityListRow,
22
22
  LearningPackage,
23
23
  PublishableEntity,
24
+ PublishableEntityVersion,
24
25
  PublishLog,
25
26
  PublishLogRecord,
26
27
  )
@@ -48,6 +49,7 @@ class PublishLogRecordTabularInline(admin.TabularInline):
48
49
  "title",
49
50
  "old_version_num",
50
51
  "new_version_num",
52
+ "dependencies_hash_digest",
51
53
  )
52
54
  readonly_fields = fields
53
55
 
@@ -89,28 +91,89 @@ class PublishLogAdmin(ReadOnlyModelAdmin):
89
91
  list_filter = ["learning_package"]
90
92
 
91
93
 
94
+ class PublishableEntityVersionTabularInline(admin.TabularInline):
95
+ """
96
+ Tabular inline for a single Draft change.
97
+ """
98
+ model = PublishableEntityVersion
99
+
100
+ fields = (
101
+ "version_num",
102
+ "title",
103
+ "created",
104
+ "created_by",
105
+ "dependencies_list",
106
+ )
107
+ readonly_fields = fields
108
+
109
+ def dependencies_list(self, version: PublishableEntityVersion):
110
+ identifiers = sorted(
111
+ [str(dep.key) for dep in version.dependencies.all()]
112
+ )
113
+ return "\n".join(identifiers)
114
+
115
+ def get_queryset(self, request):
116
+ queryset = super().get_queryset(request)
117
+ return (
118
+ queryset
119
+ .order_by('-version_num')
120
+ .select_related('created_by', 'entity')
121
+ .prefetch_related('dependencies')
122
+ )
123
+
124
+
125
+ class PublishStatusFilter(admin.SimpleListFilter):
126
+ """
127
+ Custom filter for entities that have unpublished changes.
128
+ """
129
+ title = "publish status"
130
+ parameter_name = "publish_status"
131
+
132
+ def lookups(self, request, model_admin):
133
+ return [
134
+ ("unpublished_changes", "Has unpublished changes"),
135
+ ]
136
+
137
+ def queryset(self, request, queryset):
138
+ if self.value() == "unpublished_changes":
139
+ return (
140
+ queryset
141
+ .exclude(
142
+ published__version__isnull=True,
143
+ draft__version__isnull=True,
144
+ )
145
+ .exclude(
146
+ published__version=F("draft__version"),
147
+ published__dependencies_hash_digest=F("draft__dependencies_hash_digest")
148
+ )
149
+ )
150
+ return queryset
151
+
152
+
92
153
  @admin.register(PublishableEntity)
93
154
  class PublishableEntityAdmin(ReadOnlyModelAdmin):
94
155
  """
95
156
  Read-only admin view for Publishable Entities
96
157
  """
158
+ inlines = [PublishableEntityVersionTabularInline]
159
+
97
160
  list_display = [
98
161
  "key",
99
- "draft_version",
100
162
  "published_version",
163
+ "draft_version",
101
164
  "uuid",
102
165
  "learning_package",
103
166
  "created",
104
167
  "created_by",
105
168
  "can_stand_alone",
106
169
  ]
107
- list_filter = ["learning_package"]
170
+ list_filter = ["learning_package", PublishStatusFilter]
108
171
  search_fields = ["key", "uuid"]
109
172
 
110
173
  fields = [
111
174
  "key",
112
- "draft_version",
113
175
  "published_version",
176
+ "draft_version",
114
177
  "uuid",
115
178
  "learning_package",
116
179
  "created",
@@ -120,8 +183,8 @@ class PublishableEntityAdmin(ReadOnlyModelAdmin):
120
183
  ]
121
184
  readonly_fields = [
122
185
  "key",
123
- "draft_version",
124
186
  "published_version",
187
+ "draft_version",
125
188
  "uuid",
126
189
  "learning_package",
127
190
  "created",
@@ -130,21 +193,55 @@ class PublishableEntityAdmin(ReadOnlyModelAdmin):
130
193
  "can_stand_alone",
131
194
  ]
132
195
 
133
- def draft_version(self, entity: PublishableEntity):
134
- return entity.draft.version.version_num if entity.draft.version else None
135
-
136
- def published_version(self, entity: PublishableEntity):
137
- return entity.published.version.version_num if entity.published and entity.published.version else None
138
-
139
196
  def get_queryset(self, request):
140
197
  queryset = super().get_queryset(request)
141
198
  return queryset.select_related(
142
- "learning_package", "published__version",
199
+ "learning_package", "published__version", "draft__version", "created_by"
143
200
  )
144
201
 
145
202
  def see_also(self, entity):
146
203
  return one_to_one_related_model_html(entity)
147
204
 
205
+ def draft_version(self, entity: PublishableEntity):
206
+ """
207
+ Version num + dependency hash if applicable, e.g. "5" or "5 (825064c2)"
208
+
209
+ If the version info is different from the published version, we
210
+ italicize the text for emphasis.
211
+ """
212
+ if hasattr(entity, "draft") and entity.draft.version:
213
+ draft_log_record = entity.draft.draft_log_record
214
+ if draft_log_record and draft_log_record.dependencies_hash_digest:
215
+ version_str = (
216
+ f"{entity.draft.version.version_num} "
217
+ f"({draft_log_record.dependencies_hash_digest})"
218
+ )
219
+ else:
220
+ version_str = str(entity.draft.version.version_num)
221
+
222
+ if version_str == self.published_version(entity):
223
+ return version_str
224
+ else:
225
+ return format_html("<em>{}</em>", version_str)
226
+
227
+ return None
228
+
229
+ def published_version(self, entity: PublishableEntity):
230
+ """
231
+ Version num + dependency hash if applicable, e.g. "5" or "5 (825064c2)"
232
+ """
233
+ if hasattr(entity, "published") and entity.published.version:
234
+ publish_log_record = entity.published.publish_log_record
235
+ if publish_log_record.dependencies_hash_digest:
236
+ return (
237
+ f"{entity.published.version.version_num} "
238
+ f"({publish_log_record.dependencies_hash_digest})"
239
+ )
240
+ else:
241
+ return str(entity.published.version.version_num)
242
+
243
+ return None
244
+
148
245
 
149
246
  @admin.register(Published)
150
247
  class PublishedAdmin(ReadOnlyModelAdmin):
@@ -197,6 +294,7 @@ class DraftChangeLogRecordTabularInline(admin.TabularInline):
197
294
  "title",
198
295
  "old_version_num",
199
296
  "new_version_num",
297
+ "dependencies_hash_digest",
200
298
  )
201
299
  readonly_fields = fields
202
300