Projet

Général

Profil

Télécharger (16,7 ko) Statistiques
| Branche: | Tag: | Révision:

root / extra / modules / announces_ui.py @ e008d4d6

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

    
5
import wcs
6
from wcs.backoffice.menu import *
7

    
8
from qommon import errors
9
from qommon.form import *
10
from qommon.afterjobs import AfterJob
11

    
12
from announces import Announce, AnnounceSubscription
13

    
14

    
15
class SubscriptionDirectory(Directory):
16
    _q_exports = ['delete_email', "delete_sms"]
17

    
18
    def __init__(self, subscription):
19
        self.subscription = subscription
20

    
21
    def delete_email(self):
22
        form = Form(enctype='multipart/form-data')
23
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
24
                        'You are about to delete this subscription.')))
25
        form.add_submit('submit', _('Submit'))
26
        form.add_submit('cancel', _('Cancel'))
27
        if form.get_submit() == 'cancel':
28
            return redirect('..')
29
        if not form.is_submitted() or form.has_errors():
30
            get_response().breadcrumb.append(('delete', _('Delete')))
31
            html_top('announces', title = _('Delete Subscription'))
32
            r = TemplateIO(html=True)
33
            r += htmltext('<h2>%s</h2>') % _('Deleting Subscription')
34
            r += form.render()
35
            return r.getvalue()
36
        else:
37
            self.subscription.remove("email")
38
            return redirect('..')
39

    
40
    def delete_sms(self):
41
        form = Form(enctype='multipart/form-data')
42
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
43
                        'You are about to delete this subscription.')))
44
        form.add_submit('submit', _('Submit'))
45
        form.add_submit('cancel', _('Cancel'))
46
        if form.get_submit() == 'cancel':
47
            return redirect('..')
48
        if not form.is_submitted() or form.has_errors():
49
            get_response().breadcrumb.append(('delete', _('Delete')))
50
            html_top('announces', title = _('Delete Subscription'))
51
            r = TemplateIO(html=True)
52
            r += htmltext('<h2>%s</h2>') % _('Deleting Subscription')
53
            r += form.render()
54
            return r.getvalue()
55
        else:
56
            self.subscription.remove("sms")
57
            return redirect('..')
58

    
59

    
60
class SubscriptionsDirectory(Directory):
61
    _q_exports = ['']
62

    
63
    def _q_traverse(self, path):
64
        get_response().breadcrumb.append(('subscriptions', _('Subscriptions')))
65
        return Directory._q_traverse(self, path)
66

    
67
    def _q_index(self):
68
        html_top('announces', _('Announces Subscribers'))
69
        r = TemplateIO(html=True)
70

    
71
        r += htmltext('<h2>%s</h2>') % _('Announces Subscribers')
72

    
73
        subscribers = AnnounceSubscription.select()
74
        r += htmltext('<ul class="biglist" id="subscribers-list">')
75
        for l in subscribers:
76
            if l.email:
77
                if l.enabled is False:
78
                    r += htmltext('<li class="disabled">')
79
                else:
80
                    r += htmltext('<li>')
81
                r += htmltext('<strong class="label">')
82
                if l.user:
83
                    r += l.user.display_name
84
                elif l.email:
85
                    r += l.email
86
                r += htmltext('</strong>')
87
                r += htmltext('<p class="details">')
88
                if l.user:
89
                    r += l.user.email
90
                r += htmltext('</p>')
91
                r += htmltext('<p class="commands">')
92
                r += command_icon('%s/delete_email' % l.id, 'remove', popup = True)
93
                r += htmltext('</p></li>')
94
                r += htmltext('</li>')
95
            if l.sms:
96
                if l.enabled_sms is False:
97
                    r += htmltext('<li class="disabled">')
98
                else:
99
                    r += htmltext('<li>')
100
                r += htmltext('<strong class="label">')
101
                if l.user:
102
                    r += l.user.display_name
103
                elif l.email:
104
                    r += l.email
105
                r += htmltext('</strong>')
106
                r += htmltext('<p class="details">')
107
                r += l.sms
108
                r += htmltext('</p>')
109
                r += htmltext('<p class="commands">')
110
                r += command_icon('%s/delete_sms' % l.id, 'remove', popup = True)
111
                r += htmltext('</p></li>')
112
                r += htmltext('</li>')
113
        r += htmltext('</ul>')
114
        return r.getvalue()
115

    
116
    def _q_lookup(self, component):
117
        try:
118
            sub = AnnounceSubscription.get(component)
