source: main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py @ 12187

Last change on this file since 12187 was 12150, checked in by Henrik Bettermann, 10 years ago

Add faculty.

  • Property svn:keywords set to Id
File size: 15.5 KB
Line 
1## $Id: browser.py 12150 2014-12-05 10:19:46Z henrik $
2##
3## Copyright (C) 2012 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18import grok
19from zope.i18n import translate
20from zope.schema.interfaces import ConstraintNotSatisfied
21from zope.component import getUtility
22from hurry.workflow.interfaces import IWorkflowInfo
23from waeup.kofa.interfaces import (
24    REQUESTED, IExtFileStore, IKofaUtils, IObjectHistory)
25from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
26from waeup.kofa.browser.layout import action, KofaEditFormPage, UtilityView
27from waeup.kofa.students.browser import (
28    StudyLevelEditFormPage, StudyLevelDisplayFormPage,
29    StudentBasePDFFormPage, ExportPDFCourseRegistrationSlipPage,
30    CourseTicketDisplayFormPage, StudentTriggerTransitionFormPage,
31    msave, emit_lock_message,
32    StudentActivatePage, StudentDeactivatePage)
33from waeup.kofa.students.interfaces import IStudentsUtils, ICourseTicket
34from waeup.kofa.students.workflow import FORBIDDEN_POSTGRAD_TRANS
35from kofacustom.nigeria.students.browser import (
36    NigeriaOnlinePaymentDisplayFormPage,
37    NigeriaStudentBaseManageFormPage,
38    NigeriaStudentClearanceEditFormPage,
39    NigeriaOnlinePaymentAddFormPage,
40    NigeriaExportPDFPaymentSlipPage,
41    NigeriaExportPDFClearanceSlipPage,
42    )
43
44from waeup.uniben.students.interfaces import (
45    ICustomStudent,
46    ICustomStudentOnlinePayment, ICustomStudentStudyCourse,
47    ICustomStudentStudyLevel,
48    ICustomUGStudentClearance,
49    ICustomPGStudentClearance)
50from waeup.uniben.interfaces import MessageFactory as _
51
52class CustomOnlinePaymentDisplayFormPage(NigeriaOnlinePaymentDisplayFormPage):
53    """ Page to view an online payment ticket
54    """
55    grok.context(ICustomStudentOnlinePayment)
56    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
57        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item')
58    form_fields[
59        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
60    form_fields[
61        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
62
63class CustomStudentClearanceEditFormPage(NigeriaStudentClearanceEditFormPage):
64    """ View to edit student clearance data by student
65    """
66
67    @property
68    def form_fields(self):
69        if self.context.is_postgrad:
70            form_fields = grok.AutoFields(ICustomPGStudentClearance).omit(
71            'clearance_locked', 'nysc_location', 'clr_code', 'officer_comment')
72        else:
73            form_fields = grok.AutoFields(ICustomUGStudentClearance).omit(
74            'clearance_locked', 'clr_code', 'officer_comment')
75            form_fields['date_of_birth'].for_display = True
76            form_fields['nationality'].for_display = True
77            form_fields['lga'].for_display = True
78        return form_fields
79
80    def dataNotComplete(self):
81        store = getUtility(IExtFileStore)
82        if not store.getFileByContext(self.context, attr=u'birth_certificate.jpg'):
83            return _('No birth certificate uploaded.')
84        if not store.getFileByContext(self.context, attr=u'ref_let.jpg'):
85            return _('No guarantor/referee letter uploaded.')
86        if not store.getFileByContext(self.context, attr=u'acc_let.jpg'):
87            return _('No acceptance letter uploaded.')
88        if not store.getFileByContext(self.context, attr=u'fst_sit_scan.jpg'):
89            return _('No first sitting result uploaded.')
90        #if not store.getFileByContext(self.context, attr=u'scd_sit_scan.jpg'):
91        #    return _('No second sitting result uploaded.')
92        if not store.getFileByContext(self.context, attr=u'secr_cults.jpg'):
93            return _('No affidavit of non-membership of secret cults uploaded.')
94        return False
95
96class CustomOnlinePaymentAddFormPage(NigeriaOnlinePaymentAddFormPage):
97    """ Page to add an online payment ticket
98    """
99    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).select(
100        'p_category')
101
102class CustomExportPDFPaymentSlipPage(NigeriaExportPDFPaymentSlipPage):
103    """Deliver a PDF slip of the context.
104    """
105    grok.context(ICustomStudentOnlinePayment)
106    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
107        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item')
108    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
109    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
110
111
112class CustomExportPDFClearanceSlipPage(NigeriaExportPDFClearanceSlipPage):
113    """Deliver a PDF slip of the context.
114    """
115
116    omit_fields = ('password', 'suspended', 'suspended_comment',
117        'phone', 'adm_code', 'email', 'date_of_birth')
118
119    def render(self):
120        studentview = StudentBasePDFFormPage(self.context.student,
121            self.request, self.omit_fields)
122        students_utils = getUtility(IStudentsUtils)
123        return students_utils.renderPDF(
124            self, 'clearance_slip.pdf',
125            self.context.student, studentview, signatures=self._signatures(),
126            sigs_in_footer=self._sigsInFooter(), show_scans=False,
127            omit_fields=self.omit_fields)
128
129
130class ExportClearanceInvitationSlipPage(UtilityView, grok.View):
131    """Deliver an invitation letter to physical clearance.
132
133    This form page is available only in Uniben.
134    """
135    grok.context(ICustomStudent)
136    grok.name('clearance_invitation_slip.pdf')
137    grok.require('waeup.viewStudent')
138    prefix = 'form'
139
140    label = u'Invitation Letter to Physical Clearance'
141
142    omit_fields = (
143        'suspended', 'phone', 'email',
144        'adm_code', 'suspended_comment',
145        'date_of_birth', 'current_level',
146        'department', 'current_mode',
147        'entry_session', 'matric_number', 'sex')
148
149    form_fields = []
150
151    @property
152    def note(self):
153        if self.context.physical_clearance_date:
154            return """
155<br /><br /><br /><br /><font size='12'>
156Dear %s,
157<br /><br /><br />
158The University Admissions Board kindly invites you to physical clearance
159<br /><br />
160on %s. Please bring this invitation slip to gain entry into
161<br /><br />
162the main auditorium on clearance date.
163<br /><br /><br />
164Best regards,
165<br /><br />
166The Registrar<br />
167</font>
168
169""" % (self.context.display_fullname, self.context.physical_clearance_date)
170        return
171
172
173    def update(self):
174        if self.context.student.state != REQUESTED \
175            or not  self.context.student.physical_clearance_date:
176            self.flash(_('Forbidden'), type="warning")
177            self.redirect(self.url(self.context))
178
179    def render(self):
180        studentview = StudentBasePDFFormPage(self.context.student,
181            self.request, self.omit_fields)
182        students_utils = getUtility(IStudentsUtils)
183        return students_utils.renderPDF(
184            self, 'clearance_invitation_slip',
185            self.context.student, studentview,
186            omit_fields=self.omit_fields,
187            note=self.note)
188
189class StudyCourseCOEditFormPage(KofaEditFormPage):
190    """ Page to edit the student study course data by clearance officers.
191
192    This form page is available only in Uniben.
193    """
194    grok.context(ICustomStudentStudyCourse)
195    grok.name('edit_level')
196    grok.require('waeup.clearStudent')
197    label = _('Edit current level')
198    pnav = 4
199    form_fields = grok.AutoFields(
200        ICustomStudentStudyCourse).select('current_level')
201
202    def update(self):
203        if not (self.context.is_current and
204            self.context.student.state == REQUESTED):
205            emit_lock_message(self)
206            return
207        super(StudyCourseCOEditFormPage, self).update()
208        return
209
210    @action(_('Save'), style='primary')
211    def save(self, **data):
212        try:
213            msave(self, **data)
214        except ConstraintNotSatisfied:
215            # The selected level might not exist in certificate
216            self.flash(_('Current level not available for certificate.'))
217            return
218        #notify(grok.ObjectModifiedEvent(self.context.__parent__))
219        return
220
221class CustomStudyLevelEditFormPage(StudyLevelEditFormPage):
222    """ Page to edit the student study level data by students.
223
224    """
225    grok.template('studyleveleditpage')
226
227class CustomStudyLevelDisplayFormPage(StudyLevelDisplayFormPage):
228    """ Page to display student study levels
229    """
230    grok.template('studylevelpage')
231
232class CustomExportPDFCourseRegistrationSlipPage(
233    ExportPDFCourseRegistrationSlipPage):
234    """Deliver a PDF slip of the context.
235    """
236
237    form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit(
238        'level_verdict', 'gpa')
239
240    @property
241    def tabletitle(self):
242        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
243        tabletitle = []
244        tabletitle.append(translate(_('1st Semester Courses'), 'waeup.kofa',
245            target_language=portal_language))
246        tabletitle.append(translate(_('2nd Semester Courses'), 'waeup.kofa',
247            target_language=portal_language))
248        tabletitle.append(translate(_('Level Courses'), 'waeup.kofa',
249            target_language=portal_language))
250        tabletitle.append(translate(_('1st Trimester Courses'), 'waeup.kofa',
251            target_language=portal_language))
252        tabletitle.append(translate(_('2nd Trimester Courses'), 'waeup.kofa',
253            target_language=portal_language))
254        tabletitle.append(translate(_('3rd Trimester Courses'), 'waeup.kofa',
255            target_language=portal_language))
256        return tabletitle
257
258    def render(self):
259        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
260        Code = translate('Code', 'waeup.kofa', target_language=portal_language)
261        Title = translate('Title', 'waeup.kofa', target_language=portal_language)
262        Dept = translate('Dept.', 'waeup.kofa', target_language=portal_language)
263        Faculty = translate('Faculty', 'waeup.kofa', target_language=portal_language)
264        Cred = translate(_('Credits'), 'waeup.uniben', target_language=portal_language)
265        studentview = StudentBasePDFFormPage(self.context.student,
266            self.request, self.omit_fields)
267        students_utils = getUtility(IStudentsUtils)
268
269        tabledata = []
270        tableheader = []
271        contenttitle = []
272        for i in range(1,7):
273            tabledata.append(sorted(
274                [value for value in self.context.values() if value.semester == i],
275                key=lambda value: str(value.semester) + value.code))
276            tableheader.append([(Code,'code', 2.5),
277                             (Title,'title', 5),
278                             (Dept,'dcode', 1.5), (Faculty,'fcode', 1.5),
279                             (Cred, 'credits', 1.5),
280                             ])
281        return students_utils.renderPDF(
282            self, 'course_registration_slip.pdf',
283            self.context.student, studentview,
284            tableheader=tableheader,
285            tabledata=tabledata,
286            omit_fields=self.omit_fields
287            )
288
289class UnibenExportPDFCourseResultSlipPage(ExportPDFCourseRegistrationSlipPage):
290    """Deliver a PDF slip of the context.
291    """
292
293    grok.name('course_result_slip.pdf')
294
295    @property
296    def tabletitle(self):
297        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
298        tabletitle = []
299        tabletitle.append(translate(_('1st Semester Courses'), 'waeup.kofa',
300            target_language=portal_language))
301        tabletitle.append(translate(_('2nd Semester Courses'), 'waeup.kofa',
302            target_language=portal_language))
303        tabletitle.append(translate(_('Level Courses'), 'waeup.kofa',
304            target_language=portal_language))
305        tabletitle.append(translate(_('1st Trimester Courses'), 'waeup.kofa',
306            target_language=portal_language))
307        tabletitle.append(translate(_('2nd Trimester Courses'), 'waeup.kofa',
308            target_language=portal_language))
309        tabletitle.append(translate(_('3rd Trimester Courses'), 'waeup.kofa',
310            target_language=portal_language))
311        return tabletitle
312
313    @property
314    def label(self):
315        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
316        lang = self.request.cookies.get('kofa.language', portal_language)
317        level_title = translate(self.context.level_title, 'waeup.kofa',
318            target_language=lang)
319        return translate(_('Course Result Slip'),
320            'waeup.uniben', target_language=portal_language) \
321            + ' %s' % level_title
322
323    def render(self):
324        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
325        Code = translate('Code', 'waeup.kofa', target_language=portal_language)
326        Title = translate('Title', 'waeup.kofa', target_language=portal_language)
327        Dept = translate('Dept.', 'waeup.kofa', target_language=portal_language)
328        Faculty = translate('Faculty', 'waeup.kofa', target_language=portal_language)
329        Cred = translate(_('Credits'), 'waeup.uniben', target_language=portal_language)
330        Grade = translate('Grade', 'waeup.kofa', target_language=portal_language)
331        studentview = StudentBasePDFFormPage(self.context.student,
332            self.request, self.omit_fields)
333        students_utils = getUtility(IStudentsUtils)
334
335        tabledata = []
336        tableheader = []
337        contenttitle = []
338        for i in range(1,7):
339            tabledata.append(sorted(
340                [value for value in self.context.values() if value.semester == i],
341                key=lambda value: str(value.semester) + value.code))
342            tableheader.append([(Code,'code', 2.5),
343                             (Title,'title', 5),
344                             (Dept,'dcode', 1.5), (Faculty,'fcode', 1.5),
345                             (Cred, 'credits', 1.5),
346                             (Grade, 'grade', 1.5),
347                             ])
348        return students_utils.renderPDF(
349            self, 'course_registration_slip.pdf',
350            self.context.student, studentview,
351            tableheader=tableheader,
352            tabledata=tabledata,
353            omit_fields=self.omit_fields
354            )
355
356class CustomCourseTicketDisplayFormPage(CourseTicketDisplayFormPage):
357    """ Page to display course tickets
358    """
359    form_fields = grok.AutoFields(ICourseTicket).omit('score')
360
361class CustomStudentActivatePage(StudentActivatePage):
362    """ Activate student account
363    """
364
365    def update(self):
366        self.context.suspended = False
367        self.context.writeLogMessage(self, 'account activated')
368        history = IObjectHistory(self.context)
369        history.addMessage('Student account activated', user='undisclosed')
370        self.flash(_('Student account has been activated.'))
371        self.redirect(self.url(self.context))
372        return
373
374class CustomStudentDeactivatePage(StudentDeactivatePage):
375    """ Deactivate student account
376    """
377    def update(self):
378        self.context.suspended = True
379        self.context.writeLogMessage(self, 'account deactivated')
380        history = IObjectHistory(self.context)
381        history.addMessage('Student account deactivated', user='undisclosed')
382        self.flash(_('Student account has been deactivated.'))
383        self.redirect(self.url(self.context))
384        return
Note: See TracBrowser for help on using the repository browser.