Développement #107887
revoir le stockage des cellules
0%
Description
Plutôt qu'une table par type de cellule, je pense maintennt qu'on devrait avoir une unique table, qui aurait une colonne class_name pour instancier la classe associée au type de cellule et une colonne jsonb avec les attributs supplémentaires.
Au moins :
- ça éviterait de multiplier les migrations quand CellBase change
- ça éviterait de maintenir un cache des types de cellule utilisés dans une page
History
Updated by Gael Pasgrimaud 8 days ago
Est-ce qu'on ne pourrait pas juste ajouter un champs jsonb dans CellBase ? Ca ferait faire, à priori, une unique dernière grosse migration
J'ai peur qu'à vouloir tout mettre dans une table on doivent se priver ou contourner pas mal de chose "builtin" django (comme déduire les formulaires des modeles etc.)
Updated by Frédéric Péters 8 days ago
Est-ce qu'on ne pourrait pas juste ajouter un champs jsonb dans CellBase ? Ca ferait faire, à priori, une unique dernière grosse migration
Je ne suis pas sûr de comprendre. Il faut de toute façon des classes individuelles pour la partie "logique métier", c'est comme ça que j'arrive à "une colonne avec la classe" + "une colonne jsonb".
J'ai peur qu'à vouloir tout mettre dans une table on doivent se priver ou contourner pas mal de chose "builtin" django (comme déduire les formulaires des modeles etc.)
J'ai commencé une branche, en local mais je vais la pousser pour expliciter, je pense que ça tient la route.
Updated by Gael Pasgrimaud 8 days ago
Frédéric Péters a écrit :
J'ai commencé une branche, en local mais je vais la pousser pour expliciter, je pense que ça tient la route.
Fais donc, ça dépends en effet de l'implémentation et je ne sais pas du tout ce que tu as à l'esprit. Si toutes les cellules continu d'être des Model et qu'on est pas obligé de repasser sur tous les formulaires/templates/vues ça m'ira sûrement.
Updated by Frédéric Péters 8 days ago
- Status changed from Nouveau to En cours
🤖 Une pull request concernant ce ticket a été ouverte :
- URL : https://git.entrouvert.org/entrouvert/combo/pulls/538
- Titre : WIP: table unique pour différents types de cellules (#107887)
- Modifications : https://git.entrouvert.org/entrouvert/combo/pulls/538/files
Updated by Frédéric Péters 8 days ago
J'ai poussé ma branche très brouillon pour donner ma direction générale, avec une approche qui permet d'avancer progressivement. (je ne comptais pas la proposer si tôt).
Updated by Gael Pasgrimaud 7 days ago
Je comprends mieux l'idée (et je ne connaissais pas proxy = True
)
Après avoir compris, le seul truc qui me gène c'est que tu ai besoin d'avoir plus d'une clé en face d'un champs (comme default/foreign)
Ca serait top si on pouvait se contenter de {'champs_de_formulaire': forms.CharField(), 'données_non_affichée': True/1/dict/datetime.now}
Il devrait être possible d'utiliser initial pour default et isinstance(field, forms.Model*)
pour foreign (je n'ai vu que ces deux là)
Updated by Frédéric Péters 7 days ago
Je comprends mieux l'idée (et je ne connaissais pas proxy = True)
Pareil j'ai découvert à cette occasion.
Ca serait top si on pouvait se contenter de {'champs_de_formulaire': forms.CharField(), 'données_non_affichée': True/1/dict/datetime.now}
Oui j'avais commencé ainsi, c'est en convertissant certaines cellules que j'ai du étendre; je vais voir pour essayer d'éliminer default/foreign, et continuer à convertir d'autres cellules et voir si ça suffit.
Updated by Frédéric Péters about 15 hours ago
Il devrait être possible d'utiliser initial pour default
(oui)
et isinstance(field, forms.Model*) pour foreign (je n'ai vu que ces deux là)
J'ai testé et cette partie ne peut pas marcher aussi simplement, sur la conversion de la cellule "LatestPageUpdatesCell ça ferait une déclaration de type forms.ModelChoice(..., queryset=Page.objects.all()), et ça échoue parce qu'au moment où on a besoin de l'info (dans la metaclass), tout n'est pas encore prêt,
File "/home/fred/src/eo/venv/lib/python3.13/site-packages/django/apps/registry.py", line 143, in check_models_ready raise AppRegistryNotReady("Models aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
Contre ça, j'avais donc l'approche de poser un attribut sur le côté, pour ne pas devoir créer le Field à ce moment; une autre approche serait de séparer et avoir genre field_class et field_kwargs, pour qu'au début on puisse juste regarder field_class (approche prise dans la branche à ce moment); mais peut-être que le mieux serait de demander un peu de modifications aux classes converties, et créer une classe dérivée de ModelField qui n'instancierait pas le queryset dès le début (i.e. qui le ferait dans sa méthode get_queryset). Je n'ai pas codé cette approche mais je pense que ça serait le mieux et que je vais le faire.
Updated by Frédéric Péters about 14 hours ago
créer une classe dérivée de ModelField qui n'instancierait pas le queryset dès le début (i.e. qui le ferait dans sa méthode get_queryset). Je n'ai pas codé cette approche mais je pense que ça serait le mieux et que je vais le faire
Ça ne marche en fait pas aussi simplement que ça; ModelChoiceField n'est pas prévu pour avoir un get_queryset() sous forme de méthode, et initialise le widget associé avec une liste de choix dès l'__init__, donc il a besoin du queryset très tôt. (la possibilité reste de mettre un widget spécifique).