diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e34eced..8b65cdea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: - name: Run Tests run: docker exec -t analytics_api_testing bash -c "cd /edx/app/analytics_api/analytics_api/ - && export TOXENV=django42 && make test.requirements tox.requirements ${{ matrix.targets }}" + && export TOXENV=django52 && make test.requirements tox.requirements ${{ matrix.targets }}" - name: Run Coverage if: matrix.python-version == '3.11' && matrix.targets=='main.test' diff --git a/analytics_data_api/v0/models.py b/analytics_data_api/v0/models.py index f7d65010..8eb64739 100644 --- a/analytics_data_api/v0/models.py +++ b/analytics_data_api/v0/models.py @@ -20,7 +20,9 @@ class CourseActivityWeekly(BaseCourseModel): class Meta(BaseCourseModel.Meta): db_table = 'course_activity' - index_together = [['course_id', 'activity_type']] + indexes = [ + models.Index(fields=['course_id', 'activity_type']), + ] get_latest_by = 'interval_end' interval_start = models.DateTimeField() @@ -41,7 +43,9 @@ class BaseCourseEnrollment(BaseCourseModel): class Meta(BaseCourseModel.Meta): abstract = True get_latest_by = 'date' - index_together = [('course_id', 'date',)] + indexes = [ + models.Index(fields=['course_id', 'date']), + ] class CourseEnrollmentDaily(BaseCourseEnrollment): diff --git a/analyticsdataserver/settings/base.py b/analyticsdataserver/settings/base.py index 947d7d29..83dcd0bf 100644 --- a/analyticsdataserver/settings/base.py +++ b/analyticsdataserver/settings/base.py @@ -373,11 +373,21 @@ ] # settings for report downloads -DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' +STORAGES = { + 'default': { + 'BACKEND': 'storages.backends.s3boto3.S3Boto3Storage', + }, + 'staticfiles': { + 'BACKEND': 'django.contrib.staticfiles.storage.StaticFilesStorage', + }, +} + MEDIA_ROOT = normpath(join(SITE_ROOT, 'static', 'reports')) MEDIA_URL = 'http://localhost:8100/static/reports/' COURSE_REPORT_FILE_LOCATION_TEMPLATE = '{course_id}_{report_name}.csv' ENABLED_REPORT_IDENTIFIERS = ('problem_response',) +# For backwards compatibility of Report Download backend +DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' REPORT_DOWNLOAD_BACKEND = { DEFAULT_FILE_STORAGE: 'django.core.files.storage.FileSystemStorage', MEDIA_ROOT: MEDIA_ROOT, diff --git a/analyticsdataserver/settings/test.py b/analyticsdataserver/settings/test.py index 69f2fa83..c8a899c9 100644 --- a/analyticsdataserver/settings/test.py +++ b/analyticsdataserver/settings/test.py @@ -40,8 +40,6 @@ LMS_USER_ACCOUNT_BASE_URL = 'http://lms-host' -# Default the django-storage settings so we can test easily -DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' AWS_ACCESS_KEY_ID = 'xxxxx' AWS_SECRET_ACCESS_KEY = 'xxxxx' AWS_STORAGE_BUCKET_NAME = 'fake-bucket' diff --git a/requirements/base.txt b/requirements/base.txt index d7bb82a7..931cc8f0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -11,9 +11,9 @@ asgiref==3.8.1 # django-countries boto==2.49.0 # via -r requirements/base.in -boto3==1.38.19 +boto3==1.38.23 # via -r requirements/base.in -botocore==1.38.19 +botocore==1.38.23 # via # boto3 # s3transfer @@ -25,17 +25,17 @@ cffi==1.17.1 # pynacl charset-normalizer==3.4.2 # via requests -click==8.2.0 +click==8.2.1 # via edx-django-utils coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -cryptography==45.0.2 +cryptography==45.0.3 # via # django-fernet-fields-v2 # pyjwt -django==4.2.21 +django==5.2.1 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -105,7 +105,7 @@ edx-ccx-keys==2.0.2 # via -r requirements/base.in edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.0 # via # -r requirements/base.in # edx-drf-extensions @@ -154,8 +154,6 @@ markupsafe==3.0.2 # via jinja2 mysql-connector-python==9.3.0 # via edx-enterprise-data -newrelic==10.12.0 - # via edx-django-utils numpy==2.2.6 # via # edx-enterprise-data @@ -205,7 +203,7 @@ requests==2.32.3 # edx-rest-api-client rules==3.5 # via edx-enterprise-data -s3transfer==0.12.0 +s3transfer==0.13.0 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions diff --git a/requirements/constraints.txt b/requirements/constraints.txt index b5de5a1d..f515bad2 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -9,7 +9,7 @@ # linking to it here is good. # TODO: Many pinned dependencies should be unpinned and/or moved to this constraints file. -django<4.3 +django<5.3 # django-storages version 1.9 drops support for boto storage backend. # pinning before django upgrade, will unpin after that @@ -30,10 +30,6 @@ path<16.15.0 # dnspython 2.7.0 Requires-Python >=3.9 dnspython<2.7.0 -# backports-zoneinfo comes by-default in newer versions of python -# it gives error while building wheel with python>=3.9 -backports.zoneinfo ; python_version < "3.9" - # Cause: https://github.com/openedx/edx-lint/issues/458 # This can be unpinned once https://github.com/openedx/edx-lint/issues/459 has been resolved. pip<24.3 diff --git a/requirements/dev.txt b/requirements/dev.txt index 1b6e927f..9e95ef73 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -11,9 +11,9 @@ asgiref==3.8.1 # django-countries boto==2.49.0 # via -r requirements/base.in -boto3==1.38.19 +boto3==1.38.23 # via -r requirements/base.in -botocore==1.38.19 +botocore==1.38.23 # via # boto3 # s3transfer @@ -25,17 +25,17 @@ cffi==1.17.1 # pynacl charset-normalizer==3.4.2 # via requests -click==8.2.0 +click==8.2.1 # via edx-django-utils coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -cryptography==45.0.2 +cryptography==45.0.3 # via # django-fernet-fields-v2 # pyjwt -django==4.2.21 +django==5.2.1 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -105,7 +105,7 @@ edx-ccx-keys==2.0.2 # via -r requirements/base.in edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.0 # via # -r requirements/base.in # edx-drf-extensions @@ -156,8 +156,6 @@ mysql-connector-python==9.3.0 # via edx-enterprise-data mysqlclient==2.2.7 # via -r requirements/dev.in -newrelic==10.12.0 - # via edx-django-utils numpy==2.2.6 # via # edx-enterprise-data @@ -207,7 +205,7 @@ requests==2.32.3 # edx-rest-api-client rules==3.5 # via edx-enterprise-data -s3transfer==0.12.0 +s3transfer==0.13.0 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions diff --git a/requirements/django.txt b/requirements/django.txt index c75aef8b..22cd6490 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==4.2.21 +django==5.2.1 diff --git a/requirements/doc.txt b/requirements/doc.txt index a937a8b1..eb249c20 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -21,9 +21,9 @@ beautifulsoup4==4.13.4 # via pydata-sphinx-theme boto==2.49.0 # via -r requirements/base.in -boto3==1.38.19 +boto3==1.38.23 # via -r requirements/base.in -botocore==1.38.19 +botocore==1.38.23 # via # boto3 # s3transfer @@ -35,17 +35,17 @@ cffi==1.17.1 # pynacl charset-normalizer==3.4.2 # via requests -click==8.2.0 +click==8.2.1 # via edx-django-utils coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -cryptography==45.0.2 +cryptography==45.0.3 # via # django-fernet-fields-v2 # pyjwt -django==4.2.21 +django==5.2.1 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -119,7 +119,7 @@ edx-ccx-keys==2.0.2 # via -r requirements/base.in edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.0 # via # -r requirements/base.in # edx-drf-extensions @@ -172,8 +172,6 @@ markupsafe==3.0.2 # via jinja2 mysql-connector-python==9.3.0 # via edx-enterprise-data -newrelic==10.12.0 - # via edx-django-utils numpy==2.2.6 # via # edx-enterprise-data @@ -240,7 +238,7 @@ roman-numerals-py==3.1.0 # via sphinx rules==3.5 # via edx-enterprise-data -s3transfer==0.12.0 +s3transfer==0.13.0 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions diff --git a/requirements/pip.txt b/requirements/pip.txt index 9cf6fe97..df3385f4 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -10,7 +10,7 @@ wheel==0.45.1 # The following packages are considered to be unsafe in a requirements file: pip==24.2 # via - # -c /home/runner/work/edx-analytics-data-api/edx-analytics-data-api/requirements/constraints.txt + # -c requirements/constraints.txt # -r requirements/pip.in -setuptools==80.7.1 +setuptools==80.8.0 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index c2cb1046..514c7638 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -6,7 +6,7 @@ # build==1.2.2.post1 # via pip-tools -click==8.2.0 +click==8.2.1 # via pip-tools packaging==25.0 # via build diff --git a/requirements/production.txt b/requirements/production.txt index 3bb04609..a99f7c19 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -11,9 +11,9 @@ asgiref==3.8.1 # django-countries boto==2.49.0 # via -r requirements/base.in -boto3==1.38.19 +boto3==1.38.23 # via -r requirements/base.in -botocore==1.38.19 +botocore==1.38.23 # via # boto3 # s3transfer @@ -25,17 +25,17 @@ cffi==1.17.1 # pynacl charset-normalizer==3.4.2 # via requests -click==8.2.0 +click==8.2.1 # via edx-django-utils coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -cryptography==45.0.2 +cryptography==45.0.3 # via # django-fernet-fields-v2 # pyjwt -django==4.2.21 +django==5.2.1 # via # -c requirements/constraints.txt # -r requirements/base.in @@ -105,7 +105,7 @@ edx-ccx-keys==2.0.2 # via -r requirements/base.in edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.0 # via # -r requirements/base.in # edx-drf-extensions @@ -163,9 +163,7 @@ mysql-connector-python==9.3.0 mysqlclient==2.2.7 # via -r requirements/production.in newrelic==10.12.0 - # via - # -r requirements/production.in - # edx-django-utils + # via -r requirements/production.in numpy==2.2.6 # via # edx-enterprise-data @@ -220,7 +218,7 @@ requests==2.32.3 # edx-rest-api-client rules==3.5 # via edx-enterprise-data -s3transfer==0.12.0 +s3transfer==0.13.0 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions diff --git a/requirements/test.txt b/requirements/test.txt index 440da03e..c68ecb6b 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -13,9 +13,9 @@ astroid==3.3.10 # via pylint boto==2.49.0 # via -r requirements/base.in -boto3==1.38.19 +boto3==1.38.23 # via -r requirements/base.in -botocore==1.38.19 +botocore==1.38.23 # via # boto3 # s3transfer @@ -29,23 +29,23 @@ chardet==5.2.0 # via diff-cover charset-normalizer==3.4.2 # via requests -click==8.2.0 +click==8.2.1 # via edx-django-utils coreapi==2.3.3 # via -r requirements/base.in coreschema==0.0.4 # via coreapi -coverage[toml]==7.8.0 +coverage[toml]==7.8.2 # via # -r requirements/test.in # pytest-cov -cryptography==45.0.2 +cryptography==45.0.3 # via # django-fernet-fields-v2 # pyjwt ddt==1.7.2 # via -r requirements/test.in -diff-cover==9.2.4 +diff-cover==9.3.1 # via -r requirements/test.in dill==0.4.0 # via pylint @@ -120,7 +120,7 @@ edx-ccx-keys==2.0.2 # via -r requirements/base.in edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==7.4.0 +edx-django-utils==8.0.0 # via # -r requirements/base.in # edx-drf-extensions @@ -149,7 +149,7 @@ factory-boy==3.3.3 # via edx-enterprise-data faker==37.3.0 # via factory-boy -freezegun==1.5.1 +freezegun==1.5.2 # via -r requirements/test.in html5lib==1.1 # via -r requirements/base.in @@ -179,8 +179,6 @@ mccabe==0.7.0 # via pylint mysql-connector-python==9.3.0 # via edx-enterprise-data -newrelic==10.12.0 - # via edx-django-utils numpy==2.2.6 # via # edx-enterprise-data @@ -260,7 +258,7 @@ responses==0.25.7 # via -r requirements/test.in rules==3.5 # via edx-enterprise-data -s3transfer==0.12.0 +s3transfer==0.13.0 # via boto3 semantic-version==2.10.0 # via edx-drf-extensions diff --git a/requirements/tox.txt b/requirements/tox.txt index bd424292..45fc2ee7 100644 --- a/requirements/tox.txt +++ b/requirements/tox.txt @@ -4,7 +4,7 @@ # # make upgrade # -cachetools==5.5.2 +cachetools==6.0.0 # via tox chardet==5.2.0 # via tox diff --git a/tox.ini b/tox.ini index 7296da4e..9f14945e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] skipsdist = True -envlist = py311-django{42} +envlist = py311-django{52} [testenv] passenv = @@ -11,7 +11,7 @@ setenv = NODE_BIN = ./node_modules/.bin PATH = $PATH:$NODE_BIN deps = - django42: Django>=4.2,<4.3 + django52: Django>=5.2,<5.3 -r requirements/test.txt commands = {posargs:pytest}