Faire que l’api générique crud sur les usagers gère l’unicité du numéro en cas d’authn tél activée (#83700) #181
No reviewers
Labels
No Label
No Milestone
No Assignees
2 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: entrouvert/authentic#181
Loading…
Reference in New Issue
No description provided.
Delete Branch "wip/83700-api-users-crud-phone-uniqueness-tel"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
2df0b9c7f5
to3f6f4b4a3b
3f6f4b4a3b
to3337c9e1ef
3337c9e1ef
toea99d2bc15
ea99d2bc15
todf6d1011f0
df6d1011f0
tofe1634044f
fe1634044f
tod5cf4091b7
WIP: Faire que l’api générique crud sur les usagers gère l’unicité du numéro en cas d’authn tél activée (#83700)to Faire que l’api générique crud sur les usagers gère l’unicité du numéro en cas d’authn tél activée (#83700)@ -145,6 +145,7 @@ def extract_settings_from_environ():
'A2_CAN_RESET_PASSWORD',
'A2_REGISTRATION_CAN_DELETE_ACCOUNT',
'A2_REGISTRATION_EMAIL_IS_UNIQUE',
'A2_REGISTRATION_PHONE_IS_UNIQUE',
Ça arrive de #82737 il me semble, à retirer.
Ok, en effet, erreur de rebasage, je retire.
@ -68,6 +68,7 @@ class OrganizationalUnitAdmin(admin.ModelAdmin):
'description',
'username_is_unique',
'email_is_unique',
'phone_is_unique',
Ça arrive de #82737 il me semble, à retirer.
Là c’est un souci d’empilement de PR dans gitea. Cette présente PR a d’ailleurs été fermée par erreur de ma part, je vais rouvrir et configurer correctement pour que les modification (déjà mergées) de #82737 n’apparaissent plus ici.
@ -0,0 +1,17 @@
# Generated by Django 3.2.18 on 2023-11-06 15:47
Ça arrive de #82737 il me semble, à retirer.
@ -545,0 +558,4 @@
ou = attrs.get('ou', None) or get_default_ou()
if ou.phone_is_unique:
qs = qs.annotate(
ou_id=models.expressions.RawSQL(
On peut utiliser une subquery avec OuterRef pour ça :
Oui complètement, je vais modifier.
C’est modifié.
@ -545,0 +564,4 @@
(),
),
).filter(ou_id=ou.id)
elif not app_settings.A2_PHONE_IS_UNIQUE: # skip uniqueness checks
Je ne m'embêterai pas avec ça on va considérer juste l'unicité au niveau de l'ou; en multico c'est ce qu'on veut de toute façon. On peut même virer les settings correspondant partout, pareil pour A2_REGISTRATION_PHONE_IS_UNIQUE. Tu pourrais déplacer le
errors['attributes'] = ...
directement dans le if ainsi et retirer lereturn attrs
précoce.Ok, faisons simple, je vais virer tout ça.
Après réflexion je me dis qu’on pourrait laisser ces settings globaux maintenant qu’ils sont implémentés et testés, qu’il y a peut-être quand même des cas de multico où on veut quand même un téléphone unique partout ?
(Par contre bien sûr dans cette partie du code il y avait un bug, un
return attrs
en dépit de toute gestion des erreurs précédemment relevées, c’est corrigé dans cette nouvelle version de la PR.)Faire que l’api générique crud sur les usagers gère l’unicité du numéro en cas d’authn tél activée (#83700)to WIP: Faire que l’api générique crud sur les usagers gère l’unicité du numéro en cas d’authn tél activée (#83700)f01cc42c60
to41ea8c80c1
41ea8c80c1
to609167f6e5
609167f6e5
to70e2e2e6ce
WIP: Faire que l’api générique crud sur les usagers gère l’unicité du numéro en cas d’authn tél activée (#83700)to Faire que l’api générique crud sur les usagers gère l’unicité du numéro en cas d’authn tél activée (#83700)70e2e2e6ce
tobfa0a62ed3
@ -419,6 +419,7 @@ class BaseUserSerializer(serializers.ModelSerializer):
if ou and ou.email_is_unique and qs.filter(ou=ou, email__iexact=attrs['email']).exists():
already_used = True
authenticator = utils_misc.get_password_authenticator()
Déplacer la ligne plus bas, il n'y a pas de raison de la mettre là et ça fait un changement plus compact.
@ -434,6 +435,31 @@ class BaseUserSerializer(serializers.ModelSerializer):
hasher.safe_summary(attrs.get('hashed_password'))
except Exception:
errors['hashed_password'] = 'hash format error'
if authenticator.is_phone_authn_active and (
En restant dans une logique Django ce code devrait faire partie d'un User.clean() (c'est d'ailleurs peut-être déjà le cas) et être réutilisé, je ne vais pas demander ça ici, mais il faudrait garder ça à l'esprit, les contraintes sur les modèles doivent rester autant que possible dans les modèles.
@ -437,0 +445,4 @@
if self.instance:
qs.exclude(object_id=self.instance.id)
else:
qs.exclude(object_id__isnull=True)
Je pense que ça n'a pas d'effet, aucun attribut ne devrait être accroché à rien, la branche else peut être retirée, ou si c'est un vrai problème observé il faudrait nettoyer tous ces attributs qui traînent.
@ -437,0 +452,4 @@
if not ou.phone_is_unique:
qs = qs.none()
else:
qs = qs.annotate(
Ça s'écrit plus simplement
.filter(object_id__in=User.objects.filter(ou=ou).values_list('id'))
, je ne suis même pas certain que le values_list() soit nécessaire.Avec quelques remarques.
Merci, je vais inclure tes remarques puis pousser dans la branche main.
bfa0a62ed3
to44b323f87c
8b566b819c
to0abfbc9480