source: main/kofacustom.edocons/trunk/src/kofacustom/edocons/applicants/browser.py @ 17095

Last change on this file since 17095 was 17095, checked in by Henrik Bettermann, 2 years ago

Customize transcript application form.

  • Property svn:keywords set to Id
File size: 11.0 KB
Line 
1## $Id: browser.py 17095 2022-09-14 08:18:48Z 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 zope.component import getUtility
22from zope.i18n import translate
23from waeup.kofa.interfaces import IExtFileStore, IKofaUtils
24from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
25from zope.formlib.textwidgets import BytesDisplayWidget
26from waeup.kofa.students.interfaces import IStudentsUtils
27from waeup.kofa.applicants.browser import (ApplicantDisplayFormPage,
28    ApplicantManageFormPage, ApplicantEditFormPage,
29    ApplicantRegistrationPage,
30    OnlinePaymentDisplayFormPage,
31    OnlinePaymentBreadcrumb, ExportPDFPaymentSlipPage,
32    AdditionalFile
33    )
34from waeup.kofa.applicants.viewlets import (
35    PDFActionButton, PaymentReceiptActionButton)
36from waeup.kofa.applicants.pdf import PDFApplicationSlip
37from kofacustom.nigeria.applicants.browser import (
38    NigeriaApplicantDisplayFormPage,
39    NigeriaApplicantManageFormPage,
40    NigeriaApplicantEditFormPage,
41    NigeriaPDFApplicationSlip)
42from kofacustom.nigeria.applicants.interfaces import (
43    INigeriaPGApplicant, INigeriaUGApplicant,
44    INigeriaPGApplicantEdit, INigeriaUGApplicantEdit,
45    INigeriaApplicantOnlinePayment,
46    #UG_OMIT_DISPLAY_FIELDS,
47    #UG_OMIT_PDF_FIELDS,
48    #UG_OMIT_MANAGE_FIELDS,
49    #UG_OMIT_EDIT_FIELDS,
50    PG_OMIT_DISPLAY_FIELDS,
51    PG_OMIT_PDF_FIELDS,
52    PG_OMIT_MANAGE_FIELDS,
53    PG_OMIT_EDIT_FIELDS,
54    )
55from kofacustom.edocons.applicants.interfaces import (
56    ICustomPGApplicant, ICustomUGApplicant, ICustomApplicant,
57    ICustomPGApplicantEdit, ICustomUGApplicantEdit,
58    ICustomApplicantOnlinePayment, ITranscriptApplicant,
59    )
60from kofacustom.nigeria.interfaces import MessageFactory as _
61
62# Fields to be omitted in all display forms. course_admitted is
63# rendered separately.
64
65OMIT_DISPLAY_FIELDS = ('locked', 'course_admitted',
66    'result_uploaded', 'suspended', 'special_application',
67    'bank_account_number',
68    'bank_account_name',
69    'bank_name',
70    #'course1', 'course2' # these 2 have been added and later removed again
71    )
72
73# UG students are all undergraduate students.
74UG_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + (
75    'jamb_subjects_list', 'programme_type')
76UG_OMIT_PDF_FIELDS = UG_OMIT_DISPLAY_FIELDS + ('phone',)
77UG_OMIT_MANAGE_FIELDS = (
78    'special_application',
79    'jamb_subjects_list',
80    'programme_type',
81    #'course1', 'course2', # these 2 have been added and later removed again
82    )
83UG_OMIT_EDIT_FIELDS = UG_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + (
84    'student_id',
85    'notice',
86    'screening_score',
87    'screening_venue',
88    'screening_date',
89    'cbt_score',
90    'cbt_venue',
91    'cbt_date',
92    'jamb_age',
93    'jamb_subjects',
94    'jamb_score',
95    'jamb_reg_number',
96    'aggregate')
97
98TSC_OMIT_FIELDS = ('locked', 'suspended',
99    )
100   
101
102TSC_OMIT_EDIT_FIELDS = TSC_OMIT_FIELDS + (
103    'applicant_id',
104    'proc_date',
105    'courier_tno',
106    )
107
108TSC_OMIT_MANAGE_FIELDS = TSC_OMIT_FIELDS + (
109    'applicant_id',)     
110
111class CustomApplicantDisplayFormPage(NigeriaApplicantDisplayFormPage):
112    """A display view for applicant data.
113    """
114
115    @property
116    def form_fields(self):
117        if self.target is not None and self.target.startswith('pg'):
118            form_fields = grok.AutoFields(ICustomPGApplicant)
119            for field in PG_OMIT_DISPLAY_FIELDS:
120                form_fields = form_fields.omit(field)
121        elif self.target is not None and self.target.startswith('tsc'):
122            form_fields = grok.AutoFields(ITranscriptApplicant)
123            for field in TSC_OMIT_FIELDS:
124                form_fields = form_fields.omit(field)           
125            return form_fields
126        else:
127            form_fields = grok.AutoFields(ICustomUGApplicant)
128            for field in UG_OMIT_DISPLAY_FIELDS:
129                form_fields = form_fields.omit(field)
130            form_fields['notice'].custom_widget = BytesDisplayWidget
131        #form_fields['perm_address'].custom_widget = BytesDisplayWidget
132        if not getattr(self.context, 'student_id'):
133            form_fields = form_fields.omit('student_id')
134        if not getattr(self.context, 'screening_score'):
135            form_fields = form_fields.omit('screening_score')
136        if not getattr(self.context, 'screening_venue') or self._not_paid():
137            form_fields = form_fields.omit('screening_venue')
138        if not getattr(self.context, 'screening_date') or self._not_paid():
139            form_fields = form_fields.omit('screening_date')
140        if not getattr(self.context, 'cbt_score'):
141            form_fields = form_fields.omit('cbt_score')
142        if not getattr(self.context, 'cbt_venue') or self._not_paid():
143            form_fields = form_fields.omit('cbt_venue')
144        if not getattr(self.context, 'cbt_date') or self._not_paid():
145            form_fields = form_fields.omit('cbt_date')
146        return form_fields
147
148class CustomPDFApplicationSlip(NigeriaPDFApplicationSlip):
149
150    @property
151    def form_fields(self):
152        if self.target is not None and self.target.startswith('pg'):
153            form_fields = grok.AutoFields(ICustomPGApplicant)
154            for field in PG_OMIT_PDF_FIELDS:
155                form_fields = form_fields.omit(field)
156        elif self.target is not None and self.target.startswith('tsc'):
157            form_fields = grok.AutoFields(ITranscriptApplicant)
158            for field in TSC_OMIT_FIELDS:
159                form_fields = form_fields.omit(field)             
160            return form_fields
161        else:
162            form_fields = grok.AutoFields(ICustomUGApplicant)
163            for field in UG_OMIT_PDF_FIELDS:
164                form_fields = form_fields.omit(field)
165        if not getattr(self.context, 'student_id'):
166            form_fields = form_fields.omit('student_id')
167        if not getattr(self.context, 'screening_score'):
168            form_fields = form_fields.omit('screening_score')
169        if not getattr(self.context, 'screening_venue'):
170            form_fields = form_fields.omit('screening_venue')
171        if not getattr(self.context, 'screening_date'):
172            form_fields = form_fields.omit('screening_date')
173        if not getattr(self.context, 'cbt_score'):
174            form_fields = form_fields.omit('cbt_score')
175        if not getattr(self.context, 'cbt_venue'):
176            form_fields = form_fields.omit('cbt_venue')
177        if not getattr(self.context, 'cbt_date'):
178            form_fields = form_fields.omit('cbt_date')
179        return form_fields
180
181class CustomApplicantManageFormPage(NigeriaApplicantManageFormPage):
182    """A full edit view for applicant data.
183    """
184
185    def display_fileupload(self, filename):
186        if filename[1] == 'res_stat' \
187            and self.target is not None \
188            and not self.target.startswith('tsc'):
189            return False
190        if filename[1] == 'testimonial' \
191            and self.target is not None \
192            and not self.target.startswith('tsc'):
193            return False
194        return True
195
196    @property
197    def form_fields(self):
198        if self.target is not None and self.target.startswith('pg'):
199            form_fields = grok.AutoFields(ICustomPGApplicant)
200            for field in PG_OMIT_MANAGE_FIELDS:
201                form_fields = form_fields.omit(field)
202        elif self.target is not None and self.target.startswith('tsc'):
203            form_fields = grok.AutoFields(ITranscriptApplicant)
204            for field in TSC_OMIT_MANAGE_FIELDS:
205                form_fields = form_fields.omit(field)             
206            return form_fields
207        else:
208            form_fields = grok.AutoFields(ICustomUGApplicant)
209            for field in UG_OMIT_MANAGE_FIELDS:
210                form_fields = form_fields.omit(field)
211        form_fields['student_id'].for_display = True
212        form_fields['applicant_id'].for_display = True
213        return form_fields
214
215class CustomApplicantEditFormPage(NigeriaApplicantEditFormPage):
216    """An applicant-centered edit view for applicant data.
217    """
218
219    def unremovable(self, ticket):
220        return True
221
222    def display_fileupload(self, filename):
223        if filename[1] == 'res_stat' \
224            and self.target is not None \
225            and not self.target.startswith('tsc'):
226            return False
227        if filename[1] == 'testimonial' \
228            and self.target is not None \
229            and not self.target.startswith('tsc'):
230            return False
231        return True
232
233    @property
234    def form_fields(self):
235        if self.target is not None and self.target.startswith('pg'):
236            form_fields = grok.AutoFields(ICustomPGApplicantEdit)
237            for field in PG_OMIT_EDIT_FIELDS:
238                form_fields = form_fields.omit(field)
239        elif self.target is not None and self.target.startswith('tsc'):
240            form_fields = grok.AutoFields(ITranscriptApplicant)
241            for field in TSC_OMIT_EDIT_FIELDS:
242                form_fields = form_fields.omit(field)           
243            return form_fields
244        else:
245            form_fields = grok.AutoFields(ICustomUGApplicantEdit)
246            for field in UG_OMIT_EDIT_FIELDS:
247                form_fields = form_fields.omit(field)
248        form_fields['applicant_id'].for_display = True
249        form_fields['reg_number'].for_display = True
250        return form_fields
251
252    def dataNotComplete(self, data):
253        store = getUtility(IExtFileStore)
254        if self.context.__parent__.with_picture \
255            and self.context.__parent__.picture_editable:
256            store = getUtility(IExtFileStore)
257            if not store.getFileByContext(self.context, attr=u'passport.jpg'):
258                return _('No passport picture uploaded.')
259        if self.target is not None \
260            and self.target.startswith('tscf') \
261            and not store.getFileByContext(self.context, attr=u'res_stat.pdf'):
262            return _('No statement of result pdf file uploaded.')
263        #if self.target is not None \
264        #    and self.target.startswith('tsc') \
265        #    and not store.getFileByContext(self.context, attr=u'testimonial.pdf'):
266        #    return _('No testimonial pdf file uploaded.')
267        return False
268
269class ResultStatement(AdditionalFile):
270    grok.name('res_stat')
271
272class NotificationRegistrationForm(AdditionalFile):
273    grok.name('not_reg')     
274   
275class OtherDocument1(AdditionalFile):
276    grok.name('doc_1')
277
278class OtherDocument2(AdditionalFile):
279    grok.name('doc_2')   
280
281class OtherDocument3(AdditionalFile):
282    grok.name('doc_3')           
Note: See TracBrowser for help on using the repository browser.