Project

General

Profile

Download (12.8 KB) Statistics
| Branch: | Tag: | Revision:

root / extra / modules / announces_ui.ptl @ e3bbea04

1
from quixote import get_request, get_response, get_session, redirect
2
from quixote.directory import Directory, AccessControlled
3

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

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

    
11
from announces import Announce, AnnounceSubscription
12

    
13

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

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

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

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

    
54

    
55
class SubscriptionsDirectory(Directory):
56
    _q_exports = ['']
57

    
58
    def _q_traverse(self, path):
59
        get_response().breadcrumb.append(('subscriptions', _('Subscriptions')))
60
        return Directory._q_traverse(self, path)
61

    
62
    def _q_index [html] (self):
63
        html_top('announces', _('Announces Subscribers'))
64

    
65
        '<h2>%s</h2>' % _('Announces Subscribers')
66

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

    
109
    def _q_lookup(self, component):
110
        try:
111
            sub = AnnounceSubscription.get(component)
112
        except KeyError:
113
            raise errors.TraversalError()
114
        get_response().breadcrumb.append((str(sub.id), str(sub.id)))
115
        return SubscriptionDirectory(sub)
116

    
117
    def listing(self):
118
        return redirect('.')
119

    
120
class AnnounceDirectory(Directory):
121
    _q_exports = ['', 'edit', 'delete', 'email', 'sms']
122

    
123
    def __init__(self, announce):
124
        self.announce = announce
125

    
126
    def _q_index [html] (self):
127
        form = Form(enctype='multipart/form-data')
128
        form.add_submit('edit', _('Edit'))
129
        form.add_submit('delete', _('Delete'))
130
        if self.announce.sent_by_email_time is None:
131
            form.add_submit('email', _('Send email'))
132
        if self.announce.sent_by_sms_time is None:
133
            form.add_submit('sms', _('Send SMS'))
134
        form.add_submit('back', _('Back'))
135

    
136
        if form.get_submit() == 'edit':
137
            return redirect('edit')
138
        if form.get_submit() == 'delete':
139
            return redirect('delete')
140
        if form.get_submit() == 'email':
141
            return redirect('email')
142
        if form.get_submit() == 'sms':
143
            return redirect('sms')
144
        if form.get_submit() == 'back':
145
            return redirect('..')
146

    
147
        html_top('announces', title = _('Announce: %s') % self.announce.title)
148
        '<h2>%s</h2>' % _('Announce: %s') % self.announce.title
149
        '<p>'
150
        self.announce.text
151
        '</p>'
152

    
153
        form.render()
154

    
155
    def email [html] (self):
156
        if get_request().form.get('job'):
157
            try:
158
                job = AfterJob.get(get_request().form.get('job'))
159
            except KeyError:
160
                return redirect('..')
161
            html_top('announces', title = _('Announce: %s') % self.announce.title)
162
            get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
163
            '<dl class="job-status">'
164
            '<dt>'
165
            _(job.label)
166
            '</dt>'
167
            '<dd>'
168
            '<span class="afterjob" id="%s">' % job.id
169
            _(job.status)
170
            '</span>'
171
            '</dd>'
172
            '</dl>'
173

    
174
            '<div class="done">'
175
            '<a href="../">%s</a>' % _('Back')
176
            '</div>'
177

    
178
        else:
179
            job = get_response().add_after_job(
180
                    str(N_('Sending emails for announce')),
181
                    self.announce.email)
182
            return redirect('email?job=%s' % job.id)
183

    
184
    def sms [html] (self):
185
        if get_request().form.get('job'):
186
            try:
187
                job = AfterJob.get(get_request().form.get('job'))
188
            except KeyError:
189
                return redirect('..')
190
            html_top('announces', title = _('Announce: %s') % self.announce.title)
191
            get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
192
            '<dl class="job-status">'
193
            '<dt>'
194
            _(job.label)
195
            '</dt>'
196
            '<dd>'
197
            '<span class="afterjob" id="%s">' % job.id
198
            _(job.status)
199
            '</span>'
200
            '</dd>'
201
            '</dl>'
202

    
203
            '<div class="done">'
204
            '<a href="../">%s</a>' % _('Back')
205
            '</div>'
206

    
207
        else:
208
            job = get_response().add_after_job(
209
                    str(N_('Sending sms for announce')),
210
                    self.announce.sms)
211
            return redirect('sms?job=%s' % job.id)
212

    
213
    def edit [html] (self):
214
        form = self.form()
215
        if form.get_submit() == 'cancel':
216
            return redirect('.')
217

    
218
        if form.is_submitted() and not form.has_errors():
219
            self.submit(form)
220
            return redirect('..')
221

    
222
        html_top('announces', title = _('Edit Announce: %s') % self.announce.title)
223
        '<h2>%s</h2>' % _('Edit Announce: %s') % self.announce.title
224
        form.render()
225

    
226

    
227
    def form(self):
228
        form = Form(enctype='multipart/form-data')
229
        form.add(StringWidget, 'title', title = _('Title'), required = True,
230
                value = self.announce.title)
231
        if self.announce.publication_time:
232
            pub_time = time.strftime(misc.date_format(), self.announce.publication_time)
233
        else:
234
            pub_time = None
