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
Line 
1## $Id: interfaces.py 7915 2012-03-19 04:21:47Z uli $
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##
18from datetime import datetime
19from zope.component import getUtility
20from zope.interface import Attribute, Interface
21from zope import schema
22from zc.sourcefactory.contextual import BasicContextualSourceFactory
23from waeup.kofa.interfaces import (
24    IKofaObject, academic_sessions_vocab, validate_email, IKofaUtils)
25from waeup.kofa.interfaces import MessageFactory as _
26from waeup.kofa.schema import TextLineChoice
27from waeup.kofa.students.vocabularies import (
28    StudyLevelSource, contextual_reg_num_source, contextual_mat_num_source,
29    GenderSource, nats_vocab,
30    )
31from waeup.kofa.payments.interfaces import IPaymentsContainer, IOnlinePayment
32from waeup.kofa.university.vocabularies import (
33    CourseSource, StudyModeSource, CertificateSource)
34
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):
42        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
43        return verdicts_dict.keys()
44
45    def getToken(self, context, value):
46        return value
47
48    def getTitle(self, context, value):
49        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
50        return verdicts_dict[value]
51
52
53class IStudentsUtils(Interface):
54    """A collection of methods which are subject to customization.
55
56    """
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
65    def getPaymentDetails(category, student):
66        """Get the payment dates of a student for the payment category
67        specified.
68
69        """
70
71    def getAccommodation_details(student):
72        """Determine the accommodation dates of a student.
73
74        """
75
76    def selectBed(available_beds):
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
83    def renderPDF(view, subject='', filename='slip.pdf',):
84        """Render pdf slips for various pages.
85
86        """
87
88class IStudentsContainer(IKofaObject):
89    """A students container contains university students.
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
127class IStudentNavigation(IKofaObject):
128    """Interface needed for student navigation.
129
130    """
131    def getStudent():
132        """Return student object.
133
134        """
135
136class IStudentBase(IKofaObject):
137    """Representation of student base data.
138
139    """
140    history = Attribute('Object history, a list of messages')
141    state = Attribute('Returns the registration state of a student')
142    password = Attribute('Encrypted password of a student')
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')
146    current_session = Attribute('The current session of the student')
147    current_mode = Attribute('The current mode of the student')
148    fullname = Attribute('All name parts separated by hyphens')
149    display_fullname = Attribute('The fullname of an applicant')
150
151    def loggerInfo(ob_class, comment):
152        """Adds an INFO message to the log file.
153
154        """
155
156    student_id = schema.TextLine(
157        title = _(u'Student Id'),
158        required = False,
159        )
160
161    firstname = schema.TextLine(
162        title = _(u'First Name'),
163        required = True,
164        )
165
166    middlename = schema.TextLine(
167        title = _(u'Middle Name'),
168        required = False,
169        )
170
171    lastname = schema.TextLine(
172        title = _(u'Last Name (Surname)'),
173        required = True,
174        )
175
176    sex = schema.Choice(
177        title = _(u'Sex'),
178        source = GenderSource(),
179        default = u'm',
180        required = True,
181        )
182
183    reg_number = TextLineChoice(
184        title = _(u'Registration Number'),
185        required = True,
186        readonly = False,
187        source = contextual_reg_num_source,
188        )
189
190    matric_number = TextLineChoice(
191        title = _(u'Matriculation Number'),
192        #default = u'',
193        required = False,
194        readonly = False,
195        source = contextual_mat_num_source,
196        )
197
198    adm_code = schema.TextLine(
199        title = _(u'PWD Activation Code'),
200        default = u'',
201        required = False,
202        readonly = True,
203        )
204
205    email = schema.ASCIILine(
206        title = _(u'Email'),
207        required = False,
208        constraint=validate_email,
209        )
210    phone = schema.TextLine(
211        title = _(u'Phone'),
212        description = u'',
213        required = False,
214        )
215
216class IStudentClearance(IKofaObject):
217    """Representation of student clearance data.
218
219    """
220    date_of_birth = schema.Date(
221        title = _(u'Date of Birth'),
222        required = True,
223        )
224
225    clearance_locked = schema.Bool(
226        title = _(u'Clearance form locked'),
227        default = False,
228        )
229
230    clr_code = schema.TextLine(
231        title = _(u'CLR Activation Code'),
232        default = u'',
233        required = False,
234        readonly = True,
235        )
236
237    nationality = schema.Choice(
238        source = nats_vocab,
239        title = _(u'Nationality'),
240        default = 'nigeria',
241        required = True,
242        )
243
244class IStudentPersonal(IKofaObject):
245    """Representation of student personal data.
246
247    """
248    perm_address = schema.Text(
249        title = _(u'Permanent Address'),
250        required = False,
251        )
252
253class IStudent(IStudentBase,IStudentClearance,IStudentPersonal):
254    """Representation of a student.
255
256    """
257
258class IStudentUpdateByRegNo(IStudent):
259    """Representation of a student. Skip regular reg_number validation.
260
261    """
262    reg_number = schema.TextLine(
263        title = _(u'Registration Number'),
264        default = None,
265        required = False,
266        )
267
268class IStudentUpdateByMatricNo(IStudent):
269    """Representation of a student. Skip regular matric_number validation.
270
271    """
272    matric_number = schema.TextLine(
273        title = _(u'Matriculation Number'),
274        default = None,
275        required = False,
276        )
277
278class IStudentStudyCourse(IKofaObject):
279    """A container for student study levels.
280
281    """
282    certificate = schema.Choice(
283        title = _(u'Certificate'),
284        source = CertificateSource(),
285        default = None,
286        required = False,
287        )
288
289    entry_mode = schema.Choice(
290        title = _(u'Entry Mode'),
291        source = StudyModeSource(),
292        default = u'ug_ft',
293        required = True,
294        readonly = False,
295        )
296
297    entry_session = schema.Choice(
298        title = _(u'Entry Session'),
299        source = academic_sessions_vocab,
300        #default = datetime.now().year,
301        default = None,
302        required = True,
303        readonly = False,
304        )
305
306    current_session = schema.Choice(
307        title = _(u'Current Session'),
308        source = academic_sessions_vocab,
309        default = None,
310        required = True,
311        readonly = False,
312        )
313
314    current_level = schema.Choice(
315        title = _(u'Current Level'),
316        source = StudyLevelSource(),
317        default = None,
318        required = False,
319        readonly = False,
320        )
321
322    current_verdict = schema.Choice(
323        title = _(u'Current Verdict'),
324        source = VerdictSource(),
325        default = '0',
326        required = False,
327        )
328
329    previous_verdict = schema.Choice(
330        title = _(u'Previous Verdict'),
331        source = VerdictSource(),
332        default = '0',
333        required = False,
334        )
335
336class IStudentStudyLevel(IKofaObject):
337    """A container for course tickets.
338
339    """
340    level = Attribute('The level code')
341    validation_date = Attribute('The date of validation')
342    validated_by = Attribute('User Id of course adviser')
343
344    level_session = schema.Choice(
345        title = _(u'Session'),
346        source = academic_sessions_vocab,
347        default = None,
348        required = True,
349        )
350
351    level_verdict = schema.Choice(
352        title = _(u'Verdict'),
353        source = VerdictSource(),
354        default = '0',
355        required = False,
356        )
357
358class ICourseTicket(IKofaObject):
359    """A course ticket.
360
361    """
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')
367    fcode = Attribute('faculty code of the original course')
368    dcode = Attribute('department code of the original course')
369
370    mandatory = schema.Bool(
371        title = _(u'Mandatory'),
372        default = False,
373        required = False,
374        readonly = False,
375        )
376
377    score = schema.Int(
378        title = _(u'Score'),
379        default = 0,
380        required = False,
381        readonly = False,
382        )
383
384    automatic = schema.Bool(
385        title = _(u'Automatical Creation'),
386        default = False,
387        required = False,
388        readonly = True,
389        )
390
391    carry_over = schema.Bool(
392        title = _(u'Carry-over Course'),
393        default = False,
394        required = False,
395        readonly = False,
396        )
397
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
406class ICourseTicketAdd(ICourseTicket):
407    """An interface for adding course tickets.
408
409    """
410    course = schema.Choice(
411        title = _(u'Course'),
412        source = CourseSource(),
413        readonly = False,
414        )
415
416class IStudentAccommodation(IKofaObject):
417    """A container for student accommodation objects.
418
419    """
420
421class IBedTicket(IKofaObject):
422    """A ticket for accommodation booking.
423
424    """
425    bed = Attribute('The bed object.')
426
427    bed_coordinates = schema.TextLine(
428        title = _(u'Bed Coordinates'),
429        default = None,
430        required = False,
431        readonly = False,
432        )
433
434    bed_type = schema.TextLine(
435        title = _(u'Bed Type'),
436        default = None,
437        required = False,
438        readonly = False,
439        )
440
441    booking_session = schema.Choice(
442        title = _(u'Session'),
443        source = academic_sessions_vocab,
444        default = None,
445        required = True,
446        readonly = True,
447        )
448
449    booking_date = schema.Datetime(
450        title = _(u'Booking Date'),
451        required = False,
452        readonly = True,
453        )
454
455    booking_code = schema.TextLine(
456        title = _(u'Booking Activation Code'),
457        default = u'',
458        required = False,
459        readonly = True,
460        )
461
462    def getSessionString():
463        """Returns the title of academic_sessions_vocab term.
464
465        """
466
467class IStudentPaymentsContainer(IPaymentsContainer):
468    """A container for student payment objects.
469
470    """
471
472class IStudentOnlinePayment(IOnlinePayment):
473    """A student payment via payment gateways.
474
475    """
476    p_session = schema.Choice(
477        title = _(u'Payment Session'),
478        source = academic_sessions_vocab,
479        required = False,
480        )
481
482IStudentOnlinePayment['p_session'].order = IStudentOnlinePayment[
483    'p_item'].order
484
485class IStudentChangePassword(IKofaObject):
486    """Interface needed for change pasword page.
487
488    """
489
490    reg_number = schema.TextLine(
491        title = _(u'Registration Number'),
492        default = None,
493        required = True,
494        readonly = False,
495        )
496
497    email = schema.ASCIILine(
498        title = _(u'Email Address'),
499        required = True,
500        constraint=validate_email,
501        )
Note: See TracBrowser for help on using the repository browser.