1
|
import os
|
2
|
|
3
|
from quixote import get_publisher, redirect
|
4
|
from quixote.directory import Directory
|
5
|
from quixote.html import htmltext, TemplateIO
|
6
|
|
7
|
import wcs.admin.root
|
8
|
import wcs.root
|
9
|
from wcs.admin.menu import *
|
10
|
from wcs.roles import get_user_roles
|
11
|
|
12
|
from qommon import errors, get_cfg
|
13
|
from qommon.form import *
|
14
|
|
15
|
from wcs.formdef import FormDef
|
16
|
from wcs.categories import Category
|
17
|
|
18
|
from events import get_default_event_tags
|
19
|
import re
|
20
|
from abelium_domino_ui import AbeliumDominoDirectory
|
21
|
|
22
|
class AdminRootDirectory(wcs.admin.root.RootDirectory):
|
23
|
def __init__(self):
|
24
|
self._q_exports = wcs.admin.root.RootDirectory._q_exports
|
25
|
self.menu_items[-1] = ('/', N_('Au Quotidien'))
|
26
|
|
27
|
def _q_index(self):
|
28
|
from wcs.admin.menu import html_top
|
29
|
html_top('/')
|
30
|
r = TemplateIO(html=True)
|
31
|
r += htmltext('<p>%s</p>') % _('Welcome on Au Quotidien administration interface')
|
32
|
# XXX: add links to documentation, "this is based on w.c.s., a free
|
33
|
# software project", etc.
|
34
|
return r.getvalue()
|
35
|
|
36
|
|
37
|
class PanelDirectory(Directory):
|
38
|
_q_exports = ['', 'update', 'announces', 'permissions', 'event_keywords',
|
39
|
'announce_themes', 'drupal', 'ezldap', 'strongbox', 'clicrdv', 'domino']
|
40
|
label = N_('Control Panel')
|
41
|
|
42
|
domino = AbeliumDominoDirectory()
|
43
|
|
44
|
def _q_index(self):
|
45
|
html_top('panel', _('Control Panel'))
|
46
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
47
|
|
48
|
r = TemplateIO(html=True)
|
49
|
r += htmltext('<ul>')
|
50
|
r += htmltext('<li><a href="announces">%s</a></li>') % _('Announces Options')
|
51
|
r += htmltext('<li><a href="permissions">%s</a></li>') % _('Permissions')
|
52
|
r += htmltext('<li><a href="event_keywords">%s</a></li>') % _('Event Keywords')
|
53
|
r += htmltext('<li><a href="announce_themes">%s</a></li>') % _('Announce Themes')
|
54
|
if get_publisher().has_site_option('drupal'):
|
55
|
r += htmltext('<li><a href="drupal">%s</a></li>') % _('Drupal Integration')
|
56
|
if get_publisher().has_site_option('ezldap'):
|
57
|
r += htmltext('<li><a href="ezldap">%s</a></li>') % _('eZ publish / LDAP Integration')
|
58
|
if get_publisher().has_site_option('strongbox'):
|
59
|
r += htmltext('<li><a href="strongbox">%s</a></li>') % _('Strongbox Support')
|
60
|
if get_publisher().has_site_option('clicrdv'):
|
61
|
r += htmltext('<li><a href="clicrdv">%s</a></li>') % _('ClicRDV Integration')
|
62
|
if get_publisher().has_site_option('domino'):
|
63
|
r += htmltext('<li><a href="domino">%s</a></li>') % _('Abelium Domino Integration')
|
64
|
r += htmltext('</ul>')
|
65
|
return r.getvalue()
|
66
|
|
67
|
def _verify_mask(self, form):
|
68
|
if form.is_submitted():
|
69
|
if not re.match("[0-9Xx]*$", form.get('mobile_mask') or ''):
|
70
|
form.set_error('mobile_mask', _('Invalid value'))
|
71
|
else:
|
72
|
string_value = form.get_widget('mobile_mask').value
|
73
|
if string_value:
|
74
|
form.get_widget('mobile_mask').value = string_value.upper()
|
75
|
|
76
|
def announces(self):
|
77
|
announces_cfg = get_cfg('announces', {})
|
78
|
sms_cfg = get_cfg('sms', {})
|
79
|
form = Form(enctype='multipart/form-data')
|
80
|
hint = ""
|
81
|
if sms_cfg.get('mode','') in ("none",""):
|
82
|
hint = htmltext(_('You must also <a href="%s">configure your SMS provider</a>') % "../settings/sms")
|
83
|
|
84
|
form.add(CheckboxWidget, 'sms_support', title = _('SMS support'),
|
85
|
hint = hint, value = announces_cfg.get('sms_support', 0))
|
86
|
form.add(StringWidget, 'mobile_mask', title = _('Mask for mobile numbers'),
|
87
|
hint = _('example: 06XXXXXXXX'),
|
88
|
value = announces_cfg.get('mobile_mask',''))
|
89
|
form.add_submit('submit', _('Submit'))
|
90
|
form.add_submit('cancel', _('Cancel'))
|
91
|
|
92
|
self._verify_mask(form)
|
93
|
|
94
|
if form.get_widget('cancel').parse():
|
95
|
return redirect('.')
|
96
|
|
97
|
if not form.is_submitted() or form.has_errors():
|
98
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
99
|
get_response().breadcrumb.append(('announces', _('Announces Options')))
|
100
|
html_top('panel', _('Announces Options'))
|
101
|
r = TemplateIO(html=True)
|
102
|
r += htmltext('<h2>%s</h2>') % _('Announces Options')
|
103
|
r += form.render()
|
104
|
return r.getvalue()
|
105
|
else:
|
106
|
from wcs.admin.settings import cfg_submit
|
107
|
cfg_submit(form, 'announces', ('sms_support','mobile_mask'))
|
108
|
return redirect('.')
|
109
|
|
110
|
def permissions(self):
|
111
|
permissions_cfg = get_cfg('aq-permissions', {})
|
112
|
form = Form(enctype='multipart/form-data')
|
113
|
form.add(SingleSelectWidget, 'forms', title = _('Admin role for forms'),
|
114
|
value = permissions_cfg.get('forms', None),
|
115
|
options = [(None, _('Nobody'))] + get_user_roles())
|
116
|
form.add(SingleSelectWidget, 'events', title = _('Admin role for events'),
|
117
|
value = permissions_cfg.get('events', None),
|
118
|
options = [(None, _('Nobody'))] + get_user_roles())
|
119
|
form.add(SingleSelectWidget, 'links', title = _('Admin role for links'),
|
120
|
value = permissions_cfg.get('links', None),
|
121
|
options = [(None, _('Nobody'))] + get_user_roles())
|
122
|
form.add(SingleSelectWidget, 'announces', title = _('Admin role for announces'),
|
123
|
value = permissions_cfg.get('announces', None),
|
124
|
options = [(None, _('Nobody'))] + get_user_roles())
|
125
|
form.add(SingleSelectWidget, 'payments', title = _('Admin role for payments'),
|
126
|
value = permissions_cfg.get('payments', None),
|
127
|
options = [(None, _('Nobody'))] + get_user_roles())
|
128
|
form.add(SingleSelectWidget, 'strongbox', title = _('Admin role for strongbox'),
|
129
|
value = permissions_cfg.get('strongbox', None),
|
130
|
options = [(None, _('Nobody'))] + get_user_roles())
|
131
|
form.add_submit('submit', _('Submit'))
|
132
|
form.add_submit('cancel', _('Cancel'))
|
133
|
|
134
|
if form.get_widget('cancel').parse():
|
135
|
return redirect('.')
|
136
|
|
137
|
if not form.is_submitted() or form.has_errors():
|
138
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
139
|
get_response().breadcrumb.append(('permissions', _('Permissions')))
|
140
|
html_top('panel', _('Permissions'))
|
141
|
r = TemplateIO(html=True)
|
142
|
r += htmltext('<h2>%s</h2>') % _('Permissions')
|
143
|
r += form.render()
|
144
|
return r.getvalue()
|
145
|
else:
|
146
|
from wcs.admin.settings import cfg_submit
|
147
|
cfg_submit(form, 'aq-permissions',
|
148
|
('forms', 'events', 'links', 'announces', 'payments', 'strongbox'))
|
149
|
return redirect('.')
|
150
|
|
151
|
def event_keywords(self):
|
152
|
misc_cfg = get_cfg('misc', {})
|
153
|
form = Form(enctype='multipart/form-data')
|
154
|
form.add(WidgetList, 'event_tags', title = _('Event Keywords'),
|
155
|
value = misc_cfg.get('event_tags', get_default_event_tags()),
|
156
|
elemnt_type = StringWidget,
|
157
|
add_element_label = _('Add Keyword'),
|
158
|
element_kwargs = {str('render_br'): False, str('size'): 30})
|
159
|
|
160
|
form.add_submit('submit', _('Submit'))
|
161
|
form.add_submit('cancel', _('Cancel'))
|
162
|
|
163
|
if form.get_widget('cancel').parse():
|
164
|
return redirect('.')
|
165
|
|
166
|
if not form.is_submitted() or form.has_errors():
|
167
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
168
|
get_response().breadcrumb.append(('event_keywords', _('Event Keywords')))
|
169
|
html_top('panel', _('Event Keywords'))
|
170
|
r = TemplateIO(html=True)
|
171
|
r += htmltext('<h2>%s</h2>') % _('Event Keywords')
|
172
|
r += form.render()
|
173
|
return r.getvalue()
|
174
|
else:
|
175
|
from wcs.admin.settings import cfg_submit
|
176
|
cfg_submit(form, 'misc', ('event_tags',))
|
177
|
return redirect('.')
|
178
|
|
179
|
def announce_themes(self):
|
180
|
misc_cfg = get_cfg('misc', {})
|
181
|
form = Form(enctype='multipart/form-data')
|
182
|
form.add(WidgetList, 'announce_themes', title = _('Announce Themes'),
|
183
|
value = misc_cfg.get('announce_themes', []),
|
184
|
elemnt_type = StringWidget,
|
185
|
add_element_label = _('Add Theme'),
|
186
|
element_kwargs = {str('render_br'): False, str('size'): 30})
|
187
|
|
188
|
form.add_submit('submit', _('Submit'))
|
189
|
form.add_submit('cancel', _('Cancel'))
|
190
|
|
191
|
if form.get_widget('cancel').parse():
|
192
|
return redirect('.')
|
193
|
|
194
|
if not form.is_submitted() or form.has_errors():
|
195
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
196
|
get_response().breadcrumb.append(('announce_themes', _('Announce Themes')))
|
197
|
html_top('panel', _('Announce Themes'))
|
198
|
r = TemplateIO(html=True)
|
199
|
r += htmltext('<h2>%s</h2>') % _('Announce Themes')
|
200
|
r += form.render()
|
201
|
return r.getvalue()
|
202
|
else:
|
203
|
from wcs.admin.settings import cfg_submit
|
204
|
cfg_submit(form, 'misc', ('announce_themes',))
|
205
|
return redirect('.')
|
206
|
|
207
|
def drupal(self):
|
208
|
if not get_publisher().has_site_option('drupal'):
|
209
|
raise errors.TraversalError()
|
210
|
misc_cfg = get_cfg('misc', {})
|
211
|
form = Form(enctype='multipart/form-data')
|
212
|
form.add(StringWidget, 'aq-drupal-ip', title=_('IP Address of Drupal'),
|
213
|
value=misc_cfg.get('aq-drupal-ip'), required=False,
|
214
|
hint=_('Empty for disabled authentication'))
|
215
|
|
216
|
form.add_submit('submit', _('Submit'))
|
217
|
form.add_submit('cancel', _('Cancel'))
|
218
|
|
219
|
if form.get_widget('cancel').parse():
|
220
|
return redirect('.')
|
221
|
|
222
|
if not form.is_submitted() or form.has_errors():
|
223
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
224
|
get_response().breadcrumb.append(('drupal', _('Drupal Integration')))
|
225
|
html_top('panel', _('Drupal Integration'))
|
226
|
r = TemplateIO(html=True)
|
227
|
r += htmltext('<h2>%s</h2>') % _('Drupal Integration')
|
228
|
r += form.render()
|
229
|
return r.getvalue()
|
230
|
else:
|
231
|
from wcs.admin.settings import cfg_submit
|
232
|
cfg_submit(form, 'misc', ('aq-drupal-ip',))
|
233
|
return redirect('.')
|
234
|
|
235
|
def ezldap(self):
|
236
|
if not get_publisher().has_site_option('ezldap'):
|
237
|
raise errors.TraversalError()
|
238
|
misc_cfg = get_cfg('misc', {})
|
239
|
form = Form(enctype='multipart/form-data')
|
240
|
form.add(StringWidget, 'aq-ezldap-url', title=_('LDAP URL'),
|
241
|
value=misc_cfg.get('aq-ezldap-url'), required=False,
|
242
|
hint=_('Empty to disable eZ/LDAP support'))
|
243
|
form.add(StringWidget, 'aq-ezldap-binddn', title=_('LDAP Admin Bind DN'),
|
244
|
value=misc_cfg.get('aq-ezldap-binddn'), required=False)
|
245
|
form.add(PasswordWidget, 'aq-ezldap-bindpassword', title=_('LDAP Admin Bind Password'),
|
246
|
value=misc_cfg.get('aq-ezldap-bindpassword'), required=False)
|
247
|
form.add(StringWidget, 'aq-ezldap-basedn', title=_('LDAP Base DN'),
|
248
|
value=misc_cfg.get('aq-ezldap-basedn'), required=False)
|
249
|
form.add(StringWidget, 'aq-ezldap-dntemplate', title=_('LDAP DN Template'),
|
250
|
value=misc_cfg.get('aq-ezldap-dntemplate'), required=False)
|
251
|
form.add(StringWidget, 'aq-ezldap-ip', title=_('Use Auth-DN header only from this IP'),
|
252
|
value=misc_cfg.get('aq-ezldap-ip'), required=False,
|
253
|
hint=_('Empty to disable IP filtering'))
|
254
|
|
255
|
form.add_submit('submit', _('Submit'))
|
256
|
form.add_submit('cancel', _('Cancel'))
|
257
|
|
258
|
if form.get_widget('cancel').parse():
|
259
|
return redirect('.')
|
260
|
|
261
|
if not form.is_submitted() or form.has_errors():
|
262
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
263
|
get_response().breadcrumb.append(('ezldap', _('eZ publish / LDAP Integration')))
|
264
|
html_top('panel', _('eZ publish / LDAP Integration'))
|
265
|
r = TemplateIO(html=True)
|
266
|
r += htmltext('<h2>%s</h2>') % _('eZ publish / LDAP Integration')
|
267
|
r += form.render()
|
268
|
return r.getvalue()
|
269
|
else:
|
270
|
from wcs.admin.settings import cfg_submit
|
271
|
cfg_submit(form, 'misc', ('aq-ezldap-url',
|
272
|
'aq-ezldap-binddn', 'aq-ezldap-bindpassword',
|
273
|
'aq-ezldap-basedn', 'aq-ezldap-dntemplate',
|
274
|
'aq-ezldap-ip'))
|
275
|
return redirect('.')
|
276
|
|
277
|
def strongbox(self):
|
278
|
if not get_publisher().has_site_option('strongbox'):
|
279
|
raise errors.TraversalError()
|
280
|
misc_cfg = get_cfg('misc', {})
|
281
|
form = Form(enctype='multipart/form-data')
|
282
|
form.add(CheckboxWidget, 'aq-strongbox', title=_('Strongbox Support'),
|
283
|
value=misc_cfg.get('aq-strongbox'), required=False)
|
284
|
|
285
|
form.add_submit('submit', _('Submit'))
|
286
|
form.add_submit('cancel', _('Cancel'))
|
287
|
|
288
|
if form.get_widget('cancel').parse():
|
289
|
return redirect('.')
|
290
|
|
291
|
if not form.is_submitted() or form.has_errors():
|
292
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
293
|
get_response().breadcrumb.append(('strongbox', _('Strongbox Support')))
|
294
|
html_top('panel', _('Strongbox Support'))
|
295
|
r = TemplateIO(html=True)
|
296
|
r += htmltext('<h2>%s</h2>') % _('Strongbox Support')
|
297
|
r += form.render()
|
298
|
return r.getvalue()
|
299
|
else:
|
300
|
from wcs.admin.settings import cfg_submit
|
301
|
cfg_submit(form, 'misc', ('aq-strongbox',))
|
302
|
return redirect('.')
|
303
|
|
304
|
def clicrdv(self):
|
305
|
if not get_publisher().has_site_option('clicrdv'):
|
306
|
raise errors.TraversalError()
|
307
|
misc_cfg = get_cfg('misc', {})
|
308
|
form = Form(enctype='multipart/form-data')
|
309
|
form.add(SingleSelectWidget, 'aq-clicrdv-server', title=_('ClicRDV Server'),
|
310
|
value=misc_cfg.get('aq-clicrdv-server', 'sandbox.clicrdv.com'), required=True,
|
311
|
options=[(str('www.clicrdv.com'), _('Production Server')),
|
312
|
(str('sandbox.clicrdv.com'), _('Sandbox Server'))])
|
313
|
form.add(StringWidget, 'aq-clicrdv-api-key', title=_('API Key'),
|
314
|
value=misc_cfg.get('aq-clicrdv-api-key'), required=False,
|
315
|
size=40, hint=_('Empty to disable ClicRDV support'))
|
316
|
form.add(StringWidget, 'aq-clicrdv-api-username', title=_('Username'),
|
317
|
value=misc_cfg.get('aq-clicrdv-api-username'), required=False)
|
318
|
form.add(StringWidget, 'aq-clicrdv-api-password', title=_('Password'),
|
319
|
value=misc_cfg.get('aq-clicrdv-api-password'), required=False)
|
320
|
|
321
|
form.add_submit('submit', _('Submit'))
|
322
|
form.add_submit('cancel', _('Cancel'))
|
323
|
|
324
|
if form.get_widget('cancel').parse():
|
325
|
return redirect('.')
|
326
|
|
327
|
if not form.is_submitted() or form.has_errors():
|
328
|
get_response().breadcrumb.append(('panel', _('Control Panel')))
|
329
|
get_response().breadcrumb.append(('clicrdv', _('ClicRDV Integration')))
|
330
|
html_top('panel', _('ClicRDV Integration'))
|
331
|
r = TemplateIO(html=True)
|
332
|
r += htmltext('<h2>%s</h2>') % _('ClicRDV Integration')
|
333
|
r += form.render()
|
334
|
r += htmltext('<p>%s</p>') % _('Available Interventions: ')
|
335
|
try:
|
336
|
from clicrdv import get_all_intervention_sets
|
337
|
intervention_sets = get_all_intervention_sets()
|
338
|
r += htmltext('<ul>')
|
339
|
for s in intervention_sets:
|
340
|
r += htmltext('<li><strong>clicrdv_get_interventions_in_set(%s)</strong> - %s') % (
|
341
|
s['id'], s['name'])
|
342
|
r += htmltext('<ul>')
|
343
|
for n, intervention in s['interventions']:
|
344
|
r += htmltext('<li>%s (id: %s)</li>') % (intervention, n)
|
345
|
r += htmltext('</ul></li>')
|
346
|
r += htmltext('</ul>')
|
347
|
except Exception, e:
|
348
|
r += htmltext('<p>%s (%s)</p>') % (
|
349
|
_('Cannot access to ClicRDV service'), str(e))
|
350
|
return r.getvalue()
|
351
|
else:
|
352
|
from wcs.admin.settings import cfg_submit
|
353
|
cfg_submit(form, 'misc', ('aq-clicrdv-server',
|
354
|
'aq-clicrdv-api-key',
|
355
|
'aq-clicrdv-api-username',
|
356
|
'aq-clicrdv-api-password'))
|
357
|
return redirect('.')
|
358
|
|
359
|
|
360
|
AdminRootDirectory.register_page('panel', PanelDirectory())
|
361
|
|
362
|
import categories_admin
|
363
|
|