Projet

Général

Profil

Development #15663

Permettre de modifier l'URL (slug) d'une démarche

Ajouté par Thomas Noël il y a environ 7 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
28 mars 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Actuellement l'URL d'une demarche est automatique :
  • lors de la création, on calcule une URL depuis le nom de la démarche
  • par la suite, si le nom de la démarche est changé, l'URL n'est recalculée que si aucune demande n'est encore active

Cela permet que l'URL d'une demande reste toujours valable tant que la demande existe, même si la démarche a changé de nom.

Cependant, il serait utile de pouvoir choisir l'URL d'une démarche au moment de la mise en production, et cela arrive souvent après pas mal de travail, et parfois on veut conserver les demandes en cours.

On pourrait donc assouplir :
  • déjà, permettre le recalcul de l'URL si toutes les demandes sont anonymisées ou des brouillons
  • avoir un réglage "modification de l'URL" qui permette de choisir l'URL indépendamment du nom de la démarche
    • dans le cas d'une démarche vide de demandes (ou seulement anonymisées&brouillons) : l'URL est aussitôt modifiée
    • sinon, ne permettre la modification que si toutes les demandes sont terminées, après affichage d'un message d'alerte explicatif

Fichiers

Révisions associées

Révision c3be61b8 (diff)
Ajouté par Frédéric Péters il y a plus de 6 ans

