diff --git a/openedx_tagging/core/tagging/rest_api/v1/views.py b/openedx_tagging/core/tagging/rest_api/v1/views.py index 37c3b9689..a86e3c278 100644 --- a/openedx_tagging/core/tagging/rest_api/v1/views.py +++ b/openedx_tagging/core/tagging/rest_api/v1/views.py @@ -9,8 +9,8 @@ get_taxonomy, get_taxonomies, ) -from .serializers import TaxonomyListQueryParamsSerializer, TaxonomySerializer from .permissions import TaxonomyObjectPermissions +from .serializers import TaxonomyListQueryParamsSerializer, TaxonomySerializer class TaxonomyView(ModelViewSet): @@ -19,6 +19,8 @@ class TaxonomyView(ModelViewSet): **List Query Parameters** * enabled (optional) - Filter by enabled status. Valid values: true, false, 1, 0, "true", "false", "1" + * page (optional) - Page number (default: 1) + * page_size (optional) - Number of items per page (default: 10) **List Example Requests** GET api/tagging/v1/taxonomy - Get all taxonomies @@ -59,7 +61,6 @@ class TaxonomyView(ModelViewSet): "allow_free_text": True, } - **Create Query Returns** * 201 - Success * 403 - Permission denied diff --git a/projects/dev.py b/projects/dev.py index c65e2c34f..9735b35de 100644 --- a/projects/dev.py +++ b/projects/dev.py @@ -113,3 +113,10 @@ INTERNAL_IPS = [ "127.0.0.1", ] + +######################### Django Rest Framework ######################## + +REST_FRAMEWORK = { + 'DEFAULT_PAGINATION_CLASS': 'edx_rest_framework_extensions.paginators.DefaultPagination', + 'PAGE_SIZE': 10, +} diff --git a/requirements/base.in b/requirements/base.in index d17e06397..94723505f 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -4,5 +4,6 @@ Django<5.0 # Web application framework djangorestframework<4.0 # REST API +edx-drf-extensions # Extensions to the Django REST Framework used by Open edX rules<4.0 # Django extension for rules-based authorization checks diff --git a/requirements/base.txt b/requirements/base.txt index 8c0f00b63..dc2d4c77f 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -6,20 +6,88 @@ # asgiref==3.7.2 # via django +certifi==2023.7.22 + # via requests +cffi==1.15.1 + # via + # cryptography + # pynacl +charset-normalizer==3.2.0 + # via requests +click==8.1.6 + # via edx-django-utils +cryptography==41.0.3 + # via pyjwt django==3.2.19 # via # -c requirements/constraints.txt # -r requirements/base.in + # django-crum + # django-waffle # djangorestframework + # drf-jwt + # edx-django-utils + # edx-drf-extensions +django-crum==0.7.9 + # via edx-django-utils +django-waffle==4.0.0 + # via + # edx-django-utils + # edx-drf-extensions djangorestframework==3.14.0 + # via + # -r requirements/base.in + # drf-jwt + # edx-drf-extensions +drf-jwt==1.19.2 + # via edx-drf-extensions +edx-django-utils==5.7.0 + # via edx-drf-extensions +edx-drf-extensions==8.8.0 # via -r requirements/base.in +edx-opaque-keys==2.4.0 + # via edx-drf-extensions +idna==3.4 + # via requests +newrelic==8.9.0 + # via edx-django-utils +pbr==5.11.1 + # via stevedore +psutil==5.9.5 + # via edx-django-utils +pycparser==2.21 + # via cffi +pyjwt[crypto]==2.8.0 + # via + # drf-jwt + # edx-drf-extensions +pymongo==3.13.0 + # via edx-opaque-keys +pynacl==1.5.0 + # via edx-django-utils +python-dateutil==2.8.2 + # via edx-drf-extensions pytz==2023.3 # via # django # djangorestframework +requests==2.31.0 + # via edx-drf-extensions rules==3.3 # via -r requirements/base.in +semantic-version==2.10.0 + # via edx-drf-extensions +six==1.16.0 + # via + # edx-drf-extensions + # python-dateutil sqlparse==0.4.4 # via django +stevedore==5.1.0 + # via + # edx-django-utils + # edx-opaque-keys typing-extensions==4.6.3 # via asgiref +urllib3==2.0.4 + # via requests diff --git a/requirements/ci.txt b/requirements/ci.txt index 6e1dd7f92..c03598b3e 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -4,7 +4,7 @@ # # make upgrade # -click==8.1.3 +click==8.1.6 # via import-linter distlib==0.3.6 # via virtualenv diff --git a/requirements/dev.txt b/requirements/dev.txt index 48cf4fb40..7c85fde2e 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -21,7 +21,7 @@ build==0.10.0 # via # -r requirements/pip-tools.txt # pip-tools -certifi==2023.5.7 +certifi==2023.7.22 # via # -r requirements/quality.txt # requests @@ -29,19 +29,21 @@ cffi==1.15.1 # via # -r requirements/quality.txt # cryptography + # pynacl chardet==5.1.0 # via diff-cover -charset-normalizer==3.1.0 +charset-normalizer==3.2.0 # via # -r requirements/quality.txt # requests -click==8.1.3 +click==8.1.6 # via # -r requirements/ci.txt # -r requirements/pip-tools.txt # -r requirements/quality.txt # click-log # code-annotations + # edx-django-utils # edx-lint # import-linter # pip-tools @@ -57,9 +59,10 @@ coverage[toml]==7.2.7 # via # -r requirements/quality.txt # pytest-cov -cryptography==41.0.1 +cryptography==41.0.3 # via # -r requirements/quality.txt + # pyjwt # secretstorage ddt==1.6.0 # via -r requirements/quality.txt @@ -77,23 +80,54 @@ django==3.2.19 # via # -c requirements/constraints.txt # -r requirements/quality.txt + # django-crum # django-debug-toolbar + # django-waffle # djangorestframework + # drf-jwt + # edx-django-utils + # edx-drf-extensions # edx-i18n-tools +django-crum==0.7.9 + # via + # -r requirements/quality.txt + # edx-django-utils django-debug-toolbar==4.1.0 # via # -r requirements/dev.in # -r requirements/quality.txt +django-waffle==4.0.0 + # via + # -r requirements/quality.txt + # edx-django-utils + # edx-drf-extensions djangorestframework==3.14.0 - # via -r requirements/quality.txt + # via + # -r requirements/quality.txt + # drf-jwt + # edx-drf-extensions docutils==0.20.1 # via # -r requirements/quality.txt # readme-renderer +drf-jwt==1.19.2 + # via + # -r requirements/quality.txt + # edx-drf-extensions +edx-django-utils==5.7.0 + # via + # -r requirements/quality.txt + # edx-drf-extensions +edx-drf-extensions==8.8.0 + # via -r requirements/quality.txt edx-i18n-tools==0.9.2 # via -r requirements/dev.in edx-lint==5.3.4 # via -r requirements/quality.txt +edx-opaque-keys==2.4.0 + # via + # -r requirements/quality.txt + # edx-drf-extensions exceptiongroup==1.1.1 # via # -r requirements/quality.txt @@ -179,6 +213,10 @@ more-itertools==9.1.0 # jaraco-classes mysqlclient==2.1.1 # via -r requirements/quality.txt +newrelic==8.9.0 + # via + # -r requirements/quality.txt + # edx-django-utils packaging==23.1 # via # -r requirements/ci.txt @@ -214,6 +252,10 @@ pluggy==1.0.0 # tox polib==1.2.0 # via edx-i18n-tools +psutil==5.9.5 + # via + # -r requirements/quality.txt + # edx-django-utils py==1.11.0 # via # -r requirements/ci.txt @@ -232,6 +274,11 @@ pygments==2.15.1 # diff-cover # readme-renderer # rich +pyjwt[crypto]==2.8.0 + # via + # -r requirements/quality.txt + # drf-jwt + # edx-drf-extensions pylint==2.17.4 # via # -r requirements/quality.txt @@ -252,6 +299,14 @@ pylint-plugin-utils==0.8.2 # -r requirements/quality.txt # pylint-celery # pylint-django +pymongo==3.13.0 + # via + # -r requirements/quality.txt + # edx-opaque-keys +pynacl==1.5.0 + # via + # -r requirements/quality.txt + # edx-django-utils pyproject-hooks==1.0.0 # via # -r requirements/pip-tools.txt @@ -265,6 +320,10 @@ pytest-cov==4.1.0 # via -r requirements/quality.txt pytest-django==4.5.2 # via -r requirements/quality.txt +python-dateutil==2.8.2 + # via + # -r requirements/quality.txt + # edx-drf-extensions python-slugify==8.0.1 # via # -r requirements/quality.txt @@ -286,6 +345,7 @@ readme-renderer==40.0 requests==2.31.0 # via # -r requirements/quality.txt + # edx-drf-extensions # requests-toolbelt # twine requests-toolbelt==1.0.0 @@ -306,12 +366,18 @@ secretstorage==3.3.3 # via # -r requirements/quality.txt # keyring +semantic-version==2.10.0 + # via + # -r requirements/quality.txt + # edx-drf-extensions six==1.16.0 # via # -r requirements/ci.txt # -r requirements/quality.txt # bleach + # edx-drf-extensions # edx-lint + # python-dateutil # tox snowballstemmer==2.2.0 # via @@ -326,6 +392,8 @@ stevedore==5.1.0 # via # -r requirements/quality.txt # code-annotations + # edx-django-utils + # edx-opaque-keys text-unidecode==1.3 # via # -r requirements/quality.txt @@ -365,7 +433,7 @@ typing-extensions==4.6.3 # import-linter # pylint # rich -urllib3==2.0.3 +urllib3==2.0.4 # via # -r requirements/quality.txt # requests diff --git a/requirements/doc.txt b/requirements/doc.txt index f63eb9113..f997b86a7 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -20,14 +20,24 @@ beautifulsoup4==4.12.2 # via pydata-sphinx-theme bleach==6.0.0 # via readme-renderer -certifi==2023.5.7 - # via requests -charset-normalizer==3.1.0 - # via requests -click==8.1.3 +certifi==2023.7.22 + # via + # -r requirements/test.txt + # requests +cffi==1.15.1 + # via + # -r requirements/test.txt + # cryptography + # pynacl +charset-normalizer==3.2.0 + # via + # -r requirements/test.txt + # requests +click==8.1.6 # via # -r requirements/test.txt # code-annotations + # edx-django-utils # import-linter code-annotations==1.3.0 # via -r requirements/test.txt @@ -35,19 +45,40 @@ coverage[toml]==7.2.7 # via # -r requirements/test.txt # pytest-cov +cryptography==41.0.3 + # via + # -r requirements/test.txt + # pyjwt ddt==1.6.0 # via -r requirements/test.txt django==3.2.19 # via # -c requirements/constraints.txt # -r requirements/test.txt + # django-crum # django-debug-toolbar + # django-waffle # djangorestframework + # drf-jwt + # edx-django-utils + # edx-drf-extensions # sphinxcontrib-django +django-crum==0.7.9 + # via + # -r requirements/test.txt + # edx-django-utils django-debug-toolbar==4.1.0 # via -r requirements/test.txt +django-waffle==4.0.0 + # via + # -r requirements/test.txt + # edx-django-utils + # edx-drf-extensions djangorestframework==3.14.0 - # via -r requirements/test.txt + # via + # -r requirements/test.txt + # drf-jwt + # edx-drf-extensions doc8==1.1.1 # via -r requirements/doc.in docutils==0.19 @@ -57,6 +88,20 @@ docutils==0.19 # readme-renderer # restructuredtext-lint # sphinx +drf-jwt==1.19.2 + # via + # -r requirements/test.txt + # edx-drf-extensions +edx-django-utils==5.7.0 + # via + # -r requirements/test.txt + # edx-drf-extensions +edx-drf-extensions==8.8.0 + # via -r requirements/test.txt +edx-opaque-keys==2.4.0 + # via + # -r requirements/test.txt + # edx-drf-extensions exceptiongroup==1.1.1 # via # -r requirements/test.txt @@ -66,7 +111,9 @@ grimp==2.4 # -r requirements/test.txt # import-linter idna==3.4 - # via requests + # via + # -r requirements/test.txt + # requests imagesize==1.4.1 # via sphinx import-linter==1.9.0 @@ -90,6 +137,10 @@ mock==5.0.2 # via -r requirements/test.txt mysqlclient==2.1.1 # via -r requirements/test.txt +newrelic==8.9.0 + # via + # -r requirements/test.txt + # edx-django-utils packaging==23.1 # via # -r requirements/test.txt @@ -106,6 +157,14 @@ pluggy==1.0.0 # pytest pprintpp==0.4.0 # via sphinxcontrib-django +psutil==5.9.5 + # via + # -r requirements/test.txt + # edx-django-utils +pycparser==2.21 + # via + # -r requirements/test.txt + # cffi pydata-sphinx-theme==0.13.3 # via sphinx-book-theme pygments==2.15.1 @@ -115,6 +174,19 @@ pygments==2.15.1 # pydata-sphinx-theme # readme-renderer # sphinx +pyjwt[crypto]==2.8.0 + # via + # -r requirements/test.txt + # drf-jwt + # edx-drf-extensions +pymongo==3.13.0 + # via + # -r requirements/test.txt + # edx-opaque-keys +pynacl==1.5.0 + # via + # -r requirements/test.txt + # edx-django-utils pytest==7.3.2 # via # -r requirements/test.txt @@ -124,6 +196,10 @@ pytest-cov==4.1.0 # via -r requirements/test.txt pytest-django==4.5.2 # via -r requirements/test.txt +python-dateutil==2.8.2 + # via + # -r requirements/test.txt + # edx-drf-extensions python-slugify==8.0.1 # via # -r requirements/test.txt @@ -141,13 +217,24 @@ pyyaml==6.0 readme-renderer==40.0 # via -r requirements/doc.in requests==2.31.0 - # via sphinx + # via + # -r requirements/test.txt + # edx-drf-extensions + # sphinx restructuredtext-lint==1.4.0 # via doc8 rules==3.3 # via -r requirements/test.txt +semantic-version==2.10.0 + # via + # -r requirements/test.txt + # edx-drf-extensions six==1.16.0 - # via bleach + # via + # -r requirements/test.txt + # bleach + # edx-drf-extensions + # python-dateutil snowballstemmer==2.2.0 # via sphinx soupsieve==2.4.1 @@ -184,6 +271,8 @@ stevedore==5.1.0 # -r requirements/test.txt # code-annotations # doc8 + # edx-django-utils + # edx-opaque-keys text-unidecode==1.3 # via # -r requirements/test.txt @@ -202,8 +291,10 @@ typing-extensions==4.6.3 # grimp # import-linter # pydata-sphinx-theme -urllib3==2.0.3 - # via requests +urllib3==2.0.4 + # via + # -r requirements/test.txt + # requests webencodings==0.5.1 # via bleach zipp==3.15.0 diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index fd0cc1c78..4b7fb4e53 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -6,7 +6,7 @@ # build==0.10.0 # via pip-tools -click==8.1.3 +click==8.1.6 # via pip-tools packaging==23.1 # via build diff --git a/requirements/quality.txt b/requirements/quality.txt index 425cfa514..0509905b3 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -14,17 +14,25 @@ astroid==2.15.5 # pylint-celery bleach==6.0.0 # via readme-renderer -certifi==2023.5.7 - # via requests +certifi==2023.7.22 + # via + # -r requirements/test.txt + # requests cffi==1.15.1 - # via cryptography -charset-normalizer==3.1.0 - # via requests -click==8.1.3 + # via + # -r requirements/test.txt + # cryptography + # pynacl +charset-normalizer==3.2.0 + # via + # -r requirements/test.txt + # requests +click==8.1.6 # via # -r requirements/test.txt # click-log # code-annotations + # edx-django-utils # edx-lint # import-linter click-log==0.4.0 @@ -37,8 +45,11 @@ coverage[toml]==7.2.7 # via # -r requirements/test.txt # pytest-cov -cryptography==41.0.1 - # via secretstorage +cryptography==41.0.3 + # via + # -r requirements/test.txt + # pyjwt + # secretstorage ddt==1.6.0 # via -r requirements/test.txt dill==0.3.6 @@ -47,16 +58,47 @@ django==3.2.19 # via # -c requirements/constraints.txt # -r requirements/test.txt + # django-crum # django-debug-toolbar + # django-waffle # djangorestframework + # drf-jwt + # edx-django-utils + # edx-drf-extensions +django-crum==0.7.9 + # via + # -r requirements/test.txt + # edx-django-utils django-debug-toolbar==4.1.0 # via -r requirements/test.txt +django-waffle==4.0.0 + # via + # -r requirements/test.txt + # edx-django-utils + # edx-drf-extensions djangorestframework==3.14.0 - # via -r requirements/test.txt + # via + # -r requirements/test.txt + # drf-jwt + # edx-drf-extensions docutils==0.20.1 # via readme-renderer +drf-jwt==1.19.2 + # via + # -r requirements/test.txt + # edx-drf-extensions +edx-django-utils==5.7.0 + # via + # -r requirements/test.txt + # edx-drf-extensions +edx-drf-extensions==8.8.0 + # via -r requirements/test.txt edx-lint==5.3.4 # via -r requirements/quality.in +edx-opaque-keys==2.4.0 + # via + # -r requirements/test.txt + # edx-drf-extensions exceptiongroup==1.1.1 # via # -r requirements/test.txt @@ -66,7 +108,9 @@ grimp==2.4 # -r requirements/test.txt # import-linter idna==3.4 - # via requests + # via + # -r requirements/test.txt + # requests import-linter==1.9.0 # via -r requirements/test.txt importlib-metadata==6.7.0 @@ -113,6 +157,10 @@ more-itertools==9.1.0 # via jaraco-classes mysqlclient==2.1.1 # via -r requirements/test.txt +newrelic==8.9.0 + # via + # -r requirements/test.txt + # edx-django-utils packaging==23.1 # via # -r requirements/test.txt @@ -129,16 +177,27 @@ pluggy==1.0.0 # via # -r requirements/test.txt # pytest +psutil==5.9.5 + # via + # -r requirements/test.txt + # edx-django-utils pycodestyle==2.10.0 # via -r requirements/quality.in pycparser==2.21 - # via cffi + # via + # -r requirements/test.txt + # cffi pydocstyle==6.3.0 # via -r requirements/quality.in pygments==2.15.1 # via # readme-renderer # rich +pyjwt[crypto]==2.8.0 + # via + # -r requirements/test.txt + # drf-jwt + # edx-drf-extensions pylint==2.17.4 # via # edx-lint @@ -153,6 +212,14 @@ pylint-plugin-utils==0.8.2 # via # pylint-celery # pylint-django +pymongo==3.13.0 + # via + # -r requirements/test.txt + # edx-opaque-keys +pynacl==1.5.0 + # via + # -r requirements/test.txt + # edx-django-utils pytest==7.3.2 # via # -r requirements/test.txt @@ -162,6 +229,10 @@ pytest-cov==4.1.0 # via -r requirements/test.txt pytest-django==4.5.2 # via -r requirements/test.txt +python-dateutil==2.8.2 + # via + # -r requirements/test.txt + # edx-drf-extensions python-slugify==8.0.1 # via # -r requirements/test.txt @@ -179,6 +250,8 @@ readme-renderer==40.0 # via twine requests==2.31.0 # via + # -r requirements/test.txt + # edx-drf-extensions # requests-toolbelt # twine requests-toolbelt==1.0.0 @@ -191,10 +264,17 @@ rules==3.3 # via -r requirements/test.txt secretstorage==3.3.3 # via keyring +semantic-version==2.10.0 + # via + # -r requirements/test.txt + # edx-drf-extensions six==1.16.0 # via + # -r requirements/test.txt # bleach + # edx-drf-extensions # edx-lint + # python-dateutil snowballstemmer==2.2.0 # via pydocstyle sqlparse==0.4.4 @@ -206,6 +286,8 @@ stevedore==5.1.0 # via # -r requirements/test.txt # code-annotations + # edx-django-utils + # edx-opaque-keys text-unidecode==1.3 # via # -r requirements/test.txt @@ -230,8 +312,9 @@ typing-extensions==4.6.3 # import-linter # pylint # rich -urllib3==2.0.3 +urllib3==2.0.4 # via + # -r requirements/test.txt # requests # twine webencodings==0.5.1 diff --git a/requirements/test.in b/requirements/test.in index c050dd241..50feee663 100644 --- a/requirements/test.in +++ b/requirements/test.in @@ -14,4 +14,4 @@ pytest-django # pytest extension for better Django support code-annotations # provides commands used by the pii_check make target. ddt # supports data driven tests mock # supports overriding classes and methods in tests -django-debug-toolbar # provides a debug toolbar for Django +django-debug-toolbar # provides a debug toolbar for Django diff --git a/requirements/test.txt b/requirements/test.txt index 22c43aede..e1240b21f 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -8,9 +8,24 @@ asgiref==3.7.2 # via # -r requirements/base.txt # django -click==8.1.3 +certifi==2023.7.22 # via + # -r requirements/base.txt + # requests +cffi==1.15.1 + # via + # -r requirements/base.txt + # cryptography + # pynacl +charset-normalizer==3.2.0 + # via + # -r requirements/base.txt + # requests +click==8.1.6 + # via + # -r requirements/base.txt # code-annotations + # edx-django-utils # import-linter code-annotations==1.3.0 # via -r requirements/test.in @@ -18,21 +33,60 @@ coverage[toml]==7.2.7 # via # -r requirements/test.in # pytest-cov +cryptography==41.0.3 + # via + # -r requirements/base.txt + # pyjwt ddt==1.6.0 # via -r requirements/test.in # via # -c requirements/constraints.txt # -r requirements/base.txt + # django-crum # django-debug-toolbar + # django-waffle # djangorestframework + # drf-jwt + # edx-django-utils + # edx-drf-extensions +django-crum==0.7.9 + # via + # -r requirements/base.txt + # edx-django-utils django-debug-toolbar==4.1.0 # via -r requirements/test.in +django-waffle==4.0.0 + # via + # -r requirements/base.txt + # edx-django-utils + # edx-drf-extensions djangorestframework==3.14.0 + # via + # -r requirements/base.txt + # drf-jwt + # edx-drf-extensions +drf-jwt==1.19.2 + # via + # -r requirements/base.txt + # edx-drf-extensions +edx-django-utils==5.7.0 + # via + # -r requirements/base.txt + # edx-drf-extensions +edx-drf-extensions==8.8.0 # via -r requirements/base.txt +edx-opaque-keys==2.4.0 + # via + # -r requirements/base.txt + # edx-drf-extensions exceptiongroup==1.1.1 # via pytest grimp==2.4 # via import-linter +idna==3.4 + # via + # -r requirements/base.txt + # requests import-linter==1.9.0 # via -r requirements/test.in iniconfig==2.0.0 @@ -45,12 +99,39 @@ mock==5.0.2 # via -r requirements/test.in mysqlclient==2.1.1 # via -r requirements/test.in +newrelic==8.9.0 + # via + # -r requirements/base.txt + # edx-django-utils packaging==23.1 # via pytest pbr==5.11.1 - # via stevedore + # via + # -r requirements/base.txt + # stevedore pluggy==1.0.0 # via pytest +psutil==5.9.5 + # via + # -r requirements/base.txt + # edx-django-utils +pycparser==2.21 + # via + # -r requirements/base.txt + # cffi +pyjwt[crypto]==2.8.0 + # via + # -r requirements/base.txt + # drf-jwt + # edx-drf-extensions +pymongo==3.13.0 + # via + # -r requirements/base.txt + # edx-opaque-keys +pynacl==1.5.0 + # via + # -r requirements/base.txt + # edx-django-utils pytest==7.3.2 # via # -r requirements/test.in @@ -60,6 +141,10 @@ pytest-cov==4.1.0 # via -r requirements/test.in pytest-django==4.5.2 # via -r requirements/test.in +python-dateutil==2.8.2 + # via + # -r requirements/base.txt + # edx-drf-extensions python-slugify==8.0.1 # via code-annotations pytz==2023.3 @@ -69,15 +154,32 @@ pytz==2023.3 # djangorestframework pyyaml==6.0 # via code-annotations +requests==2.31.0 + # via + # -r requirements/base.txt + # edx-drf-extensions rules==3.3 # via -r requirements/base.txt +semantic-version==2.10.0 + # via + # -r requirements/base.txt + # edx-drf-extensions +six==1.16.0 + # via + # -r requirements/base.txt + # edx-drf-extensions + # python-dateutil sqlparse==0.4.4 # via # -r requirements/base.txt # django # django-debug-toolbar stevedore==5.1.0 - # via code-annotations + # via + # -r requirements/base.txt + # code-annotations + # edx-django-utils + # edx-opaque-keys text-unidecode==1.3 # via python-slugify tomli==2.0.1 @@ -91,3 +193,7 @@ typing-extensions==4.6.3 # asgiref # grimp # import-linter +urllib3==2.0.4 + # via + # -r requirements/base.txt + # requests diff --git a/test_settings.py b/test_settings.py index 63290bc66..28676e13e 100644 --- a/test_settings.py +++ b/test_settings.py @@ -66,3 +66,10 @@ def root(*args): # STORAGES setting in Django >= 4.2 "STORAGE": None, } + +######################### Django Rest Framework ######################## + +REST_FRAMEWORK = { + 'DEFAULT_PAGINATION_CLASS': 'edx_rest_framework_extensions.paginators.DefaultPagination', + 'PAGE_SIZE': 10, +} diff --git a/tests/openedx_tagging/core/tagging/test_views.py b/tests/openedx_tagging/core/tagging/test_views.py index 6ed24246c..69805e234 100644 --- a/tests/openedx_tagging/core/tagging/test_views.py +++ b/tests/openedx_tagging/core/tagging/test_views.py @@ -6,14 +6,16 @@ from django.contrib.auth import get_user_model from rest_framework import status from rest_framework.test import APITestCase +from urllib.parse import urlparse, parse_qs from openedx_tagging.core.tagging.models import Taxonomy from openedx_tagging.core.tagging.models.system_defined import SystemDefinedTaxonomy User = get_user_model() -TAXONOMY_LIST_URL = '/tagging/rest_api/v1/taxonomies/' -TAXONOMY_DETAIL_URL = '/tagging/rest_api/v1/taxonomies/{pk}/' +TAXONOMY_LIST_URL = "/tagging/rest_api/v1/taxonomies/" +TAXONOMY_DETAIL_URL = "/tagging/rest_api/v1/taxonomies/{pk}/" + def check_taxonomy( data, @@ -85,7 +87,7 @@ def test_list_taxonomy_queryparams(self, enabled, expected_status, expected_coun # If we were able to list the taxonomies, check that we got the expected number back # We take into account the Language Taxonomy that is created by the system in a migration if status.is_success(expected_status): - assert len(response.data) == expected_count + assert len(response.data["results"]) == expected_count @ddt.data( (None, status.HTTP_403_FORBIDDEN), @@ -103,14 +105,42 @@ def test_list_taxonomy(self, user_attr, expected_status): response = self.client.get(url) assert response.status_code == expected_status + def test_list_taxonomy_pagination(self): + url = TAXONOMY_LIST_URL + Taxonomy.objects.create(name="T1", enabled=True).save() + Taxonomy.objects.create(name="T2", enabled=True).save() + Taxonomy.objects.create(name="T3", enabled=False).save() + Taxonomy.objects.create(name="T4", enabled=False).save() + Taxonomy.objects.create(name="T5", enabled=False).save() + + self.client.force_authenticate(user=self.staff) + + query_params = {"page_size": 2, "page": 2} + response = self.client.get(url, query_params, format="json") + + assert response.status_code == status.HTTP_200_OK + + self.assertEqual(set(t["name"] for t in response.data["results"]), set(("T2", "T3"))) + parsed_url = urlparse(response.data["next"]) + + next_page = parse_qs(parsed_url.query).get("page", [None])[0] + assert next_page == "3" + + def test_list_invalid_page(self): + url = TAXONOMY_LIST_URL + + self.client.force_authenticate(user=self.user) + + query_params = {"page": 123123} + + response = self.client.get(url, query_params, format="json") + + assert response.status_code == status.HTTP_404_NOT_FOUND + @ddt.data( (None, {"enabled": True}, status.HTTP_403_FORBIDDEN), (None, {"enabled": False}, status.HTTP_403_FORBIDDEN), - ( - "user", - {"enabled": True}, - status.HTTP_200_OK, - ), + ("user", {"enabled": True}, status.HTTP_200_OK), ("user", {"enabled": False}, status.HTTP_404_NOT_FOUND), ("staff", {"enabled": True}, status.HTTP_200_OK), ("staff", {"enabled": False}, status.HTTP_200_OK), @@ -237,12 +267,10 @@ def test_update_taxonomy(self, user_attr, expected_status): (True, status.HTTP_403_FORBIDDEN), ) @ddt.unpack - def test_update_taxonomy_system_defined( - self, system_defined, expected_status - ): - ''' + def test_update_taxonomy_system_defined(self, system_defined, expected_status): + """ Test that we can't update system_defined field - ''' + """ taxonomy = Taxonomy.objects.create(name="test system taxonomy") if system_defined: taxonomy.taxonomy_class = SystemDefinedTaxonomy @@ -250,9 +278,7 @@ def test_update_taxonomy_system_defined( url = TAXONOMY_DETAIL_URL.format(pk=taxonomy.pk) self.client.force_authenticate(user=self.staff) - response = self.client.put( - url, {"name": "new name"}, format="json" - ) + response = self.client.put(url, {"name": "new name"}, format="json") assert response.status_code == expected_status def test_update_taxonomy_404(self): @@ -269,9 +295,7 @@ def test_update_taxonomy_404(self): ) @ddt.unpack def test_patch_taxonomy(self, user_attr, expected_status): - taxonomy = Taxonomy.objects.create( - name="test patch taxonomy", enabled=False, required=True - ) + taxonomy = Taxonomy.objects.create(name="test patch taxonomy", enabled=False, required=True) taxonomy.save() url = TAXONOMY_DETAIL_URL.format(pk=taxonomy.pk) @@ -280,9 +304,7 @@ def test_patch_taxonomy(self, user_attr, expected_status): user = getattr(self, user_attr) self.client.force_authenticate(user=user) - response = self.client.patch( - url, {"name": "new name", "required": False}, format="json" - ) + response = self.client.patch(url, {"name": "new name", "required": False}, format="json") assert response.status_code == expected_status # If we were able to update the taxonomy, check if the name changed @@ -303,24 +325,18 @@ def test_patch_taxonomy(self, user_attr, expected_status): (True, status.HTTP_403_FORBIDDEN), ) @ddt.unpack - def test_patch_taxonomy_system_defined( - self, system_defined, expected_status - ): - ''' + def test_patch_taxonomy_system_defined(self, system_defined, expected_status): + """ Test that we can't patch system_defined field - ''' - taxonomy = Taxonomy.objects.create( - name="test system taxonomy" - ) + """ + taxonomy = Taxonomy.objects.create(name="test system taxonomy") if system_defined: taxonomy.taxonomy_class = SystemDefinedTaxonomy taxonomy.save() url = TAXONOMY_DETAIL_URL.format(pk=taxonomy.pk) self.client.force_authenticate(user=self.staff) - response = self.client.patch( - url, {"name": "New name"}, format="json" - ) + response = self.client.patch(url, {"name": "New name"}, format="json") assert response.status_code == expected_status def test_patch_taxonomy_404(self):