119
        except KeyError:
120
            raise errors.TraversalError()
121
        get_response().breadcrumb.append((str(sub.id), str(sub.id)))
122
        return SubscriptionDirectory(sub)
123

    
124
    def listing(self):
125
        return redirect('.')
126

    
127
class AnnounceDirectory(Directory):
128
    _q_exports = ['', 'edit', 'delete', 'email', 'sms']
129

    
130
    def __init__(self, announce):
131
        self.announce = announce
132

    
133
    def _q_index(self):
134
        form = Form(enctype='multipart/form-data')
135
        get_response().filter['sidebar'] = self.get_sidebar()
136

    
137
        if self.announce.sent_by_email_time is None:
138
            form.add_submit('email', _('Send email'))
139

    
140
        announces_cfg = get_cfg('announces', {})
141
        if announces_cfg.get('sms_support', 0) and self.announce.sent_by_sms_time is None:
142
            form.add_submit('sms', _('Send SMS'))
143

    
144
        if form.get_submit() == 'edit':
145
            return redirect('edit')
146
        if form.get_submit() == 'delete':
147
            return redirect('delete')
148
        if form.get_submit() == 'email':
149
            return redirect('email')
150
        if form.get_submit() == 'sms':
151
            return redirect('sms')
152

    
153
        html_top('announces', title = _('Announce: %s') % self.announce.title)
154
        r = TemplateIO(html=True)
155
        r += htmltext('<h2>%s</h2>') % _('Announce: %s') % self.announce.title
156
        r += htmltext('<div class="bo-block">')
157
        r += htmltext('<p>')
158
        r += self.announce.text
159
        r += htmltext('</p>')
160
        r += htmltext('</div>')
161

    
162
        if form.get_submit_widgets():
163
            r += form.render()
164

    
165
        return r.getvalue()
166

    
167
    def get_sidebar(self):
168
        r = TemplateIO(html=True)
169
        r += htmltext('<ul>')
170
        r += htmltext('<li><a href="edit">%s</a></li>') % _('Edit')
171
        r += htmltext('<li><a href="delete">%s</a></li>') % _('Delete')
172
        r += htmltext('</ul>')
173
        return r.getvalue()
174

    
175
    def email(self):
176
        if get_request().form.get('job'):
177
            try:
178
                job = AfterJob.get(get_request().form.get('job'))
179
            except KeyError:
180
                return redirect('..')
181
            html_top('announces', title = _('Announce: %s') % self.announce.title)
182
            r = TemplateIO(html=True)
183
            get_response().add_javascript(['jquery.js', 'afterjob.js'])
184
            r += htmltext('<dl class="job-status">')
185
            r += htmltext('<dt>')
186
            r += _(job.label)
187
            r += htmltext('</dt>')
188
            r += htmltext('<dd>')
189
            r += htmltext('<span class="afterjob" id="%s">') % job.id
190
            r += _(job.status)
191
            r += htmltext('</span>')
192
            r += htmltext('</dd>')
193
            r += htmltext('</dl>')
194

    
195
            r += htmltext('<div class="done">')
196
            r += htmltext('<a href="../">%s</a>') % _('Back')
197
            r += htmltext('</div>')
198

    
199
            return r.getvalue()
200
        else:
201
            job = get_response().add_after_job(
202
                    str(N_('Sending emails for announce')),
203
                    self.announce.email)
204
            return redirect('email?job=%s' % job.id)
205

    
206
    def sms(self):
207
        if get_request().form.get('job'):
208
            try:
209
                job = AfterJob.get(get_request().form.get('job'))
210
            except KeyError:
211
                return redirect('..')
212
            html_top('announces', title = _('Announce: %s') % self.announce.title)
213
            get_response().add_javascript(['jquery.js', 'afterjob.js'])
214
            r = TemplateIO(html=True)
215
            r += htmltext('<dl class="job-status">')
216
            r += htmltext('<dt>')
217
            r += _(job.label)
218
            r += htmltext('</dt>')
219
            r += htmltext('<dd>')
220
            r += htmltext('<span class="afterjob" id="%s">') % job.id
221
            r += _(job.status)
222
            r += htmltext('</span>')
223
            r += htmltext('</dd>')
224
            r += htmltext('</dl>')
225

    
226
            r += htmltext('<div class="done">')
227
            r += htmltext('<a href="../">%s</a>') % _('Back')
228
            r += htmltext('</div>')
229

    
230
            return r.getvalue()
231
        else:
232
            job = get_response().add_after_job(
233
                    str(N_('Sending sms for announce')),
234
                    self.announce.sms)
235
            return redirect('sms?job=%s' % job.id)
236

    
237
    def edit(self):
238
        form = self.form()
239
        if form.get_submit() == 'cancel':
240
            return redirect('.')
241

    
242
        if form.is_submitted() and not form.has_errors():
243
            self.submit(form)
244
            return redirect('..')
245

    
246
        html_top('announces', title = _('Edit Announce: %s') % self.announce.title)
247
        r = TemplateIO(html=True)
248
        r += htmltext('<h2>%s</h2>') % _('Edit Announce: %s') % self.announce.title
249
        r += form.render()
250
        return r.getvalue()
251

    
252
    def form(self):
253
        form = Form(enctype='multipart/form-data')
254
        form.add(StringWidget, 'title', title = _('Title'), required = True,
255
                value = self.announce.title)
256
        if self.announce.publication_time:
257
            pub_time = time.strftime(misc.date_format(), self.announce.publication_time)
258
        else:
259
            pub_time = None
260
        form.add(DateWidget, 'publication_time', title = _('Publication Time'),
261
                value = pub_time)
262
        if self.announce.expiration_time:
263
            exp_time = time.strftime(misc.date_format(), self.announce.expiration_time)
264
        else:
265
            exp_time = None
266
        form.add(DateWidget, 'expiration_time', title = _('Expiration Time'),
267
                value = exp_time)
268
        form.add(TextWidget, 'text', title = _('Text'), required = True,
269
                value = self.announce.text, rows = 10, cols = 70)
270
        if get_cfg('misc', {}).get('announce_themes'):
271
            form.add(SingleSelectWidget, 'theme', title = _('Announce Theme'),
272
                    value = self.announce.theme,
273
                    options = get_cfg('misc', {}).get('announce_themes'))
274
        form.add(CheckboxWidget, 'hidden', title = _('Hidden'),
275
                value = self.announce.hidden)
276
        form.add_submit('submit', _('Submit'))
277
        form.add_submit('cancel', _('Cancel'))
278
        return form
279

    
280
    def submit(self, form):
281
        for k in ('title', 'text', 'hidden', 'theme'):
282
            widget = form.get_widget(k)
283
            if widget:
284
                setattr(self.announce, k, widget.parse())
285
        for k in ('publication_time', 'expiration_time'):
286
            widget = form.get_widget(k)
287
            if widget:
288
                wid_time = widget.parse()
289
                if wid_time:
290
                    setattr(self.announce, k, time.strptime(wid_time, misc.date_format()))
291
                else:
292
                    setattr(self.announce, k, None)
293
        self.announce.store()
294

    
295
    def delete(self):
296
        form = Form(enctype='multipart/form-data')
297
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
298
                        'You are about to irrevocably delete this announce.')))
299
        form.add_submit('submit', _('Submit'))
300
        form.add_submit('cancel', _('Cancel'))
301
        if form.get_submit() == 'cancel':
302
            return redirect('..')
303
        if not form.is_submitted() or form.has_errors():
304
            get_response().breadcrumb.append(('delete', _('Delete')))
305
            html_top('announces', title = _('Delete Announce'))
306
            r = TemplateIO(html=True)
307
            r += htmltext('<h2>%s</h2>') % _('Deleting Announce: %s') % self.announce.title
308
            r += form.render()
309
            return r.getvalue()
310
        else:
311
            self.announce.remove_self()
312
            return redirect('..')
313

    
314

    
315
class AnnouncesDirectory(AccessControlled, Directory):
316
    _q_exports = ['', 'new', 'listing', 'subscriptions', 'update_order', 'log']
317
    label = N_('Announces')
318

    
319
    subscriptions = SubscriptionsDirectory()
320

    
321
    def _q_access(self):
322
        user = get_request().user
323
        if not user:
324
            raise errors.AccessUnauthorizedError()
325
        admin_role = get_cfg('aq-permissions', {}).get('announces', None)
326
        if not (user.is_admin or admin_role in (user.roles or [])):
327
            raise errors.AccessForbiddenError(
328
                    public_msg = _('You are not allowed to access Announces Management'),
329
                    location_hint = 'backoffice')
330

    
331
        get_response().breadcrumb.append(('announces/', _('Announces')))
332

    
333
    def _q_index(self):
334
        html_top('announces', _('Announces'))
335
        r = TemplateIO(html=True)
336

    
337
        r += htmltext('<ul id="main-actions">')
