-
Notifications
You must be signed in to change notification settings - Fork 4
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
🎁 Suggestion de changement v1 #1141
base: main
Are you sure you want to change the base?
Conversation
42a0906
to
8eeabc5
Compare
verbose_name=dedent( | ||
"""Données de debug de la suggestion | ||
(quelles données ont été utilisées pour la suggestion)""" | ||
), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
verbose_name=dedent( | |
"""Données de debug de la suggestion | |
(quelles données ont été utilisées pour la suggestion)""" | |
), | |
verbose_name="Données de debug de la suggestion" | |
"(quelles données ont été utilisées pour la suggestion)", |
Suggestion : python permet d'écrire des strings sur plusieurs lignes dans ce genre de situations
verbose_name=dedent( | ||
"""Données du changement | ||
(stocker uniquement le strict minimum pour | ||
gérer le changement)""" | ||
), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
verbose_name=dedent( | |
"""Données du changement | |
(stocker uniquement le strict minimum pour | |
gérer le changement)""" | |
), | |
verbose_name="Données du changement" | |
"(stocker uniquement le strict minimum pour | |
gérer le changement)", |
Suggestion : idem ci-dessus
# On remplit review_at si la revue est effectuée ET | ||
# que c'est la première fois qu'on change le statut (sinon | ||
# on garde la valeur originale) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remarque : Je ne suis pas forcément pour ajouter ce type de commentaires dans le code qui paraphrasent ce qui est lisible à la lecture des conditions
(ex: pour un cluster d'acteur = cluster_id -> acteur_id). Ne pas stocker | ||
d'autres données qui pourraient devenir obsolètes au moment de la revue. | ||
Si on souhaite fournir de la donnée supplémentaire, il faut le faire à | ||
la vollée (ex: au moment de l'affichage ou de l'export) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
la vollée (ex: au moment de l'affichage ou de l'export) | |
la volée (ex: au moment de l'affichage ou de l'export) |
Petite typo
# Validations spécifiques aux différents types de changements | ||
if self.change_type == "acteur_cluster": | ||
if not isinstance(self.change_data, dict): | ||
raise ValueError("acteur_cluster: change_data doit être un dict pour ") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remarque : Je pense qu'il manque un bout du commentaire ici
@@ -1,6 +1,7 @@ | |||
from .acteur import * # noqa | |||
from .action import * # noqa | |||
from .categorie_objet import * # noqa | |||
from .change_suggestion import * # noqa |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion : ici on suit ce qui se faisait, mais tant qu'à faire ignorons explicitement la règle qui nous ennuie
from .change_suggestion import * # noqa | |
from .change_suggestion import * # noqa: F403 |
|
||
|
||
class ChangeSuggestionAdmin(admin.ModelAdmin): | ||
# Pour l'instant on consèrve le modèle admin par défaut |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
# Pour l'instant on consèrve le modèle admin par défaut | |
# Pour l'instant on conserve le modèle admin par défaut |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
J'ai fait quelques retours sur la forme (non bloquants).
Sur le fond, les séries de champs préfixés me font me dire qu'on aurait presque intérêt à avoir deux modèles distincts, change
et review
:
- Un changement peut avoir n reviews
- Une fois que toutes les reviews sont fermées / validées, on passe le changement en approuvé
Mais j'ai peut-être mal compris quelque chose ?
Concernant le JSONField, aucune objection si ce n'est que un jour on doit migrer des données (via des migrations Django), les JSONField demandent pas mal de travail, donc il faudra être vigilant à la rétrocompatibilité si on construit une UI autour de ces champs.
Mais globalement je trouve ça top !
""" | ||
Modèle de données Django pour les suggestions de changements | ||
""" | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
""" | |
Modèle de données Django pour les suggestions de changements | |
""" |
Suggestion : je pense que c'est un reliquat, le commentaire est répété plus bas en docstring de la classe
if not isinstance(self.change_data, (dict, list)): | ||
raise ValueError("change_data doit être un dict ou list") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Question : c'est possible ça ? Que la valeur ne soit pas du bon type ?
Je pense que le validateur django (du fait de l'utilisation du JSONField) va exploser de lui même si tu tentes de lui passer autre chose. Mais à tester quand même
Suggestion : Aussi, comme on est dans clean, est-ce qu'on ne lèverait pas plutôt une ValidationError
Cf https://docs.djangoproject.com/en/5.1/ref/forms/validation/#raising-validationerror
raise ValueError("change_data doit être un dict ou list") | ||
|
||
# Validations spécifiques aux différents types de changements | ||
if self.change_type == "acteur_cluster": |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion :
Je ne me rends pas compte du nombre de change_type
qu'on va gérer à terme, mais en prévision d'un nombre approchant la dizaine, je serais assez partisan de sortir la validation du modèle, et mapper ça tout en haut de notre module, car plus je review et moins c'est lisible pour moi ce qu'on fait.
Genre quelque chose comme
# models.py
from .validators import validate_acteur_cluster
# ...
change_data_validators = {
"acteur_cluster": validate_acteur_cluster
}
# ...
class ChangeSuggestion(models.Model):
def clean(self):
# ...
try:
change_data_validators[self.change_type](self.change_data)
except KeyError:
raise NotImplementedError(f"Pas de gestion change_data pour: {self.change_type}")
# validators.py
def validate_acteur_cluster(value):
if not isinstance(value, dict):
raise ValidationError("acteur_cluster: change_data doit être un dict pour ")
acteur_id = value.get("acteur_id")
cluster_id = value.get("cluster_id")
if not acteur_id:
raise ValidationError("acteur_cluster: change_data à besoin de acteur_id")
if not cluster_id:
raise ValidationError("acteur_cluster: change_data à besoin de cluster_id")
verbose_name="Type de changement", | ||
) | ||
change_data = models.JSONField( | ||
verbose_name=dedent( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggestion (à tester) : les champs Django disposent d'un attribut validators
auquel tu peux passer des validateurs sur ton champ.
Cf ce commentaire je me demande si ce n'est pas ce qu'on voudrait faire ici
- au save, executer un validateur custom sur notre champ
- faire redescendre toute la logique de validation au niveau du champ lui-même
Je précise à tester car je n'ai jamais testé avec un JSONField
, mais je ne vois pas pourquoi ça ne pourrait pas fonctionner.
C'est un simple callable qu'on passe à notre définition de champ, qui sera appelé durant la validation du champ côté python
🎁 Suggestion de changement v1
Carte Notion : CLUSTERING: Modèles & UI django pour le stockage des clusters
Approche
JSON
pour représenter le changement, car tout changement n'aura pas la même structure (ex: pour le clustering on a besoin d'un cluster_id, pas pour le diff d'ingestion des acteurs)JSON
JSONField
dans notre code (ex:DagRun.meta_data
) mais je ne trouve pas de validation associéeJSONField
avec de la validation dans le modèle sousclean
➡️ Restant à faire