Ignore:
Timestamp:
25 Oct 2012, 21:52:10 (12 years ago)
Author:
Henrik Bettermann
Message:

Reorganize ICourseTicket. Add ICourseTicketImport which validates a new field called level_session.

Customize checkConversion of CourseTicketProcessor?:
If level_session is provided in row the importer checks if
the parent studylevel exists and if its level_session
attribute corresponds with the expected value in row. The error message
then tells us why course result import fails.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/trunk/src/waeup/kofa/students/batching.py

    r9418 r9420  
    4343    IStudent, IStudentStudyCourse,
    4444    IStudentUpdateByRegNo, IStudentUpdateByMatricNo,
    45     IStudentStudyLevel, ICourseTicket,
     45    IStudentStudyLevel, ICourseTicketImport,
    4646    IStudentOnlinePayment, IStudentVerdictUpdate)
    4747from waeup.kofa.students.workflow import  (
     
    305305    grok.baseclass()
    306306
    307     # additional available  fields
     307    # additional available fields
    308308    # beside 'student_id', 'reg_number' and 'matric_number'
    309309    additional_fields = []
     
    541541
    542542    name = u'CourseTicket Processor'
    543     iface = ICourseTicket
     543    iface = ICourseTicketImport
    544544    factory_name = 'waeup.CourseTicket'
    545545
     
    547547    additional_fields = ['level', 'code']
    548548    additional_headers = ['level', 'code']
     549
     550    @property
     551    def available_fields(self):
     552        fields = [
     553            'student_id','reg_number','matric_number',
     554            'mandatory', 'score', 'carry_over', 'automatic',
     555            'level_session'
     556            ] + self.additional_fields
     557        return sorted(fields)
    549558
    550559    def getParent(self, row, site):
     
    579588        obj.dcode = entries[0].__parent__.__parent__.code
    580589        obj.title = entries[0].title
    581         if getattr(obj, 'credits', None) is None:
    582             obj.credits = entries[0].credits
    583         if getattr(obj, 'passmark', None) is None:
    584             obj.passmark = entries[0].passmark
     590        #if getattr(obj, 'credits', None) is None:
     591        obj.credits = entries[0].credits
     592        #if getattr(obj, 'passmark', None) is None:
     593        obj.passmark = entries[0].passmark
    585594        obj.semester = entries[0].semester
    586595        parent[row['code']] = obj
     
    602611        errs, inv_errs, conv_dict = super(
    603612            CourseTicketProcessor, self).checkConversion(row, mode=mode)
    604 
    605         # We have to check if course really exists.
     613        if mode == 'remove':
     614            return errs, inv_errs, conv_dict
     615        # In update and create mode we have to check if course really exists.
    606616        # This is not done by the converter.
    607617        catalog = getUtility(ICatalog, name='courses_catalog')
     
    610620            errs.append(('code','non-existent'))
    611621            return errs, inv_errs, conv_dict
     622        # If level_session is provided in row we have to check if
     623        # the parent studylevel exists and if its level_session
     624        # attribute corresponds with the expected value in row.
     625        level_session = row.get('level_session', IGNORE_MARKER)
     626        if level_session not in (IGNORE_MARKER, ''):
     627            site = grok.getSite()
     628            studylevel = self.getParent(row, site)
     629            if studylevel is not None:
     630                if studylevel.level_session != level_session:
     631                    errs.append(('level_session','does not match %s'
     632                        % studylevel.level_session))
     633            else:
     634                errs.append(('level','does not exist'))
    612635        return errs, inv_errs, conv_dict
    613636
     
    793816        notify(grok.ObjectModifiedEvent(obj.__parent__))
    794817        return
    795 
    796 class CourseResultProcessor(CourseTicketProcessor):
    797     """A special batch processor for course results objects.
    798 
    799     Import course results, compares session and creates study level.
    800     """
    801     grok.implements(IBatchProcessor)
    802     grok.provides(IBatchProcessor)
    803     grok.context(Interface)
    804     util_name = 'courseresultprocessor'
    805     grok.name(util_name)
    806 
    807     name = u'Course Result Processor (special processor)'
    808     iface = ICourseTicket
    809     factory_name = 'waeup.CourseTicket'
    810 
    811     location_fields = []
    812     additional_fields = ['level', 'code']
    813     additional_headers = ['level', 'code']
    814 
    815     def getParent(self, row, site):
    816         student = self._getStudent(row, site)
    817         if student is None:
    818             return None
    819         return student['studycourse'].get(row['level'])
    820 
    821     def getEntry(self, row, site):
    822         level = self.getParent(row, site)
    823         if level is None:
    824             return None
    825         return level.get(row['code'])
    826 
    827     def updateEntry(self, obj, row, site):
    828         """Update obj to the values given in row.
    829         """
    830         items_changed = super(CourseTicketProcessor, self).updateEntry(
    831             obj, row, site)
    832         parent = self.getParent(row, site)
    833         student = self.getParent(row, site).__parent__.__parent__
    834         student.__parent__.logger.info(
    835             '%s - Course ticket in %s updated: %s'
    836             % (student.student_id,  parent.level, items_changed))
    837         return
    838 
    839     def addEntry(self, obj, row, site):
    840         parent = self.getParent(row, site)
    841         catalog = getUtility(ICatalog, name='courses_catalog')
    842         entries = list(catalog.searchResults(code=(row['code'],row['code'])))
    843         obj.fcode = entries[0].__parent__.__parent__.__parent__.code
    844         obj.dcode = entries[0].__parent__.__parent__.code
    845         obj.title = entries[0].title
    846         if getattr(obj, 'credits', None) is None:
    847             obj.credits = entries[0].credits
    848         if getattr(obj, 'passmark', None) is None:
    849             obj.passmark = entries[0].passmark
    850         obj.semester = entries[0].semester
    851         parent[row['code']] = obj
    852         return
    853 
    854     def delEntry(self, row, site):
    855         raise NotImplementedError('method not implemented')
    856 
    857     def checkConversion(self, row, mode='ignore'):
    858         """Validates all values in row.
    859         """
    860         errs, inv_errs, conv_dict = super(
    861             CourseTicketProcessor, self).checkConversion(row, mode=mode)
    862 
    863         # We have to check if course really exists.
    864         # This is not done by the converter.
    865         catalog = getUtility(ICatalog, name='courses_catalog')
    866         entries = catalog.searchResults(code=(row['code'],row['code']))
    867         if len(entries) == 0:
    868             errs.append(('code','non-existent'))
    869             return errs, inv_errs, conv_dict
    870         return errs, inv_errs, conv_dict
Note: See TracChangeset for help on using the changeset viewer.