source: main/waeup.uniben/trunk/src/waeup/uniben/applicants/browser.py @ 16741

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

Return empty list but not None.

  • Property svn:keywords set to Id
File size: 34.6 KB
Line 
1## $Id: browser.py 16684 2021-10-22 11:08:08Z henrik $
2##
3## Copyright (C) 2011 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##
18"""UI components for basic applicants and related components.
19"""
20import grok
21from time import time
22from zope.component import getUtility, createObject
23from zope.formlib.textwidgets import BytesDisplayWidget
24from zope.security import checkPermission
25from zope.i18n import translate
26from hurry.workflow.interfaces import IWorkflowState
27from waeup.kofa.browser.layout import action, UtilityView
28from waeup.kofa.interfaces import IExtFileStore, IKofaUtils
29from waeup.kofa.applicants.browser import (
30    ApplicantRegistrationPage, ApplicantsContainerPage,
31    ApplicationFeePaymentAddPage,
32    OnlinePaymentApprovePage,
33    ExportPDFPageApplicationSlip,
34    ApplicantBaseDisplayFormPage,
35    CheckTranscriptStatus,
36    AdditionalFile,)
37from waeup.kofa.students.interfaces import IStudentsUtils
38from waeup.kofa.applicants.interfaces import (
39    ISpecialApplicant, IApplicantsUtils)
40from waeup.kofa.browser.interfaces import IPDFCreator
41from kofacustom.nigeria.applicants.browser import (
42    NigeriaApplicantDisplayFormPage,
43    NigeriaApplicantManageFormPage,
44    NigeriaApplicantEditFormPage,
45    NigeriaPDFApplicationSlip,
46    NigeriaExportPDFPaymentSlipPage)
47from waeup.uniben.applicants.interfaces import (
48    ICustomApplicant,
49    IUnibenRegistration,
50    ICustomUGApplicant,
51    ICustomPGApplicant,
52    ICustomPGApplicantEdit,
53    ICustomUGApplicantEdit,
54    IPUTMEApplicantEdit,
55    ITranscriptApplicant)
56from waeup.kofa.applicants.workflow import ADMITTED, PAID, STARTED
57from kofacustom.nigeria.applicants.interfaces import (
58    UG_OMIT_DISPLAY_FIELDS,
59    UG_OMIT_PDF_FIELDS,
60    UG_OMIT_MANAGE_FIELDS,
61    UG_OMIT_EDIT_FIELDS,
62    CBT_OMIT_DISPLAY_FIELDS,
63    CBT_OMIT_PDF_FIELDS,
64    CBT_OMIT_MANAGE_FIELDS,
65    CBT_OMIT_EDIT_FIELDS,
66    AFFIL_OMIT_DISPLAY_FIELDS,
67    AFFIL_OMIT_PDF_FIELDS,
68    AFFIL_OMIT_MANAGE_FIELDS,
69    AFFIL_OMIT_EDIT_FIELDS,
70    PG_OMIT_DISPLAY_FIELDS,
71    PG_OMIT_PDF_FIELDS,
72    PG_OMIT_MANAGE_FIELDS,
73    PG_OMIT_EDIT_FIELDS,
74    PUTME_OMIT_DISPLAY_FIELDS,
75    PUTME_OMIT_PDF_FIELDS,
76    PUTME_OMIT_MANAGE_FIELDS,
77    PUTME_OMIT_EDIT_FIELDS,
78    PUTME_OMIT_RESULT_SLIP_FIELDS,
79    PUDE_OMIT_DISPLAY_FIELDS,
80    PUDE_OMIT_PDF_FIELDS,
81    PUDE_OMIT_MANAGE_FIELDS,
82    PUDE_OMIT_EDIT_FIELDS,
83    PUDE_OMIT_RESULT_SLIP_FIELDS,
84    PRE_OMIT_DISPLAY_FIELDS,
85    PRE_OMIT_PDF_FIELDS,
86    PRE_OMIT_MANAGE_FIELDS,
87    PRE_OMIT_EDIT_FIELDS,
88    )
89
90from waeup.uniben.interfaces import MessageFactory as _
91
92PASTQ_ALL = ['ADT','CIT','DEF','DEM','EPCS','ESM','HEK','HSE','VTE']
93
94PASTQ_AL = ['ENL','FAA','FOL','HIS','LAL', 'PHL','THR','BUL','JIL',
95            'LAW','PPL','PUL'] + PASTQ_ALL
96
97PASTQ_BS = ['ANT','ANY','CHH','COH','HAE','MED','MEH','PHS','SUR',
98            'PCG','PCH','PCO', 'PCT','PHA','PHM','PMB','ANA','MBC',
99            'MLS','NSC','PSY','DPV','ODR','OSP','PER', 'RES','AEB',
100            'BCH','BOT','CED','EVL','MCB','OPT','PBB','SLT','ZOO',
101            'AEE','ANS', 'CRS','FIS','FOW','SOS'] + PASTQ_ALL
102
103PASTQ_EPS = ['ARC','CHE','CVE','DMIC','EEE','GEM','MCH','PEE','PRE','CHM',
104             'CSC','GLY','MTH','QSV','PHY','CPE','STR'] + PASTQ_ALL
105
106PASTQ_MSS = ['ACC','BNK','BUS','ECO','ESM','GEO','POL','SAA','SWK',
107             'ACT','ENT','HRM','INS','MKT'] + PASTQ_ALL
108
109REGISTRATION_OMIT_DISPLAY_FIELDS = (
110    'locked',
111    'suspended',
112    )
113
114REGISTRATION_OMIT_EDIT_FIELDS = (
115    'locked',
116    'suspended',
117    'applicant_id',
118    )
119
120REGISTRATION_OMIT_MANAGE_FIELDS = (
121    'applicant_id',
122    )
123
124
125REGISTRATION_OMIT_PDF_FIELDS = (
126    'locked',
127    'suspended',
128    )
129
130PUTME_OMIT_PDF_FIELDS = PUTME_OMIT_PDF_FIELDS + (
131    'fst_sit_results', 'scd_sit_results')
132
133TRANS_OMIT_FIELDS = ('suspended',)
134
135#TRANS_SHORT_OMIT_FIELDS = TRANS_OMIT_FIELDS + (
136#    'date_of_birth',
137#    'sex',
138#    #'nationality',
139#    'entry_mode',
140#    'entry_session',
141#    'end_session',
142#    'course_studied',
143#    'course_changed',
144#    #'change_level',
145#    )
146
147TRANS_SHORT_OMIT_FIELDS = TRANS_OMIT_FIELDS
148
149TRANS_OMIT_EDIT_FIELDS = TRANS_OMIT_FIELDS + ('applicant_id', )
150
151TRANS_SHORT_OMIT_EDIT_FIELDS = TRANS_SHORT_OMIT_FIELDS + ('applicant_id', )
152
153TRANS_OMIT_PDF_FIELDS = TRANS_OMIT_FIELDS + ('locked', )
154
155TRANS_SHORT_OMIT_PDF_FIELDS = TRANS_SHORT_OMIT_FIELDS + ('locked', )
156
157class CustomApplicantsContainerPage(ApplicantsContainerPage):
158    """The standard view for regular applicant containers.
159    """
160
161    @property
162    def form_fields(self):
163        form_fields = super(CustomApplicantsContainerPage, self).form_fields
164        usertype = getattr(self.request.principal, 'user_type', None)
165        if self.request.principal.id == 'zope.anybody' or  \
166            usertype in ('applicant', 'student'):
167            return form_fields.omit('application_fee')
168        return form_fields
169
170class CustomApplicantRegistrationPage(ApplicantRegistrationPage):
171    """Captcha'd registration page for applicants.
172    """
173
174    def _redirect(self, email, password, applicant_id):
175        # Forward email and credentials to landing page.
176        self.redirect(self.url(self.context, 'registration_complete',
177            data = dict(email=email, password=password,
178            applicant_id=applicant_id)))
179        return
180
181    @property
182    def label(self):
183        if self.context.prefix.startswith('tsc'):
184            return _('Request for ${a}',
185                mapping = {'a':self.context.title})
186        return _('Apply for ${a}',
187            mapping = {'a':self.context.title})
188
189class CustomApplicantDisplayFormPage(NigeriaApplicantDisplayFormPage):
190    """A display view for applicant data.
191    """
192    grok.template('applicantdisplaypage')
193
194    @property
195    def display_payments(self):
196        if self.context.special or self.target == 'ictwk':
197            return True
198        return getattr(self.context.__parent__, 'application_fee', None)
199
200    def _show_pastq_putme(self):
201        return self.target.startswith('pre') \
202               and self.context.state in ('paid', 'submitted') \
203               and getattr(self.context, 'course1') is not None
204        # return False
205
206    @property
207    def depcode(self):
208        try:
209            code = self.context.course1.__parent__.__parent__.code
210            return code
211        except:
212            return
213
214    @property
215    def show_pastq_al(self):
216        return self._show_pastq_putme() # and self.depcode in PASTQ_AL
217
218    @property
219    def show_pastq_bs(self):
220        return self._show_pastq_putme() # and self.depcode in PASTQ_BS
221
222    @property
223    def show_pastq_eps(self):
224        return self._show_pastq_putme() # and self.depcode in PASTQ_EPS
225
226    @property
227    def show_pastq_mss(self):
228        return self._show_pastq_putme() # and self.depcode in PASTQ_MSS
229
230    @property
231    def show_pastq_pude(self):
232        return self.target.startswith('pude') \
233               and self.context.state in ('paid', 'submitted')
234
235    @property
236    def label(self):
237        if self.target == 'ictwk':
238            container_title = self.context.__parent__.title
239            return _('${a} <br /> Registration Record ${b}', mapping = {
240                'a':container_title, 'b':self.context.application_number})
241        return super(CustomApplicantDisplayFormPage, self).label
242
243    @property
244    def form_fields(self):
245        if self.target is not None and self.target == 'tscf':
246            form_fields = grok.AutoFields(ITranscriptApplicant)
247            for field in TRANS_OMIT_FIELDS:
248                form_fields = form_fields.omit(field)
249            form_fields['dispatch_address'].custom_widget = BytesDisplayWidget
250            #form_fields['perm_address'].custom_widget = BytesDisplayWidget
251            return form_fields
252        if self.target is not None and self.target == 'tscs':
253            form_fields = grok.AutoFields(ITranscriptApplicant)
254            for field in TRANS_SHORT_OMIT_FIELDS:
255                form_fields = form_fields.omit(field)
256            form_fields['dispatch_address'].custom_widget = BytesDisplayWidget
257            #form_fields['perm_address'].custom_widget = BytesDisplayWidget
258            return form_fields
259        if self.target == 'ictwk':
260            form_fields = grok.AutoFields(IUnibenRegistration)
261            for field in REGISTRATION_OMIT_DISPLAY_FIELDS:
262                form_fields = form_fields.omit(field)
263            return form_fields
264        elif self.target is not None and self.target.startswith('pg'):
265            form_fields = grok.AutoFields(ICustomPGApplicant)
266            for field in PG_OMIT_DISPLAY_FIELDS:
267                form_fields = form_fields.omit(field)
268        elif self.target is not None and self.target.startswith('pre'):
269            form_fields = grok.AutoFields(ICustomPGApplicant)
270            for field in PRE_OMIT_DISPLAY_FIELDS:
271                form_fields = form_fields.omit(field)
272        elif self.target is not None and self.target.startswith('cbt'):
273            form_fields = grok.AutoFields(ICustomUGApplicant)
274            for field in CBT_OMIT_DISPLAY_FIELDS:
275                form_fields = form_fields.omit(field)
276        elif self.target is not None and self.target.startswith('akj'):
277            form_fields = grok.AutoFields(ICustomPGApplicant)
278            for field in PRE_OMIT_DISPLAY_FIELDS:
279                form_fields = form_fields.omit(field)
280        elif self.target is not None and self.target.startswith('ak'):
281            form_fields = grok.AutoFields(ICustomUGApplicant)
282            for field in AFFIL_OMIT_DISPLAY_FIELDS:
283                form_fields = form_fields.omit(field)
284        elif self.target is not None and self.target.startswith('ase'): # was putme
285            form_fields = grok.AutoFields(ICustomUGApplicant)
286            for field in PUTME_OMIT_DISPLAY_FIELDS:
287                form_fields = form_fields.omit(field)
288        elif self.target is not None and self.target.startswith('pude'):
289            form_fields = grok.AutoFields(ICustomUGApplicant)
290            for field in PUDE_OMIT_DISPLAY_FIELDS:
291                form_fields = form_fields.omit(field)
292        else:
293            form_fields = grok.AutoFields(ICustomUGApplicant)
294            for field in UG_OMIT_DISPLAY_FIELDS:
295                form_fields = form_fields.omit(field)
296        #form_fields['perm_address'].custom_widget = BytesDisplayWidget
297        form_fields['notice'].custom_widget = BytesDisplayWidget
298        if not getattr(self.context, 'student_id'):
299            form_fields = form_fields.omit('student_id')
300        if not getattr(self.context, 'screening_score'):
301            form_fields = form_fields.omit('screening_score')
302        if not getattr(self.context, 'screening_venue') or self._not_paid():
303            form_fields = form_fields.omit('screening_venue')
304        if not getattr(self.context, 'screening_date') or self._not_paid():
305            form_fields = form_fields.omit('screening_date')
306        if not self.context.admchecking_fee_paid():
307            form_fields = form_fields.omit(
308                'screening_score', 'aggregate', 'student_id')
309        return form_fields
310
311    @property
312    def display_actions(self):
313        state = IWorkflowState(self.context).getState()
314        actions = []
315        if state == ADMITTED and not self.context.admchecking_fee_paid():
316            actions = [_('Add admission checking payment ticket')]
317        return actions
318
319
320    def getCourseAdmitted(self):
321        """Return link, title and code in html format to the certificate
322           admitted.
323        """
324        if self.admission_checking_info:
325            return '<span class="hint">%s</span>' % self.admission_checking_info
326        return super(CustomApplicantDisplayFormPage, self).getCourseAdmitted()
327
328    @property
329    def admission_checking_info(self):
330        if self.context.state == ADMITTED and \
331            not self.context.admchecking_fee_paid():
332            return _('You must pay the admission checking fee '
333                     'to view your screening results and your course admitted.')
334        return
335
336    @action(_('Add admission checking payment ticket'), style='primary')
337    def addPaymentTicket(self, **data):
338        self.redirect(self.url(self.context, '@@addacp'))
339        return
340
341class CustomApplicationFeePaymentAddPage(ApplicationFeePaymentAddPage):
342    """ Page to add an online payment ticket
343    """
344
345    @property
346    def custom_requirements(self):
347        if self.context.__parent__.with_picture:
348            store = getUtility(IExtFileStore)
349            if self.context.__parent__.picture_editable \
350                and not store.getFileByContext(self.context, attr=u'passport.jpg'):
351                return _('Upload your 1"x1" Red background passport photo before making payment.')
352        return ''
353
354class AdmissionCheckingFeePaymentAddPage(UtilityView, grok.View):
355    """ Page to add an admission checking online payment ticket.
356    """
357    grok.context(ICustomApplicant)
358    grok.name('addacp')
359    grok.require('waeup.payApplicant')
360    factory = u'waeup.ApplicantOnlinePayment'
361
362    def _setPaymentDetails(self, payment):
363        container = self.context.__parent__
364        timestamp = ("%d" % int(time()*10000))[1:]
365        session = str(container.year)
366        try:
367            session_config = grok.getSite()['configuration'][session]
368        except KeyError:
369            return _(u'Session configuration object is not available.'), None
370        payment.p_id = "p%s" % timestamp
371        payment.p_item = container.title
372        payment.p_session = container.year
373        payment.amount_auth = 0.0
374        payment.p_category = 'admission_checking'
375        payment.amount_auth = session_config.admchecking_fee
376        if payment.amount_auth in (0.0, None):
377            return _('Amount could not be determined.'), None
378        return
379
380    def update(self):
381        if self.context.admchecking_fee_paid():
382              self.flash(
383                  _('Admission checking payment has already been made.'),
384                  type='warning')
385              self.redirect(self.url(self.context))
386              return
387        payment = createObject(self.factory)
388        failure = self._setPaymentDetails(payment)
389        if failure is not None:
390            self.flash(failure[0], type='danger')
391            self.redirect(self.url(self.context))
392            return
393        self.context[payment.p_id] = payment
394        self.flash(_('Payment ticket created.'))
395        self.redirect(self.url(payment))
396        return
397
398    def render(self):
399        return
400
401
402class CustomApplicantManageFormPage(NigeriaApplicantManageFormPage):
403
404    @property
405    def display_payments(self):
406        if self.context.special or self.target == 'ictwk':
407            return True
408        return getattr(self.context.__parent__, 'application_fee', None)
409
410    @property
411    def custom_upload_requirements(self):
412        if not checkPermission('waeup.uploadPassportPictures', self.context):
413            return _('You are not entitled to upload passport pictures.')
414
415    def display_fileupload(self, filename):
416        if filename[1] == 'res_stat' \
417            and self.target is not None \
418            and not self.target.startswith('tsc'):
419            return False
420        if filename[1] == 'eligibility' \
421            and self.target is not None \
422            and not self.target.startswith('tsc'):
423            return False
424        return True
425
426    @property
427    def label(self):
428        if self.target == 'ictwk':
429            container_title = self.context.__parent__.title
430            return _('${a} <br /> Registration Record ${b}', mapping = {
431                'a':container_title, 'b':self.context.application_number})
432        return super(CustomApplicantManageFormPage, self).label
433
434    @property
435    def form_fields(self):
436        if self.target is not None and self.target == 'tscf':
437            form_fields = grok.AutoFields(ITranscriptApplicant)
438            for field in TRANS_OMIT_EDIT_FIELDS:
439                form_fields = form_fields.omit(field)
440            return form_fields
441        if self.target is not None and self.target == 'tscs':
442            form_fields = grok.AutoFields(ITranscriptApplicant)
443            for field in TRANS_SHORT_OMIT_EDIT_FIELDS:
444                form_fields = form_fields.omit(field)
445            return form_fields
446        if self.target == 'ictwk':
447            form_fields = grok.AutoFields(IUnibenRegistration)
448            for field in REGISTRATION_OMIT_MANAGE_FIELDS:
449                form_fields = form_fields.omit(field)
450            state = IWorkflowState(self.context).getState()
451            if state != STARTED:
452                form_fields['registration_cats'].for_display = True
453            return form_fields
454        if self.target is not None and self.target.startswith('pg'):
455            form_fields = grok.AutoFields(ICustomPGApplicant)
456            for field in PG_OMIT_MANAGE_FIELDS:
457                form_fields = form_fields.omit(field)
458        elif self.target is not None and self.target.startswith('pre'):
459            form_fields = grok.AutoFields(ICustomPGApplicant)
460            for field in PRE_OMIT_MANAGE_FIELDS:
461                form_fields = form_fields.omit(field)
462        elif self.target is not None and self.target.startswith('cbt'):
463            form_fields = grok.AutoFields(ICustomUGApplicant)
464            for field in CBT_OMIT_MANAGE_FIELDS:
465                form_fields = form_fields.omit(field)
466        elif self.target is not None and self.target.startswith('akj'):
467            form_fields = grok.AutoFields(ICustomPGApplicant)
468            for field in PRE_OMIT_MANAGE_FIELDS:
469                form_fields = form_fields.omit(field)
470        elif self.target is not None and self.target.startswith('ak'):
471            form_fields = grok.AutoFields(ICustomUGApplicant)
472            for field in AFFIL_OMIT_MANAGE_FIELDS:
473                form_fields = form_fields.omit(field)
474        elif self.target is not None and self.target.startswith('ase'): # was putme
475            form_fields = grok.AutoFields(ICustomUGApplicant)
476            for field in PUTME_OMIT_MANAGE_FIELDS:
477                form_fields = form_fields.omit(field)
478        elif self.target is not None and self.target.startswith('pude'):
479            form_fields = grok.AutoFields(ICustomUGApplicant)
480            for field in PUDE_OMIT_MANAGE_FIELDS:
481                form_fields = form_fields.omit(field)
482        else:
483            form_fields = grok.AutoFields(ICustomUGApplicant)
484            for field in UG_OMIT_MANAGE_FIELDS:
485                form_fields = form_fields.omit(field)
486        form_fields['student_id'].for_display = True
487        form_fields['applicant_id'].for_display = True
488        return form_fields
489
490
491class CustomApplicantEditFormPage(NigeriaApplicantEditFormPage):
492    """An applicant-centered edit view for applicant data.
493    """
494
495    def unremovable(self, ticket):
496        return True
497
498    @property
499    def display_payments(self):
500        if self.context.special or self.target == 'ictwk':
501            return True
502        return getattr(self.context.__parent__, 'application_fee', None)
503
504    @property
505    def form_fields(self):
506        if self.target is not None and self.target == 'tscf':
507            form_fields = grok.AutoFields(ITranscriptApplicant)
508            form_fields['courier_tno'].for_display = True
509            form_fields['proc_date'].for_display = True
510            for field in TRANS_OMIT_EDIT_FIELDS:
511                form_fields = form_fields.omit(field)
512                form_fields = form_fields.omit('locked')
513            return form_fields
514        if self.target is not None and self.target == 'tscs':
515            form_fields = grok.AutoFields(ITranscriptApplicant)
516            form_fields['courier_tno'].for_display = True
517            form_fields['proc_date'].for_display = True
518            for field in TRANS_SHORT_OMIT_EDIT_FIELDS:
519                form_fields = form_fields.omit(field)
520                form_fields = form_fields.omit('locked')
521            return form_fields
522        if self.target == 'ictwk':
523            form_fields = grok.AutoFields(IUnibenRegistration)
524            for field in REGISTRATION_OMIT_EDIT_FIELDS:
525                form_fields = form_fields.omit(field)
526            state = IWorkflowState(self.context).getState()
527            if state != STARTED:
528                form_fields['registration_cats'].for_display = True
529            return form_fields
530        if self.target is not None and self.target.startswith('pg'):
531            form_fields = grok.AutoFields(ICustomPGApplicantEdit)
532            for field in PG_OMIT_EDIT_FIELDS:
533                form_fields = form_fields.omit(field)
534        elif self.target is not None and self.target.startswith('pre'):
535            form_fields = grok.AutoFields(ICustomPGApplicantEdit)
536            for field in PRE_OMIT_EDIT_FIELDS:
537                form_fields = form_fields.omit(field)
538        elif self.target is not None and self.target.startswith('cbt'):
539            form_fields = grok.AutoFields(ICustomUGApplicantEdit)
540            for field in CBT_OMIT_EDIT_FIELDS:
541                form_fields = form_fields.omit(field)
542        elif self.target is not None and self.target.startswith('akj'):
543            form_fields = grok.AutoFields(ICustomPGApplicant)
544            for field in PRE_OMIT_EDIT_FIELDS:
545                form_fields = form_fields.omit(field)
546        elif self.target is not None and self.target.startswith('ak'):
547            form_fields = grok.AutoFields(ICustomUGApplicantEdit)
548            for field in AFFIL_OMIT_EDIT_FIELDS:
549                form_fields = form_fields.omit(field)
550        elif self.target is not None and self.target.startswith('ase'): # was putme
551            form_fields = grok.AutoFields(IPUTMEApplicantEdit)
552            for field in PUTME_OMIT_EDIT_FIELDS:
553                form_fields = form_fields.omit(field)
554        elif self.target is not None and self.target.startswith('pude'):
555            form_fields = grok.AutoFields(ICustomUGApplicantEdit)
556            for field in PUDE_OMIT_EDIT_FIELDS:
557                form_fields = form_fields.omit(field)
558        else:
559            form_fields = grok.AutoFields(ICustomUGApplicantEdit)
560            for field in UG_OMIT_EDIT_FIELDS:
561                form_fields = form_fields.omit(field)
562        form_fields['applicant_id'].for_display = True
563        form_fields['reg_number'].for_display = True
564        return form_fields
565
566    @property
567    def label(self):
568        if self.target == 'ictwk':
569            container_title = self.context.__parent__.title
570            return _('${a} <br /> Registration Record ${b}', mapping = {
571                'a':container_title, 'b':self.context.application_number})
572        return super(CustomApplicantEditFormPage, self).label
573
574    def display_fileupload(self, filename):
575        if filename[1] == 'res_stat' \
576            and self.target is not None \
577            and not self.target.startswith('tsc'):
578            return False
579        if filename[1] == 'eligibility' \
580            and self.target is not None \
581            and not self.target.startswith('tsc'):
582            return False
583        return True
584
585    def dataNotComplete(self, data):
586        store = getUtility(IExtFileStore)
587        if self.context.__parent__.with_picture \
588            and self.context.__parent__.picture_editable:
589            store = getUtility(IExtFileStore)
590            if not store.getFileByContext(self.context, attr=u'passport.jpg'):
591                return _('No passport picture uploaded.')
592        if self.target is not None \
593            and self.target.startswith('tscf') \
594            and not store.getFileByContext(self.context, attr=u'res_stat.pdf'):
595            return _('No statement of result pdf file uploaded.')
596        #if self.target is not None \
597        #    and self.target.startswith('tsc') \
598        #    and not store.getFileByContext(self.context, attr=u'eligibility.pdf'):
599        #    return _('No eligibility form pdf file uploaded.')
600        return False
601
602class CustomOnlinePaymentApprovePage(OnlinePaymentApprovePage):
603    """ Approval view
604    """
605
606    def update(self):
607        if self.context.p_category == 'admission_checking':
608            if self.context.p_state == 'paid':
609                flashtype = 'warning'
610                msg = _('This ticket has already been paid.')
611                log = None
612            else:
613                self.context.approve()
614                log = 'payment approved: %s' % self.context.p_id
615                msg = _('Payment approved')
616                flashtype = 'success'
617        else:
618            flashtype, msg, log = self.context.approveApplicantPayment()
619        if log is not None:
620            applicant = self.context.__parent__
621            # Add log message to applicants.log
622            applicant.writeLogMessage(self, log)
623            # Add log message to payments.log
624            self.context.logger.info(
625                '%s,%s,%s,%s,%s,,,,,,' % (
626                applicant.applicant_id,
627                self.context.p_id, self.context.p_category,
628                self.context.amount_auth, self.context.r_code))
629        self.flash(msg, type=flashtype)
630        return
631
632class CustomExportPDFPageApplicationSlip(ExportPDFPageApplicationSlip):
633    """Deliver a PDF slip of the context.
634    """
635
636    def update(self):
637        super(CustomExportPDFPageApplicationSlip, self).update()
638        if self.context.state == ADMITTED and \
639            not self.context.admchecking_fee_paid():
640            self.flash(
641                _('Please pay admission checking fee before trying to download '
642                  'the application slip.'), type='warning')
643            return self.redirect(self.url(self.context))
644        return
645
646class CustomPDFApplicationSlip(NigeriaPDFApplicationSlip):
647
648    def _getPDFCreator(self):
649        if self.target.startswith('ak'):
650            return getUtility(IPDFCreator, name='akoka_pdfcreator')
651        return getUtility(IPDFCreator)
652
653    @property
654    def form_fields(self):
655        if self.target is not None and self.target == 'tscf':
656            form_fields = grok.AutoFields(ITranscriptApplicant)
657            for field in TRANS_OMIT_PDF_FIELDS:
658                form_fields = form_fields.omit(field)
659        elif self.target is not None and self.target == 'tscs':
660            form_fields = grok.AutoFields(ITranscriptApplicant)
661            for field in TRANS_SHORT_OMIT_PDF_FIELDS:
662                form_fields = form_fields.omit(field)
663        elif self.target is not None and self.target == 'ictwk':
664            form_fields = grok.AutoFields(IUnibenRegistration)
665            for field in REGISTRATION_OMIT_PDF_FIELDS:
666                form_fields = form_fields.omit(field)
667        elif self.target is not None and self.target.startswith('pg'):
668            form_fields = grok.AutoFields(ICustomPGApplicant)
669            for field in PG_OMIT_PDF_FIELDS:
670                form_fields = form_fields.omit(field)
671        elif self.target is not None and self.target.startswith('pre'):
672            form_fields = grok.AutoFields(ICustomPGApplicant)
673            for field in PRE_OMIT_PDF_FIELDS:
674                form_fields = form_fields.omit(field)
675        elif self.target is not None and self.target.startswith('cbt'): # uniben
676            form_fields = grok.AutoFields(ICustomUGApplicant)
677            for field in CBT_OMIT_PDF_FIELDS:
678                form_fields = form_fields.omit(field)
679        elif self.target is not None and self.target.startswith('akj'): # uniben
680            form_fields = grok.AutoFields(ICustomPGApplicant)
681            for field in PRE_OMIT_PDF_FIELDS:
682                form_fields = form_fields.omit(field)
683        elif self.target is not None and self.target.startswith('ak'): # uniben
684            form_fields = grok.AutoFields(ICustomUGApplicant)
685            for field in AFFIL_OMIT_PDF_FIELDS:
686                form_fields = form_fields.omit(field)
687        elif self.target is not None and self.target.startswith('ase'): # was putme
688            form_fields = grok.AutoFields(ICustomUGApplicant)
689            if self._reduced_slip():
690                for field in PUTME_OMIT_RESULT_SLIP_FIELDS:
691                    form_fields = form_fields.omit(field)
692            else:
693                for field in PUTME_OMIT_PDF_FIELDS:
694                    form_fields = form_fields.omit(field)
695        elif self.target is not None and self.target.startswith('pude'):
696            form_fields = grok.AutoFields(ICustomUGApplicant)
697            if self._reduced_slip():
698                for field in PUDE_OMIT_RESULT_SLIP_FIELDS:
699                    form_fields = form_fields.omit(field)
700            else:
701                for field in PUDE_OMIT_PDF_FIELDS:
702                    form_fields = form_fields.omit(field)
703        else:
704            form_fields = grok.AutoFields(ICustomUGApplicant)
705            for field in UG_OMIT_PDF_FIELDS:
706                form_fields = form_fields.omit(field)
707        if not getattr(self.context, 'student_id'):
708            form_fields = form_fields.omit('student_id')
709        if not getattr(self.context, 'screening_score'):
710            form_fields = form_fields.omit('screening_score')
711        if not getattr(self.context, 'screening_venue'):
712            form_fields = form_fields.omit('screening_venue')
713        if not getattr(self.context, 'screening_date'):
714            form_fields = form_fields.omit('screening_date')
715        return form_fields
716
717    @property
718    def title(self):
719        container_title = self.context.__parent__.title
720        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
721        ar_translation = translate(_('Application Record'),
722            'waeup.kofa', target_language=portal_language)
723        if self.target == 'ictwk':
724            return '%s - Registration Record %s' % (container_title,
725            self.context.application_number)
726        elif self.target.startswith('ab'):
727            return 'Federal College of Education (Technical) Asaba - %s %s %s' % (
728                container_title, ar_translation,
729                self.context.application_number)
730        elif self.target.startswith('ak'):
731            return 'Federal College of Education (Technical) Akoka - %s - %s %s' % (
732                container_title, ar_translation,
733                self.context.application_number)
734        elif self.target == 'pgn':
735            return 'National Institute for Legislative Studies (NILS) - %s %s %s' % (
736                container_title, ar_translation,
737                self.context.application_number)
738        return '%s - %s %s' % (container_title,
739            ar_translation, self.context.application_number)
740
741class CustomApplicantBaseDisplayFormPage(ApplicantBaseDisplayFormPage):
742
743    @property
744    def form_fields(self):
745        target = getattr(self.context.__parent__, 'prefix', None)
746        if target.startswith('tsc'):
747            form_fields = grok.AutoFields(ICustomApplicant).select(
748                'applicant_id', 'email', 'dispatch_address')
749        else:
750            form_fields = grok.AutoFields(ICustomApplicant).select(
751                'applicant_id', 'reg_number', 'email', 'course1')
752        if self.context.__parent__.prefix in ('special',):
753            form_fields['reg_number'].field.title = u'Identification Number'
754            return form_fields
755        return form_fields
756
757class CustomExportPDFPaymentSlipPage(NigeriaExportPDFPaymentSlipPage):
758    """Deliver a PDF slip of the context.
759    """
760
761    @property
762    def omit_fields(self):
763        target = getattr(self.context.__parent__.__parent__, 'prefix', None)
764        if target.startswith('tsc'):
765            return ('date_of_birth', 'course1')
766        return ()
767
768    @property
769    def note(self):
770        return
771
772    def render(self):
773        if self.payment_slip_download_warning:
774            self.flash(self.payment_slip_download_warning, type='danger')
775            self.redirect(self.url(self.context))
776            return
777        applicantview = CustomApplicantBaseDisplayFormPage(self.context.__parent__,
778            self.request)
779        students_utils = getUtility(IStudentsUtils)
780        return students_utils.renderPDF(self,'payment_slip.pdf',
781            self.context.__parent__, applicantview,
782            note=self.note, omit_fields=self.omit_fields)
783
784class ExportScreeningInvitationSlip(UtilityView, grok.View):
785    """Deliver a PDF slip of the context.
786    """
787    grok.context(ICustomApplicant)
788    grok.name('screening_invitation_slip.pdf')
789    grok.require('waeup.viewApplication')
790    form_fields = None
791    label = u'Invitation Letter for Pre-Admission Screening'
792
793
794    @property
795    def note(self):
796        notice = getattr(self.context.__parent__, 'application_slip_notice')
797        if notice is None:
798            notice = ''
799        if self.context.screening_date:
800            return """
801<br /><br /><br /><br /><font size='12'>
802Dear %s,
803<br /><br /><br />
804You are invited for your Uniben Admission Screening Exercise on:
805<br /><br />
806<strong>%s</strong>.
807<br /><br />
808Please bring along this letter of invitation to the
809<br /><br />
810<strong>%s</strong>
811<br /><br />
812on your screening date.
813<br /><br /><br />
814Signed,
815<br /><br />
816The Registrar<br />
817<br /><br />
818<br /><br />
819%s
820</font>
821
822""" % (self.context.display_fullname, self.context.screening_date,
823       self.context.screening_venue, notice)
824        return
825
826    def update(self):
827        if not self.context.screening_date:
828            self.flash(_('Forbidden'), type="warning")
829            self.redirect(self.url(self.context))
830
831    def render(self):
832        applicantview = ApplicantBaseDisplayFormPage(self.context, self.request)
833        students_utils = getUtility(IStudentsUtils)
834        return students_utils.renderPDF(self,'screening_invitation_slip.pdf',
835            self.context, applicantview, note=self.note)
836
837class CustomCheckTranscriptStatus(CheckTranscriptStatus):
838    """A display page for checking transcript processing status.
839    """
840    websites = (('Uniben Alumni Portal', 'https://alumni.uniben.edu/'),
841                ('Uniben Student Portal', 'https://waeup.uniben.edu/'),)
842    appl_url1 = 'https://alumni.uniben.edu/applicants/tscf1/register'
843    appl_url2 = 'https://alumni.uniben.edu/applicants/tscs1/register'
844
845class CreateGraduatedPage(UtilityView, grok.View):
846    """Create a student object from transcript application data.
847    """
848    grok.context(ICustomApplicant)
849    grok.name('creategraduated')
850    grok.require('waeup.createStudents')
851
852    def update(self):
853        success, msg = self.context.createStudent(view=self, graduated=True)
854        if success:
855            self.flash(msg)
856        else:
857            self.flash(msg, type='warning')
858        self.redirect(self.url(self.context))
859        return
860
861    def render(self):
862        return
863
864class ResultStatement(AdditionalFile):
865    grok.name('res_stat')
866
867class EligibilityForm(AdditionalFile):
868    grok.name('eligibility')
Note: See TracBrowser for help on using the repository browser.