source: main/waeup.uniben/trunk/src/waeup/uniben/applicants/interfaces.py @ 14161

Last change on this file since 14161 was 14153, checked in by Henrik Bettermann, 8 years ago

Customize IPUTMEApplicantEdit.

  • Property svn:keywords set to Id
File size: 14.9 KB
RevLine 
[13814]1# -*- coding: utf-8 -*-
[7853]2## $Id: interfaces.py 14153 2016-09-02 11:28:50Z henrik $
3##
4## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
5## This program is free software; you can redistribute it and/or modify
6## it under the terms of the GNU General Public License as published by
7## the Free Software Foundation; either version 2 of the License, or
8## (at your option) any later version.
9##
10## This program is distributed in the hope that it will be useful,
11## but WITHOUT ANY WARRANTY; without even the implied warranty of
12## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13## GNU General Public License for more details.
14##
15## You should have received a copy of the GNU General Public License
16## along with this program; if not, write to the Free Software
17## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18##
19"""Customized interfaces of the university application package.
20"""
21
[13831]22#from grok import getSite
[8012]23from zope import schema
[13831]24#from zope.interface import invariant, Invalid
25#from zope.component import getUtility
26#from zope.catalog.interfaces import ICatalog
[13814]27from zc.sourcefactory.basic import BasicSourceFactory
[8051]28from waeup.kofa.applicants.interfaces import (
[8053]29    IApplicantBaseData,
[8051]30    AppCatCertificateSource, CertificateSource)
31from waeup.kofa.schoolgrades import ResultEntryField
[8530]32from waeup.kofa.interfaces import (
[13814]33    SimpleKofaVocabulary, academic_sessions_vocab, validate_email,
34    IKofaObject, ContextualDictSourceFactoryBase)
35from waeup.kofa.schema import FormattedDate, TextLineChoice, PhoneNumber
[8530]36from waeup.kofa.students.vocabularies import nats_vocab, GenderSource
[14106]37from waeup.kofa.refereeentries import RefereeEntryField
[8530]38from waeup.kofa.applicants.interfaces import contextual_reg_num_source
[8928]39from kofacustom.nigeria.applicants.interfaces import (
40    LGASource, high_qual, high_grade, exam_types,
[14140]41    programme_types_vocab, jambsubjects,
[8928]42    INigeriaUGApplicant, INigeriaPGApplicant,
43    INigeriaApplicantOnlinePayment,
[9006]44    INigeriaUGApplicantEdit, INigeriaPGApplicantEdit,
45    INigeriaApplicantUpdateByRegNo,
46    IPUTMEApplicantEdit,
[14140]47    IBankAccount,
[8928]48    )
[8020]49from waeup.uniben.interfaces import MessageFactory as _
[8247]50from waeup.uniben.payments.interfaces import ICustomOnlinePayment
[7853]51
[13814]52
53REGISTRATION_CATS = {
54    'corporate': ('Corporate Registration', 250000, 1),
55    'group': ('Group Registration', 200000, 2),
56    'individual': ('Individual Registration', 45000, 3),
57    'student': ('Student Registration', 5000, 4),
[13824]58    'fullpage': ('Full Page Advert', 250000, 5),
59    'halfpage': ('Half Page Advert', 150000, 6),
60    'quarterpage': ('Quarter Page Advert', 100000, 7),
[13814]61    }
62
63class RegTypesSource(BasicSourceFactory):
64    """A source that delivers all kinds of registrations.
65    """
66    def getValues(self):
67        sorted_items = sorted(REGISTRATION_CATS.items(),
68                              key=lambda element: element[1][2])
69        return [item[0] for item in sorted_items]
70
71    def getTitle(self, value):
72        return u"%s @ ₦ %s" % (
73            REGISTRATION_CATS[value][0],
74            REGISTRATION_CATS[value][1])
75
76class IUnibenRegistration(IKofaObject):
77    """A Uniben registrant.
78    """
79
80    suspended = schema.Bool(
81        title = _(u'Account suspended'),
82        default = False,
83        required = False,
84        )
85
86    locked = schema.Bool(
87        title = _(u'Form locked'),
88        default = False,
89        required = False,
90        )
91
92    applicant_id = schema.TextLine(
93        title = _(u'Registrant Id'),
94        required = False,
95        readonly = False,
96        )
97
98    firstname = schema.TextLine(
99        title = _(u'First Name'),
100        required = True,
101        )
102
103    middlename = schema.TextLine(
104        title = _(u'Middle Name'),
105        required = False,
106        )
107
108    lastname = schema.TextLine(
109        title = _(u'Last Name (Surname)'),
110        required = True,
111        )
112
[13819]113    sex = schema.Choice(
114        title = _(u'Sex'),
115        source = GenderSource(),
116        required = True,
[13814]117        )
118
119    nationality = schema.Choice(
120        vocabulary = nats_vocab,
121        title = _(u'Nationality'),
122        required = False,
123        )
124
125    email = schema.ASCIILine(
126        title = _(u'Email Address'),
127        required = True,
128        constraint=validate_email,
129        )
130
131    phone = PhoneNumber(
132        title = _(u'Phone'),
133        description = u'',
134        required = False,
135        )
136
[13819]137    #perm_address = schema.Text(
138    #    title = _(u'Current Local Address'),
139    #    required = False,
140    #    readonly = False,
141    #    )
142
143    institution = schema.TextLine(
144        title = _(u'Institution/Organisation'),
[13814]145        required = False,
146        readonly = False,
147        )
148
[13828]149    city = schema.TextLine(
150        title = _(u'City'),
151        required = False,
152        readonly = False,
153        )
154
[13819]155    lga = schema.Choice(
156        source = LGASource(),
157        title = _(u'State/LGA'),
158        required = False,
159        )
160
[13831]161    matric_number = schema.TextLine(
162        title = _(u'Uniben Matriculation Number'),
163        required = False,
164        readonly = False,
165        )
166
[13814]167    registration_cats = schema.List(
168        title = _(u'Registration Categories'),
169        value_type = schema.Choice(source=RegTypesSource()),
170        required = True,
[14020]171        defaultFactory=list,
[13814]172        )
173
[13831]174#    @invariant
175#    def matric_number_exists(applicant):
176#        if applicant.matric_number:
177#            catalog = getUtility(ICatalog, name='students_catalog')
178#            accommodation_session = getSite()['hostels'].accommodation_session
179#            student = catalog.searchResults(matric_number=(
180#                applicant.matric_number, applicant.matric_number))
181#            if len(student) != 1:
182#                raise Invalid(_("Matriculation number not found."))
[13814]183
[14140]184class ICustomUGApplicant(IApplicantBaseData, IBankAccount):
[8012]185    """An undergraduate applicant.
186
[8519]187    This interface defines the least common multiple of all fields
188    in ug application forms. In customized forms, fields can be excluded by
189    adding them to the UG_OMIT* tuples.
[8012]190    """
191
[14140]192    nationality = schema.Choice(
193        source = nats_vocab,
194        title = _(u'Nationality'),
195        required = False,
196        )
197    lga = schema.Choice(
198        source = LGASource(),
199        title = _(u'State/LGA (Nigerians only)'),
200        required = False,
201        )
202    #perm_address = schema.Text(
203    #    title = _(u'Permanent Address'),
204    #    required = False,
205    #    )
206    course1 = schema.Choice(
207        title = _(u'1st Choice Course of Study'),
208        source = AppCatCertificateSource(),
209        required = True,
210        )
211    course2 = schema.Choice(
212        title = _(u'2nd Choice Course of Study'),
213        source = AppCatCertificateSource(),
214        required = False,
215        )
216
217    programme_type = schema.Choice(
218        title = _(u'Programme Type'),
219        vocabulary = programme_types_vocab,
220        required = False,
221        )
222
223    hq_type = schema.Choice(
224        title = _(u'Qualification Obtained'),
225        required = False,
226        readonly = False,
227        vocabulary = high_qual,
228        )
229    hq_matric_no = schema.TextLine(
230        title = _(u'Former Matric Number'),
231        required = False,
232        readonly = False,
233        )
234    hq_degree = schema.Choice(
235        title = _(u'Class of Degree'),
236        required = False,
237        readonly = False,
238        vocabulary = high_grade,
239        )
240    hq_school = schema.TextLine(
241        title = _(u'Institution Attended'),
242        required = False,
243        readonly = False,
244        )
245    hq_session = schema.TextLine(
246        title = _(u'Years Attended'),
247        required = False,
248        readonly = False,
249        )
250    hq_disc = schema.TextLine(
251        title = _(u'Discipline'),
252        required = False,
253        readonly = False,
254        )
[14141]255    fst_sit_fname = schema.TextLine(
256        title = _(u'Full Name'),
257        required = False,
258        readonly = False,
259        )
260    fst_sit_no = schema.TextLine(
261        title = _(u'Exam Number'),
262        required = False,
263        readonly = False,
264        )
265    fst_sit_date = FormattedDate(
266        title = _(u'Exam Date'),
267        required = False,
268        readonly = False,
269        show_year = True,
270        )
271    fst_sit_type = schema.Choice(
272        title = _(u'Exam Type'),
273        required = False,
274        readonly = False,
275        vocabulary = exam_types,
276        )
277    fst_sit_results = schema.List(
278        title = _(u'Exam Results'),
279        value_type = ResultEntryField(),
280        required = False,
281        readonly = False,
282        defaultFactory=list,
283        )
284    scd_sit_fname = schema.TextLine(
285        title = _(u'Full Name'),
286        required = False,
287        readonly = False,
288        )
289    scd_sit_no = schema.TextLine(
290        title = _(u'Exam Number'),
291        required = False,
292        readonly = False,
293        )
294    scd_sit_date = FormattedDate(
295        title = _(u'Exam Date'),
296        required = False,
297        readonly = False,
298        show_year = True,
299        )
300    scd_sit_type = schema.Choice(
301        title = _(u'Exam Type'),
302        required = False,
303        readonly = False,
304        vocabulary = exam_types,
305        )
306    scd_sit_results = schema.List(
307        title = _(u'Exam Results'),
308        value_type = ResultEntryField(),
309        required = False,
310        readonly = False,
311        defaultFactory=list,
312        )
[14140]313    jamb_subjects = schema.Text(
314        title = _(u'Subjects and Scores'),
315        required = False,
316        )
317    jamb_subjects_list = schema.List(
318        title = _(u'JAMB Subjects'),
319        required = False,
320        defaultFactory=list,
321        value_type = schema.Choice(
322            vocabulary = jambsubjects
323            #source = JAMBSubjectSource(),
324            ),
325        )
326    jamb_score = schema.Int(
327        title = _(u'Total JAMB Score'),
328        required = False,
329        )
330    #jamb_age = schema.Int(
331    #    title = _(u'Age (provided by JAMB)'),
332    #    required = False,
333    #    )
334    jamb_reg_number = schema.TextLine(
335        title = _(u'JAMB Registration Number'),
336        required = False,
337        )
338    notice = schema.Text(
339        title = _(u'Notice'),
340        required = False,
341        )
342    screening_venue = schema.TextLine(
343        title = _(u'Screening Venue'),
344        required = False,
345        )
346    screening_date = schema.TextLine(
347        title = _(u'Screening Date'),
348        required = False,
349        )
350    screening_score = schema.Int(
351        title = _(u'Screening Score (%)'),
352        required = False,
353        )
354    aggregate = schema.Int(
355        title = _(u'Aggregate Score (%)'),
356        description = _(u'(average of relative JAMB and PUTME scores)'),
357        required = False,
358        )
359    result_uploaded = schema.Bool(
360        title = _(u'Result uploaded'),
361        default = False,
362        required = False,
363        )
364    student_id = schema.TextLine(
365        title = _(u'Student Id'),
366        required = False,
367        readonly = False,
368        )
369    course_admitted = schema.Choice(
370        title = _(u'Admitted Course of Study'),
371        source = CertificateSource(),
372        required = False,
373        )
374    locked = schema.Bool(
375        title = _(u'Form locked'),
376        default = False,
377        required = False,
378        )
379
380ICustomUGApplicant[
381    'locked'].order =  IApplicantBaseData['suspended'].order
382ICustomUGApplicant[
383    'result_uploaded'].order =  ICustomUGApplicant['suspended'].order
384
[8928]385class ICustomPGApplicant(INigeriaPGApplicant):
[7853]386    """A postgraduate applicant.
387
[8519]388    This interface defines the least common multiple of all fields
389    in pg application forms. In customized forms, fields can be excluded by
390    adding them to the PG_OMIT* tuples.
[7866]391    """
392
[14106]393    referees = schema.List(
394        title = _(u'Referees'),
395        value_type = RefereeEntryField(),
396        required = False,
397        defaultFactory=list,
398        )
[8012]399
[14106]400ICustomPGApplicant[
401    'referees'].order =  INigeriaPGApplicant['emp2_reason'].order
402
[13814]403class ICustomApplicant(ICustomUGApplicant, ICustomPGApplicant,
404    IUnibenRegistration):
[8012]405    """An interface for both types of applicants.
406
[8928]407    Attention: The ICustomPGApplicant field seetings will be overwritten
408    by ICustomPGApplicant field settings. If a field is defined
[8727]409    in both interfaces zope.schema validates only against the
[8928]410    constraints in ICustomUGApplicant. This does not affect the forms
411    since they are build on either ICustomUGApplicant or ICustomPGApplicant.
[8012]412    """
413
[8743]414    def writeLogMessage(view, comment):
[8053]415        """Adds an INFO message to the log file
416        """
417
418    def createStudent():
[8668]419        """Create a student object from applicant data
[8053]420        and copy applicant object.
421        """
422
[9056]423class ICustomUGApplicantEdit(INigeriaUGApplicantEdit):
[8727]424    """An undergraduate applicant interface for edit forms.
[8012]425
426    Here we can repeat the fields from base data and set the
427    `required` and `readonly` attributes to True to further restrict
428    the data access. Or we can allow only certain certificates to be
429    selected by choosing the appropriate source.
430
431    We cannot omit fields here. This has to be done in the
432    respective form page.
433    """
434
[9056]435class ICustomPGApplicantEdit(INigeriaPGApplicantEdit):
[7866]436    """A postgraduate applicant interface for editing.
437
438    Here we can repeat the fields from base data and set the
439    `required` and `readonly` attributes to True to further restrict
440    the data access. Or we can allow only certain certificates to be
441    selected by choosing the appropriate source.
442
443    We cannot omit fields here. This has to be done in the
444    respective form page.
[8017]445    """
[8454]446
[14106]447    referees = schema.List(
448        title = _(u'Referees'),
449        value_type = RefereeEntryField(),
450        required = False,
451        defaultFactory=list,
452        )
[13814]453
[14106]454ICustomPGApplicantEdit[
455    'referees'].order =  INigeriaPGApplicantEdit['emp2_reason'].order
456
[8928]457class ICustomApplicantOnlinePayment(INigeriaApplicantOnlinePayment):
[8247]458    """An applicant payment via payment gateways.
459
460    """
[8530]461
[14153]462class IPUTMEApplicantEdit(ICustomUGApplicant):
[8530]463    """An undergraduate applicant interface for editing.
464
465    Here we can repeat the fields from base data and set the
466    `required` and `readonly` attributes to True to further restrict
467    the data access. Or we can allow only certain certificates to be
468    selected by choosing the appropriate source.
469
470    We cannot omit fields here. This has to be done in the
471    respective form page.
472    """
473
[14153]474    email = schema.ASCIILine(
475        title = _(u'Email Address'),
476        required = True,
477        constraint=validate_email,
478        )
479    date_of_birth = FormattedDate(
480        title = _(u'Date of Birth'),
481        required = True,
482        show_year = True,
483        )
484    nationality = schema.Choice(
485        source = nats_vocab,
486        title = _(u'Nationality'),
487        required = True,
488        )
489
490IPUTMEApplicantEdit[
491    'date_of_birth'].order =  ICustomUGApplicant['date_of_birth'].order
492IPUTMEApplicantEdit[
493    'email'].order =  ICustomUGApplicant['email'].order
494IPUTMEApplicantEdit[
495    'nationality'].order =  ICustomUGApplicant['nationality'].order
496
[9056]497class ICustomApplicantUpdateByRegNo(INigeriaApplicantUpdateByRegNo):
[8582]498    """Representation of an applicant.
499
500    Skip regular reg_number validation if reg_number is used for finding
501    the applicant object.
502    """
Note: See TracBrowser for help on using the repository browser.