Project

General

Profile

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

root / extra / modules / events_ui.ptl @ 9e6caf99

1
import time
2

    
3
from quixote import get_request, get_response, get_session, redirect
4
from quixote.directory import Directory, AccessControlled
5

    
6
import wcs
7
import wcs.admin.root
8
from wcs.backoffice.menu import *
9

    
10
from qommon import errors, misc
11
from qommon.form import *
12
from qommon.strftime import strftime
13

    
14
from events import Event, RemoteCalendar
15

    
16

    
17

    
18
class RemoteCalendarDirectory(Directory):
19
    _q_exports = ['', 'edit', 'delete', 'update']
20

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

    
24
    def _q_index [html] (self):
25
        form = Form(enctype='multipart/form-data')
26
        form.add_submit('edit', _('Edit'))
27
        form.add_submit('delete', _('Delete'))
28
        form.add_submit('update', _('Update'))
29
        form.add_submit('back', _('Back'))
30

    
31
        if form.get_submit() == 'edit':
32
            return redirect('edit')
33
        if form.get_submit() == 'update':
34
            return redirect('update')
35
        if form.get_submit() == 'delete':
36
            return redirect('delete')
37
        if form.get_submit() == 'back':
38
            return redirect('..')
39

    
40
        html_top('events', title = _('Remote Calendar: %s') % self.calendar.label)
41
        '<h2>%s</h2>' % _('Remote Calendar: %s') % self.calendar.label
42

    
43
        get_session().display_message()
44

    
45
        '<p>'
46
        self.calendar.url
47
        if self.calendar.error:
48
            ' - <span class="error-message">%s</span>' % self.calendar.get_error_message()
49
        '</p>'
50

    
51
        if not self.calendar.content:
52
            '<p>'
53
            _('No content has been retrieved yet.')
54
            '</p>'
55
        else:
56
            '<ul>'
57
            for ev in sorted(self.calendar.events, lambda x,y: cmp(x.date_start, y.date_start)):
58
                '<li>'
59
                if ev.date_start:
60
                    strftime(misc.date_format(), ev.date_start)
61
                if ev.date_end and ev.date_start[:3] != ev.date_end[:3]:
62
                    ' - '
63
                    strftime(misc.date_format(), ev.date_start)
64

    
65
                ' : '
66
                if ev.url:
67
                    '<a href="%s">%s</a>' % (ev.url, ev.title)
68
                else:
69
                    ev.title
70
                '</li>'
71
            '</ul>'
72

    
73
        form.render()
74

    
75
    def edit [html] (self):
76
        form = self.form()
77
        if form.get_submit() == 'cancel':
78
            return redirect('.')
79

    
80
        if form.is_submitted() and not form.has_errors():
81
            self.submit(form)
82
            return redirect('..')
83

    
84
        html_top('events', title = _('Edit Remote Calendar: %s') % self.calendar.label)
85
        '<h2>%s</h2>' % _('Edit Remote Calendar: %s') % self.calendar.label
86
        form.render()
87

    
88

    
89
    def form(self):
90
        form = Form(enctype='multipart/form-data')
91
        form.add(StringWidget, 'label', title = _('Label'), required = True,
92
                value = self.calendar.label)
93
        form.add(StringWidget, 'url', title = _('URL'), required = True,
94
                value = self.calendar.url, size = 40)
95
        form.add_submit('submit', _('Submit'))
96
        form.add_submit('cancel', _('Cancel'))
97
        return form
98

    
99
    def submit(self, form):
100
        for k in ('label', 'url'):
101
            widget = form.get_widget(k)
102
            if widget:
103
                setattr(self.calendar, k, widget.parse())
104
        self.calendar.store()
105

    
106
    def delete [html] (self):
107
        form = Form(enctype='multipart/form-data')
108
        form.widgets.append(HtmlWidget('<p>%s</p>' % _(
109
                        'You are about to irrevocably delete this remote calendar.')))
110
        form.add_submit('submit', _('Submit'))
111
        form.add_submit('cancel', _('Cancel'))
112
        if form.get_submit() == 'cancel':
113
            return redirect('..')
114
        if not form.is_submitted() or form.has_errors():
