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

Last change on this file since 11476 was 11449, checked in by Henrik Bettermann, 11 years ago

jquery-ui.min.js is also needed for tooltips.

  • Property svn:keywords set to Id
File size: 12.9 KB
Line 
1## $Id: browser.py 11449 2014-02-27 05:47:00Z 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
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    ICustomStudentOnlinePayment, ICustomStudentStudyCourse,
46    ICustomStudentStudyLevel)
47from waeup.uniben.interfaces import MessageFactory as _
48
49class CustomOnlinePaymentDisplayFormPage(NigeriaOnlinePaymentDisplayFormPage):
50    """ Page to view an online payment ticket
51    """
52    grok.context(ICustomStudentOnlinePayment)
53    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
54        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item')
55    form_fields[
56        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
57    form_fields[
58        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
59
60class CustomStudentClearanceEditFormPage(NigeriaStudentClearanceEditFormPage):
61    """ View to edit student clearance data by student
62    """
63
64    def dataNotComplete(self):
65        store = getUtility(IExtFileStore)
66        if not store.getFileByContext(self.context, attr=u'birth_certificate.jpg'):
67            return _('No birth certificate uploaded.')
68        if not store.getFileByContext(self.context, attr=u'ref_let.jpg'):
69            return _('No guarantor/referee letter uploaded.')
70        if not store.getFileByContext(self.context, attr=u'acc_let.jpg'):
71            return _('No acceptance letter uploaded.')
72        if not store.getFileByContext(self.context, attr=u'fst_sit_scan.jpg'):
73            return _('No first sitting result uploaded.')
74        #if not store.getFileByContext(self.context, attr=u'scd_sit_scan.jpg'):
75        #    return _('No second sitting result uploaded.')
76        if not store.getFileByContext(self.context, attr=u'secr_cults.jpg'):
77            return _('No affidavit of non-membership of secret cults uploaded.')
78        return False
79
80class CustomOnlinePaymentAddFormPage(NigeriaOnlinePaymentAddFormPage):
81    """ Page to add an online payment ticket
82    """
83    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).select(
84        'p_category')
85
86class CustomExportPDFPaymentSlipPage(NigeriaExportPDFPaymentSlipPage):
87    """Deliver a PDF slip of the context.
88    """
89    grok.context(ICustomStudentOnlinePayment)
90    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
91        'provider_amt', 'gateway_amt', 'thirdparty_amt', 'p_item')
92    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
93    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
94
95
96class CustomExportPDFClearanceSlipPage(NigeriaExportPDFClearanceSlipPage):
97    """Deliver a PDF slip of the context.
98    """
99
100    def render(self):
101        studentview = StudentBasePDFFormPage(self.context.student,
102            self.request, self.omit_fields)
103        students_utils = getUtility(IStudentsUtils)
104        return students_utils.renderPDF(
105            self, 'clearance_slip.pdf',
106            self.context.student, studentview, signatures=self._signatures(),
107            sigs_in_footer=self._sigsInFooter(), show_scans=False,
108            omit_fields=self.omit_fields)
109
110class StudyCourseCOEditFormPage(KofaEditFormPage):
111    """ Page to edit the student study course data by clearance officers.
112
113    This form page is available only in Uniben.
114    """
115    grok.context(ICustomStudentStudyCourse)
116    grok.name('edit_level')
117    grok.require('waeup.clearStudent')
118    label = _('Edit current level')
119    pnav = 4
120    form_fields = grok.AutoFields(
121        ICustomStudentStudyCourse).select('current_level')
122
123    def update(self):
124        if not (self.context.is_current and
125            self.context.student.state == REQUESTED):
126            emit_lock_message(self)
127            return
128        super(StudyCourseCOEditFormPage, self).update()
129        return
130
131    @action(_('Save'), style='primary')
132    def save(self, **data):
133        try:
134            msave(self, **data)
135        except ConstraintNotSatisfied:
136            # The selected level might not exist in certificate
137            self.flash(_('Current level not available for certificate.'))
138            return
139        #notify(grok.ObjectModifiedEvent(self.context.__parent__))
140        return
141
142class CustomStudyLevelEditFormPage(StudyLevelEditFormPage):
143    """ Page to edit the student study level data by students.
144
145    """
146    grok.template('studyleveleditpage')
147
148class CustomStudyLevelDisplayFormPage(StudyLevelDisplayFormPage):
149    """ Page to display student study levels
150    """
151    grok.template('studylevelpage')
152
153class CustomExportPDFCourseRegistrationSlipPage(
154    ExportPDFCourseRegistrationSlipPage):
155    """Deliver a PDF slip of the context.
156    """
157
158    form_fields = grok.AutoFields(ICustomStudentStudyLevel).omit(
159        'level_verdict', 'gpa')
160
161    @property
162    def tabletitle(self):
163        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
164        tabletitle = []
165        tabletitle.append(translate(_('1st Semester Courses'), 'waeup.kofa',
166            target_language=portal_language))
167        tabletitle.append(translate(_('2nd Semester Courses'), 'waeup.kofa',
168            target_language=portal_language))
169        tabletitle.append(translate(_('Level Courses'), 'waeup.kofa',
170            target_language=portal_language))
171        tabletitle.append(translate(_('1st Trimester Courses'), 'waeup.kofa',
172            target_language=portal_language))
173        tabletitle.append(translate(_('2nd Trimester Courses'), 'waeup.kofa',
174            target_language=portal_language))
175        tabletitle.append(translate(_('3rd Trimester Courses'), 'waeup.kofa',
176            target_language=portal_language))
177        return tabletitle
178
179    def render(self):
180        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
181        Code = translate('Code', 'waeup.kofa', target_language=portal_language)
182        Title = translate('Title', 'waeup.kofa', target_language=portal_language)
183        Dept = translate('Dept.', 'waeup.kofa', target_language=portal_language)
184        Faculty = translate('Faculty', 'waeup.kofa', target_language=portal_language)
185        Cred = translate(_('Credits'), 'waeup.uniben', target_language=portal_language)
186        studentview = StudentBasePDFFormPage(self.context.student,
187            self.request, self.omit_fields)
188        students_utils = getUtility(IStudentsUtils)
189
190        tabledata = []
191        tableheader = []
192        contenttitle = []
193        for i in range(1,7):
194            tabledata.append(sorted(
195                [value for value in self.context.values() if value.semester == i],
196                key=lambda value: str(value.semester) + value.code))
197            tableheader.append([(Code,'code', 2.5),
198                             (Title,'title', 5),
199                             (Dept,'dcode', 1.5), (Faculty,'fcode', 1.5),
200                             (Cred, 'credits', 1.5),
201                             ])
202        return students_utils.renderPDF(
203            self, 'course_registration_slip.pdf',
204            self.context.student, studentview,
205            tableheader=tableheader,
206            tabledata=tabledata,
207            omit_fields=self.omit_fields
208            )
209
210class UnibenExportPDFCourseResultSlipPage(ExportPDFCourseRegistrationSlipPage):
211    """Deliver a PDF slip of the context.
212    """
213
214    grok.name('course_result_slip.pdf')
215
216    @property
217    def tabletitle(self):
218        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
219        tabletitle = []
220        tabletitle.append(translate(_('1st Semester Courses'), 'waeup.kofa',
221            target_language=portal_language))
222        tabletitle.append(translate(_('2nd Semester Courses'), 'waeup.kofa',
223            target_language=portal_language))
224        tabletitle.append(translate(_('Level Courses'), 'waeup.kofa',
225            target_language=portal_language))
226        tabletitle.append(translate(_('1st Trimester Courses'), 'waeup.kofa',
227            target_language=portal_language))
228        tabletitle.append(translate(_('2nd Trimester Courses'), 'waeup.kofa',
229            target_language=portal_language))
230        tabletitle.append(translate(_('3rd Trimester Courses'), 'waeup.kofa',
231            target_language=portal_language))
232        return tabletitle
233
234    @property
235    def label(self):
236        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
237        lang = self.request.cookies.get('kofa.language', portal_language)
238        level_title = translate(self.context.level_title, 'waeup.kofa',
239            target_language=lang)
240        return translate(_('Course Result Slip'),
241            'waeup.uniben', target_language=portal_language) \
242            + ' %s' % level_title
243
244    def render(self):
245        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
246        Code = translate('Code', 'waeup.kofa', target_language=portal_language)
247        Title = translate('Title', 'waeup.kofa', target_language=portal_language)
248        Dept = translate('Dept.', 'waeup.kofa', target_language=portal_language)
249        Faculty = translate('Faculty', 'waeup.kofa', target_language=portal_language)
250        Cred = translate(_('Credits'), 'waeup.uniben', target_language=portal_language)
251        Grade = translate('Grade', 'waeup.kofa', target_language=portal_language)
252        studentview = StudentBasePDFFormPage(self.context.student,
253            self.request, self.omit_fields)
254        students_utils = getUtility(IStudentsUtils)
255
256        tabledata = []
257        tableheader = []
258        contenttitle = []
259        for i in range(1,7):
260            tabledata.append(sorted(
261                [value for value in self.context.values() if value.semester == i],
262                key=lambda value: str(value.semester) + value.code))
263            tableheader.append([(Code,'code', 2.5),
264                             (Title,'title', 5),
265                             (Dept,'dcode', 1.5), (Faculty,'fcode', 1.5),
266                             (Cred, 'credits', 1.5),
267                             (Grade, 'grade', 1.5),
268                             ])
269        return students_utils.renderPDF(
270            self, 'course_registration_slip.pdf',
271            self.context.student, studentview,
272            tableheader=tableheader,
273            tabledata=tabledata,
274            omit_fields=self.omit_fields
275            )
276
277class CustomCourseTicketDisplayFormPage(CourseTicketDisplayFormPage):
278    """ Page to display course tickets
279    """
280    form_fields = grok.AutoFields(ICourseTicket).omit('score')
281
282class CustomStudentActivatePage(StudentActivatePage):
283    """ Activate student account
284    """
285
286    def update(self):
287        self.context.suspended = False
288        self.context.writeLogMessage(self, 'account activated')
289        history = IObjectHistory(self.context)
290        history.addMessage('Student account activated', user='undisclosed')
291        self.flash(_('Student account has been activated.'))
292        self.redirect(self.url(self.context))
293        return
294
295class CustomStudentDeactivatePage(StudentDeactivatePage):
296    """ Deactivate student account
297    """
298    def update(self):
299        self.context.suspended = True
300        self.context.writeLogMessage(self, 'account deactivated')
301        history = IObjectHistory(self.context)
302        history.addMessage('Student account deactivated', user='undisclosed')
303        self.flash(_('Student account has been deactivated.'))
304        self.redirect(self.url(self.context))
305        return
Note: See TracBrowser for help on using the repository browser.