Projet

Général

Profil

Development #13887

possibilité d'export/import de paramétrage

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
07 novembre 2016
Echéance:
% réalisé:

100%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

On a maintenant des connecteurs qui deviennent parfois longs à configurer (<hint>connecteur CSV</hint>), du coup ça serait bien d'avoir une procédure d'export/import.


Fichiers

0001-create-unique-index-on-ApiUser.username-13887.patch (1,75 ko) 0001-create-unique-index-on-ApiUser.username-13887.patch Benjamin Dauvergne, 16 janvier 2017 23:58
0002-implement-JSON-import-export-fixes-13887.patch (16,9 ko) 0002-implement-JSON-import-export-fixes-13887.patch Benjamin Dauvergne, 16 janvier 2017 23:58
0001-create-unique-index-on-ApiUser.username-13887.patch (1,75 ko) 0001-create-unique-index-on-ApiUser.username-13887.patch Benjamin Dauvergne, 17 janvier 2017 10:29
0002-create-unique-index-on-AccessRight.-13887.patch (1,77 ko) 0002-create-unique-index-on-AccessRight.-13887.patch Benjamin Dauvergne, 17 janvier 2017 10:29
0003-implement-JSON-import-export-fixes-13887.patch (16,9 ko) 0003-implement-JSON-import-export-fixes-13887.patch Benjamin Dauvergne, 17 janvier 2017 10:29
0001-implement-JSON-import-export-13887.patch (3,76 ko) 0001-implement-JSON-import-export-13887.patch Benjamin Dauvergne, 17 janvier 2017 16:41
0003-implement-JSON-import-export-fixes-13887.patch (17,7 ko) 0003-implement-JSON-import-export-fixes-13887.patch Benjamin Dauvergne, 27 janvier 2017 00:10
0001-import_site-add-clean-if-empty-and-overwrite-options.patch (6,72 ko) 0001-import_site-add-clean-if-empty-and-overwrite-options.patch Benjamin Dauvergne, 03 mars 2017 16:47
0001-import_site-add-clean-if-empty-and-overwrite-options.patch (9,46 ko) 0001-import_site-add-clean-if-empty-and-overwrite-options.patch Benjamin Dauvergne, 03 mars 2017 21:42
0003-implement-JSON-import-export-fixes-13887.patch (17,9 ko) 0003-implement-JSON-import-export-fixes-13887.patch Benjamin Dauvergne, 06 mars 2017 10:56
0004-import_site-add-clean-if-empty-and-overwrite-options.patch (9,47 ko) 0004-import_site-add-clean-if-empty-and-overwrite-options.patch Benjamin Dauvergne, 06 mars 2017 10:56
0003-implement-JSON-import-export-fixes-13887.patch (21,2 ko) 0003-implement-JSON-import-export-fixes-13887.patch Benjamin Dauvergne, 06 mars 2017 13:09

Demandes liées

Lié à Hobo - Development #14630: Avoir un import-template génériqueFermé17 janvier 2017

Actions

Révisions associées

Révision ee86d7ed (diff)
Ajouté par Benjamin Dauvergne il y a environ 7 ans

