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

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

For FCEOkene we also need current_level as a property of student.

  • Property svn:keywords set to Id
File size: 15.8 KB
Line 
1## $Id: interfaces.py 9142 2012-09-01 13:39:16Z 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_level = Attribute('The current level of the student')
155    current_mode = Attribute('The current mode of the student')
156    fullname = Attribute('All name parts separated by hyphens')
157    display_fullname = Attribute('The fullname of an applicant')
158    is_postgrad = Attribute('True if postgraduate student')
159
160    suspended = schema.Bool(
161        title = _(u'Account suspended'),
162        default = False,
163        required = False,
164        )
165
166    student_id = schema.TextLine(
167        title = _(u'Student Id'),
168        required = False,
169        )
170
171    firstname = schema.TextLine(
172        title = _(u'First Name'),
173        required = True,
174        )
175
176    middlename = schema.TextLine(
177        title = _(u'Middle Name'),
178        required = False,
179        )
180
181    lastname = schema.TextLine(
182        title = _(u'Last Name (Surname)'),
183        required = True,
184        )
185
186    sex = schema.Choice(
187        title = _(u'Sex'),
188        source = GenderSource(),
189        required = True,
190        )
191
192    reg_number = TextLineChoice(
193        title = _(u'Registration Number'),
194        required = True,
195        readonly = False,
196        source = contextual_reg_num_source,
197        )
198
199    matric_number = TextLineChoice(
200        title = _(u'Matriculation Number'),
201        required = False,
202        readonly = False,
203        source = contextual_mat_num_source,
204        )
205
206    adm_code = schema.TextLine(
207        title = _(u'PWD Activation Code'),
208        required = False,
209        readonly = False,
210        )
211
212    email = schema.ASCIILine(
213        title = _(u'Email'),
214        required = False,
215        constraint=validate_email,
216        )
217    phone = PhoneNumber(
218        title = _(u'Phone'),
219        description = u'',
220        required = False,
221        )
222
223    def transfer(certificate, current_session,
224        current_level, current_verdict):
225        """ Creates a new studycourse and backups the old one.
226
227        """
228
229class IUGStudentClearance(IKofaObject):
230    """Representation of undergraduate student clearance data.
231
232    """
233    date_of_birth = FormattedDate(
234        title = _(u'Date of Birth'),
235        required = True,
236        show_year = True,
237        )
238
239    clearance_locked = schema.Bool(
240        title = _(u'Clearance form locked'),
241        default = False,
242        required = False,
243        )
244
245    clr_code = schema.TextLine(
246        title = _(u'CLR Activation Code'),
247        required = False,
248        readonly = False,
249        )
250
251    nationality = schema.Choice(
252        vocabulary = nats_vocab,
253        title = _(u'Nationality'),
254        required = False,
255        )
256
257class IPGStudentClearance(IUGStudentClearance):
258    """Representation of postgraduate student clearance data.
259
260    """
261    employer = schema.TextLine(
262        title = _(u'Employer'),
263        required = False,
264        readonly = False,
265        )
266
267class IStudentPersonal(IKofaObject):
268    """Representation of student personal data.
269
270    """
271    perm_address = schema.Text(
272        title = _(u'Permanent Address'),
273        required = False,
274        )
275
276class IStudent(IStudentBase,IUGStudentClearance,IPGStudentClearance,
277    IStudentPersonal):
278    """Representation of a student.
279
280    """
281
282class IStudentUpdateByRegNo(IStudent):
283    """Representation of a student. Skip regular reg_number validation.
284
285    """
286    reg_number = schema.TextLine(
287        title = _(u'Registration Number'),
288        required = False,
289        )
290
291class IStudentUpdateByMatricNo(IStudent):
292    """Representation of a student. Skip regular matric_number validation.
293
294    """
295    matric_number = schema.TextLine(
296        title = _(u'Matriculation Number'),
297        required = False,
298        )
299
300class IStudentRequestPW(IStudent):
301    """Representation of an student for first-time password request.
302
303    This interface is used when students use the requestpw page to
304    login for the the first time.
305    """
306    number = schema.TextLine(
307        title = _(u'Registr. or Matric. Number'),
308        required = True,
309        )
310
311    firstname = schema.TextLine(
312        title = _(u'First Name'),
313        required = True,
314        )
315
316    email = schema.ASCIILine(
317        title = _(u'Email Address'),
318        required = True,
319        constraint=validate_email,
320        )
321
322class IStudentStudyCourse(IKofaObject):
323    """A container for student study levels.
324
325    """
326    certificate = schema.Choice(
327        title = _(u'Certificate'),
328        source = CertificateSource(),
329        required = False,
330        )
331
332    entry_mode = schema.Choice(
333        title = _(u'Entry Mode'),
334        source = StudyModeSource(),
335        required = True,
336        readonly = False,
337        )
338
339    entry_session = schema.Choice(
340        title = _(u'Entry Session'),
341        source = academic_sessions_vocab,
342        #default = datetime.now().year,
343        required = True,
344        readonly = False,
345        )
346
347    current_session = schema.Choice(
348        title = _(u'Current Session'),
349        source = academic_sessions_vocab,
350        required = True,
351        readonly = False,
352        )
353
354    current_level = schema.Choice(
355        title = _(u'Current Level'),
356        source = StudyLevelSource(),
357        required = False,
358        readonly = False,
359        )
360
361    current_verdict = schema.Choice(
362        title = _(u'Current Verdict'),
363        source = VerdictSource(),
364        default = '0',
365        required = False,
366        )
367
368    previous_verdict = schema.Choice(
369        title = _(u'Previous Verdict'),
370        source = VerdictSource(),
371        default = '0',
372        required = False,
373        )
374
375class IStudentStudyCourseTransfer(IStudentStudyCourse):
376    """An student transfers.
377
378    """
379
380    certificate = schema.Choice(
381        title = _(u'Certificate'),
382        source = CertificateSource(),
383        required = True,
384        )
385
386    current_level = schema.Choice(
387        title = _(u'Current Level'),
388        source = StudyLevelSource(),
389        required = True,
390        readonly = False,
391        )
392
393
394IStudentStudyCourseTransfer['certificate'].order = IStudentStudyCourse[
395    'certificate'].order
396IStudentStudyCourseTransfer['current_level'].order = IStudentStudyCourse[
397    'current_level'].order
398
399class IStudentVerdictUpdate(IKofaObject):
400    """A interface for verdict imports.
401
402    """
403
404    current_verdict = schema.Choice(
405        title = _(u'Current Verdict'),
406        source = VerdictSource(),
407        required = True,
408        )
409
410    current_session = schema.Choice(
411        title = _(u'Current Session'),
412        source = academic_sessions_vocab,
413        required = True,
414        )
415
416    current_level = schema.Choice(
417        title = _(u'Current Level'),
418        source = StudyLevelSource(),
419        required = True,
420        )
421
422class IStudentStudyLevel(IKofaObject):
423    """A container for course tickets.
424
425    """
426    level = Attribute('The level code')
427    validation_date = Attribute('The date of validation')
428    validated_by = Attribute('User Id of course adviser')
429
430    level_session = schema.Choice(
431        title = _(u'Session'),
432        source = academic_sessions_vocab,
433        required = True,
434        )
435
436    level_verdict = schema.Choice(
437        title = _(u'Verdict'),
438        source = VerdictSource(),
439        default = '0',
440        required = False,
441        )
442
443    def addCourseTicket(ticket, course):
444        """Add a course ticket object.
445        """
446
447class ICourseTicket(IKofaObject):
448    """A course ticket.
449
450    """
451    code = Attribute('code of the original course')
452    title = Attribute('title of the original course')
453    credits = Attribute('credits of the original course')
454    passmark = Attribute('passmark of the original course')
455    semester = Attribute('semester of the original course')
456    fcode = Attribute('faculty code of the original course')
457    dcode = Attribute('department code of the original course')
458
459    mandatory = schema.Bool(
460        title = _(u'Mandatory'),
461        default = False,
462        required = False,
463        readonly = False,
464        )
465
466    score = schema.Int(
467        title = _(u'Score'),
468        default = 0,
469        required = False,
470        readonly = False,
471        )
472
473    automatic = schema.Bool(
474        title = _(u'Automatical Creation'),
475        default = False,
476        required = False,
477        readonly = True,
478        )
479
480    carry_over = schema.Bool(
481        title = _(u'Carry-over Course'),
482        default = False,
483        required = False,
484        readonly = False,
485        )
486
487    def getLevel():
488        """Returns the id of the level the ticket has been added to.
489        """
490
491    def getLevelSession():
492        """Returns the session of the level the ticket has been added to.
493        """
494
495class ICourseTicketAdd(ICourseTicket):
496    """An interface for adding course tickets.
497
498    """
499    course = schema.Choice(
500        title = _(u'Course'),
501        source = CourseSource(),
502        readonly = False,
503        )
504
505class IStudentAccommodation(IKofaObject):
506    """A container for student accommodation objects.
507
508    """
509
510class IBedTicket(IKofaObject):
511    """A ticket for accommodation booking.
512
513    """
514    bed = Attribute('The bed object.')
515
516    bed_coordinates = schema.TextLine(
517        title = _(u'Bed Coordinates'),
518        required = False,
519        readonly = False,
520        )
521
522    bed_type = schema.TextLine(
523        title = _(u'Bed Type'),
524        required = False,
525        readonly = False,
526        )
527
528    booking_session = schema.Choice(
529        title = _(u'Session'),
530        source = academic_sessions_vocab,
531        required = True,
532        readonly = True,
533        )
534
535    booking_date = schema.Datetime(
536        title = _(u'Booking Date'),
537        required = False,
538        readonly = True,
539        )
540
541    booking_code = schema.TextLine(
542        title = _(u'Booking Activation Code'),
543        required = False,
544        readonly = True,
545        )
546
547    def getSessionString():
548        """Returns the title of academic_sessions_vocab term.
549
550        """
551
552class IStudentPaymentsContainer(IPaymentsContainer):
553    """A container for student payment objects.
554
555    """
556
557class IStudentOnlinePayment(IOnlinePayment):
558    """A student payment via payment gateways.
559
560    """
561
562    p_level = schema.Int(
563        title = _(u'Payment Level'),
564        required = False,
565        readonly = True,
566        )
567
568    def doAfterStudentPayment():
569        """Process student after payment was made.
570
571        """
572
573    def doAfterStudentPaymentApproval():
574        """Process student after payment was approved.
575
576        """
577
578    def approveStudentPayment():
579        """Approve payment and process student.
580
581        """
582
583IStudentOnlinePayment['p_level'].order = IStudentOnlinePayment[
584    'p_session'].order
585
586class ICSVStudentExporter(ICSVExporter):
587    """A regular ICSVExporter that additionally supports exporting
588      data from a given student object.
589    """
590
591    def export_student(student, filepath=None):
592        """Export data for a given student.
593        """
Note: See TracBrowser for help on using the repository browser.