misc-fred/strasbourg/reprise.py

140 lines
5.0 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# fonctionnalités manquantes :
# - fieldset repeat
# - choicegroup (uniquement présent dans 104)
# - condition
import os
import sys
import xml.etree.ElementTree as ET
import csv
import wcs
from wcs.formdef import FormDef
from wcs.workflows import Workflow
from wcs import fields
def fix_encoding(x):
# their encoding process is real garbage, it looks like there's a
# broken post-processing step "beautifying" characters like quotes
# but it operates on latin1 bytes and fed utf8 bytes.
x = x.replace(u'\xc5\u2019', unicode('Œ', 'latin1'))
x = x.replace(u'\xc5\u201c', unicode('Œ', 'latin1'))
x = x.replace(u'\xc3\u201a', unicode('Â', 'latin1'))
x = x.replace(u'\xc3\u2030', unicode('É', 'latin1'))
x = x.replace(u'\xc3\u017d', unicode('Î', 'latin1'))
x = x.replace(u'\xc3\u20ac', unicode('À', 'latin1'))
x = x.replace(u'\xe2\u20ac\xa6', unicode('', 'latin1'))
x = x.replace(u'\xe2\u20ac\u2122', "'")
try:
return x.encode('raw_unicode_escape').decode('utf-8').encode('utf-8')
except:
import pdb; pdb.set_trace()
raise
tree = ET.parse(sys.argv[1])
root = tree.getroot()
formdef = FormDef()
formdef.name = fix_encoding(root.attrib['name'])
try:
formdef = [x for x in FormDef.select() if x.name == formdef.name][0]
except IndexError:
pass
print formdef.name
formdef.fields = []
field_id = 0
def process_children(node):
global field_id
for field_node in node.getchildren():
field_id += 1
if field_node.tag in ('action', 'label'):
continue
if field_node.tag == 'title':
formdef.fields.append(fields.TitleField(id=str(field_id), type='title', label=fix_encoding(field_node.text)))
continue
if field_node.tag == 'htmlsection':
formdef.fields.append(fields.CommentField(id=str(field_id), type='comment', label='<div>%s</div>' % fix_encoding(field_node.text)))
continue
if field_node.tag == 'fieldset':
if 'repeat' in field_node.attrib:
print '!!! fieldset repeat'
try:
formdef.fields.append(fields.TitleField(id=str(field_id),
type='title',
label=fix_encoding(field_node.find('label').attrib['plain'])))
except AttributeError:
pass
process_children(field_node)
continue
if field_node.tag != 'field':
raise Exception('unhandled tag type: %r' % field_node.tag)
field_type = field_node.attrib['type']
validation = field_node.find('validation')
if validation is not None and validation.attrib.get('type') == 'validate-email':
field_type = 'email'
if validation is not None and validation.attrib.get('type') == 'validate-datecal':
field_type = 'date'
if field_type == 'hidden':
continue
field = {
'textinput': fields.StringField,
'textarea': fields.TextField,
'email': fields.EmailField,
'checkbox': fields.ItemsField,
'radio': fields.ItemField,
'select1': fields.ItemField,
'date': fields.DateField,
'fileupload': fields.FileField,
}[field_type](id=str(field_id),
label=fix_encoding(field_node.find('label').attrib['plain']))
formdef.fields.append(field)
if field_type == 'radio':
field.show_as_radio = True
if validation is not None and validation.attrib.get('required') == 'required':
field.required = True
if validation is not None and validation.attrib.get('type') == 'validate-custom':
if validation.text:
assert field_type == 'textinput'
field.validation = fix_encoding(validation.text[1:-1])
if field_node.attrib.get('size'):
size = field_node.attrib['size']
assert size.endswith('px')
if len(field_node.findall('hint')):
field.hint = fix_encoding(field_node.find('hint').text or '')
if field_type in ('checkbox', 'radio', 'select1'):
field.items = []
for choice in field_node.findall('choices/choice'):
field.items.append(fix_encoding(choice.find('label').attrib['plain']))
process_children(root)
for line in csv.reader(file(os.path.join(os.path.dirname(sys.argv[1]), 'formulaires_prod_reprise_données.csv')),
delimiter=','):
if line[0] + '.xml' == os.path.basename(sys.argv[1]):
formdef.fields.insert(0,
fields.CommentField(id=str(field_id+2), type='comment',
label='<p>Origine: <a href="%s">%s</a></p>' % (line[7], line[7])))
formdef.workflow_options = {'email': line[8]}
break
for workflow in Workflow.select(ignore_migration=True, ignore_errors=True):
if workflow.name == 'Envoi email':
formdef.workflow_id = workflow.id
break
formdef.store()