source: main/waeup.aaue/trunk/src/waeup/aaue/applicants/interfaces.py @ 16827

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

Add fields.

  • Property svn:keywords set to Id
File size: 46.4 KB
Line 
1## $Id: interfaces.py 16803 2022-02-13 17:53:20Z 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.interface import Attribute, invariant, Invalid
23from waeup.kofa.applicants.interfaces import (
24    IApplicantBaseData,
25    AppCatCertificateSource, CertificateSource)
26from waeup.kofa.schoolgrades import ResultEntryField
27from waeup.kofa.interfaces import (
28    SimpleKofaVocabulary, academic_sessions_vocab, validate_email)
29from waeup.kofa.schema import FormattedDate, TextLineChoice, PhoneNumber
30from waeup.kofa.interfaces import IKofaObject
31from waeup.kofa.students.vocabularies import (
32    nats_vocab, GenderSource, StudyLevelSource)
33from waeup.kofa.applicants.interfaces import (
34    contextual_reg_num_source,
35    IApplicantBaseData,
36    IApplicantRefereeReport)
37from waeup.kofa.refereeentries import RefereeEntryField
38from waeup.kofa.university.vocabularies import StudyModeSource
39from kofacustom.nigeria.applicants.interfaces import (
40    LGASource, high_qual, high_grade, exam_types,
41    INigeriaUGApplicant, INigeriaPGApplicant,
42    INigeriaApplicantOnlinePayment,
43    INigeriaUGApplicantEdit, INigeriaPGApplicantEdit,
44    INigeriaApplicantUpdateByRegNo,
45    IPUTMEApplicantEdit,
46    )
47from waeup.aaue.interfaces import MessageFactory as _
48from waeup.aaue.payments.interfaces import ICustomOnlinePayment
49
50programme_types_vocab = SimpleKofaVocabulary(
51    (_('Undergraduate Programme (100 level)'), 'regular'),
52    (_('Direct Entry (200 level)'), 'direct'),
53    (_('not applicable'), 'na'),
54    )
55
56certificate_types_vocab = SimpleKofaVocabulary(
57    (_('Full-time Degree'), 'ft'),
58    (_('Part-time Degree'), 'pt'),
59    (_('Diploma'), 'dp'),
60    (_('Masters Degree'), 'ma'),
61    (_('Doctorate Degree'), 'phd'),
62    )
63
64document_types_vocab = SimpleKofaVocabulary(
65    (_('Certificate'), 'certificate'),
66    (_('Result'), 'result'),
67    (_('Transcript'), 'transcript'),
68    (_('Studentship'), 'studship'),
69    )
70
71application_types_vocab = SimpleKofaVocabulary(
72    (_('Academic Staff Positions'), 'academic'),
73    (_('Senior Non-Teaching Staff'), 'senior'),
74    (_('Junior Staff (Non-Teaching)'), 'junior'),
75    )
76
77request_types_vocab = SimpleKofaVocabulary(
78    (_('Scanned Result'), 'result'),
79    (_('Scanned Certificate'), 'certificate'),
80    (_('Scanned Transcript'), 'transcript'),
81    (_('Attestation'), 'attest'),
82    (_('Proficiency in English Language'), 'english'),
83    )
84
85rating_vocab = SimpleKofaVocabulary(
86    (_('Excellent'), 'e'),
87    (_('Very good'), 'vg'),
88    (_('Good'), 'g'),
89    (_('Slightly above average'), 'saa'),
90    (_('Average'), 'a'),
91    (_('Below average'), 'ba'),
92    (_('Unable to assess'), 'unable'),
93    )
94
95overallpromise_vocab = SimpleKofaVocabulary(
96    (_('Very good (highest 10%)'), 'vg'),
97    (_('Good (next 15%)'), 'g'),
98    (_('Above average (next 15%)'), 'aa'),
99    (_('Average (middle 20%)'), 'a'),
100    (_('Below average (lower 10%)'), 'ba'),
101    )
102
103
104class ICustomUGApplicant(IApplicantBaseData):
105    """An undergraduate applicant.
106
107    This interface defines the least common multiple of all fields
108    in ug application forms. In customized forms, fields can be excluded by
109    adding them to the UG_OMIT* tuples.
110    """
111
112    #programme_type = schema.Choice(
113    #    title = _(u'Programme Type'),
114    #    vocabulary = programme_types_vocab,
115    #    required = False,
116    #    )
117
118    nationality = schema.Choice(
119        source = nats_vocab,
120        title = _(u'Nationality'),
121        required = True,
122        )
123
124    lga = schema.Choice(
125        source = LGASource(),
126        title = _(u'State/LGA (Nigerians only)'),
127        required = False,
128        )
129
130    perm_address = schema.Text(
131        title = _(u'Permanent Address'),
132        required = False,
133        )
134
135    home_town = schema.TextLine(
136        title = _(u'Home Town'),
137        required = False,
138        )
139
140    #jamb_reg_number = schema.TextLine(
141    #    title = _(u'JAMB Registration Number'),
142    #    required = False,
143    #    )
144
145    jamb_score = schema.Int(
146        title = _(u'Total JAMB Score'),
147        required = False,
148        )
149
150    jamb_subjects = schema.Text(
151        title = _(u'JAMB Subjects and Scores'),
152        required = False,
153        )
154
155    course1 = schema.Choice(
156        title = _(u'1st Choice Course of Study'),
157        source = AppCatCertificateSource(),
158        required = False,
159        )
160
161    course2 = schema.Choice(
162        title = _(u'2nd Choice Course of Study'),
163        source = AppCatCertificateSource(),
164        required = False,
165        )
166
167    course3 = schema.Choice(
168        title = _(u'3rd Choice Course of Study'),
169        source = AppCatCertificateSource(),
170        required = False,
171        )
172
173    fst_sit_fname = schema.TextLine(
174        title = _(u'Full Name'),
175        required = False,
176        readonly = False,
177        )
178
179    fst_sit_no = schema.TextLine(
180        title = _(u'Exam Number'),
181        required = False,
182        readonly = False,
183        )
184
185    fst_sit_sc_pin = schema.TextLine(
186        title = _(u'Scratch Card Pin'),
187        required = False,
188        readonly = False,
189        )
190
191    fst_sit_sc_serial_number = schema.TextLine(
192        title = _(u'Scratch Card Serial Number'),
193        required = False,
194        readonly = False,
195        )
196
197    fst_sit_date = FormattedDate(
198        title = _(u'Exam Date'),
199        required = False,
200        readonly = False,
201        show_year = True,
202        )
203
204    fst_sit_type = schema.Choice(
205        title = _(u'Exam Type'),
206        required = False,
207        readonly = False,
208        vocabulary = exam_types,
209        )
210
211    fst_sit_results = schema.List(
212        title = _(u'Exam Results'),
213        value_type = ResultEntryField(),
214        required = False,
215        readonly = False,
216        defaultFactory=list,
217        )
218
219    scd_sit_fname = schema.TextLine(
220        title = _(u'Full Name'),
221        required = False,
222        readonly = False,
223        )
224
225    scd_sit_no = schema.TextLine(
226        title = _(u'Exam Number'),
227        required = False,
228        readonly = False,
229        )
230
231    scd_sit_sc_pin = schema.TextLine(
232        title = _(u'Scratch Card Pin'),
233        required = False,
234        readonly = False,
235        )
236
237    scd_sit_sc_serial_number = schema.TextLine(
238        title = _(u'Scratch Card Serial Number'),
239        required = False,
240        readonly = False,
241        )
242
243    scd_sit_date = FormattedDate(
244        title = _(u'Exam Date'),
245        required = False,
246        readonly = False,
247        show_year = True,
248        )
249
250    scd_sit_type = schema.Choice(
251        title = _(u'Exam Type'),
252        required = False,
253        readonly = False,
254        vocabulary = exam_types,
255        )
256
257    scd_sit_results = schema.List(
258        title = _(u'Exam Results'),
259        value_type = ResultEntryField(),
260        required = False,
261        readonly = False,
262        defaultFactory=list,
263        )
264
265    alr_fname = schema.TextLine(
266        title = _(u'Full Name'),
267        required = False,
268        readonly = False,
269        )
270
271    alr_no = schema.TextLine(
272        title = _(u'Exam Number'),
273        required = False,
274        readonly = False,
275        )
276
277    alr_date = FormattedDate(
278        title = _(u'Exam Date'),
279        required = False,
280        readonly = False,
281        show_year = True,
282        )
283
284    alr_results = schema.List(
285        title = _(u'Exam Results'),
286        value_type = ResultEntryField(),
287        required = False,
288        readonly = False,
289        defaultFactory=list,
290        )
291
292    hq_type = schema.Choice(
293        title = _(u'Qualification Obtained'),
294        required = False,
295        readonly = False,
296        vocabulary = high_qual,
297        )
298
299    hq_fname = schema.TextLine(
300        title = _(u'Full Name'),
301        required = False,
302        readonly = False,
303        )
304
305    hq_matric_no = schema.TextLine(
306        title = _(u'Former Matric Number'),
307        required = False,
308        readonly = False,
309        )
310
311    hq_degree = schema.Choice(
312        title = _(u'Class of Degree'),
313        required = False,
314        readonly = False,
315        vocabulary = high_grade,
316        )
317
318    hq_school = schema.TextLine(
319        title = _(u'Institution Attended'),
320        required = False,
321        readonly = False,
322        )
323
324    hq_session = schema.TextLine(
325        title = _(u'Years Attended'),
326        required = False,
327        readonly = False,
328        )
329
330    hq_disc = schema.TextLine(
331        title = _(u'Discipline'),
332        required = False,
333        readonly = False,
334        )
335
336    hq_type2 = schema.Choice(
337        title = _(u'Qualification Obtained'),
338        required = False,
339        readonly = False,
340        vocabulary = high_qual,
341        )
342
343    hq_fname2 = schema.TextLine(
344        title = _(u'Full Name'),
345        required = False,
346        readonly = False,
347        )
348
349    hq_matric_no2 = schema.TextLine(
350        title = _(u'Former Matric Number'),
351        required = False,
352        readonly = False,
353        )
354
355    hq_degree2 = schema.Choice(
356        title = _(u'Class of Degree'),
357        required = False,
358        readonly = False,
359        vocabulary = high_grade,
360        )
361
362    hq_school2 = schema.TextLine(
363        title = _(u'Institution Attended'),
364        required = False,
365        readonly = False,
366        )
367
368    hq_session2 = schema.TextLine(
369        title = _(u'Years Attended'),
370        required = False,
371        readonly = False,
372        )
373
374    hq_disc2 = schema.TextLine(
375        title = _(u'Discipline'),
376        required = False,
377        readonly = False,
378        )
379
380    hq_type3 = schema.Choice(
381        title = _(u'Qualification Obtained'),
382        required = False,
383        readonly = False,
384        vocabulary = high_qual,
385        )
386
387    hq_fname3 = schema.TextLine(
388        title = _(u'Full Name'),
389        required = False,
390        readonly = False,
391        )
392
393    hq_matric_no3 = schema.TextLine(
394        title = _(u'Former Matric Number'),
395        required = False,
396        readonly = False,
397        )
398
399    hq_degree3 = schema.Choice(
400        title = _(u'Class of Degree'),
401        required = False,
402        readonly = False,
403        vocabulary = high_grade,
404        )
405
406    hq_school3 = schema.TextLine(
407        title = _(u'Institution Attended'),
408        required = False,
409        readonly = False,
410        )
411
412    hq_session3 = schema.TextLine(
413        title = _(u'Years Attended'),
414        required = False,
415        readonly = False,
416        )
417
418    hq_disc3 = schema.TextLine(
419        title = _(u'Discipline'),
420        required = False,
421        readonly = False,
422        )
423
424    nysc_year = schema.Int(
425        title = _(u'Nysc Year'),
426        required = False,
427        readonly = False,
428        )
429
430    nysc_location = schema.TextLine(
431        title = _(u'Nysc Location'),
432        required = False,
433        )
434
435    nysc_lga = schema.Choice(
436        source = LGASource(),
437        title = _(u'Nysc LGA'),
438        required = False,
439        )
440
441    employer = schema.TextLine(
442        title = _(u'Employer'),
443        required = False,
444        readonly = False,
445        )
446
447    emp_position = schema.TextLine(
448        title = _(u'Employer Position'),
449        required = False,
450        readonly = False,
451        )
452
453    emp_start = FormattedDate(
454        title = _(u'Start Date'),
455        required = False,
456        readonly = False,
457        show_year = True,
458        )
459
460    emp_end = FormattedDate(
461        title = _(u'End Date'),
462        required = False,
463        readonly = False,
464        show_year = True,
465        )
466
467    emp_reason = schema.TextLine(
468        title = _(u'Reason for Leaving'),
469        required = False,
470        readonly = False,
471        )
472
473    employer2 = schema.TextLine(
474        title = _(u'2nd Employer'),
475        required = False,
476        readonly = False,
477        )
478
479    emp2_position = schema.TextLine(
480        title = _(u'2nd Employer Position'),
481        required = False,
482        readonly = False,
483        )
484
485    emp2_start = FormattedDate(
486        title = _(u'Start Date'),
487        required = False,
488        readonly = False,
489        show_year = True,
490        )
491
492    emp2_end = FormattedDate(
493        title = _(u'End Date'),
494        required = False,
495        readonly = False,
496        show_year = True,
497        )
498
499    emp2_reason = schema.TextLine(
500        title = _(u'Reason for Leaving'),
501        required = False,
502        readonly = False,
503        )
504
505    former_matric = schema.TextLine(
506        title = _(u'If yes, matric number'),
507        required = False,
508        readonly = False,
509        )
510
511    notice = schema.Text(
512        title = _(u'Notice'),
513        required = False,
514        )
515
516
517    master_sheet_number = schema.TextLine(
518        title = _(u'Master Sheet Number'),
519        required = False,
520        readonly = False,
521        )
522
523    screening_venue = schema.TextLine(
524        title = _(u'Screening Venue'),
525        required = False,
526        )
527
528    screening_date = schema.TextLine(
529        title = _(u'Screening Date'),
530        required = False,
531        )
532
533    screening_score = schema.Int(
534        title = _(u'Screening Points'),
535        required = False,
536        )
537
538    student_id = schema.TextLine(
539        title = _(u'Student Id'),
540        required = False,
541        readonly = False,
542        )
543
544    course_admitted = schema.Choice(
545        title = _(u'Admitted Course of Study'),
546        source = CertificateSource(),
547        required = False,
548        )
549
550    locked = schema.Bool(
551        title = _(u'Form locked'),
552        default = False,
553        )
554
555    @invariant
556    def course_choice(applicant):
557        if applicant.course1 == applicant.course2:
558            raise Invalid(_("2nd choice course must differ from 1st choice course."))
559        if applicant.course1 == applicant.course3:
560            raise Invalid(_("3rd choice course must differ from 1st choice course."))
561        if applicant.course2 == applicant.course3:
562            raise Invalid(_("3rd choice course must differ from 2nd choice course."))
563
564#ICustomUGApplicant['programme_type'].order = IApplicantBaseData[
565#    'reg_number'].order
566
567
568class ICustomPGApplicant(IApplicantBaseData):
569    """A postgraduate applicant.
570
571    This interface defines the least common multiple of all fields
572    in pg application forms. In customized forms, fields can be excluded by
573    adding them to the PG_OMIT* tuples.
574    """
575
576    nationality = schema.Choice(
577        source = nats_vocab,
578        title = _(u'Nationality'),
579        required = True,
580        )
581    lga = schema.Choice(
582        source = LGASource(),
583        title = _(u'State/LGA (Nigerians only)'),
584        required = False,
585        )
586    #perm_address = schema.Text(
587    #    title = _(u'Permanent Address'),
588    #    required = False,
589    #    )
590    course1 = schema.Choice(
591        title = _(u'1st Choice Course of Study'),
592        source = AppCatCertificateSource(),
593        required = True,
594        )
595    course2 = schema.Choice(
596        title = _(u'2nd Choice Course of Study'),
597        source = AppCatCertificateSource(),
598        required = False,
599        )
600    abstract = schema.Text(
601        title = _(u'Abstract'),
602        description = _(u'Brief abstract of intended project/research work'),
603        required = False,
604        )
605    fst_sit_fname = schema.TextLine(
606        title = _(u'Full Name'),
607        required = False,
608        readonly = False,
609        )
610    fst_sit_no = schema.TextLine(
611        title = _(u'Exam Number'),
612        required = False,
613        readonly = False,
614        )
615    fst_sit_date = FormattedDate(
616        title = _(u'Exam Date'),
617        required = False,
618        readonly = False,
619        show_year = True,
620        )
621    fst_sit_type = schema.Choice(
622        title = _(u'Exam Type'),
623        required = False,
624        readonly = False,
625        vocabulary = exam_types,
626        )
627    fst_sit_results = schema.List(
628        title = _(u'Exam Results'),
629        value_type = ResultEntryField(),
630        required = False,
631        readonly = False,
632        defaultFactory=list,
633        )
634    scd_sit_fname = schema.TextLine(
635        title = _(u'Full Name'),
636        required = False,
637        readonly = False,
638        )
639    scd_sit_no = schema.TextLine(
640        title = _(u'Exam Number'),
641        required = False,
642        readonly = False,
643        )
644    scd_sit_date = FormattedDate(
645        title = _(u'Exam Date'),
646        required = False,
647        readonly = False,
648        show_year = True,
649        )
650    scd_sit_type = schema.Choice(
651        title = _(u'Exam Type'),
652        required = False,
653        readonly = False,
654        vocabulary = exam_types,
655        )
656    scd_sit_results = schema.List(
657        title = _(u'Exam Results'),
658        value_type = ResultEntryField(),
659        required = False,
660        readonly = False,
661        defaultFactory=list,
662        )
663    hq_type = schema.Choice(
664        title = _(u'Qualification Obtained'),
665        required = False,
666        readonly = False,
667        vocabulary = high_qual,
668        )
669    hq_fname = schema.TextLine(
670        title = _(u'Full Name'),
671        required = False,
672        readonly = False,
673        )
674    hq_matric_no = schema.TextLine(
675        title = _(u'Former Matric Number'),
676        required = False,
677        readonly = False,
678        )
679    hq_degree = schema.Choice(
680        title = _(u'Class of Degree'),
681        required = False,
682        readonly = False,
683        vocabulary = high_grade,
684        )
685    hq_school = schema.TextLine(
686        title = _(u'Institution Attended'),
687        required = False,
688        readonly = False,
689        )
690    hq_session = schema.TextLine(
691        title = _(u'Years Attended'),
692        required = False,
693        readonly = False,
694        )
695    hq_disc = schema.TextLine(
696        title = _(u'Discipline'),
697        required = False,
698        readonly = False,
699        )
700    hq_type2 = schema.Choice(
701        title = _(u'Qualification Obtained'),
702        required = False,
703        readonly = False,
704        vocabulary = high_qual,
705        )
706
707    hq_fname2 = schema.TextLine(
708        title = _(u'Full Name'),
709        required = False,
710        readonly = False,
711        )
712
713    hq_matric_no2 = schema.TextLine(
714        title = _(u'Former Matric Number'),
715        required = False,
716        readonly = False,
717        )
718
719    hq_degree2 = schema.Choice(
720        title = _(u'Class of Degree'),
721        required = False,
722        readonly = False,
723        vocabulary = high_grade,
724        )
725
726    hq_school2 = schema.TextLine(
727        title = _(u'Institution Attended'),
728        required = False,
729        readonly = False,
730        )
731
732    hq_session2 = schema.TextLine(
733        title = _(u'Years Attended'),
734        required = False,
735        readonly = False,
736        )
737
738    hq_disc2 = schema.TextLine(
739        title = _(u'Discipline'),
740        required = False,
741        readonly = False,
742        )
743
744    hq_type3 = schema.Choice(
745        title = _(u'Qualification Obtained'),
746        required = False,
747        readonly = False,
748        vocabulary = high_qual,
749        )
750
751    hq_fname3 = schema.TextLine(
752        title = _(u'Full Name'),
753        required = False,
754        readonly = False,
755        )
756
757    hq_matric_no3 = schema.TextLine(
758        title = _(u'Former Matric Number'),
759        required = False,
760        readonly = False,
761        )
762
763    hq_degree3 = schema.Choice(
764        title = _(u'Class of Degree'),
765        required = False,
766        readonly = False,
767        vocabulary = high_grade,
768        )
769
770    hq_school3 = schema.TextLine(
771        title = _(u'Institution Attended'),
772        required = False,
773        readonly = False,
774        )
775
776    hq_session3 = schema.TextLine(
777        title = _(u'Years Attended'),
778        required = False,
779        readonly = False,
780        )
781
782    hq_disc3 = schema.TextLine(
783        title = _(u'Discipline'),
784        required = False,
785        readonly = False,
786        )
787
788    hq_type4 = schema.Choice(
789        title = _(u'Qualification Obtained'),
790        required = False,
791        readonly = False,
792        vocabulary = high_qual,
793        )
794
795    hq_fname4 = schema.TextLine(
796        title = _(u'Full Name'),
797        required = False,
798        readonly = False,
799        )
800
801    hq_matric_no4 = schema.TextLine(
802        title = _(u'Former Matric Number'),
803        required = False,
804        readonly = False,
805        )
806
807    hq_degree4 = schema.Choice(
808        title = _(u'Class of Degree'),
809        required = False,
810        readonly = False,
811        vocabulary = high_grade,
812        )
813
814    hq_school4 = schema.TextLine(
815        title = _(u'Institution Attended'),
816        required = False,
817        readonly = False,
818        )
819
820    hq_session4 = schema.TextLine(
821        title = _(u'Years Attended'),
822        required = False,
823        readonly = False,
824        )
825
826    hq_disc4 = schema.TextLine(
827        title = _(u'Discipline'),
828        required = False,
829        readonly = False,
830        )
831    presently_inst = schema.TextLine(
832        title = _(u'If yes, name of institution'),
833        required = False,
834        readonly = False,
835        )
836    nysc_year = schema.Int(
837        title = _(u'Nysc Year'),
838        required = False,
839        readonly = False,
840        )
841    nysc_lga = schema.Choice(
842        source = LGASource(),
843        title = _(u'Nysc Location'),
844        description = _(u'Leave blank for exception letters.'),
845        required = False,
846        )
847    employer = schema.TextLine(
848        title = _(u'Employer'),
849        required = False,
850        readonly = False,
851        )
852    emp_position = schema.TextLine(
853        title = _(u'Employer Position'),
854        required = False,
855        readonly = False,
856        )
857    emp_start = FormattedDate(
858        title = _(u'Start Date'),
859        required = False,
860        readonly = False,
861        show_year = True,
862        )
863    emp_end = FormattedDate(
864        title = _(u'End Date'),
865        required = False,
866        readonly = False,
867        show_year = True,
868        )
869    emp_reason = schema.TextLine(
870        title = _(u'Reason for Leaving'),
871        required = False,
872        readonly = False,
873        )
874    employer2 = schema.TextLine(
875        title = _(u'2nd Employer'),
876        required = False,
877        readonly = False,
878        )
879    emp2_position = schema.TextLine(
880        title = _(u'2nd Employer Position'),
881        required = False,
882        readonly = False,
883        )
884    emp2_start = FormattedDate(
885        title = _(u'Start Date'),
886        required = False,
887        readonly = False,
888        show_year = True,
889        )
890    emp2_end = FormattedDate(
891        title = _(u'End Date'),
892        required = False,
893        readonly = False,
894        show_year = True,
895        )
896    emp2_reason = schema.TextLine(
897        title = _(u'Reason for Leaving'),
898        required = False,
899        readonly = False,
900        )
901    former_matric = schema.TextLine(
902        title = _(u'If yes, matric number'),
903        required = False,
904        readonly = False,
905        )
906    notice = schema.Text(
907        title = _(u'Notice'),
908        required = False,
909        readonly = False,
910        )
911    screening_venue = schema.TextLine(
912        title = _(u'Screening Venue'),
913        required = False,
914        )
915    screening_date = schema.TextLine(
916        title = _(u'Screening Date'),
917        required = False,
918        )
919    screening_score = schema.Float(
920        title = _(u'Screening Score (%)'),
921        required = False,
922        )
923    student_id = schema.TextLine(
924        title = _(u'Student Id'),
925        required = False,
926        readonly = False,
927        )
928    course_admitted = schema.Choice(
929        title = _(u'Admitted Course of Study'),
930        source = CertificateSource(),
931        required = False,
932        readonly = False,
933        )
934    locked = schema.Bool(
935        title = _(u'Form locked'),
936        default = False,
937        required = False,
938        )
939
940    referees = schema.List(
941        title = _(u'Referees'),
942        value_type = RefereeEntryField(),
943        description = _(u'Maximum 3 referees'),
944        required = True,
945        defaultFactory=list,
946        )
947
948class ITranscriptApplicant(IKofaObject):
949    """A transcript applicant.
950    """
951
952    suspended = schema.Bool(
953        title = _(u'Account suspended'),
954        default = False,
955        required = False,
956        )
957
958    locked = schema.Bool(
959        title = _(u'Form locked'),
960        default = False,
961        required = False,
962        )
963
964    applicant_id = schema.TextLine(
965        title = _(u'Application Id'),
966        required = False,
967        readonly = False,
968        )
969
970    reg_number = TextLineChoice(
971        title = _(u'Kofa Registration Number'),
972        readonly = False,
973        required = True,
974        source = contextual_reg_num_source,
975        )
976
977    firstname = schema.TextLine(
978        title = _(u'First Name'),
979        required = True,
980        )
981
982    middlename = schema.TextLine(
983        title = _(u'Middle Name'),
984        required = False,
985        )
986
987    lastname = schema.TextLine(
988        title = _(u'Last Name (Surname)'),
989        required = True,
990        )
991
992    matric_number = schema.TextLine(
993        title = _(u'Matriculation Number'),
994        readonly = False,
995        required = True,
996        )
997
998    date_of_birth = FormattedDate(
999        title = _(u'Date of Birth'),
1000        required = False,
1001        #date_format = u'%d/%m/%Y', # Use grok-instance-wide default
1002        show_year = True,
1003        )
1004
1005    sex = schema.Choice(
1006        title = _(u'Gender'),
1007        source = GenderSource(),
1008        required = True,
1009        )
1010
1011    place_of_birth = schema.TextLine(
1012        title = _(u'Place of Birth'),
1013        readonly = False,
1014        required = False,
1015        )
1016
1017    nationality = schema.Choice(
1018        vocabulary = nats_vocab,
1019        title = _(u'Nationality'),
1020        required = False,
1021        )
1022
1023    email = schema.ASCIILine(
1024        title = _(u'Email Address'),
1025        required = True,
1026        constraint=validate_email,
1027        )
1028
1029    phone = PhoneNumber(
1030        title = _(u'Phone'),
1031        description = u'',
1032        required = False,
1033        )
1034
1035    perm_address = schema.Text(
1036        title = _(u'Current Local Address'),
1037        required = False,
1038        readonly = False,
1039        )
1040
1041    dispatch_address = schema.Text(
1042        title = _(u'Dispatch Addresses'),
1043        description = u'Addresses to which transcript should be posted.',
1044        required = False,
1045        readonly = False,
1046        )
1047
1048    entry_mode = schema.Choice(
1049        title = _(u'Entry Mode'),
1050        source = StudyModeSource(),
1051        required = False,
1052        readonly = False,
1053        )
1054
1055    entry_session = schema.Choice(
1056        title = _(u'Entry Session'),
1057        source = academic_sessions_vocab,
1058        required = False,
1059        readonly = False,
1060        )
1061
1062    end_session = schema.Choice(
1063        title = _(u'End Session'),
1064        source = academic_sessions_vocab,
1065        required = False,
1066        readonly = False,
1067        )
1068
1069    course_studied = schema.Choice(
1070        title = _(u'Course of Study / Degree'),
1071        source = CertificateSource(),
1072        required = False,
1073        readonly = False,
1074        )
1075
1076    purpose = schema.TextLine(
1077        title = _(u'Purpose of this Application'),
1078        readonly = False,
1079        required = False,
1080        )
1081
1082    course_changed = schema.Choice(
1083        title = _(u'Change of Study Course'),
1084        description = u'If yes, select previous course of study.',
1085        source = CertificateSource(),
1086        readonly = False,
1087        required = False,
1088        )
1089
1090    change_level = schema.Choice(
1091        title = _(u'Change Level'),
1092        description = u'If yes, select level at which you changed course of study.',
1093        source = StudyLevelSource(),
1094        required = False,
1095        readonly = False,
1096        )
1097
1098    no_copies = schema.Choice(
1099        title = _(u'Number of Copies'),
1100        description = u'Must correspond with the number of dispatch addresses above.',
1101        values=[1, 2, 3, 4],
1102        required = False,
1103        readonly = False,
1104        default = 1,
1105        )
1106
1107class ICertificateRequest(IKofaObject):
1108    """A transcript applicant.
1109    """
1110
1111    suspended = schema.Bool(
1112        title = _(u'Account suspended'),
1113        default = False,
1114        required = False,
1115        )
1116
1117    locked = schema.Bool(
1118        title = _(u'Form locked'),
1119        default = False,
1120        required = False,
1121        )
1122
1123    applicant_id = schema.TextLine(
1124        title = _(u'Application Id'),
1125        required = False,
1126        readonly = False,
1127        )
1128
1129    reg_number = TextLineChoice(
1130        title = _(u'Kofa Registration Number'),
1131        readonly = False,
1132        required = True,
1133        source = contextual_reg_num_source,
1134        )
1135
1136    firstname = schema.TextLine(
1137        title = _(u'First Name'),
1138        required = True,
1139        )
1140
1141    middlename = schema.TextLine(
1142        title = _(u'Middle Name'),
1143        required = False,
1144        )
1145
1146    lastname = schema.TextLine(
1147        title = _(u'Last Name (Surname)'),
1148        required = True,
1149        )
1150
1151    matric_number = schema.TextLine(
1152        title = _(u'Matriculation Number'),
1153        readonly = False,
1154        required = True,
1155        )
1156
1157    date_of_birth = FormattedDate(
1158        title = _(u'Date of Birth'),
1159        required = False,
1160        #date_format = u'%d/%m/%Y', # Use grok-instance-wide default
1161        show_year = True,
1162        )
1163
1164    sex = schema.Choice(
1165        title = _(u'Gender'),
1166        source = GenderSource(),
1167        required = True,
1168        )
1169
1170    place_of_birth = schema.TextLine(
1171        title = _(u'Place of Birth'),
1172        readonly = False,
1173        required = False,
1174        )
1175
1176    nationality = schema.Choice(
1177        vocabulary = nats_vocab,
1178        title = _(u'Nationality'),
1179        required = False,
1180        )
1181
1182    email = schema.ASCIILine(
1183        title = _(u'Email Address'),
1184        required = True,
1185        constraint=validate_email,
1186        )
1187
1188    phone = PhoneNumber(
1189        title = _(u'Phone'),
1190        description = u'',
1191        required = False,
1192        )
1193
1194    entry_session = schema.Choice(
1195        title = _(u'Entry Session'),
1196        source = academic_sessions_vocab,
1197        required = False,
1198        readonly = False,
1199        )
1200
1201    end_session = schema.Choice(
1202        title = _(u'End Session'),
1203        source = academic_sessions_vocab,
1204        required = False,
1205        readonly = False,
1206        )
1207
1208    course_studied = schema.Choice(
1209        title = _(u'Course of Study / Degree'),
1210        source = CertificateSource(),
1211        required = True,
1212        readonly = False,
1213        )
1214
1215    certificate_type = schema.Choice(
1216        title = _(u'Certificate Type'),
1217        vocabulary = certificate_types_vocab,
1218        required = False,
1219        )
1220
1221
1222class IVerificationRequest(IKofaObject):
1223    """A applicant asking for verification.
1224    """
1225
1226    suspended = schema.Bool(
1227        title = _(u'Account suspended'),
1228        default = False,
1229        required = False,
1230        )
1231
1232    locked = schema.Bool(
1233        title = _(u'Form locked'),
1234        default = False,
1235        required = False,
1236        )
1237
1238    applicant_id = schema.TextLine(
1239        title = _(u'Application Id'),
1240        required = False,
1241        readonly = False,
1242        )
1243
1244    #reg_number = TextLineChoice(
1245    #    title = _(u'Kofa Registration Number'),
1246    #    readonly = False,
1247    #    required = True,
1248    #    source = contextual_reg_num_source,
1249    #    )
1250
1251    firstname = schema.TextLine(
1252        title = _(u'First Name'),
1253        required = True,
1254        )
1255
1256    middlename = schema.TextLine(
1257        title = _(u'Middle Name'),
1258        required = False,
1259        )
1260
1261    lastname = schema.TextLine(
1262        title = _(u'Last Name (Surname)'),
1263        required = True,
1264        )
1265
1266    sex = schema.Choice(
1267        title = _(u'Gender'),
1268        source = GenderSource(),
1269        required = True,
1270        )
1271
1272    email = schema.ASCIILine(
1273        title = _(u'Email Address'),
1274        required = True,
1275        constraint=validate_email,
1276        )
1277
1278    phone = PhoneNumber(
1279        title = _(u'Phone'),
1280        description = u'',
1281        required = False,
1282        )
1283
1284    matric_number = schema.TextLine(
1285        title = _(u'Verification Body Reference Number'),
1286        readonly = False,
1287        required = True,
1288        )
1289
1290    body_address = schema.Text(
1291        title = _(u'Verification Body Address'),
1292        required = True,
1293        )
1294
1295    document_type = schema.Choice(
1296        title = _(u'Document Type'),
1297        vocabulary = document_types_vocab,
1298        required = True,
1299        )
1300
1301class IFedexRequest(IKofaObject):
1302    """A applicant requests payment for courier.
1303    """
1304
1305    suspended = schema.Bool(
1306        title = _(u'Account suspended'),
1307        default = False,
1308        required = False,
1309        )
1310
1311    locked = schema.Bool(
1312        title = _(u'Form locked'),
1313        default = False,
1314        required = False,
1315        )
1316
1317    applicant_id = schema.TextLine(
1318        title = _(u'Application Id'),
1319        required = False,
1320        readonly = False,
1321        )
1322
1323    trans_id = schema.TextLine(
1324        title = _(u'Transcript Application Id'),
1325        required = True,
1326        readonly = False,
1327        #description = u'This serve as a unique identifier which '
1328        #               'allows the the officer to verify the transcript '
1329        #               'in order to avoid errors before dispatch.',
1330        )
1331
1332    #reg_number = TextLineChoice(
1333    #    title = _(u'Kofa Registration Number'),
1334    #    readonly = False,
1335    #    required = True,
1336    #    source = contextual_reg_num_source,
1337    #    )
1338
1339    firstname = schema.TextLine(
1340        title = _(u'First Name'),
1341        required = True,
1342        )
1343
1344    middlename = schema.TextLine(
1345        title = _(u'Middle Name'),
1346        required = False,
1347        )
1348
1349    lastname = schema.TextLine(
1350        title = _(u'Last Name (Surname)'),
1351        required = True,
1352        )
1353
1354    sex = schema.Choice(
1355        title = _(u'Gender'),
1356        source = GenderSource(),
1357        required = True,
1358        )
1359
1360    email = schema.ASCIILine(
1361        title = _(u'Email Address'),
1362        required = True,
1363        constraint=validate_email,
1364        )
1365
1366    phone = PhoneNumber(
1367        title = _(u'Phone'),
1368        description = u'',
1369        required = False,
1370        )
1371
1372    matric_number = schema.TextLine(
1373        title = _(u'WES Reference Number (where applicable)'),
1374        readonly = False,
1375        required = False,
1376        )
1377
1378    dispatch_address = schema.Text(
1379        title = _(u'Dispatch Address'),
1380        required = True,
1381        )
1382
1383class IRecruitment(IKofaObject):
1384    """A recruitment application.
1385    """
1386
1387    suspended = schema.Bool(
1388        title = _(u'Account suspended'),
1389        default = False,
1390        required = False,
1391        )
1392
1393    locked = schema.Bool(
1394        title = _(u'Form locked'),
1395        default = False,
1396        required = False,
1397        )
1398
1399    applicant_id = schema.TextLine(
1400        title = _(u'Application Id'),
1401        required = False,
1402        readonly = False,
1403        )
1404
1405    #reg_number = TextLineChoice(
1406    #    title = _(u'Kofa Registration Number'),
1407    #    readonly = False,
1408    #    required = True,
1409    #    source = contextual_reg_num_source,
1410    #    )
1411
1412    application_types = schema.Choice(
1413        title = _(u'Application Category'),
1414        vocabulary = application_types_vocab,
1415        required = True,
1416        )
1417
1418    position_comment = schema.Text(
1419        title = _(u'Desired Position'),
1420        required = True,
1421        description = u'Copy and paste the vacant position '
1422                       'text from the <a target="_blank" '
1423                       'href="https://aauekpoma.edu.ng/">university website</a>.',
1424        )
1425
1426    firstname = schema.TextLine(
1427        title = _(u'First Name'),
1428        required = True,
1429        )
1430
1431    middlename = schema.TextLine(
1432        title = _(u'Middle Name'),
1433        required = False,
1434        )
1435
1436    lastname = schema.TextLine(
1437        title = _(u'Last Name (Surname)'),
1438        required = True,
1439        )
1440
1441    sex = schema.Choice(
1442        title = _(u'Gender'),
1443        source = GenderSource(),
1444        required = True,
1445        )
1446
1447    email = schema.ASCIILine(
1448        title = _(u'Email Address'),
1449        required = True,
1450        constraint=validate_email,
1451        )
1452
1453    phone = PhoneNumber(
1454        title = _(u'Phone'),
1455        description = u'',
1456        required = False,
1457        )
1458
1459    address = schema.Text(
1460        title = _(u'Address'),
1461        required = True,
1462        )
1463
1464class ISendByEmailRequest(IKofaObject):
1465    """A applicant asking for sending an email.
1466    """
1467
1468    suspended = schema.Bool(
1469        title = _(u'Account suspended'),
1470        default = False,
1471        required = False,
1472        )
1473
1474    locked = schema.Bool(
1475        title = _(u'Form locked'),
1476        default = False,
1477        required = False,
1478        )
1479
1480    applicant_id = schema.TextLine(
1481        title = _(u'Applicant Id'),
1482        required = False,
1483        readonly = False,
1484        )
1485
1486    firstname = schema.TextLine(
1487        title = _(u'First Name'),
1488        required = True,
1489        )
1490
1491    middlename = schema.TextLine(
1492        title = _(u'Middle Name'),
1493        required = False,
1494        )
1495
1496    lastname = schema.TextLine(
1497        title = _(u'Last Name (Surname)'),
1498        required = True,
1499        )
1500
1501    sex = schema.Choice(
1502        title = _(u'Gender'),
1503        source = GenderSource(),
1504        required = True,
1505        )
1506
1507    email = schema.ASCIILine(
1508        title = _(u"Applicant's Email Address"),
1509        required = True,
1510        constraint=validate_email,
1511        )
1512
1513    phone = PhoneNumber(
1514        title = _(u'Phone'),
1515        description = u'',
1516        required = False,
1517        )
1518
1519    body_address = schema.Text(
1520        title = _(u'Address of Requesting Organization'),
1521        required = True,
1522        )
1523
1524    body_email = schema.ASCIILine(
1525        title = _(u"Email Address of Requesting Organization"),
1526        required = True,
1527        constraint=validate_email,
1528        )
1529
1530    request_type = schema.Choice(
1531        title = _(u'Request Type'),
1532        vocabulary = request_types_vocab,
1533        required = True,
1534        )
1535
1536    document_type = schema.Choice(
1537        title = _(u'Document Type'),
1538        vocabulary = document_types_vocab,
1539        required = True,
1540        )
1541
1542class ICustomApplicant(ICustomUGApplicant, ICustomPGApplicant,
1543                       ITranscriptApplicant, ICertificateRequest,
1544                       IVerificationRequest, ISendByEmailRequest,
1545                       IFedexRequest, IRecruitment):
1546    """An interface for all types of applicants.
1547
1548    Attention: The ICustomPGApplicant field seetings will be overwritten
1549    by ICustomPGApplicant field settings. If a field is defined
1550    in both interfaces zope.schema validates only against the
1551    constraints in ICustomUGApplicant. This does not affect the forms
1552    since they are build on either ICustomUGApplicant or ICustomPGApplicant.
1553    """
1554
1555    def writeLogMessage(view, comment):
1556        """Adds an INFO message to the log file
1557        """
1558
1559    def createStudent():
1560        """Create a student object from applicatnt data
1561        and copy applicant object.
1562        """
1563
1564class ICustomUGApplicantEdit(ICustomUGApplicant):
1565    """An undergraduate applicant interface for edit forms.
1566
1567    Here we can repeat the fields from base data and set the
1568    `required` and `readonly` attributes to True to further restrict
1569    the data access. Or we can allow only certain certificates to be
1570    selected by choosing the appropriate source.
1571
1572    We cannot omit fields here. This has to be done in the
1573    respective form page.
1574    """
1575
1576    #programme_type = schema.Choice(
1577    #    title = _(u'Programme Type'),
1578    #    vocabulary = programme_types_vocab,
1579    #    required = True,
1580    #    )
1581
1582    date_of_birth = FormattedDate(
1583        title = _(u'Date of Birth'),
1584        required = True,
1585        show_year = True,
1586        )
1587
1588    course1 = schema.Choice(
1589        title = _(u'1st Choice Course of Study'),
1590        source = AppCatCertificateSource(),
1591        required = True,
1592        )
1593
1594    course2 = schema.Choice(
1595        title = _(u'2nd Choice Course of Study'),
1596        source = AppCatCertificateSource(),
1597        required = True,
1598        )
1599
1600    course3 = schema.Choice(
1601        title = _(u'3rd Choice Course of Study'),
1602        source = AppCatCertificateSource(),
1603        required = True,
1604        )
1605
1606    fst_sit_fname = schema.TextLine(
1607        title = _(u'Full Name'),
1608        required = True,
1609        readonly = False,
1610        )
1611
1612    fst_sit_no = schema.TextLine(
1613        title = _(u'Exam Number'),
1614        required = True,
1615        readonly = False,
1616        )
1617
1618    fst_sit_sc_pin = schema.TextLine(
1619        title = _(u'Scratch Card Pin'),
1620        required = True,
1621        readonly = False,
1622        )
1623
1624    fst_sit_sc_serial_number = schema.TextLine(
1625        title = _(u'Scratch Card Serial Number'),
1626        required = True,
1627        readonly = False,
1628        )
1629
1630    fst_sit_date = FormattedDate(
1631        title = _(u'Exam Date'),
1632        required = True,
1633        readonly = False,
1634        show_year = True,
1635        )
1636
1637    fst_sit_type = schema.Choice(
1638        title = _(u'Exam Type'),
1639        required = True,
1640        readonly = False,
1641        vocabulary = exam_types,
1642        )
1643
1644    # course1 works only on manage pages. On edit pages course1 input is missing
1645    # and no Invalid exception is raised.
1646    # NoInputData: NoInputD...course1'
1647    # Therefore, we check and compare course1 on CustomApplicantEditFormPage.
1648    @invariant
1649    def course_choice(applicant):
1650        if applicant.course2 == applicant.course3:
1651            raise Invalid(_("3rd choice course must differ from 2nd choice course."))
1652
1653#ICustomUGApplicantEdit['programme_type'].order = ICustomUGApplicant[
1654#    'programme_type'].order
1655ICustomUGApplicantEdit['date_of_birth'].order = ICustomUGApplicant[
1656    'date_of_birth'].order
1657ICustomUGApplicantEdit['course1'].order = ICustomUGApplicant[
1658    'course1'].order
1659ICustomUGApplicantEdit['course2'].order = ICustomUGApplicant[
1660    'course2'].order
1661ICustomUGApplicantEdit['course3'].order = ICustomUGApplicant[
1662    'course3'].order
1663ICustomUGApplicantEdit['fst_sit_fname'].order = ICustomUGApplicant[
1664    'fst_sit_fname'].order
1665ICustomUGApplicantEdit['fst_sit_no'].order = ICustomUGApplicant[
1666    'fst_sit_no'].order
1667ICustomUGApplicantEdit['fst_sit_sc_pin'].order = ICustomUGApplicant[
1668    'fst_sit_sc_pin'].order
1669ICustomUGApplicantEdit['fst_sit_sc_serial_number'].order = ICustomUGApplicant[
1670    'fst_sit_sc_serial_number'].order
1671ICustomUGApplicantEdit['fst_sit_date'].order = ICustomUGApplicant[
1672    'fst_sit_date'].order
1673ICustomUGApplicantEdit['fst_sit_type'].order = ICustomUGApplicant[
1674    'fst_sit_type'].order
1675
1676class ICustomPGApplicantEdit(ICustomPGApplicant):
1677    """A postgraduate applicant interface for editing.
1678
1679    Here we can repeat the fields from base data and set the
1680    `required` and `readonly` attributes to True to further restrict
1681    the data access. Or we can allow only certain certificates to be
1682    selected by choosing the appropriate source.
1683
1684    We cannot omit fields here. This has to be done in the
1685    respective form page.
1686    """
1687
1688    email = schema.ASCIILine(
1689        title = _(u'Email Address'),
1690        required = True,
1691        constraint=validate_email,
1692        )
1693    date_of_birth = FormattedDate(
1694        title = _(u'Date of Birth'),
1695        required = True,
1696        show_year = True,
1697        )
1698
1699ICustomPGApplicantEdit[
1700    'date_of_birth'].order =  ICustomPGApplicant['date_of_birth'].order
1701ICustomPGApplicantEdit[
1702    'email'].order =  ICustomPGApplicant['email'].order
1703
1704class ICustomApplicantOnlinePayment(INigeriaApplicantOnlinePayment):
1705    """An applicant payment via payment gateways.
1706
1707    """
1708
1709class IPUTMEApplicantEdit(IPUTMEApplicantEdit):
1710    """An undergraduate applicant interface for editing.
1711
1712    Here we can repeat the fields from base data and set the
1713    `required` and `readonly` attributes to True to further restrict
1714    the data access. Or we can allow only certain certificates to be
1715    selected by choosing the appropriate source.
1716
1717    We cannot omit fields here. This has to be done in the
1718    respective form page.
1719    """
1720
1721class ICustomApplicantUpdateByRegNo(ICustomApplicant):
1722    """Representation of an applicant.
1723
1724    Skip regular reg_number validation if reg_number is used for finding
1725    the applicant object.
1726    """
1727
1728    reg_number = schema.TextLine(
1729        title = u'Registration Number',
1730        required = False,
1731        )
1732
1733class ICustomApplicantRefereeReport(IApplicantRefereeReport):
1734    """A referee report.
1735    """
1736
1737    referee_rank = schema.TextLine(
1738        title = _(u'Referee Rank or Profession'),
1739        required = False,
1740        )
1741
1742    referee_inst = schema.TextLine(
1743        title = _(u'Referee Institution/University'),
1744        required = False,
1745        )
1746
1747    duration = schema.Text(
1748        title = _(u'How long and in what capacity have you known the candidate?'),
1749        required = False,
1750        )
1751
1752    itellectual = schema.Choice(
1753        title = _(u'Intellectual Capacity'),
1754        required = False,
1755        readonly = False,
1756        vocabulary = rating_vocab,
1757        )
1758
1759    persistent = schema.Choice(
1760        title = _(u'Capacity for Persistent and Independent Academic Study'),
1761        required = False,
1762        readonly = False,
1763        vocabulary = rating_vocab,
1764        )
1765
1766    imaginative = schema.Choice(
1767        title = _(u'Ability for Imaginative Thought'),
1768        required = False,
1769        readonly = False,
1770        vocabulary = rating_vocab,
1771        )
1772
1773    productive = schema.Choice(
1774        title = _(u'Promise of Productive Scholarship'),
1775        required = False,
1776        readonly = False,
1777        vocabulary = rating_vocab,
1778        )
1779
1780    previous = schema.Choice(
1781        title = _(u'Quality of Previous Work'),
1782        required = False,
1783        readonly = False,
1784        vocabulary = rating_vocab,
1785        )
1786
1787    expression = schema.Choice(
1788        title = _(u'Oral and Written Expression in English'),
1789        required = False,
1790        readonly = False,
1791        vocabulary = rating_vocab,
1792        )
1793
1794    personality = schema.Text(
1795        title = _(u'Please comment on the candidate\'s personality '
1796            'with particular reference to his/her moral character, emotional '
1797            'and physical stabilty'),
1798        required = False,
1799        )
1800
1801    #promise = schema.Choice(
1802    #    title = _(u'Candidate\'s overall promise'),
1803    #    required = False,
1804    #    readonly = False,
1805    #    vocabulary = overallpromise_vocab,
1806    #    )
1807
1808    report = schema.Text(
1809        title = _(u'Any other relevant information which would help '
1810            'in determining the candidate\'s suitability?'),
1811        required = False,
1812        )
1813
1814    objection = schema.Text(
1815        title = _(u'Have you any objection to the contents of this '
1816            'evaluation being disclosed to any award-given body if '
1817            'the need arises?'),
1818        required = False,
1819        )
1820
Note: See TracBrowser for help on using the repository browser.