Changeset 14574
- Timestamp:
- 23 Feb 2017, 11:44:30 (8 years ago)
- Location:
- main/waeup.kofa/trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/trunk/CHANGES.txt
r14572 r14574 2 2 ******* 3 3 4 5 4 1.5.1.dev0 (unreleased) 6 5 ======================= 6 7 * Add `outstanding` attribute to course tickets. 7 8 8 9 * Exclude graduated students from `LevelReport`, `SessionResultsPresentation` … … 409 410 ================ 410 411 411 * Add display_fullname column to CourseTicketExporter(requested by Uniben).412 * Add display_fullname column to `CourseTicketExporter` (requested by Uniben). 412 413 413 414 * Do also export student and course ticket data of students on probation. -
main/waeup.kofa/trunk/docs/source/userdocs/students/browser.rst
r13948 r14574 238 238 `automatic` is set to ``True`` and `carry_over` to ``False.`` 239 239 240 2. 241 (`IConfigurationContainer.carry_over`) such that failed courses are242 automatically carried over from one session to the next. Failed243 course tickets from the previous level, i.e. tickets with a score244 below the passmark, are collected and 'copied' into the current245 study level container. The attributes `automatic` and `carry_over`246 are set to ``True``.240 2. 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``. 247 247 248 248 In most cases such an automatically created course list is not … … 251 251 further courses, which they desire to attend, and can create 252 252 additional 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). 253 not exceed 50 (value customizable). 254 255 In most cases such an automatically created course list is not 256 perfect or even ready for submission to the course adviser. The list 257 must be edited according to the student's needs. Students can select 258 further courses, which they desire to attend, and can create 259 additional course tickets, as long as the total number of credits of 260 non-outstanding courses (if `outstanding` attribute is ``True``) do 261 not exceed 50 (value customizable). That means outstanding courses 262 are not considered as registered courses. Usually they are being 263 added by officers. 264 265 Course tickets can also be removed. Whereas officers can remove any 266 ticket from the list, students can remove only optional 267 (non-mandatory) course tickets (condition customizable). 257 268 258 269 The edit form page provides a 'Register course list' button which … … 268 279 they can validate or reject it by pressing the same-named link 269 280 buttons. After pressing the 'Reject courses' button, Kofa redirects 270 to the `ContactStudentFormPage` which can be used to inform the student271 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.281 to the `ContactStudentFormPage` which can be used to inform the 282 student about the reason of rejection. In contrast to clearance 283 rejection, the message, which is being sent to the student by email, 284 is neither stored in the database nor in the logfiles. 274 285 275 286 .. seealso:: … … 296 307 :py:meth:`CourseTicket.editable_by_lecturer<waeup.kofa.students.studylevel.CourseTicket.editable_by_lecturer>`. 297 308 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: 309 There are two options to edit course results. (1) Scores in course 310 tickets can be changed by editing its values in the table and 311 pressing the 'Update scores from table' button below. Scores can be 312 cleared by removing the respective values. Lecturers have to be 313 online during this process.(2) Alternatively, lecturers can download 314 a csv file, edit scores in this csv file offline and upload the same 315 file when they are online again. This procedure is explained in 316 step-by-step instructions which show up when pressing the yellow 317 'Help' button: 299 318 300 319 .. admonition:: Help … … 303 322 304 323 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. 312 338 313 339 .. seealso:: … … 374 400 ------------------ 375 401 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 402 Officers with `ManageHostels` permission do see a 'Relocate student' 403 link button which calls the `BedTicketRelocationView`. This view 404 relocates the student if student parameters or the bed type of the 405 bed 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 408 space. Students in reserved beds are never subject to relocation. It 409 checks secondly, if booking has been cancelled in the accommodation 410 section but other bed space has been manually allocated after 411 cancellation. Then this bed is used, no matter whether the bed meets 412 the bed type criteria or not. If both checks are negative, Kofa 413 searches for a free bed space, which meets the student's bed type 414 criteria. Only if it finds a new and free bed space, it starts the 388 415 relocation process by releasing the old bed, booking the new bed and 389 416 designating the new bed in the bed ticket. -
main/waeup.kofa/trunk/docs/source/userdocs/students/interfaces.rst
r13168 r14574 288 288 The quite long list of schema fields pretends that form pages may 289 289 provide these fields for editing. This is not the case. Except for 290 `score`, all these fields are 'for display' only. They can neither291 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 291 display' only. They can neither be changed through the UI nor by 292 batch processing (import). They are solely meant for backing up the 293 orginal course data. See also :ref:`course_ticket_processor`. 294 294 295 295 .. note:: -
main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py
r14337 r14574 658 658 'student_id','reg_number','matric_number', 659 659 'mandatory', 'score', 'carry_over', 'automatic', 660 ' level_session',660 'outstanding', 'level_session', 661 661 'title', 'credits', 'passmark', 'semester' 662 662 ] + self.additional_fields -
main/waeup.kofa/trunk/src/waeup/kofa/students/interfaces.py
r14247 r14574 598 598 ) 599 599 600 gpa = schema. Int(600 gpa = schema.TextLine( 601 601 title = _(u'Unrectified GPA'), 602 602 required = False, … … 664 664 ) 665 665 666 outstanding = schema.Bool( 667 title = _(u'Outstanding Course'), 668 default = False, 669 required = False, 670 ) 671 666 672 score = schema.Int( 667 673 title = _(u'Score'), -
main/waeup.kofa/trunk/src/waeup/kofa/students/reports/level_report.py
r14572 r14574 75 75 credits_counted = level_obj.gpa_params[1] 76 76 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) 78 78 cum_credits_taken = level_obj.cumulative_params[1] 79 79 cum_credits_passed = level_obj.cumulative_params[4] -
main/waeup.kofa/trunk/src/waeup/kofa/students/studylevel.py
r14531 r14574 25 25 from zope.component.interfaces import IFactory 26 26 from zope.catalog.interfaces import ICatalog 27 from zope.component import createObject, queryUtility 27 from zope.component import createObject, queryUtility, getUtility 28 28 from zope.interface import implementedBy 29 from waeup.kofa.interfaces import academic_sessions_vocab, VALIDATED 29 from waeup.kofa.interfaces import academic_sessions_vocab, VALIDATED, IKofaUtils 30 30 from waeup.kofa.students.interfaces import ( 31 31 IStudentStudyLevel, IStudentNavigation, ICourseTicket) … … 79 79 total = 0 80 80 for ticket in self.values(): 81 total += ticket.credits 81 if not ticket.outstanding: 82 total += ticket.credits 82 83 return total 83 84 … … 135 136 @property 136 137 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) 138 142 139 143 @property -
main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_browser.py
r14392 r14574 2576 2576 return 2577 2577 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 2578 2615 def test_postgraduate_student_access(self): 2579 2616 self.certificate.study_mode = 'pg_ft' -
main/waeup.kofa/trunk/src/waeup/kofa/students/tests/test_export.py
r14443 r14574 492 492 'validated_by,validation_date,' 493 493 'student_id,number_of_tickets,certcode\r\n' 494 '0.0 ,,,0,0,,,,0,\r\n'494 '0.00,,,0,0,,,,0,\r\n' 495 495 ) 496 496 return … … 510 510 'validated_by,validation_date,' 511 511 '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' 513 513 ) 514 514 return … … 526 526 'validated_by,validation_date,' 527 527 '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' 529 529 ) 530 530 return … … 541 541 'validated_by,validation_date,' 542 542 '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' 544 544 ) 545 545 return … … 560 560 'validated_by,validation_date,' 561 561 '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' 563 563 ) 564 564 return … … 579 579 'validated_by,validation_date,' 580 580 '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' 582 582 ) 583 583 return … … 614 614 result, 615 615 '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,' 617 617 'display_fullname\r\n' 618 '0,0,,,,,,,0, ,,,,,,\r\n'618 '0,0,,,,,,,0,0,,,,,,,\r\n' 619 619 ) 620 620 return … … 633 633 result, 634 634 '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,' 636 636 '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,' 638 638 'Anna M. Tester\r\n' 639 639 ) … … 650 650 result, 651 651 '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,' 653 653 '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,' 655 655 'Anna M. Tester\r\n' 656 656 ) … … 666 666 result, 667 667 '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,' 669 669 '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,' 671 671 'Anna M. Tester\r\n' 672 672 ) … … 686 686 result, 687 687 '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,' 689 689 '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,' 691 691 'Anna M. Tester\r\n' 692 692 ) … … 700 700 result, 701 701 '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,' 703 703 '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,' 705 705 'Anna M. Tester\r\n' 706 706 ) … … 711 711 result, 712 712 '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,' 714 714 'display_fullname\r\n' 715 715 ) … … 724 724 result, 725 725 '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,' 727 727 '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,' 729 729 'Anna M. Tester\r\n' 730 730 )
Note: See TracChangeset for help on using the changeset viewer.