openedx-learning 0.1.0__tar.gz → 0.1.2__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 (81) hide show
  1. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/MANIFEST.in +1 -1
  2. {openedx-learning-0.1.0/openedx_learning.egg-info → openedx-learning-0.1.2}/PKG-INFO +1 -1
  3. openedx-learning-0.1.2/openedx_learning/__init__.py +1 -0
  4. {openedx-learning-0.1.0 → openedx-learning-0.1.2/openedx_learning.egg-info}/PKG-INFO +1 -1
  5. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning.egg-info/SOURCES.txt +17 -1
  6. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning.egg-info/requires.txt +3 -2
  7. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/core/tagging/api.py +45 -1
  8. openedx-learning-0.1.2/openedx_tagging/core/tagging/fixtures/language_taxonomy.yaml +1298 -0
  9. openedx-learning-0.1.2/openedx_tagging/core/tagging/management/commands/build_language_fixture.py +48 -0
  10. openedx-learning-0.1.2/openedx_tagging/core/tagging/migrations/0003_auto_20230721_1238.py +76 -0
  11. openedx-learning-0.1.2/openedx_tagging/core/tagging/migrations/0004_auto_20230723_2001.py +34 -0
  12. openedx-learning-0.1.2/openedx_tagging/core/tagging/migrations/0005_language_taxonomy.py +29 -0
  13. openedx-learning-0.1.2/openedx_tagging/core/tagging/migrations/0006_alter_objecttag_unique_together.py +16 -0
  14. openedx-learning-0.1.2/openedx_tagging/core/tagging/migrations/__init__.py +0 -0
  15. openedx-learning-0.1.2/openedx_tagging/core/tagging/models/__init__.py +11 -0
  16. openedx-learning-0.1.0/openedx_tagging/core/tagging/models.py → openedx-learning-0.1.2/openedx_tagging/core/tagging/models/base.py +112 -24
  17. openedx-learning-0.1.2/openedx_tagging/core/tagging/models/system_defined.py +269 -0
  18. openedx-learning-0.1.2/openedx_tagging/core/tagging/rest_api/urls.py +9 -0
  19. openedx-learning-0.1.2/openedx_tagging/core/tagging/rest_api/v1/__init__.py +0 -0
  20. openedx-learning-0.1.2/openedx_tagging/core/tagging/rest_api/v1/permissions.py +17 -0
  21. openedx-learning-0.1.2/openedx_tagging/core/tagging/rest_api/v1/serializers.py +31 -0
  22. openedx-learning-0.1.2/openedx_tagging/core/tagging/rest_api/v1/urls.py +14 -0
  23. openedx-learning-0.1.2/openedx_tagging/core/tagging/rest_api/v1/views.py +147 -0
  24. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/core/tagging/rules.py +14 -15
  25. openedx-learning-0.1.2/openedx_tagging/core/tagging/urls.py +10 -0
  26. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/requirements/base.in +1 -0
  27. openedx-learning-0.1.0/openedx_learning/__init__.py +0 -1
  28. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/CHANGELOG.rst +0 -0
  29. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/LICENSE.txt +0 -0
  30. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/README.rst +0 -0
  31. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/contrib/__init__.py +0 -0
  32. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/contrib/media_server/__init__.py +0 -0
  33. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/contrib/media_server/apps.py +0 -0
  34. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/contrib/media_server/urls.py +0 -0
  35. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/contrib/media_server/views.py +0 -0
  36. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/__init__.py +0 -0
  37. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/components/__init__.py +0 -0
  38. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/components/admin.py +0 -0
  39. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/components/api.py +0 -0
  40. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/components/apps.py +0 -0
  41. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/components/migrations/0001_initial.py +0 -0
  42. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/components/migrations/__init__.py +0 -0
  43. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/components/models.py +0 -0
  44. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/contents/__init__.py +0 -0
  45. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/contents/admin.py +0 -0
  46. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/contents/api.py +0 -0
  47. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/contents/apps.py +0 -0
  48. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/contents/migrations/0001_initial.py +0 -0
  49. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/contents/migrations/__init__.py +0 -0
  50. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/contents/models.py +0 -0
  51. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/__init__.py +0 -0
  52. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/admin.py +0 -0
  53. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/api.py +0 -0
  54. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/apps.py +0 -0
  55. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/migrations/0001_initial.py +0 -0
  56. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/migrations/__init__.py +0 -0
  57. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/model_mixins.py +0 -0
  58. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/core/publishing/models.py +0 -0
  59. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/lib/__init__.py +0 -0
  60. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/lib/admin_utils.py +0 -0
  61. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/lib/collations.py +0 -0
  62. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/lib/fields.py +0 -0
  63. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/lib/validators.py +0 -0
  64. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/rest_api/__init__.py +0 -0
  65. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/rest_api/apps.py +0 -0
  66. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/rest_api/urls.py +0 -0
  67. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/rest_api/v1/__init__.py +0 -0
  68. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/rest_api/v1/components.py +0 -0
  69. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning/rest_api/v1/urls.py +0 -0
  70. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning.egg-info/dependency_links.txt +0 -0
  71. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning.egg-info/not-zip-safe +0 -0
  72. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_learning.egg-info/top_level.txt +0 -0
  73. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/__init__.py +0 -0
  74. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/core/tagging/__init__.py +0 -0
  75. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/core/tagging/admin.py +0 -0
  76. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/core/tagging/apps.py +0 -0
  77. {openedx-learning-0.1.0/openedx_tagging/core/tagging/migrations → openedx-learning-0.1.2/openedx_tagging/core/tagging/management/commands}/__init__.py +0 -0
  78. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/core/tagging/migrations/0001_initial.py +0 -0
  79. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/openedx_tagging/core/tagging/migrations/0002_auto_20230718_2026.py +0 -0
  80. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/setup.cfg +0 -0
  81. {openedx-learning-0.1.0 → openedx-learning-0.1.2}/setup.py +0 -0
