Projet

Général

Profil

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

root / extra / modules / abelium_domino_ui.py @ c182b1ab

1
from quixote import get_publisher, redirect, get_request
2
from quixote.directory import Directory, AccessControlled
3
from quixote.html import TemplateIO, htmltext
4

    
5
from qommon import get_cfg, get_logger
6
from qommon.form import Form, StringWidget, CheckboxWidget, SingleSelectWidget
7
from qommon.backoffice.menu import html_top
8
from quixote.html import htmltext
9

    
10
from payments import Regie
11

    
12

    
13
# constants
14
ABELIUM_DOMINO = 'abelium_domino'
15
ACTIVATED = 'activated'
16
WSDL_URL = 'wsdl_url'
17
SERVICE_URL = 'service_url'
18
DOMAIN = 'domain'
19
LOGIN = 'login'
20
PASSWORD = 'password'
21
INVOICE_REGIE = 'invoice_regie'
22

    
23
try:
24
    import abelium_domino_ws
25
except ImportError, e:
26
    abelium_domino_ws = None
27
    import_error = e
28

    
29
def get_abelium_cfg(publisher):
30
    if not publisher:
31
        publisher = get_publisher()
32
    return publisher.cfg.get(ABELIUM_DOMINO, {})
33

    
34
def is_activated(publisher=None):
35
    cfg = get_abelium_cfg(publisher)
36
    return cfg.get(ACTIVATED, False) and abelium_domino_ws is not None
37

    
38
def get_client(publisher=None):
39
    publisher = publisher or get_publisher()
40

    
41
    cfg = get_abelium_cfg(publisher)
42
    try:
43
        publisher._ws_cache = abelium_domino_ws.DominoWs(
44
            url=cfg.get(WSDL_URL, ''),
45
            domain=cfg.get(DOMAIN,''),
46
            login=cfg.get(LOGIN, ''),
47
            password=cfg.get(PASSWORD, ''),
48
            location=cfg.get(SERVICE_URL),
49
            logger=get_logger())
50
    except IOError:
51
        return None
52
    return publisher._ws_cache
53

    
54
def get_family(user, publisher=None):
55
    family = None
56
    if user is None:
57
        return None
58
    client = get_client(publisher)
59
    if not client:
60
        return None
61
    if hasattr(user, 'abelium_domino_code_famille'):
62
        family = client.get_family_by_code_interne(
63
            user.abelium_domino_code_famille)
64
    if family is None and user.email:
65
        family = client.get_family_by_mail(user.email)
66
    return family
67

    
68
def get_invoice_regie(publisher=None):
69
    cfg = get_abelium_cfg(publisher)
70
    regie_id = cfg.get(INVOICE_REGIE)
71
    if not regie_id:
72
        return None
73
    return Regie.get(regie_id, ignore_errors=True)
74

    
75
class AbeliumDominoDirectory(Directory):
76
    _q_exports = [ '' , 'debug' ]
77
    label = N_('Domino')
78

    
79
    def debug(self):
80
        from abelium_domino_vars import SESSION_CACHE
81
        html_top(ABELIUM_DOMINO)
82
        r = TemplateIO(html=True)
83
        r += htmltext('<form method="post"><button>Lancer le cron</button></form>')
84
        if get_request().get_method() == 'POST':
85
            try:
86
                from abelium_domino_synchro import synchronize_domino
87
                synchronize_domino(get_publisher())
88
            except Exception, e:
89
                r += htmltext('<pre>%s</pre>') % repr(e)
90
        r += htmltext('<p>code interne: %s</p>') % getattr(get_request().user, str('abelium_domino_code_famille'), None)
91
        r += htmltext('<dl>')
92
        context = get_publisher().substitutions.get_context_variables()
93
        for var in sorted(context.keys()):
94
            value = context[var]
95
            if value:
96
                r += htmltext('<dt>%s</dt>') % var
97
                r += htmltext('<dd>%s</dt>') % value
98
        r += htmltext('</dl>')
99
        delattr(get_request().session, SESSION_CACHE)
100

    
101
    def _q_index(self):
102
        publisher = get_publisher()
103
        cfg = get_cfg(ABELIUM_DOMINO, {})
104
        form = self.form(cfg)
105

    
106
        title = _('Abelium Domino')
107
        html_top(ABELIUM_DOMINO, title = title)
108
        r = TemplateIO(html=True)
109
        r += htmltext('<h2>%s</h2>') % title
110

    
111
        if form.is_submitted() and not form.has_errors():
112
            if form.get_widget('cancel').parse():
113
                return redirect('..')
114
            if form.get_widget('submit').parse():
115
                for name in [f[0] for f in self.form_desc] + [INVOICE_REGIE]:
116
                    widget = form.get_widget(name)
117
                    if widget:
118
                        cfg[name] = widget.parse()
119
                publisher.cfg[ABELIUM_DOMINO] = cfg
120
                publisher.write_cfg()
121
                return redirect('.')
122

    
123
        if abelium_domino_ws:
124
            r += form.render()
125
        else:
126
            message = _('The Abelium Domino module is not '
127
                    'activated because of this error when '
128
                    'loading it: %r') % import_error
129
            r += htmltext('<p class="errornotice">%s</p>') % message
130
        r += htmltext('<dl style="display: none">')
131
        context = get_publisher().substitutions.get_context_variables()
132
        for var in sorted(context.keys()):
133
            value = context[var]
134
            if value:
135
                r += htmltext('<dt>%s</dt>') % var
136
                r += htmltext('<dd>%s</dt>') % value
137
        r += htmltext('</dl>')
138
        return r.getvalue()
139

    
140
    form_desc = (
141
            # name, required, title, kind
142
            (ACTIVATED, False, _('Activated'), bool),
143
            (WSDL_URL, True, _('WSDL URL'), str),
144
            (SERVICE_URL, False, _('Service URL'), str),
145
            (DOMAIN, True, _('Domain'), str),
146
            (LOGIN, True, _('Login'), str),
147
            (PASSWORD, True, _('Password'), str),
148
    )
149

    
150

    
151
    def form(self, initial_value={}):
152
        form = Form(enctype='multipart/form-data')
153
        kinds = { str: StringWidget, bool: CheckboxWidget }
154
        for name, required, title, kind in self.form_desc:
155
            widget = kinds[kind]
156
            form.add(widget, name, required=required, title=title,
157
                    value=initial_value.get(name, ''))
158
        options = [(regie.id, regie.label) \
159
                        for regie in Regie.values()]
160
        options.insert(0, (None, _('None')))
161
        form.add(SingleSelectWidget, INVOICE_REGIE,
162
                title=_('Regie which will receive payments'),
163
                value=initial_value.get(INVOICE_REGIE),
164
                options=options)
165

    
166
        form.add_submit('submit', _('Submit'))
167
        form.add_submit('cancel', _('Cancel'))
168

    
169
        return form
(3-3/30)