research/referees/scripts/seed_wales.py
2024-01-31 21:41:29 +01:00

324 lines
14 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# %%
PROJECT_PATH = '/home/md/Work/ligalytics/leagues_develop/'
import os, sys
sys.path.insert(0, PROJECT_PATH)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "leagues.settings")
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
from leagues import settings
settings.DATABASES['default']['NAME'] = PROJECT_PATH+'/db.sqlite3'
# settings.DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'
# settings.DATABASES['default']['HOST'] = '0.0.0.0'
# settings.DATABASES['default']['PORT'] = '5432'
# settings.DATABASES['default']['USER'] = 'postgres'
# settings.DATABASES['default']['PASSWORD'] = 'secret123'
# settings.DATABASES['default']['NAME'] = 'mypgsqldb'
# settings.DATABASES['default']['ATOMIC_REQUESTS'] = False
# settings.DATABASES['default']['AUTOCOMMIT'] = True
# settings.DATABASES['default']['CONN_MAX_AGE'] = 0
# settings.DATABASES['default']['CONN_HEALTH_CHECKS'] = False
# settings.DATABASES['default']['OPTIONS'] = {}
os.environ["XPRESSDIR"] = "/opt/xpressmp"
os.environ["XPRESS"] = "/opt/xpressmp/bin"
os.environ["LD_LIBRARY_PATH"] = os.environ["XPRESSDIR"] + "/lib"
os.environ["DYLD_LIBRARY_PATH"] = os.environ["XPRESSDIR"] + "/lib"
os.environ["SHLIB_PATH"] = os.environ["XPRESSDIR"] + "/lib"
os.environ["LIBPATH"] = os.environ["XPRESSDIR"] + "/lib"
os.environ["PYTHONPATH"] = os.environ["XPRESSDIR"] + "/lib"
os.environ["CLASSPATH"] = os.environ["XPRESSDIR"] + "/lib/xprs.jar"
os.environ["CLASSPATH"] = os.environ["XPRESSDIR"] + "/lib/xprb.jar" + os.pathsep + os.environ["CLASSPATH"]
os.environ["CLASSPATH"] = os.environ["XPRESSDIR"] + "/lib/xprm.jar" + os.pathsep + os.environ["CLASSPATH"]
os.environ["PATH"] = os.environ["XPRESSDIR"] + "/bin" + os.pathsep + os.environ["PATH"]
import django
django.setup()
from scheduler.models import *
import pulp
from pulp import lpSum, value, XPRESS, GUROBI, PULP_CBC_CMD
from django.db.models import Q
from django.template.loader import render_to_string
from qualifiers.models import *
from common.models import GlobalTeam, GlobalCountry
from scheduler.models import Season, Scenario, Team, Day, CountryClash, Country
from qualifiers.draws import groupTeams, optimize_inversions4
from scheduler.solver.tasks.optimize import optimize
from common.functions import distanceInMilesByGPS
import datetime
from referees.helpers import use_referees, import_deb_delegates, seed_rounds_from_days, generate_distance_matrix
from referees.models import *
import random
import time
import json
import csv
import networkx as nx
import matplotlib.pyplot as plt
from dateutil import parser
from datetime import timedelta
import googlemaps
import pandas as pd
# %%
gmaps = googlemaps.Client(key='AIzaSyB76EhR4OqjdXHQUiTkHZC0Svx_7cPGqyU')
scenario = Scenario.objects.get(id=4)
season= scenario.season
# %%
# def seed_stadiums():
# df = pd.read_excel('referees/fixtures/wales/List_of_stadiums1700843463152.xlsx')
# Location.objects.filter(season=scenario.season).delete()
# for index, row in df.iterrows():
# name = row['Name']
# country = row['Country']
# city= row['Place']
# longitude = row['invisible_label_longitude']
# latitude = row['invisible_label_latitude']
# country_obj = Country.objects.filter(season=scenario.season,name=country).first()
# if not pd.isna(row['invisible_label_latitude']) and not pd.isna(row['invisible_label_longitude']):
# Location.objects.create(name=row['Name'],city=city,country=country_obj, latitude=row['invisible_label_latitude'], longitude=row['invisible_label_longitude'], season=season)
# else:
# geocode_result = gmaps.geocode(f"{country}+{city}+{name}")
# if len(geocode_result) > 0:
# lat = geocode_result[0]['geometry']['location']['lat']
# lng = geocode_result[0]['geometry']['location']['lng']
# Location.objects.create(name=row['Name'],city=city,country=country_obj, latitude=lat, longitude=lng, season=season)
# seed_stadiums()
# %%
# def seed_delegates():
# df = pd.read_excel('referees/fixtures/wales/Anonymised Referee Registrations for Ligalytics.xlsx')
# country = Country.objects.get(season=season,name='Wales')
# Delegate.objects.filter(season=season).delete()
# Role.objects.filter(season=season).delete()
# Role.objects.create(order=1,name='Referee', season=season)
# Role.objects.create(order=2,name='Assistant Referee 1', season=season)
# Role.objects.create(order=3,name='Assistant Referee 2', season=season)
# Role.objects.create(order=4,name='Fourth Official', season=season)
# for index, row in df.iterrows():
# name = row['Dummy ID']
# city = row['Home Town']
# category = row['Refеree category']
# cat = Category.objects.filter(name=category, season=season).first()
# if not cat:
# cat = Category.objects.create(name=category, season=season)
# location = Location.objects.filter(name=city, country=country).first()
# if not location:
# geocode_result = gmaps.geocode(f"{country}+{city}")
# if len(geocode_result) > 0:
# lat = geocode_result[0]['geometry']['location']['lat']
# lng = geocode_result[0]['geometry']['location']['lng']
# location = Location.objects.create(name=city,city=city,country=country, latitude=lat, longitude=lng, season=season, type=3)
# else:
# print("No geocode for ", city)
# # role = Role.objects.filter(season=season,name=category).first()
# # if not role:
# # role = Role.objects.create(name=category, season=season)
# delegate = Delegate.objects.create(name=name, country=country, location=location, category=cat, season=season)
# seed_delegates()
# %%
# def seed_teams_and_games():
# matches = pd.read_excel('referees/fixtures/wales/v2/Matches Test December 2023.xlsx') #.set_index('Name')
# country = Country.objects.get(season=season,name='Wales')
# Team.objects.filter(season=season).delete()
# Day.objects.filter(season=season).delete()
# Round.objects.filter(season=season).delete()
# Game.objects.filter(season=season).delete()
# RefGame.objects.filter(scenario=scenario).delete()
# Competition.objects.filter(season=season).delete()
# for index, row in matches.iterrows():
# if pd.isna(row['ID']):
# continue
# id = row['ID']
# descr = row['Match description']
# home = row['Home team']
# away = row['Away team']
# date_format = '%d.%m.%Y %H:%M:%S'
# matchdate = datetime.datetime.strptime(row['Match date (GMT)'], date_format)
# competition_name = row['Name']
# rank = row['Rank']
# round = row['Round']
# facility = row['Facility']
# place = row['Facility place name']
# if pd.isna(rank):
# rank = 0
# if len(descr.split('-')) > 4:
# print("No team for ", descr)
# continue
# competition = Competition.objects.filter(name=competition_name, season=season).first()
# if not competition:
# competition = Competition.objects.create(name=competition_name, season=season, rank=rank)
# location = Location.objects.filter(name=facility, season=season).first()
# if not location:
# print("No location for ", facility)
# geocode_result = gmaps.geocode(f"{country}+{place}+{facility}")
# if len(geocode_result) > 0:
# lat = geocode_result[0]['geometry']['location']['lat']
# lng = geocode_result[0]['geometry']['location']['lng']
# location = Location.objects.create(name=facility,city=place,country=country, latitude=lat, longitude=lng, season=season, type=1)
# else:
# print("No geocode for ", facility)
# matchdescr = descr.split(':')[0][:-1].strip()
# homeTeam = Team.objects.filter(name=matchdescr.split('-')[0], season=season).first()
# if not homeTeam:
# homeTeam = Team.objects.create(name=matchdescr.split('-')[0],shortname=home, country=Country.objects.get(season=season,name='Wales'), location=location,latitude=location.latitude,longitude=location.longitude, season=season)
# awayTeam = Team.objects.filter(name=matchdescr.split('-')[1], season=season).first()
# if not awayTeam:
# awayTeam =Team.objects.create(name=matchdescr.split('-')[1],shortname=away, country=Country.objects.get(season=season,name='Wales'), season=season)
# day = Day.objects.filter(date=matchdate.date(), day=matchdate.strftime('%Y-%m-%d'), round=1, season=season).first()
# if not day:
# day = Day.objects.create(date=matchdate.date(), day=matchdate.strftime('%Y-%m-%d'), round=1, season=season)
# timeslot = TimeSlot.objects.filter(start=matchdate.time(), season=season).first()
# if not timeslot:
# timeslot = TimeSlot.objects.create(start=matchdate.time(), end=(matchdate+timedelta(hours=2)).time(), season=season, name=matchdate.time().strftime("%H%M"))
# roundObj = Round.objects.filter(name=round,number=round, season=season).first()
# if not roundObj:
# roundObj = Round.objects.create(name=round, number=round, season=season)
# roundObj.days.add(day)
# game = RefGame.objects.filter(location=location,round=round, homeTeam=homeTeam, awayTeam=awayTeam,scenario=scenario, competition=competition).first()
# if not game:
# RefGame.objects.create(location=location,round=round, homeTeam=homeTeam, awayTeam=awayTeam, day=day,timeslot=timeslot, scenario=scenario, competition=competition)
# seed_teams_and_games()
# # %%
# def seed_requirements():
# requirements = pd.read_excel('referees/fixtures/wales/v2/Competition Ranks.xlsx',skiprows=1)
# Requirement.objects.filter(season=season).delete()
# for index, row in requirements.iterrows():
# comp = row['Competition Name']
# rank = row['Competition Rank']
# ref = row['Referee']
# ref_cats = row['Category Required to Appoint As Ref']
# assistant1 = row['Assistant Referee 1']
# assistant2 = row['Assistant Referee 2']
# assistant_cats = row['Category Required to appoint as Assistant Referee']
# official = row['Fourth Official']
# official_cats = row['Category Required to Appoint as Fourth Official']
# max_dist = row['Maximum Distance for 1 Match Official to Travel (Miles)']
# try:
# max_dist = float(max_dist)
# except:
# max_dist = 0.0
# ref_categories = []
# if not pd.isna(ref_cats):
# ref_categories = [
# Category.objects.filter(name=cat, season=season).first() for cat in ref_cats.split(';')
# ]
# assistant_categories = []
# if not pd.isna(assistant_cats):
# assistant_categories = [
# Category.objects.filter(name=cat, season=season).first() for cat in assistant_cats.split(';')
# ]
# official_categories = []
# if not pd.isna(official_cats):
# official_categories = [
# Category.objects.filter(name=cat, season=season).first() for cat in official_cats.split(';')
# ]
# competition = Competition.objects.filter(name=comp, season=season).first()
# if competition:
# competition.rank = rank
# competition.save()
# if ref_categories:
# req = Requirement.objects.create(season=season, competition=competition, role=Role.objects.get(name='Referee', season=season), max_distance=max_dist)
# for cat in ref_categories:
# req.categories.add(cat)
# if assistant_categories:
# req1 = Requirement.objects.create(season=season, competition=competition, role=Role.objects.get(name='Assistant Referee 1', season=season), max_distance=max_dist)
# req2 = Requirement.objects.create(season=season, competition=competition, role=Role.objects.get(name='Assistant Referee 2', season=season), max_distance=max_dist)
# for cat in assistant_categories:
# req1.categories.add(cat)
# req2.categories.add(cat)
# if official_categories:
# req = Requirement.objects.create(season=season, competition=competition, role=Role.objects.get(name='Fourth Official', season=season), max_distance=max_dist)
# for cat in official_categories:
# req.categories.add(cat)
# seed_requirements()
# %%
availabilities = pd.read_excel('referees/fixtures/wales/Anonymised Referee Unavailability for Ligalytics.xlsx')
# %%
availabilities['Date from'] = pd.to_datetime(availabilities['Date from'], format='%d.%m.%Y', errors='coerce')
availabilities['Date to'] = pd.to_datetime(availabilities['Date to'], format='%d.%m.%Y', errors='coerce')
# %%
# %%
DelBlocking.objects.filter(season=season).delete()
for index, row in availabilities.iterrows():
start = row['Date from']
end = row['Date to']
dummy = row['Dummy ID']
if pd.isna(end):
end = start
if start >= datetime.datetime(2023,12,1) and end <= datetime.datetime(2024,1,1):
for i in range((end-start).days+1):
day = start + datetime.timedelta(days=i)
available = (row[day.weekday()+5] == 'X')
if not available:
delegate = Delegate.objects.filter(name=f"Person {dummy}", season=season).first()
dayObj = Day.objects.filter(day=day.strftime('%Y-%m-%d'), season=season).first()
if delegate and dayObj:
DelBlocking.objects.create(delegate=delegate, day=dayObj, season=season)
print(f"Blocked {delegate} on {dayObj}")
# %%