@@ -3,4 +3,4 @@ include LICENSE.txt
3
3
  include README.rst
4
4
  include requirements/base.in
5
5
  recursive-include openedx_learning *.html *.png *.gif *.js *.css *.jpg *.jpeg *.svg *.py
6
- recursive-include openedx_tagging *.html *.png *.gif *.js *.css *.jpg *.jpeg *.svg *.py
6
+ recursive-include openedx_tagging *.html *.png *.gif *.js *.css *.jpg *.jpeg *.svg *.py *.yaml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: openedx-learning
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: An experiment.
5
5
  Home-page: https://github.com/openedx/openedx-learning
6
6
  Author: David Ormsbee
@@ -0,0 +1 @@
1
+ __version__ = "0.1.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: openedx-learning
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: An experiment.
5
5
  Home-page: https://github.com/openedx/openedx-learning
6
6
  Author: David Ormsbee
@@ -55,9 +55,25 @@ openedx_tagging/core/tagging/__init__.py
55
55
  openedx_tagging/core/tagging/admin.py
56
56
  openedx_tagging/core/tagging/api.py
57
57
  openedx_tagging/core/tagging/apps.py
58
- openedx_tagging/core/tagging/models.py
59
58
  openedx_tagging/core/tagging/rules.py
59
+ openedx_tagging/core/tagging/urls.py
60
+ openedx_tagging/core/tagging/fixtures/language_taxonomy.yaml
61
+ openedx_tagging/core/tagging/management/commands/__init__.py
62
+ openedx_tagging/core/tagging/management/commands/build_language_fixture.py
60
63
  openedx_tagging/core/tagging/migrations/0001_initial.py
61
64
  openedx_tagging/core/tagging/migrations/0002_auto_20230718_2026.py
65
+ openedx_tagging/core/tagging/migrations/0003_auto_20230721_1238.py
66
+ openedx_tagging/core/tagging/migrations/0004_auto_20230723_2001.py
67
+ openedx_tagging/core/tagging/migrations/0005_language_taxonomy.py
68
+ openedx_tagging/core/tagging/migrations/0006_alter_objecttag_unique_together.py
62
69
  openedx_tagging/core/tagging/migrations/__init__.py
