Project

General

Profile

Development #4292

support ODT pour l'action créer un document

Added by Benjamin Dauvergne about 9 years ago. Updated over 7 years ago.

Status:
Fermé
Priority:
Haut
Target version:
Start date:
11 February 2014
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:

Files

0001-workflows-refactoring-in-ExportToModel.patch (5.57 KB) 0001-workflows-refactoring-in-ExportToModel.patch Benjamin Dauvergne, 12 February 2014 11:36 AM
0002-workflows-add-a-to_unicode-option-to-the-context_fro.patch (1.39 KB) 0002-workflows-add-a-to_unicode-option-to-the-context_fro.patch Benjamin Dauvergne, 12 February 2014 11:36 AM
0003-workflows-add-support-for-ODT-files-in-ExportToModel.patch (3.4 KB) 0003-workflows-add-support-for-ODT-files-in-ExportToModel.patch Benjamin Dauvergne, 12 February 2014 11:36 AM
0004-translation-update.patch (1018 Bytes) 0004-translation-update.patch Benjamin Dauvergne, 12 February 2014 11:36 AM
0001-workflows-factorize-context-building-in-template_on_.patch (3.4 KB) 0001-workflows-factorize-context-building-in-template_on_.patch Benjamin Dauvergne, 14 October 2015 01:23 PM
0002-wf-export_to_model-isolate-ExportToModel-4292.patch (21.8 KB) 0002-wf-export_to_model-isolate-ExportToModel-4292.patch Benjamin Dauvergne, 14 October 2015 01:23 PM
0003-wf-export_to_model-add-opendocument-support-4292.patch (30.8 KB) 0003-wf-export_to_model-add-opendocument-support-4292.patch Benjamin Dauvergne, 14 October 2015 01:23 PM
0001-workflows-factorize-context-building-in-template_on_.patch (3.4 KB) 0001-workflows-factorize-context-building-in-template_on_.patch Benjamin Dauvergne, 28 October 2015 01:13 PM
0002-wf-export_to_model-isolate-ExportToModel-4292.patch (22.6 KB) 0002-wf-export_to_model-isolate-ExportToModel-4292.patch Benjamin Dauvergne, 28 October 2015 01:13 PM
0004-change-signature-for-UploadWidget.validation-paramet.patch (4.12 KB) 0004-change-signature-for-UploadWidget.validation-paramet.patch Benjamin Dauvergne, 28 October 2015 01:13 PM
0003-wf-export_to_model-add-opendocument-support-4292.patch (31 KB) 0003-wf-export_to_model-add-opendocument-support-4292.patch Benjamin Dauvergne, 28 October 2015 01:13 PM
0001-workflows-import-ExportToModel-in-module-namespace-f.patch (658 Bytes) 0001-workflows-import-ExportToModel-in-module-namespace-f.patch Frédéric Péters, 29 October 2015 11:49 AM

Associated revisions

Revision 854ca480 (diff)
Added by Benjamin Dauvergne over 7 years ago

