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

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

Add verdict processor.

  • Property svn:keywords set to Id
File size: 13.9 KB
Line 
1## $Id: interfaces.py 7951 2012-03-22 07:21:20Z henrik $
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 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        default = None,
351        required = True,
352        )
353
354    current_level = schema.Choice(
355        title = _(u'Current Level'),
356        source = StudyLevelSource(),
357        default = None,
358        required = True,
359        )
360
361class IStudentStudyLevel(IKofaObject):
362    """A container for course tickets.
363
364    """
365    level = Attribute('The level code')
366    validation_date = Attribute('The date of validation')
367    validated_by = Attribute('User Id of course adviser')
368
369    level_session = schema.Choice(
370        title = _(u'Session'),
371        source = academic_sessions_vocab,
372        default = None,
373        required = True,
374        )
375
376    level_verdict = schema.Choice(
377        title = _(u'Verdict'),
378        source = VerdictSource(),
379        default = '0',
380        required = False,
381        )
382
383class ICourseTicket(IKofaObject):
384    """A course ticket.
385
386    """
387    code = Attribute('code of the original course')
388    title = Attribute('title of the original course')
389    credits = Attribute('credits of the original course')
390    passmark = Attribute('passmark of the original course')
391    semester = Attribute('semester of the original course')
392    fcode = Attribute('faculty code of the original course')
393    dcode = Attribute('department code of the original course')
394
395    mandatory = schema.Bool(
396        title = _(u'Mandatory'),
397        default = False,
398        required = False,
399        readonly = False,
400        )
401
402    score = schema.Int(
403        title = _(u'Score'),
404        default = 0,
405        required = False,
406        readonly = False,
407        )
408
409    automatic = schema.Bool(
410        title = _(u'Automatical Creation'),
411        default = False,
412        required = False,
413        readonly = True,
414        )
415
416    carry_over = schema.Bool(
417        title = _(u'Carry-over Course'),
418        default = False,
419        required = False,
420        readonly = False,
421        )
422
423    def getLevel():
424        """Returns the id of the level the ticket has been added to.
425        """
426
427    def getLevelSession():
428        """Returns the session of the level the ticket has been added to.
429        """
430
431class ICourseTicketAdd(ICourseTicket):
432    """An interface for adding course tickets.
433
434    """
435    course = schema.Choice(
436        title = _(u'Course'),
437        source = CourseSource(),
438        readonly = False,
439        )
440
441class IStudentAccommodation(IKofaObject):
442    """A container for student accommodation objects.
443
444    """
445
446class IBedTicket(IKofaObject):
447    """A ticket for accommodation booking.
448
449    """
450    bed = Attribute('The bed object.')
451
452    bed_coordinates = schema.TextLine(
453        title = _(u'Bed Coordinates'),
454        default = None,
455        required = False,
456        readonly = False,
457        )
458
459    bed_type = schema.TextLine(
460        title = _(u'Bed Type'),
461        default = None,
462        required = False,
463        readonly = False,
464        )
465
466    booking_session = schema.Choice(
467        title = _(u'Session'),
468        source = academic_sessions_vocab,
469        default = None,
470        required = True,
471        readonly = True,
472        )
473
474    booking_date = schema.Datetime(
475        title = _(u'Booking Date'),
476        required = False,
477        readonly = True,
478        )
479
480    booking_code = schema.TextLine(
481        title = _(u'Booking Activation Code'),
482        default = u'',
483        required = False,
484        readonly = True,
485        )
486
487    def getSessionString():
488        """Returns the title of academic_sessions_vocab term.
489
490        """
491
492class IStudentPaymentsContainer(IPaymentsContainer):
493    """A container for student payment objects.
494
495    """
496
497class IStudentOnlinePayment(IOnlinePayment):
498    """A student payment via payment gateways.
499
500    """
501    p_session = schema.Choice(
502        title = _(u'Payment Session'),
503        source = academic_sessions_vocab,
504        required = False,
505        )
506
507IStudentOnlinePayment['p_session'].order = IStudentOnlinePayment[
508    'p_item'].order
509
510class IStudentChangePassword(IKofaObject):
511    """Interface needed for change pasword page.
512
513    """
514
515    reg_number = schema.TextLine(
516        title = _(u'Registration Number'),
517        default = None,
518        required = True,
519        readonly = False,
520        )
521
522    email = schema.ASCIILine(
523        title = _(u'Email Address'),
524        required = True,
525        constraint=validate_email,
526        )
Note: See TracBrowser for help on using the repository browser.