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

Last change on this file since 15833 was 15790, checked in by Henrik Bettermann, 5 years ago

Rename sex gender.

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