Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ Change Log

Unreleased
~~~~~~~~~~
[3.2.1] - 2026-02-20
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Add distinct query by block and user in get_overrides_for_course to prevent duplicate overrides when a user has multiple overrides for the same block.

[3.2.0] - 2026-01-12
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Extend ContentDate/UserDate models to support enhanced assignment metadata and future scheduling use cases.
Expand Down
2 changes: 1 addition & 1 deletion edx_when/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
Central source of course block dates for the LMS.
"""

__version__ = '3.2.0'
__version__ = '3.2.1'
11 changes: 8 additions & 3 deletions edx_when/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -376,13 +376,18 @@ def get_overrides_for_course(course_id):
content_date__course_id=course_id,
content_date__active=True,
).order_by('-modified')

dates = []
users = set()
seen = set()
for udate in query:
if udate.user_id in users:
key = (udate.user_id, udate.content_date_id)
if key in seen:
# We've already seen an override for this user and block combination, so skip it.
# We order by modified date descending, so we know we've already seen the latest
# override for this user and block.
continue
seen.add(key)

users.add(udate.user_id)
username = udate.user.username
try:
full_name = udate.user.profile.name
Expand Down
60 changes: 28 additions & 32 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@
#
appdirs==1.4.4
# via fs
asgiref==3.8.1
asgiref==3.11.1
# via django
certifi==2025.4.26
certifi==2026.2.25
# via requests
cffi==1.17.1
cffi==2.0.0
# via
# cryptography
# pynacl
charset-normalizer==3.4.2
charset-normalizer==3.4.4
# via requests
click==8.2.0
click==8.3.1
# via edx-django-utils
cryptography==45.0.2
cryptography==46.0.5
# via pyjwt
django==4.2.21
django==4.2.29
# via
# -c requirements/common_constraints.txt
# -r requirements/base.in
Expand All @@ -35,79 +35,75 @@ django-crum==0.7.9
# via edx-django-utils
django-model-utils==5.0.0
# via -r requirements/base.in
django-waffle==4.2.0
django-waffle==5.0.0
# via
# edx-django-utils
# edx-drf-extensions
djangorestframework==3.16.0
djangorestframework==3.16.1
# via
# drf-jwt
# edx-drf-extensions
dnspython==2.7.0
dnspython==2.8.0
# via pymongo
drf-jwt==1.19.2
# via edx-drf-extensions
edx-django-utils==7.4.0
edx-django-utils==8.0.1
# via
# -r requirements/base.in
# edx-drf-extensions
edx-drf-extensions==10.6.0
# via -r requirements/base.in
edx-opaque-keys==3.0.0
edx-opaque-keys==3.1.0
# via
# -r requirements/base.in
# edx-drf-extensions
fs==2.4.16
# via xblock
idna==3.10
idna==3.11
# via requests
lxml==5.4.0
lxml==6.0.2
# via xblock
mako==1.3.10
# via xblock
markupsafe==3.0.2
markupsafe==3.0.3
# via
# mako
# xblock
newrelic==10.12.0
psutil==7.2.2
# via edx-django-utils
pbr==6.1.1
# via stevedore
psutil==7.0.0
# via edx-django-utils
pycparser==2.22
pycparser==3.0
# via cffi
pyjwt[crypto]==2.10.1
pyjwt[crypto]==2.11.0
# via
# drf-jwt
# edx-drf-extensions
pymongo==4.13.0
pymongo==4.16.0
# via edx-opaque-keys
pynacl==1.5.0
pynacl==1.6.2
# via edx-django-utils
python-dateutil==2.9.0.post0
# via xblock
pytz==2025.2
pytz==2026.1.post1
# via xblock
pyyaml==6.0.2
pyyaml==6.0.3
# via xblock
requests==2.32.3
requests==2.32.5
# via edx-drf-extensions
semantic-version==2.10.0
# via edx-drf-extensions
simplejson==3.20.1
simplejson==3.20.2
# via xblock
six==1.17.0
# via
# fs
# python-dateutil
sqlparse==0.5.3
sqlparse==0.5.5
# via django
stevedore==5.4.1
stevedore==5.7.0
# via
# edx-django-utils
# edx-opaque-keys
typing-extensions==4.13.2
typing-extensions==4.15.0
# via edx-opaque-keys
urllib3==2.2.3
# via
Expand All @@ -117,7 +113,7 @@ web-fragments==3.1.0
# via xblock
webob==1.8.9
# via xblock
xblock==5.2.0
xblock==5.3.0
# via -r requirements/base.in

# The following packages are considered to be unsafe in a requirements file:
Expand Down
32 changes: 17 additions & 15 deletions requirements/ci.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,49 @@
#
# make upgrade
#
cachetools==5.5.2
cachetools==7.0.2
# via tox
certifi==2025.4.26
certifi==2026.2.25
# via requests
chardet==5.2.0
# via tox
charset-normalizer==3.4.2
charset-normalizer==3.4.4
# via requests
codecov==2.1.13
# via -r requirements/ci.in
colorama==0.4.6
# via tox
coverage==7.8.0
coverage==7.13.4
# via codecov
distlib==0.3.9
distlib==0.4.0
# via virtualenv
filelock==3.18.0
filelock==3.25.0
# via
# python-discovery
# tox
# virtualenv
idna==3.10
idna==3.11
# via requests
packaging==25.0
packaging==26.0
# via
# pyproject-api
# tox
platformdirs==4.3.8
platformdirs==4.9.2
# via
# python-discovery
# tox
# virtualenv
pluggy==1.6.0
# via tox
pyproject-api==1.9.1
pyproject-api==1.10.0
# via tox
requests==2.32.3
python-discovery==1.1.0
# via virtualenv
requests==2.32.5
# via codecov
tox==4.26.0
tox==4.47.3
# via -r requirements/ci.in
urllib3==2.2.3
# via
# -c requirements/common_constraints.txt
# requests
virtualenv==20.31.2
virtualenv==21.1.0
# via tox
6 changes: 5 additions & 1 deletion requirements/constraints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,8 @@
diff-cover==4.0.0

# Temporary pin.
backports-zoneinfo==0.2.1;python_version < "3.9"
backports-zoneinfo==0.2.1;python_version < "3.9"

# Cause: pbr depends on pkg_resources, which is no longer included in newer setuptools versions
# TODO: remove once pbr no longer depends on pkg_resources
setuptools<70.0.0
Loading