70
+ openedx_tagging/core/tagging/models/__init__.py
71
+ openedx_tagging/core/tagging/models/base.py
72
+ openedx_tagging/core/tagging/models/system_defined.py
73
+ openedx_tagging/core/tagging/rest_api/urls.py
74
+ openedx_tagging/core/tagging/rest_api/v1/__init__.py
75
+ openedx_tagging/core/tagging/rest_api/v1/permissions.py
76
+ openedx_tagging/core/tagging/rest_api/v1/serializers.py
77
+ openedx_tagging/core/tagging/rest_api/v1/urls.py
78
+ openedx_tagging/core/tagging/rest_api/v1/views.py
63
79
  requirements/base.in
@@ -1,3 +1,4 @@
1
- Django<5.0
2
- rules<4.0
3
1
  djangorestframework<4.0
2
+ edx-drf-extensions
3
+ rules<4.0
4
+ Django<5.0
@@ -106,8 +106,9 @@ def get_object_tags(
106
106
  Pass valid_only=False when displaying tags to content authors, so they can see invalid tags too.
107
107
  Invalid tags will (probably) be hidden from learners.
108
108
  """
109
+ ObjectTagClass = taxonomy.object_tag_class if taxonomy else ObjectTag
109
110
  tags = (
110
- ObjectTag.objects.filter(
111
+ ObjectTagClass.objects.filter(
111
112
  object_id=object_id,
112
113
  )
113
114
  .select_related("tag", "taxonomy")
@@ -136,3 +137,46 @@ def tag_object(
136
137
  Preserves existing (valid) tags, adds new (valid) tags, and removes omitted (or invalid) tags.
137
138
  """
138
139
  return taxonomy.cast().tag_object(tags, object_id)
140
+
141
+
142
+ def autocomplete_tags(
143
+ taxonomy: Taxonomy,
144
+ search: str,
145
+ object_id: str = None,
146
+ object_tags_only=True,
147
+ ) -> QuerySet:
148
+ """
149
+ Provides auto-complete suggestions by matching the `search` string against existing
150
+ ObjectTags linked to the given taxonomy. A case-insensitive search is used in order
151
+ to return the highest number of relevant tags.
152
+
153
+ If `object_id` is provided, then object tag values already linked to this object
154
+ are omitted from the returned suggestions. (ObjectTag values must be unique for a
155
+ given object + taxonomy, and so omitting these suggestions helps users avoid
156
+ duplication errors.).
157
+
158
+ Returns a QuerySet of dictionaries containing distinct `value` (string) and
159
+ `tag` (numeric ID) values, sorted alphabetically by `value`.
160
+ The `value` is what should be shown as a suggestion to users,
161
+ and if it's a free-text taxonomy, `tag` will be `None`: we include the `tag` ID
162
+ in anticipation of the second use case listed below.
163
+
164
+ Use cases:
165
+ * This method is useful for reducing tag variation in free-text taxonomies by showing
166
+ users tags that are similar to what they're typing. E.g., if the `search` string "dn"
167
+ shows that other objects have been tagged with "DNA", "DNA electrophoresis", and "DNA fingerprinting",
168
+ this encourages users to use those existing tags if relevant, instead of creating new ones that
169
+ look similar (e.g. "dna finger-printing").
170
+ * It could also be used to assist tagging for closed taxonomies with a list of possible tags which is too
171
+ large to return all at once, e.g. a user model taxonomy that dynamically creates tags on request for any
172
+ registered user in the database. (Note that this is not implemented yet, but may be as part of a future change.)
173
+ """
174
+ if not object_tags_only:
175
+ raise NotImplementedError(
176
+ _(
177
+ "Using this would return a query set of tags instead of object tags."
178
+ "For now we recommend fetching all of the taxonomy's tags "
179
+ "using get_tags() and filtering them on the frontend."
180
+ )
181
+ )
182
+ return taxonomy.cast().autocomplete_tags(search, object_id)