def parseAbsentClasses(self): # first find the absent classes for les in self._fileContent['result']['classAbsences']: if les['startDate'] != les['endDate']: self._errorDialog.addDebug( 'Don\'t support different starting and ending date - skipping!', pprint.pformat(les) ) elif les['startTime'] != '0000' or les['endTime'] != '0000': self._errorDialog.addDebug( 'Don\'t support start/end time for absent classes - skipping!', pprint.pformat(les) ) else: entryDate = '%s.%s.%s' % ( les['startDate'][6:], les['startDate'][4:6], les['startDate'][:4] ) newEntry = ChangeEntry([entryDate], 2, None) newEntry._hours = [0] newEntry._startTime = '00:00:00' newEntry._endTime = '23:59:59' course = self._classList.findClassById(les['classRef']) if course is None: self.dlg.addData(pprint.pformat(les)) self.dlg.addError('Course unknown for absent course - skipping!') continue newEntry._course = [course] self._absentClasses.append(newEntry)
def parseAbsentTeachers(self): # find the absent teachers. for les in self._fileContent['result']['teacherAbsences']: if les['startDate'] != les['endDate']: self._errorDialog.addDebug( 'Don\'t support different starting and ending date - skipping!', pprint.pformat(les) ) elif les['startTime'] != '0000' or les['endTime'] != '0000': self._errorDialog.addDebug( 'Don\'t support start/end time for absent classes - skipping!', pprint.pformat(les) ) else: entryDate = '%s.%s.%s' % ( les['startDate'][6:], les['startDate'][4:6], les['startDate'][:4] ) newEntry = ChangeEntry([entryDate], 5, None) newEntry._hours = [0] newEntry._startTime = '00:00:00' newEntry._endTime = '23:59:59' teacher = self._teacherList.findById(les['teacherRef']) if teacher is None: self.dlg.addData(pprint.pformat(les)) self.dlg.addError('Teacher unknown for absent teachers - skipping!') continue newEntry._teacher = teacher self._absentTeacher.append(newEntry)
def parseYardDuty(self): # find the absent teachers. for les in self._fileContent['result']['displaySchedule']['supervisionTimes']: # skip which don't have changes if 'changes' not in les.keys(): continue entryDates = [] for dt in les['dates']: entryDates.append('%s.%s.%s' % (dt[6:], dt[4:6], dt[:4])) newEntry = ChangeEntry(entryDates, 4, None) newEntry._startTime = '%s:%s:00' % (les['startTime'][:2], les['startTime'][2:4]) newEntry._endTime = '%s:%s:00' % (les['endTime'][:2], les['endTime'][2:4]) newEntry._hours = self._timeFramesDuty.getMatchingEntries(les['startTime'], les['endTime']) if 'supervisionTitle' in les.keys(): newEntry._info = les['supervisionTitle'] if 'areaCode' in les.keys(): newEntry._room = les['areaCode'] oldTeacher = None # the teacher (strange that it is a list) try: for t in les['absentTeacherCodes']: oldTeacher = t break except KeyError as e: # is it allowed, if the reasonType == classAbsence! self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addWarning('Cannot parse yard chnage due missing old teacher - skipping!') continue newTeacher = None # the teacher (strange that it is a list) try: for t in les['teacherCodes']: newTeacher = t break except KeyError as e: # is it allowed, if the reasonType == classAbsence! self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addWarning('Cannot parse yard chnage due missing new teacher - skipping!') continue newEntry._teacher = oldTeacher newEntry._changeTeacher = newTeacher self._supervision.append(newEntry)
def parse(self): planParsedSuccessful = True try: for row in reader: try: date, hours, teacher, subject, className, info, room, note = row except ValueError: # might be a empty line :) continue try: day, month, year = date.split('.') except ValueError: # uhh it might be the first line: skip! continue entryDate = '%s.%s.%s' % (day, month, year) try: hours = hours.strip().split('-'); hours[0] = int(hours[0].replace('.', '').strip()) if len(hours) > 1: hours[1] = int(hours[1].replace('.', '').strip()) else: hours.append(hours[0]) except Exception as e: print('Got error: %s' % (e,)) continue newEntry = ChangeEntry([entryDate], 3, None) hours = list(range(hours[0], hours[1] + 1)) newEntry._hours = hours newEntry._teacher = teacher newEntry._subject = subject newEntry._course = className.strip() newEntry._info = info newEntry._note = note self._plan.append(newEntry) except Exception as e: self._errorDialog.addError('Could not parse the plan. Unexpected error occured: %s.' % (str(e),)) planParsedSuccessful = False raise finally: self.planParsed.emit(planParsedSuccessful)
def parseStandin(self): # some patterns (better don't ask which possibilities we have). pattMovedFrom = re.compile(self._config.get('changekind', 'movedFrom')) pattMovedTo = re.compile(self._config.get('changekind', 'movedTo')) # find the absent teachers. for les in self._fileContent['result']['displaySchedule']['lessonTimes']: # skip which don't have changes if 'changes' not in les.keys(): continue entryDates = [] for dt in les['dates']: entryDates.append('%s.%s.%s' % (dt[6:], dt[4:6], dt[:4])) newEntry = ChangeEntry(entryDates, 1, None) newEntry._startTime = '%s:%s:00' % (les['startTime'][:2], les['startTime'][2:4]) newEntry._endTime = '%s:%s:00' % (les['endTime'][:2], les['endTime'][2:4]) newEntry._hours = self._timeFramesPupil.getMatchingEntries(les['startTime'], les['endTime']) if len(newEntry._hours) <= 0: self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addError( 'Could not find a proper lesson for time: %s to %s - skipping!' % ( newEntry._startTime, newEntry._endTime ) ) continue # now check if the type is classAbsence. In that case, we need to switch to classFree, if the # we have hours given! - otherwise we misinterpret the data. if 'reasonType' in les['changes'].keys() and les['changes']['reasonType'] == 'classAbsence' \ and les['startTime'] != '0000': les['changes']['reasonType'] = 'classFree' # subject of course try: subject = les['subjectCode'] except KeyError as e: # maybe its an additional lesson...? if 'lessonTitle' in les['changes'].keys(): subject = les['changes']['lessonTitle'] else: # is it allowed, if the reasonType == classAbsence! if 'reasonType' not in les['changes'].keys() or les['changes']['reasonType'] != 'classAbsence': self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addWarning( 'Could not found "subjectCode" (subject) in record - skipping!' ) continue newEntry._subject = subject # new subject? if 'newSubjectCode' in les['changes'].keys(): newEntry._changeSubject = les['changes']['newSubjectCode'] # the teacher (strange that it is a list) try: for t in les['teacherCodes']: teacher = t break except KeyError as e: # is it allowed, if the reasonType == classAbsence! if 'reasonType' not in les['changes'].keys() or les['changes']['reasonType'] != 'classAbsence': self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addWarning('Could not found "teacherCodes" (teacher) in record - skipping!') continue newEntry._teacher = teacher # new teacher? if 'newTeacherCodes' in les['changes'].keys(): for t in les['changes']['newTeacherCodes']: newEntry._changeTeacher = t break # Maybe there is no room, but absentRoomCodes; then we have to use this. # Changed on 11.11.: absentRoomCodes has the higher priority than the normal room codes. if 'absentRoomCodes' in les['changes'].keys() and len(les['changes']['absentRoomCodes']) > 0: les['roomCodes'] = les['changes']['absentRoomCodes'] # Room (we also consider here only the first) try: for r in les['roomCodes']: room = r break except KeyError as e: # is it allowed, if the reasonType == classAbsence! if 'reasonType' not in les['changes'].keys() or les['changes']['reasonType'] != 'classAbsence': self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addWarning('Could not found "roomCodes" (room) in record - skipping!') continue newEntry._room = room # new room? if 'newRoomCodes' in les['changes'].keys(): for t in les['changes']['newRoomCodes']: newEntry._changeRoom = t break # courses try: for cl in les['classCodes']: newEntry._course.append(cl) except KeyError: self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addWarning('Could not found "classCodes" (course) in record - skipping!') continue # some information? if 'caption' in les['changes'].keys(): newEntry._info = les['changes']['caption'] if 'information' in les['changes'].keys(): newEntry._note = les['changes']['information'] elif 'information' in les['changes'].keys(): newEntry._info = les['changes']['information'] # hour cancelled? if 'cancelled' in les['changes'].keys(): # it was moved! if les['changes']['cancelled'] == 'movedAway': # it was moved far away. Lets get the details! if 'caption' in les['changes'].keys(): tstMove = pattMovedTo.match(les['changes']['caption']) if tstMove is not None: day, month, non = tstMove.group(1).split('.') weekday = tstMove.group(2) mvstr = tstMove.group(3) mvend = tstMove.group(5) if mvend is not None: hourtxt = '%s.-%s.' % (mvstr, mvend) else: hourtxt = '%s.' % (mvstr,) newEntry._info = '' newEntry._note = self._config.get('vplan', 'txtMoved').format(weekday, hourtxt, int(day), int(month)) chgType = 16 # or the hour is just cancelled. elif les['changes']['cancelled'] == 'classFree': chgType = 64 # if the info + notes field is empty, lets populate the field by our own: if len(newEntry._info) == 0 and len(newEntry._note) == 0: newEntry._info = self._config.get('vplan', 'txtReplaceFree') # date moved from? Then lets get the detail! if 'caption' in les['changes'].keys(): tstMove = pattMovedFrom.match(les['changes']['caption']) if tstMove is not None: day, month, non = tstMove.group(1).split('.') weekday = tstMove.group(2) mvstr = tstMove.group(3) mvend = tstMove.group(5) if mvend is not None: hourtxt = '%s.-%s.' % (mvstr, mvend) else: hourtxt = '%s.' % (mvstr,) newEntry._info = '' newEntry._note = self._config.get('vplan', 'txtMovedNote').format( weekday, hourtxt, int(day), int(month) ) chgType = 32 # remove some kind of infos. if len(newEntry._info) > 0: if newEntry._info in self._config.get('vplan', 'rmvInfos').split(';'): newEntry._info = '' lessonRef = None try: lessonRef = les['lessonRef'] except KeyError: pass # a new lesson which replaces an old one but has no reference... if lessonRef is None and newEntry._teacher == newEntry._changeTeacher \ and newEntry._room == newEntry._changeRoom: # is the guess algorithm disabled => skip? if not self._config.getboolean('options', 'guessOriginalLesson'): self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addInfo( 'No lesson reference given and the "guess" algorithm is disabled - skipping!' ) continue self._errorDialog.addData(pprint.pformat(les)) self._errorDialog.addInfo('Found something to guess!') # does it already exist there? for e in data['plan']: if entry['date'] == entryDates[0] \ and entry['hour'] == hour \ and entry['course'] == courses[0]: # found an entry. newEntry._teacher = entry['teacher'] newEntry._room = entry['room'] if newEntry._subject == '': newEntry._subject = entry['subject'] newEntry._chgType = 0 break self._standin.append(newEntry)