Changeset 18064 for main


Ignore:
Timestamp:
23 Apr 2025, 06:31:59 (10 hours ago)
Author:
Henrik Bettermann
Message:

Ad mark sheet slip.

Location:
main/waeup.uniben/trunk/src/waeup/uniben
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.uniben/trunk/src/waeup/uniben/browser/viewlets.py

    r16588 r18064  
    1919import grok
    2020from waeup.kofa.interfaces import IKofaObject, academic_sessions_vocab
     21from waeup.kofa.university.interfaces import ICourse
     22from waeup.kofa.browser.pages import CoursePage
    2123from waeup.kofa.browser.viewlets import (
    2224    PrimaryNavTab, ManageActionButton, UpdateScoresActionButton,
     
    4648        return
    4749
     50class DownloadMarkSheetActionButton(ManageActionButton):
     51    """ 'Download mark sheet' button for courses.
     52    """
     53    grok.context(ICourse)
     54    grok.view(CoursePage)
     55    grok.name('marksheet')
     56    grok.require('waeup.showStudents')
     57    icon = 'actionicon_pdf.png'
     58    text = _('Download mark sheet')
     59    target = 'marksheet.pdf'
     60    grok.order(7)
  • main/waeup.uniben/trunk/src/waeup/uniben/locales/en/LC_MESSAGES/waeup.kofa.po

    r18061 r18064  
    9999msgid "Download attendance sheet"
    100100msgstr "Download attendance register"
    101 
    102 msgid "Download course tickets overvie"
    103 msgstr "Download mark sheet"
    104101
    105102msgid "Attendance Sheet"
  • main/waeup.uniben/trunk/src/waeup/uniben/students/browser.py

    r18008 r18064  
    2626from zope.formlib.textwidgets import BytesDisplayWidget
    2727from zope.component import getUtility, queryUtility
     28from zope.catalog.interfaces import ICatalog
    2829from hurry.workflow.interfaces import IWorkflowInfo
    2930from waeup.kofa.interfaces import (
     
    3132from waeup.kofa.widgets.datewidget import FriendlyDatetimeDisplayWidget
    3233from waeup.kofa.browser.layout import action, KofaEditFormPage, UtilityView, KofaPage
     34from waeup.kofa.browser.pages import LocalRoleAssignmentUtilityView
     35from waeup.kofa.university.interfaces import ICourse
    3336from waeup.kofa.students.browser import (
    3437    StudentBaseEditFormPage,
     
    875878    form_fields['email'].field.required = True
    876879
     880class ExportMarkSheetSlip(UtilityView, grok.View,
     881    LocalRoleAssignmentUtilityView):
     882    """Deliver a PDF slip of course tickets in attendance sheet format.
     883    """
     884    grok.context(ICourse)
     885    grok.name('marksheet.pdf')
     886    grok.require('waeup.showStudents')
     887
     888    def update(self):
     889        self.current_academic_session = grok.getSite()[
     890            'configuration'].current_academic_session
     891        if not self.current_academic_session:
     892            self.flash(_('Current academic session not set.'), type="danger")
     893            self.redirect(self.url(self.context))
     894            return
     895
     896    @property
     897    def note(self):
     898        return
     899
     900    def data(self, session):
     901        cat = queryUtility(ICatalog, name='coursetickets_catalog')
     902        # Attention: Also tickets of previous studycourses are found
     903        coursetickets = cat.searchResults(
     904            session=(session, session),
     905            code=(self.context.code, self.context.code)
     906            )
     907        header = [[_('S/N'),
     908                   _('Matric No.'),
     909                   _('Name'),
     910                   _('Level'),
     911                   _('Course of\nStudies'),
     912                   _('CA'),
     913                   _('Exam'),
     914                   _('Total'),
     915                   ],]
     916        tickets = []
     917        sn = 1
     918        ctlist = sorted(list(coursetickets),
     919                        key=lambda value: str(value.student.faccode) +
     920                                          str(value.student.depcode) +
     921                                          str(value.student.certcode) +
     922                                          str(value.student.matric_number))
     923        # In AAUE only editable appear on the attendance sheet. Hopefully
     924        # this holds for other universities too.
     925        editable_tickets = [ticket for ticket in ctlist
     926            if ticket.editable_by_lecturer]
     927        for ticket in editable_tickets:
     928            name = textwrap.fill(ticket.student.display_fullname, 20)
     929            row = [sn,
     930                  ticket.student.matric_number,
     931                  name,
     932                  ticket.level,
     933                  ticket.student.certcode,
     934                  20 * ' ',
     935                  20 * ' ',
     936                  20 * ' ',
     937                  ]
     938            tickets.append(row)
     939            sn += 1
     940        return header + tickets, None
     941
     942    def render(self):
     943        lecturers = [i['user_title'] for i in self.getUsersWithLocalRoles()
     944                     if i['local_role'] == 'waeup.local.Lecturer']
     945        lecturers =  ', '.join(lecturers)
     946        students_utils = getUtility(IStudentsUtils)
     947        return students_utils.renderPDFCourseticketsOverview(
     948            self, 'marksheet', self.current_academic_session,
     949            self.data(self.current_academic_session),
     950            lecturers, '', 65, self.note)
     951
     952
    877953
    878954
  • main/waeup.uniben/trunk/src/waeup/uniben/students/tests/test_browser.py

    r18047 r18064  
    13481348        open(path, 'wb').write(self.browser.contents)
    13491349        print "Sample PDF affidavit_good_conduct.pdf written to %s" % path
     1350
     1351    def test_download_mark_sheet(self):
     1352        # A course ticket slip can be downloaded
     1353        self.course.title = (u'Lorem ipsum     dolor sit amet, consectetur     adipisici, '
     1354                             u'sed         eiusmod tempor    incidunt ut  labore et dolore')
     1355        self.student.firstname = u'Emmanuella Woyengifigha Mercy Onosemudiana'
     1356        self.student.lastname = u'OYAKEMIEGBEGHA'
     1357        self.student.matric_number = u'hdk7gd62i872z27zt27ge'
     1358        self.app['configuration'].current_academic_session = 2004
     1359        course_url = (
     1360            'http://localhost/app/faculties/fac1/dep1/courses/COURSE1')
     1361        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
     1362        pdf_url = '%s/marksheet.pdf' % course_url
     1363        self.browser.open(pdf_url)
     1364        self.assertEqual(self.browser.headers['Status'], '200 Ok')
     1365        self.assertEqual(
     1366            self.browser.headers['Content-Type'], 'application/pdf')
     1367        path = os.path.join(samples_dir(), 'marksheet.pdf')
     1368        open(path, 'wb').write(self.browser.contents)
     1369        print "Sample PDF marksheet.pdf written to %s" % path
Note: See TracChangeset for help on using the changeset viewer.