Projet

Général

Profil

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

root / extra / modules / announces_ui.py @ c182b1ab

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.backoffice.menu import html_top
8
from qommon.admin.menu import command_icon
9
from qommon import get_cfg
10
from qommon import errors
11
from qommon.form import *
12
from qommon.afterjobs import AfterJob
13

    
14
from announces import Announce, AnnounceSubscription
15

    
16

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

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

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

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

    
61

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
167
        return r.getvalue()
168

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

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

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

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

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

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

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

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

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

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

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

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

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

    
316

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

    
321
    subscriptions = SubscriptionsDirectory()
322

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
(10-10/30)