source: main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py @ 8044

Last change on this file since 8044 was 8008, checked in by Henrik Bettermann, 13 years ago

Remove all ApplicantsContainerProvider? components. Experience has shown that we only need one type of ApplicantsContainers? and one type of Applicants but with different interfaces for form generation.

  • Property svn:keywords set to Id
File size: 13.8 KB
RevLine 
[7191]1## $Id: interfaces.py 8008 2012-03-30 10:23:32Z henrik $
[6621]2##
[7191]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##
[6996]18from datetime import datetime
[7620]19from zope.component import getUtility
[7256]20from zope.interface import Attribute, Interface
[6621]21from zope import schema
[7620]22from zc.sourcefactory.contextual import BasicContextualSourceFactory
[7811]23from waeup.kofa.interfaces import (
[7819]24    IKofaObject, academic_sessions_vocab, validate_email, IKofaUtils)
[7811]25from waeup.kofa.interfaces import MessageFactory as _
26from waeup.kofa.schema import TextLineChoice
27from waeup.kofa.students.vocabularies import (
[7915]28    StudyLevelSource, contextual_reg_num_source, contextual_mat_num_source,
29    GenderSource, nats_vocab,
30    )
[7811]31from waeup.kofa.payments.interfaces import IPaymentsContainer, IOnlinePayment
[7915]32from waeup.kofa.university.vocabularies import (
33    CourseSource, StudyModeSource, CertificateSource)
[6621]34
[7620]35# VerdictSource can't be placed into the vocabularies module because it
36# requires importing IStudentsUtils which then leads to circular imports.
37class VerdictSource(BasicContextualSourceFactory):
38    """A verdicts source delivers all verdicts provided
39    in the portal.
40    """
41    def getValues(self, context):
[7841]42        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
[7688]43        return verdicts_dict.keys()
[7620]44
45    def getToken(self, context, value):
46        return value
47
48    def getTitle(self, context, value):
[7841]49        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
[7688]50        return verdicts_dict[value]
[7620]51
[7681]52
[7150]53class IStudentsUtils(Interface):
54    """A collection of methods which are subject to customization.
55
56    """
[7841]57    def setReturningData(student):
58        """ This method defines what happens after school fee payment
59        depending on the student's senate verdict.
60
61        In the base configuration current level is always increased
62        by 100 no matter which verdict has been assigned.
63        """
64
[7186]65    def getPaymentDetails(category, student):
[7150]66        """Get the payment dates of a student for the payment category
67        specified.
68
69        """
70
[7186]71    def getAccommodation_details(student):
[7150]72        """Determine the accommodation dates of a student.
73
74        """
75
[7186]76    def selectBed(available_beds):
[7150]77        """Select a bed from a list of available beds.
78
79        In the standard configuration we select the first bed found,
80        but can also randomize the selection if we like.
81        """
82
[7186]83    def renderPDF(view, subject='', filename='slip.pdf',):
[7150]84        """Render pdf slips for various pages.
85
86        """
87
[7819]88class IStudentsContainer(IKofaObject):
[7096]89    """A students container contains university students.
[6692]90
91    """
92    def addStudent(student):
93        """Add an IStudent object and subcontainers.
94
95        """
96
97    def archive(id=None):
98        """Create on-dist archive of students.
99
100        If id is `None`, all students are archived.
101
102        If id contains a single id string, only the respective
103        students are archived.
104
105        If id contains a list of id strings all of the respective
106        students types are saved to disk.
107        """
108
109    def clear(id=None, archive=True):
110        """Remove students of type given by 'id'.
111
112        Optionally archive the students.
113
114        If id is `None`, all students are archived.
115
116        If id contains a single id string, only the respective
117        students are archived.
118
119        If id contains a list of id strings all of the respective
120        student types are saved to disk.
121
122        If `archive` is ``False`` none of the archive-handling is done
123        and respective students are simply removed from the
124        database.
125        """
126
[7819]127class IStudentNavigation(IKofaObject):
[6642]128    """Interface needed for student navigation.
[7150]129
[6642]130    """
131    def getStudent():
132        """Return student object.
[7150]133
[6642]134        """
135
[7819]136class IStudentBase(IKofaObject):
[6631]137    """Representation of student base data.
[7150]138
[6621]139    """
[7062]140    history = Attribute('Object history, a list of messages')
[6637]141    state = Attribute('Returns the registration state of a student')
[6699]142    password = Attribute('Encrypted password of a student')
[7203]143    certcode = Attribute('The certificate code of any chosen study course')
144    depcode = Attribute('The department code of any chosen study course')
145    faccode = Attribute('The faculty code of any chosen study course')
[7062]146    current_session = Attribute('The current session of the student')
[7641]147    current_mode = Attribute('The current mode of the student')
[7364]148    fullname = Attribute('All name parts separated by hyphens')
149    display_fullname = Attribute('The fullname of an applicant')
[6637]150
151    def loggerInfo(ob_class, comment):
[7150]152        """Adds an INFO message to the log file.
153
[6637]154        """
155
[6665]156    student_id = schema.TextLine(
[7723]157        title = _(u'Student Id'),
[6849]158        required = False,
[6665]159        )
160
[7357]161    firstname = schema.TextLine(
[7723]162        title = _(u'First Name'),
[6621]163        required = True,
164        )
165
[7357]166    middlename = schema.TextLine(
[7723]167        title = _(u'Middle Name'),
[7357]168        required = False,
169        )
170
171    lastname = schema.TextLine(
[7723]172        title = _(u'Last Name (Surname)'),
[7357]173        required = True,
174        )
175
[6996]176    sex = schema.Choice(
[7723]177        title = _(u'Sex'),
[6996]178        source = GenderSource(),
179        required = True,
180        )
181
[6788]182    reg_number = TextLineChoice(
[7723]183        title = _(u'Registration Number'),
[6696]184        required = True,
185        readonly = False,
[6788]186        source = contextual_reg_num_source,
[6696]187        )
188
[6788]189    matric_number = TextLineChoice(
[7723]190        title = _(u'Matriculation Number'),
[6750]191        required = False,
192        readonly = False,
[6788]193        source = contextual_mat_num_source,
[6750]194        )
195
[6769]196    adm_code = schema.TextLine(
[7723]197        title = _(u'PWD Activation Code'),
[6769]198        required = False,
199        readonly = True,
200        )
201
[7133]202    email = schema.ASCIILine(
[7723]203        title = _(u'Email'),
[7133]204        required = False,
205        constraint=validate_email,
206        )
[7325]207    phone = schema.TextLine(
[7723]208        title = _(u'Phone'),
[7331]209        description = u'',
[7133]210        required = False,
211        )
212
[7993]213class IUGStudentClearance(IKofaObject):
214    """Representation of undergraduate student clearance data.
[7150]215
[6631]216    """
217    date_of_birth = schema.Date(
[7723]218        title = _(u'Date of Birth'),
[6631]219        required = True,
220        )
221
[6695]222    clearance_locked = schema.Bool(
[7723]223        title = _(u'Clearance form locked'),
[6695]224        default = False,
225        )
226
[6769]227    clr_code = schema.TextLine(
[7723]228        title = _(u'CLR Activation Code'),
[6769]229        required = False,
230        readonly = True,
231        )
232
[7523]233    nationality = schema.Choice(
234        source = nats_vocab,
[7723]235        title = _(u'Nationality'),
[7523]236        default = 'nigeria',
[7983]237        required = False,
[7523]238        )
239
[7993]240class IPGStudentClearance(IUGStudentClearance):
241    """Representation of postgraduate student clearance data.
242
243    """
244    employer = schema.TextLine(
245        title = _(u'Employer'),
246        required = False,
247        readonly = False,
248        )
249
[7819]250class IStudentPersonal(IKofaObject):
[6631]251    """Representation of student personal data.
[7150]252
[6631]253    """
[6651]254    perm_address = schema.Text(
[7723]255        title = _(u'Permanent Address'),
[6631]256        required = False,
257        )
258
[8008]259class IStudent(IStudentBase,IUGStudentClearance,IPGStudentClearance,
260    IStudentPersonal):
[6631]261    """Representation of a student.
[7150]262
[6631]263    """
264
[6849]265class IStudentUpdateByRegNo(IStudent):
266    """Representation of a student. Skip regular reg_number validation.
[7150]267
[6849]268    """
269    reg_number = schema.TextLine(
[7723]270        title = _(u'Registration Number'),
[6849]271        required = False,
272        )
273
274class IStudentUpdateByMatricNo(IStudent):
275    """Representation of a student. Skip regular matric_number validation.
[7150]276
[6849]277    """
278    matric_number = schema.TextLine(
[7723]279        title = _(u'Matriculation Number'),
[6849]280        required = False,
281        )
282
[7819]283class IStudentStudyCourse(IKofaObject):
[6633]284    """A container for student study levels.
285
286    """
[6648]287    certificate = schema.Choice(
[7723]288        title = _(u'Certificate'),
[6648]289        source = CertificateSource(),
[7209]290        required = False,
[6633]291        )
[6635]292
[6996]293    entry_mode = schema.Choice(
[7723]294        title = _(u'Entry Mode'),
[7681]295        source = StudyModeSource(),
[6996]296        required = True,
297        readonly = False,
298        )
299
300    entry_session = schema.Choice(
[7723]301        title = _(u'Entry Session'),
[6996]302        source = academic_sessions_vocab,
[7425]303        #default = datetime.now().year,
[6996]304        required = True,
305        readonly = False,
306        )
307
[6724]308    current_session = schema.Choice(
[7723]309        title = _(u'Current Session'),
[6744]310        source = academic_sessions_vocab,
[6724]311        required = True,
[6996]312        readonly = False,
[6724]313        )
314
315    current_level = schema.Choice(
[7723]316        title = _(u'Current Level'),
[6725]317        source = StudyLevelSource(),
318        required = False,
[6996]319        readonly = False,
[6724]320        )
321
322    current_verdict = schema.Choice(
[7723]323        title = _(u'Current Verdict'),
[7619]324        source = VerdictSource(),
[6804]325        default = '0',
[6725]326        required = False,
[6724]327        )
328
329    previous_verdict = schema.Choice(
[7723]330        title = _(u'Previous Verdict'),
[7619]331        source = VerdictSource(),
[6805]332        default = '0',
[6725]333        required = False,
[6724]334        )
335
[7951]336class IStudentVerdictUpdate(IKofaObject):
337    """A interface for verdict imports.
338
339    """
340
341    current_verdict = schema.Choice(
342        title = _(u'Current Verdict'),
343        source = VerdictSource(),
344        required = True,
345        )
346
347    current_session = schema.Choice(
348        title = _(u'Current Session'),
349        source = academic_sessions_vocab,
350        required = True,
351        )
352
353    current_level = schema.Choice(
354        title = _(u'Current Level'),
355        source = StudyLevelSource(),
356        required = True,
357        )
358
[7819]359class IStudentStudyLevel(IKofaObject):
[6774]360    """A container for course tickets.
361
362    """
363    level = Attribute('The level code')
[6793]364    validation_date = Attribute('The date of validation')
365    validated_by = Attribute('User Id of course adviser')
[6774]366
[6793]367    level_session = schema.Choice(
[7723]368        title = _(u'Session'),
[6793]369        source = academic_sessions_vocab,
370        required = True,
371        )
[6781]372
[6793]373    level_verdict = schema.Choice(
[7723]374        title = _(u'Verdict'),
[7619]375        source = VerdictSource(),
[6805]376        default = '0',
[6793]377        required = False,
378        )
379
[7819]380class ICourseTicket(IKofaObject):
[6781]381    """A course ticket.
382
383    """
[6783]384    code = Attribute('code of the original course')
385    title = Attribute('title of the original course')
386    credits = Attribute('credits of the original course')
387    passmark = Attribute('passmark of the original course')
388    semester = Attribute('semester of the original course')
[7304]389    fcode = Attribute('faculty code of the original course')
390    dcode = Attribute('department code of the original course')
[6781]391
[7665]392    mandatory = schema.Bool(
[7723]393        title = _(u'Mandatory'),
[6795]394        default = False,
395        required = False,
396        readonly = False,
397        )
398
[6781]399    score = schema.Int(
[7723]400        title = _(u'Score'),
[6781]401        default = 0,
402        required = False,
403        readonly = False,
404        )
405
[6806]406    automatic = schema.Bool(
[7723]407        title = _(u'Automatical Creation'),
[6806]408        default = False,
409        required = False,
410        readonly = True,
411        )
412
[7661]413    carry_over = schema.Bool(
[7723]414        title = _(u'Carry-over Course'),
[7661]415        default = False,
416        required = False,
417        readonly = False,
418        )
419
[7633]420    def getLevel():
421        """Returns the id of the level the ticket has been added to.
422        """
423
424    def getLevelSession():
425        """Returns the session of the level the ticket has been added to.
426        """
427
[6795]428class ICourseTicketAdd(ICourseTicket):
[7150]429    """An interface for adding course tickets.
[6795]430
431    """
432    course = schema.Choice(
[7723]433        title = _(u'Course'),
[6795]434        source = CourseSource(),
435        readonly = False,
436        )
437
[7819]438class IStudentAccommodation(IKofaObject):
[6635]439    """A container for student accommodation objects.
440
441    """
442
[7819]443class IBedTicket(IKofaObject):
[6989]444    """A ticket for accommodation booking.
445
446    """
[6996]447    bed = Attribute('The bed object.')
448
449    bed_coordinates = schema.TextLine(
[7723]450        title = _(u'Bed Coordinates'),
[6992]451        required = False,
[7014]452        readonly = False,
[6992]453        )
454
[6996]455    bed_type = schema.TextLine(
[7723]456        title = _(u'Bed Type'),
[6996]457        required = False,
[7014]458        readonly = False,
[6996]459        )
460
[6992]461    booking_session = schema.Choice(
[7723]462        title = _(u'Session'),
[6992]463        source = academic_sessions_vocab,
464        required = True,
[7014]465        readonly = True,
[6992]466        )
467
468    booking_date = schema.Datetime(
[7723]469        title = _(u'Booking Date'),
[6992]470        required = False,
[7014]471        readonly = True,
[6992]472        )
473
474    booking_code = schema.TextLine(
[7723]475        title = _(u'Booking Activation Code'),
[6992]476        required = False,
[7014]477        readonly = True,
[6992]478        )
479
[6994]480    def getSessionString():
[7633]481        """Returns the title of academic_sessions_vocab term.
[7150]482
[6994]483        """
[6992]484
[6860]485class IStudentPaymentsContainer(IPaymentsContainer):
[6635]486    """A container for student payment objects.
487
488    """
489
[6877]490class IStudentOnlinePayment(IOnlinePayment):
491    """A student payment via payment gateways.
492
493    """
494    p_session = schema.Choice(
[7723]495        title = _(u'Payment Session'),
[6877]496        source = academic_sessions_vocab,
497        required = False,
498        )
499
500IStudentOnlinePayment['p_session'].order = IStudentOnlinePayment[
501    'p_item'].order
502
[7819]503class IStudentChangePassword(IKofaObject):
[7369]504    """Interface needed for change pasword page.
505
506    """
507
508    reg_number = schema.TextLine(
[7723]509        title = _(u'Registration Number'),
[7369]510        required = True,
511        readonly = False,
512        )
513
514    email = schema.ASCIILine(
[7723]515        title = _(u'Email Address'),
[7369]516        required = True,
517        constraint=validate_email,
518        )
Note: See TracBrowser for help on using the repository browser.