Source code for results.views.usebio

from datetime import datetime

import xmltodict
from django.contrib.humanize.templatetags.humanize import ordinal

from cobalt.settings import MEDIA_ROOT
from results.models import ResultsFile, PlayerSummaryResult


[docs] def parse_usebio_file(results_file): """read a USEBIO format XML file that has already been uploaded and turn into a dictionary""" file_name = f"{MEDIA_ROOT}/{results_file.results_file.name}" with open(file_name, "rb") as file: xml = file.read() xml = xmltodict.parse(xml) return xml["USEBIO"]
[docs] def players_from_usebio(results_file: ResultsFile) -> list: """returns the players from a usebio results file""" xml = parse_usebio_file(results_file) return [player["PAIR_NUMBER"] for player in xml["EVENT"]["PARTICIPANTS"]["PAIR"]]
[docs] def boards_from_usebio(results_file: ResultsFile) -> list: """returns the boards from a usebio results file""" xml = parse_usebio_file(results_file) return [board["BOARD_NUMBER"] for board in xml["HANDSET"]["BOARD"]]
[docs] def create_player_records_from_usebio_format_pairs( results_file: ResultsFile, xml: dict ): """take in a xml usebio structure and generate the PlayerSummaryResult records for pairs event""" xml = xml.get("EVENT") event_name = xml.get("EVENT_DESCRIPTION") event_date_str = xml.get("DATE") # Try to get the date from the file. Date format is local try: event_date = datetime.strptime(event_date_str, "%d/%m/%Y").date() except ValueError: try: event_date = datetime.strptime(event_date_str, "%d-%m-%Y").date() except ValueError: event_date = datetime.today() for detail in xml["PARTICIPANTS"]["PAIR"]: percentage = detail["PERCENTAGE"] position = detail["PLACE"] place = ordinal(position) this_partner_name = "" partner_names = { player["NATIONAL_ID_NUMBER"]: player["PLAYER_NAME"].title() for player in detail["PLAYER"] } for player in detail["PLAYER"]: player_system_number = player["NATIONAL_ID_NUMBER"] for partner_name in partner_names: if player_system_number != partner_name: this_partner_name = partner_names[partner_name][:100] # We create records even for unregistered players, so they have a history when they eventually register if player_system_number: PlayerSummaryResult( player_system_number=player_system_number, results_file=results_file, result_date=event_date, position=position, partner_or_team_name=this_partner_name, percentage=percentage, result_string=f"{place} in {event_name} at {results_file.organisation}", event_name=event_name, ).save()