source: main/kofacustom.dspg/trunk/src/kofacustom/dspg/students/browser.py @ 15369

Last change on this file since 15369 was 15291, checked in by Henrik Bettermann, 6 years ago

Fix bug.

  • Property svn:keywords set to Id
File size: 9.8 KB
Line 
1## $Id: browser.py 15291 2019-01-10 10:25:32Z 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 REQUESTED, IExtFileStore, IKofaUtils
24from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
25from waeup.kofa.browser.layout import (
26    KofaEditFormPage, UtilityView, action, jsaction)
27from waeup.kofa.students.browser import (
28    StudyLevelEditFormPage, StudyLevelDisplayFormPage,
29    StudentBasePDFFormPage, ExportPDFCourseRegistrationSlip,
30    CourseTicketDisplayFormPage, StudentTriggerTransitionFormPage,
31    ExportPDFTranscriptSlip, BedTicketAddPage,
32    msave, emit_lock_message)
33from waeup.kofa.students.interfaces import (
34    IStudentsUtils, ICourseTicket, IStudent)
35from waeup.kofa.students.workflow import FORBIDDEN_POSTGRAD_TRANS, PAID
36from kofacustom.nigeria.students.browser import (
37    NigeriaOnlinePaymentDisplayFormPage,
38    NigeriaStudentBaseManageFormPage,
39    NigeriaStudentClearanceEditFormPage,
40    NigeriaOnlinePaymentAddFormPage,
41    NigeriaExportPDFPaymentSlip,
42    NigeriaExportPDFClearanceSlip,
43    NigeriaAccommodationManageFormPage,
44    )
45from kofacustom.dspg.students.interfaces import (
46    ICustomStudentOnlinePayment, ICustomStudentStudyCourse,
47    ICustomStudentStudyLevel, ICustomStudent)
48from kofacustom.dspg.interfaces import MessageFactory as _
49
50class CustomBedTicketAddPage(BedTicketAddPage):
51    with_ac = False
52
53class CustomStudentClearanceEditFormPage(NigeriaStudentClearanceEditFormPage):
54    """ View to edit student clearance data by student
55    """
56
57    def dataNotComplete(self):
58        store = getUtility(IExtFileStore)
59        if not store.getFileByContext(self.context, attr=u'birth_certificate.jpg'):
60            return _('No birth certificate uploaded.')
61        if not store.getFileByContext(self.context, attr=u'lga_ident.jpg'):
62            return _('No LGA identification letter uploaded.')
63        if not store.getFileByContext(self.context, attr=u'o_level_result.jpg'):
64            return _('No O Level result uploaded.')
65        cm = getattr(self.context,'current_mode', None)
66        if cm and cm.startswith('nd'):
67            if not store.getFileByContext(self.context, attr=u'jamb_result.jpg'):
68                return _('No JAMB result uploaded.')
69        elif cm and cm.startswith('hnd'):
70            if not store.getFileByContext(self.context, attr=u'nd_result.jpg'):
71                return _('No ND result uploaded.')
72            if not store.getFileByContext(self.context, attr=u'it_letter.jpg'):
73                return _('No IT letter uploaded.')
74        return False
75
76class CustomStudyLevelDisplayFormPage(StudyLevelDisplayFormPage):
77    """ Page to display student study levels
78    """
79    grok.template('studylevelpage')
80
81class CustomStudyLevelEditFormPage(StudyLevelEditFormPage):
82    """ Page to edit the student study level data by students.
83
84    """
85    grok.template('studyleveleditpage')
86
87class CustomCourseTicketDisplayFormPage(CourseTicketDisplayFormPage):
88    """ Page to display course tickets
89    """
90    form_fields = grok.AutoFields(ICourseTicket).omit('score')
91
92class CustomExportPDFCourseRegistrationSlip(ExportPDFCourseRegistrationSlip):
93    """Deliver a PDF slip of the context.
94    """
95
96    def render(self):
97        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
98        Code = translate(_('Code'), 'waeup.kofa', target_language=portal_language)
99        Title = translate(_('Title'), 'waeup.kofa', target_language=portal_language)
100        Dept = translate(_('Dept.'), 'waeup.kofa', target_language=portal_language)
101        Faculty = translate(_('Faculty'), 'waeup.kofa', target_language=portal_language)
102        Cred = translate(_('Cred.'), 'waeup.kofa', target_language=portal_language)
103        #Mand = translate(_('Requ.'), 'waeup.kofa', target_language=portal_language)
104        #Score = translate(_('Score'), 'waeup.kofa', target_language=portal_language)
105        Grade = translate(_('Grade'), 'waeup.kofa', target_language=portal_language)
106        studentview = StudentBasePDFFormPage(self.context.student,
107            self.request, self.omit_fields)
108        students_utils = getUtility(IStudentsUtils)
109
110        tabledata = []
111        tableheader = []
112        for i in range(1,7):
113            tabledata.append(sorted(
114                [value for value in self.context.values() if value.semester == i],
115                key=lambda value: str(value.semester) + value.code))
116            tableheader.append([(Code,'code', 2.5),
117                             (Title,'title', 5),
118                             (Dept,'dcode', 1.5), (Faculty,'fcode', 1.5),
119                             (Cred, 'credits', 1.5),
120                             #(Mand, 'mandatory', 1.5),
121                             #(Score, 'score', 1.5),
122                             (Grade, 'grade', 1.5),
123                             #('Auto', 'automatic', 1.5)
124                             ])
125        return students_utils.renderPDF(
126            self, 'course_registration_slip.pdf',
127            self.context.student, studentview,
128            tableheader=tableheader,
129            tabledata=tabledata,
130            omit_fields=self.omit_fields
131            )
132
133
134class CustomExportPDFTranscriptSlip(ExportPDFTranscriptSlip):
135    """Deliver a PDF slip of the context.
136    """
137
138    def render(self):
139        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
140        Term = translate(_('Term'), 'waeup.kofa', target_language=portal_language)
141        Code = translate(_('Code'), 'waeup.kofa', target_language=portal_language)
142        Title = translate(_('Title'), 'waeup.kofa', target_language=portal_language)
143        Cred = translate(_('Credits'), 'waeup.kofa', target_language=portal_language)
144        #Score = translate(_('Score'), 'waeup.kofa', target_language=portal_language)
145        Grade = translate(_('Grade'), 'waeup.kofa', target_language=portal_language)
146        studentview = StudentBasePDFFormPage(self.context.student,
147            self.request, self.omit_fields)
148        students_utils = getUtility(IStudentsUtils)
149
150        tableheader = [(Code,'code', 2.5),
151                         (Title,'title', 8.5),
152                         (Term, 'semester', 1.5),
153                         (Cred, 'credits', 1.5),
154                         #(Score, 'score', 1.5),
155                         (Grade, 'grade', 1.5),
156                         ]
157
158        pdfstream = students_utils.renderPDFTranscript(
159            self, 'transcript.pdf',
160            self.context.student, studentview,
161            omit_fields=self.omit_fields,
162            tableheader=tableheader,
163            signatures=self._signatures(),
164            sigs_in_footer=self._sigsInFooter(),
165            digital_sigs=self._digital_sigs(),
166            save_file=self._save_file(),
167            )
168        if not pdfstream:
169            self.redirect(self.url(self.context.student))
170            return
171        return pdfstream
172
173class CustomAccommodationManageFormPage(NigeriaAccommodationManageFormPage):
174    """ Page to manage bed tickets.
175    This manage form page is for both students and students officers.
176    """
177    with_hostel_selection = True
178
179class StudentGetMatricNumberPage(UtilityView, grok.View):
180    """ Construct and set the matriculation number.
181    """
182    grok.context(IStudent)
183    grok.name('get_matric_number')
184    grok.require('waeup.viewStudent')
185
186    def update(self):
187        students_utils = getUtility(IStudentsUtils)
188        msg, mnumber = students_utils.setMatricNumber(self.context)
189        if msg:
190            self.flash(msg, type="danger")
191        else:
192            self.flash(_('Matriculation number %s assigned.' % mnumber))
193            self.context.writeLogMessage(self, '%s assigned' % mnumber)
194        self.redirect(self.url(self.context))
195        return
196
197    def render(self):
198        return
199
200class ExportPDFMatricNumberSlip(UtilityView, grok.View):
201    """Deliver a PDF notification slip.
202    """
203    grok.context(ICustomStudent)
204    grok.name('matric_number_slip.pdf')
205    grok.require('waeup.viewStudent')
206    prefix = 'form'
207
208    form_fields = grok.AutoFields(ICustomStudent).select(
209        'student_id', 'matric_number')
210    omit_fields = ('date_of_birth', 'current_level', 'flash_notice')
211
212    @property
213    def title(self):
214        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
215        return translate(_('Matriculation Number'), 'waeup.kofa',
216            target_language=portal_language)
217
218    @property
219    def label(self):
220        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
221        return translate(_('Matriculation Number Slip\n'),
222            target_language=portal_language) \
223            + ' %s' % self.context.display_fullname
224
225    def render(self):
226        if self.context.state not in (PAID,) or not self.context.is_fresh \
227            or not self.context.matric_number:
228            self.flash('Not allowed.', type="danger")
229            self.redirect(self.url(self.context))
230            return
231        students_utils = getUtility(IStudentsUtils)
232        return students_utils.renderPDFAdmissionLetter(self,
233            self.context.student, omit_fields=self.omit_fields,
234            pre_text='', post_text='')
Note: See TracBrowser for help on using the repository browser.