Ignore:
Timestamp:
8 Mar 2016, 17:21:35 (9 years ago)
Author:
Henrik Bettermann
Message:

Customize ICourseTicket. Add field 'ca'.

Customize EditScoresPage?, CourseTicketManageFormPage?, CourseTicketDisplayFormPage? and editscorespage.pt accordingly.

Location:
main/waeup.aaue/trunk/src/waeup/aaue/students
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.aaue/trunk/src/waeup/aaue/students/browser.py

    r13713 r13770  
    3636    StudentFilesUploadPage,
    3737    PaymentsManageFormPage,
     38    CourseTicketDisplayFormPage,
     39    CourseTicketManageFormPage,
     40    EditScoresPage
    3841    )
    3942from kofacustom.nigeria.students.browser import (
     
    5558    ICustomStudentPersonal,
    5659    ICustomStudentPersonalEdit,
    57     ICustomUGStudentClearance)
     60    ICustomUGStudentClearance,
     61    ICustomCourseTicket)
    5862from waeup.aaue.interswitch.browser import gateway_net_amt
    5963from waeup.aaue.interfaces import MessageFactory as _
     
    444448    requires that no application slip exists.
    445449    """
     450
     451class CustomCourseTicketDisplayFormPage(CourseTicketDisplayFormPage):
     452    """ Page to display course tickets
     453    """
     454    form_fields = grok.AutoFields(ICustomCourseTicket)
     455
     456class CustomCourseTicketManageFormPage(CourseTicketManageFormPage):
     457    """ Page to manage course tickets
     458    """
     459    form_fields = grok.AutoFields(ICustomCourseTicket)
     460    form_fields['title'].for_display = True
     461    form_fields['fcode'].for_display = True
     462    form_fields['dcode'].for_display = True
     463    form_fields['semester'].for_display = True
     464    form_fields['passmark'].for_display = True
     465    form_fields['credits'].for_display = True
     466    form_fields['mandatory'].for_display = False
     467    form_fields['automatic'].for_display = True
     468    form_fields['carry_over'].for_display = True
     469
     470class CustomEditScoresPage(EditScoresPage):
     471    """Page that filters and lists students.
     472    """
     473    grok.template('editscorespage')
     474
     475    def update(self,  *args, **kw):
     476        form = self.request.form
     477        ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
     478        self.current_academic_session = grok.getSite()[
     479            'configuration'].current_academic_session
     480        if self.context.__parent__.__parent__.score_editing_disabled:
     481            self.flash(_('Score editing disabled.'), type="warning")
     482            self.redirect(self.url(self.context))
     483            return
     484        if not self.current_academic_session:
     485            self.flash(_('Current academic session not set.'), type="warning")
     486            self.redirect(self.url(self.context))
     487            return
     488        self.tickets = self._searchCatalog(self.current_academic_session)
     489        editable_tickets = [
     490            ticket for ticket in self.tickets if ticket.editable_by_lecturer]
     491        if not self.tickets:
     492            self.flash(_('No student found.'), type="warning")
     493            self.redirect(self.url(self.context))
     494            return
     495        if 'UPDATE' in form:
     496            tno = 0
     497            error = ''
     498            if not editable_tickets:
     499                return
     500            scores = form['scores']
     501            cas = form['cas']
     502            if isinstance(scores, basestring):
     503                scores = [scores]
     504            if isinstance(cas, basestring):
     505                cas = [cas]
     506            for ticket in editable_tickets:
     507                ticket_error = False
     508                score = ticket.score
     509                ca = ticket.ca
     510                if scores[tno] == '':
     511                    score = None
     512                if cas[tno] == '':
     513                    ca = None
     514                try:
     515                    if scores[tno]:
     516                        score = int(scores[tno])
     517                    if cas[tno]:
     518                        ca = int(cas[tno])
     519                except ValueError:
     520                    error += '%s, ' % ticket.student.display_fullname
     521                    ticket_error = True
     522                if not ticket_error and ticket.score != score:
     523                    ticket.score = score
     524                    ticket.student.__parent__.logger.info(
     525                        '%s - %s %s/%s score updated (%s)' %
     526                        (ob_class, ticket.student.student_id,
     527                         ticket.level, ticket.code, score))
     528                if not ticket_error and ticket.ca != ca:
     529                    ticket.ca = ca
     530                    ticket.student.__parent__.logger.info(
     531                        '%s - %s %s/%s ca updated (%s)' %
     532                        (ob_class, ticket.student.student_id,
     533                         ticket.level, ticket.code, ca))
     534                tno += 1
     535            if error:
     536                self.flash(_('Error: Score(s) and CA(s) of %s have not be updated. '
     537                  'Only integers are allowed.' % error.strip(', ')),
     538                  type="danger")
     539        return
  • main/waeup.aaue/trunk/src/waeup/aaue/students/export.py

    r13768 r13770  
    8989
    9090    fields = ('matric_number', 'reg_number', 'student_id',
    91               'level', 'code', 'level_session', 'score')
     91              'level', 'code', 'level_session', 'score', 'ca')
    9292
  • main/waeup.aaue/trunk/src/waeup/aaue/students/interfaces.py

    r13735 r13770  
    281281    """
    282282
     283    ca = schema.Int(
     284        title = _(u'Continuous Assessment'),
     285        default = None,
     286        required = False,
     287        missing_value = None,
     288        )
     289
     290ICustomCourseTicket['ca'].order = ICustomCourseTicket['mandatory'].order
     291
    283292class ICustomStudentUpdateByRegNo(INigeriaStudentUpdateByRegNo):
    284293    """Representation of a student. Skip regular reg_number validation.
  • main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_browser.py

    r13755 r13770  
    2222import grok
    2323from hurry.workflow.interfaces import IWorkflowInfo, IWorkflowState
     24from zope.securitypolicy.interfaces import IPrincipalRoleManager
    2425from datetime import datetime, timedelta, date
    2526from mechanize import LinkNotFoundError
     
    3334from waeup.kofa.students.accommodation import BedTicket
    3435from waeup.kofa.testing import FunctionalTestCase
     36from waeup.kofa.authentication import LocalRoleSetEvent
    3537from waeup.kofa.browser.tests.test_pdf import samples_dir
    3638from waeup.aaue.testing import FunctionalLayer
     
    634636            in self.browser.contents)
    635637        return
     638
     639    def test_handle_courses_by_lecturer(self):
     640        self.app['users'].addUser('mrslecturer', 'mrslecturersecret')
     641        self.app['users']['mrslecturer'].email = 'mrslecturer@foo.ng'
     642        self.app['users']['mrslecturer'].title = u'Mercedes Benz'
     643        # Add course ticket
     644        studylevel = createObject(u'waeup.StudentStudyLevel')
     645        studylevel.level = 100
     646        studylevel.level_session = 2004
     647        self.student['studycourse'].addStudentStudyLevel(
     648            self.certificate, studylevel)
     649        # Assign local Lecturer role for a certificate.
     650        course = self.app['faculties']['fac1']['dep1'].courses['COURSE1']
     651        prmlocal = IPrincipalRoleManager(course)
     652        prmlocal.assignRoleToPrincipal('waeup.local.Lecturer', 'mrslecturer')
     653        notify(LocalRoleSetEvent(
     654            course, 'waeup.local.Lecturer', 'mrslecturer', granted=True))
     655        # Login as lecturer.
     656        self.browser.open(self.login_path)
     657        self.browser.getControl(name="form.login").value = 'mrslecturer'
     658        self.browser.getControl(name="form.password").value = 'mrslecturersecret'
     659        self.browser.getControl("Login").click()
     660        self.browser.getLink("My Roles").click()
     661        self.browser.getLink(
     662            "http://localhost/app/faculties/fac1/dep1/courses/COURSE1").click()
     663        # Course results can be batch edited via the edit_courses view.
     664        self.app['faculties']['fac1']['dep1'].score_editing_disabled = False
     665        self.app['configuration'].current_academic_session = 2004
     666        IWorkflowState(self.student).setState('courses validated')
     667        self.browser.open(
     668            "http://localhost/app/faculties/fac1/dep1/courses/COURSE1/edit_scores")
     669        self.assertTrue(
     670            'input type="text" name="scores"'
     671            in self.browser.contents)
     672        self.browser.getControl(name="scores", index=0).value = '55'
     673        self.browser.getControl(name="cas", index=0).value = '66'
     674        self.browser.getControl("Update scores").click()
     675        # New score and ca has been set.
     676        self.assertEqual(
     677            self.student['studycourse']['100']['COURSE1'].score, 55)
     678        self.assertEqual(
     679            self.student['studycourse']['100']['COURSE1'].ca, 66)
     680        # Score editing has been logged.
     681        logfile = os.path.join(
     682            self.app['datacenter'].storage, 'logs', 'students.log')
     683        logcontent = open(logfile).read()
     684        self.assertTrue('mrslecturer - waeup.aaue.students.browser.CustomEditScoresPage - '
     685                        'E1000000 100/COURSE1 score updated (55)' in logcontent)
     686        self.assertTrue('mrslecturer - waeup.aaue.students.browser.CustomEditScoresPage - '
     687                        'E1000000 100/COURSE1 ca updated (66)' in logcontent)
     688        # Non-integer scores won't be accepted.
     689        self.browser.open(
     690            "http://localhost/app/faculties/fac1/dep1/courses/COURSE1/edit_scores")
     691        self.assertTrue('value="55" />' in self.browser.contents)
     692        self.browser.getControl(name="scores", index=0).value = 'abc'
     693        self.browser.getControl("Update scores").click()
     694        self.assertTrue('Error: Score(s) and CA(s) of Anna Tester have not be updated.'
     695            in self.browser.contents)
     696        # Scores can be removed.
     697        self.browser.open(
     698            "http://localhost/app/faculties/fac1/dep1/courses/COURSE1/edit_scores")
     699        self.browser.getControl(name="scores", index=0).value = ''
     700        self.browser.getControl("Update scores").click()
     701        self.assertEqual(
     702            self.student['studycourse']['100']['COURSE1'].score, None)
     703        logcontent = open(logfile).read()
     704        self.assertTrue('mrslecturer - waeup.aaue.students.browser.CustomEditScoresPage - '
     705                        'E1000000 100/COURSE1 score updated (None)' in logcontent)
  • main/waeup.aaue/trunk/src/waeup/aaue/students/tests/test_export.py

    r13715 r13770  
    162162        self.assertEqual(
    163163            result,
    164             'automatic,carry_over,code,credits,dcode,fcode,level,level_session,'
     164            'automatic,ca,carry_over,code,credits,dcode,fcode,level,level_session,'
    165165            'mandatory,passmark,score,semester,title,student_id,certcode,'
    166166            'display_fullname,matric_number\r\n'
    167             '1,1,CRS1,100,DEP1,FAC1,100,2012,0,100,,2,Course 1,A111111,CERT1,'
     167            '1,,1,CRS1,100,DEP1,FAC1,100,2012,0,100,,2,Course 1,A111111,CERT1,'
    168168            'Anna M. Tester,234\r\n'
    169169            )
Note: See TracChangeset for help on using the changeset viewer.