# %% 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}") # %%