https://dev.entrouvert.org/https://dev.entrouvert.org/favicon.ico?15861920342021-10-01T13:01:21ZRedmine Entr’ouvertAuthentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3299042021-10-01T13:01:21ZPaul Marillonnet
<ul><li><strong>Assigné à</strong> mis à <i>Paul Marillonnet</i></li></ul> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3308512021-10-06T10:17:36ZPaul Marillonnet
<ul><li><strong>Statut</strong> changé de <i>Nouveau</i> à <i>En cours</i></li></ul><p>Hmm, j’ai commencé à pousser un truc dans la branche. Le build laisse à penser que django teste la possibilité d’évaluer certaines des expressions <code>F()</code> du patch avant l’exécution de la migration. Je regarde.</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3317672021-10-12T08:52:56ZPaul Marillonnet
<ul><li><strong>Fichier</strong> <a href="/attachments/58363">0001-rbac-add-created-deleted-fields-on-RoleParenting-mod.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58363/0001-rbac-add-created-deleted-fields-on-RoleParenting-mod.patch">0001-rbac-add-created-deleted-fields-on-RoleParenting-mod.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58361">0002-rbac-add-soft-created-deleted-model-methods-57500.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58361/0002-rbac-add-soft-created-deleted-model-methods-57500.patch">0002-rbac-add-soft-created-deleted-model-methods-57500.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58362">0003-rbac-add-manager-soft-deletion-shortcut-filters-5750.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58362/0003-rbac-add-manager-soft-deletion-shortcut-filters-5750.patch">0003-rbac-add-manager-soft-deletion-shortcut-filters-5750.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58364">0004-rbac-perform-soft-deletion-of-roleparenting-pairings.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58364/0004-rbac-perform-soft-deletion-of-roleparenting-pairings.patch">0004-rbac-perform-soft-deletion-of-roleparenting-pairings.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58365">0005-rbac-update_or_create-roleparenting-for-update_trans.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58365/0005-rbac-update_or_create-roleparenting-for-update_trans.patch">0005-rbac-update_or_create-roleparenting-for-update_trans.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58366">0006-apply-soft-deletion-logic-when-retrieving-roleparent.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58366/0006-apply-soft-deletion-logic-when-retrieving-roleparent.patch">0006-apply-soft-deletion-logic-when-retrieving-roleparent.patch</a> ajouté</li><li><strong>Tracker</strong> changé de <i>Support</i> à <i>Bug</i></li><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Solution proposée</i></li><li><strong>Patch proposed</strong> changé de <i>Non</i> à <i>Oui</i></li></ul><p>Voilà ce qui me paraît être la bonne approche. Si on me valide l’approche, en amont de la relecture et indépendamment du ack sur le code, je peux d’ores et déjà commencer <a class="issue tracker-2 status-1 priority-4 priority-default" title="Development: Ajouter des champs created et deleted (soft delete) sur Role.members.through (Nouveau)" href="https://dev.entrouvert.org/issues/57499">#57499</a> qui fait la même chose pour <code>Roles.members.through</code>.</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3318432021-10-12T13:17:27ZBenjamin Dauvergne
<ul></ul><p>L'implémentation de soft_delete() me semble ok, mais soft_create() je ne pense pas qu'on voudrait l'exposer comme ça, mais j'ai pas encore tout lu, je continue.</p>
<hr />
<p>Sur un "soft create" il faut remettre "deleted" à NULL, et donc pas besoin de filtre "deleted__lte=F('created')" le seul filtre à avoir c'est deleted__isnull=True quand on cherche les parents/enfants d'un rôle.</p>
<p>Le plus simple c'est d'ajouter un <pre>
from model_utils.manager import QueryManager
...
class RoleParenting:
...
actives = QueryManager(deleted__isnull=True)
</pre></p>
<hr />
<p>Plutôt que d'ajouter des soft_create/soft_delete partout je mettrais toute la mécanique create/delete dans des méthodes de RoleParentingManager (qui sera instantié sur RoleParenting.objects) :<br /><pre>
class RoleParentingManager:
...
def soft_create(self, *, parent, child):
with atomic(savepoint=False):
rp = self.get_or_crate(parent=parent, child=child)
if rp.deleted:
rp.created = now()
rp.deleted = None
rp.save(update_fields=['created', 'deleted'])
...
def soft_delete(self, *, parent, child):
self.filter(parent=parent, child=child, deleted__isnull=True).update(deleted=now())
</pre></p>
<hr />
<p>Le contraire pour update_transitive_closure, je préfère que la mécanique soit visible ici, c'est déjà du code assez compliqué.</p>
<hr />
<p>0006: voir si on peut faire en sorte que les managers parent/child_relation utilise le Manager "actives" et pas "objects", et aussi remplacer tous les RoleParenting.objects. par RoleParenting.actives. (on peut aussi poser QueryManager sur objects et définir un "all = Manager()", la doc <a class="external" href="https://docs.djangoproject.com/en/3.2/topics/db/managers/#default-managers">https://docs.djangoproject.com/en/3.2/topics/db/managers/#default-managers</a> )</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3318852021-10-12T16:03:42ZBenjamin Dauvergne
<ul></ul><p>Visiblement avec ça on pourrait s'en sortir :<br /><pre>
class RoleParentingManager(Manager):
def get_queryset(self):
return super().get_queryset().filter(deleted__isnull=True)
....
class RoleParenting:
objects = RoleParentingManager()
all = models.Manager()
class Meta:
base_manager_name = 'all'
</pre></p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3320182021-10-13T10:22:14ZPaul Marillonnet
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>En cours</i></li></ul><p>Yes c’est bien vu, j’ai commencé à pousser des modifications qui vont dans ce sens, je regarde comment intégrer ça de façon cohérente.</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3323372021-10-14T13:56:02ZPaul Marillonnet
<ul></ul><p>Paul Marillonnet a écrit :</p>
<blockquote>
<p>Yes c’est bien vu, j’ai commencé à pousser des modifications qui vont dans ce sens, je regarde comment intégrer ça de façon cohérente.</p>
</blockquote>
<p>C’est intégré dans la branche. Il me reste quelques modifications pour gérer les signaux déclenchant le re-calcul de la fermeture transitive (les soft_create/delete sur le manager ne semble pas le déclencher).</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3323812021-10-14T15:38:11ZBenjamin Dauvergne
<ul></ul><p>Paul Marillonnet a écrit :</p>
<blockquote>
<p>C’est intégré dans la branche. Il me reste quelques modifications pour gérer les signaux déclenchant le re-calcul de la fermeture transitive (les soft_create/delete sur le manager ne semble pas le déclencher).</p>
</blockquote>
<p>Je n'ai pas (re)regardé la branche mais ça parait normal, <code>.update()</code> ne déclenche pas de signaux.</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3325042021-10-15T08:42:27ZPaul Marillonnet
<ul><li><strong>Fichier</strong> <a href="/attachments/58492">0008-apply-soft-deletion-logic-when-retrieving-roleparent.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58492/0008-apply-soft-deletion-logic-when-retrieving-roleparent.patch">0008-apply-soft-deletion-logic-when-retrieving-roleparent.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58491">0007-rbac-update_or_create-roleparenting-for-update_trans.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58491/0007-rbac-update_or_create-roleparenting-for-update_trans.patch">0007-rbac-update_or_create-roleparenting-for-update_trans.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58493">0006-rbac-perform-soft-deletion-of-roleparenting-pairings.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58493/0006-rbac-perform-soft-deletion-of-roleparenting-pairings.patch">0006-rbac-perform-soft-deletion-of-roleparenting-pairings.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58494">0005-rbac-soft_delete-requires-transitive-closure-update-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58494/0005-rbac-soft_delete-requires-transitive-closure-update-.patch">0005-rbac-soft_delete-requires-transitive-closure-update-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58495">0004-rbac-define-post_soft_delete-signal-and-its-handler-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58495/0004-rbac-define-post_soft_delete-signal-and-its-handler-.patch">0004-rbac-define-post_soft_delete-signal-and-its-handler-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58496">0003-rbac-define-custom-manager-for-active-objects-57500.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58496/0003-rbac-define-custom-manager-for-active-objects-57500.patch">0003-rbac-define-custom-manager-for-active-objects-57500.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58497">0002-rbac-add-soft-created-deleted-manager-methods-57500.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58497/0002-rbac-add-soft-created-deleted-manager-methods-57500.patch">0002-rbac-add-soft-created-deleted-manager-methods-57500.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/58498">0001-rbac-add-created-deleted-fields-on-RoleParenting-mod.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/58498/0001-rbac-add-created-deleted-fields-on-RoleParenting-mod.patch">0001-rbac-add-created-deleted-fields-on-RoleParenting-mod.patch</a> ajouté</li><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Solution proposée</i></li></ul><p>Benjamin Dauvergne a écrit :</p>
<blockquote>
<p>Paul Marillonnet a écrit :</p>
<blockquote>
<p>C’est intégré dans la branche. Il me reste quelques modifications pour gérer les signaux déclenchant le re-calcul de la fermeture transitive (les soft_create/delete sur le manager ne semble pas le déclencher).</p>
</blockquote>
<p>Je n'ai pas (re)regardé la branche mais ça parait normal, <code>.update()</code> ne déclenche pas de signaux.</p>
</blockquote>
<p>Voilà, ça m’a l’air mieux comme ça. Patches avec définition d’un signal et son handler (0004) et son usage après le <code>.update()</code> (0005).</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3382592021-11-22T09:42:48ZBenjamin Dauvergne
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>En cours</i></li></ul> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3382612021-11-22T09:42:59ZBenjamin Dauvergne
<ul><li><strong>Statut</strong> changé de <i>En cours</i> à <i>Solution proposée</i></li></ul> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3541552022-01-31T23:48:02ZBenjamin Dauvergne
<ul><li><strong>Fichier</strong> <a href="/attachments/61546">0002-tests_rbac-factorize-get_-_model-calls-57500.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/61546/0002-tests_rbac-factorize-get_-_model-calls-57500.patch">0002-tests_rbac-factorize-get_-_model-calls-57500.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/61547">0005-django_rbac-new-update_transitive_closure-algorithm-.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/61547/0005-django_rbac-new-update_transitive_closure-algorithm-.patch">0005-django_rbac-new-update_transitive_closure-algorithm-.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/61548">0004-tests_rbac-add-randomized-tests-on-role-parenting-57.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/61548/0004-tests_rbac-add-randomized-tests-on-role-parenting-57.patch">0004-tests_rbac-add-randomized-tests-on-role-parenting-57.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/61549">0003-django_rbac-add-missing-constraints-57500.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/61549/0003-django_rbac-add-missing-constraints-57500.patch">0003-django_rbac-add-missing-constraints-57500.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/61550">0006-misc-implement-soft-delete-on-RoleParenting-57500.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/61550/0006-misc-implement-soft-delete-on-RoleParenting-57500.patch">0006-misc-implement-soft-delete-on-RoleParenting-57500.patch</a> ajouté</li><li><strong>Fichier</strong> <a href="/attachments/61551">0001-tests_rbac-test-with-postgresql-57500.patch</a> <a class="icon-only icon-download" title="Télécharger" href="/attachments/download/61551/0001-tests_rbac-test-with-postgresql-57500.patch">0001-tests_rbac-test-with-postgresql-57500.patch</a> ajouté</li><li><strong>Tracker</strong> changé de <i>Bug</i> à <i>Development</i></li></ul><p>En voulant tester tes modifications à update_transitive_closure() j'ai pondu un nouveau test qui m'a permis de m'apercevoir que:<br />1. les tests django_rbac ne tournaient pas sur postgresql :/<br />2. django_rbac ne déclarait pas la contrainte de base sur RoleParenting d'unicité du triplet (parent, child, direct),<br />3. que ça faussait les tests et que l'algo actuel pour update_transitive_closure ne marchait pas terriblement bien, dans le sens où il créait des RoleParenting où child == parent et d'autres idioties.</p>
<p>Le nouveau code est plus clair (je trouve) et utilise directement du SQL pour aller vite. Il permet d'introduire plus simplement les modifications pour le soft-delete. Je ne vais pas m'autovalider mais Paul si tu peux jeter un coup d'oeuil on valide ça ensemble. J'ai repairé aussi des cas où on pouvait utilisait le Manage alive qui n'était pas utilisé et aussi un cas dans check_and_repair ou il manquait un deleted__isnull=True mais rien de vraiment important.</p>
<p>Dans le cas d'export des utilisateurs (resources.py) j'ai ajouté un commentaire pour le filtrage en python de rp.deleted soit justifié.</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3545122022-02-02T10:50:55ZPaul Marillonnet
<ul></ul><p>Benjamin Dauvergne a écrit :</p>
<blockquote>
<p>En voulant tester tes modifications à update_transitive_closure() j'ai pondu un nouveau test qui m'a permis de m'apercevoir que:<br />1. les tests django_rbac ne tournaient pas sur postgresql :/<br />2. django_rbac ne déclarait pas la contrainte de base sur RoleParenting d'unicité du triplet (parent, child, direct),</p>
</blockquote>
<p>Ok, je crois que de fait dans le code on vérifiait déjà cette unicité, mais c’est bien qu’elle soit déclarée explicitement oui.</p>
<blockquote>
<p>3. que ça faussait les tests et que l'algo actuel pour update_transitive_closure ne marchait pas terriblement bien, dans le sens où il créait des RoleParenting où child == parent et d'autres idioties.</p>
</blockquote>
<p>Est-ce que ça et le gain de vitesse justifient le SQL ? Je ne suis pas super convaincu du gain en clarté :/</p>
<blockquote>
<p>J'ai repairé aussi des cas où on pouvait utilisait le Manage alive qui n'était pas utilisé</p>
</blockquote>
<p>Ok.</p>
<blockquote>
<p>aussi un cas dans check_and_repair ou il manquait un deleted__isnull=True mais rien de vraiment important.</p>
</blockquote>
<p>Ok, merci.</p>
<blockquote>
<p>Dans le cas d'export des utilisateurs (resources.py) j'ai ajouté un commentaire pour le filtrage en python de rp.deleted soit justifié.</p>
</blockquote>
<p>Vu, ok.</p>
<p>Deux petites choses qui restent, la nouvelle version de l’algo de clôture transitive dont la partie SQL me laisse un peu perplexe. Est-ce qu’on a des chiffres sur le gain de performance engendré par le passage des requêtes Django à du SQL brut dans ce cas ? Par exemple en faisait tourner un test randomisé façon 0004 mais avec aussi des cas de soft-deletion, et en comparant les temps d’exécution ?</p>
<p>J’ai relu le reste, à part la clôture transitive c’est ok pour moi, juste quelques octets superflus sur 0004:<br /><pre><code class="diff syntaxhl"><span class="gh">diff --git a/tests_rbac/test_rbac.py b/tests_rbac/test_rbac.py
index bf91ffe5..ab9f35ad 100644
</span><span class="gd">--- a/tests_rbac/test_rbac.py
</span><span class="gi">+++ b/tests_rbac/test_rbac.py
</span><span class="p">@@ -305,10 +305,9 @@</span> def test_random_role_parenting(db):
c = 15
roles = [Role.objects.create(id=i, name=f'role{i}') for i in range(c)]
<span class="gd">- m = [[False] * c for i in range(c)]
</span> m = np.zeros((c, c), dtype=bool)
- def check(i):
<span class="gi">+ def check():
</span> one = np.identity(c, dtype=bool)
z = m
for i in range(c):
<span class="p">@@ -340,4 +339,4 @@</span> def test_random_role_parenting(db):
roles[a].remove_child(roles[b])
m[a][b] = False
print('duration', time() - t)
<span class="gd">- check(i)
</span><span class="gi">+ check()
</span></code></pre></p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3545232022-02-02T11:00:33ZBenjamin Dauvergne
<ul></ul><p>Paul Marillonnet a écrit :</p>
<blockquote>
<p>Ok, je crois que de fait dans le code on vérifiait déjà cette unicité, mais c’est bien qu’elle soit déclarée explicitement oui.</p>
</blockquote>
<p>Ben de fait mon test faisait des trucs interdits et ça passait (créé deux RP avec même parent, child, et direct et ça passait, donc non dans les tests django_rbac on ne vérifiait pas le respect de cette unicité).</p>
<blockquote><blockquote>
<p>3. que ça faussait les tests et que l'algo actuel pour update_transitive_closure ne marchait pas terriblement bien, dans le sens où il créait des RoleParenting où child == parent et d'autres idioties.</p>
</blockquote>
<p>Est-ce que ça et le gain de vitesse justifient le SQL ? Je ne suis pas super convaincu du gain en clarté :/</p>
</blockquote>
<p>Perso je commence à être plus à l'aise avec un <code>INSERT .. ON CONFLICT ..</code> que de jongler avec 3 requêtes filter(), bulk_create() puis bulk_update() (ce dernier est dispo à partir de Django 2.2), mais je peux comprendre le contraire.</p>
<blockquote>
<p>Deux petites choses qui restent, la nouvelle version de l’algo de clôture transitive dont la partie SQL me laisse un peu perplexe. Est-ce qu’on a des chiffres sur le gain de performance engendré par le passage des requêtes Django à du SQL brut dans ce cas ? Par exemple en faisait tourner un test randomisé façon 0004 mais avec aussi des cas de soft-deletion, et en comparant les temps d’exécution ?</p>
</blockquote>
<p>Ça ne peut-être que strictement plus rapide, l'ORM de Django fait trop de bazar pour que soit plus lent (y qu'à comparer un list(Model.objects.values()) avec list(Model.objects.all() qui passe par l'ORM mais supprime toute gestion des Field), le deuxième va beaucoup plus vite) donc pas la peine de mesurer. Est-ce que la performance est importante ici ? Non je ne pense pas, donc la seule question c'est sur la clarté, et je trouve ça plus clair, surtout qu'on a que trois champs à gérer parent, child et direct mais ça reste un avis personnel et une question d'habitude. La question de supporter autre chose que postgresql on l'a supprimé il y a longtemps.</p>
<blockquote>
<p>J’ai relu le reste, à part la clôture transitive c’est ok pour moi, juste quelques octets superflus sur 0004:<br />[...]</p>
</blockquote>
<p>Ok.</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3545332022-02-02T11:27:01ZPaul Marillonnet
<ul><li><strong>Statut</strong> changé de <i>Solution proposée</i> à <i>Solution validée</i></li></ul><p>Benjamin Dauvergne a écrit :</p>
<blockquote>
<p>Ben de fait mon test faisait des trucs interdits et ça passait (créé deux RP avec même parent, child, et direct et ça passait, donc non dans les tests django_rbac on ne vérifiait pas le respect de cette unicité).</p>
</blockquote>
<p>Oui, pardon, hyperbole, je voulais simplement dire que dans la précédente version de <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Development: Ajouter des champs created et deleted (soft delete) sur RoleParenting (Fermé)" href="https://dev.entrouvert.org/issues/57500#note-9">#57500-9</a> sur le <code>soft_create</code> on vérifiait qu’on ne créait pas de doublon, mais oui ok c’est trop léger et rien n’empêchait par exemple de taper dans un shell django des doublons de RoleParenting. Il faut des contraintes d’unicité.</p>
<blockquote>
<p>Perso je commence à être plus à l'aise avec un <code>INSERT .. ON CONFLICT ..</code> que de jongler avec 3 requêtes filter(), bulk_create() puis bulk_update() (ce dernier est dispo à partir de Django 2.2), mais je peux comprendre le contraire.<br />Ça ne peut-être que strictement plus rapide, l'ORM de Django fait trop de bazar pour que soit plus lent (y qu'à comparer un list(Model.objects.values()) avec list(Model.objects.all() qui passe par l'ORM mais supprime toute gestion des Field), le deuxième va beaucoup plus vite) donc pas la peine de mesurer. Est-ce que la performance est importante ici ? Non je ne pense pas, donc la seule question c'est sur la clarté, et je trouve ça plus clair, surtout qu'on a que trois champs à gérer parent, child et direct mais ça reste un avis personnel et une question d'habitude.</p>
</blockquote>
<p>Ok, je comprends l’argument, sans doute une question d’habitude (ou disons de manque d’habitude de taper du SQL dans le code django) qui fait que je préfère la version avec les requêtes django. On va dire que c’est ma faute, laissons comme cela.</p>
<blockquote>
<p>La question de supporter autre chose que postgresql on l'a supprimé il y a longtemps.</p>
</blockquote>
<p>Oui, pas de question/remarque de ce côté là.</p> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3674412022-03-25T11:05:38ZBenjamin Dauvergne
<ul><li><strong>Assigné à</strong> changé de <i>Paul Marillonnet</i> à <i>Benjamin Dauvergne</i></li></ul> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3674422022-03-25T11:05:39ZBenjamin Dauvergne
<ul><li><strong>Statut</strong> changé de <i>Solution validée</i> à <i>Résolu (à déployer)</i></li></ul><pre>commit c004a5667368766c1d56a75d490aa3d197678dca
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Mon Jan 31 20:52:46 2022 +0100
misc: implement soft-delete on RoleParenting (#57500)
commit a8994cfc62a40fc9d5e5c856d26cbeafaa37b743
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Mon Jan 31 22:26:19 2022 +0100
django_rbac: new update_transitive_closure algorithm (#57500)
commit c7399b452cd5f5d56f2ebf5d682517706357fc77
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Sun Jan 30 19:58:57 2022 +0100
tests_rbac: add randomized tests on role parenting (#57500)
commit 9477928d2ae5ea4a156c94f99fc0e7409df8286e
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Mon Jan 31 20:49:55 2022 +0100
django_rbac: add missing constraints (#57500)
commit bd900e081b6b4a6864a2c8ab788197c26d6d35a5
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Sun Jan 30 19:58:36 2022 +0100
tests_rbac: factorize get_*_model calls (#57500)
commit 11cfc084a26dcbdafa67fb8cef0b453a9108906b
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Mon Jan 31 22:26:31 2022 +0100
tests_rbac: test with postgresql (#57500)</pre> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3679982022-03-28T13:17:03ZTransition automatique
<ul><li><strong>Statut</strong> changé de <i>Résolu (à déployer)</i> à <i>Solution déployée</i></li></ul> Authentic 2 - Development #57500: Ajouter des champs created et deleted (soft delete) sur RoleParentinghttps://dev.entrouvert.org/issues/57500?journal_id=3833902022-05-29T02:42:01ZTransition automatique
<ul></ul><p>Automatic expiration</p>