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

Last change on this file since 15764 was 15764, checked in by Henrik Bettermann, 5 years ago

Change logo. Add favicon. Add logo to all pages. Reenable admission slip.

  • Property svn:keywords set to Id
File size: 12.9 KB
Line 
1## $Id: browser.py 15764 2019-11-07 07:44:28Z 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, ExportPDFAdmissionSlip,
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='')
235
236class CustomExportPDFAdmissionSlip(ExportPDFAdmissionSlip):
237    """Deliver a PDF Admission slip.
238    """
239
240    @property
241    def pre_text(self):
242        return (
243            'I am pleased to inform you that you have been offered '
244            'provisional admission into the Delta State Polytechnic, '
245            'Ogwashi-Uku as follows:')
246
247    @property
248    def post_text(self):
249        return """1. Duration: 2 years
250
2512.      This offer is conditional upon the confirmation of your qualification(s) as listed by you in the application form or which you claim to possess as at when this offer of admission was made and your meeting the minimum department entry requirement.
252
2533. At the time of Registration, you will be required to produce the original copies of your certificates or any other acceptable evidence of the qualification(s), on which this offer of admission has been based.
254
2554. If at any time after admission it is discovered that you do not possess any of the qualifications which you claimed to have obtained, you will be required to withdraw from the Polytechnic.
256
2575. Please, note that resumption/registration starts immediately.
258
2596. You are required to pay all the necessary fees, such as school fees, students\' union fees, boarding fees (optional) and any other prescribed fees online and register immediately. Late registration will attract severe sanction such as payment of late registration fee of N10000 or outright withdrawal of offer of admission.
260
2617. If you do not respond to this offer within two (2) weeks from the date of resumption, the Polytechnic will assume that you are not interested in the offer and may withdraw the offer to accommodate other candidates on awaiting list.
262
2638. If you do not pay your school fees and register within the stipulated time frame for registration, you would not be allowed to write the Polytechnic\'s semester examinations. Should you mistakenly write the exams, your scripts would not be marked.
264
2659. You are required to present at the time of registration, a letter of attestation from a clergy man, a lawyer,  a senior civil servant (Level 13 and above) or any person of reputable standing in the society.
266
26710. Before the commencement of registration, you will be required to undergo a medical examination which should be conducted in the Polytechnic clinic.
268
26911. Other information/instructions about facilities at the Polytechnic, including accommodation, can be obtained from the Polytechnic Portal. The Head of your School/Department at the Polytechnic will make the details of the programme available to you.
270
27112. At the time of registration, you are required to sign an undertaking of non-involvement in cult-related activities and acts of vandalism.
272
27313. We hope that you will be able to take advantage of this offer or provisional admission.
274
27514. Please, accept our hearty congratulations.
276
277Admissions Officer
278For: Registrar
279"""
280
281    def render(self):
282        students_utils = getUtility(IStudentsUtils)
283        return students_utils.renderPDFAdmissionLetter(self,
284            self.context.student, omit_fields=self.omit_fields,
285            pre_text=self.pre_text, post_text=self.post_text)
Note: See TracBrowser for help on using the repository browser.