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
b727b78995
commit
590831c7b8
@ -3,8 +3,8 @@ from django.db.models import QuerySet
|
|||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from apikey.hashers import generate_key
|
from api.hashers import generate_key
|
||||||
from apikey.models import ApiClient, ApiKey
|
from api.models import ApiClient, ApiKey
|
||||||
|
|
||||||
|
|
||||||
@admin.register(ApiClient)
|
@admin.register(ApiClient)
|
@ -1,6 +1,6 @@
|
|||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
class ApikeyConfig(AppConfig):
|
class ApiConfig(AppConfig):
|
||||||
default_auto_field = "django.db.models.BigAutoField"
|
default_auto_field = "django.db.models.BigAutoField"
|
||||||
name = "apikey"
|
name = "api"
|
@ -1,8 +1,8 @@
|
|||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
from ninja.security import APIKeyHeader
|
from ninja.security import APIKeyHeader
|
||||||
|
|
||||||
from apikey.hashers import get_hasher
|
from api.hashers import get_hasher
|
||||||
from apikey.models import ApiClient, ApiKey
|
from api.models import ApiClient, ApiKey
|
||||||
|
|
||||||
|
|
||||||
class ApiKeyAuth(APIKeyHeader):
|
class ApiKeyAuth(APIKeyHeader):
|
@ -99,7 +99,7 @@ class Migration(migrations.Migration):
|
|||||||
models.ForeignKey(
|
models.ForeignKey(
|
||||||
on_delete=django.db.models.deletion.CASCADE,
|
on_delete=django.db.models.deletion.CASCADE,
|
||||||
related_name="api_keys",
|
related_name="api_keys",
|
||||||
to="apikey.apiclient",
|
to="api.apiclient",
|
||||||
verbose_name="api client",
|
verbose_name="api client",
|
||||||
),
|
),
|
||||||
),
|
),
|
@ -39,7 +39,7 @@ Example:
|
|||||||
|
|
||||||
import operator
|
import operator
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from typing import Any
|
from typing import Any, Callable
|
||||||
|
|
||||||
from django.contrib.auth.models import Permission
|
from django.contrib.auth.models import Permission
|
||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
@ -67,21 +67,26 @@ class HasPerm(BasePermission):
|
|||||||
|
|
||||||
Example:
|
Example:
|
||||||
```python
|
```python
|
||||||
# this route will require both permissions
|
@api_controller("/foo")
|
||||||
@route.put("/foo", permissions=[HasPerm(["foo.change_foo", "foo.add_foo"])]
|
class FooController(ControllerBase):
|
||||||
def foo(self): ...
|
# 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,
|
# This route will require at least one of the perm,
|
||||||
# but it's not mandatory to have all of them
|
# but it's not mandatory to have all of them
|
||||||
@route.put(
|
@route.put(
|
||||||
"/bar",
|
"/bar",
|
||||||
permissions=[HasPerm(["foo.change_bar", "foo.add_bar"], op=operator.or_)],
|
permissions=[HasPerm(["foo.change_bar", "foo.add_bar"], op=operator.or_)],
|
||||||
)
|
)
|
||||||
def bar(self): ...
|
def bar(self): ...
|
||||||
|
```
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(
|
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:
|
Args:
|
||||||
@ -103,7 +108,7 @@ class HasPerm(BasePermission):
|
|||||||
# If not, this authentication has not been done, but the user may
|
# If not, this authentication has not been done, but the user may
|
||||||
# still be implicitly authenticated through AuthenticationMiddleware
|
# still be implicitly authenticated through AuthenticationMiddleware
|
||||||
user = request.auth if hasattr(request, "auth") else request.user
|
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
|
# 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))
|
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 django.test import RequestFactory
|
||||||
from model_bakery import baker
|
from model_bakery import baker
|
||||||
|
|
||||||
from apikey.auth import ApiKeyAuth
|
from api.auth import ApiKeyAuth
|
||||||
from apikey.hashers import generate_key
|
from api.hashers import generate_key
|
||||||
from apikey.models import ApiClient, ApiKey
|
from api.models import ApiClient, ApiKey
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.django_db
|
@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.pagination import PageNumberPaginationExtra
|
||||||
from ninja_extra.schemas import PaginatedResponseSchema
|
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.models import Club
|
||||||
from club.schemas import ClubSchema, SimpleClubSchema
|
from club.schemas import ClubSchema, SimpleClubSchema
|
||||||
from core.auth.api_permissions import CanAccessLookup, HasPerm
|
|
||||||
|
|
||||||
|
|
||||||
@api_controller("/club")
|
@api_controller("/club")
|
||||||
|
@ -7,10 +7,10 @@ from ninja_extra.pagination import PageNumberPaginationExtra
|
|||||||
from ninja_extra.permissions import IsAuthenticated
|
from ninja_extra.permissions import IsAuthenticated
|
||||||
from ninja_extra.schemas import PaginatedResponseSchema
|
from ninja_extra.schemas import PaginatedResponseSchema
|
||||||
|
|
||||||
|
from api.permissions import HasPerm
|
||||||
from com.ics_calendar import IcsCalendar
|
from com.ics_calendar import IcsCalendar
|
||||||
from com.models import News, NewsDate
|
from com.models import News, NewsDate
|
||||||
from com.schemas import NewsDateFilterSchema, NewsDateSchema
|
from com.schemas import NewsDateFilterSchema, NewsDateSchema
|
||||||
from core.auth.api_permissions import HasPerm
|
|
||||||
from core.views.files import send_raw_file
|
from core.views.files import send_raw_file
|
||||||
|
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ class NewsDateQuerySet(models.QuerySet):
|
|||||||
class NewsDate(models.Model):
|
class NewsDate(models.Model):
|
||||||
"""A date associated with news.
|
"""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(
|
news = models.ForeignKey(
|
||||||
|
@ -11,9 +11,9 @@ from ninja_extra.exceptions import PermissionDenied
|
|||||||
from ninja_extra.pagination import PageNumberPaginationExtra
|
from ninja_extra.pagination import PageNumberPaginationExtra
|
||||||
from ninja_extra.schemas import PaginatedResponseSchema
|
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 club.models import Mailing
|
||||||
from core.auth.api_permissions import CanAccessLookup, CanView, HasPerm
|
|
||||||
from core.models import Group, QuickUploadImage, SithFile, User
|
from core.models import Group, QuickUploadImage, SithFile, User
|
||||||
from core.schemas import (
|
from core.schemas import (
|
||||||
FamilyGodfatherSchema,
|
FamilyGodfatherSchema,
|
||||||
|
@ -21,8 +21,8 @@ from ninja_extra import ControllerBase, api_controller, paginate, route
|
|||||||
from ninja_extra.pagination import PageNumberPaginationExtra
|
from ninja_extra.pagination import PageNumberPaginationExtra
|
||||||
from ninja_extra.schemas import PaginatedResponseSchema
|
from ninja_extra.schemas import PaginatedResponseSchema
|
||||||
|
|
||||||
from apikey.auth import ApiKeyAuth
|
from api.auth import ApiKeyAuth
|
||||||
from core.auth.api_permissions import CanAccessLookup, CanView, IsInGroup, IsRoot
|
from api.permissions import CanAccessLookup, CanView, IsInGroup, IsRoot
|
||||||
from counter.models import Counter, Product, ProductType
|
from counter.models import Counter, Product, ProductType
|
||||||
from counter.schemas import (
|
from counter.schemas import (
|
||||||
CounterFilterSchema,
|
CounterFilterSchema,
|
||||||
|
@ -61,7 +61,7 @@ class CustomerQuerySet(models.QuerySet):
|
|||||||
Returns:
|
Returns:
|
||||||
The number of updated rows.
|
The number of updated rows.
|
||||||
|
|
||||||
Warnings:
|
Warning:
|
||||||
The execution time of this query grows really quickly.
|
The execution time of this query grows really quickly.
|
||||||
When updating 500 customers, it may take around a second.
|
When updating 500 customers, it may take around a second.
|
||||||
If you try to update all customers at once, the execution time
|
If you try to update all customers at once, the execution time
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
::: apikey.auth
|
::: api.auth
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
heading_level: 3
|
heading_level: 3
|
@ -1,4 +1,4 @@
|
|||||||
::: apikey.hashers
|
::: api.hashers
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
heading_level: 3
|
heading_level: 3
|
@ -1,4 +1,4 @@
|
|||||||
::: apikey.auth
|
::: api.auth
|
||||||
handler: python
|
handler: python
|
||||||
options:
|
options:
|
||||||
heading_level: 3
|
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
|
- CanCreateMixin
|
||||||
- CanEditMixin
|
- CanEditMixin
|
||||||
- CanViewMixin
|
- CanViewMixin
|
||||||
|
- CanEditPropMixin
|
||||||
- FormerSubscriberMixin
|
- FormerSubscriberMixin
|
||||||
- PermissionOrAuthorRequiredMixin
|
- 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
|
l'immense avantage d'offrir des mécanismes de validation et de sérialisation
|
||||||
de données à la fois simples et expressifs.
|
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
|
## Schéma de données
|
||||||
|
|
||||||
Le cœur de django-ninja étant sa validation de données grâce à Pydantic,
|
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),
|
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
|
utilisez l'attribut `auth` et les classes `SessionAuth` et
|
||||||
[`ApiKeyAuth`][apikey.auth.ApiKeyAuth].
|
[`ApiKeyAuth`][api.auth.ApiKeyAuth].
|
||||||
|
|
||||||
!!!example
|
!!!example
|
||||||
|
|
||||||
|
@ -606,4 +606,4 @@ vous ne devriez pas être perdu, étant donné
|
|||||||
que le système de permissions de l'API utilise
|
que le système de permissions de l'API utilise
|
||||||
des noms assez similaires : `IsInGroup`, `IsRoot`, `IsSubscriber`...
|
des noms assez similaires : `IsInGroup`, `IsRoot`, `IsSubscriber`...
|
||||||
Vous pouvez trouver des exemples d'utilisation de ce système
|
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,64 +24,68 @@ sith/
|
|||||||
├── .github/
|
├── .github/
|
||||||
│ ├── actions/ (1)
|
│ ├── actions/ (1)
|
||||||
│ └── workflows/ (2)
|
│ └── 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)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── launderette/ (12)
|
├── forum/ (12)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── locale/ (13)
|
├── galaxy/ (13)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── matmat/ (14)
|
├── launderette/ (14)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── pedagogy/ (15)
|
├── locale/ (15)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── rootplace/ (16)
|
├── matmat/ (16)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── sas/ (17)
|
├── pedagogy/ (17)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── sith/ (18)
|
├── rootplace/ (18)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── subscription/ (19)
|
├── sas/ (19)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── trombi/ (20)
|
├── sith/ (20)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── antispam/ (21)
|
├── subscription/ (21)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── staticfiles/ (22)
|
├── trombi/ (22)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
├── processes/ (23)
|
├── antispam/ (23)
|
||||||
|
│ └── ...
|
||||||
|
├── staticfiles/ (24)
|
||||||
|
│ └── ...
|
||||||
|
├── processes/ (25)
|
||||||
│ └── ...
|
│ └── ...
|
||||||
│
|
│
|
||||||
├── .coveragerc (24)
|
├── .coveragerc (26)
|
||||||
├── .envrc (25)
|
├── .envrc (27)
|
||||||
├── .gitattributes
|
├── .gitattributes
|
||||||
├── .gitignore
|
├── .gitignore
|
||||||
├── .mailmap
|
├── .mailmap
|
||||||
├── .env (26)
|
├── .env (28)
|
||||||
├── .env.example (27)
|
├── .env.example (29)
|
||||||
├── manage.py (28)
|
├── manage.py (30)
|
||||||
├── mkdocs.yml (29)
|
├── mkdocs.yml (31)
|
||||||
├── uv.lock
|
├── uv.lock
|
||||||
├── pyproject.toml (30)
|
├── pyproject.toml (32)
|
||||||
├── .venv/ (31)
|
├── .venv/ (33)
|
||||||
├── .python-version (32)
|
├── .python-version (34)
|
||||||
├── Procfile.static (33)
|
├── Procfile.static (35)
|
||||||
├── Procfile.service (34)
|
├── Procfile.service (36)
|
||||||
└── README.md
|
└── README.md
|
||||||
```
|
```
|
||||||
</div>
|
</div>
|
||||||
@ -94,54 +98,56 @@ sith/
|
|||||||
des workflows Github.
|
des workflows Github.
|
||||||
Par exemple, le workflow `docs.yml` compile
|
Par exemple, le workflow `docs.yml` compile
|
||||||
et publie la documentation à chaque push sur la branche `master`.
|
et publie la documentation à chaque push sur la branche `master`.
|
||||||
3. Application de gestion des clubs et de leurs membres.
|
3. Application avec la configuration de l'API
|
||||||
4. Application contenant les fonctionnalités
|
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.
|
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.
|
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.
|
sur ces comptoirs et des transactions qui y sont effectuées.
|
||||||
7. Dossier contenant la documentation.
|
9. Dossier contenant la documentation.
|
||||||
8. Application de gestion de la boutique en ligne.
|
10. Application de gestion de la boutique en ligne.
|
||||||
9. Application de gestion des élections.
|
11. Application de gestion des élections.
|
||||||
10. Application de gestion du forum
|
12. Application de gestion du forum
|
||||||
11. Application de gestion de la galaxie ; la galaxie
|
13. Application de gestion de la galaxie ; la galaxie
|
||||||
est un graphe des niveaux de proximité entre les différents
|
est un graphe des niveaux de proximité entre les différents
|
||||||
étudiants.
|
étudiants.
|
||||||
12. Gestion des machines à laver de l'AE
|
14. Gestion des machines à laver de l'AE
|
||||||
13. Dossier contenant les fichiers de traduction.
|
15. Dossier contenant les fichiers de traduction.
|
||||||
14. Fonctionnalités de recherche d'utilisateurs.
|
16. Fonctionnalités de recherche d'utilisateurs.
|
||||||
15. Le guide des UEs du site, sur lequel les utilisateurs
|
17. Le guide des UEs du site, sur lequel les utilisateurs
|
||||||
peuvent également laisser leurs avis.
|
peuvent également laisser leurs avis.
|
||||||
16. Fonctionnalités utiles aux utilisateurs root.
|
18. Fonctionnalités utiles aux utilisateurs root.
|
||||||
17. Le SAS, où l'on trouve toutes les photos de l'AE.
|
19. Le SAS, où l'on trouve toutes les photos de l'AE.
|
||||||
18. Application principale du projet, contenant sa configuration.
|
20. Application principale du projet, contenant sa configuration.
|
||||||
19. Gestion des cotisations des utilisateurs du site.
|
21. Gestion des cotisations des utilisateurs du site.
|
||||||
20. Outil pour faciliter la fabrication des trombinoscopes de promo.
|
22. Outil pour faciliter la fabrication des trombinoscopes de promo.
|
||||||
21. Fonctionnalités pour gérer le spam.
|
23. Fonctionnalités pour gérer le spam.
|
||||||
22. Gestion des statics du site. Override le système de statics de Django.
|
24. Gestion des statics du site. Override le système de statics de Django.
|
||||||
Ajoute l'intégration du scss et du bundler js
|
Ajoute l'intégration du scss et du bundler js
|
||||||
de manière transparente pour l'utilisateur.
|
de manière transparente pour l'utilisateur.
|
||||||
23. Module de gestion des services externes.
|
25. Module de gestion des services externes.
|
||||||
Offre une API simple pour utiliser les fichiers `Procfile.*`.
|
Offre une API simple pour utiliser les fichiers `Procfile.*`.
|
||||||
24. Fichier de configuration de coverage.
|
26. Fichier de configuration de coverage.
|
||||||
25. Fichier de configuration de direnv.
|
27. Fichier de configuration de direnv.
|
||||||
26. Contient les variables d'environnement, qui sont susceptibles
|
28. Contient les variables d'environnement, qui sont susceptibles
|
||||||
de varier d'une machine à l'autre.
|
de varier d'une machine à l'autre.
|
||||||
27. Contient des valeurs par défaut pour le `.env`
|
29. Contient des valeurs par défaut pour le `.env`
|
||||||
pouvant convenir à un environnment de développement local
|
pouvant convenir à un environnment de développement local
|
||||||
28. Fichier généré automatiquement par Django. C'est lui
|
30. Fichier généré automatiquement par Django. C'est lui
|
||||||
qui permet d'appeler des commandes de gestion du projet
|
qui permet d'appeler des commandes de gestion du projet
|
||||||
avec la syntaxe `python ./manage.py <nom de la commande>`
|
avec la syntaxe `python ./manage.py <nom de la commande>`
|
||||||
29. Le fichier de configuration de la documentation,
|
31. Le fichier de configuration de la documentation,
|
||||||
avec ses plugins et sa table des matières.
|
avec ses plugins et sa table des matières.
|
||||||
30. Le fichier où sont déclarés les dépendances et la configuration
|
32. Le fichier où sont déclarés les dépendances et la configuration
|
||||||
de certaines d'entre elles.
|
de certaines d'entre elles.
|
||||||
31. Dossier d'environnement virtuel généré par uv
|
33. Dossier d'environnement virtuel généré par uv
|
||||||
32. Fichier qui contrôle quelle version de python utiliser pour le projet
|
34. Fichier qui contrôle quelle version de python utiliser pour le projet
|
||||||
33. Fichier qui contrôle les commandes à lancer pour gérer la compilation
|
35. Fichier qui contrôle les commandes à lancer pour gérer la compilation
|
||||||
automatique des static et autres services nécessaires à la command runserver.
|
automatique des static et autres services nécessaires à la command runserver.
|
||||||
34. Fichier qui contrôle les services tiers nécessaires au fonctionnement
|
36. Fichier qui contrôle les services tiers nécessaires au fonctionnement
|
||||||
du Sith tel que redis.
|
du Sith tel que redis.
|
||||||
|
|
||||||
## L'application principale
|
## L'application principale
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from ninja_extra import ControllerBase, api_controller, route
|
from ninja_extra import ControllerBase, api_controller, route
|
||||||
from ninja_extra.exceptions import NotFound
|
from ninja_extra.exceptions import NotFound
|
||||||
|
|
||||||
from core.auth.api_permissions import CanView
|
from api.permissions import CanView
|
||||||
from counter.models import BillingInfo
|
from counter.models import BillingInfo
|
||||||
from eboutic.models import Basket
|
from eboutic.models import Basket
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2025-06-01 11:06+0200\n"
|
"POT-Creation-Date: 2025-06-04 09:33+0200\n"
|
||||||
"PO-Revision-Date: 2016-07-18\n"
|
"PO-Revision-Date: 2016-07-18\n"
|
||||||
"Last-Translator: Maréchal <thomas.girod@utbm.fr\n"
|
"Last-Translator: Maréchal <thomas.girod@utbm.fr\n"
|
||||||
"Language-Team: AE info <ae.info@utbm.fr>\n"
|
"Language-Team: AE info <ae.info@utbm.fr>\n"
|
||||||
@ -35,7 +35,7 @@ msgstr ""
|
|||||||
"True si gardé à jour par le biais d'un fournisseur externe de domains "
|
"True si gardé à jour par le biais d'un fournisseur externe de domains "
|
||||||
"toxics, False sinon"
|
"toxics, False sinon"
|
||||||
|
|
||||||
#: apikey/admin.py
|
#: api/admin.py
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"The API key for %(name)s is: %(key)s. Please store it somewhere safe: you "
|
"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 "
|
"La clef d'API pour %(name)s est : %(key)s. Gardez-là dans un emplacement "
|
||||||
"sûr : vous ne pourrez pas la revoir à nouveau."
|
"sûr : vous ne pourrez pas la revoir à nouveau."
|
||||||
|
|
||||||
#: apikey/admin.py
|
#: api/admin.py
|
||||||
msgid "Revoke selected API keys"
|
msgid "Revoke selected API keys"
|
||||||
msgstr "Révoquer les clefs d'API sélectionnées"
|
msgstr "Révoquer les clefs d'API sélectionnées"
|
||||||
|
|
||||||
#: apikey/models.py club/models.py com/models.py counter/models.py
|
#: api/models.py club/models.py com/models.py counter/models.py forum/models.py
|
||||||
#: forum/models.py launderette/models.py
|
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr "nom"
|
msgstr "nom"
|
||||||
|
|
||||||
#: apikey/models.py core/models.py
|
#: api/models.py core/models.py
|
||||||
msgid "owner"
|
msgid "owner"
|
||||||
msgstr "propriétaire"
|
msgstr "propriétaire"
|
||||||
|
|
||||||
#: apikey/models.py core/models.py
|
#: api/models.py core/models.py
|
||||||
msgid "groups"
|
msgid "groups"
|
||||||
msgstr "groupes"
|
msgstr "groupes"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "client permissions"
|
msgid "client permissions"
|
||||||
msgstr "permissions du client"
|
msgstr "permissions du client"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "Specific permissions for this api client."
|
msgid "Specific permissions for this api client."
|
||||||
msgstr "Permissions spécifiques pour ce client d'API"
|
msgstr "Permissions spécifiques pour ce client d'API"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "api client"
|
msgid "api client"
|
||||||
msgstr "client d'api"
|
msgstr "client d'api"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "api clients"
|
msgid "api clients"
|
||||||
msgstr "clients d'api"
|
msgstr "clients d'api"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "prefix"
|
msgid "prefix"
|
||||||
msgstr "préfixe"
|
msgstr "préfixe"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "hashed key"
|
msgid "hashed key"
|
||||||
msgstr "hash de la clef"
|
msgstr "hash de la clef"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgctxt "api key"
|
msgctxt "api key"
|
||||||
msgid "revoked"
|
msgid "revoked"
|
||||||
msgstr "révoquée"
|
msgstr "révoquée"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "api key"
|
msgid "api key"
|
||||||
msgstr "clef d'api"
|
msgstr "clef d'api"
|
||||||
|
|
||||||
#: apikey/models.py
|
#: api/models.py
|
||||||
msgid "api keys"
|
msgid "api keys"
|
||||||
msgstr "clefs d'api"
|
msgstr "clefs d'api"
|
||||||
|
|
||||||
@ -118,8 +117,7 @@ msgstr "S'abonner"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Retirer"
|
msgstr "Retirer"
|
||||||
|
|
||||||
#: club/forms.py launderette/views.py
|
#: club/forms.py pedagogy/templates/pedagogy/moderation.jinja
|
||||||
#: pedagogy/templates/pedagogy/moderation.jinja
|
|
||||||
msgid "Action"
|
msgid "Action"
|
||||||
msgstr "Action"
|
msgstr "Action"
|
||||||
|
|
||||||
@ -220,7 +218,7 @@ msgid "You can not make loops in clubs"
|
|||||||
msgstr "Vous ne pouvez pas faire de boucles dans les clubs"
|
msgstr "Vous ne pouvez pas faire de boucles dans les clubs"
|
||||||
|
|
||||||
#: club/models.py core/models.py counter/models.py eboutic/models.py
|
#: club/models.py core/models.py counter/models.py eboutic/models.py
|
||||||
#: election/models.py launderette/models.py sas/models.py trombi/models.py
|
#: election/models.py sas/models.py trombi/models.py
|
||||||
msgid "user"
|
msgid "user"
|
||||||
msgstr "utilisateur"
|
msgstr "utilisateur"
|
||||||
|
|
||||||
@ -228,7 +226,7 @@ msgstr "utilisateur"
|
|||||||
msgid "club"
|
msgid "club"
|
||||||
msgstr "club"
|
msgstr "club"
|
||||||
|
|
||||||
#: club/models.py counter/models.py election/models.py launderette/models.py
|
#: club/models.py counter/models.py election/models.py
|
||||||
msgid "start date"
|
msgid "start date"
|
||||||
msgstr "date de début"
|
msgstr "date de début"
|
||||||
|
|
||||||
@ -289,7 +287,6 @@ msgstr "Liste de diffusion"
|
|||||||
#: club/templates/club/club_old_members.jinja club/templates/club/mailing.jinja
|
#: club/templates/club/club_old_members.jinja club/templates/club/mailing.jinja
|
||||||
#: counter/templates/counter/cash_summary_list.jinja
|
#: counter/templates/counter/cash_summary_list.jinja
|
||||||
#: counter/templates/counter/stats.jinja
|
#: counter/templates/counter/stats.jinja
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "User"
|
msgid "User"
|
||||||
msgstr "Utilisateur"
|
msgstr "Utilisateur"
|
||||||
|
|
||||||
@ -341,7 +338,6 @@ msgid "Description"
|
|||||||
msgstr "Description"
|
msgstr "Description"
|
||||||
|
|
||||||
#: club/templates/club/club_members.jinja core/templates/core/user_clubs.jinja
|
#: club/templates/club/club_members.jinja core/templates/core/user_clubs.jinja
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
#: rootplace/templates/rootplace/userban.jinja
|
#: rootplace/templates/rootplace/userban.jinja
|
||||||
msgid "Since"
|
msgid "Since"
|
||||||
msgstr "Depuis"
|
msgstr "Depuis"
|
||||||
@ -351,8 +347,7 @@ msgid "There are no members in this club."
|
|||||||
msgstr "Il n'y a pas de membres dans ce club."
|
msgstr "Il n'y a pas de membres dans ce club."
|
||||||
|
|
||||||
#: club/templates/club/club_members.jinja core/templates/core/file_detail.jinja
|
#: club/templates/club/club_members.jinja core/templates/core/file_detail.jinja
|
||||||
#: core/views/forms.py launderette/views.py
|
#: core/views/forms.py trombi/templates/trombi/detail.jinja
|
||||||
#: trombi/templates/trombi/detail.jinja
|
|
||||||
msgid "Add"
|
msgid "Add"
|
||||||
msgstr "Ajouter"
|
msgstr "Ajouter"
|
||||||
|
|
||||||
@ -483,9 +478,7 @@ msgstr "Méthode de paiement"
|
|||||||
#: counter/templates/counter/fragments/create_student_card.jinja
|
#: counter/templates/counter/fragments/create_student_card.jinja
|
||||||
#: counter/templates/counter/last_ops.jinja
|
#: counter/templates/counter/last_ops.jinja
|
||||||
#: election/templates/election/election_detail.jinja
|
#: election/templates/election/election_detail.jinja
|
||||||
#: forum/templates/forum/macros.jinja
|
#: forum/templates/forum/macros.jinja pedagogy/templates/pedagogy/guide.jinja
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
#: launderette/views.py pedagogy/templates/pedagogy/guide.jinja
|
|
||||||
#: pedagogy/templates/pedagogy/uv_detail.jinja sas/templates/sas/album.jinja
|
#: pedagogy/templates/pedagogy/uv_detail.jinja sas/templates/sas/album.jinja
|
||||||
#: sas/templates/sas/moderation.jinja sas/templates/sas/picture.jinja
|
#: sas/templates/sas/moderation.jinja sas/templates/sas/picture.jinja
|
||||||
#: trombi/templates/trombi/detail.jinja
|
#: trombi/templates/trombi/detail.jinja
|
||||||
@ -526,10 +519,6 @@ msgstr "Affiches"
|
|||||||
msgid "Counters:"
|
msgid "Counters:"
|
||||||
msgstr "Comptoirs : "
|
msgstr "Comptoirs : "
|
||||||
|
|
||||||
#: club/templates/club/club_tools.jinja
|
|
||||||
msgid "Manage launderettes"
|
|
||||||
msgstr "Gestion des laveries"
|
|
||||||
|
|
||||||
#: club/templates/club/edit_club.jinja core/templates/core/edit.jinja
|
#: club/templates/club/edit_club.jinja core/templates/core/edit.jinja
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "Edit %(name)s"
|
msgid "Edit %(name)s"
|
||||||
@ -663,9 +652,7 @@ msgstr "Outils"
|
|||||||
#: counter/templates/counter/cash_summary_list.jinja
|
#: counter/templates/counter/cash_summary_list.jinja
|
||||||
#: counter/templates/counter/counter_list.jinja
|
#: counter/templates/counter/counter_list.jinja
|
||||||
#: election/templates/election/election_detail.jinja
|
#: election/templates/election/election_detail.jinja
|
||||||
#: forum/templates/forum/macros.jinja
|
#: forum/templates/forum/macros.jinja pedagogy/templates/pedagogy/guide.jinja
|
||||||
#: launderette/templates/launderette/launderette_list.jinja
|
|
||||||
#: pedagogy/templates/pedagogy/guide.jinja
|
|
||||||
#: pedagogy/templates/pedagogy/uv_detail.jinja sas/templates/sas/album.jinja
|
#: pedagogy/templates/pedagogy/uv_detail.jinja sas/templates/sas/album.jinja
|
||||||
#: trombi/templates/trombi/detail.jinja
|
#: trombi/templates/trombi/detail.jinja
|
||||||
#: trombi/templates/trombi/edit_profile.jinja
|
#: trombi/templates/trombi/edit_profile.jinja
|
||||||
@ -1191,7 +1178,7 @@ msgid "Delete from weekmail"
|
|||||||
msgstr "Supprimer du Weekmail"
|
msgstr "Supprimer du Weekmail"
|
||||||
|
|
||||||
#: com/templates/com/weekmail_preview.jinja
|
#: com/templates/com/weekmail_preview.jinja
|
||||||
#: core/templates/core/user_account_detail.jinja launderette/views.py
|
#: core/templates/core/user_account_detail.jinja
|
||||||
#: pedagogy/templates/pedagogy/uv_detail.jinja
|
#: pedagogy/templates/pedagogy/uv_detail.jinja
|
||||||
#: trombi/templates/trombi/comment_moderation.jinja
|
#: trombi/templates/trombi/comment_moderation.jinja
|
||||||
#: trombi/templates/trombi/export.jinja
|
#: trombi/templates/trombi/export.jinja
|
||||||
@ -1686,7 +1673,7 @@ msgstr "url"
|
|||||||
msgid "param"
|
msgid "param"
|
||||||
msgstr "param"
|
msgstr "param"
|
||||||
|
|
||||||
#: core/models.py launderette/models.py
|
#: core/models.py
|
||||||
msgid "type"
|
msgid "type"
|
||||||
msgstr "type"
|
msgstr "type"
|
||||||
|
|
||||||
@ -1824,13 +1811,6 @@ msgstr "Eboutic"
|
|||||||
msgid "Services"
|
msgid "Services"
|
||||||
msgstr "Services"
|
msgstr "Services"
|
||||||
|
|
||||||
#: core/templates/core/base/navbar.jinja launderette/models.py
|
|
||||||
#: launderette/templates/launderette/launderette_book.jinja
|
|
||||||
#: launderette/templates/launderette/launderette_book_choose.jinja
|
|
||||||
#: launderette/templates/launderette/launderette_main.jinja
|
|
||||||
msgid "Launderette"
|
|
||||||
msgstr "Laverie"
|
|
||||||
|
|
||||||
#: core/templates/core/base/navbar.jinja core/templates/core/file.jinja
|
#: core/templates/core/base/navbar.jinja core/templates/core/file.jinja
|
||||||
#: core/views/files.py
|
#: core/views/files.py
|
||||||
msgid "Files"
|
msgid "Files"
|
||||||
@ -2066,12 +2046,7 @@ msgstr "Cotisant jusqu'au %(subscription_end)s"
|
|||||||
msgid "Account number: "
|
msgid "Account number: "
|
||||||
msgstr "Numéro de compte : "
|
msgstr "Numéro de compte : "
|
||||||
|
|
||||||
#: core/templates/core/macros.jinja launderette/models.py
|
|
||||||
msgid "Slot"
|
|
||||||
msgstr "Créneau"
|
|
||||||
|
|
||||||
#: core/templates/core/macros.jinja
|
#: core/templates/core/macros.jinja
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "Tokens"
|
msgid "Tokens"
|
||||||
msgstr "Jetons"
|
msgstr "Jetons"
|
||||||
|
|
||||||
@ -2908,7 +2883,7 @@ msgstr "Espèces"
|
|||||||
msgid "Credit card"
|
msgid "Credit card"
|
||||||
msgstr "Carte bancaire"
|
msgstr "Carte bancaire"
|
||||||
|
|
||||||
#: counter/apps.py counter/models.py launderette/models.py
|
#: counter/apps.py counter/models.py
|
||||||
msgid "counter"
|
msgid "counter"
|
||||||
msgstr "comptoir"
|
msgstr "comptoir"
|
||||||
|
|
||||||
@ -3104,7 +3079,7 @@ msgstr "Bureau"
|
|||||||
msgid "sellers"
|
msgid "sellers"
|
||||||
msgstr "vendeurs"
|
msgstr "vendeurs"
|
||||||
|
|
||||||
#: counter/models.py launderette/models.py
|
#: counter/models.py
|
||||||
msgid "token"
|
msgid "token"
|
||||||
msgstr "jeton"
|
msgstr "jeton"
|
||||||
|
|
||||||
@ -3316,7 +3291,6 @@ msgid "There is no cash register summary in this website."
|
|||||||
msgstr "Il n'y a pas de relevé de caisse dans ce site web."
|
msgstr "Il n'y a pas de relevé de caisse dans ce site web."
|
||||||
|
|
||||||
#: counter/templates/counter/counter_click.jinja
|
#: counter/templates/counter/counter_click.jinja
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "Selling"
|
msgid "Selling"
|
||||||
msgstr "Vente"
|
msgstr "Vente"
|
||||||
|
|
||||||
@ -3340,8 +3314,6 @@ msgstr "Annuler (ANN)"
|
|||||||
#: counter/templates/counter/fragments/create_refill.jinja
|
#: counter/templates/counter/fragments/create_refill.jinja
|
||||||
#: counter/templates/counter/fragments/create_student_card.jinja
|
#: counter/templates/counter/fragments/create_student_card.jinja
|
||||||
#: counter/templates/counter/invoices_call.jinja
|
#: counter/templates/counter/invoices_call.jinja
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
#: launderette/templates/launderette/launderette_click.jinja
|
|
||||||
#: sas/templates/sas/picture.jinja
|
#: sas/templates/sas/picture.jinja
|
||||||
#: subscription/templates/subscription/stats.jinja
|
#: subscription/templates/subscription/stats.jinja
|
||||||
msgid "Go"
|
msgid "Go"
|
||||||
@ -3409,7 +3381,6 @@ msgid "There is no counters in this website."
|
|||||||
msgstr "Il n'y a pas de comptoirs dans ce site web."
|
msgstr "Il n'y a pas de comptoirs dans ce site web."
|
||||||
|
|
||||||
#: counter/templates/counter/counter_main.jinja
|
#: counter/templates/counter/counter_main.jinja
|
||||||
#: launderette/templates/launderette/launderette_click.jinja
|
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid "%(counter_name)s counter"
|
msgid "%(counter_name)s counter"
|
||||||
msgstr "Comptoir %(counter_name)s"
|
msgstr "Comptoir %(counter_name)s"
|
||||||
@ -4307,117 +4278,6 @@ msgstr "Galaxie de %(user_name)s"
|
|||||||
msgid "This citizen has not yet joined the galaxy"
|
msgid "This citizen has not yet joined the galaxy"
|
||||||
msgstr "Ce citoyen n'a pas encore rejoint la galaxie"
|
msgstr "Ce citoyen n'a pas encore rejoint la galaxie"
|
||||||
|
|
||||||
#: launderette/models.py
|
|
||||||
msgid "launderette"
|
|
||||||
msgstr "laverie"
|
|
||||||
|
|
||||||
#: launderette/models.py
|
|
||||||
msgid "is working"
|
|
||||||
msgstr "fonctionne"
|
|
||||||
|
|
||||||
#: launderette/models.py
|
|
||||||
msgid "Machine"
|
|
||||||
msgstr "Machine"
|
|
||||||
|
|
||||||
#: launderette/models.py
|
|
||||||
msgid "borrow date"
|
|
||||||
msgstr "date d'emprunt"
|
|
||||||
|
|
||||||
#: launderette/models.py
|
|
||||||
msgid "Token"
|
|
||||||
msgstr "Jeton"
|
|
||||||
|
|
||||||
#: launderette/models.py launderette/views.py
|
|
||||||
msgid "Token name can not be blank"
|
|
||||||
msgstr "Le nom du jeton ne peut pas être vide"
|
|
||||||
|
|
||||||
#: launderette/models.py
|
|
||||||
msgid "machine"
|
|
||||||
msgstr "machine"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "Launderette admin"
|
|
||||||
msgstr "Gestion de la laverie"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "Sell"
|
|
||||||
msgstr "Vendre"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "Machines"
|
|
||||||
msgstr "Machines"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "New machine"
|
|
||||||
msgstr "Nouvelle machine"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
#: launderette/views.py
|
|
||||||
msgid "Type"
|
|
||||||
msgstr "Type"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_admin.jinja
|
|
||||||
msgid "Name"
|
|
||||||
msgstr "Nom"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_book.jinja
|
|
||||||
msgid "Choose"
|
|
||||||
msgstr "Choisir"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_book.jinja
|
|
||||||
msgid "Washing and drying"
|
|
||||||
msgstr "Lavage et séchage"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_book.jinja sith/settings.py
|
|
||||||
msgid "Washing"
|
|
||||||
msgstr "Lavage"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_book.jinja sith/settings.py
|
|
||||||
msgid "Drying"
|
|
||||||
msgstr "Séchage"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_list.jinja
|
|
||||||
msgid "Launderette admin list"
|
|
||||||
msgstr "Liste des laveries"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_list.jinja
|
|
||||||
msgid "New launderette"
|
|
||||||
msgstr "Nouvelle laverie"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_list.jinja
|
|
||||||
msgid "There is no launderette in this website."
|
|
||||||
msgstr "Il n'y a pas de laverie dans ce site web."
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_main.jinja
|
|
||||||
msgid "Edit presentation page"
|
|
||||||
msgstr "Éditer la page de présentation"
|
|
||||||
|
|
||||||
#: launderette/templates/launderette/launderette_main.jinja
|
|
||||||
msgid "Book launderette slot"
|
|
||||||
msgstr "Réserver un créneau de laverie"
|
|
||||||
|
|
||||||
#: launderette/views.py
|
|
||||||
msgid "Tokens, separated by spaces"
|
|
||||||
msgstr "Jetons, séparés par des espaces"
|
|
||||||
|
|
||||||
#: launderette/views.py
|
|
||||||
#, python-format
|
|
||||||
msgid "Token %(token_name)s does not exists"
|
|
||||||
msgstr "Le jeton %(token_name)s n'existe pas"
|
|
||||||
|
|
||||||
#: launderette/views.py
|
|
||||||
#, python-format
|
|
||||||
msgid "Token %(token_name)s already exists"
|
|
||||||
msgstr "Un jeton %(token_name)s existe déjà"
|
|
||||||
|
|
||||||
#: launderette/views.py
|
|
||||||
msgid "User has booked no slot"
|
|
||||||
msgstr "L'utilisateur n'a pas réservé de créneau"
|
|
||||||
|
|
||||||
#: launderette/views.py
|
|
||||||
msgid "Token not found"
|
|
||||||
msgstr "Jeton non trouvé"
|
|
||||||
|
|
||||||
#: matmat/templates/matmat/search_form.jinja
|
#: matmat/templates/matmat/search_form.jinja
|
||||||
msgid "Search user"
|
msgid "Search user"
|
||||||
msgstr "Rechercher un utilisateur"
|
msgstr "Rechercher un utilisateur"
|
||||||
|
@ -86,10 +86,11 @@ nav:
|
|||||||
- antispam:
|
- antispam:
|
||||||
- reference/antispam/models.md
|
- reference/antispam/models.md
|
||||||
- reference/antispam/forms.md
|
- reference/antispam/forms.md
|
||||||
- apikey:
|
- api:
|
||||||
- reference/apikey/auth.md
|
- reference/api/auth.md
|
||||||
- reference/apikey/hashers.md
|
- reference/api/hashers.md
|
||||||
- reference/apikey/models.md
|
- reference/api/models.md
|
||||||
|
- reference/api/perms.md
|
||||||
- club:
|
- club:
|
||||||
- reference/club/models.md
|
- reference/club/models.md
|
||||||
- reference/club/views.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.exceptions import NotFound
|
||||||
from ninja_extra.pagination import PageNumberPaginationExtra, PaginatedResponseSchema
|
from ninja_extra.pagination import PageNumberPaginationExtra, PaginatedResponseSchema
|
||||||
|
|
||||||
from apikey.auth import ApiKeyAuth
|
from api.auth import ApiKeyAuth
|
||||||
from core.auth.api_permissions import HasPerm
|
from api.permissions import HasPerm
|
||||||
from pedagogy.models import UV
|
from pedagogy.models import UV
|
||||||
from pedagogy.schemas import SimpleUvSchema, UvFilterSchema, UvSchema
|
from pedagogy.schemas import SimpleUvSchema, UvFilterSchema, UvSchema
|
||||||
from pedagogy.utbm_api import UtbmApiClient
|
from pedagogy.utbm_api import UtbmApiClient
|
||||||
|
@ -13,8 +13,8 @@ from ninja_extra.permissions import IsAuthenticated
|
|||||||
from ninja_extra.schemas import PaginatedResponseSchema
|
from ninja_extra.schemas import PaginatedResponseSchema
|
||||||
from pydantic import NonNegativeInt
|
from pydantic import NonNegativeInt
|
||||||
|
|
||||||
from apikey.auth import ApiKeyAuth
|
from api.auth import ApiKeyAuth
|
||||||
from core.auth.api_permissions import (
|
from api.permissions import (
|
||||||
CanAccessLookup,
|
CanAccessLookup,
|
||||||
CanEdit,
|
CanEdit,
|
||||||
CanView,
|
CanView,
|
||||||
|
@ -125,7 +125,7 @@ INSTALLED_APPS = (
|
|||||||
"pedagogy",
|
"pedagogy",
|
||||||
"galaxy",
|
"galaxy",
|
||||||
"antispam",
|
"antispam",
|
||||||
"apikey",
|
"api",
|
||||||
)
|
)
|
||||||
|
|
||||||
MIDDLEWARE = (
|
MIDDLEWARE = (
|
||||||
|
Loading…
x
Reference in New Issue
Block a user