Projet

Général

Profil

Development #33672

avoir un export/import du paramétrage

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
04 juin 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

La définition du profil et les variables (sans doute en ne s'attardant pas sur celles attachées à des services particuliers, qui est un truc que je dégagerais volontiers).


Fichiers

Révisions associées

Révision 60e5bd28 (diff)
Ajouté par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

environment: import and export parameters (#33672)

Révision 572a9f9a (diff)
Ajouté par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

environment: add missing template (#33672)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Frédéric Péters a écrit :

La définition du profil et les variables (sans doute en ne s'attardant pas sur celles attachées à des services particuliers, qui est un truc que je dégagerais volontiers).

Euh c'est quand même utile pour les SETTING_TRUCMUCHE (même si ça n'est pas exposé directement on n'a pas forcément envie que ça se retrouve dans les settings de toute le monde...).

#2

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

(ce ticket n'est pas l'espace pour cette discussion).

#3

Mis à jour par Benjamin Dauvergne il y a presque 5 ans

Change ta description alors.

#4

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

  • Description mis à jour (diff)
#5

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a presque 4 ans

#6

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

Je suis un peu embêté par l'import qui fait un brutal :

    Variable.objects.filter(service_pk__isnull=True).delete()
    AttributeDefinition.objects.all().delete()

Il faudrait je pense être un peu plus doux, ie faire des upsert et ne rien effacer.

#8

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

    url(r'^import/$', views.ImportView.as_view(), name='environment-import'),
    url(r'^export$', views.ExportView.as_view(), name='environment-export'),

il faudrait un / final des deux côtés.

            obj, created = Variable.objects.get_or_create(name=variable['name'])
            objects.append(Variable(id=obj.id, **variable))

Ça m'a quand même l'air un gros danger de perte de données cette manière de recréer un objet en lui forçant l'id (genre des attributs qui ne se trouvent pas dans l'export, comme le service associé). Quand il existe il faut plutôt modifier l'objet. (pareil pour les attributs du profil)

#9

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

Ok, désolé d'avoir continué dans la même voie (remarques prises en compte).

#10

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

Je comprends la création de la liste objects comme une tentative de gérer une transaction, ne pas enregistrer au cas où il y aurait une erreur, ça n'est pas comme ça qu'il faut faire, il faut :

try:
   with transaction.atomic():
       ...
       obj.save()
except...

Après, je ne gérerais même pas d'exception ici parce qu'il ne doit pas s'en passer. Et s'il s'en passe une je préfère qu'on soit notifié plutôt que peut-être avoir un ticket incomplet.

+            obj, created = AttributeDefinition.objects.get_or_create(
+                label=fields['label'], name=fields['name'])

Ça suppose une unicité sur le libellé et non il faut juste le name ici.

+                if key == 'label' or key == 'name':
+                    continue

et pareil dans la boucle précédente, ça sert à rien tu peux juste réassigner les attributs label et name sans soucis et gagner ces lignes.

+    def get(self, request, *args, **kwargs):
+        response = HttpResponse(content_type='application/json')

pour sortir du json il y a désormais dans django JsonResponse.

#11

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

Merci de m'avoir encore guidé. J'ai donc pris en compte les remarques, sauf une car j'ai l'impression qu'il y a bien une unicité sur le libellé des attributs : (hobo/profile/models.py)

class AttributeDefinition(models.Model):
    label = models.CharField(verbose_name=_('label'),
            max_length=63, unique=True)

Par exemple :

(Pdb) AttributeDefinition.objects.create(name='name1', label='label1').save()
(Pdb) AttributeDefinition.objects.create(name='name2', label='label1').save()
*** django.db.utils.IntegrityError: ERREUR:  la valeur d'une clé dupliquée rompt la contrainte unique « profile_attributedefinition_label_key »
DETAIL:  La clé « (label)=(label1) » existe déjà.

#12

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

Merci de m'avoir encore guidé. J'ai donc pris en compte les remarques, sauf une car j'ai l'impression qu'il y a bien une unicité sur le libellé des attributs : (hobo/profile/models.py)

Mais si tu es en recette et que tu modifies le libellé du champ "Nom", pour par exemple écrire "Nom de naissance", puis que tu importes ces paramètrages en production, tu as envie que ce soit le champ qui a l'attribut last_name qui change de libellé, plutôt que le crash que tu proposes.

#13

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

Oui, en effet (j'ai complété les tests pour qu'ils comprennent ce scénario).

#14

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

  • Statut changé de Solution proposée à Solution validée

Validé mais ça m'irait d'y avoir

-        response = JsonResponse(utils.export_parameters())
+        response = JsonResponse(utils.export_parameters(), json_dumps_params={'indent': 2})
#15

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

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

Oui, ça fait moins désordre.

commit 1fe9521fe12d0f13970e501c0ab1f961d2d3e267
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Tue May 12 10:28:54 2020 +0200

    environment: import and export parameters (#33672)

#16

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

Repoussé, parce que absent de master (j'ai dû oublier le push ou autre chose ?)

commit 60e5bd28d0daa151c4a51f4cdd1c5127ac9602e8
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Wed Oct 14 17:13:52 2020 +0200

    environment: import and export parameters (#33672)

#17

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a plus de 3 ans

(décidément, j'ai oublié un template)

commit 572a9f9acbd920fc9635972dd83027e18fda3cc3
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Wed Oct 14 17:34:53 2020 +0200

    environment: add missing template (#33672)

#18

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

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

Formats disponibles : Atom PDF