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>'
|