Projet

Général

Profil

Télécharger (17 ko) Statistiques
| Branche: | Tag: | Révision:

root / auquotidien / modules / announces_ui.py @ 8b02623d

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

    
7
from qommon import _
8
from qommon.backoffice.menu import html_top
9
from qommon.admin.menu import command_icon
10
from qommon import get_cfg
11
from qommon import errors
12
from qommon.form import *
13
from qommon.afterjobs import AfterJob
14

    
15
from announces import Announce, AnnounceSubscription
16

    
17

    
18
class SubscriptionDirectory(Directory):
19
    _q_exports = ['delete_email', "delete_sms"]
20

    
21
    def __init__(self, subscription):
22
        self.subscription = subscription
23

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

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

    
62

    
63
class SubscriptionsDirectory(Directory):
64
    _q_exports = ['']
65

    
66
    def _q_traverse(self, path):
67
        get_response().breadcrumb.append(('subscriptions', _('Subscriptions')))
68
        return Directory._q_traverse(self, path)
69

    
70
    def _q_index(self):
71
        html_top('announces', _('Announces Subscribers'))
72
        r = TemplateIO(html=True)
73

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

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

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

    
127
    def listing(self):
128
        return redirect('.')
129

    
130
class AnnounceDirectory(Directory):
131
    _q_exports = ['', 'edit', 'delete', 'email', 'sms']
132

    
133
    def __init__(self, announce):
134
        self.announce = announce
135

    
136
    def _q_index(self):
137
        form = Form(enctype='multipart/form-data')
138
        get_response().filter['sidebar'] = self.get_sidebar()
139

    
140
        if self.announce.sent_by_email_time is None:
141
            form.add_submit('email', _('Send email'))
142

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

    
147
        if form.get_submit() == 'edit':
148
            return redirect('edit')
149
        if form.get_submit() == 'delete':
150
            return redirect('delete')
151
        if form.get_submit() == 'email':
152
            return redirect('email')
153
        if form.get_submit() == 'sms':
154
            return redirect('sms')
155

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

    
165
        if form.get_submit_widgets():
166
            r += form.render()
167

    
168
        return r.getvalue()
169

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

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

    
198
            r += htmltext('<div class="done">')
199
            r += htmltext('<a href="../">%s</a>') % _('Back')
200
            r += htmltext('</div>')
201

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

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

    
229
            r += htmltext('<div class="done">')
230
            r += htmltext('<a href="../">%s</a>') % _('Back')
231
            r += htmltext('</div>')
232

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

    
240
    def edit(self):
241
        form = self.form()
242
        if form.get_submit() == 'cancel':
243
            return redirect('.')
244

    
245
        if form.is_submitted() and not form.has_errors():
246
            self.submit(form)
247
            return redirect('..')
248

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

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

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

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

    
317

    
318
class AnnouncesDirectory(AccessControlled, Directory):
319
    _q_exports = ['', 'new', 'listing', 'subscriptions', 'update_order', 'log']
320
    label = N_('Announces')
321

    
322
    subscriptions = SubscriptionsDirectory()
323

    
324
    def is_accessible(self, user):
325
        from .backoffice import check_visibility
326
        return check_visibility('announces', user)
327

    
328
    def _q_access(self):
329
        user = get_request().user
330
        if not user:
331
            raise errors.AccessUnauthorizedError()
332

    
333
        if not self.is_accessible(user):
334
            raise errors.AccessForbiddenError(
335
                    public_msg = _('You are not allowed to access Announces Management'),
336
                    location_hint = 'backoffice')
337

    
338
        get_response().breadcrumb.append(('announces/', _('Announces')))
339

    
340
    def _q_index(self):
341
        html_top('announces', _('Announces'))
342
        r = TemplateIO(html=True)
343

    
344
        get_response().filter['sidebar'] = self.get_sidebar()
345

    
346
        announces = Announce.select()
