Projet

Général

Profil

Télécharger (5,9 ko) Statistiques
| Branche: | Tag: | Révision:

root / extra / modules / abelium_domino_workflow.py @ 8881779a

1
import re
2
import time
3

    
4
from quixote import get_request, get_publisher, get_session
5
from quixote.directory import Directory
6

    
7
from qommon.substitution import Substitutions
8
from qommon.form import Form, ValidatedStringWidget
9
import qommon.misc
10
from qommon import get_logger
11
from publisher import WcsPublisher
12

    
13
from wcs.workflows import Workflow, WorkflowStatusJumpItem, register_item_class
14
from wcs.forms.common import FormStatusPage
15

    
16
from abelium_domino_ui import (is_activated, abelium_domino_ws, get_client, get_family)
17
import abelium_domino_ws
18

    
19
class InternalCodeStringWidget(ValidatedStringWidget):
20
    regex = '\d*'
21

    
22
class AbeliumDominoRegisterFamilyWorkflowStatusItem(WorkflowStatusJumpItem):
23
    status = None
24
    description = N_('Abelium Domino: Register a Family')
25
    key = 'abelium-domino-register-family'
26
    category = ('aq-abelium', N_('Abelium'))
27
    label = None
28

    
29
    def render_as_line(self):
30
        return _('Register a Family into Abelium Domino')
31

    
32
    def get_family(self, formdata):
33
        try:
34
            user = formdata.get_user()
35
            if user:
36
                family = get_family(user)
37
                if family:
38
                    family.complete()
39
                return family
40
        except abelium_domino_ws.DominoException:
41
            pass
42
        return None
43

    
44
    def fill_form(self, form, formdata, user):
45
        family = self.get_family(formdata)
46
        if 'family_id' not in form._names:
47
            form.add(InternalCodeStringWidget, 'family_id',
48
                     title=_('Family internal code'),
49
                     value=family and family.code_interne.encode('utf8'),
50
                     hint=_('If a family internal code is present, the '
51
                            'family is updated, if not it is created'))
52
            form.add_submit('create_update_button%s' % self.id,
53
                    _('Create or update the family'))
54

    
55
    def update(self, form, formdata, user, evo):
56
        fid_widget = form.get_widget('family_id')
57
        code_interne = fid_widget.parse()
58
        try:
59
            code_interne = int(code_interne)
60
        except ValueError:
61
            raise ValueError('Le code interne est invalide')
62
        code_interne = '%05d' % code_interne
63
        family = get_client().get_family_by_code_interne(code_interne)
64
        if not family:
65
            raise ValueError('Le code interne est invalide')
66
        family.complete()
67
        self.extract_family(form, formdata, user, evo, family)
68
        family.save()
69
        return family
70

    
71
    def create(self, form, formdata, user, evo):
72
        family = abelium_domino_ws.Family(client=get_client())
73
        self.extract_family(form, formdata, user, evo, family)
74
        return family
75

    
76
    def extract_family(self, form, formdata, user, evo, family):
77
        formdef = formdata.formdef
78
        children = [abelium_domino_ws.Child() for i in range(5)]
79
        max_i = 0
80
        for field in formdef.fields:
81
            value = formdata.data.get(field.id)
82
            if value in (None, ''):
83
                continue
84
            if hasattr(field, 'date_in_the_past'):
85
                value = time.strftime('%Y%m%d', value)
86
            value = unicode(value, 'utf8')
87
            if field.prefill and \
88
               field.prefill.get('type') == 'formula':
89
                v = field.prefill.get('value', '').strip()
90
                i = None
91
                name = None
92
                m = re.search('domino_var_([^ ]*)_enfant([0-9]*)', v)
93
                m2 = re.search('domino_var_([^ ]*)', v)
94
                if m:
95
                    name, i = m.groups()
96
                    try:
97
                        i = int(i)
98
                    except ValueError:
99
                        continue
100
                    max_i = max(i, max_i)
101
                    print 'enfant', name, i-1, value
102
                    setattr(children[i-1], name, value)
103
                elif m2:
104
                    name = m2.group(1)
105
                    print 'family', name, value
106
                    setattr(family, name, value)
107
        for child1, child2 in zip(family.children, children[:max_i]):
108
            child1.__dict__.update(child2.__dict__)
109
        family.save()
110
        if max_i > len(family.children): # add new children
111
            for child in children[len(family.children):max_i]:
112
                family.add_child(child)
113

    
114
    def submit_form(self, form, formdata, user, evo):
115
        logger = get_logger()
116
        if form.get_submit() != 'create_update_button%s' % self.id:
117
            return
118
        try:
119
            if form.get_widget('family_id').parse():
120
                family = self.update(form, formdata, user, evo)
121
                msg = _('Sucessfully updated the family %s')
122
                log_msg = _('Sucessfully updated the family %(code)s of %(user)s')
123
            else:
124
                family = self.create(form, formdata, user, evo)
125
                msg = _('Sucessfully created the family %s')
126
                log_msg = _('Sucessfully created the family %(code)s of %(user)s')
127
            code_interne = family.code_interne.encode('utf8')
128
            msg = msg % code_interne
129
            logger.info(log_msg, {'code': code_interne, 'user': formdata.get_user()})
130
            form_user = formdata.get_user()
131
            form_user.abelium_domino_code_famille = code_interne
132
            form_user.store()
133
        except Exception, e:
134
            if form.get_widget('family_id').parse():
135
                msg = _('Unable to update family: %s') % str(e)
136
            else:
137
                msg = _('Unable to create family: %s') % str(e)
138
            evo.comment = msg
139
            logger.exception(msg  % formdata.get_user())
140
        else:
141
            evo.comment = msg
142
            wf_status = self.get_target_status()
143
            if wf_status:
144
                evo.status = 'wf-%s' % wf_status[0].id
145
        return False
146

    
147
    def is_available(self, workflow=None):
148
        return get_publisher().has_site_option('domino')
149
    is_available = classmethod(is_available)
150

    
151
register_item_class(AbeliumDominoRegisterFamilyWorkflowStatusItem)
(5-5/27)