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

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

Change text.

  • Property svn:keywords set to Id
File size: 35.6 KB
Line 
1## $Id: browser.py 16711 2021-11-10 06:49:16Z 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        if cs > self.context.student.entry_session:
272            sf_paid = {cs-1: 0.0, cs: 0.0, cs+1: 0.0}
273            sessions = (cs-1, cs, cs+1)
274        else:
275            sf_paid = {cs: 0.0, cs+1: 0.0}
276            sessions = (cs, cs+1)
277        try:
278            certificate = self.context.student['studycourse'].certificate
279        except (AttributeError, TypeError):
280            return sf_paid, 0, 0
281        total_sf = 0.0
282        if self.context.student in (ADMITTED, CLEARANCE, REQUESTED, CLEARED):
283            sf = getattr(certificate, 'school_fee_1', 0.0)
284        else:
285            sf = getattr(certificate, 'school_fee_2', 0.0)
286        if sf is not None:
287            total_sf = sf
288        brought_fwd = 0.0
289        for ticket in self.context.values():
290            amt = ticket.net_amt
291            if not amt:
292                amt = ticket.amount_auth
293            if ticket.p_category in SF_PAYMENTS and \
294                ticket.p_state == 'paid' and \
295                ticket.p_session in sessions:
296                sf_paid[ticket.p_session] += amt
297            if ticket.p_state != 'paid' and\
298               ticket.p_category == 'brought_fwd':
299                  brought_fwd += ticket.amount_auth
300        return sf_paid, total_sf, brought_fwd
301
302class StudentGetMatricNumberPage(UtilityView, grok.View):
303    """ Construct and set the matriculation number.
304    """
305    grok.context(IStudent)
306    grok.name('get_matric_number')
307    grok.require('waeup.manageStudent')
308
309    def update(self):
310        students_utils = getUtility(IStudentsUtils)
311        msg, mnumber = students_utils.setMatricNumber(self.context)
312        if msg:
313            self.flash(msg, type="danger")
314        else:
315            self.flash(_('Matriculation number %s assigned.' % mnumber))
316            self.context.writeLogMessage(self, '%s assigned' % mnumber)
317        self.redirect(self.url(self.context))
318        return
319
320    def render(self):
321        return
322
323class SwitchLibraryAccessView(UtilityView, grok.View):
324    """ Switch the library attribute
325    """
326    grok.context(ICustomStudent)
327    grok.name('switch_library_access')
328    grok.require('waeup.switchLibraryAccess')
329
330    def update(self):
331        if self.context.library:
332            self.context.library = False
333            self.context.writeLogMessage(self, 'library access disabled')
334            self.flash(_('Library access disabled'))
335        else:
336            self.context.library = True
337            self.context.writeLogMessage(self, 'library access enabled')
338            self.flash(_('Library access enabled'))
339        self.redirect(self.url(self.context))
340        return
341
342    def render(self):
343        return
344
345class ExportLibIdCard(UtilityView, grok.View):
346    """Deliver an id card for the library.
347    """
348    grok.context(ICustomStudent)
349    grok.name('lib_idcard.pdf')
350    grok.require('waeup.viewStudent')
351    prefix = 'form'
352
353    label = u"Library Clearance"
354
355    omit_fields = (
356        'suspended', 'email', 'phone',
357        'adm_code', 'suspended_comment',
358        'date_of_birth',
359        'current_mode', 'certificate',
360        'entry_session',
361        'flash_notice')
362
363    form_fields = []
364
365    def _sigsInFooter(self):
366        isStudent = getattr(
367            self.request.principal, 'user_type', None) == 'student'
368        if isStudent:
369            return ''
370        return (_("Date, Reader's Signature"),
371                _("Date, Circulation Librarian's Signature"),
372                )
373
374    def update(self):
375        if not self.context.library:
376            self.flash(_('Forbidden!'), type="danger")
377            self.redirect(self.url(self.context))
378        return
379
380    @property
381    def note(self):
382        return """
383<br /><br /><br /><br /><font size='12'>
384This is to certify that the bearer whose photograph and other details appear
385 overleaf is a registered user of the <b>University Library</b>.
386 The card is not transferable. A replacement fee is charged for a loss,
387 mutilation or otherwise. If found, please, return to the University Library,
388 Igbinedion University, Okada.
389</font>
390
391"""
392        return
393
394    def render(self):
395        studentview = StudentBasePDFFormPage(self.context.student,
396            self.request, self.omit_fields)
397        students_utils = getUtility(IStudentsUtils)
398        return students_utils.renderPDF(
399            self, 'lib_idcard',
400            self.context.student, studentview,
401            omit_fields=self.omit_fields,
402            sigs_in_footer=self._sigsInFooter(),
403            note=self.note)
404
405class CustomStartClearancePage(StartClearancePage):
406    with_ac = False
407
408class CustomBalancePaymentAddFormPage(BalancePaymentAddFormPage):
409    grok.require('waeup.payStudent')
410
411class CustomExportPDFAdmissionSlip(ExportPDFAdmissionSlip):
412    """Deliver a PDF Admission slip.
413    """
414
415    omit_fields = ('date_of_birth',
416                   #'current_level',
417                   #'current_mode',
418                   #'entry_session'
419                   )
420
421    @property
422    def session(self):
423        return academic_sessions_vocab.getTerm(
424            self.context.entry_session).title
425
426    @property
427    def level(self):
428        studylevelsource = StudyLevelSource()
429        return studylevelsource.factory.getTitle(
430            self.context['studycourse'].certificate, self.context.current_level)
431
432    @property
433    def label(self):
434        return 'OFFER OF PROVISIONAL ADMISSION \nFOR %s SESSION' % self.session
435
436    @property
437    def pre_text_ug(self):
438        return (
439            'Following your performance in the screening exercise '
440            'for the %s academic session, I am pleased to inform '
441            'you that you have been offered provisional admission into the '
442            'Igbinedion University, Okada as follows:' % self.session)
443
444    @property
445    def pre_text_pg(self):
446        return (
447            'I am pleased to inform you that your application for admission'
448            ' into the Igbinedion University, Okada was successful. You have'
449            ' been admitted as follows:')
450
451    @property
452    def basic_medical_only_text(self):
453        return"""
454Progression 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.
455"""
456
457    @property
458    def basic_pharmacy_only_text(self):
459        return"""
460Progression 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.
461"""
462
463    @property
464    def post_text_ug(self):
465        return """
466Please 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.
467
468All 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.
469
470You are required to show evidence of the result / credentials you presented on application for admission.
471
472Fees can be paid using any of the following options:
473
474Fees 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
475
476Kindly note the following:
477
478Fees indicated on the Fee Structure page are valid for the current session only.
479Your Student Id (indicated above) Is your logln to the University portal.
480As 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.
481All 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.
482Fees once paid are not refundable.
483It is advisable that you keep the original receipts of fees paid and present them on demand.
484
485Accommodation: 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.
486
487Food: Food is available in cafeteria on "pay-as-you-eat" basis.
488
489Resumption Date: The University opens for fresh students on Saturday, 9th October, 2021. All newly admitted students are expected to resume on that date.
490
491Registration/Orientation Programme: Orientation programme/registration for fresh students will start on Monday, 11th October, 2021 - Friday, 15th 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.
492
493Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the other charges.
494
495Kindly note that fresh students are not allowed the use of private vehicles.
496
497Conduct: 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.
498
499We wish you a successful academic career in Igbinedion University.
500
501Congratulations!
502
503
504
505<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
506
507Friday Benji Bakare Esq.
508Registrar
509registrar@iuokada.edu.ng
51008035902949
511"""
512
513    @property
514    def post_text_2020(self):    # no longer used
515        return """
516Please 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.
517
518All 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.
519
520You are required to show evidence of the result / credentials you presented on application for admission.
521
522Fees can be paid using any of the following options:
523
524Fees 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
525
526Kindly note the following:
527
528Fees indicated on the Fee Structure page are valid for the current session only.
529Your Student Id (indicated above) Is your logln to the University portal.
530As 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.
531All 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.
532Fees once paid are not refundable.
533It is advisable that you keep the original receipts of fees paid and present them on demand.
534
535Accommodation: 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.
536
537Food: Food is available in cafeteria on "pay-as-you-eat" basis.
538
539Resumption 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.
540
541Registration/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.
542
543Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the other charges.
544
545Kindly note that fresh students are not allowed the use of private vehicles.
546
547Conduct: 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.
548
549We wish you a successful academic career in Igbinedion University.
550
551Congratulations!
552
553
554
555<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
556
557Friday Benji Bakare Esq.
558Registrar
559registrar@iuokada.edu.ng
56008035902949
561"""
562
563    @property
564    def post_text_pg(self):
565        return """
5661. Details of your programme will be made available to you by the Head of your Department on your arrival at the Igbinedion University. The session commences every October.
567
5682. 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.
569
5703. If you accept this offer of admission upon the conditions above, you should please:
571
572(a) Complete the enclosed Acceptance Form of Provisional Offer of Admission in duplicate and send  by registered mail or by hand to the
573
574Secretary
575School of Postgraduate Studies and Research
576Igbinedion University,
577P.M.B. 0006,
578Benin City, Edo State,
579Nigeria
580
581(b)     Forward the following along with the Acceptance Form of Provisional Offer of Admission.
582
583(i) A non-refundable deposit of N100,000.00 (One Hundred Thousand Naira Only) which is part of the School fees: Payable Online.
584
585(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.
586
5874. The following will be required for Registration:
588
589(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.
590
591(b) The original copies of all credentials listed in your application form (including NYSC discharge/exemption certificate) should be brought for sighting.
592
5935. 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.
594
5956. Please find attached:
596
597(a) A copy of School fees Regime
598(b) A copy of Acceptance Forms
599
6007. Note:
601
602(a) All Tuition fees are to be paid online
603(b) Post-graduate dues and other charges are to be paid into ABC Microfinance Bank Okada, Account No: 30125
604
6058.  CONGRATULATIONS!!!
606
607Yours faithfully,
608
609<img src="${signature_ezewele_img_path}" valign="-20" height="38" width="86" />
610
611Mrs. Angela Ezewele
612Secretary, School of Postgraduate Studies & Research
613"""
614
615    @property
616    def post_text_pt(self):
617        return """
618Please 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.
619
620All 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.
621
622You are required to show evidence of the result / credentials you presented on application for admission.
623
624Fees 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).
625
626Your 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.
627
628It is advisable that you keep the original receipts of fees paid and present them on demand.
629
630Resumption 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.
631
632All 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.
633
634Conduct: 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.
635
636We wish you a successful academic career in Igbinedion University.
637
638Congratulations!
639
640<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
641
642Friday Benji Bakare Esq.
643Registrar
644registrar@iuokada.edu.ng
64508035902949
646"""
647
648    @property
649    def post_text_jupeb(self):
650        return """
651Please 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.
652
653The 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.
654
655Kindly note the following:
656
6571. As an indication of your acceptance of this offer of admission, you should pay a non- refundable Acceptance deposit of N50,000:00.
6582. Tuition fee for the session is N200,000:00 for Arts and N250,000:00 for Sciences
6593. Accommodation fee for the session is N175,000:00
6604. 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
6615. Fees once paid are not refundable.
6626. It is advisable that you keep the original receipts of fees paid and present them on demand.
663
664Accommodation: 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.
665
666Food: Food is available in cafeteria on "pay-as-you-eat" basis.
667
668Resumption Date: The University opens for dual mode of teaching (physical/online) for students on Monday, 27th September, 2021.
669
670Registration 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.
671
672Transport Facility: The University provides a compulsory shuttle bus service to all students at a fee already included in the tuition.
673Kindly note that JUPEB students are not allowed the use of private vehicles on campus.
674
675Conduct: 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.
676
677We wish you a successful academic career in Igbinedion University. Enquiries: 08034331960, 08120611736
678
679Congratulations!
680
681
682
683<img src="${signature_benji_img_path}" valign="-20" height="38" width="86" />
684
685Friday Benji Bakare Esq.
686Registrar
687"""
688
689    def render(self):
690        students_utils = getUtility(IStudentsUtils)
691        watermark_path = os.path.join(
692            os.path.dirname(__file__), 'static', 'watermark.pdf')
693        watermark = open(watermark_path, 'rb')
694        if self.context.is_jupeb:
695            return students_utils.renderPDFAdmissionLetter(self,
696                self.context.student, omit_fields=self.omit_fields,
697                pre_text=self.pre_text_ug, post_text=self.post_text_jupeb,
698                watermark=watermark)
699        if self.context.current_mode.endswith('_pt'):
700            return students_utils.renderPDFAdmissionLetter(self,
701                self.context.student, omit_fields=self.omit_fields,
702                pre_text=self.pre_text_ug, post_text=self.post_text_pt,
703                watermark=watermark)
704        if self.context.is_postgrad:
705            file_path = os.path.join(
706                os.path.dirname(__file__), 'static', 'admission_letter_pg.pdf')
707            file = open(file_path, 'rb')
708            mergefiles = [file,]
709            return students_utils.renderPDFAdmissionLetter(self,
710                self.context.student, omit_fields=self.omit_fields,
711                pre_text=self.pre_text_pg, post_text=self.post_text_pg,
712                mergefiles=mergefiles,
713                watermark=watermark)
714        file_path = os.path.join(
715            os.path.dirname(__file__), 'static', 'admission_letter_ug.pdf')
716        file = open(file_path, 'rb')
717        mergefiles = [file,]
718        if self.context.certcode in ('BBMS', 'MBBS') and self.context.current_level == 100:
719            post_text = self.basic_medical_only_text + self.post_text_ug
720        elif self.context.certcode in ('BPHARM',) and self.context.current_level == 100:
721            post_text = self.basic_pharmacy_only_text + self.post_text_ug
722        else:
723            post_text = self.post_text_ug
724        return students_utils.renderPDFAdmissionLetter(self,
725            self.context.student, omit_fields=self.omit_fields,
726            pre_text=self.pre_text_ug, post_text=post_text,
727            mergefiles=mergefiles,
728            watermark=watermark)
729
730class CustomOnlinePaymentDisplayFormPage(NigeriaOnlinePaymentDisplayFormPage):
731    """ Page to view an online payment ticket. We do not omit provider_amt.
732    """
733    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
734        'gateway_amt', 'thirdparty_amt', 'p_item','p_combi', 'provider_amt')
735    form_fields[
736        'creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
737    form_fields[
738        'payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
739
740class CustomExportPDFPaymentSlip(NigeriaExportPDFPaymentSlip):
741    """Deliver a PDF slip of the context. We do not omit provider_amt.
742    """
743    form_fields = grok.AutoFields(ICustomStudentOnlinePayment).omit(
744        'gateway_amt', 'thirdparty_amt', 'p_item',
745        'p_split_data','p_combi', 'provider_amt')
746    form_fields['creation_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
747    form_fields['payment_date'].custom_widget = FriendlyDatetimeDisplayWidget('le')
Note: See TracBrowser for help on using the repository browser.