Merge branch 'Evarin/signaux' into 'master'

Signaux de création

See merge request klub-dev-ens/authens!24
This commit is contained in:
Ludovic Stephan 2021-01-21 23:01:11 +01:00
commit 3cd466fba0
3 changed files with 42 additions and 2 deletions

View file

@ -79,7 +79,11 @@ AUTHENS_USE_OLDCAS = False
Il peut être utile de définir ce paramètre. Il peut être utile de définir ce paramètre.
## Création d'utilisateurices ## Utilisation
À lire
### Création d'utilisateurices
AuthENS maintient une tables des comptes clipper connus. AuthENS maintient une tables des comptes clipper connus.
Cette table est automatiquement mise à jour lors qu'une personne se connecte via Cette table est automatiquement mise à jour lors qu'une personne se connecte via
@ -111,7 +115,9 @@ def create_user_view(requests, cas_login: str):
``` ```
## Migration depuis `django_cas_ng` ## Utilisation avancée
### Migration depuis `django_cas_ng`
Pour migrer depuis `django_cas_ng`, il est recommandé de faire une Pour migrer depuis `django_cas_ng`, il est recommandé de faire une
[data migration](https://docs.djangoproject.com/en/3.1/howto/writing-migrations/#migrating-data-between-third-party-apps) [data migration](https://docs.djangoproject.com/en/3.1/howto/writing-migrations/#migrating-data-between-third-party-apps)
@ -138,3 +144,21 @@ def migrate_user(user: User):
user=user, cas_login=user.username, entrance_year=entrance_year user=user, cas_login=user.username, entrance_year=entrance_year
) )
``` ```
### Utilisation des signaux
Authens émet le signal `authens.signals.post_cas_connect` à chaque fois qu'un
compte CAS se connecte. Le signal est envoyé avec les arguments suivants :
- `sender` : la classe Django utilisée pour stocker l'utilisateurice
(vraisemblablement la class `User` par défaut);
- `instance` : l'utilisateurice concerné⋅e;
- `created` : un booléen valant `True` si l'utilisateurice vient d'être créé⋅e
(première connexion);
- `cas_login` : le login CAS de la personne;
- `attributes` : un dictionnaire contenant des informations supplémentaires sur
le compte, fournies par le CAS.

View file

@ -2,6 +2,7 @@ from django.contrib.auth import get_user_model
from django.db import transaction from django.db import transaction
from authens.models import CASAccount, OldCASAccount from authens.models import CASAccount, OldCASAccount
from authens.signals import post_cas_connect
from authens.utils import get_cas_client, parse_entrance_year from authens.utils import get_cas_client, parse_entrance_year
UserModel = get_user_model() UserModel = get_user_model()
@ -94,6 +95,7 @@ class ENSCASBackend:
if entrance_year is None: if entrance_year is None:
raise ENSCASError("Entrance year not available") raise ENSCASError("Entrance year not available")
account_created = False
with transaction.atomic(): with transaction.atomic():
try: try:
user = UserModel.objects.get(cas_account__cas_login=cas_login) user = UserModel.objects.get(cas_account__cas_login=cas_login)
@ -114,6 +116,15 @@ class ENSCASBackend:
CASAccount.objects.create( CASAccount.objects.create(
user=user, entrance_year=entrance_year, cas_login=cas_login user=user, entrance_year=entrance_year, cas_login=cas_login
) )
account_created = True
post_cas_connect.send(
UserModel,
instance=user,
created=account_created,
cas_login=cas_login,
attributes=attributes,
)
return user return user
# Django boilerplate. # Django boilerplate.

5
authens/signals.py Normal file
View file

@ -0,0 +1,5 @@
import django.dispatch
# Envoyé depuis authens.backends.ENSCASBackend
# Doc dans le README.
post_cas_connect = django.dispatch.Signal()