338
        r += htmltext(' <li><a class="new-item" href="new">%s</a></li>') % _('New')
339
        r += htmltext(' <li><a href="subscriptions/">%s</a></li>') % _('Subscriptions')
340
        r += htmltext(' <li><a href="log">%s</a></li>') % _('Log')
341
        r += htmltext('</ul>')
342

    
343
        announces = Announce.select()
344
        announces.sort(lambda x,y: cmp(x.publication_time or x.modification_time,
345
                    y.publication_time or y.modification_time))
346
        announces.reverse()
347

    
348
        r += htmltext('<ul class="biglist" id="announces-list">')
349
        for l in announces:
350
            announce_id = l.id
351
            if l.hidden:
352
                r += htmltext('<li class="disabled" class="biglistitem" id="itemId_%s">') % announce_id
353
            else:
354
                r += htmltext('<li class="biglistitem" id="itemId_%s">') % announce_id
355
            r += htmltext('<strong class="label"><a href="%s/">%s</a></strong>') % (l.id, l.title)
356
            if l.publication_time:
357
                r += htmltext('<p class="details">')
358
                r += time.strftime(misc.date_format(), l.publication_time)
359
                r += htmltext('</p>')
360
            r += htmltext('</li>')
361
        r += htmltext('</ul>')
362
        return r.getvalue()
363

    
364
    def log(self):
365
        announces = Announce.select()
366
        log = []
367
        for l in announces:
368
            if l.publication_time:
369
                log.append((l.publication_time, _('Publication'), l))
370
            if l.sent_by_email_time:
371
                log.append((l.sent_by_email_time, _('Email'), l))
372
            if l.sent_by_sms_time:
373
                log.append((l.sent_by_sms_time, _('SMS'), l))
374
        log.sort()
375

    
376
        get_response().breadcrumb.append(('log', _('Log')))
377
        html_top('announces', title = _('Log'))
378
        r = TemplateIO(html=True)
379

    
380
        r += htmltext('<table>')
381
        r += htmltext('<thead>')
382
        r += htmltext('<tr>')
383
        r += htmltext('<th>%s</th>') % _('Time')
384
        r += htmltext('<th>%s</th>') % _('Type')
385
        r += htmltext('<td></td>')
386
        r += htmltext('</tr>')
387
        r += htmltext('</thead>')
388
        r += htmltext('<tbody>')
389
        for log_time, log_type, log_announce in log:
390
            r += htmltext('<tr>')
391
            r += htmltext('<td>')
392
            r += misc.localstrftime(log_time)
393
            r += htmltext('</td>')
394
            r += htmltext('<td>')
395
            r += log_type
396
            r += htmltext('</td>')
397
            r += htmltext('<td>')
398
            r += htmltext('<a href="%s">%s</a>') % (log_announce.id, log_announce.title)
399
            r += htmltext('</td>')
400
            r += htmltext('</tr>')
401
        r += htmltext('</tbody>')
402
        r += htmltext('</table>')
403
        return r.getvalue()
404

    
405
    def update_order(self):
406
        request = get_request()
407
        new_order = request.form['order'].strip(';').split(';')
408
        announces = Announce.select()
409
        dict = {}
410
        for l in announces:
411
            dict[str(l.id)] = l
412
        for i, o in enumerate(new_order):
413
            dict[o].position = i + 1
414
            dict[o].store()
415
        return 'ok'
416

    
417
    def new(self):
418
        announce = Announce()
419
        announce.publication_time = time.gmtime()
420
        announce_ui = AnnounceDirectory(announce)
421

    
422
        form = announce_ui.form()
423
        if form.get_submit() == 'cancel':
424
            return redirect('.')
425

    
426
        if form.is_submitted() and not form.has_errors():
427
            announce_ui.submit(form)
428
            return redirect('%s/' % announce_ui.announce.id)
429

    
430
        get_response().breadcrumb.append(('new', _('New Announce')))
431
        html_top('announces', title = _('New Announce'))
432
        r = TemplateIO(html=True)
433
        r += htmltext('<h2>%s</h2>') % _('New Announce')
434
        r += form.render()
435
        return r.getvalue()
436

    
437
    def _q_lookup(self, component):
438
        try:
439
            announce = Announce.get(component)
440
        except KeyError:
441
            raise errors.TraversalError()
442
        get_response().breadcrumb.append((str(announce.id), announce.title))
443
        return AnnounceDirectory(announce)
444

    
445
    def listing(self):
446
        return redirect('.')
447

    
(10-10/33)