source: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/students/browser.py @ 16624

Last change on this file since 16624 was 16623, checked in by Henrik Bettermann, 3 years ago

See #137 (no tests yet).

  • Property svn:keywords set to Id
File size: 35.3 KB
Line 
1## $Id: browser.py 16623 2021-09-16 21:33:48Z 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
19import os
20from zope.i18n import translate
21from zope.schema.interfaces import ConstraintNotSatisfied
22from zope.component import getUtility
23from zope.security import checkPermission
24from zope.formlib.textwidgets import BytesDisplayWidget
25from hurry.workflow.interfaces import IWorkflowInfo
26from waeup.kofa.interfaces import (
27    REQUESTED, ADMITTED, CLEARANCE, REQUESTED, CLEARED,
28    IExtFileStore, IKofaUtils, academic_sessions_vocab)
29from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
30from waeup.kofa.browser.layout import (
31    action, jsaction, UtilityView, KofaEditFormPage)
32from waeup.kofa.students.browser import (
33    StudyLevelEditFormPage, StudyLevelDisplayFormPage,
34    StudentBasePDFFormPage, ExportPDFCourseRegistrationSlip,
35    CourseTicketDisplayFormPage, StudentTriggerTransitionFormPage,
36    StartClearancePage, BalancePaymentAddFormPage,
37    ExportPDFAdmissionSlip, ExportPDFPersonalDataSlip,
38    PaymentsManageFormPage,
39    msave, emit_lock_message)
40from waeup.kofa.students.interfaces import (
41    IStudentsUtils, ICourseTicket, IStudent)
42from waeup.kofa.students.vocabularies import StudyLevelSource
43from waeup.kofa.students.workflow import FORBIDDEN_POSTGRAD_TRANS
44from kofacustom.nigeria.students.browser import (
45    NigeriaOnlinePaymentDisplayFormPage,
46    NigeriaStudentBaseDisplayFormPage,
47    NigeriaStudentBaseManageFormPage,
48    NigeriaStudentClearanceEditFormPage,
49    NigeriaOnlinePaymentAddFormPage,
50    NigeriaExportPDFPaymentSlip,
51    NigeriaExportPDFClearanceSlip,
52    NigeriaExportPDFCourseRegistrationSlip,
53    NigeriaStudentBaseEditFormPage,
54    NigeriaBedTicketAddPage,
55    NigeriaAccommodationManageFormPage,
56    NigeriaAccommodationDisplayFormPage,
57    NigeriaStudentPersonalManageFormPage,
58    NigeriaStudentPersonalEditFormPage,
59    NigeriaStudentPersonalDisplayFormPage
60    )
61from kofacustom.iuokada.students.interfaces import (
62    ICustomStudentOnlinePayment, ICustomStudentStudyCourse,
63    ICustomStudentStudyLevel, ICustomStudentBase, ICustomStudent,
64    ICustomStudentPersonal, ICustomStudentPersonalEdit)
65from kofacustom.iuokada.interfaces import MessageFactory as _
66
67class CustomStudentBaseDisplayFormPage(NigeriaStudentBaseDisplayFormPage):
68    """ Page to display student base data
69    """
70    form_fields = grok.AutoFields(ICustomStudentBase).omit(
71        'password', 'suspended', 'suspended_comment', 'flash_notice')
72
73class CustomStudentBaseManageFormPage(NigeriaStudentBaseManageFormPage):
74    """ View to manage student base data
75    """
76    form_fields = grok.AutoFields(ICustomStudentBase).omit(
77        'student_id', 'adm_code', 'suspended',
78        'financially_cleared_by', 'financial_clearance_date')
79
80class StudentBaseEditFormPage(NigeriaStudentBaseEditFormPage):
81    """ View to edit student base data
82    """
83    @property
84    def form_fields(self):
85        form_fields = grok.AutoFields(ICustomStudentBase).select(
86            'email', 'email2', 'parents_email', 'phone',)
87        if not self.context.state in (ADMITTED, CLEARANCE):
88            form_fields['parents_email'].for_display = True
89        return form_fields
90
91class CustomExportPDFCourseRegistrationSlip(
92    NigeriaExportPDFCourseRegistrationSlip):
93    """Deliver a PDF slip of the context.
94    """
95
96    def _signatures(self):
97        return (
98                ['Student Signature'],
99                ['HoD / Course Adviser Signature'],
100                ['College Officer Signature'],
101                ['Dean Signature']
102                )
103
104    #def _sigsInFooter(self):
105    #    return (_('Student'),
106    #            _('HoD / Course Adviser'),
107    #            _('College Officer'),
108    #            _('Dean'),
109    #            )
110    #    return ()
111
112class CustomStudentPersonalDisplayFormPage(NigeriaStudentPersonalDisplayFormPage):
113    """ Page to display student personal data
114    """
115    form_fields = grok.AutoFields(ICustomStudentPersonal)
116    form_fields['perm_address'].custom_widget = BytesDisplayWidget
117    form_fields['postal_address'].custom_widget = BytesDisplayWidget
118    form_fields['hostel_address'].custom_widget = BytesDisplayWidget
119    form_fields['father_address'].custom_widget = BytesDisplayWidget
120    form_fields['mother_address'].custom_widget = BytesDisplayWidget
121    form_fields['guardian_address'].custom_widget = BytesDisplayWidget
122    form_fields[
123        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
124
125
126class CustomStudentPersonalEditFormPage(NigeriaStudentPersonalEditFormPage):
127    """ Page to edit personal data
128    """
129    form_fields = grok.AutoFields(ICustomStudentPersonalEdit).omit(
130        'personal_updated')
131
132    def update(self):
133        #if not self.context.is_fresh:
134        #    self.flash('Not allowed.', type="danger")
135        #    self.redirect(self.url(self.context))
136        #    return
137        if not self.context.minimumStudentPayments():
138            self.flash('Please make 40% of your tution fee payments first.',
139                       type="warning")
140            self.redirect(self.url(self.context, 'view_personal'))
141            return
142        super(CustomStudentPersonalEditFormPage, self).update()
143        return
144
145
146class CustomStudentPersonalManageFormPage(NigeriaStudentPersonalManageFormPage):
147    """ Page to manage personal data
148    """
149    form_fields = grok.AutoFields(ICustomStudentPersonal)
150    form_fields['personal_updated'].for_display = True
151    form_fields[
152        'personal_updated'].custom_widget = FriendlyDatetimeDisplayWidget('le')
153
154class CustomExportPDFPersonalDataSlip(ExportPDFPersonalDataSlip):
155    """Deliver a PDF base and personal data slip.
156    """
157    grok.name('course_registration_clearance.pdf')
158    omit_fields = (
159        'phone', 'email',
160        'suspended',
161        'adm_code', 'suspended_comment',
162        'current_level',
163        'flash_notice', 'entry_session',
164        'parents_email')
165
166    form_fields = grok.AutoFields(ICustomStudentPersonal)
167
168    def _signatures(self):
169        return ([('I certify that the above named student has satisfied the financial requirements for registration.', 'Name and Signature of Bursary Staff', '<br><br>')],
170                [('I certify that the credentials of the student have been screened by me and the student is hereby cleared.', 'Name and Signature of Registry Staff', '<br><br>')],
171                [('I certify that the above named student has registered with the Library.', 'Name and Signature of Library Staff', '<br><br>')],
172                [('I certify that the above named student has been registered with the college. ', 'Name and Signature of College Officer', '<br><br>')],
173                [('I certify that the above named student has completed his/her ICT registration. ', 'Name and Signature of ICT Staff', '<br><br>')],
174                [('Eligibility/Congratulation Station', 'Name and Signature of Registrar', '')],
175                )
176
177    @property
178    def tabletitle(self):
179        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
180        tabletitle = []
181        session = self.context.student.current_session
182        tabletitle.append('_PB_Successful %s/%s Session Payments' %(session, session+1))
183        return tabletitle
184
185    def render(self):
186        if not self.context.minimumStudentPayments():
187            self.redirect(self.url(self.context))
188            return
189        studentview = StudentBasePDFFormPage(self.context.student,
190            self.request, self.omit_fields)
191        students_utils = getUtility(IStudentsUtils)
192
193        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
194        P_ID = translate(_('Payment Id'), 'waeup.kofa', target_language=portal_language)
195        #CD = translate(_('Creation Date'), 'waeup.kofa', target_language=portal_language)
196        PD = translate(_('Payment Date'), 'waeup.kofa', target_language=portal_language)
197        CAT = translate(_('Payment Category'), 'waeup.kofa', target_language=portal_language)
198        ITEM = translate(_('Payment Item'), 'waeup.kofa', target_language=portal_language)
199        AMT = translate(_('Amount (Naira)'), 'waeup.kofa', target_language=portal_language)
200        SSS = translate(_('Payment Session'), 'waeup.kofa', target_language=portal_language)
201        tabledata = []
202        tableheader = []
203        tabledata.append(sorted(
204            [value for value in self.context['payments'].values()
205             if value.p_state in ('paid', 'waived', 'scholarship')
206             and value.p_session >= value.student.current_session],
207             key=lambda value: value.p_session))
208        tableheader.append([(P_ID,'p_id', 4.2),
209                         #(CD,'creation_date', 3),
210                         (PD,'formatted_p_date', 3),
211                         (CAT,'category', 3),
212                         (ITEM, 'p_item', 3),
213                         (AMT, 'amount_auth', 2),
214                         (SSS, 'p_session', 2),
215                         ])
216
217        #watermark_path = os.path.join(
218        #    os.path.dirname(__file__), 'static', 'watermark.pdf')
219        #watermark = open(watermark_path, 'rb')
220        #file_path = os.path.join(
221        #    os.path.dirname(__file__), 'static', 'biodataPage2.pdf')
222        #file = open(file_path, 'rb')
223        #mergefiles = [file,]
224
225        return students_utils.renderPDF(
226            self, 'course_registration_clearance.pdf',
227            self.context.student, studentview,
228            omit_fields=self.omit_fields,
229            signatures=self._signatures(),
230
231            tableheader=tableheader,
232            tabledata=tabledata,
233
234            pagebreak=True,
235        #    mergefiles=mergefiles,
236        #    watermark=watermark
237            )
238
239class CustomAccommodationDisplayFormPage(NigeriaAccommodationDisplayFormPage):
240    """ Page to view bed tickets.
241    """
242    with_hostel_selection = True
243
244class CustomAccommodationManageFormPage(NigeriaAccommodationManageFormPage):
245    """ Page to manage bed tickets.
246    This manage form page is for both students and students officers.
247    """
248    with_hostel_selection = True
249
250class CustomBedTicketAddPage(NigeriaBedTicketAddPage):
251    """ Page to add a bed ticket
252    """
253    with_ac = False
254    with_bedselection = True
255
256class CustomPaymentsManageFormPage(PaymentsManageFormPage):
257    """ Page to manage the student payments. This manage form page is for
258    both students and students officers. IUOkada does not allow students
259    to remove any payment ticket.
260    """
261    grok.template('paymentsmanagepage')
262
263    @property
264    def manage_payments_allowed(self):
265        return checkPermission('waeup.manageStudent', self.context)
266
267    @property
268    def schoolfee_payments_made(self):
269        cs = self.context.student.current_session
270        SF_PAYMENTS = ('schoolfee', 'schoolfee40', 'secondinstal', 'clearance')
271        sf_paid = {cs-1: 0, cs: 0, cs+1: 0}
272        try:
273            certificate = self.context.student['studycourse'].certificate
274        except (AttributeError, TypeError):
275            return sf_paid, 0
276        try:
277            academic_session = grok.getSite()['configuration'][str(cs)]
278        except KeyError:
279            return sf_paid, 0
280        if self.context.student in (ADMITTED, CLEARANCE, REQUESTED, CLEARED):
281            total_sf = getattr(certificate, 'school_fee_1', 0.0)
282        else:
283            total_sf = getattr(certificate, 'school_fee_2', 0.0)
284        cfee = academic_session.clearance_fee
285        if self.context.student.is_postgrad:
286            cfee *= 0.5
287        total_sf += cfee
288        for ticket in self.context.student['payments'].values():
289            if ticket.p_category in SF_PAYMENTS and \
290                ticket.p_state == 'paid' and \
291                ticket.p_session in (cs-1, cs, cs+1):
292                sf_paid[ticket.p_session] += ticket.amount_auth
293        return sf_paid, total_sf
294
295class StudentGetMatricNumberPage(UtilityView, grok.View):
296    """ Construct and set the matriculation number.
297    """
298    grok.context(IStudent)
299    grok.name('get_matric_number')
300    grok.require('waeup.manageStudent')
301
302    def update(self):
303        students_utils = getUtility(IStudentsUtils)
304        msg, mnumber = students_utils.setMatricNumber(self.context)
305        if msg:
306            self.flash(msg, type="danger")
307        else:
308            self.flash(_('Matriculation number %s assigned.' % mnumber))
309            self.context.writeLogMessage(self, '%s assigned' % mnumber)
310        self.redirect(self.url(self.context))
311        return
312
313    def render(self):
314        return
315
316class SwitchLibraryAccessView(UtilityView, grok.View):
317    """ Switch the library attribute
318    """
319    grok.context(ICustomStudent)
320    grok.name('switch_library_access')
321    grok.require('waeup.switchLibraryAccess')
322
323    def update(self):
324        if self.context.library:
325            self.context.library = False
326            self.context.writeLogMessage(self, 'library access disabled')
327            self.flash(_('Library access disabled'))
328        else:
329            self.context.library = True
330            self.context.writeLogMessage(self, 'library access enabled')
331            self.flash(_('Library access enabled'))
332        self.redirect(self.url(self.context))
333        return
334
335    def render(self):
336        return
337
338class ExportLibIdCard(UtilityView, grok.View):
339    """Deliver an id card for the library.
340    """
341    grok.context(ICustomStudent)
342    grok.name('lib_idcard.pdf')
343    grok.require('waeup.viewStudent')
344    prefix = 'form'
345
346    label = u"Library Clearance"
347
348    omit_fields = (
349        'suspended', 'email', 'phone',
350        'adm_code', 'suspended_comment',
351        'date_of_birth',
352        'current_mode', 'certificate',
353        'entry_session',
354        'flash_notice')
355
356    form_fields = []
357
358    def _sigsInFooter(self):
359        isStudent = getattr(
360            self.request.principal, 'user_type', None) == 'student'
361        if isStudent:
362            return ''
363        return (_("Date, Reader's Signature"),
364                _("Date, Circulation Librarian's Signature"),
365                )
366
367    def update(self):
368        if not self.context.library:
369            self.flash(_('Forbidden!'), type="danger")
370            self.redirect(self.url(self.context))
371        return
372
373    @property
374    def note(self):
375        return """
376<br /><br /><br /><br /><font size='12'>
377This is to certify that the bearer whose photograph and other details appear
378 overleaf is a registered user of the <b>University Library</b>.
379 The card is not transferable. A replacement fee is charged for a loss,
380 mutilation or otherwise. If found, please, return to the University Library,
381 Igbinedion University, Okada.
382</font>
383
384"""
385        return
386
387    def render(self):
388        studentview = StudentBasePDFFormPage(self.context.student,
389            self.request, self.omit_fields)
390        students_utils = getUtility(IStudentsUtils)
391        return students_utils.renderPDF(
392            self, 'lib_idcard',
393            self.context.student, studentview,
394            omit_fields=self.omit_fields,
395            sigs_in_footer=self._sigsInFooter(),
396            note=self.note)
397
398class CustomStartClearancePage(StartClearancePage):
399    with_ac = False
400
401class CustomBalancePaymentAddFormPage(BalancePaymentAddFormPage):
402    grok.require('waeup.payStudent')
403
404class CustomExportPDFAdmissionSlip(ExportPDFAdmissionSlip):
405    """Deliver a PDF Admission slip.
406    """
407
408    omit_fields = ('date_of_birth',
409                   #'current_level',
410                   #'current_mode',
411                   #'entry_session'
412                   )
413
414    @property
415    def session(self):
416        return academic_sessions_vocab.getTerm(
417            self.context.entry_session).title
418
419    @property
420    def level(self):
421        studylevelsource = StudyLevelSource()
422        return studylevelsource.factory.getTitle(
423            self.context['studycourse'].certificate, self.context.current_level)
424
425    @property
426    def label(self):
427        return 'OFFER OF PROVISIONAL ADMISSION \nFOR %s SESSION' % self.session
428
429    @property
430    def pre_text_ug(self):
431        return (
432            'Following your performance in the screening exercise '
433            'for the %s academic session, I am pleased to inform '
434            'you that you have been offered provisional admission into the '
435            'Igbinedion University, Okada as follows:' % self.session)
436
437    @property
438    def pre_text_pg(self):
439        return (
440            'I am pleased to inform you that your application for admission'
441            ' into the Igbinedion University, Okada was successful. You have'
442            ' been admitted as follows:')
443
444    @property
445    def basic_medical_only_text(self):
446        return"""
447Progression to 200 Level MBBS programmes is highly competitive and strictly based on merit/approved quota. Students who are unable to make the cut off point will have the option of joining allied courses such as BSc Nursing, BSc Anatomy, BSc Biochemistry, BSc Physiology, Bachelor of Medical Laboratory Science, including Computer Science and engineering courses at 200 Level provided they have the relevant O/L credits.
448"""
449
450    @property
451    def basic_pharmacy_only_text(self):
452        return"""
453Progression to 200 Level Pharmacy programmes is highly competitive and strictly based on merit/approved quota. Students who are unable to make the cut off point will have the option of joining allied courses such as BSc Nursing, BSc Anatomy, BSc Biochemistry, BSc Physiology, Bachelor of Medical Laboratory Science, including Computer Science and engineering courses at 200 Level provided they have the relevant O/L credits.
454"""
455
456    @property
457    def post_text_ug(self):
458        return """
459Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: Current UTME result slip, WAEC/NECO (0' Level) result, Birth certificate or sworn affidavit of age, and health certificate from a recognized Medical Centre.
460
461All credentials (original) will be checked during registration. This admission will be cancelled at any point in time it is found that your claims in the application form are false.
462
463You are required to show evidence of the result / credentials you presented on application for admission.
464
465Fees can be paid using any of the following options:
466
467Fees can be paid through your portal page. INSTRUCTIONS can be found below "FEES PAYMENT PROCEDURE" for the options you have to make your payment, as well as instructions on how to use your preferred payment option. If you choose to use the bank payment option, you can pay at any branch of the following banks through Etranzact platform only: Access Bank, First Bank, Zenith Bank
468
469Kindly note the following:
470
471Fees indicated on the Fee Structure page are valid for the current session only.
472Your Student Id (indicated above) Is your logln to the University portal.
473As an indication of your acceptance of this offer of admission, you should pay a non-refundable Acceptance deposit of N200,000. Further note that the 200,000 deposit is part of the tuition fee for the session. Failure to pay after the expiration of two weeks may lead to forfeiture of admission.
474All fees must be paid in full at the beginning of the session, as basis for accommodation, registration and attendance of lectures. This is the rule for all students at all levels. Install mental payments of not more than two installments, may be allowed under exceptional circumstances.
475Fees once paid are not refundable.
476It is advisable that you keep the original receipts of fees paid and present them on demand.
477
478Accommodation: Accommodation in University hostels is compulsory for every student. No student Is allowed to live outside the hostels. Any student who does so will be expelled from the University.
479
480Food: Food is available in cafeteria on "pay-as-you-eat" basis.
481
482Resumption Date: The University opens for fresh students on Saturday, 2nd October, 2021. All newly admitted students are expected to resume on that date.
483
484Registration/Orientation Programme: Orientation programme/registration for fresh students will start on Monday, 4th October, 2021 - Thursday, 7th October, 2021. A late registration fee of N50,000 will be charged after this date. All credentials, O'Level Results, Birth Certificate/Age Declaration, UTME Result Slip (Original) will be checked during registration. This admission will be cancelled at any point in time it is found that any of your claims in the application form is false.
485
486Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the other charges.
487
488Kindly note that fresh students are not allowed the use of private vehicles.
489
490Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
491
492We wish you a successful academic career in Igbinedion University.
493
494Congratulations!
495
496
497
498<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
499
500Friday Benji Bakare Esq.
501Registrar
502registrar@iuokada.edu.ng
50308035902949
504"""
505
506    @property
507    def post_text_2020(self):    # no longer used
508        return """
509Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: Current UTME result slip, WAEC/NECO (0' Level) result, Birth certificate or sworn affidavit of age, and health certificate from a recognized Medical Centre.
510
511All credentials (original) will be checked during registration. This admission will be cancelled at any point in time it is found that your claims in the application form are false.
512
513You are required to show evidence of the result / credentials you presented on application for admission.
514
515Fees can be paid using any of the following options:
516
517Fees can be paid through your portal page. INSTRUCTIONS can be found below "FEES PAYMENT PROCEDURE" for the options you have to make your payment, as well as instructions on how to use your preferred payment option. If you choose to use the bank payment option, you can pay at any branch of the following banks through Etranzact platform only: Access Bank, First Bank, Zenith Bank
518
519Kindly note the following:
520
521Fees indicated on the Fee Structure page are valid for the current session only.
522Your Student Id (indicated above) Is your logln to the University portal.
523As an indication of your acceptance of this offer of admission, you should pay a non-refundable Acceptance deposit of N200,000. Further note that the 200,000 deposit is part of the tuition fee for the session. Failure to pay after the expiration of two weeks may lead to forfeiture of admission.
524All fees must be paid in full at the beginning of the session, as basis for accommodation, registration and attendance of lectures. This is the rule for all students at all levels. Install mental payments of not more than two installments, may be allowed under exceptional circumstances.
525Fees once paid are not refundable.
526It is advisable that you keep the original receipts of fees paid and present them on demand.
527
528Accommodation: Accommodation in University hostels is compulsory for every student. No student Is allowed to live outside the hostels. Any student who does so will be expelled from the University.
529
530Food: Food is available in cafeteria on "pay-as-you-eat" basis.
531
532Resumption Date: The University opens for fresh students with online registration starting from Monday 28th September, 2020. The date for physical resumption is 14th November, 2020.
533
534Registration/Orientation Programme: Orientation programme/registration for fresh students will start on Monday, 16th November 2020. Registration ends on 2020-11-30.  A late registration fee of N50,000 will be charged after this date. All credentials, O'Level Results, Birth Certificate/Age Declaration, UTME Result Slip (Original) will be checked during registration. This admission will be cancelled at any point in time it is found that any of your claims in the application form is false.
535
536Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the other charges.
537
538Kindly note that fresh students are not allowed the use of private vehicles.
539
540Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
541
542We wish you a successful academic career in Igbinedion University.
543
544Congratulations!
545
546
547
548<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
549
550Friday Benji Bakare Esq.
551Registrar
552registrar@iuokada.edu.ng
55308035902949
554"""
555
556    @property
557    def post_text_pg(self):
558        return """
5591. Details of your programme will be made available to you by the Head of your Department on your arrival at the Igbinedion University.
560
5612. This offer is conditional upon the confirmation of your qualifications as listed by you in your application form. You will be required to produce the ORIGINAL COPIES of all your certificates for verification during registration. If at any time after admission, it is discovered that you do not possess any of the qualifications upon which this offer of admission was made, you will be required to withdraw from the University.
562
5633. If you accept this offer of admission upon the conditions above, you should please:
564
565(a) Complete the enclosed Acceptance Form of Provisional Offer of Admission in duplicate and send  by registered mail or by hand to the
566
567Secretary
568School of Postgraduate Studies and Research
569Igbinedion University,
570P.M.B. 0006,
571Benin City, Edo State,
572Nigeria
573
574(b)     Forward the following along with the Acceptance Form of Provisional Offer of Admission.
575
576(i) A non-refundable deposit of N100,000.00 (One Hundred Thousand Naira Only) which is part of the School fees: Payable Online.
577
578(ii) Four recent passport-size photograph of yourself with your full-names (surname first in BLOCK LETTERS) written on the reverse side of the photograph and pinned to the Acceptance Form.
579
5804. The following will be required for Registration:
581
582(a) A medical examination to be conducted by an approved medical practitioner. On your arrival at the Igbinedion University, you should submit the enclosed Igbinedion University Medical Examination Form duly completed and signed by an approved medical practitioner together with your chest X-ray film to Director of Health Service at the Igbinedion University, Okada.
583
584(b) The original copies of all credentials listed in your application form (including NYSC discharge/exemption certificate) should be brought for sighting.
585
5865. You are required to pay the necessary fees and register for your degree programme not later than three weeks from the beginning of the Academic Session. Late registration may be allowed during an additional period of five weeks on payment of a late registration fees. Please note that you will be allowed to register after two months have elapsed from the beginning of the sessions.
587
5886. Please find attached:
589
590(a) A copy of School fees Regime
591(b) A copy of Acceptance Forms
592
5937. Note:
594
595(a) All Tuition fees are to be paid online
596(b) Post-graduate dues and other charges are to be paid into ABC Microfinance Bank Okada, Account No: 30125
597
5988.  CONGRATULATIONS!!!
599
600Yours faithfully,
601
602<img src="${signature_ezewele_img_path}" valign="-20" height="38" width="86" />
603
604Mrs. Angela Ezewele
605Secretary, School of Postgraduate Studies & Research
606"""
607
608    @property
609    def post_text_pt(self):
610        return """
611Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: Current UTME result slip where available, WAEC/NECO (0' Level) result, Birth certificate or sworn affidavit of age, and health certificate from a recognized Medical Centre.
612
613All credentials (original) will be checked during registration. This admission will be cancelled at any point in time it is found that your claims in the application form are false.
614
615You are required to show evidence of the result / credentials you presented on application for admission.
616
617Fees are paid through bank draft only. Fees can be paid using any of the following options: Professional courses N180,000 (One Hundred and Eighty Thousand Naira only) and Non- Professional N150,000 (One Hundred and Fifty Thousand Naira only).
618
619Your Student Id (indicated above) is your login to the University portal. As an indication of your acceptance of this offer of admission, you should immediatelty raise a draft of fees above at the beginning of the session,. Install mental payments of not more than two installments, may be allowed under exceptional circumstances. Fees once paid are not refundable.
620
621It is advisable that you keep the original receipts of fees paid and present them on demand.
622
623Resumption Date: The University opens for fresh students with online registration starting from Monday 28th September, 2020. The date for physical resumption is 14th November, 2020.
624
625All credentials, O'Level Results, Birth Certificate/Age Declaration, UTME Result Slip where available (Original) will be checked during registration. This admission will be cancelled at any point in time it is found that any of your claims in the application form is false.
626
627Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
628
629We wish you a successful academic career in Igbinedion University.
630
631Congratulations!
632
633<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
634
635Friday Benji Bakare Esq.
636Registrar
637registrar@iuokada.edu.ng
63808035902949
639"""
640
641    @property
642    def post_text_jupeb(self):
643        return """
644Please note that at the point of registration for your programme of study (course), you will be required to present the following documents: WAEC/NECO (O' Level) result, Birth certificate or sworn affidavit of age, and certificate of medical fitness from a recognized Medical Centre.
645
646The fee schedule and the options for payment are indicated below. If you choose to use the bank payment option, you can pay at any branch of Access bank on 0787077169 with account name IUO JUPEB or on https://iuokada.waeup.org/e-tranzact or Interswitch platform.
647
648Kindly note the following:
649
6501. As an indication of your acceptance of this offer of admission, you should pay a non- refundable Acceptance deposit of N50,000:00.
6512. Tuition fee for the session is N250,000:00 for Arts and N300,000:00 for Sciences
6523. Accommodation fee for the session is N175,000:00
6534. Administrative fee is N110.000.00
6545. All fees must be paid in full at the beginning of the session, as basis for accommodation, registration and attendance of lectures. Instalmental payments of not more than two instalments, may be allowed
6556. Fees once paid are not refundable.
6567. It is advisable that you keep the original receipts of fees paid and present them on demand.
657
658Accommodation: Accommodation in University hostels is compulsory for every student. No student is allowed to live outside the hostels. Any student who does so will be expelled from the programme.
659
660Food: Food is available in cafeteria on "pay-as-you-eat" basis.
661
662Resumption Date: The University opens for dual mode of teaching (physical/online) for students on Monday, 27th September, 2021.
663
664Registration Programme: Online registration for fresh students will start on Monday, 27th September, 2021 and end on 4th October 2021. A late registration fee of N20,000 will be charged after this date.
665
666Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the tuition.
667Kindly note that JUPEB students are not allowed the use of private vehicles on campus.
668
669Conduct: All students are expected to conduct themselves properly and dress decently on campus, as well as obey all rules and regulations as failure to comply will attract appropriate sanctions.
670
671We wish you a successful academic career in Igbinedion University. Enquiries: 08034331960, 08120611736
672
673Congratulations!
674
675
676
677<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
678
679Friday Benji Bakare Esq.
680Registrar
681"""
682
683    def render(self):
684        students_utils = getUtility(IStudentsUtils)
685        watermark_path = os.path.join(
686            os.path.dirname(__file__), 'static', 'watermark.pdf')
687        watermark = open(watermark_path, 'rb')
688        if self.context.is_jupeb:
689            return students_utils.renderPDFAdmissionLetter(self,
690                self.context.student, omit_fields=self.omit_fields,
691                pre_text=self.pre_text_ug, post_text=self.post_text_jupeb,
692                watermark=watermark)
693        if self.context.current_mode.endswith('_pt'):
694            return students_utils.renderPDFAdmissionLetter(self,
695                self.context.student, omit_fields=self.omit_fields,
696                pre_text=self.pre_text_ug, post_text=self.post_text_pt,
697                watermark=watermark)
698        if self.context.is_postgrad:
699            file_path = os.path.join(
700                os.path.dirname(__file__), 'static', 'admission_letter_pg.pdf')
701            file = open(file_path, 'rb')
702            mergefiles = [file,]
703            return students_utils.renderPDFAdmissionLetter(self,
704                self.context.student, omit_fields=self.omit_fields,
705                pre_text=self.pre_text_pg, post_text=self.post_text_pg,
706                mergefiles=mergefiles,
707                watermark=watermark)
708        file_path = os.path.join(
709            os.path.dirname(__file__), 'static', 'admission_letter_ug.pdf')
710        file = open(file_path, 'rb')
711        mergefiles = [file,]
712        if self.context.certcode in ('BBMS', 'MBBS') and self.context.current_level == 100:
713            post_text = self.basic_medical_only_text + self.post_text_ug
714        elif self.context.certcode in ('BPHARM',) and self.context.current_level == 100:
715            post_text = self.basic_pharmacy_only_text + self.post_text_ug
716        else:
717            post_text = self.post_text_ug
718        return students_utils.renderPDFAdmissionLetter(self,
719            self.context.student, omit_fields=self.omit_fields,
720            pre_text=self.pre_text_ug, post_text=post_text,
721            mergefiles=mergefiles,
722            watermark=watermark)
723
724class CustomOnlinePaymentDisplayFormPage(NigeriaOnlinePaymentDisplayFormPage):
725    """ Page to view an online payment ticket. We do not omit provider_amt.
726    """
727    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
728        'gateway_amt', 'thirdparty_amt', 'p_item','p_combi', 'provider_amt')
729    form_fields[
730        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
731    form_fields[
732        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
733
734class CustomExportPDFPaymentSlip(NigeriaExportPDFPaymentSlip):
735    """Deliver a PDF slip of the context. We do not omit provider_amt.
736    """
737    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
738        'gateway_amt', 'thirdparty_amt', 'p_item',
739        'p_split_data','p_combi', 'provider_amt')
740    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
741    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
Note: See TracBrowser for help on using the repository browser.