source: main/waeup.sirp/trunk/src/waeup/sirp/students/interfaces.py @ 7663

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

Implement carry-over course collection. Collect carry-over courses in base levels (not in repeating levels).

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