347
        announces.sort(lambda x,y: cmp(x.publication_time or x.modification_time,
348
                    y.publication_time or y.modification_time))
349
        announces.reverse()
350

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

    
367
    def get_sidebar(self):
368
        r = TemplateIO(html=True)
369
        r += htmltext('<ul id="sidebar-actions">')
370
        r += htmltext(' <li><a class="new-item" href="new">%s</a></li>') % _('New')
371
        r += htmltext(' <li><a href="subscriptions/">%s</a></li>') % _('Subscriptions')
372
        r += htmltext(' <li><a href="log">%s</a></li>') % _('Log')
373
        r += htmltext('</ul>')
374
        return r.getvalue()
375

    
376
    def log(self):
377
        announces = Announce.select()
378
        log = []
379
        for l in announces:
380
            if l.publication_time:
381
                log.append((l.publication_time, _('Publication'), l))
382
            if l.sent_by_email_time:
383
                log.append((l.sent_by_email_time, _('Email'), l))
384
            if l.sent_by_sms_time:
385
                log.append((l.sent_by_sms_time, _('SMS'), l))
386
        log.sort()
387

    
388
        get_response().breadcrumb.append(('log', _('Log')))
389
        html_top('announces', title = _('Log'))
390
        r = TemplateIO(html=True)
391

    
392
        r += htmltext('<table>')
393
        r += htmltext('<thead>')
394
        r += htmltext('<tr>')
395
        r += htmltext('<th>%s</th>') % _('Time')
396
        r += htmltext('<th>%s</th>') % _('Type')
397
        r += htmltext('<td></td>')
398
        r += htmltext('</tr>')
399
        r += htmltext('</thead>')
400
        r += htmltext('<tbody>')
401
        for log_time, log_type, log_announce in log:
402
            r += htmltext('<tr>')
403
            r += htmltext('<td>')
404
            r += misc.localstrftime(log_time)
405
            r += htmltext('</td>')
406
            r += htmltext('<td>')
407
            r += log_type
408
            r += htmltext('</td>')
409
            r += htmltext('<td>')
410
            r += htmltext('<a href="%s">%s</a>') % (log_announce.id, log_announce.title)
411
            r += htmltext('</td>')
412
            r += htmltext('</tr>')
413
        r += htmltext('</tbody>')
414
        r += htmltext('</table>')
415
        return r.getvalue()
416

    
417
    def update_order(self):
418
        request = get_request()
419
        new_order = request.form['order'].strip(';').split(';')
420
        announces = Announce.select()
421
        dict = {}
422
        for l in announces:
423
            dict[str(l.id)] = l
424
        for i, o in enumerate(new_order):
425
            dict[o].position = i + 1
426
            dict[o].store()
427
        return 'ok'
428

    
429
    def new(self):
430
        announce = Announce()
431
        announce.publication_time = time.gmtime()
432
        announce_ui = AnnounceDirectory(announce)
433

    
434
        form = announce_ui.form()
435
        if form.get_submit() == 'cancel':
436
            return redirect('.')
437

    
438
        if form.is_submitted() and not form.has_errors():
439
            announce_ui.submit(form)
440
            return redirect('%s/' % announce_ui.announce.id)
441

    
442
        get_response().breadcrumb.append(('new', _('New Announce')))
443
        html_top('announces', title = _('New Announce'))
444
        r = TemplateIO(html=True)
445
        r += htmltext('<h2>%s</h2>') % _('New Announce')
446
        r += form.render()
447
        return r.getvalue()
448

    
449
    def _q_lookup(self, component):
450
        try:
451
            announce = Announce.get(component)
452
        except KeyError:
453
            raise errors.TraversalError()
454
        get_response().breadcrumb.append((str(announce.id), announce.title))
455
        return AnnounceDirectory(announce)
456

    
457
    def listing(self):
458
        return redirect('.')
459

    
(10-10/27)