235
        form.add(DateWidget, 'publication_time', title = _('Publication Time'),
236
                value = pub_time)
237
        form.add(TextWidget, 'text', title = _('Text'), required = True,
238
                value = self.announce.text, rows = 10, cols = 70)
239
        form.add(CheckboxWidget, 'hidden', title = _('Hidden'),
240
                value = self.announce.hidden)
241
        form.add_submit('submit', _('Submit'))
242
        form.add_submit('cancel', _('Cancel'))
243
        return form
244

    
245
    def submit(self, form):
246
        for k in ('title', 'text', 'hidden'):
247
            widget = form.get_widget(k)
248
            if widget:
249
                setattr(self.announce, k, widget.parse())
250
        widget = form.get_widget('publication_time')
251
        if widget:
252
            pub_time = widget.parse()
253
            if pub_time:
254
                self.announce.publication_time = time.strptime(pub_time, misc.date_format())
255
            else:
256
                self.announce.publication_time = None
257
        self.announce.store()
258

    
259
    def delete [html] (self):
260
        form = Form(enctype='multipart/form-data')
261
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
262
                        'You are about to irrevocably delete this announce.')))
263
        form.add_submit('submit', _('Submit'))
264
        form.add_submit('cancel', _('Cancel'))
265
        if form.get_submit() == 'cancel':
266
            return redirect('..')
267
        if not form.is_submitted() or form.has_errors():
268
            get_response().breadcrumb.append(('delete', _('Delete')))
269
            html_top('announces', title = _('Delete Announce'))
270
            '<h2>%s</h2>' % _('Deleting Announce: %s') % self.announce.title
271
            form.render()
272
        else:
273
            self.announce.remove_self()
274
            return redirect('..')
275

    
276

    
277

    
278
class AnnouncesDirectory(AccessControlled, Directory):
279
    _q_exports = ['', 'new', 'listing', 'subscriptions', 'update_order']
280
    label = N_('Announces')
281

    
282
    subscriptions = SubscriptionsDirectory()
283

    
284
    def _q_access(self):
285
        user = get_request().user
286
        if not user:
287
            raise errors.AccessUnauthorizedError()
288
        admin_role = get_cfg('aq-permissions', {}).get('announces', None)
289
        if not (user.is_admin or admin_role in (user.roles or [])):
290
            raise errors.AccessForbiddenError(
291
                    public_msg = _('You are not allowed to access Announces Management'),
292
                    location_hint = 'backoffice')
293

    
294
        get_response().breadcrumb.append(('announces/', _('Announces')))
295

    
296

    
297
    def _q_index [html] (self):
298
        html_top('announces', _('Announces'))
299
        '<ul>'
300
        ' <li><a href="new">%s</a></li>' % _('New')
301
        ' <li><a href="subscriptions/">%s</a></li>' % _('Subscriptions')
302
        '</ul>'
303

    
304
        announces = Announce.select()
305
        announces.sort(lambda x,y: cmp(x.publication_time or x.modification_time,
306
                    y.publication_time or y.modification_time))
307
        announces.reverse()
308

    
309
        '<ul class="biglist" id="announces-list">'
310
        for l in announces:
311
            announce_id = l.id
312
            if l.hidden:
313
                '<li class="disabled" class="biglistitem" id="itemId_%s">' % announce_id
314
            else:
315
                '<li class="biglistitem" id="itemId_%s">' % announce_id
316
            '<strong class="label">%s</strong>' % l.title
317
            if l.publication_time:
318
                '<p class="details">'
319
                time.strftime(misc.date_format(), l.publication_time)
320
                '</p>'
321
            '<p class="commands">'
322
            command_icon('%s/' % announce_id, 'view')
323
            command_icon('%s/edit' % announce_id, 'edit')
324
            command_icon('%s/delete' % announce_id, 'remove')
325
            '</p></li>'
326
        '</ul>'
327

    
328
    def update_order(self):
329
        request = get_request()
330
        new_order = request.form['order'].strip(';').split(';')
331
        announces = Announce.select()
332
        dict = {}
333
        for l in announces:
334
            dict[str(l.id)] = l
335
        for i, o in enumerate(new_order):
336
            dict[o].position = i + 1
337
            dict[o].store()
338
        return 'ok'
339

    
340

    
341
    def new [html] (self):
342
        announce = Announce()
343
        announce.publication_time = time.gmtime()
344
        announce_ui = AnnounceDirectory(announce)
345

    
346
        form = announce_ui.form()
347
        if form.get_submit() == 'cancel':
348
            return redirect('.')
349

    
350
        if form.is_submitted() and not form.has_errors():
351
            announce_ui.submit(form)
352
            return redirect('%s/' % announce_ui.announce.id)
353

    
354
        get_response().breadcrumb.append(('new', _('New Announce')))
355
        html_top('announces', title = _('New Announce'))
356
        '<h2>%s</h2>' % _('New Announce')
357
        form.render()
358

    
359
    def _q_lookup(self, component):
360
        try:
361
            announce = Announce.get(component)
362
        except KeyError:
363
            raise errors.TraversalError()
364
        get_response().breadcrumb.append((str(announce.id), announce.title))
365
        return AnnounceDirectory(announce)
366

    
367
    def listing(self):
368
        return redirect('.')
369

    
(5-5/15)