Skip to content

Commit d98b85e

Browse files
committed
feat: XBlock.usage_key, XBlock.context_key convenience props
Add two new properties to `XBlock` objects: `.usage_key` and `.context_key``. These simply expose the values of `.scope_ids.usage_id`` and `.scope_ids.usage_id.context_key`, providing a convenient replacement to the deprecated, edx-platform-specific block properties `.location` and `.course_id`, respectively. Note: this adds opaque-keys as a dependency for some new unit tests. Normally I wouldn't add a dependency just for a couple tests, but we anticipate to make the repo depend on opaque-keys soon anyway: * #707 * #708 Bumps version from 1.9.1 to 1.10.0
1 parent e64d3a5 commit d98b85e

File tree

10 files changed

+161
-19
lines changed

10 files changed

+161
-19
lines changed

CHANGELOG.rst

+8
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ These are notable changes in XBlock.
77
Unreleased
88
----------
99

10+
1.10.0 - 2024-01-12
11+
-------------------
12+
13+
* Add two new properties to ``XBlock`` objects: ``.usage_key`` and ``.context_key``.
14+
These simply expose the values of ``.scope_ids.usage_id`` and ``.scope_ids.usage_id.context_key``,
15+
providing a convenient replacement to the deprecated, edx-platform-specific block properties ``.location``
16+
and ``.course_id``, respectively.
17+
1018
1.9.1 - 2023-12-22
1119
------------------
1220

requirements/base.in

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Core requirements for using this package
22
-c constraints.txt
33

4+
edx-opaque-keys
45
fs
56
lxml
67
mako

requirements/base.txt

+11-1
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,22 @@
66
#
77
appdirs==1.4.4
88
# via fs
9+
edx-opaque-keys==2.5.1
10+
# via -r requirements/base.in
911
fs==2.4.16
1012
# via -r requirements/base.in
1113
lxml==5.1.0
1214
# via -r requirements/base.in
13-
mako==1.3.0
15+
mako==1.3.1
1416
# via -r requirements/base.in
1517
markupsafe==2.1.4
1618
# via
1719
# -r requirements/base.in
1820
# mako
21+
pbr==6.0.0
22+
# via stevedore
23+
pymongo==3.13.0
24+
# via edx-opaque-keys
1925
python-dateutil==2.8.2
2026
# via -r requirements/base.in
2127
pytz==2023.3.post1
@@ -28,6 +34,10 @@ six==1.16.0
2834
# via
2935
# fs
3036
# python-dateutil
37+
stevedore==5.1.0
38+
# via edx-opaque-keys
39+
typing-extensions==4.9.0
40+
# via edx-opaque-keys
3141
web-fragments==2.1.0
3242
# via -r requirements/base.in
3343
webob==1.8.7

requirements/dev.txt

+12-4
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ attrs==23.2.0
2121
# via
2222
# -r requirements/test.txt
2323
# hypothesis
24-
boto3==1.34.23
24+
boto3==1.34.26
2525
# via
2626
# -r requirements/test.txt
2727
# fs-s3fs
28-
botocore==1.34.23
28+
botocore==1.34.26
2929
# via
3030
# -r requirements/test.txt
3131
# boto3
@@ -93,6 +93,8 @@ django==2.2.28
9393
# openedx-django-pyfs
9494
edx-lint==5.3.6
9595
# via -r requirements/test.txt
96+
edx-opaque-keys==2.5.1
97+
# via -r requirements/test.txt
9698
exceptiongroup==1.2.0
9799
# via
98100
# -r requirements/test.txt
@@ -113,7 +115,7 @@ fs-s3fs==1.1.1
113115
# via
114116
# -r requirements/test.txt
115117
# openedx-django-pyfs
116-
hypothesis==6.96.1
118+
hypothesis==6.96.4
117119
# via -r requirements/test.txt
118120
importlib-metadata==7.0.1
119121
# via
@@ -150,7 +152,7 @@ lazy==1.6
150152
# via -r requirements/test.txt
151153
lxml==5.1.0
152154
# via -r requirements/test.txt
153-
mako==1.3.0
155+
mako==1.3.1
154156
# via -r requirements/test.txt
155157
markupsafe==2.1.4
156158
# via
@@ -230,6 +232,10 @@ pylint-plugin-utils==0.8.2
230232
# -r requirements/test.txt
231233
# pylint-celery
232234
# pylint-django
235+
pymongo==3.13.0
236+
# via
237+
# -r requirements/test.txt
238+
# edx-opaque-keys
233239
pyproject-api==1.6.1
234240
# via
235241
# -r requirements/ci.txt
@@ -289,6 +295,7 @@ stevedore==5.1.0
289295
# via
290296
# -r requirements/test.txt
291297
# code-annotations
298+
# edx-opaque-keys
292299
text-unidecode==1.3
293300
# via
294301
# -r requirements/test.txt
@@ -319,6 +326,7 @@ typing-extensions==4.9.0
319326
# -r requirements/test.txt
320327
# annotated-types
321328
# astroid
329+
# edx-opaque-keys
322330
# inflect
323331
# pydantic
324332
# pydantic-core

