From c07e751820eb5a577b31854ef113dc5b90901c35 Mon Sep 17 00:00:00 2001 From: Christian Wolf Date: Mon, 25 Sep 2023 15:03:45 +0200 Subject: [PATCH] Tidied up batch script --- src/solo_turnier/batch.py | 325 -------------------------------------- 1 file changed, 325 deletions(-) diff --git a/src/solo_turnier/batch.py b/src/solo_turnier/batch.py index c1d6af7..1f8b567 100644 --- a/src/solo_turnier/batch.py +++ b/src/solo_turnier/batch.py @@ -14,165 +14,9 @@ class BatchWorker: self.l = logging.getLogger('solo_turnier.batch') self.config = config - self.__groupMap = { - 'Kin.': 0, - 'Kin./Jun.': 1, - 'Jun.': 10, - 'Jun./Jug.': 11, - 'Jug.': 20 - } - self.__danceMap = { - 'Samba': 1, - 'Cha Cha': 2, - 'Rumba': 3, - 'Paso Doble': 4, - 'Jive': 5, - 'Langs. Walzer': 11, - 'Tango': 12, - 'Wiener Walzer': 13, - 'Slowfox': 14, - 'Quickstep': 15 - } - self.__groupFinalMap = { - 'Kinder': 'Kin.', - 'Junioren': 'Jun.', - 'Jugend': 'Jug.' - } - def __extractDataFromFiles(self): - allResultName = os.path.join(self.config.importPath(), 'allresults.csv') - readerAllResults = solo_turnier.reader.AllResultReader(allResultName) - allResults = readerAllResults.readFile() - finals = [] - # Do this in a loop - finalName = os.path.join(self.config.importPath(), 'wert_er.txt') - readerFinal = solo_turnier.reader.ERReader(finalName) - result = readerFinal.readFile() - finals.append(result) - - return (allResults, finals) - - def __convertFinalToTuple(self, result): - return { - 'group': result['gruppe'], - 'class': result['klasse'], - 'dance': result['tanz'], - 'finalists': result['finalisten'] - } - - def __extractAllData(self, r): - return { - 'date': r[1], - 'group': r[2], - 'class': r[3], - 'dance': r[4], - 'id': int(r[5]), - 'firstName': r[6], - 'lastName': r[7], - 'club': r[10], - 'ltv': r[11], - 'place': r[12], - 'placeTo': r[13], - 'points': r[14], - 'personGroup': r[15], - 'personClass': r[16], - 'remarks': r[17] - } - - def __extractPersonData(self, r): - data = self.__extractAllData(r) - person = solo_turnier.participant.Person( - firstName=data['firstName'], - lastName=data['lastName'], - club=data['club'], - group=data['personGroup'] - ) - return person - - def __extractPersons(self, allResults): - def decorate(person,i): - return (person.firstName, person.lastName, person.club, i, person) - - personRows = [self.__extractPersonData(r) for r in allResults['data']] - persons = list(set(personRows)) - persons = [decorate(p,i) for i,p in enumerate(persons)] - persons.sort() - persons = [p[4] for p in persons] - return persons - - def __extractAllResults(self, allResults, persons: list[solo_turnier.participant.Person]): - def __extractDanceResult(r): - data = self.__extractAllData(r) - try: - return { - 'dance': data['dance'], - 'class': data['personClass'], - 'place': int(data['place']), - 'placeTo': int(data['placeTo']), - 'id': data['id'] - } - except ValueError: - self.l.debug('Issue found with data %s.', data) - return None - - ret = {} - for row in allResults['data']: - danceResult = __extractDanceResult(row) - if danceResult is not None: - person = self.__extractPersonData(row) - if person not in ret: - ret[person] = [] - - ret[person].append(danceResult) - return ret - - def __extractCompetitionEntries(self, r): - data = self.__extractAllData(r) - return (data['personGroup'], data['dance']) - - def __extractCompetitions(self, allResults): - def __decorate(r): - return (self.__groupMap[r[0]], self.__danceMap[r[1]],r) - competitionsRows = [self.__extractCompetitionEntries(r) for r in allResults['data']] - # competitions = list(set([self.__extractDanceResult(r) for r in allResults['data']])) - competitions = [__decorate(r) for r in list(set(competitionsRows))] - competitions.sort() - competitions = [r[2] for r in competitions] - return competitions - - - def __extractGroups(self, allResults): - def __extractGroupEntries(r): - data = self.__extractAllData(r) - return data['personGroup'] - - def __decorate(r): - return (self.__groupMap[r], r) - - rows = [__extractGroupEntries(r) for r in allResults['data']] - groups = [__decorate(r) for r in list(set(rows))] - groups.sort() - groups = [r[1] for r in groups] - return groups - - def __extarctBasicData(self, allResults): - def __extractRow(r): - ret = { - 'firstName': r[6], - 'lastName': r[7], - 'number': int(r[5]), - 'club': r[10], - 'place': int(r[12]), - 'placeTo': int(r[13]), - 'group': r[15], - 'class': r[16] - } - return ret - - return [__extractRow(r) for r in allResults['data'][0:2]] - def run(self): self.l.debug(self.config.__dict__) @@ -190,172 +34,3 @@ class BatchWorker: consoleOutputtter = solo_turnier.output.ConsoleOutputter() consoleOutputtter.output(combinedData) - - # csvReader = solo_turnier.reader.CSVResultReader(self.config.importCSVPath()) - # self.l.info('Loading the total result CSV file %s', self.config.importCSVPath()) - # csvData = csvReader.readFile() - # self.l.info('CSV file has been read') - - # csvExtractor = solo_turnier.reader.CSVExtractor() - # self.l.info('Importing CSV data into internal structures') - # csvRows = csvExtractor.mapCSVImport(csvData) - - # worker = solo_turnier.worker.DataWorker() - -# ///// - - # self.l.info('Checking for feasible HTML export files in "%s"', self.config.importHtmlPath()) - # htmlCandidates = locator.findCandidates(self.config.importHtmlPath()) - # self.l.debug('Found HTML file candidates: %s', htmlCandidates) - - # htmlParser = solo_turnier.html_parser.HtmlParser() - # htmlImports = [] - # self.l.info('Importing the candidates') - # for candidate in htmlCandidates: - # self.l.debug('Processing file %s', candidate) - # with open(candidate, 'r') as fp: - # fileContent = fp.read() - # htmlImports.append(htmlParser.parseString(fileContent)) - # self.l.info('All HTML files have been parsed') - - - # self.l.info('Processing the imported data') - - - # self.l.debug('Combining results from CSV for individual users') - # data = worker.combineRowsByPerson(csvRows) - # self.l.debug('Fix the groups for combined competitions') - # unambiguous, fixedGroups = worker.consolidateGroups(data) - # if fixedGroups: - # self.l.info('It was required to fix some group issues.') - # if not unambiguous: - # self.warning('There were couples whose group could not be extracted unambiguously.') - # self.l.debug('Merging HTML and CSV data') - # worker.mergeHtmlData(data, htmlImports) - # self.l.info('Data is prepared') - - # consoleOutputtter = solo_turnier.output.ConsoleOutputter() - # consoleOutputtter.output(data) - - def run1(self): - allResults, finals = self.__extractDataFromFiles() - - persons = self.__extractPersons(allResults) - self.l.debug('Found persons: %s', persons) - - totalResults = self.__extractAllResults(allResults, persons) - self.l.debug('Total results: %s', totalResults) - - groups = self.__extractGroups(allResults) - self.l.debug('Found groups: %s', groups) - - groupRes = {} - for group in groups: - self.l.info('Processing group %s', group) - groupRes[group] = {} - - personsInGroup = [p for p in persons if p.group == group] - self.l.debug('Remaining persons: %s', personsInGroup) - groupRes[group]['participants'] = personsInGroup - - groupRes[group]['results'] = {} - for person in personsInGroup: - groupRes[group]['results'][person] = totalResults[person] - # resultsInGroup = totalResults[personsInGroup] - # self.l.debug('Results in group: %s', resultsInGroup) - - # Do this in a loop - finalists = [self.__convertFinalToTuple(r) for r in finals] - self.l.debug('Mapped to tuples: %s', finalists) - - self.l.info('Augmenting the list of participants') - for finalistList in finalists: - self.l.debug('Augmenting competition %s', finalistList) - longGroup = finalistList['group'] - grep = self.__groupFinalMap[longGroup] - - for person in groupRes[group]['results'].keys(): - self.l.debug('Checking %s for finalist state in competition', person) - for competition in groupRes[group]['results'][person]: - if competition['dance'] != finalistList['dance']: - continue - if competition['class'] != finalistList['class']: - continue - - competition['finalist'] = (competition['id'] in finalistList['finalists']) - self.l.debug('Organized results: %s', groupRes) - - dancesRaw = [competition['dance'] for group in groups for person in groupRes[group]['participants'] for competition in groupRes[group]['results'][person]] - dances = list(set(dancesRaw)) - dances = [(self.__danceMap[d], d) for d in dances] - dances.sort() - dances = [r[1] for r in dances] - self.l.debug('Found dances in competition: %s', dances) - - ret = {} - for group in groups: - ret[group] = {} - - for person in groupRes[group]['participants']: - ret[group][person] = {} - # Seed the data structure - for dance in dances: - ret[group][person][dance] = { - 'participated': False, - 'class': '', - 'finalist': False, - 'place': '', - 'id': 0 - } - - for competition in groupRes[group]['results'][person]: - def __getPlace(): - if competition['place'] == competition['placeTo']: - return str(competition['place']) - else: - return f"{competition['place']}-{competition['placeTo']}" - - dance = competition['dance'] - ret[group][person][dance]['participated'] = True - ret[group][person][dance]['class'] = competition['class'] - ret[group][person][dance]['finalist'] = competition.get('finalist', False) - ret[group][person][dance]['place'] = __getPlace() - ret[group][person][dance]['id'] = competition['id'] - - self.l.debug('Returned data: %s', pprint.pformat(ret)) - - for group in groups: - self.l.debug('Outputting table for group %s', group) - - print(f'Ergebnisse der Gruppe {group}') - print() - - row = ['Teilnehmer(in)'] + dances - table = [row] - - for person in ret[group]: - row = [str(person)] - for dance in dances: - if not ret[group][person][dance]['participated']: - row.append('') - continue - if not ret[group][person][dance]['finalist']: - row.append('x') - continue - row.append(f"{ret[group][person][dance]['place']} ({ret[group][person][dance]['class']}, {ret[group][person][dance]['id']})") - table.append(row) - - self.l.debug(table) - # print(tabulate.tabulate(table)) - print(tabulate.tabulate(table, headers='firstrow', tablefmt='fancy_grid')) - print() - - - # self.l.debug('Organized results: %s', pprint.pformat( groupRes['Jun.'])) - # competitions = self.__extractCompetitions(allResults) - # self.l.debug('Competitions: %s', competitions) - - # basicData = self.__extarctBasicData(allResults) - # self.l.debug('Basic extracted data: %s', basicData) - -