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

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

Returning students do not necessarily have a registration number and can use their matric. number instead.

  • Property svn:keywords set to Id
File size: 14.8 KB
RevLine 
[7191]1## $Id: interfaces.py 8854 2012-06-29 21:22:38Z henrik $
[6621]2##
[7191]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##
[8409]18#from datetime import datetime
[7620]19from zope.component import getUtility
[7256]20from zope.interface import Attribute, Interface
[6621]21from zope import schema
[7620]22from zc.sourcefactory.contextual import BasicContextualSourceFactory
[7811]23from waeup.kofa.interfaces import (
[8409]24    IKofaObject, academic_sessions_vocab, validate_email, ICSVExporter)
[7811]25from waeup.kofa.interfaces import MessageFactory as _
[8176]26from waeup.kofa.schema import TextLineChoice, FormattedDate, PhoneNumber
[7811]27from waeup.kofa.students.vocabularies import (
[7915]28    StudyLevelSource, contextual_reg_num_source, contextual_mat_num_source,
29    GenderSource, nats_vocab,
30    )
[8160]31from waeup.kofa.payments.interfaces import (
[8174]32    IPaymentsContainer, IOnlinePayment)
[7915]33from waeup.kofa.university.vocabularies import (
34    CourseSource, StudyModeSource, CertificateSource)
[6621]35
[7620]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):
[7841]43        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
[8820]44        return sorted(verdicts_dict.keys())
[7620]45
46    def getToken(self, context, value):
47        return value
48
49    def getTitle(self, context, value):
[7841]50        verdicts_dict = getUtility(IStudentsUtils).VERDICTS_DICT
[8820]51        if value != '0':
52            return verdicts_dict[value] + ' (%s)' % value
[7688]53        return verdicts_dict[value]
[7620]54
[7681]55
[7150]56class IStudentsUtils(Interface):
57    """A collection of methods which are subject to customization.
58
59    """
[7841]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
[8595]68    def setPaymentDetails(category, student):
69        """Create Payment object and set the payment data of a student for
70        the payment category specified.
[7150]71
72        """
73
[7186]74    def getAccommodation_details(student):
[7150]75        """Determine the accommodation dates of a student.
76
77        """
78
[7186]79    def selectBed(available_beds):
[7150]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
[7186]86    def renderPDF(view, subject='', filename='slip.pdf',):
[7150]87        """Render pdf slips for various pages.
88
89        """
90
[7819]91class IStudentsContainer(IKofaObject):
[7096]92    """A students container contains university students.
[6692]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
[8408]130    unique_student_id = Attribute("""A unique student id.""")
131
[7819]132class IStudentNavigation(IKofaObject):
[8735]133    """Interface needed for student navigation, logging, etc.
[7150]134
[6642]135    """
[8736]136    student = Attribute('Student object of context.')
[7150]137
[8735]138    def writeLogMessage(view, message):
139        """Write a view specific log message into students.log.
140
141        """
142
[7819]143class IStudentBase(IKofaObject):
[6631]144    """Representation of student base data.
[7150]145
[6621]146    """
[7062]147    history = Attribute('Object history, a list of messages')
[6637]148    state = Attribute('Returns the registration state of a student')
[6699]149    password = Attribute('Encrypted password of a student')
[7203]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')
[7062]153    current_session = Attribute('The current session of the student')
[7641]154    current_mode = Attribute('The current mode of the student')
[7364]155    fullname = Attribute('All name parts separated by hyphens')
156    display_fullname = Attribute('The fullname of an applicant')
[6637]157
[6665]158    student_id = schema.TextLine(
[7723]159        title = _(u'Student Id'),
[6849]160        required = False,
[6665]161        )
162
[7357]163    firstname = schema.TextLine(
[7723]164        title = _(u'First Name'),
[6621]165        required = True,
166        )
167
[7357]168    middlename = schema.TextLine(
[7723]169        title = _(u'Middle Name'),
[7357]170        required = False,
171        )
172
173    lastname = schema.TextLine(
[7723]174        title = _(u'Last Name (Surname)'),
[7357]175        required = True,
176        )
177
[6996]178    sex = schema.Choice(
[7723]179        title = _(u'Sex'),
[6996]180        source = GenderSource(),
181        required = True,
182        )
183
[6788]184    reg_number = TextLineChoice(
[7723]185        title = _(u'Registration Number'),
[6696]186        required = True,
187        readonly = False,
[6788]188        source = contextual_reg_num_source,
[6696]189        )
190
[6788]191    matric_number = TextLineChoice(
[7723]192        title = _(u'Matriculation Number'),
[6750]193        required = False,
194        readonly = False,
[6788]195        source = contextual_mat_num_source,
[6750]196        )
197
[6769]198    adm_code = schema.TextLine(
[7723]199        title = _(u'PWD Activation Code'),
[6769]200        required = False,
201        readonly = True,
202        )
203
[7133]204    email = schema.ASCIILine(
[7723]205        title = _(u'Email'),
[7133]206        required = False,
207        constraint=validate_email,
208        )
[8176]209    phone = PhoneNumber(
[7723]210        title = _(u'Phone'),
[7331]211        description = u'',
[7133]212        required = False,
213        )
214
[7993]215class IUGStudentClearance(IKofaObject):
216    """Representation of undergraduate student clearance data.
[7150]217
[6631]218    """
[8160]219    date_of_birth = FormattedDate(
[7723]220        title = _(u'Date of Birth'),
[6631]221        required = True,
[8160]222        show_year = True,
[6631]223        )
224
[6695]225    clearance_locked = schema.Bool(
[7723]226        title = _(u'Clearance form locked'),
[6695]227        default = False,
228        )
229
[6769]230    clr_code = schema.TextLine(
[7723]231        title = _(u'CLR Activation Code'),
[6769]232        required = False,
233        readonly = True,
234        )
235
[7523]236    nationality = schema.Choice(
[8069]237        vocabulary = nats_vocab,
[7723]238        title = _(u'Nationality'),
[7983]239        required = False,
[7523]240        )
241
[7993]242class IPGStudentClearance(IUGStudentClearance):
243    """Representation of postgraduate student clearance data.
244
245    """
246    employer = schema.TextLine(
247        title = _(u'Employer'),
248        required = False,
249        readonly = False,
250        )
251
[7819]252class IStudentPersonal(IKofaObject):
[6631]253    """Representation of student personal data.
[7150]254
[6631]255    """
[6651]256    perm_address = schema.Text(
[7723]257        title = _(u'Permanent Address'),
[6631]258        required = False,
259        )
260
[8008]261class IStudent(IStudentBase,IUGStudentClearance,IPGStudentClearance,
262    IStudentPersonal):
[6631]263    """Representation of a student.
[7150]264
[6631]265    """
266
[6849]267class IStudentUpdateByRegNo(IStudent):
268    """Representation of a student. Skip regular reg_number validation.
[7150]269
[6849]270    """
271    reg_number = schema.TextLine(
[7723]272        title = _(u'Registration Number'),
[6849]273        required = False,
274        )
275
276class IStudentUpdateByMatricNo(IStudent):
277    """Representation of a student. Skip regular matric_number validation.
[7150]278
[6849]279    """
280    matric_number = schema.TextLine(
[7723]281        title = _(u'Matriculation Number'),
[6849]282        required = False,
283        )
284
[8779]285class IStudentRequestPW(IStudent):
286    """Representation of an student for first-time password request.
287
288    This interface is used when students use the requestpw page to
289    login for the the first time.
290    """
[8854]291    number = schema.TextLine(
292        title = _(u'Registr. or Matric. Number'),
[8779]293        required = True,
294        )
295
296    firstname = schema.TextLine(
297        title = _(u'First Name'),
298        required = True,
299        )
300
301    email = schema.ASCIILine(
302        title = _(u'Email Address'),
303        required = True,
304        constraint=validate_email,
305        )
306
[7819]307class IStudentStudyCourse(IKofaObject):
[6633]308    """A container for student study levels.
309
310    """
[6648]311    certificate = schema.Choice(
[7723]312        title = _(u'Certificate'),
[6648]313        source = CertificateSource(),
[7209]314        required = False,
[6633]315        )
[6635]316
[6996]317    entry_mode = schema.Choice(
[7723]318        title = _(u'Entry Mode'),
[7681]319        source = StudyModeSource(),
[6996]320        required = True,
321        readonly = False,
322        )
323
324    entry_session = schema.Choice(
[7723]325        title = _(u'Entry Session'),
[6996]326        source = academic_sessions_vocab,
[7425]327        #default = datetime.now().year,
[6996]328        required = True,
329        readonly = False,
330        )
331
[6724]332    current_session = schema.Choice(
[7723]333        title = _(u'Current Session'),
[6744]334        source = academic_sessions_vocab,
[6724]335        required = True,
[6996]336        readonly = False,
[6724]337        )
338
339    current_level = schema.Choice(
[7723]340        title = _(u'Current Level'),
[6725]341        source = StudyLevelSource(),
342        required = False,
[6996]343        readonly = False,
[6724]344        )
345
346    current_verdict = schema.Choice(
[7723]347        title = _(u'Current Verdict'),
[7619]348        source = VerdictSource(),
[8820]349        default = '0',
[6725]350        required = False,
[6724]351        )
352
353    previous_verdict = schema.Choice(
[7723]354        title = _(u'Previous Verdict'),
[7619]355        source = VerdictSource(),
[8820]356        default = '0',
[6725]357        required = False,
[6724]358        )
359
[7951]360class IStudentVerdictUpdate(IKofaObject):
361    """A interface for verdict imports.
362
363    """
364
365    current_verdict = schema.Choice(
366        title = _(u'Current Verdict'),
367        source = VerdictSource(),
368        required = True,
369        )
370
371    current_session = schema.Choice(
372        title = _(u'Current Session'),
373        source = academic_sessions_vocab,
374        required = True,
375        )
376
377    current_level = schema.Choice(
378        title = _(u'Current Level'),
379        source = StudyLevelSource(),
380        required = True,
381        )
382
[7819]383class IStudentStudyLevel(IKofaObject):
[6774]384    """A container for course tickets.
385
386    """
387    level = Attribute('The level code')
[6793]388    validation_date = Attribute('The date of validation')
389    validated_by = Attribute('User Id of course adviser')
[6774]390
[6793]391    level_session = schema.Choice(
[7723]392        title = _(u'Session'),
[6793]393        source = academic_sessions_vocab,
394        required = True,
395        )
[6781]396
[6793]397    level_verdict = schema.Choice(
[7723]398        title = _(u'Verdict'),
[7619]399        source = VerdictSource(),
[8820]400        default = '0',
[6793]401        required = False,
402        )
403
[8182]404    def addCourseTicket(courseticket):
405        """Add a course ticket object.
406        """
407
[7819]408class ICourseTicket(IKofaObject):
[6781]409    """A course ticket.
410
411    """
[6783]412    code = Attribute('code of the original course')
413    title = Attribute('title of the original course')
414    credits = Attribute('credits of the original course')
415    passmark = Attribute('passmark of the original course')
416    semester = Attribute('semester of the original course')
[7304]417    fcode = Attribute('faculty code of the original course')
418    dcode = Attribute('department code of the original course')
[6781]419
[7665]420    mandatory = schema.Bool(
[7723]421        title = _(u'Mandatory'),
[6795]422        default = False,
423        required = False,
424        readonly = False,
425        )
426
[6781]427    score = schema.Int(
[7723]428        title = _(u'Score'),
[6781]429        default = 0,
430        required = False,
431        readonly = False,
432        )
433
[6806]434    automatic = schema.Bool(
[7723]435        title = _(u'Automatical Creation'),
[6806]436        default = False,
437        required = False,
438        readonly = True,
439        )
440
[7661]441    carry_over = schema.Bool(
[7723]442        title = _(u'Carry-over Course'),
[7661]443        default = False,
444        required = False,
445        readonly = False,
446        )
447
[7633]448    def getLevel():
449        """Returns the id of the level the ticket has been added to.
450        """
451
452    def getLevelSession():
453        """Returns the session of the level the ticket has been added to.
454        """
455
[6795]456class ICourseTicketAdd(ICourseTicket):
[7150]457    """An interface for adding course tickets.
[6795]458
459    """
460    course = schema.Choice(
[7723]461        title = _(u'Course'),
[6795]462        source = CourseSource(),
463        readonly = False,
464        )
465
[7819]466class IStudentAccommodation(IKofaObject):
[6635]467    """A container for student accommodation objects.
468
469    """
470
[7819]471class IBedTicket(IKofaObject):
[6989]472    """A ticket for accommodation booking.
473
474    """
[6996]475    bed = Attribute('The bed object.')
476
477    bed_coordinates = schema.TextLine(
[7723]478        title = _(u'Bed Coordinates'),
[6992]479        required = False,
[7014]480        readonly = False,
[6992]481        )
482
[6996]483    bed_type = schema.TextLine(
[7723]484        title = _(u'Bed Type'),
[6996]485        required = False,
[7014]486        readonly = False,
[6996]487        )
488
[6992]489    booking_session = schema.Choice(
[7723]490        title = _(u'Session'),
[6992]491        source = academic_sessions_vocab,
492        required = True,
[7014]493        readonly = True,
[6992]494        )
495
[8170]496    booking_date = schema.Datetime(
[7723]497        title = _(u'Booking Date'),
[6992]498        required = False,
[7014]499        readonly = True,
[6992]500        )
501
502    booking_code = schema.TextLine(
[7723]503        title = _(u'Booking Activation Code'),
[6992]504        required = False,
[7014]505        readonly = True,
[6992]506        )
507
[6994]508    def getSessionString():
[7633]509        """Returns the title of academic_sessions_vocab term.
[7150]510
[6994]511        """
[6992]512
[6860]513class IStudentPaymentsContainer(IPaymentsContainer):
[6635]514    """A container for student payment objects.
515
516    """
517
[6877]518class IStudentOnlinePayment(IOnlinePayment):
519    """A student payment via payment gateways.
520
521    """
522
[8268]523    p_level = schema.Int(
524        title = _(u'Payment Level'),
525        required = False,
526        readonly = True,
527        )
[6877]528
[8422]529    def doAfterStudentPayment():
530        """Process student after payment was made.
531
532        """
533
[8453]534    def doAfterStudentPaymentApproval():
535        """Process student after payment was approved.
536
537        """
538
[8420]539    def approveStudentPayment():
[8422]540        """Approve payment and process student.
[8420]541
542        """
543
[8268]544IStudentOnlinePayment['p_level'].order = IStudentOnlinePayment[
545    'p_session'].order
[8408]546
547class ICSVStudentExporter(ICSVExporter):
548    """A regular ICSVExporter that additionally supports exporting
549      data from a given student object.
550    """
551
552    def export_student(student, filepath=None):
553        """Export data for a given student.
554        """
Note: See TracBrowser for help on using the repository browser.