workflows: factorize context building in template_on_formdata (#4292)

Revision 29c8e2b0 (diff)
Added by Benjamin Dauvergne over 7 years ago

wf/export_to_model: isolate ExportToModel (#4292)

Revision c9f9a2e6 (diff)
Added by Benjamin Dauvergne over 7 years ago

wf/export_to_model: add opendocument support (#4292)

Revision d7682862 (diff)
Added by Benjamin Dauvergne over 7 years ago

change signature for UploadWidget.validation parameter (#4292)

It should be a method raising qommon.forms.UploadValidationError if the
validation fails. Return value is ignored.

Revision c7cb3b38 (diff)
Added by Frédéric Péters over 7 years ago

workflows: import ExportToModel in module namespace, for compatibility (#4292)

Revision febe201e (diff)
Added by Benjamin Dauvergne over 7 years ago

wf/export_to_model: don't reuse prefix variable (#4292)

(bug introduced in 29c8e2b0)

History

#1

Updated by Benjamin Dauvergne about 9 years ago

  • File 0011-workflows-add-help-text-on-ODT-templates-in-the-side.patch added
  • File 0012-translation-update.patch added

Et deux derniers pour la route...

#2

Updated by Frédéric Péters about 9 years ago

Tu pourrais rebaser ça en moins de patches ?

Ensuite, à survoler les patches, je ferais attention à ne pas amener comme ça la documentation dans l'interface (0011-workflows-add-help-text-on-ODT-templates-in-the-side.patch); à respecter la PEP8 (0009-workflows-add-specific-treatment-of-odt-templates-us.patch), à ne pas changer sans justification un nom de variable (0001-workflows-factorize-building-of-the-variable-diction.patch), etc.

#3

Updated by Benjamin Dauvergne about 9 years ago

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

Tu pourrais rebaser ça en moins de patches ?

Je vais viser 3 patch le refactoring, la fonctionnalité en elle même et les traductions.

Ensuite, à survoler les patches, je ferais attention à ne pas amener comme ça la documentation dans l'interface (0011-workflows-add-help-text-on-ODT-templates-in-the-side.patch);

J'ai bien pu croire qu'on était d'accord que c'était une bonne idée à un eo camp quelconque, mais j'ai du m'auto-persuader quelque part :) On a pris une décision contraire à un moment ?

à respecter la PEP8 (0009-workflows-add-specific-treatment-of-odt-templates-us.patch),
à ne pas changer sans justification un nom de variable (0001-workflows-factorize-building-of-the-variable-diction.patch), etc.

La variable couvrait un builtin; si il n'y a pas un PEP quelque part qui interdit ça je m'en coupe une...

#4

Updated by Frédéric Péters about 9 years ago

Aussi, à dormir là-dessus, ça ne me va pas du tout de d'ajouter une dépendance et de conditionnaliser la fonctionnalité, certes c'est quelque chose qui se fait à d'autres endroits mais ça rend par exemple impossible le travail sur la documentation, "alors là peut-être que vous pourrez mettre de l'odt, ou pas, ça dépend de votre install".

Vu le travail à faire ici, je pense vraiment qu'on peut ouvrir l'odt, parler le content.xml, remplacer les balises, refermer le tout, sans dépendance extérieure.

Sur la documentation, le travail à faire c'est de permettre un lien / une intégration entre un espace wcs et une page précise de la doc (contextuelle), pas d'écrire la documentation dans le code.

#5

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0001-workflows-factorize-building-of-the-variable-diction.patch)
#6

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0002-workflows-authorize-.odt-file-for-the-ExportToModel-.patch)
#7

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0003-translation-update.patch)
#8

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0004-workflows-in-the-ExportToModel-status-item-factorize.patch)
#9

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0005-workflows-in-ExportToModel-status-item-reject-odt-fi.patch)
#10

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0006-translation-update.patch)
#11

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0007-workflows-factorize-templating-on-RTF-files-in-a-spe.patch)
#12

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0008-workflows-add-a-to_unicode-option-to-the-context_fro.patch)
#13

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0009-workflows-add-specific-treatment-of-odt-templates-us.patch)
#14

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0010-admin-workflows-allow-status-items-to-fill-the-sideb.patch)
#15

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0011-workflows-add-help-text-on-ODT-templates-in-the-side.patch)
#16

Updated by Benjamin Dauvergne about 9 years ago

  • File deleted (0012-translation-update.patch)
#18

Updated by Benjamin Dauvergne about 9 years ago

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

Aussi, à dormir là-dessus, ça ne me va pas du tout de d'ajouter une dépendance et de conditionnaliser la fonctionnalité, certes c'est quelque chose qui se fait à d'autres endroits mais ça rend par exemple impossible le travail sur la documentation, "alors là peut-être que vous pourrez mettre de l'odt, ou pas, ça dépend de votre install".

Vu le travail à faire ici, je pense vraiment qu'on peut ouvrir l'odt, parler le content.xml, remplacer les balises, refermer le tout, sans dépendance extérieure.

Je ne ferai pas ce dernier effort, on peut aussi intégrer OOoPy dans les sources comme ezt & co dans l'idée qu'on aura d'autres manipulatoins OpenDocument dans le futur.

Sur la documentation, le travail à faire c'est de permettre un lien / une intégration entre un espace wcs et une page précise de la doc (contextuelle), pas d'écrire la documentation dans le code.

Ok je comprends le besoin de ne pas dupliquer la doc, par contre il y a à mon avis une vrai plus-value à pouvoir voir la documentation directement sans popup ou clique (la colonne de droite me parait parfaite pour ça); si on peut le faire directement depuis les sources mallard c'est cool.

#19

Updated by Frédéric Péters about 9 years ago

Benjamin Dauvergne a écrit :

Vu le travail à faire ici, je pense vraiment qu'on peut ouvrir l'odt, parler le content.xml, remplacer les balises, refermer le tout, sans dépendance extérieure.

Je ne ferai pas ce dernier effort, […]

Si tu ne veux pas t'en charger, tant pis, je maintiens ma position.

#20

Updated by Frédéric Péters about 9 years ago