formdef: add internal identifier attribute, separated from url_name (#15663)

This will allow changing url name behaviour without impacting on storage
matters.

Révision 78db869a (diff)
Ajouté par Frédéric Péters il y a plus de 6 ans

admin: make form slugs editable by the admin (#15663)

Historique

#1

Mis à jour par Frédéric Péters il y a presque 7 ans

Garder en plus un attribut caché "manuellement édité", qui serait posé lorsque cette boite de dialogue est utilisée, pour bloquer la mise à jour automatique.

#2

Mis à jour par Thomas Noël il y a presque 7 ans

  • Assigné à mis à Thomas Noël
#3

Mis à jour par Thomas Noël il y a presque 7 ans

En fait à la reflexion mon problème actuel est un peu différent : j'ai des URL codées par ailleurs (dans combo, mais ça pourrait être un CMS externe). Je ne veux pas que des URLs changent quand je migre un formulaire vers une autre plateforme. Or, un risque existe.

Finalement, je voudrais que l'URL ne change jamais. Sauf si on le demande explicitement.

#4

Mis à jour par Frédéric Péters il y a presque 7 ans

Finalement, je voudrais que l'URL ne change jamais. Sauf si on le demande explicitement.

Je propose alors une évolution de la boite de changement de titre d'un formulaire, qu'elle devienne :

Titre du formulaire :
 [ Demande d'acte de naissance ......... ]

Identifiant du formulaire :
 [ demande-d-acte-de-naissance ......... ]

Si à l'ouverture de la boite de dialogue, le slug == slugify(titre), alors il serait mis à jour automatiquement selon ce que l'utilisateur met dans le titre. (c'est par exemple important pour qu'après avoir dupliqué un formulaire on ne se trouve pas avec "demande-d-acte-de-naissance-copie" comme slug de la demande d'acte de mariage).

Si des demandes existent, le champ slug serait en lecture seule, avec une note d'information + un bouton pour l'éditer quand même, genre :

 (i) L'identifiant du formulaire ne peut pas être modifié car des demandes existent.
     [autoriser les modifications malgré tout]
#5

Mis à jour par Frédéric Péters il y a presque 7 ans

(attention comme quoi urlname est aussi utilisé pour le stockage pickle)

#6

Mis à jour par Frédéric Péters il y a presque 7 ans

  • Assigné à changé de Thomas Noël à Frédéric Péters
#7

Mis à jour par Frédéric Péters il y a presque 7 ans

Voilà, 0001 pour le changement de fond; j'ai gardé url_name comme nom d'attribut principalement parce qu'il y a déjà un index sur celui-ci.

Et 0002 pour l'UI.

#8

Mis à jour par Thomas Noël il y a presque 7 ans

0001 :

new_url_name = simplify(self.name, space='-') : le space est '-' par défaut, pas utile de le rappeler.

Il manque un changed=True dans le migrate après self.internal_identifier = self.url_name

Au fait, ce migrate est bien fait aussi lors d'une lecture d'un objet pickle ? J'en suis pas si sûr à cause des ignore_migrations, et je me dis : si un gars veut renommer ou overrider un formdef existant, qui n'aurait donc pas encore de internal_identifier, ça pourrait poser des soucis ? (bien relou à tester). Je dis peut-être un peu n'imp.

Dans wcs/admin/forms.py lors de l'import je pense qu'il faut laisser « formdef.url_name = None # a new one will be set in .store() » (ligne 1555) sinon on pourrait importer un formulaire qui a le même url_name qu'un existant, et boum. (et sans doute ajouter un test pour vérifier ça)

0002:

Au niveau de :

disabled_url_name = bool(self.formdef.data_class().count())

je pense qu'en mode SQL au moins, on pourrait ne pas compter les anonymisés (ni même les brouillons peut-être)... mais ça peut être dans un autre ticket à venir.

(Voilà déjà fournée 1 ; j'ai pas super trop bien tout relu vraiment encore)

#9

Mis à jour par Frédéric Péters il y a presque 7 ans

new_url_name = simplify(self.name, space='-') : le space est '-' par défaut, pas utile de le rappeler.

Yep.

Il manque un changed=True dans le migrate après self.internal_identifier = self.url_name

Yep.

Au fait, ce migrate est bien fait aussi lors d'une lecture d'un objet pickle ? J'en suis pas si sûr à cause des ignore_migrations, et je me dis : si un gars veut renommer ou overrider un formdef existant, qui n'aurait donc pas encore de internal_identifier, ça pourrait poser des soucis ? (bien relou à tester). Je dis peut-être un peu n'imp.

Oui, cette infra migrate c'est pour les fichiers pickle avant tout (cf get_filename() dans wcs/qommon/storage.py).

Dans wcs/admin/forms.py lors de l'import je pense qu'il faut laisser « formdef.url_name = None # a new one will be set in .store() » (ligne 1555) sinon on pourrait importer un formulaire qui a le même url_name qu'un existant, et boum. (et sans doute ajouter un test pour vérifier ça)

J'étais sur l'idée qu'on avait justement comme souhait de ne pas recalculer de url_name lors d'un import (pour pouvoir passer de recette à prod sans changement); pour éviter le clash il y a dans import_from_xml une vérification; là dans un premier temps j'interdisais l'importation si l'url_name existait déjà, mais j'ai au final plutôt opté pour générer un nouvel url_name si ça arrive.

Au niveau de :

disabled_url_name = bool(self.formdef.data_class().count())

je pense qu'en mode SQL au moins, on pourrait ne pas compter les anonymisés (ni même les brouillons peut-être)... mais ça peut être dans un autre ticket à venir.

Sans doute, j'ai quand même l'impression que ces situations seraient plutôt rares et comme je ne suis pas fan de taper des parties limitées à postgresql, je préfère laisser ça pour un autre moment.

#11

Mis à jour par Thomas Noël il y a plus de 6 ans

Nouvelle relecture, j'ai l'impression que tout est ok. Ca pourrait être poussé, joué sur la dev (y compris branche django), et w.c.s. tagué rapidement pour profiter de 10 jours de recette.

#12

Mis à jour par Frédéric Péters il y a plus de 6 ans

  • Statut changé de En cours à Résolu (à déployer)
commit 78db869ae2abecd28c2c4f274609f0f6be41b35e
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Wed Jul 19 23:34:01 2017 +0200

    admin: make form slugs editable by the admin (#15663)

commit c3be61b8d1bb1f90c4f84e10faa3dda9376aaa56
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Wed Jul 19 20:42:33 2017 +0200

    formdef: add internal identifier attribute, separated from url_name (#15663)

    This will allow changing url name behaviour without impacting on storage
    matters.
#13

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF