source: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/applicants/interfaces.py @ 13556

Last change on this file since 13556 was 13555, checked in by Henrik Bettermann, 9 years ago

Move field.

  • Property svn:keywords set to Id
File size: 22.4 KB
Line 
1## $Id: interfaces.py 13555 2015-12-21 15:03:46Z 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"""Customized interfaces of the university application package.
19"""
20
21from zope import schema
22from zope.component import getUtility
23from zope.schema import getFields
24from waeup.kofa.applicants.interfaces import (
25    contextual_reg_num_source,
26    IApplicantBaseData,
27    AppCatCertificateSource, CertificateSource)
28from waeup.kofa.schoolgrades import ResultEntryField
29from waeup.kofa.interfaces import (
30    SimpleKofaVocabulary,
31    academic_sessions_vocab,
32    validate_email,
33    SubjectSource,
34    IKofaUtils)
35from waeup.kofa.schema import FormattedDate, TextLineChoice
36from waeup.kofa.students.vocabularies import nats_vocab, GenderSource
37from kofacustom.nigeria.interfaces import (
38    LGASource, high_qual, high_grade, exam_types)
39from kofacustom.nigeria.interfaces import MessageFactory as _
40from kofacustom.nigeria.payments.interfaces import INigeriaOnlinePayment
41
42programme_types_vocab = SimpleKofaVocabulary(
43    (_('Post UTME'), 'putme'),
44    (_('Post DE'), 'pude'),
45    (_('not applicable'), 'na'),
46    )
47
48jambsubjects = SimpleKofaVocabulary(
49    (_('Use of English'),'english_language'),
50    (_('Agricultural Science'),'agricultural_science'),
51    (_('Arabic'),'arabic'),
52    (_('Biology'),'biology'),
53    (_('Book Keeping'),'book_keeping'),
54    (_('Chemistry'),'chemistry'),
55    (_('Christian Religious Studies'),'christian_religious_studies'),
56    (_('Commerce'),'commerce'),
57    (_('Economics'),'economics'),
58    (_('Financial Accounting'),'financial_accounting'),
59    (_('Fine Art'),'fine_art'),
60    (_('Food and Nutrition'),'food_and_nutrition'),
61    (_('French'),'french'),
62    (_('Geography'),'geography'),
63    (_('German'),'german'),
64    (_('Government'),'government'),
65    (_('Hausa'),'hausa'),
66    (_('Home Economics'),'home_economics'),
67    (_('History'),'history'),
68    (_('Igbo'),'igbo'),
69    (_('Literature in English'),'literature_in_english'),
70    (_('Literature in Nigerian Languages'),'literature_in_nigerian_languages'),
71    (_('Mathematics'),'mathematics'),
72    (_('Music'),'music'),
73    (_('Physics'),'physics'),
74    (_('Yoruba'),'yoruba'),
75    )
76
77# Define a validation method for jamb subjects
78class NotExactNumberOfItems(schema.ValidationError):
79    __doc__ = u"Not exactly 4 items selected."
80
81def four_items(value):
82    if len(value) != 4:
83        raise NotExactNumberOfItems(value)
84    return True
85
86class JAMBSubjectSource(SubjectSource):
87    """A source for school subjects used in exam documentation.
88    """
89
90    def getTitle(self, value):
91        subjects_dict = getUtility(IKofaUtils).EXAM_SUBJECTS_DICT
92        return "%s" % subjects_dict[value]
93
94# Fields to be omitted in all display forms. course_admitted is
95# rendered separately.
96
97OMIT_DISPLAY_FIELDS = ('locked', 'course_admitted',
98    'result_uploaded', 'suspended', 'special_application')
99
100# UG students are all undergraduate students.
101UG_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + (
102    'jamb_subjects_list', 'programme_type')
103UG_OMIT_PDF_FIELDS = UG_OMIT_DISPLAY_FIELDS + ('phone',)
104UG_OMIT_MANAGE_FIELDS = (
105    'special_application',
106    'jamb_subjects_list',
107    'programme_type')
108UG_OMIT_EDIT_FIELDS = UG_OMIT_MANAGE_FIELDS + OMIT_DISPLAY_FIELDS + (
109    'student_id',
110    'notice',
111    'screening_score',
112    'screening_venue',
113    'screening_date',
114    'jamb_age',
115    'jamb_subjects',
116    'jamb_score',
117    'jamb_reg_number',
118    'aggregate')
119
120# CBT is a subgroup of UG with the same interface.
121CBT_OMIT_FIELDS = (
122    'hq_type', 'hq_matric_no',
123    'hq_degree', 'hq_school',
124    'hq_session', 'hq_disc',
125    'aggregate', 'jamb_subjects',
126    'programme_type')
127CBT_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + CBT_OMIT_FIELDS
128CBT_OMIT_MANAGE_FIELDS = CBT_OMIT_FIELDS + ('special_application',)
129CBT_OMIT_EDIT_FIELDS = OMIT_DISPLAY_FIELDS + CBT_OMIT_FIELDS + (
130    'special_application',
131    'student_id',
132    'notice',
133    'screening_score',
134    'screening_venue',
135    'screening_date',
136    #'jamb_age',
137    #'jamb_subjects',
138    #'jamb_score',
139    #'jamb_reg_number',
140    )
141CBT_OMIT_PDF_FIELDS = CBT_OMIT_DISPLAY_FIELDS + ('phone',)
142
143# AFFIL is a subgroup of UG with the same interface.
144AFFIL_OMIT_FIELDS = (
145    'hq_type', 'hq_matric_no',
146    'hq_degree', 'hq_school',
147    'hq_session', 'hq_disc',
148    'aggregate','jamb_subjects',)
149AFFIL_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + AFFIL_OMIT_FIELDS
150AFFIL_OMIT_MANAGE_FIELDS = AFFIL_OMIT_FIELDS + ('special_application',)
151AFFIL_OMIT_EDIT_FIELDS = OMIT_DISPLAY_FIELDS + AFFIL_OMIT_FIELDS + (
152    'special_application',
153    'student_id',
154    'notice',
155    'screening_score',
156    'screening_venue',
157    'screening_date',
158    )
159AFFIL_OMIT_PDF_FIELDS = AFFIL_OMIT_DISPLAY_FIELDS # + ('phone',)
160
161# PUTME is a subgroup of UG with the same interface.
162PUTME_OMIT_FIELDS = (
163    'hq_type', 'hq_matric_no',
164    'hq_degree', 'hq_school',
165    'hq_session', 'hq_disc',
166    'jamb_subjects_list', 'programme_type')
167PUTME_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + PUTME_OMIT_FIELDS
168PUTME_OMIT_MANAGE_FIELDS = UG_OMIT_MANAGE_FIELDS + PUTME_OMIT_FIELDS
169PUTME_OMIT_EDIT_FIELDS = UG_OMIT_EDIT_FIELDS + PUTME_OMIT_FIELDS + (
170    'firstname', 'middlename', 'lastname', 'sex',
171    'course1', 'lga')
172PUTME_OMIT_PDF_FIELDS = PUTME_OMIT_DISPLAY_FIELDS + ('phone',)
173PUTME_OMIT_RESULT_SLIP_FIELDS = PUTME_OMIT_DISPLAY_FIELDS + (
174    'phone',
175    'date_of_birth', 'sex',
176    'nationality', 'lga', #'perm_address',
177    'course2', 'screening_venue',
178    'screening_date')
179
180# PUDE is a subgroup of UG with the same interface.
181PUDE_OMIT_FIELDS = (
182    'jamb_subjects',
183    'jamb_score',
184    'jamb_age',
185    'aggregate',
186    'jamb_subjects_list',
187    'programme_type')
188PUDE_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + PUDE_OMIT_FIELDS
189PUDE_OMIT_MANAGE_FIELDS = UG_OMIT_MANAGE_FIELDS + PUDE_OMIT_FIELDS
190PUDE_OMIT_EDIT_FIELDS = set(UG_OMIT_EDIT_FIELDS + PUDE_OMIT_FIELDS + (
191    'firstname', 'middlename', 'lastname', 'sex',
192    'course1', 'lga'))
193PUDE_OMIT_PDF_FIELDS = PUDE_OMIT_DISPLAY_FIELDS + ('phone',)
194PUDE_OMIT_RESULT_SLIP_FIELDS = PUDE_OMIT_DISPLAY_FIELDS + (
195    'phone',
196    'date_of_birth', 'sex',
197    'nationality', 'lga', #'perm_address',
198    'course2', 'screening_venue',
199    'screening_date')
200
201# PG has its own interface
202PG_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS
203PG_OMIT_PDF_FIELDS = PG_OMIT_DISPLAY_FIELDS + ('phone',)
204PG_OMIT_MANAGE_FIELDS = ('special_application',)
205PG_OMIT_EDIT_FIELDS = PG_OMIT_MANAGE_FIELDS + PG_OMIT_DISPLAY_FIELDS + (
206    'student_id', 'notice',
207    'screening_score', 'screening_venue',
208    'screening_date',)
209
210class INigeriaUGApplicant(IApplicantBaseData):
211    """An undergraduate applicant.
212
213    This interface defines the least common multiple of all fields
214    in ug application forms. In customized forms, fields can be excluded by
215    adding them to the UG_OMIT* tuples.
216    """
217
218    nationality = schema.Choice(
219        source = nats_vocab,
220        title = _(u'Nationality'),
221        required = False,
222        )
223    lga = schema.Choice(
224        source = LGASource(),
225        title = _(u'State/LGA (Nigerians only)'),
226        required = False,
227        )
228    #perm_address = schema.Text(
229    #    title = _(u'Permanent Address'),
230    #    required = False,
231    #    )
232    course1 = schema.Choice(
233        title = _(u'1st Choice Course of Study'),
234        source = AppCatCertificateSource(),
235        required = True,
236        )
237    course2 = schema.Choice(
238        title = _(u'2nd Choice Course of Study'),
239        source = AppCatCertificateSource(),
240        required = False,
241        )
242
243    programme_type = schema.Choice(
244        title = _(u'Programme Type'),
245        vocabulary = programme_types_vocab,
246        required = False,
247        )
248
249    hq_type = schema.Choice(
250        title = _(u'Qualification Obtained'),
251        required = False,
252        readonly = False,
253        vocabulary = high_qual,
254        )
255    hq_matric_no = schema.TextLine(
256        title = _(u'Former Matric Number'),
257        required = False,
258        readonly = False,
259        )
260    hq_degree = schema.Choice(
261        title = _(u'Class of Degree'),
262        required = False,
263        readonly = False,
264        vocabulary = high_grade,
265        )
266    hq_school = schema.TextLine(
267        title = _(u'Institution Attended'),
268        required = False,
269        readonly = False,
270        )
271    hq_session = schema.TextLine(
272        title = _(u'Years Attended'),
273        required = False,
274        readonly = False,
275        )
276    hq_disc = schema.TextLine(
277        title = _(u'Discipline'),
278        required = False,
279        readonly = False,
280        )
281    jamb_subjects = schema.Text(
282        title = _(u'Subjects and Scores'),
283        required = False,
284        )
285    jamb_subjects_list = schema.List(
286        title = _(u'JAMB Subjects'),
287        required = False,
288        default = [],
289        value_type = schema.Choice(
290            vocabulary = jambsubjects
291            #source = JAMBSubjectSource(),
292            ),
293        )
294    jamb_score = schema.Int(
295        title = _(u'Total JAMB Score'),
296        required = False,
297        )
298    #jamb_age = schema.Int(
299    #    title = _(u'Age (provided by JAMB)'),
300    #    required = False,
301    #    )
302    jamb_reg_number = schema.TextLine(
303        title = _(u'JAMB Registration Number'),
304        required = False,
305        )
306    notice = schema.Text(
307        title = _(u'Notice'),
308        required = False,
309        )
310    screening_venue = schema.TextLine(
311        title = _(u'Screening Venue'),
312        required = False,
313        )
314    screening_date = schema.TextLine(
315        title = _(u'Screening Date'),
316        required = False,
317        )
318    screening_score = schema.Int(
319        title = _(u'Screening Score (%)'),
320        required = False,
321        )
322    aggregate = schema.Int(
323        title = _(u'Aggregate Score (%)'),
324        description = _(u'(average of relative JAMB and PUTME scores)'),
325        required = False,
326        )
327    result_uploaded = schema.Bool(
328        title = _(u'Result uploaded'),
329        default = False,
330        required = False,
331        )
332    student_id = schema.TextLine(
333        title = _(u'Student Id'),
334        required = False,
335        readonly = False,
336        )
337    course_admitted = schema.Choice(
338        title = _(u'Admitted Course of Study'),
339        source = CertificateSource(),
340        required = False,
341        )
342    locked = schema.Bool(
343        title = _(u'Form locked'),
344        default = False,
345        required = False,
346        )
347
348INigeriaUGApplicant[
349    'locked'].order =  IApplicantBaseData['suspended'].order
350INigeriaUGApplicant[
351    'result_uploaded'].order =  INigeriaUGApplicant['suspended'].order
352
353class INigeriaPGApplicant(IApplicantBaseData):
354    """A postgraduate applicant.
355
356    This interface defines the least common multiple of all fields
357    in pg application forms. In customized forms, fields can be excluded by
358    adding them to the PG_OMIT* tuples.
359    """
360
361    nationality = schema.Choice(
362        source = nats_vocab,
363        title = _(u'Nationality'),
364        required = True,
365        )
366    lga = schema.Choice(
367        source = LGASource(),
368        title = _(u'State/LGA (Nigerians only)'),
369        required = False,
370        )
371    #perm_address = schema.Text(
372    #    title = _(u'Permanent Address'),
373    #    required = False,
374    #    )
375    course1 = schema.Choice(
376        title = _(u'1st Choice Course of Study'),
377        source = AppCatCertificateSource(),
378        required = True,
379        )
380    course2 = schema.Choice(
381        title = _(u'2nd Choice Course of Study'),
382        source = AppCatCertificateSource(),
383        required = False,
384        )
385    hq_type = schema.Choice(
386        title = _(u'Qualification Obtained'),
387        required = False,
388        readonly = False,
389        vocabulary = high_qual,
390        )
391    hq_fname = schema.TextLine(
392        title = _(u'Full Name'),
393        required = False,
394        readonly = False,
395        )
396    hq_matric_no = schema.TextLine(
397        title = _(u'Former Matric Number'),
398        required = False,
399        readonly = False,
400        )
401    hq_degree = schema.Choice(
402        title = _(u'Class of Degree'),
403        required = False,
404        readonly = False,
405        vocabulary = high_grade,
406        )
407    hq_school = schema.TextLine(
408        title = _(u'Institution Attended'),
409        required = False,
410        readonly = False,
411        )
412    hq_session = schema.TextLine(
413        title = _(u'Years Attended'),
414        required = False,
415        readonly = False,
416        )
417    hq_disc = schema.TextLine(
418        title = _(u'Discipline'),
419        required = False,
420        readonly = False,
421        )
422    fst_sit_fname = schema.TextLine(
423        title = _(u'Full Name'),
424        required = False,
425        readonly = False,
426        )
427    fst_sit_no = schema.TextLine(
428        title = _(u'Exam Number'),
429        required = False,
430        readonly = False,
431        )
432    fst_sit_date = FormattedDate(
433        title = _(u'Exam Date'),
434        required = False,
435        readonly = False,
436        show_year = True,
437        )
438    fst_sit_type = schema.Choice(
439        title = _(u'Exam Type'),
440        required = False,
441        readonly = False,
442        vocabulary = exam_types,
443        )
444    fst_sit_results = schema.List(
445        title = _(u'Exam Results'),
446        value_type = ResultEntryField(),
447        required = False,
448        readonly = False,
449        default = [],
450        )
451    scd_sit_fname = schema.TextLine(
452        title = _(u'Full Name'),
453        required = False,
454        readonly = False,
455        )
456    scd_sit_no = schema.TextLine(
457        title = _(u'Exam Number'),
458        required = False,
459        readonly = False,
460        )
461    scd_sit_date = FormattedDate(
462        title = _(u'Exam Date'),
463        required = False,
464        readonly = False,
465        show_year = True,
466        )
467    scd_sit_type = schema.Choice(
468        title = _(u'Exam Type'),
469        required = False,
470        readonly = False,
471        vocabulary = exam_types,
472        )
473    scd_sit_results = schema.List(
474        title = _(u'Exam Results'),
475        value_type = ResultEntryField(),
476        required = False,
477        readonly = False,
478        default = [],
479        )
480    # Replaced by first and second sitting
481    #pp_school = schema.Choice(
482    #    title = _(u'Qualification Obtained'),
483    #    required = False,
484    #    readonly = False,
485    #    vocabulary = exam_types,
486    #    )
487    presently_inst = schema.TextLine(
488        title = _(u'If yes, name of institution'),
489        required = False,
490        readonly = False,
491        )
492    nysc_year = schema.Int(
493        title = _(u'Nysc Year'),
494        required = False,
495        readonly = False,
496        )
497    nysc_lga = schema.Choice(
498        source = LGASource(),
499        title = _(u'Nysc Location'),
500        required = False,
501        )
502    employer = schema.TextLine(
503        title = _(u'Employer'),
504        required = False,
505        readonly = False,
506        )
507    emp_position = schema.TextLine(
508        title = _(u'Employer Position'),
509        required = False,
510        readonly = False,
511        )
512    emp_start = FormattedDate(
513        title = _(u'Start Date'),
514        required = False,
515        readonly = False,
516        show_year = True,
517        )
518    emp_end = FormattedDate(
519        title = _(u'End Date'),
520        required = False,
521        readonly = False,
522        show_year = True,
523        )
524    emp_reason = schema.TextLine(
525        title = _(u'Reason for Leaving'),
526        required = False,
527        readonly = False,
528        )
529    employer2 = schema.TextLine(
530        title = _(u'2nd Employer'),
531        required = False,
532        readonly = False,
533        )
534    emp2_position = schema.TextLine(
535        title = _(u'2nd Employer Position'),
536        required = False,
537        readonly = False,
538        )
539    emp2_start = FormattedDate(
540        title = _(u'Start Date'),
541        required = False,
542        readonly = False,
543        show_year = True,
544        )
545    emp2_end = FormattedDate(
546        title = _(u'End Date'),
547        required = False,
548        readonly = False,
549        show_year = True,
550        )
551    emp2_reason = schema.TextLine(
552        title = _(u'Reason for Leaving'),
553        required = False,
554        readonly = False,
555        )
556    notice = schema.Text(
557        title = _(u'Notice'),
558        required = False,
559        readonly = False,
560        )
561    screening_venue = schema.TextLine(
562        title = _(u'Screening Venue'),
563        required = False,
564        )
565    screening_date = schema.TextLine(
566        title = _(u'Screening Date'),
567        required = False,
568        )
569    screening_score = schema.Int(
570        title = _(u'Screening Score (%)'),
571        required = False,
572        )
573    student_id = schema.TextLine(
574        title = _(u'Student Id'),
575        required = False,
576        readonly = False,
577        )
578    course_admitted = schema.Choice(
579        title = _(u'Admitted Course of Study'),
580        source = CertificateSource(),
581        required = False,
582        readonly = False,
583        )
584    locked = schema.Bool(
585        title = _(u'Form locked'),
586        default = False,
587        required = False,
588        )
589
590INigeriaPGApplicant[
591    'locked'].order =  IApplicantBaseData['suspended'].order
592
593# PRE is used by Uniben
594#  med: "it is as named... PRE - DEGREE... much like a 1 year diploma programme"
595PRE_OMIT_FIELDS = tuple([
596    i for i in getFields(INigeriaPGApplicant).keys()
597        if i[:3] in ('hq_', 'emp', 'nys')])
598PRE_OMIT_DISPLAY_FIELDS = OMIT_DISPLAY_FIELDS + PRE_OMIT_FIELDS
599PRE_OMIT_MANAGE_FIELDS = PG_OMIT_MANAGE_FIELDS + PRE_OMIT_FIELDS
600PRE_OMIT_EDIT_FIELDS = set(PG_OMIT_EDIT_FIELDS + PRE_OMIT_FIELDS)
601PRE_OMIT_PDF_FIELDS = PRE_OMIT_DISPLAY_FIELDS
602PRE_OMIT_RESULT_SLIP_FIELDS = PRE_OMIT_DISPLAY_FIELDS
603
604class INigeriaApplicant(INigeriaUGApplicant, INigeriaPGApplicant):
605    """An interface for both types of applicants.
606
607    Attention: The INigeriaPGApplicant field seetings will be overwritten
608    by INigeriaPGApplicant field settings. If a field is defined
609    in both interfaces zope.schema validates only against the
610    constraints in INigeriaUGApplicant. This does not affect the forms
611    since they are build on either INigeriaUGApplicant or INigeriaPGApplicant.
612    """
613
614    def writeLogMessage(view, comment):
615        """Adds an INFO message to the log file
616        """
617
618    def createStudent():
619        """Create a student object from applicant data
620        and copy applicant object.
621        """
622
623class INigeriaUGApplicantEdit(INigeriaUGApplicant):
624    """An undergraduate applicant interface for edit forms.
625
626    Here we can repeat the fields from base data and set the
627    `required` and `readonly` attributes to True to further restrict
628    the data access. Or we can allow only certain certificates to be
629    selected by choosing the appropriate source.
630
631    We cannot omit fields here. This has to be done in the
632    respective form page.
633    """
634
635    email = schema.ASCIILine(
636        title = _(u'Email Address'),
637        required = True,
638        constraint=validate_email,
639        )
640    date_of_birth = FormattedDate(
641        title = _(u'Date of Birth'),
642        required = True,
643        show_year = True,
644        )
645    jamb_subjects_list = schema.List(
646        title = _(u'JAMB Subjects'),
647        description = _(u'Select four subjects.'),
648        required = True,
649        constraint = four_items,
650        value_type = schema.Choice(
651            vocabulary = jambsubjects
652            #source = JAMBSubjectSource(),
653            ),
654        )
655
656INigeriaUGApplicantEdit[
657    'date_of_birth'].order = INigeriaUGApplicant['date_of_birth'].order
658INigeriaUGApplicantEdit[
659    'email'].order = INigeriaUGApplicant['email'].order
660INigeriaUGApplicantEdit[
661    'jamb_subjects_list'].order = INigeriaUGApplicant['jamb_subjects_list'].order
662
663class INigeriaPGApplicantEdit(INigeriaPGApplicant):
664    """A postgraduate applicant interface for editing.
665
666    Here we can repeat the fields from base data and set the
667    `required` and `readonly` attributes to True to further restrict
668    the data access. Or we can allow only certain certificates to be
669    selected by choosing the appropriate source.
670
671    We cannot omit fields here. This has to be done in the
672    respective form page.
673    """
674
675    email = schema.ASCIILine(
676        title = _(u'Email Address'),
677        required = True,
678        constraint=validate_email,
679        )
680    date_of_birth = FormattedDate(
681        title = _(u'Date of Birth'),
682        required = True,
683        show_year = True,
684        )
685
686INigeriaPGApplicantEdit[
687    'date_of_birth'].order =  INigeriaPGApplicant['date_of_birth'].order
688INigeriaPGApplicantEdit[
689    'email'].order =  INigeriaPGApplicant['email'].order
690
691class INigeriaApplicantOnlinePayment(INigeriaOnlinePayment):
692    """An applicant payment via payment gateways.
693    """
694
695class IPUTMEApplicantEdit(INigeriaUGApplicant):
696    """An undergraduate applicant interface for editing.
697
698    Here we can repeat the fields from base data and set the
699    `required` and `readonly` attributes to True to further restrict
700    the data access. Or we can allow only certain certificates to be
701    selected by choosing the appropriate source.
702
703    We cannot omit fields here. This has to be done in the
704    respective form page.
705    """
706    email = schema.ASCIILine(
707        title = _(u'Email Address'),
708        required = True,
709        constraint=validate_email,
710        )
711    date_of_birth = FormattedDate(
712        title = _(u'Date of Birth'),
713        required = True,
714        show_year = True,
715        )
716    nationality = schema.Choice(
717        source = nats_vocab,
718        title = _(u'Nationality'),
719        required = True,
720        )
721
722IPUTMEApplicantEdit[
723    'date_of_birth'].order =  INigeriaUGApplicant['date_of_birth'].order
724IPUTMEApplicantEdit[
725    'email'].order =  INigeriaUGApplicant['email'].order
726IPUTMEApplicantEdit[
727    'nationality'].order =  INigeriaUGApplicant['nationality'].order
728
729class INigeriaApplicantUpdateByRegNo(INigeriaApplicant):
730    """Representation of an applicant.
731
732    Skip regular reg_number validation if reg_number is used for finding
733    the applicant object.
734    """
735    reg_number = schema.TextLine(
736        title = u'Registration Number',
737        required = False,
738        )
Note: See TracBrowser for help on using the repository browser.