source: main/kofacustom.iuokada/trunk/src/kofacustom/iuokada/applicants/interfaces.py @ 16538

Last change on this file since 16538 was 16533, checked in by Henrik Bettermann, 4 years ago

Add jamb name field.

  • Property svn:keywords set to Id
File size: 24.5 KB
Line 
1# -*- coding: utf-8 -*-
2## $Id: interfaces.py 16533 2021-07-08 09:14:04Z 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
22from zope import schema
23from zope.component import getUtility
24from zope.catalog.interfaces import ICatalog
25from zc.sourcefactory.basic import BasicSourceFactory
26from waeup.kofa.applicants.interfaces import (
27    IApplicantBaseData,
28    AppCatCertificateSource, CertificateSource)
29from waeup.kofa.schoolgrades import ResultEntryField
30from waeup.kofa.university.vocabularies import StudyModeSource
31from waeup.kofa.interfaces import (
32    SimpleKofaVocabulary, academic_sessions_vocab, validate_email,
33    IKofaObject)
34from waeup.kofa.schema import FormattedDate, TextLineChoice, PhoneNumber
35from waeup.kofa.students.vocabularies import (
36    nats_vocab, GenderSource, StudyLevelSource)
37from waeup.kofa.applicants.interfaces import (
38    contextual_reg_num_source, IApplicantBaseData, IApplicantRefereeReport,
39    contextual_email_source, IApplicantRegisterUpdate)
40from waeup.kofa.refereeentries import RefereeEntryField
41from kofacustom.nigeria.applicants.interfaces import (
42    LGASource, high_qual, high_grade, exam_types, DisabilitiesSource,
43    programme_types_vocab, jambsubjects, validate_jamb_reg_number,
44    INigeriaUGApplicant, INigeriaPGApplicant,
45    INigeriaApplicantOnlinePayment,
46    INigeriaUGApplicantEdit, INigeriaPGApplicantEdit,
47    INigeriaApplicantUpdateByRegNo,
48    IPUTMEApplicantEdit,
49    )
50from kofacustom.iuokada.interfaces import MessageFactory as _
51from kofacustom.iuokada.payments.interfaces import ICustomOnlinePayment
52
53sponsors_vocab = SimpleKofaVocabulary(
54    (_('Bauchi Government'), 'bauchi'),
55    (_('Company'), 'company'),
56    (_('Federal Government of Nigeria'), 'federalgov'),
57    #(_('Dangote Group'), 'dangote'),
58    (_('Kano Government'), 'kano'),
59    (_('Parent/Guardian'), 'parent'),
60    (_('Rosula Organization'), 'rosula'),
61    (_('Self'), 'self'),
62    #(_('Social Impact Project'), 'social'),
63    )
64
65heard_about_types_vocab = SimpleKofaVocabulary(
66    (_('Facebook/Twitter/Other Social Media'), 'socmedia'),
67    (_('From a Friend'), 'friend'),
68    (_('Newspaper Advertisement'), 'newspaper'),
69    (_('Radio Advertisement'), 'radio'),
70    (_('Television Advertisement'), 'television'),
71    (_('SMS'), 'sms'),
72    )
73
74subtype_vocab = SimpleKofaVocabulary(
75    (_('UTME'), 'utme'),
76    (_('Direct Entry'), 'de'),
77    (_('Inter Uni Transfer'), 'transfer'),
78    )
79
80rating_vocab = SimpleKofaVocabulary(
81    (_('Excellent'), 'e'),
82    (_('Very good'), 'vg'),
83    (_('Good'), 'g'),
84    (_('Slightly above average'), 'saa'),
85    (_('Average'), 'a'),
86    (_('Below average'), 'ba'),
87    (_('Unable to assess'), 'unable'),
88    )
89
90
91overallpromise_vocab = SimpleKofaVocabulary(
92    (_('Very good (highest 10%)'), 'vg'),
93    (_('Above average (next 15%)'), 'aa'),
94    (_('Average (middle 20%)'), 'a'),
95    (_('Below average (middle 40%)'), 'ba'),
96    )
97
98DESTINATION_COST = {
99    'local': ('Local (Nigeria)', 15000.0, 1),
100    'overseas': ('Overseas', 25000.0, 2),
101    }
102
103class DestinationCostSource(BasicSourceFactory):
104    """A source that delivers continents and shipment costs.
105    """
106    def getValues(self):
107        sorted_items = sorted(DESTINATION_COST.items(),
108                              key=lambda element: element[1][2])
109        return [item[0] for item in sorted_items]
110
111    def getTitle(self, value):
112        return u"%s (₦ %s)" % (
113            DESTINATION_COST[value][0],
114            DESTINATION_COST[value][1])
115
116class TranscriptCertificateSource(CertificateSource):
117    """Include Department and Faculty in Title.
118    """
119    def getValues(self, context):
120        catalog = getUtility(ICatalog, name='certificates_catalog')
121        resultset = catalog.searchResults(code=(None, None))
122        resultlist = sorted(resultset, key=lambda
123            value: value.__parent__.__parent__.__parent__.code +
124            value.__parent__.__parent__.code +
125            value.code)
126        return resultlist
127
128    def getTitle(self, context, value):
129        """
130        """
131        try: title = "%s / %s / %s (%s)" % (
132            value.__parent__.__parent__.__parent__.title,
133            value.__parent__.__parent__.title,
134            value.title, value.code)
135        except AttributeError:
136            title = "NA / %s (%s)" % (value.title, value.code)
137        return title
138
139class ICustomUGApplicant(IApplicantBaseData):
140    """An undergraduate applicant.
141
142    This interface defines the least common multiple of all fields
143    in ug application forms. In customized forms, fields can be excluded by
144    adding them to the UG_OMIT* tuples.
145    """
146
147    email = TextLineChoice(
148        title = _(u'Email Address'),
149        required = True,
150        constraint=validate_email,
151        source = contextual_email_source,
152        )
153
154    subtype = schema.Choice(
155        title = _(u'Application Subtype'),
156        vocabulary = subtype_vocab,
157        required = False,
158        )
159    disabilities = schema.Choice(
160        title = _(u'Disability'),
161        source = DisabilitiesSource(),
162        required = False,
163        )
164    nationality = schema.Choice(
165        source = nats_vocab,
166        title = _(u'Nationality'),
167        required = False,
168        )
169    lga = schema.Choice(
170        source = LGASource(),
171        title = _(u'State/LGA (Nigerians only)'),
172        required = False,
173        )
174    sponsor = schema.Choice(
175        title = _(u'Sponsor'),
176        vocabulary = sponsors_vocab,
177        required = False,
178        )
179    heard_about = schema.Choice(
180        title = _(u'How did you hear about IUO?'),
181        vocabulary = heard_about_types_vocab,
182        required = False,
183        )
184    perm_address = schema.Text(
185        title = _(u'Residential Address'),
186        required = True,
187        )
188    parents_name = schema.TextLine(
189        title = _(u'Full Name'),
190        required = False,
191        readonly = False,
192        )
193    parents_email = schema.ASCIILine(
194        title = _(u'Email Address'),
195        required = False,
196        constraint=validate_email,
197        )
198    parents_phone = PhoneNumber(
199        title = _(u'Phone'),
200        required = False,
201        )
202    course1 = schema.Choice(
203        title = _(u'1st Choice Course of Study'),
204        source = AppCatCertificateSource(),
205        required = True,
206        )
207    course2 = schema.Choice(
208        title = _(u'2nd Choice Course of Study'),
209        source = AppCatCertificateSource(),
210        required = False,
211        )
212    programme_type = schema.Choice(
213        title = _(u'Programme Type'),
214        vocabulary = programme_types_vocab,
215        required = False,
216        )
217    fst_sit_fname = schema.TextLine(
218        title = _(u'Full Name'),
219        required = False,
220        readonly = False,
221        )
222    fst_sit_no = schema.TextLine(
223        title = _(u'Exam Number'),
224        required = False,
225        readonly = False,
226        )
227    fst_sit_date = FormattedDate(
228        title = _(u'Exam Date'),
229        required = False,
230        readonly = False,
231        show_year = True,
232        )
233    fst_sit_type = schema.Choice(
234        title = _(u'Exam Type'),
235        required = False,
236        readonly = False,
237        vocabulary = exam_types,
238        )
239    fst_sit_results = schema.List(
240        title = _(u'Exam Results'),
241        value_type = ResultEntryField(),
242        required = False,
243        readonly = False,
244        defaultFactory=list,
245        )
246    scd_sit_fname = schema.TextLine(
247        title = _(u'Full Name'),
248        required = False,
249        readonly = False,
250        )
251    scd_sit_no = schema.TextLine(
252        title = _(u'Exam Number'),
253        required = False,
254        readonly = False,
255        )
256    scd_sit_date = FormattedDate(
257        title = _(u'Exam Date'),
258        required = False,
259        readonly = False,
260        show_year = True,
261        )
262    scd_sit_type = schema.Choice(
263        title = _(u'Exam Type'),
264        required = False,
265        readonly = False,
266        vocabulary = exam_types,
267        )
268    scd_sit_results = schema.List(
269        title = _(u'Exam Results'),
270        value_type = ResultEntryField(),
271        required = False,
272        readonly = False,
273        defaultFactory=list,
274        )
275    hq_type = schema.Choice(
276        title = _(u'Qualification Obtained'),
277        required = False,
278        readonly = False,
279        vocabulary = high_qual,
280        )
281    hq_matric_no = schema.TextLine(
282        title = _(u'Former Matric Number'),
283        required = False,
284        readonly = False,
285        )
286    hq_degree = schema.Choice(
287        title = _(u'Class of Degree'),
288        required = False,
289        readonly = False,
290        vocabulary = high_grade,
291        )
292    hq_school = schema.TextLine(
293        title = _(u'Institution Attended'),
294        required = False,
295        readonly = False,
296        )
297    hq_session = schema.TextLine(
298        title = _(u'Years Attended'),
299        required = False,
300        readonly = False,
301        )
302    hq_disc = schema.TextLine(
303        title = _(u'Discipline'),
304        required = False,
305        readonly = False,
306        )
307    jamb_fname = schema.TextLine(
308        title = _(u'Full Name'),
309        required = False,
310        readonly = False,
311        )
312    #jamb_subjects = schema.Text(
313    #    title = _(u'Subjects and Scores'),
314    #    required = False,
315    #    )
316    jamb_subjects_list = schema.List(
317        title = _(u'JAMB Subjects'),
318        required = False,
319        defaultFactory=list,
320        value_type = schema.Choice(
321            vocabulary = jambsubjects
322            #source = JAMBSubjectSource(),
323            ),
324        )
325    jamb_score = schema.Int(
326        title = _(u'Total JAMB Score'),
327        required = False,
328        )
329    #jamb_age = schema.Int(
330    #    title = _(u'Age (provided by JAMB)'),
331    #    required = False,
332    #    )
333    jamb_reg_number = schema.TextLine(
334        title = _(u'JAMB Registration Number'),
335        required = False,
336        constraint=validate_jamb_reg_number,
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    'subtype'].order =  ICustomUGApplicant['lga'].order
382ICustomUGApplicant[
383    'locked'].order =  ICustomUGApplicant['suspended'].order
384ICustomUGApplicant[
385    'result_uploaded'].order =  ICustomUGApplicant['suspended'].order
386
387class ICustomPGApplicant(INigeriaPGApplicant):
388    """A postgraduate applicant.
389
390    This interface defines the least common multiple of all fields
391    in pg application forms. In customized forms, fields can be excluded by
392    adding them to the PG_OMIT* tuples.
393    """
394
395    email = TextLineChoice(
396        title = _(u'Email Address'),
397        required = True,
398        constraint=validate_email,
399        source = contextual_email_source,
400        )
401
402    perm_address = schema.Text(
403        title = _(u'Residential Address'),
404        required = True,
405        )
406
407    sponsor = schema.Choice(
408        title = _(u'Sponsor'),
409        vocabulary = sponsors_vocab,
410        required = False,
411        )
412
413    heard_about = schema.Choice(
414        title = _(u'How did you hear about IU?'),
415        vocabulary = heard_about_types_vocab,
416        required = False,
417        )
418
419    nysc_number = schema.Int(
420        title = _(u'Nysc Number'),
421        required = False,
422        readonly = False,
423        )
424
425    referees = schema.List(
426        title = _(u'Referees'),
427        value_type = RefereeEntryField(),
428        required = False,
429        defaultFactory=list,
430        )
431
432ICustomPGApplicant[
433    'referees'].order =  INigeriaPGApplicant['emp2_reason'].order
434ICustomPGApplicant[
435    'sponsor'].order =  ICustomPGApplicant['lga'].order
436ICustomPGApplicant[
437    'heard_about'].order =  ICustomPGApplicant['lga'].order
438ICustomPGApplicant[
439    'sponsor'].order =  ICustomPGApplicant['lga'].order
440ICustomPGApplicant[
441    'lga'].order =  ICustomPGApplicant['nationality'].order
442ICustomPGApplicant[
443    'nysc_number'].order =  ICustomPGApplicant['nysc_year'].order
444ICustomPGApplicant[
445    'perm_address'].order =  ICustomPGApplicant['lga'].order
446ICustomPGApplicant[
447    'email'].order =  ICustomPGApplicant['lga'].order
448
449class ITranscriptApplicant(IKofaObject):
450    """A transcript applicant.
451    """
452
453    suspended = schema.Bool(
454        title = _(u'Account suspended'),
455        default = False,
456        required = False,
457        )
458
459    locked = schema.Bool(
460        title = _(u'Form locked'),
461        default = False,
462        required = False,
463        )
464
465    applicant_id = schema.TextLine(
466        title = _(u'Transcript Application Id'),
467        required = False,
468        readonly = False,
469        )
470
471    matric_number = schema.TextLine(
472        title = _(u'Matriculation Number'),
473        readonly = False,
474        required = True,
475        )
476
477    firstname = schema.TextLine(
478        title = _(u'First Name'),
479        required = True,
480        )
481
482    middlename = schema.TextLine(
483        title = _(u'Middle Name'),
484        required = False,
485        )
486
487    lastname = schema.TextLine(
488        title = _(u'Last Name (Surname)'),
489        required = True,
490        )
491
492    #date_of_birth = FormattedDate(
493    #    title = _(u'Date of Birth'),
494    #    required = False,
495    #    #date_format = u'%d/%m/%Y', # Use grok-instance-wide default
496    #    show_year = True,
497    #    )
498
499    sex = schema.Choice(
500        title = _(u'Gender'),
501        source = GenderSource(),
502        required = True,
503        )
504
505    #nationality = schema.Choice(
506    #    vocabulary = nats_vocab,
507    #    title = _(u'Nationality'),
508    #    required = False,
509    #    )
510
511    email = schema.ASCIILine(
512        title = _(u'Email Address'),
513        required = True,
514        constraint=validate_email,
515        )
516
517    #phone = PhoneNumber(
518    #    title = _(u'Phone'),
519    #    description = u'',
520    #    required = False,
521    #    )
522
523    #perm_address = schema.Text(
524    #    title = _(u'Current Local Address'),
525    #    required = False,
526    #    readonly = False,
527    #    )
528
529    dispatch_address = schema.Text(
530        title = _(u'Dispatch Addresses'),
531        description = u'Addresses to which transcripts should be posted. '
532                       'Addresses must involve same courier charges.',
533        required = False,
534        readonly = False,
535        )
536
537    charge = schema.Choice(
538        title = _(u'Courier Charge'),
539        source = DestinationCostSource(),
540        required = True,
541        )
542
543    #entry_mode = schema.Choice(
544    #    title = _(u'Entry Mode'),
545    #    source = StudyModeSource(),
546    #    required = False,
547    #    readonly = False,
548    #    )
549
550    #entry_session = schema.Choice(
551    #    title = _(u'Entry Session'),
552    #    source = academic_sessions_vocab,
553    #    required = False,
554    #    readonly = False,
555    #    )
556
557    end_session = schema.Choice(
558        title = _(u'Academic Session of Graduation'),
559        source = academic_sessions_vocab,
560        required = False,
561        readonly = False,
562        )
563
564    course_studied = schema.Choice(
565        title = _(u'Course of Study'),
566        source = TranscriptCertificateSource(),
567        description = u'Faculty / Department / Course',
568        required = False,
569        readonly = False,
570        )
571
572    #course_changed = schema.Choice(
573    #    title = _(u'Change of Study Course'),
574    #    description = u'If yes, select previous course of study.',
575    #    source = CertificateSource(),
576    #    readonly = False,
577    #    required = False,
578    #    )
579
580    #change_level = schema.Choice(
581    #    title = _(u'Change Level'),
582    #    description = u'If yes, select level at which you changed course of study.',
583    #    source = StudyLevelSource(),
584    #    required = False,
585    #    readonly = False,
586    #    )
587
588    no_copies = schema.Choice(
589        title = _(u'Number of Copies'),
590        description = u'Must correspond with the number of dispatch addresses above.',
591        values=[1, 2, 3, 4],
592        required = False,
593        readonly = False,
594        default = 1,
595        )
596
597class ICustomApplicant(ICustomUGApplicant, ICustomPGApplicant,
598    ITranscriptApplicant):
599    """An interface for both types of applicants.
600
601    Attention: The ICustomPGApplicant field seetings will be overwritten
602    by ICustomPGApplicant field settings. If a field is defined
603    in both interfaces zope.schema validates only against the
604    constraints in ICustomUGApplicant. This does not affect the forms
605    since they are build on either ICustomUGApplicant or ICustomPGApplicant.
606    """
607
608    def writeLogMessage(view, comment):
609        """Adds an INFO message to the log file
610        """
611
612    def createStudent():
613        """Create a student object from applicant data
614        and copy applicant object.
615        """
616
617class ICustomUGApplicantEdit(ICustomUGApplicant):
618    """An undergraduate applicant interface for edit forms.
619
620    Here we can repeat the fields from base data and set the
621    `required` and `readonly` attributes to True to further restrict
622    the data access. Or we can allow only certain certificates to be
623    selected by choosing the appropriate source.
624
625    We cannot omit fields here. This has to be done in the
626    respective form page.
627    """
628
629    phone = PhoneNumber(
630        title = _(u'Phone'),
631        description = u'',
632        required = True,
633        )
634    email = TextLineChoice(
635        title = _(u'Email Address'),
636        required = False,
637        constraint=validate_email,
638        source = contextual_email_source,
639        )
640    date_of_birth = FormattedDate(
641        title = _(u'Date of Birth'),
642        required = True,
643        show_year = True,
644        )
645
646    fst_sit_fname = schema.TextLine(
647        title = _(u'Full Name'),
648        description = _(u'As it is written on your WAEC/NECO result.'),
649        required = False,
650        readonly = False,
651        )
652
653    scd_sit_fname = schema.TextLine(
654        title = _(u'Full Name'),
655        description = _(u'As it is written on your WAEC/NECO result.'),
656        required = False,
657        readonly = False,
658        )
659
660    jamb_fname = schema.TextLine(
661        title = _(u'Full Name'),
662        description = _(u'As it is written on your JAMB result slip.'),
663        required = False,
664        readonly = False,
665        )
666
667ICustomUGApplicantEdit[
668    'date_of_birth'].order = ICustomUGApplicant['date_of_birth'].order
669ICustomUGApplicantEdit[
670    'email'].order = ICustomUGApplicant['email'].order
671ICustomUGApplicantEdit[
672    'phone'].order =  ICustomUGApplicantEdit['email'].order
673ICustomUGApplicantEdit[
674    'fst_sit_fname'].order =  ICustomUGApplicant['fst_sit_fname'].order
675ICustomUGApplicantEdit[
676    'scd_sit_fname'].order =  ICustomUGApplicant['scd_sit_fname'].order
677ICustomUGApplicantEdit[
678    'jamb_fname'].order =  ICustomUGApplicant['jamb_fname'].order
679
680class ICustomPGApplicantEdit(ICustomPGApplicant):
681    """A postgraduate applicant interface for editing.
682
683    Here we can repeat the fields from base data and set the
684    `required` and `readonly` attributes to True to further restrict
685    the data access. Or we can allow only certain certificates to be
686    selected by choosing the appropriate source.
687
688    We cannot omit fields here. This has to be done in the
689    respective form page.
690    """
691
692    phone = PhoneNumber(
693        title = _(u'Phone'),
694        description = u'',
695        required = True,
696        )
697    email = TextLineChoice(
698        title = _(u'Email Address'),
699        required = False,
700        constraint=validate_email,
701        source = contextual_email_source,
702        )
703    date_of_birth = FormattedDate(
704        title = _(u'Date of Birth'),
705        required = True,
706        show_year = True,
707        )
708
709ICustomPGApplicantEdit[
710    'date_of_birth'].order = ICustomPGApplicant['date_of_birth'].order
711ICustomPGApplicantEdit[
712    'email'].order = ICustomPGApplicant['email'].order
713ICustomPGApplicantEdit[
714    'phone'].order =  ICustomPGApplicantEdit['email'].order
715
716class ICustomApplicantRegisterUpdate(IApplicantRegisterUpdate):
717    """This is a representation of an applicant for first-time registration.
718    This interface is used when applicants use the registration page to
719    update their records.
720    """
721
722    email = TextLineChoice(
723        title = _(u'Email Address'),
724        required = False,
725        constraint=validate_email,
726        source = contextual_email_source,
727        )
728
729class ICustomApplicantOnlinePayment(INigeriaApplicantOnlinePayment):
730    """An applicant payment via payment gateways.
731
732    """
733
734class IPUTMEApplicantEdit(IPUTMEApplicantEdit):
735    """An undergraduate applicant interface for editing.
736
737    Here we can repeat the fields from base data and set the
738    `required` and `readonly` attributes to True to further restrict
739    the data access. Or we can allow only certain certificates to be
740    selected by choosing the appropriate source.
741
742    We cannot omit fields here. This has to be done in the
743    respective form page.
744    """
745
746class ICustomApplicantUpdateByRegNo(INigeriaApplicantUpdateByRegNo):
747    """Representation of an applicant.
748
749    Skip regular reg_number validation if reg_number is used for finding
750    the applicant object.
751    """
752
753class ICustomApplicantRefereeReport(IApplicantRefereeReport):
754    """A referee report.
755    """
756
757    duration = schema.Text(
758        title = _(u'How long and in what capacity have you known the candidate?'),
759        required = False,
760        )
761
762    itellectual = schema.Choice(
763        title = _(u'Intellectual Capacity'),
764        required = False,
765        readonly = False,
766        vocabulary = rating_vocab,
767        )
768
769    persistent = schema.Choice(
770        title = _(u'Capacity for Persistent and Independent Academic Study'),
771        required = False,
772        readonly = False,
773        vocabulary = rating_vocab,
774        )
775
776    imaginative = schema.Choice(
777        title = _(u'Ability for Imaginative Thought'),
778        required = False,
779        readonly = False,
780        vocabulary = rating_vocab,
781        )
782
783    productive = schema.Choice(
784        title = _(u'Promise of Productive Scholarship'),
785        required = False,
786        readonly = False,
787        vocabulary = rating_vocab,
788        )
789
790    previous = schema.Choice(
791        title = _(u'Quality of Previous Work'),
792        required = False,
793        readonly = False,
794        vocabulary = rating_vocab,
795        )
796
797    expression = schema.Choice(
798        title = _(u'Oral and Written Expression in English'),
799        required = False,
800        readonly = False,
801        vocabulary = rating_vocab,
802        )
803
804    personality = schema.Text(
805        title = _(u'Please comment on the candidate\'s personality '
806            'with particular reference to his/her moral character, emotional '
807            'and physical stabilty'),
808        required = False,
809        )
810
811    promise = schema.Choice(
812        title = _(u'Candidate\'s overall promise'),
813        required = False,
814        readonly = False,
815        vocabulary = overallpromise_vocab,
816        )
817
818    report = schema.Text(
819        title = _(u'Any other relevant information which would help '
820            'in determining the candidate\'s suitability?'),
821        required = False,
822        )
823
824    objection = schema.Text(
825        title = _(u'Have you any objection to the contents of this '
826            'evaluation being disclosed to any award-given body if '
827            'the need arises?'),
828        required = False,
829        )
Note: See TracBrowser for help on using the repository browser.