115
            get_response().breadcrumb.append(('delete', _('Delete')))
116
            html_top('events', title = _('Delete Remote Calendar'))
117
            '<h2>%s</h2>' % _('Deleting Remote Calendar: %s') % self.calendar.label
118
            form.render()
119
        else:
120
            self.calendar.remove_self()
121
            return redirect('..')
122

    
123
    def update(self):
124
        get_session().message = ('info',
125
                _('Calendar update has been requested, reload in a few moments'))
126
        get_response().add_after_job('updating remote calendar',
127
                self.calendar.download_and_parse,
128
                fire_and_forget = True)
129
        return redirect('.')
130

    
131

    
132

    
133
class RemoteCalendarsDirectory(Directory):
134
    _q_exports = ['', 'new']
135

    
136
    def _q_traverse(self, path):
137
        get_response().breadcrumb.append(('remote/', _('Remote Calendars')))
138
        return Directory._q_traverse(self, path)
139

    
140
    def _q_index [html] (self):
141
        html_top('events', _('Remote Calendars'))
142
        '<p>'
143
        '<a href="new">%s</a>' % _('New')
144
        '</p>'
145

    
146
        events = RemoteCalendar.select()
147

    
148
        '<ul class="biglist" id="events-list">'
149
        for l in events:
150
            event_id = l.id
151
            '<li class="biglistitem" id="itemId_%s">' % event_id
152
            '<strong class="label">%s</strong>' % l.label
153
            '<p class="details">'
154
            l.url
155
            if l.error:
156
                '<br /><span class="error-message">%s</span>' % l.get_error_message()
157
            '</p>'
158
            '<p class="commands">'
159
            command_icon('%s/' % event_id, 'view')
160
            command_icon('%s/edit' % event_id, 'edit')
161
            command_icon('%s/delete' % event_id, 'remove')
162
            '</p></li>'
163
        '</ul>'
164

    
165
    def new [html] (self):
166
        calendar_ui = RemoteCalendarDirectory(RemoteCalendar())
167

    
168
        form = calendar_ui.form()
169
        if form.get_submit() == 'cancel':
170
            return redirect('.')
171

    
172
        if form.is_submitted() and not form.has_errors():
173
            calendar_ui.submit(form)
174
            return redirect('%s/' % calendar_ui.calendar.id)
175

    
176
        get_response().breadcrumb.append(('new', _('New Remote Calendar')))
177
        html_top('events', title = _('New Remote Calendar'))
178
        '<h2>%s</h2>' % _('New Remote Calendar')
179
        form.render()
180

    
181
    def _q_lookup(self, component):
182
        try:
183
            event = RemoteCalendar.get(component)
184
        except KeyError:
185
            raise errors.TraversalError()
186
        get_response().breadcrumb.append((str(event.id), event.label))
187
        return RemoteCalendarDirectory(event)
188

    
189

    
190
class EventDirectory(Directory):
191
    _q_exports = ['', 'edit', 'delete']
192

    
193
    def __init__(self, event):
194
        self.event = event
195

    
196
    def _q_index [html] (self):
197
        form = Form(enctype='multipart/form-data')
198
        form.add_submit('edit', _('Edit'))
199
        form.add_submit('delete', _('Delete'))
200
        form.add_submit('back', _('Back'))
201

    
202
        if form.get_submit() == 'edit':
203
            return redirect('edit')
204
        if form.get_submit() == 'delete':
205
            return redirect('delete')
206
        if form.get_submit() == 'back':
207
            return redirect('..')
208

    
209
        html_top('events', title = _('Event: %s') % self.event.title)
210
        '<h2>%s</h2>' % _('Event: %s') % self.event.title
211
        '<p>'
212
        self.event.description
213
        '</p>'
214

    
215
        form.render()
216

    
217
    def edit [html] (self):
218
        form = self.form()
219
        if form.get_submit() == 'cancel':
220
            return redirect('.')
221

    
222
        if form.is_submitted() and not form.has_errors():
223
            self.submit(form)
224
            return redirect('..')
225

    
226
        html_top('events', title = _('Edit Event: %s') % self.event.title)
