Changeset 12999 for main/waeup.kofa/trunk
- Timestamp:
- 25 May 2015, 20:50:37 (9 years ago)
- Location:
- main/waeup.kofa/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/trunk/docs/source/userdocs/students.rst
r12998 r12999 37 37 ======== 38 38 39 The `Student` class is a container class which means, there are not only attributes describing the student entity but also content. Each student container contains exactly three sub-containers: ``studycourse`` (instance of `StudentStudyCourse`), ``payments`` (instance of `StudentPaymentsContainer`) ``accommodation`` (instance of `StudentAccommodation`). The purposes of them are described further below.39 The `Student` class is a container class which means, there are not only attributes describing the student entity but also content. Each student container contains exactly three sub-containers: ``studycourse`` (instance of `StudentStudyCourse`), ``payments`` (instance of `StudentPaymentsContainer`) and ``accommodation`` (instance of `StudentAccommodation`). The purposes of them are described further below. 40 40 41 41 Let's talk about the attributes and methods belonging to the `Student` class, the so-called 'external behaviour' of student objects specified in Zope 'interfaces'. The data stored with each student object are subdivided into three parts: base data, personal data and clearance data. Each part has its own interface. … … 45 45 .. note:: 46 46 47 **Interfaces** are one of the pillars of Zope's Component Architecture (ZCA, see also :ref:`prerequisites`). They document the 'external behaviour' of objects. In Kofa interfaces are used to specify the attributes, methods and schema fields of objects. The first two are well-known Python concepts. A Zope schema field is a bit more complicated. It's a detailed description of a field to be submitted via forms to the server, or which is processed by a batch processor. In both cases the input data are being validated against the schema field . In Kofa, schema fields in interfaces are also used to automtically add `FieldProperty` attributes of the same name to most content classes. This is done by a class function called :py:func:`attrs_to_fields<waeup.kofa.utils.helpers.attrs_to_fields>` during startup. These class attributes ensure that corresponding attributes of instances of this class - when being added or changed - always meet the requirements of the schema field. Another big advantage of such class attributes is, that attributes with a `FieldProperty` do not need to be set in `__init__` methods.47 **Interfaces** are one of the pillars of Zope's Component Architecture (ZCA, see also :ref:`prerequisites`). They document the 'external behaviour' of objects. In Kofa interfaces are used to specify the attributes, methods and schema fields of objects. The first two are well-known Python concepts. A Zope schema field is a bit more complicated. It's a detailed description of a field to be submitted via forms to the server, or which is processed by a batch processor. In both cases the input data are being validated against the schema field requirements. In Kofa, schema fields (see also note below) in interfaces are also used to automtically add `FieldProperty` attributes of the same name to most content classes. This is done by a function :py:func:`attrs_to_fields<waeup.kofa.utils.helpers.attrs_to_fields>` which is called once during startup of Kofa. These class attributes ensure that corresponding attributes of instances of this class - when being added or changed - always meet the requirements of the schema field. Another big advantage of such class attributes is, that attributes with a `FieldProperty` do not need to be set in `__init__` methods. 48 48 49 All student classes implement `waeup.kofa.students.interfaces.IStudent` which defines a base set of attributes, schema fields and methods all students must provide. This 'behaviour' is fundamental so that we quote and explain the source code here. 49 The `Student` class implements several interfaces which we will quote to unveil the student's 'external behaviour'. 50 51 `IStudentBase` 52 -------------- 53 54 `waeup.kofa.students.interfaces.IStudentBase` defines a fundamental set of attributes, schema fields and methods which are being used throughout the portal. This set is immutable. No class statement must be removed or added in customized versions of Kofa. 50 55 51 56 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py … … 70 75 The **third part** of the interface lists the methods which can be applied to student objects. 71 76 77 `IUGStudentClearance` 78 --------------------- 79 80 Much like all the following student interfaces, `waeup.kofa.students.interfaces.IUGStudentClearance` describes an additional set of schema fields which are exclusively used on form pages. They do not play any role beyond that purpose. Any kind of schema field can be safely added in customized versions of these interfaces to meet the conditions of the university's matriculation process. Also `date_of_birth` and `nationality` are not used in the base package for further data processing which means, there is no dependency on these two parameters. Attention: This might be different in customized versions of Kofa. Some views might use these parameters to restrict access or make actions (e.g. payment of items) conditional on the student's nationality or current age. 81 82 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 83 :pyobject: IUGStudentClearance 84 85 `clearance_locked` controls the access to the edit form page of clearance data. The corresponding attribute is automatically set by workflow transitions to lock or unlock the edit form page respectively. The attribute can also be set by officers via the manage form page to lock or unlock the page manually. 86 87 `officer_comment` is usually edited by clearance officers when rejecting clearance previously requested by the student. The attribute contains the message which informs the student about the reasons of rejection. The attribute is cleared after final clearance. The message can be also found in ``students.log``. 88 89 Both `clearance_locked` and `officer_comment` are controlled by workflow transitions not by states, see below. 90 91 `IPGStudentClearance` 92 --------------------- 93 94 Most universities acquire different data from undergraduate (UG) and postgraduate (PG) students. The forms vary widely. Therefore Kofa offers a second interface for acquiring PG clearance data. In the base package `IPGStudentClearance` inherits from the `IUGStudentClearance` interface. The additional `employer` field in the base package only serves as an example. 95 96 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 97 :pyobject: IPGStudentClearance 98 99 `IStudentPersonal` 100 ------------------ 101 102 `waeup.kofa.students.interfaces.IUGStudentPersonal` defines an additional set of personal student data which are permantly editable by students. The set usually contains further contact data and information about the student's relatives. 103 104 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 105 :pyobject: IStudentPersonal 106 107 Kofa provides a mechanism which ensures that personal data are being kept up to date. Students are regularly requested to update the personal data directly after login. The personal data expire 180 days after saving the data for the last time which is stored in the `personal_updated` attribute. Then the `personal_data_expired` property returns ``True`` and the student is redirected to the personal data edit page when logging in. 72 108 73 109 Student Study Courses 74 110 ===================== 75 111 112 All data related to the student's course of study are stored with the ``studycourse`` object which is an instance of the `StudentStudyCourse` class. The latter implements `waeup.kofa.students.interfaces.IStudentStudyCourse`. 113 114 `IStudentStudyCourse` 115 --------------------- 116 117 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 118 :pyobject: IStudentStudyCourse 119 76 120 Student Study Levels 121 ==================== 122 123 `IStudentStudyLevel` 77 124 -------------------- 125 126 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 127 :pyobject: IStudentStudyLevel 128 129 `ICourseTicket` 130 --------------- 131 132 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 133 :pyobject: ICourseTicket 78 134 79 135 Student Payments 80 136 ================ 81 137 138 `IStudentOnlinePayment` 139 ----------------------- 140 141 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 142 :pyobject: IStudentOnlinePayment 143 82 144 Student Accommodation 83 145 ===================== 84 146 147 `IBedTicket` 148 ------------ 149 150 .. literalinclude:: ../../../src/waeup/kofa/students/interfaces.py 151 :pyobject: IBedTicket 152 153 154 Registration Workflow 155 ===================== 156 157 Browser Pages 158 ============= 159 85 160 86 161 .. _zope schema: http://docs.zope.org/zope.schema -
main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
r12997 r12999 122 122 def getAccommodation_details(student): 123 123 """Determine the accommodation dates of a student. 124 125 124 """ 126 125 127 126 def selectBed(available_beds): 128 127 """Select a bed from a list of available beds. 129 130 128 In the standard configuration we select the first bed found, 131 129 but can also randomize the selection if we like. … … 138 136 def renderPDF(view, subject='', filename='slip.pdf',): 139 137 """Render pdf slips for various pages. 140 141 138 """ 142 139 … … 194 191 """ 195 192 password = Attribute('Encrypted password') 196 temp_password = Attribute( 197 'Dictionary with user name, timestamp and encrypted password') 193 temp_password = Attribute('Dictionary with user name, timestamp and encrypted password') 198 194 history = Attribute('Object history, a list of messages') 199 195 state = Attribute('Registration state') … … 287 283 288 284 def writeLogMessage(view, message): 289 """Write formatted log message into student .log.285 """Write formatted log message into students.log. 290 286 """ 291 287 … … 344 340 class IPGStudentClearance(IUGStudentClearance): 345 341 """Representation of postgraduate student clearance data. 346 347 342 """ 348 343 employer = schema.TextLine( … … 354 349 class IStudentPersonal(IKofaObject): 355 350 """Representation of student personal data. 356 357 351 """ 358 352 personal_updated = schema.Datetime( … … 369 363 class IStudentTranscript(IKofaObject): 370 364 """Representation of student transcript data. 371 372 365 """ 373 366 … … 381 374 IStudentPersonal, IStudentTranscript): 382 375 """Representation of a student. 383 384 376 """ 385 377 … … 405 397 class IStudentUpdateByMatricNo(IStudent): 406 398 """Representation of a student. Skip regular matric_number validation. 407 408 399 """ 409 400 matric_number = schema.TextLine( … … 413 404 414 405 class IStudentRequestPW(IStudent): 415 """Representation of an student for first-time password request. 416 406 """Representation of a student for first-time password request. 417 407 This interface is used when students use the requestpw page to 418 408 login for the the first time. … … 435 425 436 426 class IStudentStudyCourse(IKofaObject): 437 """A container for student study levels. 438 427 """Representation of student study course data. 439 428 """ 440 429 certificate = schema.Choice( … … 488 477 489 478 class IStudentStudyCourseTransfer(IStudentStudyCourse): 490 """An student transfers. 491 492 """ 493 479 """An interface used for student transfers. 480 """ 494 481 certificate = schema.Choice( 495 482 title = _(u'Certificate'), … … 521 508 class IStudentStudyCourseTranscript(IKofaObject): 522 509 """An interface for student transcripts. 523 524 """ 525 510 """ 526 511 entry_mode = schema.Choice( 527 512 title = _(u'Entry Mode'), … … 541 526 class IStudentVerdictUpdate(IKofaObject): 542 527 """A interface for verdict imports. 543 544 """ 545 528 """ 546 529 current_verdict = schema.Choice( 547 530 title = _(u'Current Verdict'), … … 573 556 574 557 class IStudentStudyLevel(IKofaObject): 575 """A container for course tickets. 576 558 """A representation of student study level data. 577 559 """ 578 560 number_of_tickets = Attribute('Number of tickets contained in this level') … … 635 617 636 618 class ICourseTicket(IKofaObject): 637 """An interface for course tickets. 638 619 """A representation of course ticket data. 639 620 """ 640 621 code = Attribute('code of the original course') … … 705 686 class ICourseTicketAdd(IKofaObject): 706 687 """An interface for adding course tickets. 707 708 688 """ 709 689 course = schema.Choice( … … 715 695 class ICourseTicketImport(ICourseTicket): 716 696 """An interface for importing course results and nothing more. 717 718 697 """ 719 698 score = schema.Int( … … 732 711 class IStudentAccommodation(IKofaObject): 733 712 """A container for student accommodation objects. 734 735 713 """ 736 714 … … 741 719 742 720 class IBedTicket(IKofaObject): 743 """A ticket for accommodation booking. 744 721 """A representation of accommodation booking data. 745 722 """ 746 723 bed = Attribute('The bed object.') … … 785 762 def getSessionString(): 786 763 """Returns the title of academic_sessions_vocab term. 787 788 764 """ 789 765 790 766 class IStudentPaymentsContainer(IPaymentsContainer): 791 767 """A container for student payment objects. 792 793 768 """ 794 769 795 770 class IStudentOnlinePayment(IOnlinePayment): 796 771 """A student payment via payment gateways. 797 798 772 """ 799 773 … … 811 785 def doAfterStudentPayment(): 812 786 """Process student after payment was made. 813 814 787 """ 815 788 816 789 def doAfterStudentPaymentApproval(): 817 790 """Process student after payment was approved. 818 819 791 """ 820 792 821 793 def approveStudentPayment(): 822 794 """Approve payment and process student. 823 824 795 """ 825 796 … … 829 800 class IStudentPreviousPayment(IKofaObject): 830 801 """An interface for adding previous session payments. 831 832 802 """ 833 803 … … 853 823 class IStudentBalancePayment(IKofaObject): 854 824 """An interface for adding balances. 855 856 825 """ 857 826
Note: See TracChangeset for help on using the changeset viewer.