From 1748652b4d187b96b5bca035025b71a94e0a2108 Mon Sep 17 00:00:00 2001 From: imperosol Date: Wed, 4 Jun 2025 09:49:11 +0200 Subject: [PATCH] rename apikey to api --- {apikey => api}/__init__.py | 0 {apikey => api}/admin.py | 4 +- {apikey => api}/apps.py | 4 +- {apikey => api}/auth.py | 4 +- {apikey => api}/hashers.py | 0 {apikey => api}/migrations/0001_initial.py | 2 +- {apikey => api}/migrations/__init__.py | 0 {apikey => api}/models.py | 0 .../api_permissions.py => api/permissions.py | 31 +++-- api/tests/__init__.py | 0 apikey/tests.py => api/tests/test_api_key.py | 6 +- club/api.py | 4 +- com/api.py | 2 +- com/models.py | 2 +- core/api.py | 4 +- counter/api.py | 4 +- counter/models.py | 2 +- docs/reference/{apikey => api}/auth.md | 2 +- docs/reference/{apikey => api}/hashers.md | 2 +- docs/reference/{apikey => api}/models.md | 2 +- docs/reference/api/perms.md | 4 + docs/reference/core/auth.md | 9 +- docs/tutorial/api/dev.md | 21 ++- docs/tutorial/perms.md | 2 +- docs/tutorial/structure.md | 130 +++++++++--------- eboutic/api.py | 2 +- locale/fr/LC_MESSAGES/django.po | 29 ++-- mkdocs.yml | 9 +- pedagogy/api.py | 4 +- sas/api.py | 4 +- sith/settings.py | 2 +- 31 files changed, 159 insertions(+), 132 deletions(-) rename {apikey => api}/__init__.py (100%) rename {apikey => api}/admin.py (95%) rename {apikey => api}/apps.py (64%) rename {apikey => api}/auth.py (87%) rename {apikey => api}/hashers.py (100%) rename {apikey => api}/migrations/0001_initial.py (98%) rename {apikey => api}/migrations/__init__.py (100%) rename {apikey => api}/models.py (100%) rename core/auth/api_permissions.py => api/permissions.py (88%) create mode 100644 api/tests/__init__.py rename apikey/tests.py => api/tests/test_api_key.py (85%) rename docs/reference/{apikey => api}/auth.md (86%) rename docs/reference/{apikey => api}/hashers.md (89%) rename docs/reference/{apikey => api}/models.md (88%) create mode 100644 docs/reference/api/perms.md diff --git a/apikey/__init__.py b/api/__init__.py similarity index 100% rename from apikey/__init__.py rename to api/__init__.py diff --git a/apikey/admin.py b/api/admin.py similarity index 95% rename from apikey/admin.py rename to api/admin.py index ef6a247c..611bdba0 100644 --- a/apikey/admin.py +++ b/api/admin.py @@ -3,8 +3,8 @@ from django.db.models import QuerySet from django.http import HttpRequest from django.utils.translation import gettext_lazy as _ -from apikey.hashers import generate_key -from apikey.models import ApiClient, ApiKey +from api.hashers import generate_key +from api.models import ApiClient, ApiKey @admin.register(ApiClient) diff --git a/apikey/apps.py b/api/apps.py similarity index 64% rename from apikey/apps.py rename to api/apps.py index 4ce409b2..878e7d54 100644 --- a/apikey/apps.py +++ b/api/apps.py @@ -1,6 +1,6 @@ from django.apps import AppConfig -class ApikeyConfig(AppConfig): +class ApiConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" - name = "apikey" + name = "api" diff --git a/apikey/auth.py b/api/auth.py similarity index 87% rename from apikey/auth.py rename to api/auth.py index d1489f7f..787234a6 100644 --- a/apikey/auth.py +++ b/api/auth.py @@ -1,8 +1,8 @@ from django.http import HttpRequest from ninja.security import APIKeyHeader -from apikey.hashers import get_hasher -from apikey.models import ApiClient, ApiKey +from api.hashers import get_hasher +from api.models import ApiClient, ApiKey class ApiKeyAuth(APIKeyHeader): diff --git a/apikey/hashers.py b/api/hashers.py similarity index 100% rename from apikey/hashers.py rename to api/hashers.py diff --git a/apikey/migrations/0001_initial.py b/api/migrations/0001_initial.py similarity index 98% rename from apikey/migrations/0001_initial.py rename to api/migrations/0001_initial.py index b416b749..4ebfe9d4 100644 --- a/apikey/migrations/0001_initial.py +++ b/api/migrations/0001_initial.py @@ -99,7 +99,7 @@ class Migration(migrations.Migration): models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="api_keys", - to="apikey.apiclient", + to="api.apiclient", verbose_name="api client", ), ), diff --git a/apikey/migrations/__init__.py b/api/migrations/__init__.py similarity index 100% rename from apikey/migrations/__init__.py rename to api/migrations/__init__.py diff --git a/apikey/models.py b/api/models.py similarity index 100% rename from apikey/models.py rename to api/models.py diff --git a/core/auth/api_permissions.py b/api/permissions.py similarity index 88% rename from core/auth/api_permissions.py rename to api/permissions.py index 73f9fa84..f371910b 100644 --- a/core/auth/api_permissions.py +++ b/api/permissions.py @@ -39,7 +39,7 @@ Example: import operator from functools import reduce -from typing import Any +from typing import Any, Callable from django.contrib.auth.models import Permission from django.http import HttpRequest @@ -67,21 +67,26 @@ class HasPerm(BasePermission): Example: ```python - # this route will require both permissions - @route.put("/foo", permissions=[HasPerm(["foo.change_foo", "foo.add_foo"])] - def foo(self): ... + @api_controller("/foo") + class FooController(ControllerBase): + # this route will require both permissions + @route.put("/foo", permissions=[HasPerm(["foo.change_foo", "foo.add_foo"])] + def foo(self): ... - # This route will require at least one of the perm, - # but it's not mandatory to have all of them - @route.put( - "/bar", - permissions=[HasPerm(["foo.change_bar", "foo.add_bar"], op=operator.or_)], - ) - def bar(self): ... + # This route will require at least one of the perm, + # but it's not mandatory to have all of them + @route.put( + "/bar", + permissions=[HasPerm(["foo.change_bar", "foo.add_bar"], op=operator.or_)], + ) + def bar(self): ... + ``` """ def __init__( - self, perms: str | Permission | list[str | Permission], op=operator.and_ + self, + perms: str | Permission | list[str | Permission], + op: Callable[[bool, bool], bool] = operator.and_, ): """ Args: @@ -103,7 +108,7 @@ class HasPerm(BasePermission): # If not, this authentication has not been done, but the user may # still be implicitly authenticated through AuthenticationMiddleware user = request.auth if hasattr(request, "auth") else request.user - # `user` may either be a `core.User` or an `apikey.ApiClient` ; + # `user` may either be a `core.User` or an `api.ApiClient` ; # they are not the same model, but they both implement the `has_perm` method return reduce(self._operator, (user.has_perm(p) for p in self._perms)) diff --git a/api/tests/__init__.py b/api/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apikey/tests.py b/api/tests/test_api_key.py similarity index 85% rename from apikey/tests.py rename to api/tests/test_api_key.py index a971af2d..4fad18d3 100644 --- a/apikey/tests.py +++ b/api/tests/test_api_key.py @@ -2,9 +2,9 @@ import pytest from django.test import RequestFactory from model_bakery import baker -from apikey.auth import ApiKeyAuth -from apikey.hashers import generate_key -from apikey.models import ApiClient, ApiKey +from api.auth import ApiKeyAuth +from api.hashers import generate_key +from api.models import ApiClient, ApiKey @pytest.mark.django_db diff --git a/club/api.py b/club/api.py index decdf8f8..ef46e4c7 100644 --- a/club/api.py +++ b/club/api.py @@ -6,10 +6,10 @@ from ninja_extra import ControllerBase, api_controller, paginate, route from ninja_extra.pagination import PageNumberPaginationExtra from ninja_extra.schemas import PaginatedResponseSchema -from apikey.auth import ApiKeyAuth +from api.auth import ApiKeyAuth +from api.permissions import CanAccessLookup, HasPerm from club.models import Club from club.schemas import ClubSchema, SimpleClubSchema -from core.auth.api_permissions import CanAccessLookup, HasPerm @api_controller("/club") diff --git a/com/api.py b/com/api.py index 79ff9c34..b01eef0e 100644 --- a/com/api.py +++ b/com/api.py @@ -8,10 +8,10 @@ from ninja_extra.pagination import PageNumberPaginationExtra from ninja_extra.permissions import IsAuthenticated from ninja_extra.schemas import PaginatedResponseSchema +from api.permissions import HasPerm from com.ics_calendar import IcsCalendar from com.models import News, NewsDate from com.schemas import NewsDateFilterSchema, NewsDateSchema -from core.auth.api_permissions import HasPerm from core.views.files import send_raw_file diff --git a/com/models.py b/com/models.py index c7e66515..c0a11ac3 100644 --- a/com/models.py +++ b/com/models.py @@ -191,7 +191,7 @@ class NewsDateQuerySet(models.QuerySet): class NewsDate(models.Model): """A date associated with news. - A [News][] can have multiple dates, for example if it is a recurring event. + A [News][com.models.News] can have multiple dates, for example if it is a recurring event. """ news = models.ForeignKey( diff --git a/core/api.py b/core/api.py index bd74875b..06b32989 100644 --- a/core/api.py +++ b/core/api.py @@ -11,9 +11,9 @@ from ninja_extra.exceptions import PermissionDenied from ninja_extra.pagination import PageNumberPaginationExtra from ninja_extra.schemas import PaginatedResponseSchema -from apikey.auth import ApiKeyAuth +from api.auth import ApiKeyAuth +from api.permissions import CanAccessLookup, CanView, HasPerm from club.models import Mailing -from core.auth.api_permissions import CanAccessLookup, CanView, HasPerm from core.models import Group, QuickUploadImage, SithFile, User from core.schemas import ( FamilyGodfatherSchema, diff --git a/counter/api.py b/counter/api.py index 11bf56c9..c7bcb540 100644 --- a/counter/api.py +++ b/counter/api.py @@ -21,8 +21,8 @@ from ninja_extra import ControllerBase, api_controller, paginate, route from ninja_extra.pagination import PageNumberPaginationExtra from ninja_extra.schemas import PaginatedResponseSchema -from apikey.auth import ApiKeyAuth -from core.auth.api_permissions import CanAccessLookup, CanView, IsInGroup, IsRoot +from api.auth import ApiKeyAuth +from api.permissions import CanAccessLookup, CanView, IsInGroup, IsRoot from counter.models import Counter, Product, ProductType from counter.schemas import ( CounterFilterSchema, diff --git a/counter/models.py b/counter/models.py index 3515e081..0f46176b 100644 --- a/counter/models.py +++ b/counter/models.py @@ -61,7 +61,7 @@ class CustomerQuerySet(models.QuerySet): Returns: The number of updated rows. - Warnings: + Warning: The execution time of this query grows really quickly. When updating 500 customers, it may take around a second. If you try to update all customers at once, the execution time diff --git a/docs/reference/apikey/auth.md b/docs/reference/api/auth.md similarity index 86% rename from docs/reference/apikey/auth.md rename to docs/reference/api/auth.md index f6261037..764dd318 100644 --- a/docs/reference/apikey/auth.md +++ b/docs/reference/api/auth.md @@ -1,4 +1,4 @@ -::: apikey.auth +::: api.auth handler: python options: heading_level: 3 diff --git a/docs/reference/apikey/hashers.md b/docs/reference/api/hashers.md similarity index 89% rename from docs/reference/apikey/hashers.md rename to docs/reference/api/hashers.md index eb728802..91c420b2 100644 --- a/docs/reference/apikey/hashers.md +++ b/docs/reference/api/hashers.md @@ -1,4 +1,4 @@ -::: apikey.hashers +::: api.hashers handler: python options: heading_level: 3 diff --git a/docs/reference/apikey/models.md b/docs/reference/api/models.md similarity index 88% rename from docs/reference/apikey/models.md rename to docs/reference/api/models.md index 52da58df..dbf2676b 100644 --- a/docs/reference/apikey/models.md +++ b/docs/reference/api/models.md @@ -1,4 +1,4 @@ -::: apikey.auth +::: api.auth handler: python options: heading_level: 3 diff --git a/docs/reference/api/perms.md b/docs/reference/api/perms.md new file mode 100644 index 00000000..c481bd28 --- /dev/null +++ b/docs/reference/api/perms.md @@ -0,0 +1,4 @@ +::: api.permissions + handler: python + options: + heading_level: 3 \ No newline at end of file diff --git a/docs/reference/core/auth.md b/docs/reference/core/auth.md index ade23f49..4226bb2c 100644 --- a/docs/reference/core/auth.md +++ b/docs/reference/core/auth.md @@ -20,13 +20,6 @@ - CanCreateMixin - CanEditMixin - CanViewMixin + - CanEditPropMixin - FormerSubscriberMixin - PermissionOrAuthorRequiredMixin - - -## API Permissions - -::: core.auth.api_permissions - handler: python - options: - heading_level: 3 \ No newline at end of file diff --git a/docs/tutorial/api/dev.md b/docs/tutorial/api/dev.md index 4d2de4e8..165d605f 100644 --- a/docs/tutorial/api/dev.md +++ b/docs/tutorial/api/dev.md @@ -4,6 +4,25 @@ Ce sont des librairies relativement simples et qui présentent l'immense avantage d'offrir des mécanismes de validation et de sérialisation de données à la fois simples et expressifs. +## Dossiers et fichiers + +L'API possède une application (`api`) +à la racine du projet, contenant des utilitaires +et de la configuration partagée par toutes les autres applications. +C'est la pièce centrale de notre API, mais ce n'est pas là que +vous trouverez les routes de l'API. + +Les routes en elles-mêmes sont contenues dans les autres applications, +de manière thématiques : +les routes liées aux clubs sont dans `club`, les routes liées +aux photos dans `sas` et ainsi de suite. + +Les fichiers liés à l'API dans chaque application sont +`schemas.py` et `api.py`. +`schemas.py` contient les schémas de validation de données +et `api.py` contient les contrôleurs de l'API. + + ## Schéma de données Le cœur de django-ninja étant sa validation de données grâce à Pydantic, @@ -33,7 +52,7 @@ La plus grande partie des routes de l'API utilisent la méthode par cookie de se Pour placer une route d'API derrière l'une de ces méthodes (ou bien les deux), utilisez l'attribut `auth` et les classes `SessionAuth` et -[`ApiKeyAuth`][apikey.auth.ApiKeyAuth]. +[`ApiKeyAuth`][api.auth.ApiKeyAuth]. !!!example diff --git a/docs/tutorial/perms.md b/docs/tutorial/perms.md index c23ca25f..4594c81e 100644 --- a/docs/tutorial/perms.md +++ b/docs/tutorial/perms.md @@ -606,4 +606,4 @@ vous ne devriez pas être perdu, étant donné que le système de permissions de l'API utilise des noms assez similaires : `IsInGroup`, `IsRoot`, `IsSubscriber`... Vous pouvez trouver des exemples d'utilisation de ce système -dans [cette partie](../reference/core/api_permissions.md). +dans [cette partie](../reference/api/perms.md). diff --git a/docs/tutorial/structure.md b/docs/tutorial/structure.md index 1421cddc..a796ee91 100644 --- a/docs/tutorial/structure.md +++ b/docs/tutorial/structure.md @@ -24,62 +24,66 @@ sith/ ├── .github/ │ ├── actions/ (1) │ └── workflows/ (2) -├── club/ (3) +├── api/ (3) │ └── ... -├── com/ (4) +├── antispam/ (4) │ └── ... -├── core/ (5) +├── club/ (5) │ └── ... -├── counter/ (6) +├── com/ (6) │ └── ... -├── docs/ (7) +├── core/ (7) │ └── ... -├── eboutic/ (8) +├── counter/ (8) │ └── ... -├── election/ (9) +├── docs/ (9) │ └── ... -├── forum/ (10) +├── eboutic/ (10) │ └── ... -├── galaxy/ (11) +├── election/ (11) │ └── ... -├── locale/ (12) +├── forum/ (12) │ └── ... -├── matmat/ (13) +├── galaxy/ (13) │ └── ... -├── pedagogy/ (14) +├── locale/ (14) │ └── ... -├── rootplace/ (15) +├── matmat/ (15) │ └── ... -├── sas/ (16) +├── pedagogy/ (16) │ └── ... -├── sith/ (17) +├── rootplace/ (17) │ └── ... -├── subscription/ (18) +├── sas/ (18) │ └── ... -├── trombi/ (19) +├── sith/ (19) │ └── ... -├── antispam/ (20) +├── subscription/ (20) │ └── ... -├── staticfiles/ (21) +├── trombi/ (21) │ └── ... -├── processes/ (22) +├── antispam/ (22) +│ └── ... +├── staticfiles/ (23) +│ └── ... +├── processes/ (24) │ └── ... │ -├── .coveragerc (23) -├── .envrc (24) +├── .coveragerc (25) +├── .envrc (26) ├── .gitattributes ├── .gitignore ├── .mailmap -├── .env (25) -├── .env.example (26) -├── manage.py (27) -├── mkdocs.yml (28) +├── .env (27) +├── .env.example (28) +├── manage.py (29) +├── mkdocs.yml (30) ├── uv.lock -├── pyproject.toml (29) -├── .venv/ (30) -├── .python-version (31) -├── Procfile.static (32) -├── Procfile.service (33) +├── pyproject.toml (31) +├── .venv/ (32) +├── .python-version (33) +├── Procfile.static (34) +├── Procfile.service (35) └── README.md ``` @@ -92,53 +96,55 @@ sith/ des workflows Github. Par exemple, le workflow `docs.yml` compile et publie la documentation à chaque push sur la branche `master`. -3. Application de gestion des clubs et de leurs membres. -4. Application contenant les fonctionnalités +3. Application avec la configuration de l'API +4. Application contenant des utilitaires pour bloquer le spam et les bots +5. Application de gestion des clubs et de leurs membres. +6. Application contenant les fonctionnalités destinées aux responsables communication de l'AE. -5. Application contenant la modélisation centrale du site. +7. Application contenant la modélisation centrale du site. On en reparle plus loin sur cette page. -6. Application de gestion des comptoirs, des permanences +8. Application de gestion des comptoirs, des permanences sur ces comptoirs et des transactions qui y sont effectuées. -7. Dossier contenant la documentation. -8. Application de gestion de la boutique en ligne. -9. Application de gestion des élections. -10. Application de gestion du forum -11. Application de gestion de la galaxie ; la galaxie +9. Dossier contenant la documentation. +10. Application de gestion de la boutique en ligne. +11. Application de gestion des élections. +12. Application de gestion du forum +13. Application de gestion de la galaxie ; la galaxie est un graphe des niveaux de proximité entre les différents étudiants. -12. Dossier contenant les fichiers de traduction. -13. Fonctionnalités de recherche d'utilisateurs. -14. Le guide des UEs du site, sur lequel les utilisateurs +14. Dossier contenant les fichiers de traduction. +15. Fonctionnalités de recherche d'utilisateurs. +16. Le guide des UEs du site, sur lequel les utilisateurs peuvent également laisser leurs avis. -15. Fonctionnalités utiles aux utilisateurs root. -16. Le SAS, où l'on trouve toutes les photos de l'AE. -17. Application principale du projet, contenant sa configuration. -18. Gestion des cotisations des utilisateurs du site. -19. Outil pour faciliter la fabrication des trombinoscopes de promo. -20. Fonctionnalités pour gérer le spam. -21. Gestion des statics du site. Override le système de statics de Django. +17. Fonctionnalités utiles aux utilisateurs root. +18. Le SAS, où l'on trouve toutes les photos de l'AE. +19. Application principale du projet, contenant sa configuration. +20. Gestion des cotisations des utilisateurs du site. +21. Outil pour faciliter la fabrication des trombinoscopes de promo. +22. Fonctionnalités pour gérer le spam. +23. Gestion des statics du site. Override le système de statics de Django. Ajoute l'intégration du scss et du bundler js de manière transparente pour l'utilisateur. -22. Module de gestion des services externes. +24. Module de gestion des services externes. Offre une API simple pour utiliser les fichiers `Procfile.*`. -23. Fichier de configuration de coverage. -24. Fichier de configuration de direnv. -25. Contient les variables d'environnement, qui sont susceptibles +25. Fichier de configuration de coverage. +26. Fichier de configuration de direnv. +27. Contient les variables d'environnement, qui sont susceptibles de varier d'une machine à l'autre. -26. Contient des valeurs par défaut pour le `.env` +28. Contient des valeurs par défaut pour le `.env` pouvant convenir à un environnment de développement local -27. Fichier généré automatiquement par Django. C'est lui +29. Fichier généré automatiquement par Django. C'est lui qui permet d'appeler des commandes de gestion du projet avec la syntaxe `python ./manage.py ` -28. Le fichier de configuration de la documentation, +30. Le fichier de configuration de la documentation, avec ses plugins et sa table des matières. -29. Le fichier où sont déclarés les dépendances et la configuration +31. Le fichier où sont déclarés les dépendances et la configuration de certaines d'entre elles. -30. Dossier d'environnement virtuel généré par uv -31. Fichier qui contrôle quelle version de python utiliser pour le projet -32. Fichier qui contrôle les commandes à lancer pour gérer la compilation +32. Dossier d'environnement virtuel généré par uv +33. Fichier qui contrôle quelle version de python utiliser pour le projet +34. Fichier qui contrôle les commandes à lancer pour gérer la compilation automatique des static et autres services nécessaires à la command runserver. -33. Fichier qui contrôle les services tiers nécessaires au fonctionnement +35. Fichier qui contrôle les services tiers nécessaires au fonctionnement du Sith tel que redis. ## L'application principale diff --git a/eboutic/api.py b/eboutic/api.py index 2041fb87..c44a8cc9 100644 --- a/eboutic/api.py +++ b/eboutic/api.py @@ -1,7 +1,7 @@ from ninja_extra import ControllerBase, api_controller, route from ninja_extra.exceptions import NotFound -from core.auth.api_permissions import CanView +from api.permissions import CanView from counter.models import BillingInfo from eboutic.models import Basket diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index cd399bfd..f2d2e608 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -35,7 +35,7 @@ msgstr "" "True si gardé à jour par le biais d'un fournisseur externe de domains " "toxics, False sinon" -#: apikey/admin.py +#: api/admin.py #, python-format msgid "" "The API key for %(name)s is: %(key)s. Please store it somewhere safe: you " @@ -44,57 +44,56 @@ msgstr "" "La clef d'API pour %(name)s est : %(key)s. Gardez-là dans un emplacement " "sûr : vous ne pourrez pas la revoir à nouveau." -#: apikey/admin.py +#: api/admin.py msgid "Revoke selected API keys" msgstr "Révoquer les clefs d'API sélectionnées" -#: apikey/models.py club/models.py com/models.py counter/models.py -#: forum/models.py launderette/models.py +#: api/models.py club/models.py com/models.py counter/models.py forum/models.py msgid "name" msgstr "nom" -#: apikey/models.py core/models.py +#: api/models.py core/models.py msgid "owner" msgstr "propriétaire" -#: apikey/models.py core/models.py +#: api/models.py core/models.py msgid "groups" msgstr "groupes" -#: apikey/models.py +#: api/models.py msgid "client permissions" msgstr "permissions du client" -#: apikey/models.py +#: api/models.py msgid "Specific permissions for this api client." msgstr "Permissions spécifiques pour ce client d'API" -#: apikey/models.py +#: api/models.py msgid "api client" msgstr "client d'api" -#: apikey/models.py +#: api/models.py msgid "api clients" msgstr "clients d'api" -#: apikey/models.py +#: api/models.py msgid "prefix" msgstr "préfixe" -#: apikey/models.py +#: api/models.py msgid "hashed key" msgstr "hash de la clef" -#: apikey/models.py +#: api/models.py msgctxt "api key" msgid "revoked" msgstr "révoquée" -#: apikey/models.py +#: api/models.py msgid "api key" msgstr "clef d'api" -#: apikey/models.py +#: api/models.py msgid "api keys" msgstr "clefs d'api" diff --git a/mkdocs.yml b/mkdocs.yml index 992cc38e..ffa4a8b4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -86,10 +86,11 @@ nav: - antispam: - reference/antispam/models.md - reference/antispam/forms.md - - apikey: - - reference/apikey/auth.md - - reference/apikey/hashers.md - - reference/apikey/models.md + - api: + - reference/api/auth.md + - reference/api/hashers.md + - reference/api/models.md + - reference/api/perms.md - club: - reference/club/models.md - reference/club/views.md diff --git a/pedagogy/api.py b/pedagogy/api.py index b1944ce4..ae8b7ea8 100644 --- a/pedagogy/api.py +++ b/pedagogy/api.py @@ -8,8 +8,8 @@ from ninja_extra import ControllerBase, api_controller, paginate, route from ninja_extra.exceptions import NotFound from ninja_extra.pagination import PageNumberPaginationExtra, PaginatedResponseSchema -from apikey.auth import ApiKeyAuth -from core.auth.api_permissions import HasPerm +from api.auth import ApiKeyAuth +from api.permissions import HasPerm from pedagogy.models import UV from pedagogy.schemas import SimpleUvSchema, UvFilterSchema, UvSchema from pedagogy.utbm_api import UtbmApiClient diff --git a/sas/api.py b/sas/api.py index 83d7f0c8..fa37e974 100644 --- a/sas/api.py +++ b/sas/api.py @@ -13,8 +13,8 @@ from ninja_extra.permissions import IsAuthenticated from ninja_extra.schemas import PaginatedResponseSchema from pydantic import NonNegativeInt -from apikey.auth import ApiKeyAuth -from core.auth.api_permissions import ( +from api.auth import ApiKeyAuth +from api.permissions import ( CanAccessLookup, CanEdit, CanView, diff --git a/sith/settings.py b/sith/settings.py index 759161e2..2841a9b3 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -124,7 +124,7 @@ INSTALLED_APPS = ( "pedagogy", "galaxy", "antispam", - "apikey", + "api", ) MIDDLEWARE = (