requirements/django.txt

+21-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ appdirs==1.4.4
88
# via
99
# -r requirements/base.txt
1010
# fs
11-
boto3==1.34.23
11+
boto3==1.34.26
1212
# via fs-s3fs
13-
botocore==1.34.23
13+
botocore==1.34.26
1414
# via
1515
# boto3
1616
# s3transfer
@@ -19,6 +19,8 @@ django==2.2.28
1919
# -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt
2020
# -r requirements/django.in
2121
# openedx-django-pyfs
22+
edx-opaque-keys==2.5.1
23+
# via -r requirements/base.txt
2224
fs==2.4.16
2325
# via
2426
# -r requirements/base.txt
@@ -34,14 +36,22 @@ lazy==1.6
3436
# via -r requirements/django.in
3537
lxml==5.1.0
3638
# via -r requirements/base.txt
37-
mako==1.3.0
39+
mako==1.3.1
3840
# via -r requirements/base.txt
3941
markupsafe==2.1.4
4042
# via
4143
# -r requirements/base.txt
4244
# mako
4345
openedx-django-pyfs==3.4.1
4446
# via -r requirements/django.in
47+
pbr==6.0.0
48+
# via
49+
# -r requirements/base.txt
50+
# stevedore
51+
pymongo==3.13.0
52+
# via
53+
# -r requirements/base.txt
54+
# edx-opaque-keys
4555
python-dateutil==2.8.2
4656
# via
4757
# -r requirements/base.txt
@@ -64,6 +74,14 @@ six==1.16.0
6474
# python-dateutil
6575
sqlparse==0.4.4
6676
# via django
77+
stevedore==5.1.0
78+
# via
79+
# -r requirements/base.txt
80+
# edx-opaque-keys
81+
typing-extensions==4.9.0
82+
# via
83+
# -r requirements/base.txt
84+
# edx-opaque-keys
6785
urllib3==1.26.18
6886
# via botocore
6987
web-fragments==2.1.0

requirements/doc.txt

+21-4
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ babel==2.14.0
1818
# sphinx
1919
beautifulsoup4==4.12.3
2020
# via pydata-sphinx-theme
21-
boto3==1.34.23
21+
boto3==1.34.26
2222
# via
2323
# -r requirements/django.txt
2424
# fs-s3fs
25-
botocore==1.34.23
25+
botocore==1.34.26
2626
# via
2727
# -r requirements/django.txt
2828
# boto3
@@ -40,6 +40,8 @@ docutils==0.19
4040
# via
4141
# pydata-sphinx-theme
4242
# sphinx
43+
edx-opaque-keys==2.5.1
44+
# via -r requirements/django.txt
4345
fs==2.4.16
4446
# via
4547
# -r requirements/django.txt
@@ -66,7 +68,7 @@ lazy==1.6
6668
# via -r requirements/django.txt
6769
lxml==5.1.0
6870
# via -r requirements/django.txt
69-
mako==1.3.0
71+
mako==1.3.1
7072
# via -r requirements/django.txt
7173
markupsafe==2.1.4
7274
# via
@@ -81,13 +83,21 @@ packaging==23.2
8183
# via
8284
# pydata-sphinx-theme
8385
# sphinx
86+
pbr==6.0.0
87+
# via
88+
# -r requirements/django.txt
89+
# stevedore
8490
pydata-sphinx-theme==0.14.4
8591
# via sphinx-book-theme
8692
pygments==2.17.2
8793
# via
8894
# accessible-pygments
8995
# pydata-sphinx-theme
9096
# sphinx
97+
pymongo==3.13.0
98+
# via
99+
# -r requirements/django.txt
100+
# edx-opaque-keys
91101
python-dateutil==2.8.2
92102
# via
93103
# -r requirements/django.txt
@@ -140,8 +150,15 @@ sqlparse==0.4.4
140150
# via
141151
# -r requirements/django.txt
142152
# django
153+
stevedore==5.1.0
154+
# via
155+
# -r requirements/django.txt
156+
# edx-opaque-keys
143157
typing-extensions==4.9.0
144-
# via pydata-sphinx-theme
158+
# via
159+
# -r requirements/django.txt
160+
# edx-opaque-keys
161+
# pydata-sphinx-theme
145162
urllib3==1.26.18
146163
# via
147164
# -r requirements/django.txt

