source: main/waeup.kofa/branches/henrik-transcript-workflow/src/waeup/kofa/students/interfaces.py

Last change on this file was 15155, checked in by Henrik Bettermann, 6 years ago

Reorganise interfaces.

Transcript processing views and viewlets are now in the context of studycourses. Officers can now validate, sign and release transcripts directly on the transcript page.

  • Property svn:keywords set to Id
File size: 27.4 KB
RevLine 
[7191]1## $Id: interfaces.py 15155 2018-09-20 07:04:17Z 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
[9217]23from waeup.kofa.browser.interfaces import IStudentNavigationBase
[7811]24from waeup.kofa.interfaces import (
[11450]25    IKofaObject, academic_sessions_vocab, validate_email, ICSVExporter,
[13125]26    ContextualDictSourceFactoryBase, IKofaUtils)
[7811]27from waeup.kofa.interfaces import MessageFactory as _
[8176]28from waeup.kofa.schema import TextLineChoice, FormattedDate, PhoneNumber
[7811]29from waeup.kofa.students.vocabularies import (
[7915]30    StudyLevelSource, contextual_reg_num_source, contextual_mat_num_source,
[9420]31    GenderSource, nats_vocab
[7915]32    )
[8160]33from waeup.kofa.payments.interfaces import (
[8174]34    IPaymentsContainer, IOnlinePayment)
[7915]35from waeup.kofa.university.vocabularies import (
[14642]36    CourseSource, StudyModeSource, CertificateSource,
37    SemesterSource, CourseCategorySource
[11450]38    )
[6621]39
[9864]40class PreviousPaymentCategorySource(ContextualDictSourceFactoryBase):
41    """A source that delivers all selectable categories of previous session
42    payments.
43    """
44    #: name of dict to deliver from kofa utils.
45    DICT_NAME = 'PREVIOUS_PAYMENT_CATEGORIES'
46
[9868]47class BalancePaymentCategorySource(ContextualDictSourceFactoryBase):
[9864]48    """A source that delivers all selectable items of balance payments.
49    """
50    #: name of dict to deliver from kofa utils.
[9868]51    DICT_NAME = 'BALANCE_PAYMENT_CATEGORIES'
[9864]52
[7620]53# VerdictSource can't be placed into the vocabularies module because it
54# requires importing IStudentsUtils which then leads to circular imports.
55class VerdictSource(BasicContextualSourceFactory):
56    """A verdicts source delivers all verdicts provided
57    in the portal.
58    """
59    def getValues(self, context):
[13125]60        verdicts_dict = getUtility(IKofaUtils).VERDICTS_DICT
[8820]61        return sorted(verdicts_dict.keys())
[7620]62
63    def getToken(self, context, value):
64        return value
65
66    def getTitle(self, context, value):
[13125]67        verdicts_dict = getUtility(IKofaUtils).VERDICTS_DICT
[8820]68        if value != '0':
69            return verdicts_dict[value] + ' (%s)' % value
[7688]70        return verdicts_dict[value]
[7620]71
[7681]72
[7150]73class IStudentsUtils(Interface):
74    """A collection of methods which are subject to customization.
75    """
[7841]76    def setReturningData(student):
77        """ This method defines what happens after school fee payment
78        depending on the student's senate verdict.
79
80        In the base configuration current level is always increased
81        by 100 no matter which verdict has been assigned.
82        """
83
[9148]84    def setPaymentDetails(category, student, previous_session=None,
85            previous_level=None,):
[8595]86        """Create Payment object and set the payment data of a student for
87        the payment category specified.
[12902]88        """
[7150]89
[12902]90    def increaseMatricInteger(student):
91        """Increase counter for matric numbers.
92
93        This counter can be a centrally stored attribute or an attribute of
94        faculties, departments or certificates. In the base package the counter
95        is as an attribute of the site configuration object.
[7150]96        """
97
[12902]98    def constructMatricNumber(student):
99        """Fetch the matric number counter which fits the student and
100        construct the new matric number of the student.
101
102        In the base package the counter is returned which is as an attribute
103        of the site configuration object.
104        """
105
[11589]106    def setMatricNumber(student):
107        """Set matriculation number of student.
108
109        If the student's matric number is unset a new matric number is
[12902]110        constructed according to the matriculation number construction rules
111        defined in the constructMatricNumber method. The new matric number is
112        set, the students catalog updated. The corresponding matric number
113        counter is increased by one.
[11589]114
115        This method is tested but not used in the base package. It can
116        be used in custom packages by adding respective views
[12902]117        and by customizing increaseMatricInteger and constructMatricNumber
118        according to the university's matriculation number construction rules.
[11589]119
[12902]120        The method can be disabled by setting the counter to zero.
[11589]121        """
122
[7186]123    def getAccommodation_details(student):
[7150]124        """Determine the accommodation dates of a student.
125        """
126
[7186]127    def selectBed(available_beds):
[7150]128        """Select a bed from a list of available beds.
129        In the standard configuration we select the first bed found,
130        but can also randomize the selection if we like.
131        """
132
[14655]133    def getDegreeClassNumber(level_obj):
134        """Get degree class number (used for SessionResultsPresentation
135        reports).
136        """
137
[9949]138    def getPDFCreator(context):
139        """Get some IPDFCreator instance suitable for use with `context`.
140        """
141
[7186]142    def renderPDF(view, subject='', filename='slip.pdf',):
[7150]143        """Render pdf slips for various pages.
144        """
145
[14655]146    def renderPDFAdmissionLetter(view, student=None, omit_fields=(),
147                                 pre_text=None, post_text=None,):
148        """Render pdf admission letter.
[14157]149        """
150
[14583]151    def renderPDFTranscript(view, filename, student,
152                  studentview, note, signatures, sigs_in_footer,
153                  show_scans, topMargin, omit_fields,
154                  tableheader, no_passport):
155        """Render pdf slip of a transcripts.
156        """
157
[14702]158    def renderPDFCourseticketsOverview(
159                  view, session, data, lecturers, orientation):
[14583]160        """Render pdf slip of course tickets for a lecturer.
161        """
162
[14584]163    def warnCreditsOOR(studylevel, course=None):
164        """Return message if credits are out of range. In the base
165        package only maximum credits is set.
[14583]166        """
167
168    def getBedCoordinates(bedticket):
169        """Return descriptive bed coordinates.
170        This method can be used to customize the `display_coordinates`
171        property method in order to  display a
172        customary description of the bed space.
173        """
174
175    def clearance_disabled_message(student):
176        """Render message if clearance is disabled.
177        """
178
[7819]179class IStudentsContainer(IKofaObject):
[7096]180    """A students container contains university students.
[6692]181    """
182    def addStudent(student):
183        """Add an IStudent object and subcontainers.
184        """
185
[13736]186    unique_student_id = Attribute('A unique student id')
[8408]187
[9217]188class IStudentNavigation(IStudentNavigationBase):
[13003]189    """Interface needed for navigation and logging. This interface is
[13076]190    implemented by all content classes in the students section.
[6642]191    """
[13003]192    student = Attribute('Student object of context')
[7150]193
[8735]194    def writeLogMessage(view, message):
[13167]195        """Add an INFO message to students.log.
[8735]196        """
197
[7819]198class IStudentBase(IKofaObject):
[6631]199    """Representation of student base data.
[6621]200    """
[12997]201    history = Attribute('Object history, a list of messages')
202    state = Attribute('Registration state')
[13080]203    translated_state = Attribute('Real name of the registration state')
[12997]204    certcode = Attribute('Certificate code of any chosen study course')
205    depcode = Attribute('Department code of any chosen study course')
206    faccode = Attribute('Faculty code of any chosen study course')
207    entry_session = Attribute('Entry session')
208    current_session = Attribute('Current session')
209    current_level = Attribute('Current level')
210    current_mode = Attribute('Current mode')
211    current_verdict = Attribute('Current verdict')
[7364]212    fullname = Attribute('All name parts separated by hyphens')
[12997]213    display_fullname = Attribute('Fullname as displayed on pages')
[8969]214    is_postgrad = Attribute('True if postgraduate student')
[12997]215    is_special_postgrad = Attribute('True if special postgraduate student')
216    is_fresh = Attribute('True if fresh student')
217    before_payment = Attribute('True if no previous payment has to be made')
218    personal_data_expired = Attribute('True if personal data expired')
219    transcript_enabled = Attribute('True if transcript processing is enabled')
[13103]220    clearance_locked = Attribute('True if clearance form is locked')
[15143]221    studycourse_locked = Attribute(
222        'True if nobody is allowed to change studycourse, studylecel or '
223        'course ticket data, neither through the UI nor via import')
[6637]224
[13003]225    password = Attribute('Encrypted password')
226    temp_password = Attribute('Dictionary with user name, timestamp and encrypted password')
227
[8983]228    suspended = schema.Bool(
229        title = _(u'Account suspended'),
230        default = False,
[9035]231        required = False,
[8983]232        )
233
[9702]234    suspended_comment = schema.Text(
235        title = _(u"Reasons for Deactivation"),
236        required = False,
237        description = _(
238            u'This message will be shown if and only if deactivated '
239            'students try to login.'),
240        )
241
[13711]242    flash_notice = schema.TextLine(
243        title = _(u'Flash Notice'),
244        required = False,
245        readonly = False,
246        description = _(
247            u'This single-line message will be shown in a flash box.'),
248        )
249
[6665]250    student_id = schema.TextLine(
[7723]251        title = _(u'Student Id'),
[6849]252        required = False,
[6665]253        )
254
[7357]255    firstname = schema.TextLine(
[7723]256        title = _(u'First Name'),
[6621]257        required = True,
258        )
259
[7357]260    middlename = schema.TextLine(
[7723]261        title = _(u'Middle Name'),
[7357]262        required = False,
263        )
264
265    lastname = schema.TextLine(
[7723]266        title = _(u'Last Name (Surname)'),
[7357]267        required = True,
268        )
269
[6996]270    sex = schema.Choice(
[7723]271        title = _(u'Sex'),
[6996]272        source = GenderSource(),
273        required = True,
274        )
275
[6788]276    reg_number = TextLineChoice(
[7723]277        title = _(u'Registration Number'),
[6696]278        required = True,
279        readonly = False,
[6788]280        source = contextual_reg_num_source,
[6696]281        )
282
[6788]283    matric_number = TextLineChoice(
[7723]284        title = _(u'Matriculation Number'),
[6750]285        required = False,
286        readonly = False,
[6788]287        source = contextual_mat_num_source,
[6750]288        )
289
[6769]290    adm_code = schema.TextLine(
[7723]291        title = _(u'PWD Activation Code'),
[6769]292        required = False,
[8977]293        readonly = False,
[6769]294        )
295
[7133]296    email = schema.ASCIILine(
[7723]297        title = _(u'Email'),
[13345]298        required = False,
[7133]299        constraint=validate_email,
300        )
[8176]301    phone = PhoneNumber(
[7723]302        title = _(u'Phone'),
[7133]303        required = False,
304        )
305
[9334]306    def setTempPassword(user, password):
307        """Set a temporary password (LDAP-compatible) SSHA encoded for
308        officers.
309        """
310
311    def getTempPassword():
312        """Check if a temporary password has been set and if it
[12997]313        is not expired. Return the temporary password if valid,
[9334]314        None otherwise. Unset the temporary password if expired.
315        """
316
[9131]317    def transfer(certificate, current_session,
318        current_level, current_verdict):
319        """ Creates a new studycourse and backups the old one.
[12997]320        """
[9131]321
[12997]322    def revert_transfer():
323        """ Revert previous transfer.
[9131]324        """
325
[7993]326class IUGStudentClearance(IKofaObject):
327    """Representation of undergraduate student clearance data.
[6631]328    """
[9543]329    officer_comment = schema.Text(
330        title = _(u"Officer's Comment"),
331        required = False,
[6631]332        )
333
[6769]334    clr_code = schema.TextLine(
[7723]335        title = _(u'CLR Activation Code'),
[6769]336        required = False,
[8977]337        readonly = False,
[6769]338        )
339
[9543]340    date_of_birth = FormattedDate(
341        title = _(u'Date of Birth'),
342        required = True,
343        show_year = True,
344        )
345
[7523]346    nationality = schema.Choice(
[8069]347        vocabulary = nats_vocab,
[7723]348        title = _(u'Nationality'),
[7983]349        required = False,
[7523]350        )
351
[7993]352class IPGStudentClearance(IUGStudentClearance):
353    """Representation of postgraduate student clearance data.
354    """
355    employer = schema.TextLine(
356        title = _(u'Employer'),
357        required = False,
358        readonly = False,
359        )
360
[7819]361class IStudentPersonal(IKofaObject):
[6631]362    """Representation of student personal data.
363    """
[9543]364    personal_updated = schema.Datetime(
365        title = _(u'Updated'),
366        required = False,
367        readonly = False,
368        )
369
[6651]370    perm_address = schema.Text(
[7723]371        title = _(u'Permanent Address'),
[6631]372        required = False,
373        )
374
[10447]375class IStudentTranscript(IKofaObject):
[15155]376    """Representation of student transcript data. Only used for
377    StudentTranscriptRequestManageFormPage.
[10447]378    """
379
[10458]380    transcript_comment = schema.Text(
381        title = _(u'Comment'),
[10447]382        required = False,
383        )
384
[15143]385    transcript_signees = schema.Text(
386        title = _(u'Signees'),
387        required = False,
388        )
[10447]389
[15143]390
[8008]391class IStudent(IStudentBase,IUGStudentClearance,IPGStudentClearance,
[15155]392    IStudentPersonal):
[6631]393    """Representation of a student.
394    """
395
[9563]396class IStudentPersonalEdit(IStudentPersonal):
397    """Interface for editing personal data by students.
398    Here we can repeat the fields from IStudentPersonal and set the
399    `required` if necessary.
400    """
401
402    perm_address = schema.Text(
403        title = _(u'Permanent Address'),
404        required = True,
405        )
406
[6849]407class IStudentUpdateByRegNo(IStudent):
408    """Representation of a student. Skip regular reg_number validation.
409    """
410    reg_number = schema.TextLine(
[7723]411        title = _(u'Registration Number'),
[6849]412        required = False,
413        )
414
415class IStudentUpdateByMatricNo(IStudent):
416    """Representation of a student. Skip regular matric_number validation.
417    """
418    matric_number = schema.TextLine(
[7723]419        title = _(u'Matriculation Number'),
[6849]420        required = False,
421        )
422
[8779]423class IStudentRequestPW(IStudent):
[12999]424    """Representation of a student for first-time password request.
[8779]425    This interface is used when students use the requestpw page to
426    login for the the first time.
427    """
[8854]428    number = schema.TextLine(
429        title = _(u'Registr. or Matric. Number'),
[8779]430        required = True,
431        )
432
433    firstname = schema.TextLine(
434        title = _(u'First Name'),
435        required = True,
436        )
437
438    email = schema.ASCIILine(
439        title = _(u'Email Address'),
440        required = True,
441        constraint=validate_email,
442        )
443
[7819]444class IStudentStudyCourse(IKofaObject):
[12999]445    """Representation of student study course data.
[6633]446    """
[13002]447    next_session_allowed = Attribute('True if the student can proceed to next session')
448    is_postgrad = Attribute('True if student is postgraduate student')
449    is_current = Attribute('True if the study course is the current course of studies')
450    is_previous = Attribute('True if the study course is the previous course of studies')
451
[6648]452    certificate = schema.Choice(
[7723]453        title = _(u'Certificate'),
[6648]454        source = CertificateSource(),
[7209]455        required = False,
[6633]456        )
[6635]457
[6996]458    entry_mode = schema.Choice(
[7723]459        title = _(u'Entry Mode'),
[7681]460        source = StudyModeSource(),
[6996]461        required = True,
462        readonly = False,
463        )
464
465    entry_session = schema.Choice(
[7723]466        title = _(u'Entry Session'),
[6996]467        source = academic_sessions_vocab,
[7425]468        #default = datetime.now().year,
[6996]469        required = True,
470        readonly = False,
471        )
472
[6724]473    current_session = schema.Choice(
[7723]474        title = _(u'Current Session'),
[6744]475        source = academic_sessions_vocab,
[6724]476        required = True,
[6996]477        readonly = False,
[6724]478        )
479
480    current_level = schema.Choice(
[7723]481        title = _(u'Current Level'),
[6725]482        source = StudyLevelSource(),
483        required = False,
[6996]484        readonly = False,
[6724]485        )
486
487    current_verdict = schema.Choice(
[7723]488        title = _(u'Current Verdict'),
[7619]489        source = VerdictSource(),
[8820]490        default = '0',
[6725]491        required = False,
[6724]492        )
493
494    previous_verdict = schema.Choice(
[7723]495        title = _(u'Previous Verdict'),
[7619]496        source = VerdictSource(),
[8820]497        default = '0',
[6725]498        required = False,
[6724]499        )
500
[13002]501    def addStudentStudyLevel(cert, studylevel):
502        """Add a study level object.
503        """
504
505    def getTranscriptData():
506        """Get a sorted list of dicts with level and course ticket data.
507        This method is used for transcripts.
508        """
509
[9138]510class IStudentStudyCourseTransfer(IStudentStudyCourse):
[12999]511    """An interface used for student transfers.
[9138]512    """
513    certificate = schema.Choice(
514        title = _(u'Certificate'),
515        source = CertificateSource(),
516        required = True,
517        )
518
519    current_level = schema.Choice(
520        title = _(u'Current Level'),
521        source = StudyLevelSource(),
522        required = True,
523        readonly = False,
524        )
525
[9960]526    entry_session = schema.Choice(
527        title = _(u'Entry Session'),
528        source = academic_sessions_vocab,
529        #default = datetime.now().year,
530        required = False,
531        readonly = False,
532        )
533
534
[9138]535IStudentStudyCourseTransfer['certificate'].order = IStudentStudyCourse[
536    'certificate'].order
537IStudentStudyCourseTransfer['current_level'].order = IStudentStudyCourse[
538    'current_level'].order
539
[7951]540class IStudentVerdictUpdate(IKofaObject):
541    """A interface for verdict imports.
542    """
543    current_verdict = schema.Choice(
544        title = _(u'Current Verdict'),
545        source = VerdictSource(),
546        required = True,
547        )
548
549    current_session = schema.Choice(
550        title = _(u'Current Session'),
551        source = academic_sessions_vocab,
552        required = True,
553        )
554
555    current_level = schema.Choice(
556        title = _(u'Current Level'),
557        source = StudyLevelSource(),
558        required = True,
559        )
560
[9296]561    bypass_validation = schema.Bool(
562        title = _(u'Bypass validation'),
563        required = False,
564        )
565
566    validated_by = schema.TextLine(
567        title = _(u'Validated by'),
568        required = False,
569        )
570
[7819]571class IStudentStudyLevel(IKofaObject):
[12999]572    """A representation of student study level data.
[6774]573    """
[13002]574    certcode = Attribute('The certificate code of the study course')
575    is_current_level = Attribute('True if level is current level of the student')
576    level_title = Attribute('Level title from source')
577    getSessionString = Attribute('Session title from source')
[9235]578    number_of_tickets = Attribute('Number of tickets contained in this level')
[10553]579    passed_params = Attribute('Information about passed and failed courses')
[13002]580    gpa_params_rectified = Attribute('Corrected sessional GPA parameters')
581    gpa_params = Attribute('GPA parameters for this level.')
[14247]582    cumulative_params = Attribute(
583        'Cumulative GPA and other cumulative parameters for this level')
584    course_registration_forbidden = Attribute(
585        'Return error message if course registration is forbidden')
[6774]586
[12873]587    level = schema.Choice(
588        title = _(u'Level'),
589        source = StudyLevelSource(),
590        required = True,
591        readonly = False,
592        )
593
[6793]594    level_session = schema.Choice(
[7723]595        title = _(u'Session'),
[6793]596        source = academic_sessions_vocab,
[9437]597        required = True,
[6793]598        )
[6781]599
[6793]600    level_verdict = schema.Choice(
[7723]601        title = _(u'Verdict'),
[7619]602        source = VerdictSource(),
[8820]603        default = '0',
[6793]604        required = False,
605        )
606
[9161]607    validated_by = schema.TextLine(
608        title = _(u'Validated by'),
609        default = None,
610        required = False,
611        )
612
613    validation_date = schema.Datetime(
614        title = _(u'Validation Date'),
615        required = False,
616        readonly = False,
617        )
618
[9690]619    total_credits = schema.Int(
620        title = _(u'Total Credits'),
621        required = False,
622        readonly = True,
623        )
624
[14574]625    gpa = schema.TextLine(
[10479]626        title = _(u'Unrectified GPA'),
627        required = False,
628        readonly = True,
629        )
[9690]630
[8920]631    def addCourseTicket(ticket, course):
[8182]632        """Add a course ticket object.
633        """
634
[9501]635    def addCertCourseTickets(cert):
636        """Collect all certificate courses and create course
637        tickets automatically.
638        """
639
[14684]640    def updateCourseTicket(ticket, course):
641        """Updates a course ticket object and return code
642        if ticket has been invalidated.
643        """
644
[7819]645class ICourseTicket(IKofaObject):
[12999]646    """A representation of course ticket data.
[6781]647    """
[13003]648    certcode = Attribute('Certificate code of the study course')
649    level_session = Attribute('Session of the study level the ticket has been added to')
650    level = Attribute('Level value of the study level the ticket has been added to')
[14133]651    total_score = Attribute('Score')
652    grade = Attribute('Grade calculated from total score')
653    weight = Attribute('Weight calculated from total score')
[13003]654    removable_by_student = Attribute('True if student is allowed to remove the ticket')
655    editable_by_lecturer = Attribute('True if lecturer is allowed to edit the ticket')
[6781]656
[13003]657    code = Attribute('Code of the original course')
658
[9420]659    title = schema.TextLine(
660        title = _(u'Title'),
661        required = False,
662        )
663
664    fcode = schema.TextLine(
665        title = _(u'Faculty Code'),
666        required = False,
667        )
668
669    dcode = schema.TextLine(
670        title = _(u'Department Code'),
671        required = False,
672        )
673
674    semester = schema.Choice(
675        title = _(u'Semester/Term'),
676        source = SemesterSource(),
677        required = False,
678        )
679
680    passmark = schema.Int(
681        title = _(u'Passmark'),
682        required = False,
683        )
684
685    credits = schema.Int(
686        title = _(u'Credits'),
687        required = False,
688        )
689
[7665]690    mandatory = schema.Bool(
[9320]691        title = _(u'Required'),
[6795]692        default = False,
693        required = False,
694        )
695
[14574]696    outstanding = schema.Bool(
697        title = _(u'Outstanding Course'),
698        default = False,
699        required = False,
700        )
701
[14642]702    course_category = schema.Choice(
703        title = _(u'Course Category'),
704        source = CourseCategorySource(),
705        required = False,
706        )
707
[6781]708    score = schema.Int(
[7723]709        title = _(u'Score'),
[9684]710        default = None,
[6781]711        required = False,
[10637]712        missing_value = None,
[6781]713        )
714
[7661]715    carry_over = schema.Bool(
[7723]716        title = _(u'Carry-over Course'),
[7661]717        default = False,
718        required = False,
719        )
720
[9420]721    automatic = schema.Bool(
722        title = _(u'Automatical Creation'),
723        default = False,
[9316]724        required = False,
725        )
726
[9420]727class ICourseTicketAdd(IKofaObject):
[7150]728    """An interface for adding course tickets.
[6795]729    """
730    course = schema.Choice(
[7723]731        title = _(u'Course'),
[6795]732        source = CourseSource(),
733        readonly = False,
734        )
735
[9420]736class ICourseTicketImport(ICourseTicket):
737    """An interface for importing course results and nothing more.
738    """
739    score = schema.Int(
740        title = _(u'Score'),
741        required = False,
742        readonly = False,
743        )
744
745    level_session = schema.Choice(
746        title = _(u'Level Session'),
747        source = academic_sessions_vocab,
748        required = False,
749        readonly = False,
750        )
751
[7819]752class IStudentAccommodation(IKofaObject):
[6635]753    """A container for student accommodation objects.
754    """
755
[13457]756    desired_hostel = schema.TextLine(
757        title = _(u'Desired Hostel'),
758        required = False,
759        )
760
[9423]761    def addBedTicket(bedticket):
762        """Add a bed ticket object.
763        """
764
765
[7819]766class IBedTicket(IKofaObject):
[12999]767    """A representation of accommodation booking data.
[6989]768    """
[13314]769    bed = Attribute('The bed object')
770    maint_payment_made = Attribute('True if maintenance payment is made')
[6996]771
[13012]772    display_coordinates = schema.TextLine(
773        title = _(u'Allocated Bed'),
774        required = False,
775        readonly = True,
776        )
777
[6996]778    bed_coordinates = schema.TextLine(
[9984]779        title = u'',
[9423]780        required = True,
[7014]781        readonly = False,
[6992]782        )
783
[6996]784    bed_type = schema.TextLine(
[9424]785        title = _(u'Requested Bed Type'),
[9423]786        required = True,
[7014]787        readonly = False,
[6996]788        )
789
[6992]790    booking_session = schema.Choice(
[7723]791        title = _(u'Session'),
[6992]792        source = academic_sessions_vocab,
793        required = True,
[13316]794        readonly = False
[6992]795        )
796
[8170]797    booking_date = schema.Datetime(
[7723]798        title = _(u'Booking Date'),
[6992]799        required = False,
[13316]800        readonly = False,
[6992]801        )
802
803    booking_code = schema.TextLine(
[7723]804        title = _(u'Booking Activation Code'),
[6992]805        required = False,
[13316]806        readonly = False,
[6992]807        )
808
[6994]809    def getSessionString():
[13012]810        """Returns the title of academic_sessions_vocab term of the session
811        when the bed was booked.
[6994]812        """
[6992]813
[6860]814class IStudentPaymentsContainer(IPaymentsContainer):
[6635]815    """A container for student payment objects.
816    """
817
[13736]818    certificate = Attribute('Certificate to determine the correct p_level value')
819
[6877]820class IStudentOnlinePayment(IOnlinePayment):
821    """A student payment via payment gateways.
822    """
823
[13736]824    certificate = Attribute('Certificate to determine the correct p_level value')
[13871]825    student = Attribute('Student')
[13736]826
[9148]827    p_current = schema.Bool(
828        title = _(u'Current Session Payment'),
829        default = True,
830        required = False,
831        )
832
[13733]833    p_level = schema.Choice(
[8268]834        title = _(u'Payment Level'),
[13733]835        source = StudyLevelSource(),
[8268]836        required = False,
837        )
[6877]838
[13871]839    def redeemTicket():
840        """Either create an appropriate access code or trigger an action
841        directly.
842        """
843
[8422]844    def doAfterStudentPayment():
845        """Process student after payment was made.
846        """
847
[8453]848    def doAfterStudentPaymentApproval():
849        """Process student after payment was approved.
850        """
851
[8420]852    def approveStudentPayment():
[8422]853        """Approve payment and process student.
[8420]854        """
855
[8268]856IStudentOnlinePayment['p_level'].order = IStudentOnlinePayment[
857    'p_session'].order
[8408]858
[9864]859class IStudentPreviousPayment(IKofaObject):
[9148]860    """An interface for adding previous session payments.
861    """
862
[9864]863    p_category = schema.Choice(
864        title = _(u'Payment Category'),
865        default = u'schoolfee',
866        source = PreviousPaymentCategorySource(),
867        required = True,
868        )
869
[9148]870    p_session = schema.Choice(
871        title = _(u'Payment Session'),
872        source = academic_sessions_vocab,
873        required = True,
874        )
875
876    p_level = schema.Choice(
877        title = _(u'Payment Level'),
878        source = StudyLevelSource(),
879        required = True,
880        )
881
[9864]882class IStudentBalancePayment(IKofaObject):
883    """An interface for adding balances.
884    """
885
[9868]886    p_category = schema.Choice(
[9864]887        title = _(u'Payment Category'),
888        default = u'schoolfee',
889        required = True,
[9868]890        source = BalancePaymentCategorySource(),
[9864]891        )
892
893    balance_session = schema.Choice(
894        title = _(u'Payment Session'),
895        source = academic_sessions_vocab,
896        required = True,
897        )
898
899    balance_level = schema.Choice(
900        title = _(u'Payment Level'),
901        source = StudyLevelSource(),
902        required = True,
903        )
904
905    balance_amount = schema.Float(
906        title = _(u'Balance Amount'),
[9874]907        default = None,
[9864]908        required = True,
909        readonly = False,
910        description = _(
911            u'Balance in Naira '),
912        )
913
[8408]914class ICSVStudentExporter(ICSVExporter):
915    """A regular ICSVExporter that additionally supports exporting
916      data from a given student object.
917    """
[9801]918    def get_filtered(site, **kw):
[9797]919        """Get a filtered set of students.
920        """
[8408]921
[12518]922    def get_selected(site, selected):
923        """Get set of selected students.
924        """
925
[8408]926    def export_student(student, filepath=None):
927        """Export data for a given student.
928        """
[9734]929
[9797]930    def export_filtered(site, filepath=None, **kw):
[12518]931        """Export data for filtered set of students.
[9734]932        """
[12518]933
934    def export_selected(site, filepath=None, **kw):
935        """Export data for selected set of students.
936        """
Note: See TracBrowser for help on using the repository browser.