create unique index on ApiUser.username (#13887)

Révision 9a4794fd (diff)
Ajouté par Benjamin Dauvergne il y a environ 7 ans

create unique index on AccessRight.* (#13887)

It will garantee that get_or_create() calls in the BaseResource.import_json()
function will always work.

Révision 6d3782a0 (diff)
Ajouté par Benjamin Dauvergne il y a environ 7 ans

implement JSON import/export (fixes #13887)

You can import/export individual resources or full sites.

passerelle-manage export_site >export.json
passerelle-manage import_site [--import-users] [--clean] [--overwrite] [--if-empty] export.json

Historique

#1

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

  • Description mis à jour (diff)
#2

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Ébauche rapide pour l'export:
  • partir des sérialisation classiques Django pour les modèles Ressource et APIUser, virer les fioriture Django et ne garder qu'un champ 'resource_type': ...
  • concernant ressource on remplace les champs fichiers avec un export base64 du fichier en essayant de conserver un tout petit son nom (un bête basename sur le chemin)
  • on ajoute un une liste d'objet AccessRight ans les sérialisations des ressources, on point sur les APIUser via leur username
Pour l'import:
  • on recrée les APIUser avec get_or_create() en utilisant username comme clé (modulo que username n'a pas le flag unique=True)
  • on recrée tous les fichiers pour chaque ressource, on remplace la sérialisation par le chemin obtenu
  • on recrée les objets à partir de leur slug .get_or_create() au passage on recrée les fichiers
  • on recrée les AccessRights à partir des id généré à l'étape précédente et des username
#3

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Vérifier l'existence de username en doublon en prod et recette et sinon corriger ça, puis ajouter unique à APIUser.username.

#4

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

À noter aussi que ça sera utile d'avoir la possibilité via l'UI d'exporter/importer un connecteur particulier. (à l'écriture du ticket je pensais surtout à ça).

#5

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

À priori j'aurait trois nouvelles méthodes au niveau des ressources:
  • export_json(), à surcharger par chaque ressource pour traitement spécifique (exporter des objets liés en dehors des AccessRight gérés par BaseRessource), peut faire un raise NotImplementedError pour indiquer qu'on ne souhaite pas exporter cette ressource (pour les vieux trucs)
  • import_json() méthode publique au niveau de BaseResource, recherche la bonne classe de Ressource avant d'appeler import_json_impl() dessus
  • import_json_impl() au niveau que de chaque Ressource avec une implémentation basique dans BaseResource

J'ai fait la liste des ressources ou autres modèles qui y sont liés:

passerelle/apps/base_adresse/models.py:class BaseAdresse(BaseResource):
passerelle/apps/base_adresse/models.py:class StreetModel(models.Model):

Dois-je exporter StreetModel ? Je dirai non a priori, ça va se recharger tout seul.

passerelle/apps/choosit/models.py:class ChoositRegisterNewsletter(models.Model):
passerelle/apps/choosit/models.py:class ChoositRegisterGateway(BaseResource):

On n'exporte pas, il faudrait récupérer les Newsletter et je pense qu'on s'en fout.

passerelle/apps/clicrdv/models.py:class ClicRdv(BaseResource):
passerelle/apps/concerto/models.py:class Concerto(BaseDataSource):
passerelle/apps/csvdatasource/models.py:class Query(models.Model):
passerelle/apps/csvdatasource/models.py:class CsvDataSource(BaseResource):

La classe qui nous intéresse vraiment, exporter fichier et requêtes.

passerelle/apps/family/models.py:class GenericFamily(BaseResource):
passerelle/apps/family/models.py:class FamilyLink(models.Model):
passerelle/apps/family/models.py:class Family(models.Model):
passerelle/apps/family/models.py:class Person(models.Model):
passerelle/apps/family/models.py:class Adult(Person):
passerelle/apps/family/models.py:class Child(Person):
passerelle/apps/family/models.py:class Invoice(models.Model):

Je dirai qu'on exporte pas les données.

passerelle/apps/gdc/models.py:class Gdc(BaseResource):
passerelle/apps/makorepost/models.py:class BaseMakoRepost(BaseRepost):
passerelle/apps/makorepost/models.py:class MakoPrototypeRepost(BaseMakoRepost):
passerelle/apps/makorepost/models.py:class MakoRepost(BaseMakoRepost):

Ce n'est même pas une ressource, on ignore.

passerelle/apps/mobyt/models.py:class MobytSMSGateway(BaseResource, SMSGatewayMixin):
passerelle/apps/orange/models.py:class OrangeSMSGateway(BaseResource, SMSGatewayMixin):
passerelle/apps/ovh/models.py:class OVHSMSGateway(BaseResource, SMSGatewayMixin):
passerelle/apps/oxyd/models.py:class OxydSMSGateway(BaseResource, SMSGatewayMixin):
passerelle/apps/pastell/models.py:class Pastell(BaseResource):
passerelle/apps/solis/models.py:class SolisReferential(BaseDataSource):
passerelle/apps/solis/models.py:class SolisListeCommunes(BaseDataSource):
passerelle/apps/solis/models.py:class SolisListeLieux(BaseDataSource):
passerelle/apps/solis/models.py:class SolisListeHomonymes(BaseDataSource):
passerelle/apps/sqlrepost/models.py:class SQLRepost(BaseRepost):
passerelle/apps/sqlrepost/models.py:class SQLStatement(models.Model):
passerelle/apps/sqlrepost/models.py:class SQLBinding(models.Model):

Idem que MakoRepost.

passerelle/base/models.py:class ApiUser(models.Model):
passerelle/base/models.py:class TemplateVar(models.Model):
passerelle/base/models.py:class InheritanceManager(ModelUtilsInheritanceManager):
passerelle/base/models.py:class BaseResource(models.Model):
passerelle/base/models.py:class AccessRight(models.Model):
passerelle/contrib/agoraplus/models.py:class AgoraAPIError(APIError):
passerelle/contrib/agoraplus/models.py:class AgoraPlus(BaseResource):
passerelle/contrib/agoraplus/models.py:class AgoraPlusLink(models.Model):
passerelle/contrib/agoraplus/models.py:class AgoraPlusSas(models.Model):

Idem que pour family, j'ignore les données ?

passerelle/contrib/arcgis/models.py:class Arcgis(BaseResource):
passerelle/contrib/fake_family/models.py:class FakeFamily(BaseResource):
passerelle/contrib/greco/models.py:class Greco(BaseResource):
passerelle/contrib/iparapheur/models.py:class IParapheur(BaseResource):
passerelle/contrib/maarch/models.py:class Maarch(BaseResource):
passerelle/contrib/mdel/models.py:class MDEL(BaseResource):
passerelle/contrib/mdel/models.py:class Demand(models.Model):

Idem, pas de données ?

passerelle/contrib/meyzieu_newsletters/models.py:class MeyzieuNewsletters(BaseResource):
passerelle/contrib/nancypoll/models.py:class NancyPoll(BaseResource):
passerelle/contrib/seisin_by_email/models.py:class SeisinByEmailManagement(BaseResource):
passerelle/contrib/solis_apa/models.py:class SolisAPA(BaseResource):
passerelle/contrib/stub_invoices/models.py:class StubInvoicesConnector(BaseResource):
passerelle/contrib/teamnet_axel/models.py:class Management(BaseResource):
passerelle/contrib/teamnet_axel/models.py:class Link(models.Model):

Link ?

passerelle/contrib/tlmcom/models.py:class TlmCom(PBXMixin):
passerelle/datasources/models.py:class BaseDataSource(BaseResource):
passerelle/datasources/models.py:class CsvDataSource(BaseDataSource):

Je n'exporte pas je pense, c'est le modèle plus haut qui compte maintenant.

passerelle/pbx/models.py:class PBXMixin(BaseResource):
passerelle/queue/models.py:class BaseQueue(BaseResource):
passerelle/queue/models.py:class BaseOutputQueue(BaseQueue):
passerelle/queue/models.py:class JSONOutputQueue(BaseOutputQueue):
passerelle/queue/models.py:class MakoPrototypeOutputQueue(BaseOutputQueue):
passerelle/queue/models.py:class MakoOutputQueue(BaseOutputQueue):

Je n'exporte pas.

passerelle/repost/models.py:class BaseRepost(BaseResource):

Pas d'export (ça couvrira tous les Repost).

#6

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

Je ne suis pas sûr de comprendre le formatage du commentaire, l'expression concerne le bloc ou seulement le dernier élément ? (je pencherais pour un mélange des deux et du coup c'est compliqué).

#7

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Vérification que ApiUser.username est bien unique:

from hobo.multitenant.middleware import TenantMiddleware
from tenant_schemas.utils import tenant_context

from passerelle.base.models import ApiUser

for tenant in TenantMiddleware.get_tenants():
    with tenant_context(tenant):
        print tenant.domain_url, ': ',
        if ApiUser.objects.count() != len(set([apiuser.username for apiuser in ApiUser.objects.all()])):
            print 'NOK'
        else:
            print 'Ok'

En prod:

passerelle:/tmp# sudo -u passerelle passerelle-manage runscript test-apiuser-username.py 
passerelle-publik.entrouvert.com :  Ok
passerelle.nancy.fr :  Ok
passerelle-meyzieu.entrouvert.org :  Ok
passerelle.alfortville.fr :  Ok
passerelle-calvados.entrouvert.org :  Ok
passerelle.fontenay-sous-bois.fr :  Ok
passerelle.chateauroux-metropole.fr :  Ok
passerelle-fondettes.entrouvert.com :  Ok
passerelle-vincennes.entrouvert.com :  Ok
passerelle-comoe.entrouvert.com :  Ok

En recette:

passerelle.test:/tmp# sudo -u passerelle passerelle-manage runscript test.py 
passerelle-nancy.test.entrouvert.org :  Ok
passerelle-gorges.test.entrouvert.org :  Ok
passerelle-matrik.test.entrouvert.org :  Ok
passerelle-clisson.test.entrouvert.org :  Ok
passerelle-chateauroux.test.entrouvert.org :  Ok
passerelle-meyzieu.test.entrouvert.org :  Ok
passerelle-fsb.test.entrouvert.org :  Ok
passerelle-calvados.test.entrouvert.org :  Ok
passerelle2016.alfortville.fr :  Ok
passerelle-csma.test.entrouvert.org :  Ok
passerelle-fondettes.test.entrouvert.org :  Ok
passerelle-vincennes.test.entrouvert.org :  Ok
passerelle-orleans.test.entrouvert.org :  Ok
passerelle-cch.test.entrouvert.org :  Ok
passerelle-haute-goulaine.test.entrouvert.org :  Ok
passerelle-rochefort.test.entrouvert.org :  Ok
passerelle-blois.test.entrouvert.org :  Ok

#8

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

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

Je ne suis pas sûr de comprendre le formatage du commentaire, l'expression concerne le bloc ou seulement le dernier élément ? (je pencherais pour un mélange des deux et du coup c'est compliqué).

Ça concerne la dernière application listée, l'avant dernier commentaire ne concerne que passerelle.queue par exemple.

#9

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

J'ai fait le même test sur AccessRight pour vérifier si (codename, apiuser_id, resource_type, resource_pk) forme une clé, et c'est presque vrai:

passerelle:/tmp# sudo -u passerelle passerelle-manage runscript test-apiuser-username.py 
passerelle-publik.entrouvert.com :  Ok
passerelle.nancy.fr :  Ok
passerelle-meyzieu.entrouvert.org :  Ok
passerelle.alfortville.fr :  Ok
passerelle-calvados.entrouvert.org :  Ok
passerelle.fontenay-sous-bois.fr :  Ok
passerelle.chateauroux-metropole.fr :  Ok
passerelle-fondettes.entrouvert.com :  Ok
passerelle-vincennes.entrouvert.com :  NOK
passerelle-comoe.entrouvert.com :  Ok
passerelle.test:/tmp# sudo -u passerelle passerelle-manage runscript test2.py 
passerelle-nancy.test.entrouvert.org :  Ok
passerelle-gorges.test.entrouvert.org :  Ok
passerelle-matrik.test.entrouvert.org :  Ok
passerelle-clisson.test.entrouvert.org :  Ok
passerelle-chateauroux.test.entrouvert.org :  Ok
passerelle-meyzieu.test.entrouvert.org :  Ok
passerelle-fsb.test.entrouvert.org :  NOK
passerelle-calvados.test.entrouvert.org :  Ok
passerelle2016.alfortville.fr :  Ok
passerelle-csma.test.entrouvert.org :  Ok
passerelle-fondettes.test.entrouvert.org :  Ok
passerelle-vincennes.test.entrouvert.org :  NOK
passerelle-orleans.test.entrouvert.org :  Ok
passerelle-cch.test.entrouvert.org :  Ok
passerelle-haute-goulaine.test.entrouvert.org :  Ok
passerelle-rochefort.test.entrouvert.org :  Ok
passerelle-blois.test.entrouvert.org :  Ok

Le but étant d'ajouter un unique_together, toujours pour se prémunir de foirages dans un get_or_create.

#10

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Je pourrais essayer d'instantier plus de trucs dans les tests mais j'ai l'impression qu'à part CsvDataSouce le reste nous intéresse assez peu.

#12

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Mon code empêche explicitement l'écrasement (si un slug existe déjà je ne fais rien) or dans le cas d'une migration de recette vers prod de connecteurs CSV on pourrait vouloir mettre à jour dans ceux-ci données et requêtes.

  • Est-ce que j'ajoute à la méthode et la commande export-site un paramètre --resource-type permettant de n'exporter par exemple que les connecteurs CSV ?
  • Est-ce que j'ajoute un flag --overwrite à import_site et import_json pour justement permettre une mise à jour (dans le cas du connecteur CSV on supprimerait toutes les requêtes avant de les recréer) ?
#13

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Aussi je compte ajouter les propriétés suivantes au différents exports pour permettre facilement de rejeter un export.

'@type': 'passerelle-site'
...
'@type': 'passerelle-resource'
...

Thomas me signale qu'exporter les APIUser et autres AccessRight n'a probablement aucun intérêt (car différent en prod et recette voir dans 99% inutile puisque la gestion des accès se fait autrement entre nos propres services).

#14

Mis à jour par Serghei Mihai il y a environ 7 ans

Benjamin Dauvergne a écrit :

J'ai fait la liste des ressources ou autres modèles qui y sont liés:

[...]

Pour les connecteurs Teamnet et Agora je dirais que pas besoin d'exporter les données.
Le connecteur Teamnet ne garde que les liaisons nameid - (login, pwd) qui n'ont aucun interet à être copiées ailleurs.
Pareil pour le connecteur Agora, qui en plus contient des données dans le SaS sans interêt à être copiées.

Pour le connecteur Family il peut être intéressant de copier les données sauf les associations.

#15

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

Serghei Mihai a écrit :

Pour le connecteur Family il peut être intéressant de copier les données

Mhhh.. dans quel cadre ? Pour moi non, il y a des loaders qui se chargent de cela. Non ?

#16

Mis à jour par Serghei Mihai il y a environ 7 ans

Thomas Noël a écrit :

Mhhh.. dans quel cadre ? Pour moi non, il y a des loaders qui se chargent de cela. Non ?

Je vois un cas ou on exporterait le connecteur et on voudrait tout de suite jouer avec les données, sans chercher à charger une archive.
Mais c'est moi qui m'imagine trop de choses. Je ne m'oppose pas à ce qu'on n'exporte que les connecteurs et aucune donnée.

#17

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

[…] que les connecteurs et aucune données.

Dans les cas précis cités. (parce que bien sûr pour le CSV, ou pour un connecteur montpellier/encombrants, on veut aussi les données).

#18

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

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

[…] que les connecteurs et aucune données.

Dans les cas précis cités. (parce que bien sûr pour le CSV, ou pour un connecteur montpellier/encombrants, on veut aussi les données).

Pour CSV je vois bien ce que sont les données mais pour encombrants (gdc?) je ne vois pas, il n'y qu'un modèle.

#19

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

(j'imagine confusion encombrants vs gdc)

$ grep ^class passerelle_montpellier_encombrants/models.py
class EncombrantsManagement(BaseResource):
class Sector(models.Model):
class Commune(models.Model):
class Street(models.Model):
class CollectDay(models.Model):
#20

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Je découvre ce projet :) Mais donc voilà un patch, je propose de ne pas exporter les jours de collecte, ça c'est vraiment de la donnée pour moi.

Au niveau des secteur, communes, rue, on fonctionne vraiment en écrasement cette fois.

#21

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Patch principal mis à jour:
  • j'ai renommé import-site/export-site en import_site/export_site (pour mieux coller au nom existant dans combo)
  • par défaut je n'importe plus les utilisateurs ni les ACLs.
#22

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

Reste dans le patch un # FIXME: Should we dump users ? I think it's dead.

Je pense pour ma part qu'il y a une certaine utilité, quand on a par exemple un connecteur CSV qu'on veut ouvrir au public, que ça survive l'export/import.

#23

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

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

Reste dans le patch un # FIXME: Should we dump users ? I think it's dead.

Commentaire invalide et plus à sa place du tout car je dump bien les utilisateurs mais dans passerelle.utils.export_site().

Je pense pour ma part qu'il y a une certaine utilité, quand on a par exemple un connecteur CSV qu'on veut ouvrir au public, que ça survive l'export/import.

J'ai conservé la fonctionnalité, export_site exporte toujours utilisateurs et ACLs, par contre par défaut import_site ne les importe pas (dans l'idée qu'import_site servira principalement à initialiser une plate-forme x depuis une plate-forme y, de test ou de dév). La commande import_site accepte un paramètre --import-users qui active cet import.

Il reste un point non traité, la question de l'écrasement, actuellement si un slug existe déjà je ne charge juste pas le dump correspondant. Est-ce que je permet un écrasement (paramètre --overwrite donné plus haut) ? Est-ce que ce doit être le mode de fonctionnement par défaut ? (je dirai que non).

Il faut voir çà en liaison avec la commande import-template apportée par hobo qui appellera import_site. Est-ce qu'on appelle import-template à chaque appel de déploiement ? Si non qu'est-ce qui fait qu'on ne l'appelle pas ? Si l'application est vide ? Comment mesurer ça génériquement, si pas générique peut-être prévoir un flag --if-empty à la commande import_site.

Aussi sur le nom de la commande bien que combo ait commencé avec import_site je trouve que import-site est plus joli, je veux bien m'occuper de créer un alias coté combo.

#24

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

Il reste un point non traité, la question de l'écrasement.

Côté combo, on écrase. Mais ça peut faire bizarre, parce que ça concerne évidemment uniquement les pages qui existeraient déjà, on ne supprime pas les autres. Manque sans doute une commande de remise à zéro.

Que ça soit par défaut ou non, je pense que c'est utile de pouvoir écraser; et que ça marche pareil d'une appli à l'autre (combo peut être modifié, bien sûr).

Est-ce qu'on appelle import-template à chaque appel de déploiement ?

Non, uniquement à la création initiale du tenant. Réflexion basée sur wcs, on peut avoir un squelette de site avec un échantillon de démarches, mais si j'en supprime une j'ai pas envie de la voir revenir.

Aussi sur le nom de la commande bien que combo ait commencé avec import_site je trouve que import-site est plus joli, je veux bien m'occuper de créer un alias coté combo.

La compat on peut l'ignorer ici, mais mais majoritairement on a des _ il me semble (create_tenant, create_hobo_tenant, hobo_notify, etc.). (et dans wcs un mix des deux).

#25

Mis à jour par Jean-Baptiste Jaillet il y a environ 7 ans

Petit up sur le ticket, besoin pour le déploiement ozwillo du sictiam.

#26

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

#27

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Voilà ce commit ajoute les options --clean qui vide passerelle avant d'importer, --if-empty qui ne charge que si le site est vide et --overwrite qui écrase les connecteurs existant avec l'import (overwrite ne nettoye pas les données attachés à un connecteur, pour le connecteur famille par exemple).

Je le rebaserai dans le patch 0003 ensuite.

#28

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

Patch incomplet, voici le bon.

#30

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

Tu peux pousser ce qui est pertinent dans une branche ?

Notamment parce que :

Reste dans le patch un # FIXME: Should we dump users ? I think it's dead.

Commentaire invalide et plus à sa place du tout car je dump bien les utilisateurs mais dans passerelle.utils.export_site().

Et qu'il n'y a pas de patch sans le FIXME attaché à ce ticket.

#33

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

Crash sur une FileField sans fichier (keystore du connecteur OrangeSMSGateway dans mon cas).

  File "/home/fred/src/eo/passerelle/passerelle/utils/__init__.py", line 189, in export_site
    resources.append(resource.export_json())
  File "/home/fred/src/eo/passerelle/passerelle/base/models.py", line 218, in export_json
    'content': base64.b64encode(value.read()),
  File "/home/fred/src/eo/venv/local/lib/python2.7/site-packages/django/core/files/utils.py", line 16, in <lambda>
    read = property(lambda self: self.file.read)
  File "/home/fred/src/eo/venv/local/lib/python2.7/site-packages/django/db/models/fields/files.py", line 49, in _get_file
    self._require_file()
  File "/home/fred/src/eo/venv/local/lib/python2.7/site-packages/django/db/models/fields/files.py", line 46, in _require_file
    raise ValueError("The '%s' attribute has no file associated with it." % self.field.name)
ValueError: The 'keystore' attribute has no file associated with it.
#34

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

J'ai ajouté un "continue" en cas de ValueError mais ce n'est peut-être pas suffisant, ou il y a un pendant à gérer à l'import,

  File "/home/fred/src/eo/passerelle/passerelle/base/management/commands/import_site.py", line 29, in handle
    import_users=options['import_users'])
  File "/home/fred/src/eo/passerelle/passerelle/utils/__init__.py", line 230, in import_site
    BaseResource.import_json(resource, overwrite=overwrite, import_users=import_users)
  File "/home/fred/src/eo/passerelle/passerelle/base/models.py", line 246, in import_json
    instance = model.import_json_real(overwrite, instance, d)
  File "/home/fred/src/eo/passerelle/passerelle/base/models.py", line 283, in import_json_real
    d[field.name]['name'],
KeyError: 'keystore'
#35

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

(à part ce soucis, c'est ok pour moi)

#36

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

J'ai mergé les deux derniers patchs, j'ai ajouté le traitement des FileField indéfini à l'export et à l'import et j'ai ajouté un test testant tout ça sur la création d'un modèle passerelle.apps.bdb.models.Bdb avec un keystore vide.

#37

Mis à jour par Benjamin Dauvergne il y a environ 7 ans

  • Statut changé de Nouveau à Résolu (à déployer)
  • % réalisé changé de 0 à 100
#38

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

Ok pour moi. (pour le debug avec pdb, je me rends compte que ça serait utile d'avoir un --output FILENAME, pour un autre ticket).

#39

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF