Project

General

Profile

Development #39425

Commande de management pour importer des ressources (assets)

Added by Nicolas Roche about 2 months ago. Updated about 1 month ago.

Status:
Solution proposée
Priority:
Normal
Assignee:
Target version:
-
Start date:
30 Jan 2020
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

Description

Copié/Collé de #8183 :
Ça serait utile pour avoir des déclinaisons des modèles de site, pour être appelé par le déploiement par hobo.

0001-assets-add-import_assets-management-command-39425.patch View (13.2 KB) Nicolas Roche, 03 Feb 2020 09:29 AM

0001-data-merge-assets-and-site-export-file-39425.patch View (53 KB) Nicolas Roche, 13 Feb 2020 02:19 PM

0002-assets-factorize-import-export-code-39425.patch View (11.1 KB) Nicolas Roche, 17 Feb 2020 09:30 AM

0001-trivial-remove-unused-imports-39425.patch View (3.69 KB) Nicolas Roche, 17 Feb 2020 09:30 AM

0003-general-add-import-export-tar-format-for-site-39425.patch View (19.6 KB) Nicolas Roche, 17 Feb 2020 09:30 AM


Related issues

Related to Combo - Development #6756: Import/export de /media/ Solution déployée 17 Mar 2015

History

#2 Updated by Nicolas Roche about 2 months ago

#3 Updated by Nicolas Roche about 2 months ago

J'ai factorisé de code lié aux manipulation du TAR,
et j'ai renommé l'option "--is-empty' en '--overwrite'.

#4 Updated by Frédéric Péters about 2 months ago

Je serais plutôt pour que ce travail soit intégré dans les commandes existantes (import/export_site), l'idée d'ensuite qu'il puisse y avoir un format d'export unique, pages + assets, dans la suite de #37674.

#5 Updated by Nicolas Roche about 2 months ago

Oui cela simplifiera la gestion des ressources.
Mais cela veut-il dire qu'il faudra gérer un second format (tar) d'import des sites en parallèle, en attendant que le premier (json) devienne obsolète ?

#6 Updated by Frédéric Péters about 2 months ago

Gérer de recevoir un .tar en entrée, oui, mais il n'y a pas de plan pour rendre obsolète le json simple, c'est notamment ce que donne l'export direct d'une page.

#7 Updated by Nicolas Roche about 1 month ago

J'ai mergé les 2 formats dans un seul TAR :
  • export des assets comme avant : TAR avec _assets.json et les fichiers des assets
  • export de site : le même TAR avec en plus le contenu JSON inséré dans _site.json

J'ai gardé la possibilité d'utiliser des flux en entrée / sortie, ce qui rend le patch complètement illisible (surtout pour les tests).

J'ai suivi ce plan :
1) casser la dépendance (qui deviendrait circulaire) d'import_assets envers import site
2) factorisation du code dans assets/utils.py
3) nouveau format TAR pour export sites : utils.py, export_site.py, views.py
4) nouveau format TAR pour import sites: utils.py, import_site.py, views.py
Mais je n'ai pas découpé en plusieurs commit, parce que je n'ai corrigé les tests qu'à la fin.

#8 Updated by Nicolas Roche about 1 month ago

#9 Updated by Frédéric Péters about 1 month ago

     def render_to_response(self, context, **response_kwargs):
-        response = HttpResponse(content_type='application/json')
-        json.dump(export_site(), response, indent=2)
-        return response
+        fd = BytesIO()
+        tar = tarfile.open(mode='w', fileobj=fd)
+        export_site(tar)
+        tar.close()
+        return HttpResponse(fd.getvalue(), content_type='application/x-tar')

Je crains timeout + consommation mémoire excessive; ça s'imagine de gérer ça avec StreamingHttpResponse (en imaginant le tar créé petit à petit) ou FileResponse (en imaginant le tar créé dans un fichier temporaire, même si ça ne répond pas au bout timeout). (je ferai un ticket différent pour ça) (vu qu'on a le même "problème" pour l'export des ressources).

Je ne comprends pas comment les tests se retrouvent à tant devoir changer, avec fixtures capsysbinary/monkeypatch. (et je suis bien plus intéressé par un patch qui ne demande pas ça que par une explication).

flux en entrée / sortie

Ça se fait pour du texte, pas pour du binaire.

Là je dirais, à garder les choses ainsi, que la commande d'export doit gagner un paramètre --json (ou --format-json), qui permettra de sortir uniquement le json, et qui lui pourrait se trouver sur stdout. Mais que dans le mode "tar" par défaut, pas d'utilisation de sys.stdout. Et je pense que faire ça ainsi répondra directement à mon commentaire sur les tests, il suffira que ceux-ci passent --json, et rien d'autre ne sera alors à changer.

#10 Updated by Nicolas Roche about 1 month ago

Travail principalement découpé en 2 parties pour en faciliter la relecture :
  • 0002: aucune modification fonctionnelle (les anciens tests passent en l'état).
  • 0003: code qui réutilise l'ancien code JSON sans le modifier.
    Les changement concernent principalement les interfaces : commands et views, qui gérent les 2 formats.

Also available in: Atom PDF