Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ajout d'un générateur de numeros de datapass ID #595

Merged
merged 1 commit into from
Mar 29, 2022

Conversation

mrjmad
Copy link
Collaborator

@mrjmad mrjmad commented Mar 29, 2022

🌮 Objectif

Proposition d'une méthode sereine pour generer des datapassid en evitant les collisions possibles

🔍 Implémentation

Une nouvelle table pour stocker le dernier numéro, une migration de donnée pour le positionner a 10000 et une fonction de génération utilisation select_for_update et les F pour éviter les collisions de générations.

j'ai choisi d'avoir une table qui pourrait stocker plusieurs "id généré" au cas ou.

🏕 Amélioration continue

  • (optionnel) Une liste d'autres modifications pas en lien direct avec la PR

⚠️ Informations supplémentaires

(optionnel) Documentation, commandes à lancer, variables d'environment, etc

🖼️ Images

(optionnel) Une ou plusieurs captures d'écran

class IdGenerator(models.Model):
code = models.CharField(max_length=100, unique=True)
last_id = models.PositiveIntegerField()

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On pourrait rajouter un unique_together sur code / last_id, mais je ne l'ai pas fait, je ne sais pas ce que vous en pensez.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le unique sur code me semble suffisant (et nécessaire).

@@ -1440,6 +1440,11 @@ def createTOTPDevice(self, confirmed=False, tolerance=30):
)


class IdGenerator(models.Model):
code = models.CharField(max_length=100, unique=True)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ici un ajout d'un code pour pouvoir utiliser la table pour générer plusieurs ID, au cas où

id_datapass.last_id = F('last_id') + 1
id_datapass.save()
id_datapass.refresh_from_db()
return id_datapass.last_id
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On bloque la table sur la ligne qui nous intéresse et on calcule la nouvelle valeur que l'on renvoie.

L'utilisation du F oblige à faire un refresh_from_db.


import qrcode

if TYPE_CHECKING:
from aidants_connect_web.models import Aidant, Usager


@transaction.atomic
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question : si on est dans une autre fonction "transaction.atomic" et qu'on appelle un generate_new_datapass_id(), est-ce que ça va marcher correctement ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oui ca va "empiler" les transactions

@mrjmad mrjmad force-pushed the jmad_generate_datapass_id branch 2 times, most recently from 2c136e7 to c539b29 Compare March 29, 2022 07:56
@christophehenry
Copy link
Collaborator

Bon, j'avoue, je comprends pas bien ce qu'il se passe dans cette PR. Je vais faire confiance à mes collègues.

@tut-tuuut tut-tuuut changed the title Ajout d'une generateur de numero de datapass ID Ajout d'un générateur de numeros de datapass ID Mar 29, 2022
@mrjmad mrjmad merged commit f65b55a into main Mar 29, 2022
@mrjmad mrjmad deleted the jmad_generate_datapass_id branch December 15, 2022 23:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants