Project

General

Profile

Download (7.85 KB) Statistics
| Branch: | Tag: | Revision:

root / extra / modules / payments_ui.ptl @ 5374ecec

1
import time
2

    
3
from quixote import get_request, get_response, get_session, redirect
4
from quixote.directory import Directory, AccessControlled
5

    
6
import wcs
7
import wcs.admin.root
8
from wcs.backoffice.menu import *
9

    
10
from qommon import errors, misc, template
11
from qommon.form import *
12
from qommon.strftime import strftime
13

    
14
from payments import eopayment, Regie, is_payment_supported
15

    
16

    
17
class RegieDirectory(Directory):
18
    _q_exports = ['', 'edit', 'delete', 'options']
19

    
20
    def __init__(self, regie):
21
        self.regie = regie
22

    
23
    def _q_index [html] (self):
24
        form = Form(enctype='multipart/form-data')
25
        form.add_submit('edit', _('Edit'))
26
        form.add_submit('delete', _('Delete'))
27
        form.add_submit('back', _('Back'))
28

    
29
        if form.get_submit() == 'edit':
30
            return redirect('edit')
31
        if form.get_submit() == 'delete':
32
            return redirect('delete')
33
        if form.get_submit() == 'back':
34
            return redirect('..')
35

    
36
        html_top('payments', title = _('Regie: %s') % self.regie.label)
37
        '<h2>%s</h2>' % _('Regie: %s') % self.regie.label
38

    
39
        get_session().display_message()
40

    
41
        if self.regie.description:
42
            '<p>'
43
            self.regie.description
44
            '</p>'
45

    
46
        if self.regie.service:
47
            '<p>'
48
            '%s %s' % (_('Banking Service:'), self.regie.service)
49
            ' (<a href="options">%s</a>)' % _('options')
50
            '</p>'
51

    
52
        form.render()
53

    
54
    def edit [html] (self):
55
        form = self.form()
56
        if form.get_submit() == 'cancel':
57
            return redirect('.')
58

    
59
        if form.is_submitted() and not form.has_errors():
60
            self.submit(form)
61
            return redirect('..')
62

    
63
        html_top('payments', title = _('Edit Regie: %s') % self.regie.label)
64
        '<h2>%s</h2>' % _('Edit Regie: %s') % self.regie.label
65
        form.render()
66

    
67

    
68
    def form(self):
69
        form = Form(enctype='multipart/form-data')
70
        form.add(StringWidget, 'label', title=_('Label'), required=True,
71
                value=self.regie.label)
72
        form.add(TextWidget, 'description', title=_('Description'),
73
                value=self.regie.description, rows=5, cols=60)
74
        form.add(SingleSelectWidget, 'service', title=_('Banking Service'),
75
                value=self.regie.service, required=True,
76
                options = [
77
                        ('dummy', _('Dummy (for tests)')),
78
                        ('sips', 'SIPS'),
79
                        ('systempayv2', 'systempay (Banque Populaire)'),
80
                        ('spplus', _('SP+ (Caisse d\'epargne)'))])
81
        form.add_submit('submit', _('Submit'))
82
        form.add_submit('cancel', _('Cancel'))
83
        return form
84

    
85
    def submit(self, form):
86
        for k in ('label', 'description', 'service'):
87
            widget = form.get_widget(k)
88
            if widget:
89
                setattr(self.regie, k, widget.parse())
90
        self.regie.store()
91

    
92
    def delete [html] (self):
93
        form = Form(enctype='multipart/form-data')
94
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
95
                        'You are about to irrevocably delete this regie.')))
96
        form.add_submit('submit', _('Submit'))
97
        form.add_submit('cancel', _('Cancel'))
98
        if form.get_submit() == 'cancel':
99
            return redirect('..')
100
        if not form.is_submitted() or form.has_errors():
101
            get_response().breadcrumb.append(('delete', _('Delete')))
102
            html_top('payments', title = _('Delete Regie'))
103
            '<h2>%s</h2>' % _('Deleting Regie: %s') % self.regie.label
104
            form.render()
105
        else:
106
            self.regie.remove_self()
107
            return redirect('..')
108

    
109
    def options [html] (self):
110
        form = Form(enctype='multipart/form-data')
111
        module = eopayment.get_backend(self.regie.service)
112
        try:
113
            module.description['parameters']
114
        except:
115
            return template.error_page(_('Payment backend do not list its options'))
116
            raise errors.TraversalError()
117
        service_options = self.regie.service_options or {}
118
        banking_titles = {
119
            ('dummy', 'direct_notification_url'): N_('Direct Notification URL'),
120
            ('dummy', 'siret'): N_('Dummy SIRET'),
121
        }
122
        for parameter, infos in module.description['parameters'].items():
123
            title = banking_titles.get((self.regie.service, parameter), infos.get('caption'))
124
            form.add(StringWidget, parameter, title=title,
125
                     value=service_options.get(parameter))
126
        form.add_submit('submit', _('Submit'))
127
        form.add_submit('cancel', _('Cancel'))
128

    
129
        if form.get_submit() == 'cancel':
130
            return redirect('.')
131

    
132
        if form.is_submitted() and not form.has_errors():
133
            self.submit_options(form, module)
134
            return redirect('..')
135

    
136
        html_top('payments', title=_('Edit Service Options'))
137
        '<h2>%s</h2>' % _('Edit Service Options')
138
        form.render()
139

    
140
    def submit_options(self, form, module):
141
        if not self.regie.service_options:
142
            self.regie.service_options = {}
143
        for parameter, infos in module.description['parameters'].items():
144
            self.regie.service_options[parameter] = form.get_widget(parameter).parse()
145
        self.regie.store()
146

    
147
class RegiesDirectory(Directory):
148
    _q_exports = ['', 'new']
149

    
150
    def _q_traverse(self, path):
151
        get_response().breadcrumb.append(('regie/', _('Regies')))
152
        return Directory._q_traverse(self, path)
153

    
154
    def _q_index [html] (self):
155
        return redirect('..')
156

    
157
    def new [html] (self):
158
        regie_ui = RegieDirectory(Regie())
159

    
160
        form = regie_ui.form()
161
        if form.get_submit() == 'cancel':
162
            return redirect('.')
163

    
164
        if form.is_submitted() and not form.has_errors():
165
            regie_ui.submit(form)
166
            return redirect('%s/' % regie_ui.regie.id)
167

    
168
        get_response().breadcrumb.append(('new', _('New Regie')))
169
        html_top('payments', title = _('New Regie'))
170
        '<h2>%s</h2>' % _('New Regie')
171
        form.render()
172

    
173
    def _q_lookup(self, component):
174
        try:
175
            regie = Regie.get(component)
176
        except KeyError:
177
            raise errors.TraversalError()
178
        get_response().breadcrumb.append((str(regie.id), regie.label))
179
        return RegieDirectory(regie)
180

    
181

    
182
class PaymentsDirectory(AccessControlled, Directory):
183
    _q_exports = ['', 'regie']
184
    label = N_('Payments')
185

    
186
    regie = RegiesDirectory()
187

    
188
    def _q_access(self):
189
        user = get_request().user
190
        if not user:
191
            raise errors.AccessUnauthorizedError()
192
        admin_role = get_cfg('aq-permissions', {}).get('payments', None)
193
        if not (user.is_admin or admin_role in (user.roles or [])):
194
            raise errors.AccessForbiddenError(
195
                    public_msg = _('You are not allowed to access Payments Management'),
196
                    location_hint = 'backoffice')
197

    
198
        get_response().breadcrumb.append(('payments/', _('Payments')))
199

    
200

    
201
    def _q_index [html] (self):
202
        html_top('payments', _('Payments'))
203

    
204
        '<ul id="main-actions">'
205
        '  <li><a class="new-item" href="regie/new">%s</a></li>' % _('New Regie')
206
        '</ul>'
207

    
208
        if not is_payment_supported:
209
            '<p class="infonotice">'
210
            _('Payment is not supported.')
211
            '</p>'
212

    
213
        regies = Regie.select()
214
        '<h2>%s</h2>' % _('Regies')
215
        if not regies:
216
            '<p>'
217
            _('There are no regies defined at the moment.')
218
            '</p>'
219
        '<ul class="biglist" id="regies-list">'
220
        for l in regies:
221
            regie_id = l.id
222
            '<li class="biglistitem" id="itemId_%s">' % regie_id
223
            '<strong class="label"><a href="regie/%s/">%s</a></strong>' % (regie_id, l.label)
224
            '<p class="commands">'
225
            command_icon('regie/%s/edit' % regie_id, 'edit')
226
            command_icon('regie/%s/delete' % regie_id, 'remove')
227
            '</p></li>'
228
        '</ul>'
(21-21/26)