Ignore:
Timestamp:
30 Jan 2012, 07:41:17 (13 years ago)
Author:
Henrik Bettermann
Message:

Implement study level importer.

File:
1 edited

Legend:

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

    r7534 r7536  
    3737from waeup.sirp.students.interfaces import (
    3838    IStudent, IStudentStudyCourse,
    39     IStudentUpdateByRegNo, IStudentUpdateByMatricNo)
     39    IStudentUpdateByRegNo, IStudentUpdateByMatricNo,
     40    IStudentStudyLevel)
    4041from waeup.sirp.students.workflow import  IMPORTABLE_STATES
    4142from waeup.sirp.utils.batching import BatchProcessor
     
    268269        return self.getParent(row, site) is not None
    269270
    270 
    271271    def entryExists(self, row, site):
    272272        return self.getEntry(row, site) is not None
     
    274274    def getEntry(self, row, site):
    275275        student = self.getParent(row, site)
    276         if not student:
     276        if student is None:
    277277            return None
    278278        return student.get('studycourse')
     
    306306        return errs, inv_errs, conv_dict
    307307
     308class StudentStudyLevelProcessor(BatchProcessor):
     309    """A batch processor for IStudentStudyLevel objects.
     310    """
     311    grok.implements(IBatchProcessor)
     312    grok.provides(IBatchProcessor)
     313    grok.context(Interface)
     314    util_name = 'studylevelimporter'
     315    grok.name(util_name)
     316
     317    name = u'StudentStudyLevel Importer'
     318    iface = IStudentStudyLevel
     319    factory_name = 'waeup.StudentStudyLevel'
     320
     321    location_fields = []
     322
     323    mode = None
     324
     325    @property
     326    def available_fields(self):
     327        return sorted(list(set(
     328            ['student_id','reg_number','matric_number','level'] + getFields(
     329                self.iface).keys())))
     330
     331    def checkHeaders(self, headerfields, mode='ignore'):
     332        if not 'reg_number' in headerfields and not 'student_id' \
     333            in headerfields and not 'matric_number' in headerfields:
     334            raise FatalCSVError(
     335                "Need at least columns student_id " +
     336                "or reg_number or matric_number for import!")
     337        if not 'level' in headerfields:
     338            raise FatalCSVError(
     339                "Need level for import!")
     340        # Check for fields to be ignored...
     341        not_ignored_fields = [x for x in headerfields
     342                              if not x.startswith('--')]
     343        if len(set(not_ignored_fields)) < len(not_ignored_fields):
     344            raise FatalCSVError(
     345                "Double headers: each column name may only appear once.")
     346        return True
     347
     348    def getParent(self, row, site):
     349        if not 'students' in site.keys():
     350            return None
     351        if 'student_id' in row.keys() and row['student_id']:
     352            if row['student_id'] in site['students']:
     353                student = site['students'][row['student_id']]
     354                return student['studycourse']
     355        elif 'reg_number' in row.keys() and row['reg_number']:
     356            reg_number = row['reg_number']
     357            #import pdb; pdb.set_trace()
     358            cat = queryUtility(ICatalog, name='students_catalog')
     359            results = list(
     360                cat.searchResults(reg_number=(reg_number, reg_number)))
     361            if results:
     362                return results[0]['studycourse']
     363        elif 'matric_number' in row.keys() and row['matric_number']:
     364            matric_number = row['matric_number']
     365            cat = queryUtility(ICatalog, name='students_catalog')
     366            results = list(
     367                cat.searchResults(matric_number=(matric_number, matric_number)))
     368            if results:
     369                return results[0]['studycourse']
     370        return None
     371
     372    def parentsExist(self, row, site):
     373        return self.getParent(row, site) is not None
     374
     375    def entryExists(self, row, site):
     376        return self.getEntry(row, site) is not None
     377
     378    def getEntry(self, row, site):
     379        studycourse = self.getParent(row, site)
     380        if studycourse is None:
     381            return None
     382        return studycourse.get(row['level'])
     383
     384    def addEntry(self, obj, row, site):
     385        parent = self.getParent(row, site)
     386        obj.level = int(row['level'])
     387        parent[row['level']] = obj
     388        return
     389
     390    def checkConversion(self, row, mode='ignore'):
     391        """Validates all values in row.
     392        """
     393        converter = IObjectConverter(self.iface)
     394        errs, inv_errs, conv_dict =  converter.fromStringDict(
     395            row, self.factory_name)
     396        # We have to check if level is a valid integer.
     397        # This is not by the converter.
     398        try:
     399            level = int(row['level'])
     400            if level not in range(0,600,10):
     401                errs.append(('level','no valid integer'))
     402        except ValueError:
     403            errs.append(('level','no integer'))
     404        return errs, inv_errs, conv_dict
Note: See TracChangeset for help on using the changeset viewer.