Pour la personne qui serait intéressée à reprendre ça, ma perspective sur les choses à faire :

  1. avant toute chose déplacer l'action dans wcs/wf/export_to_model.py
  2. faire la modif pour accepter l'odt
  3. pour la transformation de l'odt, ouvrir le zip, prendre le contents.xml via ElementTree
  4. pour les remplacements, pour tous les <text:user-field-get/>, changer le nom de l'élément en text:span, changer le contenu de l'élément à la valeur souhaitée
  5. les valeurs souhaitées, les obtenir via workflows.template_on_formdata(), pour permettre les expressions ezt, pas juste les subtitutions
#21

Updated by Benjamin Dauvergne about 9 years ago

Le point 5 me parait impossible gérer les boucles ou les conditions au milieu du contenu XML par exemple. Si c'est pour mettre une condition directement dans le nom du champ je ne sais pas si LO le permettra (y qu'à essayer hein :) ) mais ça sera particulièrement pas lisible; à voir si on ne peut pas utiliser directement un système de macros interne à LO, au moins pour du "{% if x 1 }contenu 1 { elif x 2 }contenu 2{ endif %}". Et aussi parmi mes patchs celui de refactoring me parait utilisables tel quels, ensuite il n'y a qu'à changer la méthode qui s'occupe particulièrement de l'ODT pour la méthode préconisée par Fred (là pareil partir de mon patch et virer toute référence à OOoPy donne un canevas).

#22

Updated by Frédéric Péters about 9 years ago

Comme je l'écrivais je préférerais commencer par déplacer cette action de workflow dans un fichier isolé, y appliquer ensuite les modifications souhaitées rendra celles-ci plus faciles à retrouver plus tard.

Sur le point 5 (je trouve dommage que redmine ne permette pas de marquer des patchs comme obsolètes, "obligeant" à les supprimer), je ne suis pas sûr d'avoir dans mes petites recherches procédé de la même manière que toi pour le remplacement des champs, mais je n'ai pas eu de problème à y encoder des crochets et des espaces. L'utilisation que je vois ici, ce n'est pas des trucs compliqués, c'est simplement de pouvoir, en tête d'un document, d'écrire "Cher citoyen" ou "Chère citoyenne", en fonction des données.

#23

Updated by Benjamin Dauvergne over 8 years ago

  • Patch proposed set to Yes
#24

Updated by Benjamin Dauvergne over 8 years ago

  • Assignee set to Benjamin Dauvergne
#25

Updated by Frédéric Péters over 8 years ago

À définir après la rencontre avec imio, pour confirmer l'utilisation d'appy.pod.

#26

Updated by Thomas Noël about 8 years ago

(note pour l'écrire quelque part : l'ayant vu plusieurs fois dans d'autre logiciels, je me dis qu'il est peut-être plus simple ou plus robuste de faire des remplacements dans un document de type tableur)

#27

Updated by Benjamin Dauvergne about 8 years ago

  • Patch proposed changed from Yes to No
#29

Updated by Benjamin Dauvergne over 7 years ago

Le support OpenDocument est générique, on peut mettre de l'ezt n'importe où il y a du texte.

C'est implémenté par ces deux bouts de code:

def transform_opendocument(instream, outstream, process):
    '''Take a file-like object containing an ODT, ODS, or any open-office
       format, parse context.xml with element tree and apply process to its root
       node.
    '''
    zin = zipfile.ZipFile(instream, mode='r')
    zout = zipfile.ZipFile(outstream, mode='w')
    assert 'content.xml' in zin.namelist()
    for filename in zin.namelist():
        content = zin.read(filename)
        if filename == 'content.xml':
            root = ET.fromstring(content)
            process(root)
            content = ET.tostring(root)
        zout.writestr(filename, content)
    zout.close()

...

class ExportToModel(...):
    ....
    def apply_od_template_to_formdata(self, formdata):
        def process_root(root):
            def process_text(t):
                if isinstance(t, unicode):
                    t = t.encode(get_publisher().site_charset)
                t = template_on_formdata(formdata, t)
                return unicode(t, get_publisher().site_charset)
            for node in root.iter():
                if node.text:
                    node.text = process_text(node.text)
                if node.tail:
                    node.tail = process_text(node.tail)
        outstream = StringIO()
        transform_opendocument(self.model_file.get_file(), outstream,
                               process_root)
        return outstream.getvalue()
#30

Updated by Benjamin Dauvergne over 7 years ago

  • Status changed from Nouveau to Information nécessaire
#31

Updated by Frédéric Péters over 7 years ago

Quelle "information needed" ?

#32

Updated by Benjamin Dauvergne over 7 years ago

  • Status changed from Information nécessaire to En cours

Target missed.

#33

Updated by Frédéric Péters over 7 years ago

0001. Renommer template_context_on_formdata (get_formdata_template_context peut-être).

0002. Ne pas oublier l'entête GPL dans le wcs/wf/export_to_model.py.

