From 5e270aeaacd8527b954c199daea471dfe5710922 Mon Sep 17 00:00:00 2001 From: Danil Akhtarov Date: Wed, 29 Nov 2023 23:58:22 +0300 Subject: [PATCH] refactor: optimise calc --- sportorg/common/broker.py | 1 - sportorg/models/result/result_calculation.py | 67 ++++++++++---------- sportorg/models/result/result_checker.py | 4 +- sportorg/models/result/score_calculation.py | 5 +- 4 files changed, 39 insertions(+), 38 deletions(-) diff --git a/sportorg/common/broker.py b/sportorg/common/broker.py index 83da2e7e..f744e4c4 100644 --- a/sportorg/common/broker.py +++ b/sportorg/common/broker.py @@ -1,4 +1,3 @@ -import datetime import logging from sportorg.common.singleton import singleton diff --git a/sportorg/models/result/result_calculation.py b/sportorg/models/result/result_calculation.py index 660b0e21..db7e8f96 100644 --- a/sportorg/models/result/result_calculation.py +++ b/sportorg/models/result/result_calculation.py @@ -3,7 +3,6 @@ from sportorg.common.otime import OTime from sportorg.models.constant import RankingTable from sportorg.models.memory import ( - Group, Qualification, RaceType, RelayTeam, @@ -16,6 +15,8 @@ class ResultCalculation: def __init__(self, r): self.race = r + self._group_finishes = {} + self._group_persons = {} def process_results(self): logging.debug('Process results') @@ -47,6 +48,8 @@ def process_results(self): self.set_rank(i) def get_group_finishes(self, group): + if group in self._group_finishes: + return self._group_finishes[group] ret = [] for i in self.race.results: person = i.person @@ -55,15 +58,19 @@ def get_group_finishes(self, group): ret.append(i) ret.sort() group.count_finished = len(ret) + self._group_finishes[group] = ret return ret def get_group_persons(self, group): + if group in self._group_persons: + return self._group_persons[group] ret = [] for i in self.race.persons: person = i if person.group is group: ret.append(i) group.count_person = len(ret) + self._group_persons[group] = ret return ret @staticmethod @@ -98,40 +105,36 @@ def set_places(array): res.current_result = res.get_result() def process_relay_results(self, group): - if group and isinstance(group, Group): - results = self.get_group_finishes(group) + results = self.get_group_finishes(group) - relay_teams = {} - for res in results: - bib = res.person.bib - - team_number = bib % 1000 - if str(team_number) not in relay_teams: - new_team = RelayTeam(self.race) - new_team.group = group - new_team.bib_number = team_number - relay_teams[str(team_number)] = new_team - - team = relay_teams[str(team_number)] - team.add_result(res) - teams_sorted = sorted(relay_teams.values()) - place = 1 # place to show - order = 1 # order for templates - for cur_team in teams_sorted: - if ( - not cur_team.get_is_status_ok() - or cur_team.get_is_out_of_competition() - ): - cur_team.set_place(-1) - else: - cur_team.set_place(place) - place += 1 + relay_teams = {} + for res in results: + bib = res.person.bib + + team_number = bib % 1000 + if str(team_number) not in relay_teams: + new_team = RelayTeam(self.race) + new_team.group = group + new_team.bib_number = team_number + relay_teams[str(team_number)] = new_team + + team = relay_teams[str(team_number)] + team.add_result(res) + teams_sorted = sorted(relay_teams.values()) + place = 1 # place to show + order = 1 # order for templates + for cur_team in teams_sorted: + if not cur_team.get_is_status_ok() or cur_team.get_is_out_of_competition(): + cur_team.set_place(-1) + else: + cur_team.set_place(place) + place += 1 - cur_team.set_order(order) - order += 1 + cur_team.set_order(order) + order += 1 - cur_team.set_start_times() - return relay_teams.values() + cur_team.set_start_times() + return relay_teams.values() def set_rank(self, group): ranking = group.ranking diff --git a/sportorg/models/result/result_checker.py b/sportorg/models/result/result_checker.py index dcb46d96..a60bbfd5 100644 --- a/sportorg/models/result/result_checker.py +++ b/sportorg/models/result/result_checker.py @@ -63,8 +63,8 @@ def checking(cls, result): return o - @classmethod - def check_all(cls): + @staticmethod + def check_all(): logging.debug('Checking all results') for result in race().results: if result.person: diff --git a/sportorg/models/result/score_calculation.py b/sportorg/models/result/score_calculation.py index 61158852..e1301ecb 100644 --- a/sportorg/models/result/score_calculation.py +++ b/sportorg/models/result/score_calculation.py @@ -107,9 +107,8 @@ def get_group_region_results(self, group, region): @staticmethod def get_region_for_organization(org): - if org: - if org.region: - return org.region + if org and org.region: + return org.region return None def get_all_regions(self):