mirror of
https://github.com/ae-utbm/sith.git
synced 2025-06-07 03:35:18 +00:00
rename apikey to api
This commit is contained in:
parent
0d9be6c538
commit
1748652b4d
@ -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)
|
@ -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"
|
@ -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):
|
@ -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",
|
||||
),
|
||||
),
|
@ -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))
|
||||
|
0
api/tests/__init__.py
Normal file
0
api/tests/__init__.py
Normal file
@ -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
|
@ -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")
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
::: apikey.auth
|
||||
::: api.auth
|
||||
handler: python
|
||||
options:
|
||||
heading_level: 3
|
@ -1,4 +1,4 @@
|
||||
::: apikey.hashers
|
||||
::: api.hashers
|
||||
handler: python
|
||||
options:
|
||||
heading_level: 3
|
@ -1,4 +1,4 @@
|
||||
::: apikey.auth
|
||||
::: api.auth
|
||||
handler: python
|
||||
options:
|
||||
heading_level: 3
|
4
docs/reference/api/perms.md
Normal file
4
docs/reference/api/perms.md
Normal file
@ -0,0 +1,4 @@
|
||||
::: api.permissions
|
||||
handler: python
|
||||
options:
|
||||
heading_level: 3
|
@ -20,13 +20,6 @@
|
||||
- CanCreateMixin
|
||||
- CanEditMixin
|
||||
- CanViewMixin
|
||||
- CanEditPropMixin
|
||||
- FormerSubscriberMixin
|
||||
- PermissionOrAuthorRequiredMixin
|
||||
|
||||
|
||||
## API Permissions
|
||||
|
||||
::: core.auth.api_permissions
|
||||
handler: python
|
||||
options:
|
||||
heading_level: 3
|
@ -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
|
||||
|
||||
|
@ -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).
|
||||
|
@ -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
|
||||
```
|
||||
</div>
|
||||
@ -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 <nom de la commande>`
|
||||
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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -124,7 +124,7 @@ INSTALLED_APPS = (
|
||||
"pedagogy",
|
||||
"galaxy",
|
||||
"antispam",
|
||||
"apikey",
|
||||
"api",
|
||||
)
|
||||
|
||||
MIDDLEWARE = (
|
||||
|
Loading…
x
Reference in New Issue
Block a user