source: main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py @ 6635

Last change on this file since 6635 was 6635, checked in by Henrik Bettermann, 13 years ago

Make action buttons smaller on studentpage.

Add StudentAccommodation? container class which contains the accommodation objects.

Add StudentPayments? container class which contains the payments objects.

  • Property svn:keywords set to Id
File size: 13.9 KB
Line 
1## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
2## This program is free software; you can redistribute it and/or modify
3## it under the terms of the GNU General Public License as published by
4## the Free Software Foundation; either version 2 of the License, or
5## (at your option) any later version.
6##
7## This program is distributed in the hope that it will be useful,
8## but WITHOUT ANY WARRANTY; without even the implied warranty of
9## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10## GNU General Public License for more details.
11##
12## You should have received a copy of the GNU General Public License
13## along with this program; if not, write to the Free Software
14## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15##
16"""UI components for students and related components.
17"""
18import sys
19import grok
20
21from datetime import datetime
22from zope.formlib.widget import CustomWidgetFactory
23from zope.formlib.form import setUpEditWidgets
24from zope.securitypolicy.interfaces import IPrincipalRoleManager
25from zope.traversing.browser import absoluteURL
26from zope.component import (
27    createObject,)
28
29from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
30from reportlab.pdfgen import canvas
31from reportlab.lib.units import cm
32from reportlab.lib.pagesizes import A4
33from reportlab.lib.styles import getSampleStyleSheet
34from reportlab.platypus import (Frame, Paragraph, Image,
35    Table, Spacer)
36from reportlab.platypus.tables import TableStyle
37
38from waeup.sirp.accesscodes import invalidate_accesscode, get_access_code
39from waeup.sirp.accesscodes.workflow import USED
40from waeup.sirp.browser import (
41    WAeUPPage, WAeUPEditFormPage, WAeUPAddFormPage, WAeUPDisplayFormPage)
42from waeup.sirp.browser.breadcrumbs import Breadcrumb
43from waeup.sirp.browser.layout import NullValidator
44from waeup.sirp.browser.pages import add_local_role, del_local_roles
45from waeup.sirp.browser.resources import datepicker, tabs, datatable
46from waeup.sirp.browser.viewlets import (
47    ManageActionButton, PrimaryNavTab, LeftSidebarLink,
48    AddActionButton, ActionButton, PlainActionButton,
49    )
50from waeup.sirp.image.browser.widget import (
51    ThumbnailWidget, EncodingImageFileWidget,
52    )
53from waeup.sirp.image.image import createWAeUPImageFile
54from waeup.sirp.interfaces import IWAeUPObject, ILocalRolesAssignable
55from waeup.sirp.permissions import get_users_with_local_roles
56from waeup.sirp.university.interfaces import ICertificate
57from waeup.sirp.widgets.datewidget import (
58    FriendlyDateWidget, FriendlyDateDisplayWidget)
59from waeup.sirp.widgets.restwidget import ReSTDisplayWidget
60from waeup.sirp.widgets.objectwidget import (
61    WAeUPObjectWidget, WAeUPObjectDisplayWidget)
62from waeup.sirp.widgets.multilistwidget import (
63    MultiListWidget, MultiListDisplayWidget)
64from waeup.sirp.students.interfaces import (
65    IStudentsContainer, IStudent, IStudentClearance,
66    IStudentPersonal, IStudentBase, IStudentStudyCourse,
67    IStudentPayments, IStudentAccommodation
68    )
69from waeup.sirp.students.student import (
70    Student,
71    )
72from waeup.sirp.students.catalog import search
73
74class StudentsTab(PrimaryNavTab):
75    """Students tab in primary navigation.
76    """
77
78    grok.context(IWAeUPObject)
79    grok.order(3)
80    grok.require('waeup.viewStudents')
81    grok.template('primarynavtab')
82
83    pnav = 4
84    tab_title = u'Students'
85
86    @property
87    def link_target(self):
88        return self.view.application_url('students')
89
90class StudentsBreadcrumb(Breadcrumb):
91    """A breadcrumb for the students container.
92    """
93    grok.context(IStudentsContainer)
94    title = u'Students'
95
96class SudyCourseBreadcrumb(Breadcrumb):
97    """A breadcrumb for the student study course.
98    """
99    grok.context(IStudentStudyCourse)
100    title = u'Study Course'
101
102class PaymentsBreadcrumb(Breadcrumb):
103    """A breadcrumb for the student payments folder.
104    """
105    grok.context(IStudentPayments)
106    title = u'Payments'
107
108class AccommodationBreadcrumb(Breadcrumb):
109    """A breadcrumb for the student accommodation folder.
110    """
111    grok.context(IStudentAccommodation)
112    title = u'Accommodation'
113
114class StudentsContainerPage(WAeUPPage):
115    """The standard view for student containers.
116    """
117    grok.context(IStudentsContainer)
118    grok.name('index')
119    grok.require('waeup.viewStudents')
120    grok.template('studentscontainerpage')
121
122    @property
123    def title(self):
124        return "Students"
125
126    @property
127    def label(self):
128        return self.title
129
130    def update(self, *args, **kw):
131        datatable.need()
132        form = self.request.form
133        self.hitlist = []
134        if 'searchterm' in form and form['searchterm']:
135            self.searchterm = form['searchterm']
136            self.searchtype = form['searchtype']
137        elif 'old_searchterm' in form:
138            self.searchterm = form['old_searchterm']
139            self.searchtype = form['old_searchtype']
140        else:
141            if 'search' in form:
142                self.flash('Empty search string.')
143            return
144        self.hitlist = search(query=self.searchterm,
145            searchtype=self.searchtype, view=self)
146        if not self.hitlist:
147            self.flash('No student found.')
148        return
149
150class StudentsContainerManageActionButton(ManageActionButton):
151    grok.order(1)
152    grok.context(IStudentsContainer)
153    grok.view(StudentsContainerPage)
154    grok.require('waeup.manageStudents')
155    text = 'Manage students'
156
157
158class StudentsContainerManagePage(WAeUPPage):
159    """The manage page for student containers.
160    """
161    grok.context(IStudentsContainer)
162    grok.name('manage')
163    grok.require('waeup.manageStudents')
164    grok.template('studentscontainermanagepage')
165
166    @property
167    def title(self):
168        return "Students"
169
170    @property
171    def label(self):
172        return self.title
173
174    def update(self, *args, **kw):
175        datatable.need()
176        form = self.request.form
177        self.hitlist = []
178        if 'searchterm' in form and form['searchterm']:
179            self.searchterm = form['searchterm']
180            self.searchtype = form['searchtype']
181        elif 'old_searchterm' in form:
182            self.searchterm = form['old_searchterm']
183            self.searchtype = form['old_searchtype']
184        else:
185            if 'search' in form:
186                self.flash('Empty search string.')
187            return
188        #import pdb; pdb.set_trace()
189        if not 'entries' in form:
190            self.hitlist = search(query=self.searchterm,
191                searchtype=self.searchtype, view=self)
192            if not self.hitlist:
193                self.flash('No student found.')
194            return
195        entries = form['entries']
196        if isinstance(entries, basestring):
197            entries = [entries]
198        deleted = []
199        for entry in entries:
200            if 'remove' in form:
201                del self.context[entry]
202                deleted.append(entry)
203        self.hitlist = search(query=self.searchterm,
204            searchtype=self.searchtype, view=self)
205        if len(deleted):
206            self.flash('Successfully removed: %s' % ', '.join(deleted))
207        return
208
209class StudentsContainerAddActionButton(AddActionButton):
210    grok.order(1)
211    grok.context(IStudentsContainer)
212    grok.view(StudentsContainerManagePage)
213    grok.require('waeup.manageStudents')
214    text = 'Add student'
215    target = 'addstudent'
216
217class StudentAddFormPage(WAeUPAddFormPage):
218    """Add-form to add a student.
219    """
220    grok.context(IStudentsContainer)
221    grok.require('waeup.manageStudents')
222    grok.name('addstudent')
223    grok.template('studentaddpage')
224    form_fields = grok.AutoFields(IStudent)
225    title = 'Students'
226    label = 'Add student'
227
228    @grok.action('Create student record')
229    def addStudent(self, **data):
230        student_id = self.request.form.get('form.student_id')
231        student = createObject(u'waeup.Student')
232        student.student_id = student_id
233        self.applyData(student, **data)
234        #import pdb; pdb.set_trace()
235        try:
236            self.context.addStudent(student)
237        except KeyError:
238            self.flash('The student id chosen already exists.')
239            return
240        self.flash('Student record created.')
241        self.redirect(self.url(self.context[student_id], 'index'))
242        return
243
244class StudentBaseDisplayFormPage(WAeUPDisplayFormPage):
245    """ Page to display student base data
246    """
247    grok.context(IStudent)
248    grok.name('index')
249    grok.require('waeup.viewStudents')
250    grok.template('studentpage')
251    form_fields = grok.AutoFields(IStudentBase)
252
253    @property
254    def title(self):
255        return 'Student: %s' % self.context.name
256
257    @property
258    def label(self):
259        return '%s: Base Data' % self.context.name
260
261class StudentBaseManageActionButton(ManageActionButton):
262    grok.order(1)
263    grok.context(IStudent)
264    grok.view(StudentBaseDisplayFormPage)
265    grok.require('waeup.manageStudents')
266    text = 'Edit'
267    target = 'edit_base'
268
269class StudentClearanceViewActionButton(PlainActionButton):
270    grok.order(2)
271    grok.context(IStudent)
272    grok.view(StudentBaseDisplayFormPage)
273    grok.require('waeup.viewStudents')
274    text = 'Clearance Data'
275    target = 'view_clearance'
276
277class StudentPersonalViewActionButton(PlainActionButton):
278    grok.order(3)
279    grok.context(IStudent)
280    grok.view(StudentBaseDisplayFormPage)
281    grok.require('waeup.viewStudents')
282    text = 'Personal Data'
283    target = 'view_personal'
284
285class StudyCourseViewActionButton(PlainActionButton):
286    grok.order(4)
287    grok.context(IStudent)
288    grok.view(StudentBaseDisplayFormPage)
289    grok.require('waeup.viewStudents')
290    text = 'Study Course'
291    target = 'studycourse'
292
293class PaymentsViewActionButton(PlainActionButton):
294    grok.order(5)
295    grok.context(IStudent)
296    grok.view(StudentBaseDisplayFormPage)
297    grok.require('waeup.viewStudents')
298    text = 'Payments'
299    target = 'payments'
300
301class AccommodationViewActionButton(PlainActionButton):
302    grok.order(6)
303    grok.context(IStudent)
304    grok.view(StudentBaseDisplayFormPage)
305    grok.require('waeup.viewStudents')
306    text = 'Accommodation'
307    target = 'accommodation'
308
309class StudentBaseManageFormPage(WAeUPEditFormPage):
310    """ View to edit student base data
311    """
312    grok.context(IStudent)
313    grok.name('edit_base')
314    grok.require('waeup.manageStudents')
315    form_fields = grok.AutoFields(IStudentBase).omit('student_id')
316    #grok.template('editstudentbase')
317    label = 'Edit base data'
318
319    @property
320    def title(self):
321        return 'Student: %s' % self.context.name
322
323class StudentClearanceDisplayFormPage(WAeUPDisplayFormPage):
324    """ Page to display student clearance data
325    """
326    grok.context(IStudent)
327    grok.name('view_clearance')
328    grok.require('waeup.viewStudents')
329    form_fields = grok.AutoFields(IStudentClearance)
330
331    @property
332    def title(self):
333        return 'Student: %s' % self.context.name
334
335    @property
336    def label(self):
337        return '%s: Clearance Data' % self.context.name
338
339class StudentClearanceManageActionButton(ManageActionButton):
340    grok.order(1)
341    grok.context(IStudent)
342    grok.view(StudentClearanceDisplayFormPage)
343    grok.require('waeup.manageStudents')
344    text = 'Edit'
345    target = 'edit_clearance'
346
347class StudentClearanceManageFormPage(WAeUPEditFormPage):
348    """ Page to edit student clearance data
349    """
350    grok.context(IStudent)
351    grok.name('edit_clearance')
352    grok.require('waeup.viewStudents')
353    form_fields = grok.AutoFields(IStudentClearance)
354    label = 'Edit clearance data'
355
356    @property
357    def title(self):
358        return 'Student: %s' % self.context.name
359
360class StudentPersonalDisplayFormPage(WAeUPDisplayFormPage):
361    """ Page to display student personal data
362    """
363    grok.context(IStudent)
364    grok.name('view_personal')
365    grok.require('waeup.viewStudents')
366    form_fields = grok.AutoFields(IStudentPersonal)
367
368    @property
369    def title(self):
370        return 'Student: %s' % self.context.name
371
372    @property
373    def label(self):
374        return '%s: Personal Data' % self.context.name
375
376class StudentPersonalManageActionButton(ManageActionButton):
377    grok.order(1)
378    grok.context(IStudent)
379    grok.view(StudentPersonalDisplayFormPage)
380    grok.require('waeup.manageStudents')
381    text = 'Edit'
382    target = 'edit_personal'
383
384class StudentPersonalManageFormPage(WAeUPEditFormPage):
385    """ Page to edit student clearance data
386    """
387    grok.context(IStudent)
388    grok.name('edit_personal')
389    grok.require('waeup.viewStudents')
390    form_fields = grok.AutoFields(IStudentPersonal)
391    label = 'Edit personal data'
392
393    @property
394    def title(self):
395        return 'Student: %s' % self.context.name
396
397class StudyCourseDisplayFormPage(WAeUPDisplayFormPage):
398    """ Page to display the student study course data
399    """
400    grok.context(IStudentStudyCourse)
401    grok.name('index')
402    grok.require('waeup.viewStudents')
403    form_fields = grok.AutoFields(IStudentStudyCourse)
404    #grok.template('studycoursepage')
405
406    @property
407    def title(self):
408        return 'Student: %s' % self.context.__parent__.name
409
410    @property
411    def label(self):
412        return '%s: Study Course Data' % self.context.__parent__.name
413
414class PaymentsDisplayFormPage(WAeUPDisplayFormPage):
415    """ Page to display the student payments
416    """
417    grok.context(IStudentPayments)
418    grok.name('index')
419    grok.require('waeup.viewStudents')
420    form_fields = grok.AutoFields(IStudentPayments)
421    #grok.template('paymentspage')
422
423    @property
424    def title(self):
425        return 'Student: %s' % self.context.__parent__.name
426
427    @property
428    def label(self):
429        return '%s: Payments' % self.context.__parent__.name
430
431class AccommodationDisplayFormPage(WAeUPDisplayFormPage):
432    """ Page to display the student accommodation data
433    """
434    grok.context(IStudentAccommodation)
435    grok.name('index')
436    grok.require('waeup.viewStudents')
437    form_fields = grok.AutoFields(IStudentAccommodation)
438    #grok.template('accommodationpage')
439
440    @property
441    def title(self):
442        return 'Student: %s' % self.context.__parent__.name
443
444    @property
445    def label(self):
446        return '%s: Accommodation Data' % self.context.__parent__.name
Note: See TracBrowser for help on using the repository browser.