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

Last change on this file since 9136 was 9131, checked in by Henrik Bettermann, 12 years ago

Add method for transferring students when the student has changed the course of study.

  • Property svn:keywords set to Id
File size: 15.2 KB
Line 
1## $Id: interfaces.py 9131 2012-08-31 09:21:59Z 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##
18#from 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, ICSVExporter)
25from waeup.kofa.interfaces import MessageFactory as _
26from waeup.kofa.schema import TextLineChoice, FormattedDate, PhoneNumber
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 (
32    IPaymentsContainer, IOnlinePayment)
33from waeup.kofa.university.vocabularies import (
34    CourseSource, StudyModeSource, CertificateSource)
35
36# VerdictSource can't be placed into the vocabularies module because it
37# requires importing IStudentsUtils which then leads to circular imports.
38class VerdictSource(BasicContextualSourceFactory):
39    """A verdicts source delivers all verdicts provided
40    in the portal.
41    """
42    def getValues(self, context):
43        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
44        return sorted(verdicts_dict.keys())
45
46    def getToken(self, context, value):
47        return value
48
49    def getTitle(self, context, value):
50        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
51        if value != '0':
52            return verdicts_dict[value] + ' (%s)' % value
53        return verdicts_dict[value]
54
55
56class IStudentsUtils(Interface):
57    """A collection of methods which are subject to customization.
58
59    """
60    def setReturningData(student):
61        """ This method defines what happens after school fee payment
62        depending on the student's senate verdict.
63
64        In the base configuration current level is always increased
65        by 100 no matter which verdict has been assigned.
66        """
67
68    def setPaymentDetails(category, student):
69        """Create Payment object and set the payment data of a student for
70        the payment category specified.
71
72        """
73
74    def getAccommodation_details(student):
75        """Determine the accommodation dates of a student.
76
77        """
78
79    def selectBed(available_beds):
80        """Select a bed from a list of available beds.
81
82        In the standard configuration we select the first bed found,
83        but can also randomize the selection if we like.
84        """
85
86    def renderPDF(view, subject='', filename='slip.pdf',):
87        """Render pdf slips for various pages.
88
89        """
90
91class IStudentsContainer(IKofaObject):
92    """A students container contains university students.
93
94    """
95    def addStudent(student):
96        """Add an IStudent object and subcontainers.
97
98        """
99
100    def archive(id=None):
101        """Create on-dist archive of 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        students types are saved to disk.
110        """
111
112    def clear(id=None, archive=True):
113        """Remove students of type given by 'id'.
114
115        Optionally archive the students.
116
117        If id is `None`, all students are archived.
118
119        If id contains a single id string, only the respective
120        students are archived.
121
122        If id contains a list of id strings all of the respective
123        student types are saved to disk.
124
125        If `archive` is ``False`` none of the archive-handling is done
126        and respective students are simply removed from the
127        database.
128        """
129
130    unique_student_id = Attribute("""A unique student id.""")
131
132class IStudentNavigation(IKofaObject):
133    """Interface needed for student navigation, logging, etc.
134
135    """
136    student = Attribute('Student object of context.')
137
138    def writeLogMessage(view, message):
139        """Write a view specific log message into students.log.
140
141        """
142
143class IStudentBase(IKofaObject):
144    """Representation of student base data.
145
146    """
147    history = Attribute('Object history, a list of messages')
148    state = Attribute('Returns the registration state of a student')
149    password = Attribute('Encrypted password of a student')
150    certcode = Attribute('The certificate code of any chosen study course')
151    depcode = Attribute('The department code of any chosen study course')
152    faccode = Attribute('The faculty code of any chosen study course')
153    current_session = Attribute('The current session of the student')
154    current_mode = Attribute('The current mode of the student')
155    fullname = Attribute('All name parts separated by hyphens')
156    display_fullname = Attribute('The fullname of an applicant')
157    is_postgrad = Attribute('True if postgraduate student')
158
159    suspended = schema.Bool(
160        title = _(u'Account suspended'),
161        default = False,
162        required = False,
163        )
164
165    student_id = schema.TextLine(
166        title = _(u'Student Id'),
167        required = False,
168        )
169
170    firstname = schema.TextLine(
171        title = _(u'First Name'),
172        required = True,
173        )
174
175    middlename = schema.TextLine(
176        title = _(u'Middle Name'),
177        required = False,
178        )
179
180    lastname = schema.TextLine(
181        title = _(u'Last Name (Surname)'),
182        required = True,
183        )
184
185    sex = schema.Choice(
186        title = _(u'Sex'),
187        source = GenderSource(),
188        required = True,
189        )
190
191    reg_number = TextLineChoice(
192        title = _(u'Registration Number'),
193        required = True,
194        readonly = False,
195        source = contextual_reg_num_source,
196        )
197
198    matric_number = TextLineChoice(
199        title = _(u'Matriculation Number'),
200        required = False,
201        readonly = False,
202        source = contextual_mat_num_source,
203        )
204
205    adm_code = schema.TextLine(
206        title = _(u'PWD Activation Code'),
207        required = False,
208        readonly = False,
209        )
210
211    email = schema.ASCIILine(
212        title = _(u'Email'),
213        required = False,
214        constraint=validate_email,
215        )
216    phone = PhoneNumber(
217        title = _(u'Phone'),
218        description = u'',
219        required = False,
220        )
221
222    def transfer(certificate, current_session,
223        current_level, current_verdict):
224        """ Creates a new studycourse and backups the old one.
225
226        """
227
228class IUGStudentClearance(IKofaObject):
229    """Representation of undergraduate student clearance data.
230
231    """
232    date_of_birth = FormattedDate(
233        title = _(u'Date of Birth'),
234        required = True,
235        show_year = True,
236        )
237
238    clearance_locked = schema.Bool(
239        title = _(u'Clearance form locked'),
240        default = False,
241        required = False,
242        )
243
244    clr_code = schema.TextLine(
245        title = _(u'CLR Activation Code'),
246        required = False,
247        readonly = False,
248        )
249
250    nationality = schema.Choice(
251        vocabulary = nats_vocab,
252        title = _(u'Nationality'),
253        required = False,
254        )
255
256class IPGStudentClearance(IUGStudentClearance):
257    """Representation of postgraduate student clearance data.
258
259    """
260    employer = schema.TextLine(
261        title = _(u'Employer'),
262        required = False,
263        readonly = False,
264        )
265
266class IStudentPersonal(IKofaObject):
267    """Representation of student personal data.
268
269    """
270    perm_address = schema.Text(
271        title = _(u'Permanent Address'),
272        required = False,
273        )
274
275class IStudent(IStudentBase,IUGStudentClearance,IPGStudentClearance,
276    IStudentPersonal):
277    """Representation of a student.
278
279    """
280
281class IStudentUpdateByRegNo(IStudent):
282    """Representation of a student. Skip regular reg_number validation.
283
284    """
285    reg_number = schema.TextLine(
286        title = _(u'Registration Number'),
287        required = False,
288        )
289
290class IStudentUpdateByMatricNo(IStudent):
291    """Representation of a student. Skip regular matric_number validation.
292
293    """
294    matric_number = schema.TextLine(
295        title = _(u'Matriculation Number'),
296        required = False,
297        )
298
299class IStudentRequestPW(IStudent):
300    """Representation of an student for first-time password request.
301
302    This interface is used when students use the requestpw page to
303    login for the the first time.
304    """
305    number = schema.TextLine(
306        title = _(u'Registr. or Matric. Number'),
307        required = True,
308        )
309
310    firstname = schema.TextLine(
311        title = _(u'First Name'),
312        required = True,
313        )
314
315    email = schema.ASCIILine(
316        title = _(u'Email Address'),
317        required = True,
318        constraint=validate_email,
319        )
320
321class IStudentStudyCourse(IKofaObject):
322    """A container for student study levels.
323
324    """
325    certificate = schema.Choice(
326        title = _(u'Certificate'),
327        source = CertificateSource(),
328        required = False,
329        )
330
331    entry_mode = schema.Choice(
332        title = _(u'Entry Mode'),
333        source = StudyModeSource(),
334        required = True,
335        readonly = False,
336        )
337
338    entry_session = schema.Choice(
339        title = _(u'Entry Session'),
340        source = academic_sessions_vocab,
341        #default = datetime.now().year,
342        required = True,
343        readonly = False,
344        )
345
346    current_session = schema.Choice(
347        title = _(u'Current Session'),
348        source = academic_sessions_vocab,
349        required = True,
350        readonly = False,
351        )
352
353    current_level = schema.Choice(
354        title = _(u'Current Level'),
355        source = StudyLevelSource(),
356        required = False,
357        readonly = False,
358        )
359
360    current_verdict = schema.Choice(
361        title = _(u'Current Verdict'),
362        source = VerdictSource(),
363        default = '0',
364        required = False,
365        )
366
367    previous_verdict = schema.Choice(
368        title = _(u'Previous Verdict'),
369        source = VerdictSource(),
370        default = '0',
371        required = False,
372        )
373
374class IStudentVerdictUpdate(IKofaObject):
375    """A interface for verdict imports.
376
377    """
378
379    current_verdict = schema.Choice(
380        title = _(u'Current Verdict'),
381        source = VerdictSource(),
382        required = True,
383        )
384
385    current_session = schema.Choice(
386        title = _(u'Current Session'),
387        source = academic_sessions_vocab,
388        required = True,
389        )
390
391    current_level = schema.Choice(
392        title = _(u'Current Level'),
393        source = StudyLevelSource(),
394        required = True,
395        )
396
397class IStudentStudyLevel(IKofaObject):
398    """A container for course tickets.
399
400    """
401    level = Attribute('The level code')
402    validation_date = Attribute('The date of validation')
403    validated_by = Attribute('User Id of course adviser')
404
405    level_session = schema.Choice(
406        title = _(u'Session'),
407        source = academic_sessions_vocab,
408        required = True,
409        )
410
411    level_verdict = schema.Choice(
412        title = _(u'Verdict'),
413        source = VerdictSource(),
414        default = '0',
415        required = False,
416        )
417
418    def addCourseTicket(ticket, course):
419        """Add a course ticket object.
420        """
421
422class ICourseTicket(IKofaObject):
423    """A course ticket.
424
425    """
426    code = Attribute('code of the original course')
427    title = Attribute('title of the original course')
428    credits = Attribute('credits of the original course')
429    passmark = Attribute('passmark of the original course')
430    semester = Attribute('semester of the original course')
431    fcode = Attribute('faculty code of the original course')
432    dcode = Attribute('department code of the original course')
433
434    mandatory = schema.Bool(
435        title = _(u'Mandatory'),
436        default = False,
437        required = False,
438        readonly = False,
439        )
440
441    score = schema.Int(
442        title = _(u'Score'),
443        default = 0,
444        required = False,
445        readonly = False,
446        )
447
448    automatic = schema.Bool(
449        title = _(u'Automatical Creation'),
450        default = False,
451        required = False,
452        readonly = True,
453        )
454
455    carry_over = schema.Bool(
456        title = _(u'Carry-over Course'),
457        default = False,
458        required = False,
459        readonly = False,
460        )
461
462    def getLevel():
463        """Returns the id of the level the ticket has been added to.
464        """
465
466    def getLevelSession():
467        """Returns the session of the level the ticket has been added to.
468        """
469
470class ICourseTicketAdd(ICourseTicket):
471    """An interface for adding course tickets.
472
473    """
474    course = schema.Choice(
475        title = _(u'Course'),
476        source = CourseSource(),
477        readonly = False,
478        )
479
480class IStudentAccommodation(IKofaObject):
481    """A container for student accommodation objects.
482
483    """
484
485class IBedTicket(IKofaObject):
486    """A ticket for accommodation booking.
487
488    """
489    bed = Attribute('The bed object.')
490
491    bed_coordinates = schema.TextLine(
492        title = _(u'Bed Coordinates'),
493        required = False,
494        readonly = False,
495        )
496
497    bed_type = schema.TextLine(
498        title = _(u'Bed Type'),
499        required = False,
500        readonly = False,
501        )
502
503    booking_session = schema.Choice(
504        title = _(u'Session'),
505        source = academic_sessions_vocab,
506        required = True,
507        readonly = True,
508        )
509
510    booking_date = schema.Datetime(
511        title = _(u'Booking Date'),
512        required = False,
513        readonly = True,
514        )
515
516    booking_code = schema.TextLine(
517        title = _(u'Booking Activation Code'),
518        required = False,
519        readonly = True,
520        )
521
522    def getSessionString():
523        """Returns the title of academic_sessions_vocab term.
524
525        """
526
527class IStudentPaymentsContainer(IPaymentsContainer):
528    """A container for student payment objects.
529
530    """
531
532class IStudentOnlinePayment(IOnlinePayment):
533    """A student payment via payment gateways.
534
535    """
536
537    p_level = schema.Int(
538        title = _(u'Payment Level'),
539        required = False,
540        readonly = True,
541        )
542
543    def doAfterStudentPayment():
544        """Process student after payment was made.
545
546        """
547
548    def doAfterStudentPaymentApproval():
549        """Process student after payment was approved.
550
551        """
552
553    def approveStudentPayment():
554        """Approve payment and process student.
555
556        """
557
558IStudentOnlinePayment['p_level'].order = IStudentOnlinePayment[
559    'p_session'].order
560
561class ICSVStudentExporter(ICSVExporter):
562    """A regular ICSVExporter that additionally supports exporting
563      data from a given student object.
564    """
565
566    def export_student(student, filepath=None):
567        """Export data for a given student.
568        """
Note: See TracBrowser for help on using the repository browser.