227
        '<h2>%s</h2>' % _('Edit Event: %s') % self.event.title
228
        form.render()
229

    
230

    
231
    def form(self):
232
        form = Form(enctype='multipart/form-data')
233
        form.add(StringWidget, 'title', title = _('Title'), required = True,
234
                value = self.event.title)
235
        form.add(TextWidget, 'description', title = _('Description'),
236
                cols = 70, rows = 10,
237
                required = True, value = self.event.description)
238
        form.add(StringWidget, 'url', title = _('URL'), required = False,
239
                value = self.event.url, size = 40)
240
        form.add(DateWidget, 'date_start', title = _('Start Date'), required = True,
241
                value = strftime(misc.date_format(), self.event.date_start))
242
        form.add(DateWidget, 'date_end', title = _('End Date'), required = False,
243
                value = strftime(misc.date_format(), self.event.date_end))
244
        form.add_submit('submit', _('Submit'))
245
        form.add_submit('cancel', _('Cancel'))
246
        return form
247

    
248
    def submit(self, form):
249
        for k in ('title', 'description', 'url', 'date_start', 'date_end'):
250
            widget = form.get_widget(k)
251
            if widget:
252
                if k in ('date_start', 'date_end'):
253
                    # convert dates to 9-item tuples
254
                    v = widget.parse()
255
                    if v:
256
                        setattr(self.event, k, time.strptime(v, misc.date_format()))
257
                    else:
258
                        setattr(self.event, k, None)
259
                else:
260
                    setattr(self.event, k, widget.parse())
261
        self.event.store()
262

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

    
280

    
281

    
282

    
283
class EventsDirectory(AccessControlled, Directory):
284
    _q_exports = ['', 'new', 'listing', 'remote']
285
    label = N_('Events')
286

    
287
    remote = RemoteCalendarsDirectory()
288

    
289
    def _q_access(self):
290
        user = get_request().user
291
        if not user:
292
            raise errors.AccessUnauthorizedError()
293
        if not user.is_admin:
294
            raise errors.AccessForbiddenError(
295
                    public_msg = _('You are not allowed to access Events Management'),
296
                    location_hint = 'backoffice')
297

    
298
        get_response().breadcrumb.append(('events/', _('Events')))
299

    
300

    
301
    def _q_index [html] (self):
302
        html_top('events', _('Events'))
303
        '<p>'
304
        '<a href="new">%s</a>' % _('New')
305
        ' - '
306
        '<a href="remote/">%s</a>' % _('Remote Calendars')
307
        '</p>'
308

    
309
        events = Event.select()
310

    
311
        '<ul class="biglist" id="events-list">'
312
        for l in events:
313
            event_id = l.id
314
            '<li class="biglistitem" id="itemId_%s">' % event_id
315
            '<strong class="label">%s</strong>' % l.title
316
            '<p class="details">'
317
            label = l.description
318
            if len(label) > 60:
319
                label = label[:55] + ' (...)'
320
            label
321
            '</p>'
322
            '<p class="commands">'
323
            command_icon('%s/' % event_id, 'view')
324
            command_icon('%s/edit' % event_id, 'edit')
325
            command_icon('%s/delete' % event_id, 'remove')
326
            '</p></li>'
327
        '</ul>'
328

    
329
    def new [html] (self):
330
        event_ui = EventDirectory(Event())
331

    
332
        form = event_ui.form()
333
        if form.get_submit() == 'cancel':
334
            return redirect('.')
335

    
336
        if form.is_submitted() and not form.has_errors():
337
            event_ui.submit(form)
338
            return redirect('%s/' % event_ui.event.id)
339

    
340
        get_response().breadcrumb.append(('new', _('New Event')))
341
        html_top('events', title = _('New Event'))
342
        '<h2>%s</h2>' % _('New Event')
343
        form.render()
344

    
345
    def _q_lookup(self, component):
346
        try:
347
            event = Event.get(component)
348
        except KeyError:
349
            raise errors.TraversalError()
350
        get_response().breadcrumb.append((str(event.id), event.title))
351
        return EventDirectory(event)
352

    
353
    def listing(self):
354
        return redirect('.')
355

    
(8-8/15)