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

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

Add current_mode index to students_catalog.

  • Property svn:keywords set to Id
File size: 12.7 KB
Line 
1## $Id: interfaces.py 7641 2012-02-14 07:07:46Z 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    def getLevel():
381        """Returns the id of the level the ticket has been added to.
382        """
383
384    def getLevelSession():
385        """Returns the session of the level the ticket has been added to.
386        """
387
388class ICourseTicketAdd(ICourseTicket):
389    """An interface for adding course tickets.
390
391    """
392    course = schema.Choice(
393        title = u'Course',
394        source = CourseSource(),
395        readonly = False,
396        )
397
398class IStudentAccommodation(ISIRPObject):
399    """A container for student accommodation objects.
400
401    """
402
403class IBedTicket(ISIRPObject):
404    """A ticket for accommodation booking.
405
406    """
407    bed = Attribute('The bed object.')
408
409    bed_coordinates = schema.TextLine(
410        title = u'Bed Coordinates',
411        default = None,
412        required = False,
413        readonly = False,
414        )
415
416    bed_type = schema.TextLine(
417        title = u'Bed Type',
418        default = None,
419        required = False,
420        readonly = False,
421        )
422
423    booking_session = schema.Choice(
424        title = u'Session',
425        source = academic_sessions_vocab,
426        default = None,
427        required = True,
428        readonly = True,
429        )
430
431    booking_date = schema.Datetime(
432        title = u'Booking Date',
433        required = False,
434        readonly = True,
435        )
436
437    booking_code = schema.TextLine(
438        title = u'Booking Activation Code',
439        default = u'',
440        required = False,
441        readonly = True,
442        )
443
444    def getSessionString():
445        """Returns the title of academic_sessions_vocab term.
446
447        """
448
449class IStudentPaymentsContainer(IPaymentsContainer):
450    """A container for student payment objects.
451
452    """
453
454class IStudentOnlinePayment(IOnlinePayment):
455    """A student payment via payment gateways.
456
457    """
458    p_session = schema.Choice(
459        title = u'Payment Session',
460        source = academic_sessions_vocab,
461        required = False,
462        )
463
464IStudentOnlinePayment['p_session'].order = IStudentOnlinePayment[
465    'p_item'].order
466
467class IStudentChangePassword(ISIRPObject):
468    """Interface needed for change pasword page.
469
470    """
471
472    reg_number = schema.TextLine(
473        title = u'Registration Number',
474        default = None,
475        required = True,
476        readonly = False,
477        )
478
479    email = schema.ASCIILine(
480        title = u'Email Address',
481        required = True,
482        constraint=validate_email,
483        )
Note: See TracBrowser for help on using the repository browser.