Project

General

Profile

Développement #107887

revoir le stockage des cellules

Added by Frédéric Péters 10 days ago. Updated about 14 hours ago.

Status:
En cours
Priority:
Normal
Target version:
-
Start date:
04 July 2025
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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

#1

Updated by Frédéric Péters 8 days ago

  • Assignee set to Frédéric Péters
#2

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.)

#3

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.

#4

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.

#5

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 :

#6

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).

#7

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à)

#8

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.

#9

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.

#10

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).

Also available in: Atom PDF