source: main/kofacustom.nigeria/trunk/src/kofacustom/nigeria/students/interfaces.py @ 12813

Last change on this file since 12813 was 12503, checked in by Henrik Bettermann, 10 years ago

Ensure that lga and nationality are not contradictory.

  • Property svn:keywords set to Id
File size: 14.0 KB
Line 
1## $Id: interfaces.py 12503 2015-01-21 10:55:14Z henrik $
2##
3## Copyright (C) 2012 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##
18from zope import schema
19from zope.interface import Attribute, invariant, Invalid
20from waeup.kofa.schema import TextLineChoice
21from waeup.kofa.interfaces import SimpleKofaVocabulary, academic_sessions_vocab
22from waeup.kofa.schema import FormattedDate, PhoneNumber
23from waeup.kofa.schoolgrades import ResultEntryField
24from waeup.kofa.students.vocabularies import nats_vocab
25from waeup.kofa.students.interfaces import (
26    IStudentBase, IUGStudentClearance, IPGStudentClearance,
27    IStudentPersonal, IStudentNavigation, IStudentStudyLevel,
28    IStudentStudyCourse, ICourseTicket
29    )
30from waeup.kofa.students.vocabularies import (
31    nats_vocab, contextual_reg_num_source)
32from kofacustom.nigeria.interfaces import (
33    high_qual, high_grade, exam_types, LGASource)
34from kofacustom.nigeria.interfaces import MessageFactory as _
35from kofacustom.nigeria.payments.interfaces import INigeriaOnlinePayment
36
37
38class INigeriaStudentBase(IStudentBase):
39    """Representation of student base data.
40
41    """
42
43    reg_number = TextLineChoice(
44        title = _(u'Registration Number'),
45        required = False,
46        readonly = False,
47        source = contextual_reg_num_source,
48        )
49
50    is_staff = schema.Bool(
51        title = _(u'Staff Member'),
52        required = False,
53        readonly = False,
54        default = False,
55        )
56
57INigeriaStudentBase['reg_number'].order = IStudentBase[
58    'reg_number'].order
59
60
61class INigeriaUGStudentClearance(IUGStudentClearance):
62    """Representation of ug student clearance data.
63
64    """
65    officer_comment = schema.Text(
66        title = _(u"Officer's Comment"),
67        required = False,
68        )
69
70    physical_clearance_date = schema.TextLine(
71        title = _(u"Physical Clearance Date"),
72        required = False,
73        )
74
75    clearance_locked = schema.Bool(
76        title = _(u'Clearance form locked'),
77        default = False,
78        required = False,
79        )
80
81    clr_code = schema.TextLine(
82        title = _(u'CLR Activation Code'),
83        required = False,
84        readonly = False,
85        )
86
87    date_of_birth = FormattedDate(
88        title = _(u'Date of Birth'),
89        required = False,
90        show_year = True,
91        )
92
93    nationality = schema.Choice(
94        source = nats_vocab,
95        title = _(u'Nationality'),
96        required = True,
97        )
98
99    lga = schema.Choice(
100        source = LGASource(),
101        title = _(u'State / LGA'),
102        required = False,
103        )
104
105    def_adm = schema.Bool(
106        title = _(u'Deferent of Admission'),
107        required = False,
108        readonly = False,
109        default = False,
110        )
111
112    fst_sit_fname = schema.TextLine(
113        title = _(u'Full Name'),
114        required = False,
115        readonly = False,
116        )
117    fst_sit_no = schema.TextLine(
118        title = _(u'Exam Number'),
119        required = False,
120        readonly = False,
121        )
122
123    fst_sit_date = FormattedDate(
124        title = _(u'Exam Date'),
125        required = False,
126        readonly = False,
127        show_year = True,
128        )
129
130    fst_sit_type = schema.Choice(
131        title = _(u'Exam Type'),
132        required = False,
133        readonly = False,
134        vocabulary = exam_types,
135        )
136
137    fst_sit_results = schema.List(
138        title = _(u'Exam Results'),
139        value_type = ResultEntryField(),
140        required = False,
141        readonly = False,
142        default = [],
143        )
144
145    scd_sit_fname = schema.TextLine(
146        title = _(u'Full Name'),
147        required = False,
148        readonly = False,
149        )
150    scd_sit_no = schema.TextLine(
151        title = _(u'Exam Number'),
152        required = False,
153        readonly = False,
154        )
155
156    scd_sit_date = FormattedDate(
157        title = _(u'Exam Date'),
158        required = False,
159        readonly = False,
160        show_year = True,
161        )
162
163    scd_sit_type = schema.Choice(
164        title = _(u'Exam Type'),
165        required = False,
166        readonly = False,
167        vocabulary = exam_types,
168        )
169
170    scd_sit_results = schema.List(
171        title = _(u'Exam Results'),
172        value_type = ResultEntryField(),
173        required = False,
174        readonly = False,
175        default = [],
176        )
177
178    alr_fname = schema.TextLine(
179        title = _(u'Full Name'),
180        required = False,
181        readonly = False,
182        )
183    alr_no = schema.TextLine(
184        title = _(u'Exam Number'),
185        required = False,
186        readonly = False,
187        )
188
189    alr_date = FormattedDate(
190        title = _(u'Exam Date'),
191        required = False,
192        readonly = False,
193        show_year = True,
194        )
195
196    alr_results = schema.List(
197        title = _(u'Exam Results'),
198        value_type = ResultEntryField(),
199        required = False,
200        readonly = False,
201        default = [],
202        )
203
204    hq_type = schema.Choice(
205        title = _(u'Qualification Obtained'),
206        required = False,
207        readonly = False,
208        vocabulary = high_qual,
209        )
210
211    hq_fname = schema.TextLine(
212        title = _(u'Full Name'),
213        required = False,
214        readonly = False,
215        )
216
217    hq_matric_no = schema.TextLine(
218        title = _(u'Former Matric Number'),
219        required = False,
220        readonly = False,
221        )
222
223    hq_degree = schema.Choice(
224        title = _(u'Class of Degree'),
225        required = False,
226        readonly = False,
227        vocabulary = high_grade,
228        )
229
230    hq_school = schema.TextLine(
231        title = _(u'Institution Attended'),
232        required = False,
233        readonly = False,
234        )
235
236    hq_session = schema.TextLine(
237        title = _(u'Years Attended'),
238        required = False,
239        readonly = False,
240        )
241
242    hq_disc = schema.TextLine(
243        title = _(u'Discipline'),
244        required = False,
245        readonly = False,
246        )
247
248    @invariant
249    def check_lga_nationality(student):
250        if student.nationality != 'NG' and student.lga not in ('foreigner', None):
251            raise Invalid(_('Nationalty and LGA are contradictory.'))
252        if student.nationality == 'NG' and student.lga == 'foreigner':
253            raise Invalid(_('Nationalty and LGA are contradictory.'))
254
255
256class INigeriaPGStudentClearance(INigeriaUGStudentClearance):
257    """Representation of pg student clearance data.
258
259    """
260
261    hq2_type = schema.Choice(
262        title = _(u'Qualification Obtained'),
263        required = False,
264        readonly = False,
265        vocabulary = high_qual,
266        )
267
268    hq2_matric_no = schema.TextLine(
269        title = _(u'Former Matric Number'),
270        required = False,
271        readonly = False,
272        )
273
274    hq2_degree = schema.Choice(
275        title = _(u'Class of Degree'),
276        required = False,
277        readonly = False,
278        vocabulary = high_grade,
279        )
280
281    hq2_school = schema.TextLine(
282        title = _(u'Institution Attended'),
283        required = False,
284        readonly = False,
285        )
286
287    hq2_session = schema.TextLine(
288        title = _(u'Years Attended'),
289        required = False,
290        readonly = False,
291        )
292
293    hq2_disc = schema.TextLine(
294        title = _(u'Discipline'),
295        required = False,
296        readonly = False,
297        )
298
299    nysc_year = schema.Int(
300        title = _(u'Nysc Year'),
301        required = False,
302        readonly = False,
303        )
304
305    nysc_location = schema.TextLine(
306        title = _(u'Nysc Location'),
307        required = False,
308        )
309
310    nysc_lga = schema.Choice(
311        source = LGASource(),
312        title = _(u'Nysc LGA'),
313        required = False,
314        )
315
316    employer = schema.TextLine(
317        title = _(u'Employer'),
318        required = False,
319        readonly = False,
320        )
321
322    emp_position = schema.TextLine(
323        title = _(u'Employer Position'),
324        required = False,
325        readonly = False,
326        )
327
328    emp_start = FormattedDate(
329        title = _(u'Start Date'),
330        required = False,
331        readonly = False,
332        show_year = True,
333        )
334
335    emp_end = FormattedDate(
336        title = _(u'End Date'),
337        required = False,
338        readonly = False,
339        show_year = True,
340        )
341
342    emp_reason = schema.TextLine(
343        title = _(u'Reason for Leaving'),
344        required = False,
345        readonly = False,
346        )
347
348    employer2 = schema.TextLine(
349        title = _(u'2nd Employer'),
350        required = False,
351        readonly = False,
352        )
353
354    emp2_position = schema.TextLine(
355        title = _(u'2nd Employer Position'),
356        required = False,
357        readonly = False,
358        )
359
360    emp2_start = FormattedDate(
361        title = _(u'Start Date'),
362        required = False,
363        readonly = False,
364        show_year = True,
365        )
366    emp2_end = FormattedDate(
367        title = _(u'End Date'),
368        required = False,
369        readonly = False,
370        show_year = True,
371        )
372
373    emp2_reason = schema.TextLine(
374        title = _(u'Reason for Leaving'),
375        required = False,
376        readonly = False,
377        )
378
379    former_matric = schema.TextLine(
380        title = _(u'If yes, matric number'),
381        required = False,
382        readonly = False,
383        )
384
385class INigeriaStudentPersonal(IStudentPersonal):
386    """Student personal data.
387
388    """
389
390    is_foreigner = Attribute('True if student is non-Nigerian')
391
392    next_kin_name = schema.TextLine(
393        title = _(u'Next of Kin Name'),
394        required = False,
395        readonly = False,
396        )
397
398    next_kin_relation = schema.TextLine(
399        title = _(u'Next of Kin Relationship'),
400        required = False,
401        readonly = False,
402        )
403
404    next_kin_address = schema.Text(
405        title = _(u'Next of Kin Address'),
406        required = False,
407        readonly = False,
408        )
409
410    next_kin_phone = PhoneNumber(
411        title = _(u'Next of Kin Phone'),
412        description = u'',
413        required = False,
414        readonly = False,
415        )
416
417    marit_stat = schema.Choice(
418        title = u'Maritual Status',
419        default = 'unmarried',
420        required = False,
421        vocabulary = SimpleKofaVocabulary(
422            (_('Unmarried'), 'unmarried'),
423            (_('Married'), 'married'),)
424        )
425
426    religion = schema.Choice(
427        title = u'Religion',
428        default = 'no_say',
429        required = False,
430        vocabulary = SimpleKofaVocabulary(
431            (_('Muslim'), 'muslim'),
432            (_('Christian'), 'christian'),
433            (_('Others'), 'others'),
434            (_('Prefer not to say'), 'no_say'),)
435        )
436
437    disabled = schema.Bool(
438        title = u'Disabled',
439        default = False,
440        required = False,
441        )
442
443
444class INigeriaStudent(INigeriaStudentBase,INigeriaUGStudentClearance,
445    INigeriaPGStudentClearance,INigeriaStudentPersonal):
446    """Representation of a student.
447
448    """
449
450class INigeriaStudentPersonalEdit(INigeriaStudentPersonal):
451    """Interface for editing personal data by students.
452
453    Here we can repeat the fields from IStudentPersonal and set the
454    `required` if necessary.
455    """
456
457    perm_address = schema.Text(
458        title = _(u'Permanent Address'),
459        required = True,
460        )
461
462    next_kin_name = schema.TextLine(
463        title = _(u'Next of Kin Name'),
464        required = True,
465        readonly = False,
466        )
467
468    next_kin_relation = schema.TextLine(
469        title = _(u'Next of Kin Relationship'),
470        required = True,
471        readonly = False,
472        )
473
474    next_kin_address = schema.Text(
475        title = _(u'Next of Kin Address'),
476        required = True,
477        readonly = False,
478        )
479
480    next_kin_phone = PhoneNumber(
481        title = _(u'Next of Kin Phone'),
482        description = u'',
483        required = True,
484        readonly = False,
485        )
486
487INigeriaStudentPersonalEdit['perm_address'].order = INigeriaStudentPersonal[
488    'perm_address'].order
489INigeriaStudentPersonalEdit['next_kin_name'].order = INigeriaStudentPersonal[
490    'next_kin_name'].order
491INigeriaStudentPersonalEdit['next_kin_relation'].order = INigeriaStudentPersonal[
492    'next_kin_relation'].order
493INigeriaStudentPersonalEdit['next_kin_address'].order = INigeriaStudentPersonal[
494    'next_kin_address'].order
495INigeriaStudentPersonalEdit['next_kin_phone'].order = INigeriaStudentPersonal[
496    'next_kin_phone'].order
497
498class INigeriaStudentStudyCourse(IStudentStudyCourse):
499    """A container for student study levels.
500
501    """
502
503class INigeriaStudentStudyLevel(IStudentStudyLevel):
504    """A container for course tickets.
505
506    """
507
508class INigeriaStudentOnlinePayment(INigeriaOnlinePayment):
509    """A student payment via payment gateways.
510
511    This Interface does not inherit from IStudentOnlinePayment.
512    Thus all fields from IStudentOnlinePayment have to be repeated here.
513    """
514
515    p_current = schema.Bool(
516        title = _(u'Current Session Payment'),
517        default = True,
518        required = False,
519        )
520
521    p_level = schema.Int(
522        title = _(u'Payment Level'),
523        required = False,
524        )
525
526INigeriaStudentOnlinePayment['p_level'].order = INigeriaStudentOnlinePayment[
527    'p_session'].order
528
529class INigeriaCourseTicket(ICourseTicket):
530    """A course ticket.
531
532    """
533
534class INigeriaStudentUpdateByRegNo(INigeriaStudent):
535    """Representation of a student. Skip regular reg_number validation.
536
537    """
538    reg_number = schema.TextLine(
539        title = _(u'Registration Number'),
540        required = False,
541        )
542
543class INigeriaStudentUpdateByMatricNo(INigeriaStudent):
544    """Representation of a student. Skip regular matric_number validation.
545
546    """
547    matric_number = schema.TextLine(
548        title = _(u'Matriculation Number'),
549        required = False,
550        )
Note: See TracBrowser for help on using the repository browser.