Ignore:
Timestamp:
23 Feb 2017, 11:44:30 (8 years ago)
Author:
Henrik Bettermann
Message:

Add outstanding attribute to course tickets.

Location:
main/waeup.kofa/trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/trunk/CHANGES.txt

    r14572 r14574  
    22*******
    33
    4 
    541.5.1.dev0 (unreleased)
    65=======================
     6
     7* Add `outstanding` attribute to course tickets.
    78
    89* Exclude graduated students from `LevelReport`, `SessionResultsPresentation`
     
    409410================
    410411
    411 * Add display_fullname column to CourseTicketExporter (requested by Uniben).
     412* Add display_fullname column to `CourseTicketExporter` (requested by Uniben).
    412413
    413414* Do also export student and course ticket data of students on probation.
  • main/waeup.kofa/trunk/docs/source/userdocs/students/browser.rst

    r13948 r14574  
    238238    `automatic` is set to ``True`` and `carry_over` to ``False.``
    239239
    240 2.  The portal can be configured
    241     (`IConfigurationContainer.carry_over`) such that failed courses are
    242     automatically carried over from one session to the next. Failed
    243     course tickets from the previous level, i.e. tickets with a score
    244     below the passmark, are collected and 'copied' into the current
    245     study level container. The attributes `automatic` and `carry_over`
    246     are set to ``True``.
     2402. The portal can be configured
     241   (`IConfigurationContainer.carry_over`) such that failed courses
     242   are automatically carried over from one session to the next.
     243   Failed course tickets from the previous level, i.e. tickets
     244   with a score below the passmark, are collected and 'copied'
     245   into the current study level container. The attributes
     246   `automatic` and `carry_over` are set to ``True``.
    247247
    248248In most cases such an automatically created course list is not
     
    251251further courses, which they desire to attend, and can create
    252252additional course tickets, as long as the total number of credits do
    253 not exceed 50 (value customizable). Course tickets can also be
    254 removed. Whereas officers can remove any ticket from the list,
    255 students can remove only optional (non-mandatory) course tickets
    256 (condition customizable).
     253not exceed 50 (value customizable).
     254
     255In most cases such an automatically created course list is not
     256perfect or even ready for submission to the course adviser. The list
     257must be edited according to the student's needs. Students can select
     258further courses, which they desire to attend, and can create
     259additional course tickets, as long as the total number of credits of
     260non-outstanding courses (if `outstanding` attribute is ``True``) do
     261not exceed 50 (value customizable). That means outstanding courses
     262are not considered as registered courses. Usually they are being
     263added by officers.
     264
     265Course tickets can also be removed. Whereas officers can remove any
     266ticket from the list, students can remove only optional
     267(non-mandatory) course tickets (condition customizable).
    257268
    258269The edit form page provides a 'Register course list' button which
     
    268279they can validate or reject it by pressing the same-named link
    269280buttons. After pressing the 'Reject courses' button, Kofa redirects
    270 to the `ContactStudentFormPage` which can be used to inform the student
    271 about the reason of rejection. In contrast to clearance rejection,
    272 the message, which is being sent to the student by email, is neither
    273 stored in the database nor in the logfiles.
     281to the `ContactStudentFormPage` which can be used to inform the
     282student about the reason of rejection. In contrast to clearance
     283rejection, the message, which is being sent to the student by email,
     284is neither stored in the database nor in the logfiles.
    274285
    275286.. seealso::
     
    296307:py:meth:`CourseTicket.editable_by_lecturer<waeup.kofa.students.studylevel.CourseTicket.editable_by_lecturer>`.
    297308
    298 There are two options to edit course results. (1) Scores in course tickets can be changed by editing its values in the table and pressing the 'Update scores from table' button below. Scores can be cleared by removing the respective values. Lecturers have to be online during this process.(2) Alternatively, lecturers can download a csv file, edit scores in this csv file offline and upload the same file when they are online again. This procedure is explained in step-by-step instructions which show up when pressing the yellow 'Help' button:
     309There are two options to edit course results. (1) Scores in course
     310tickets can be changed by editing its values in the table and
     311pressing the 'Update scores from table' button below. Scores can be
     312cleared by removing the respective values. Lecturers have to be
     313online during this process.(2) Alternatively, lecturers can download
     314a csv file, edit scores in this csv file offline and upload the same
     315file when they are online again. This procedure is explained in
     316step-by-step instructions which show up when pressing the yellow
     317'Help' button:
    299318
    300319.. admonition:: Help
     
    303322
    304323  1. Download csv file.
    305   2. Open csv file in a text editor or in a spreadsheet programme (Excel or Calc).
    306   3. Edit course results only. Do not modify other entries. Do not remove or add columns. Do not add rows.
    307   4. Save file in same format (csv). Do not switch to any other format (xls, xlsx or ods).
    308   5. Select same file for upload and press the blue 'Update ...' button.
    309   6. The values in the table will be updated. Spot-check if the values in the table correspond with the values in your file.
    310 
    311   Note: Only course results of students which are in state 'courses validated' and in current academic session can be modified. Additional data will just be ignored.
     324  2. Open csv file in a text editor or in a spreadsheet programme
     325     (Excel or Calc).
     326  3. Edit course results only. Do not modify other entries.
     327     Do not remove or add columns. Do not add rows.
     328  4. Save file in same format (csv). Do not switch to any other
     329     format (xls, xlsx or ods).
     330  5. Select same file for upload and press the blue 'Update ...'
     331     button.
     332  6. The values in the table will be updated. Spot-check if the
     333     values in the table correspond with the values in your file.
     334
     335  Note: Only course results of students which are in state
     336  'courses validated' and in current academic session can be modified.
     337  Additional data will just be ignored.
    312338
    313339.. seealso::
     
    374400------------------
    375401
    376 Officers with `ManageHostels` permission do see a 'Relocate student' link
    377 button which calls the `BedTicketRelocationView`. This view relocates the
    378 student if student parameters or the bed type of the bed have changed. The
    379 `update` method of this view calls the
    380 :py:meth:`BedTicket.relocateStudent<waeup.kofa.students.accommodation.BedTicket.relocateStudent>`
    381 method which checks first, if the student has a 'reserved' bed space.
    382 Students in reserved beds are never subject to relocation. It checks secondly,
    383 if booking has been cancelled in the accommodation section but other bed space
    384 has been manually allocated after cancellation. Then this bed is used, no
    385 matter whether the bed meets the bed type criteria or not. If both checks are
    386 negative, Kofa searches for a free bed space, which meets the student's bed
    387 type criteria. Only if it finds a new and free bed space, it starts the
     402Officers with `ManageHostels` permission do see a 'Relocate student'
     403link button which calls the `BedTicketRelocationView`. This view
     404relocates the student if student parameters or the bed type of the
     405bed have changed. The `update` method of this view calls the
     406:py:meth:`BedTicket.relocateStudent<waeup.kofa.students.accommodation.BedTicket.relocateStudent>
     407` method which checks first, if the student has a 'reserved' bed
     408space. Students in reserved beds are never subject to relocation. It
     409checks secondly, if booking has been cancelled in the accommodation
     410section but other bed space has been manually allocated after
     411cancellation. Then this bed is used, no matter whether the bed meets
     412the bed type criteria or not. If both checks are negative, Kofa
     413searches for a free bed space, which meets the student's bed type
     414criteria. Only if it finds a new and free bed space, it starts the
    388415relocation process by releasing the old bed, booking the new bed and
    389416designating the new bed in the bed ticket.
  • main/waeup.kofa/trunk/docs/source/userdocs/students/interfaces.rst

    r13168 r14574  
    288288The quite long list of schema fields pretends that form pages may
    289289provide these fields for editing. This is not the case. Except for
    290 `score`, all these fields are 'for display' only. They can neither
    291 be changed through the UI nor by batch processing (import). They are
    292 solely meant for backing up the orginal course data. See also
    293 :ref:`course_ticket_processor`.
     290`score`, `mandatory` and `outstanding` all other fields are 'for
     291display' only. They can neither be changed through the UI nor by
     292batch processing (import). They are solely meant for backing up the
     293orginal course data. See also :ref:`course_ticket_processor`.
    294294
    295295.. note::
  • main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py

    r14337 r14574  
    658658            'student_id','reg_number','matric_number',
    659659            'mandatory', 'score', 'carry_over', 'automatic',
    660             'level_session',
     660            'outstanding', 'level_session',
    661661            'title', 'credits', 'passmark', 'semester'
    662662            ] + self.additional_fields
  • main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py

    r14247 r14574  
    598598        )
    599599
    600     gpa = schema.Int(
     600    gpa = schema.TextLine(
    601601        title = _(u'Unrectified GPA'),
    602602        required = False,
     
    664664        )
    665665
     666    outstanding = schema.Bool(
     667        title = _(u'Outstanding Course'),
     668        default = False,
     669        required = False,
     670        )
     671
    666672    score = schema.Int(
    667673        title = _(u'Score'),
  • main/waeup.kofa/trunk/src/waeup/kofa/students/reports/level_report.py

    r14572 r14574  
    7575        credits_counted = level_obj.gpa_params[1]
    7676        credits_passed = passed_params[2]
    77         level_gpa = format_float(level_obj.gpa, 3)
     77        level_gpa = format_float(level_obj.gpa_params[0], 3)
    7878        cum_credits_taken = level_obj.cumulative_params[1]
    7979        cum_credits_passed = level_obj.cumulative_params[4]
  • main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py

    r14531 r14574  
    2525from zope.component.interfaces import IFactory
    2626from zope.catalog.interfaces import ICatalog
    27 from zope.component import createObject, queryUtility
     27from zope.component import createObject, queryUtility, getUtility
    2828from zope.interface import implementedBy
    29 from waeup.kofa.interfaces import academic_sessions_vocab, VALIDATED
     29from waeup.kofa.interfaces import academic_sessions_vocab, VALIDATED, IKofaUtils
    3030from waeup.kofa.students.interfaces import (
    3131    IStudentStudyLevel, IStudentNavigation, ICourseTicket)
     
    7979        total = 0
    8080        for ticket in self.values():
    81             total += ticket.credits
     81            if not ticket.outstanding:
     82                total += ticket.credits
    8283        return total
    8384
     
    135136    @property
    136137    def gpa(self):
    137         return self.gpa_params[0]
     138        """Return string formatted gpa value.
     139        """
     140        format_float = getUtility(IKofaUtils).format_float
     141        return format_float(self.gpa_params[0], 2)
    138142
    139143    @property
  • main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py

    r14392 r14574  
    25762576        return
    25772577
     2578    def test_student_course_registration_outstanding(self):
     2579        self.course = createObject('waeup.Course')
     2580        self.course.code = 'COURSE2'
     2581        self.course.semester = 1
     2582        self.course.credits = 45
     2583        self.course.passmark = 40
     2584        self.app['faculties']['fac1']['dep1'].courses.addCourse(
     2585            self.course)
     2586        IWorkflowState(self.student).setState('school fee paid')
     2587        self.browser.open(self.login_path)
     2588        self.browser.getControl(name="form.login").value = self.student_id
     2589        self.browser.getControl(name="form.password").value = 'spwd'
     2590        self.browser.getControl("Login").click()
     2591        self.browser.open(self.student_path + '/studycourse/add')
     2592        self.browser.getControl("Create course list now").click()
     2593        self.assertEqual(self.student['studycourse']['100'].number_of_tickets, 1)
     2594        self.student['studycourse'].current_level = 200
     2595        self.browser.getLink("Study Course").click()
     2596        self.browser.getLink("Add course list").click()
     2597        self.assertMatches('...Add current level 200 (Year 2)...',
     2598                           self.browser.contents)
     2599        self.browser.getControl("Create course list now").click()
     2600        self.browser.getLink("200").click()
     2601        self.browser.getLink("Edit course list").click()
     2602        self.browser.getLink("here").click()
     2603        self.browser.getControl(name="form.course").value = ['COURSE2']
     2604        self.browser.getControl("Add course ticket").click()
     2605        # Carryover COURSE1 in level 200 already has 10 credits
     2606        self.assertMatches(
     2607            '...Total credits exceed 50...', self.browser.contents)
     2608        # If COURSE1 is outstanding, its credits won't be considered
     2609        self.student['studycourse']['200']['COURSE1'].outstanding = True
     2610        self.browser.getControl("Add course ticket").click()
     2611        self.assertMatches(
     2612            '...Successfully added COURSE2...', self.browser.contents)
     2613        return
     2614
    25782615    def test_postgraduate_student_access(self):
    25792616        self.certificate.study_mode = 'pg_ft'
  • main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py

    r14443 r14574  
    492492            'validated_by,validation_date,'
    493493            'student_id,number_of_tickets,certcode\r\n'
    494             '0.0,,,0,0,,,,0,\r\n'
     494            '0.00,,,0,0,,,,0,\r\n'
    495495            )
    496496        return
     
    510510            'validated_by,validation_date,'
    511511            'student_id,number_of_tickets,certcode\r\n'
    512             '0.0,100,2012,A,100,,,A111111,1,CERT1\r\n'
     512            '0.00,100,2012,A,100,,,A111111,1,CERT1\r\n'
    513513            )
    514514        return
     
    526526            'validated_by,validation_date,'
    527527            'student_id,number_of_tickets,certcode\r\n'
    528             '0.0,100,2012,A,100,,,A111111,1,CERT1\r\n'
     528            '0.00,100,2012,A,100,,,A111111,1,CERT1\r\n'
    529529            )
    530530        return
     
    541541            'validated_by,validation_date,'
    542542            'student_id,number_of_tickets,certcode\r\n'
    543             '0.0,100,2012,A,100,,,A111111,1,CERT1\r\n'
     543            '0.00,100,2012,A,100,,,A111111,1,CERT1\r\n'
    544544            )
    545545        return
     
    560560            'validated_by,validation_date,'
    561561            'student_id,number_of_tickets,certcode\r\n'
    562             '0.0,100,2012,A,100,,,A111111,1,CERT1\r\n'
     562            '0.00,100,2012,A,100,,,A111111,1,CERT1\r\n'
    563563            )
    564564        return
     
    579579            'validated_by,validation_date,'
    580580            'student_id,number_of_tickets,certcode\r\n'
    581             '0.0,100,2012,A,100,,,A111111,1,CERT1\r\n'
     581            '0.00,100,2012,A,100,,,A111111,1,CERT1\r\n'
    582582            )
    583583        return
     
    614614            result,
    615615            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    616             'mandatory,passmark,score,semester,title,student_id,certcode,'
     616            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    617617            'display_fullname\r\n'
    618             '0,0,,,,,,,0,,,,,,,\r\n'
     618            '0,0,,,,,,,0,0,,,,,,,\r\n'
    619619            )
    620620        return
     
    633633            result,
    634634            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    635             'mandatory,passmark,score,semester,title,student_id,certcode,'
     635            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    636636            'display_fullname\r\n'
    637             '1,1,CRS1,100,DEP1,FAC1,100,2012,0,100,,2,Course 1,A111111,CERT1,'
     637            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
    638638            'Anna M. Tester\r\n'
    639639            )
     
    650650            result,
    651651            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    652             'mandatory,passmark,score,semester,title,student_id,certcode,'
     652            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    653653            'display_fullname\r\n'
    654             '1,1,CRS1,100,DEP1,FAC1,100,2012,0,100,,2,Course 1,A111111,CERT1,'
     654            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
    655655            'Anna M. Tester\r\n'
    656656            )
     
    666666            result,
    667667            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    668             'mandatory,passmark,score,semester,title,student_id,certcode,'
     668            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    669669            'display_fullname\r\n'
    670             '1,1,CRS1,100,DEP1,FAC1,100,2012,0,100,,2,Course 1,A111111,CERT1,'
     670            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
    671671            'Anna M. Tester\r\n'
    672672            )
     
    686686            result,
    687687            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    688             'mandatory,passmark,score,semester,title,student_id,certcode,'
     688            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    689689            'display_fullname\r\n'
    690             '1,1,CRS1,100,DEP1,FAC1,100,2012,0,100,,2,Course 1,A111111,CERT1,'
     690            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
    691691            'Anna M. Tester\r\n'
    692692            )
     
    700700            result,
    701701            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    702             'mandatory,passmark,score,semester,title,student_id,certcode,'
     702            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    703703            'display_fullname\r\n'
    704             '1,1,CRS1,100,DEP1,FAC1,100,2012,0,100,,2,Course 1,A111111,CERT1,'
     704            '1,1,CRS1,100,DEP1,FAC1,100,2012,0,0,100,,2,Course 1,A111111,CERT1,'
    705705            'Anna M. Tester\r\n'
    706706            )
     
    711711            result,
    712712            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    713             'mandatory,passmark,score,semester,title,student_id,certcode,'
     713            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    714714            'display_fullname\r\n'
    715715            )
     
    724724            result,
    725725            'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
    726             'mandatory,passmark,score,semester,title,student_id,certcode,'
     726            'mandatory,outstanding,passmark,score,semester,title,student_id,certcode,'
    727727            'display_fullname\r\n'
    728             '1,1,CRS1,100,DEP1,FAC1,110,2012,0,100,,2,Course 1,A111111,CERT1,'
     728            '1,1,CRS1,100,DEP1,FAC1,110,2012,0,0,100,,2,Course 1,A111111,CERT1,'
    729729            'Anna M. Tester\r\n'
    730730            )
Note: See TracChangeset for help on using the changeset viewer.