0003.

La fin du test_formdata_generated_document_odt_download() continue à parler de RTF.

J'allais dire que les fichiers .odt ajoutés pour les tests devraient sans doute figurer dans le MANIFEST.in mais je me rends compte que les tests n'y sont en fait pas du tout inclus. :/

Pour le is_opendocument(), je vérifierais plutôt le contenu du fichier mimetype. (.startswith('application/vnd.oasis.opendocument.')).

Plutôt que les "od" à certains endroits, je laisserais "opendocument" en long.

Je passerais aussi le meta.xml dans la transformation (dans l'idée qu'on pourrait mettre [form_var_whatever] en dc:title, par exemple.

Profiter du moment pour lever une exception en cas d'erreur, plutôt que ce retour de deux valeurs dans model_file_validation() ?

Le fp.seek(0) ligne 187, il ne me semble pas utile, mais par contre il faudrait avoir un seek(0) dans le is_opendocument(), non ?

#34

Updated by Benjamin Dauvergne over 7 years ago

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

0001. Renommer template_context_on_formdata (get_formdata_template_context peut-être).

Ok.

0002. Ne pas oublier l'entête GPL dans le wcs/wf/export_to_model.py.

Ok.

0003.

La fin du test_formdata_generated_document_odt_download() continue à parler de RTF.

C'est normal, je vérifie juste que si je change de modèle et que je fais un export sur un formulaire ou il y a déjà un tel export, il n'y a aucun micmac.

J'allais dire que les fichiers .odt ajoutés pour les tests devraient sans doute figurer dans le MANIFEST.in mais je me rends compte que les tests n'y sont en fait pas du tout inclus. :/

Ok je fais rien.

Pour le is_opendocument(), je vérifierais plutôt le contenu du fichier mimetype. (.startswith('application/vnd.oasis.opendocument.')).

Ok.

Plutôt que les "od" à certains endroits, je laisserais "opendocument" en long.

Ok.

Je passerais aussi le meta.xml dans la transformation (dans l'idée qu'on pourrait mettre [form_var_whatever] en dc:title, par exemple.

Ok.

Profiter du moment pour lever une exception en cas d'erreur, plutôt que ce retour de deux valeurs dans model_file_validation() ?

Ok, nouveau patch 4.

Le fp.seek(0) ligne 187, il ne me semble pas utile, mais par contre il faudrait avoir un seek(0) dans le is_opendocument(), non ?

Ok, mais je devrai peut-être juste charger le contenu et pas me tordre la nouille comme ça.

#35

Updated by Benjamin Dauvergne over 7 years ago

  • Priority changed from Normal to Haut
#36

Updated by Frédéric Péters over 7 years ago

C'est normal, je vérifie juste que si je change de modèle et que je fais un export sur un formulaire ou il y a déjà un tel export, il n'y a aucun micmac.

Même avec l'explication je dois me tordre le cerveau, s'il fallait étendre le commentaire "# change file content, same name" dans le test, pour être plus clair, est-ce que ce serait correct de dire :

# change export model to now be a RTF file, do the action again on the same form and
# check that both the old .odt file and the new .rtf file are there and valid.

Pour le 0004, c'est ainsi et on peut imaginer des gros fichiers odt, ça me va de laisser l'affaire comme ça.

Je dirais donc qu'avec un commentaire précisant l'intention de cette partie du test, tu peux pousser le tout.

#37

Updated by Benjamin Dauvergne over 7 years ago

  • Status changed from En cours to Résolu (à déployer)
#38

Updated by Frédéric Péters over 7 years ago

Oh, l'erreur survenue sur jenkins me fait penser à un commentaire que j'ai oublié; il aurait fallu s'assurer qu'une ancienne action continue à se charger correctement. (sans doute nécessaire de faire un from wf.export... import ... dans workflows.py).

#40

Updated by Benjamin Dauvergne over 7 years ago

Ack.

#41

Updated by Frédéric Péters over 7 years ago

  • Status changed from En cours to Résolu (à déployer)
commit c7cb3b380ba555ca9108a5a0977464d21adfe39e
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Thu Oct 29 11:48:51 2015 +0100

    workflows: import ExportToModel in module namespace, for compatibility (#4292)
#43

Updated by Frédéric Péters over 7 years ago

  • Target version set to v1.20
#44

Updated by Frédéric Péters over 7 years ago

(je le note ici par facilité; pour des évolutions plus tard, si jamais, plutôt que appy.pod, il y a http://relatorio.readthedocs.org/)

#45

Updated by Frédéric Péters over 7 years ago

  • Status changed from Résolu (à déployer) to Fermé

Also available in: Atom PDF