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

Last change on this file since 7948 was 7915, checked in by uli, 13 years ago

Move CertificateSource? to university package. I think this is the right place.

  • Property svn:keywords set to Id
File size: 13.4 KB
RevLine 
[7191]1## $Id: interfaces.py 7915 2012-03-19 04:21:47Z uli $
[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        default = u'm',
180        required = True,
181        )
182
[6788]183    reg_number = TextLineChoice(
[7723]184        title = _(u'Registration Number'),
[6696]185        required = True,
186        readonly = False,
[6788]187        source = contextual_reg_num_source,
[6696]188        )
189
[6788]190    matric_number = TextLineChoice(
[7723]191        title = _(u'Matriculation Number'),
[6788]192        #default = u'',
[6750]193        required = False,
194        readonly = False,
[6788]195        source = contextual_mat_num_source,
[6750]196        )
197
[6769]198    adm_code = schema.TextLine(
[7723]199        title = _(u'PWD Activation Code'),
[6769]200        default = u'',
201        required = False,
202        readonly = True,
203        )
204
[7133]205    email = schema.ASCIILine(
[7723]206        title = _(u'Email'),
[7133]207        required = False,
208        constraint=validate_email,
209        )
[7325]210    phone = schema.TextLine(
[7723]211        title = _(u'Phone'),
[7331]212        description = u'',
[7133]213        required = False,
214        )
215
[7819]216class IStudentClearance(IKofaObject):
[6631]217    """Representation of student clearance data.
[7150]218
[6631]219    """
220    date_of_birth = schema.Date(
[7723]221        title = _(u'Date of Birth'),
[6631]222        required = True,
223        )
224
[6695]225    clearance_locked = schema.Bool(
[7723]226        title = _(u'Clearance form locked'),
[6695]227        default = False,
228        )
229
[6769]230    clr_code = schema.TextLine(
[7723]231        title = _(u'CLR Activation Code'),
[6769]232        default = u'',
233        required = False,
234        readonly = True,
235        )
236
[7523]237    nationality = schema.Choice(
238        source = nats_vocab,
[7723]239        title = _(u'Nationality'),
[7523]240        default = 'nigeria',
241        required = True,
242        )
243
[7819]244class IStudentPersonal(IKofaObject):
[6631]245    """Representation of student personal data.
[7150]246
[6631]247    """
[6651]248    perm_address = schema.Text(
[7723]249        title = _(u'Permanent Address'),
[6631]250        required = False,
251        )
252
253class IStudent(IStudentBase,IStudentClearance,IStudentPersonal):
254    """Representation of a student.
[7150]255
[6631]256    """
257
[6849]258class IStudentUpdateByRegNo(IStudent):
259    """Representation of a student. Skip regular reg_number validation.
[7150]260
[6849]261    """
262    reg_number = schema.TextLine(
[7723]263        title = _(u'Registration Number'),
[6849]264        default = None,
265        required = False,
266        )
267
268class IStudentUpdateByMatricNo(IStudent):
269    """Representation of a student. Skip regular matric_number validation.
[7150]270
[6849]271    """
272    matric_number = schema.TextLine(
[7723]273        title = _(u'Matriculation Number'),
[6849]274        default = None,
275        required = False,
276        )
277
[7819]278class IStudentStudyCourse(IKofaObject):
[6633]279    """A container for student study levels.
280
281    """
[6648]282    certificate = schema.Choice(
[7723]283        title = _(u'Certificate'),
[6648]284        source = CertificateSource(),
285        default = None,
[7209]286        required = False,
[6633]287        )
[6635]288
[6996]289    entry_mode = schema.Choice(
[7723]290        title = _(u'Entry Mode'),
[7681]291        source = StudyModeSource(),
[6996]292        default = u'ug_ft',
293        required = True,
294        readonly = False,
295        )
296
297    entry_session = schema.Choice(
[7723]298        title = _(u'Entry Session'),
[6996]299        source = academic_sessions_vocab,
[7425]300        #default = datetime.now().year,
301        default = None,
[6996]302        required = True,
303        readonly = False,
304        )
305
[6724]306    current_session = schema.Choice(
[7723]307        title = _(u'Current Session'),
[6744]308        source = academic_sessions_vocab,
[6724]309        default = None,
310        required = True,
[6996]311        readonly = False,
[6724]312        )
313
314    current_level = schema.Choice(
[7723]315        title = _(u'Current Level'),
[6725]316        source = StudyLevelSource(),
[6724]317        default = None,
[6725]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
[7819]336class IStudentStudyLevel(IKofaObject):
[6774]337    """A container for course tickets.
338
339    """
340    level = Attribute('The level code')
[6793]341    validation_date = Attribute('The date of validation')
342    validated_by = Attribute('User Id of course adviser')
[6774]343
[6793]344    level_session = schema.Choice(
[7723]345        title = _(u'Session'),
[6793]346        source = academic_sessions_vocab,
347        default = None,
348        required = True,
349        )
[6781]350
[6793]351    level_verdict = schema.Choice(
[7723]352        title = _(u'Verdict'),
[7619]353        source = VerdictSource(),
[6805]354        default = '0',
[6793]355        required = False,
356        )
357
[7819]358class ICourseTicket(IKofaObject):
[6781]359    """A course ticket.
360
361    """
[6783]362    code = Attribute('code of the original course')
363    title = Attribute('title of the original course')
364    credits = Attribute('credits of the original course')
365    passmark = Attribute('passmark of the original course')
366    semester = Attribute('semester of the original course')
[7304]367    fcode = Attribute('faculty code of the original course')
368    dcode = Attribute('department code of the original course')
[6781]369
[7665]370    mandatory = schema.Bool(
[7723]371        title = _(u'Mandatory'),
[6795]372        default = False,
373        required = False,
374        readonly = False,
375        )
376
[6781]377    score = schema.Int(
[7723]378        title = _(u'Score'),
[6781]379        default = 0,
380        required = False,
381        readonly = False,
382        )
383
[6806]384    automatic = schema.Bool(
[7723]385        title = _(u'Automatical Creation'),
[6806]386        default = False,
387        required = False,
388        readonly = True,
389        )
390
[7661]391    carry_over = schema.Bool(
[7723]392        title = _(u'Carry-over Course'),
[7661]393        default = False,
394        required = False,
395        readonly = False,
396        )
397
[7633]398    def getLevel():
399        """Returns the id of the level the ticket has been added to.
400        """
401
402    def getLevelSession():
403        """Returns the session of the level the ticket has been added to.
404        """
405
[6795]406class ICourseTicketAdd(ICourseTicket):
[7150]407    """An interface for adding course tickets.
[6795]408
409    """
410    course = schema.Choice(
[7723]411        title = _(u'Course'),
[6795]412        source = CourseSource(),
413        readonly = False,
414        )
415
[7819]416class IStudentAccommodation(IKofaObject):
[6635]417    """A container for student accommodation objects.
418
419    """
420
[7819]421class IBedTicket(IKofaObject):
[6989]422    """A ticket for accommodation booking.
423
424    """
[6996]425    bed = Attribute('The bed object.')
426
427    bed_coordinates = schema.TextLine(
[7723]428        title = _(u'Bed Coordinates'),
[6992]429        default = None,
430        required = False,
[7014]431        readonly = False,
[6992]432        )
433
[6996]434    bed_type = schema.TextLine(
[7723]435        title = _(u'Bed Type'),
[6996]436        default = None,
437        required = False,
[7014]438        readonly = False,
[6996]439        )
440
[6992]441    booking_session = schema.Choice(
[7723]442        title = _(u'Session'),
[6992]443        source = academic_sessions_vocab,
444        default = None,
445        required = True,
[7014]446        readonly = True,
[6992]447        )
448
449    booking_date = schema.Datetime(
[7723]450        title = _(u'Booking Date'),
[6992]451        required = False,
[7014]452        readonly = True,
[6992]453        )
454
455    booking_code = schema.TextLine(
[7723]456        title = _(u'Booking Activation Code'),
[6992]457        default = u'',
458        required = False,
[7014]459        readonly = True,
[6992]460        )
461
[6994]462    def getSessionString():
[7633]463        """Returns the title of academic_sessions_vocab term.
[7150]464
[6994]465        """
[6992]466
[6860]467class IStudentPaymentsContainer(IPaymentsContainer):
[6635]468    """A container for student payment objects.
469
470    """
471
[6877]472class IStudentOnlinePayment(IOnlinePayment):
473    """A student payment via payment gateways.
474
475    """
476    p_session = schema.Choice(
[7723]477        title = _(u'Payment Session'),
[6877]478        source = academic_sessions_vocab,
479        required = False,
480        )
481
482IStudentOnlinePayment['p_session'].order = IStudentOnlinePayment[
483    'p_item'].order
484
[7819]485class IStudentChangePassword(IKofaObject):
[7369]486    """Interface needed for change pasword page.
487
488    """
489
490    reg_number = schema.TextLine(
[7723]491        title = _(u'Registration Number'),
[7369]492        default = None,
493        required = True,
494        readonly = False,
495        )
496
497    email = schema.ASCIILine(
[7723]498        title = _(u'Email Address'),
[7369]499        required = True,
500        constraint=validate_email,
501        )
Note: See TracBrowser for help on using the repository browser.