requirements/test.txt

+19-6
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ astroid==3.0.2
1717
# pylint-celery
1818
attrs==23.2.0
1919
# via hypothesis
20-
boto3==1.34.23
20+
boto3==1.34.26
2121
# via
2222
# -r requirements/django.txt
2323
# fs-s3fs
24-
botocore==1.34.23
24+
botocore==1.34.26
2525
# via
2626
# -r requirements/django.txt
2727
# boto3
@@ -61,6 +61,8 @@ distlib==0.3.8
6161
# openedx-django-pyfs
6262
edx-lint==5.3.6
6363
# via -r requirements/test.in
64+
edx-opaque-keys==2.5.1
65+
# via -r requirements/django.txt
6466
exceptiongroup==1.2.0
6567
# via
6668
# hypothesis
@@ -78,7 +80,7 @@ fs-s3fs==1.1.1
7880
# via
7981
# -r requirements/django.txt
8082
# openedx-django-pyfs
81-
hypothesis==6.96.1
83+
hypothesis==6.96.4
8284
# via -r requirements/test.in
8385
inflect==7.0.0
8486
# via jinja2-pluralize
@@ -102,7 +104,7 @@ lazy==1.6
102104
# via -r requirements/django.txt
103105
lxml==5.1.0
104106
# via -r requirements/django.txt
105-
mako==1.3.0
107+
mako==1.3.1
106108
# via -r requirements/django.txt
107109
markupsafe==2.1.4
108110
# via
@@ -123,7 +125,9 @@ packaging==23.2
123125
path==16.9.0
124126
# via -r requirements/test.in
125127
pbr==6.0.0
126-
# via stevedore
128+
# via
129+
# -r requirements/django.txt
130+
# stevedore
127131
platformdirs==4.1.0
128132
# via
129133
# pylint
@@ -157,6 +161,10 @@ pylint-plugin-utils==0.8.2
157161
# via
158162
# pylint-celery
159163
# pylint-django
164+
pymongo==3.13.0
165+
# via
166+
# -r requirements/django.txt
167+
# edx-opaque-keys
160168
pyproject-api==1.6.1
161169
# via tox
162170
pytest==7.4.4
@@ -202,7 +210,10 @@ sqlparse==0.4.4
202210
# -r requirements/django.txt
203211
# django
204212
stevedore==5.1.0
205-
# via code-annotations
213+
# via
214+
# -r requirements/django.txt
215+
# code-annotations
216+
# edx-opaque-keys
206217
text-unidecode==1.3
207218
# via python-slugify
208219
tomli==2.0.1
@@ -218,8 +229,10 @@ tox==4.12.1
218229
# via -r requirements/test.in
219230
typing-extensions==4.9.0
220231
# via
232+
# -r requirements/django.txt
221233
# annotated-types
222234
# astroid
235+
# edx-opaque-keys
223236
# inflect
224237
# pydantic
225238
# pydantic-core

xblock/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ def __init__(self, *args, **kwargs):
2727
# without causing a circular import
2828
xblock.fields.XBlockMixin = XBlockMixin
2929

30-
__version__ = '1.9.1'
30+
__version__ = '1.10.0'

xblock/core.py

+26
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,32 @@ def __init__(self, runtime, field_data=None, scope_ids=UNSET, *args, **kwargs):
205205
# Provide backwards compatibility for external access through _field_data
206206
super().__init__(runtime=runtime, scope_ids=scope_ids, field_data=field_data, *args, **kwargs)
207207

208+
@property
209+
def usage_key(self):
210+
"""
211+
A key identifying this particular usage of the XBlock, unique across all learning contexts in the system.
212+
213+
Equivalent to to `.scope_ids.usage_id`.
214+
"""
215+
return self.scope_ids.usage_id
216+
217+
@property
218+
def context_key(self):
219+
"""
220+
A key identifying the learning context (course, library, etc.) that contains this XBlock usage.
221+
222+
Equivalent to `.scope_ids.usage_id.context_key`.
223+
224+
Returns:
225+
* `LearningContextKey`, if `.scope_ids.usage_id` is a `UsageKey` instance.
226+
* `None`, otherwise.
227+
228+
After https://github.com/openedx/XBlock/issues/708 is complete, we can assume that
229+
`.scope_ids.usage_id` is always a `UsageKey`, and that this method will
230+
always return a `LearningContextKey`.
231+
"""
232+
return getattr(self.scope_ids.usage_id, "context_key", None)
233+
208234
def render(self, view, context=None):
209235
"""Render `view` with this block's runtime and the supplied `context`"""
210236
return self.runtime.render(self, view, context)

0 commit comments

Comments
 (0)