Files
benchcoach-django/teamsnap/utils/import_teamsnap.py

218 lines
8.9 KiB
Python

import os
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "benchcoachproject.settings")
os.environ["DJANGO_SETTINGS_MODULE"] = "benchcoachproject.settings"
import django
django.setup()
from teamsnap.teamsnap.api import TeamSnap
import teamsnap.teamsnap.api
from teamsnap.models import User, Member, Team, Event, Location, Availability, Opponent, TeamsnapBaseModel
from typing import List
from benchcoachproject.models import Profile as BenchcoachUser
import benchcoach.models
from django.db import models
import pytz
def update_teamsnap_object(d, teamsnap_object: TeamsnapBaseModel, benchcoach_model: models.Model ,create_benchcoach_object: bool = True, create_related: bool = False):
''' Function to update from a teamsnap object to Benchcoach object. This method is a simple method when there are no related objects
:param d: The information to update.
:param teamsnap_object: The teamsnap object from which to update.
:param create_benchcoach_object: If true, will create the benchcoach object if it doesn't exist
:param create_related: This is here for decoration only. It doesn't do anything.
:return: a list of tuples in the form (obj, did_create) for created or modified objects.
'''
r = []
if teamsnap_object.benchcoach_object:
#TODO I'm not sure this does anything. need to make sure.
benchcoach_object = benchcoach_model.objects.filter(id=teamsnap_object.benchcoach_object.id).first()
created = False
r.append((benchcoach_object, created))
elif not teamsnap_object.benchcoach_object and create_benchcoach_object:
benchcoach_object = benchcoach_model(**d) # create new benchcoach object
teamsnap_object.benchcoach_object = benchcoach_object
benchcoach_object.save()
teamsnap_object.save()
created = True
r.append((benchcoach_object, created))
elif not teamsnap_object.benchcoach_object:
raise benchcoach.models.Team.DoesNotExist
return r
def update_event(event: Event, create_benchcoach_object: bool = True, create_related=False):
benchcoach_model = benchcoach.models.Event
d = {
'start': event.start_date,
}
r = []
if event.team:
if event.team.benchcoach_object:
if event.game_type == "Home":
d['home_team'] = event.team.benchcoach_object
elif event.game_type == "Away":
d['away_team'] = event.team.benchcoach_object
elif not event.team.benchcoach_object and create_related:
# create team object
# update_opponent
# r.append
pass
elif not event.team.benchcoach_object:
raise benchcoach.models.Team.DoesNotExist
if event.opponent:
if event.opponent.benchcoach_object:
if event.game_type == 'Home':
d['away_team'] = event.opponent.benchcoach_object
elif event.game_type == 'Away':
d['home_team'] = event.opponent.benchcoach_object
elif not event.opponent.benchcoach_object and create_related:
# Create opponent object
# update_opponent()
# r.append
pass
elif not event.opponent.benchcoach_object:
raise benchcoach.models.Team.DoesNotExist
if event.location:
if event.location.benchcoach_object:
if event.location:
d['venue'] = event.location.benchcoach_object
elif not event.location.benchcoach_object and create_related:
# Need to account for if no loacation assigned to teamsnap object.
# create team object
# update_opponent
# r.append
pass
elif not event.location.benchcoach_object:
raise benchcoach.models.Venue.DoesNotExist
r += update_teamsnap_object(d, teamsnap_object=event, benchcoach_model=benchcoach_model, create_benchcoach_object=create_benchcoach_object)
return r
def update_opponent(opponent: Opponent, create_benchcoach_object: bool = True, create_related: bool = False):
benchcoach_model = benchcoach.models.Team
d = {
'name': opponent.name,
}
r = update_teamsnap_object(d, teamsnap_object=opponent, benchcoach_model=benchcoach_model, create_benchcoach_object= create_benchcoach_object, create_related = create_related)
return r
def update_team(teamsnap_object: Team, create_benchcoach_object: bool = True, create_related: bool = False):
benchcoach_model = benchcoach.models.Team
d = {
'name': teamsnap_object.name,
}
r = update_teamsnap_object(d, teamsnap_object=teamsnap_object, benchcoach_model=benchcoach_model, create_benchcoach_object=create_benchcoach_object,
create_related=create_related)
return r
def update_location(teamsnap_object: Location, create_benchcoach_object: bool = True, create_related: bool = False):
benchcoach_model = benchcoach.models.Venue
d = {
'name': teamsnap_object.name,
}
r = update_teamsnap_object(d, teamsnap_object=teamsnap_object, benchcoach_model=benchcoach_model, create_benchcoach_object=create_benchcoach_object,
create_related=create_related)
return r
def update_member(teamsnap_object: Member, create_benchcoach_object: bool = True, create_related: bool = False):
benchcoach_model = benchcoach.models.Player
d = {
'first_name': teamsnap_object.first_name,
'last_name': teamsnap_object.last_name,
'jersey_number': teamsnap_object.jersey_number,
}
r = update_teamsnap_object(d, teamsnap_object=teamsnap_object, benchcoach_model=benchcoach_model, create_benchcoach_object=create_benchcoach_object,
create_related=create_related)
return r
def update_availability(availability: Availability, create_benchcoach_object: bool = True, create_related: bool = False):
benchcoach_model = benchcoach.models.Availability
translation = {
Availability.YES: benchcoach.models.Availability.YES,
Availability.NO: benchcoach.models.Availability.NO,
Availability.MAYBE: benchcoach.models.Availability.MAYBE
}
d = {
'available': translation.get(availability.status_code, benchcoach.models.Availability.UNKNOWN),
'player': availability.member.benchcoach_object,
'event': availability.event.benchcoach_object
}
r = []
if availability.member.benchcoach_object:
d['player'] = availability.member.benchcoach_object
elif not availability.member.benchcoach_object and create_related:
r += update_member(availability.member, create_benchcoach_object = True)
d['player'] = availability.member.benchcoach_object
elif not availability.member.benchcoach_object and not create_related:
raise benchcoach.models.Availability.DoesNotExist
if availability.event.benchcoach_object:
d['event'] = availability.event.benchcoach_object
elif not availability.event.benchcoach_object and create_related:
r += update_event(availability.member, create_benchcoach_object = True)
d['event'] = availability.event.benchcoach_object
elif not availability.event.benchcoach_object and not create_related:
raise benchcoach.models.Event.DoesNotExist
r += update_teamsnap_object(d, teamsnap_object=availability, benchcoach_model=benchcoach_model, create_benchcoach_object=create_benchcoach_object,
create_related=create_related)
return r
def import_teamsnap():
user = BenchcoachUser.objects.get(id=1)
TOKEN = user.teamsnap_access_token
USER_ID = user.teamsnap_user.id
TEAM_ID = user.teamsnapsettings.managed_team.id
CLIENT = TeamSnap(token=TOKEN)
l = []
for team in Opponent.objects.filter(team_id=TEAM_ID):
l += update_opponent(team, create_benchcoach_object=True, create_related=True)
for team in Team.objects.filter(id=TEAM_ID):
l += update_team(team, create_benchcoach_object=True, create_related=True)
for location in Location.objects.filter(team_id=TEAM_ID):
l += update_location(location, create_benchcoach_object=True, create_related=True)
for member in Member.objects.filter(team_id=TEAM_ID, is_non_player=False):
l += update_member(member, create_benchcoach_object= True, create_related=True)
for event in Event.objects.filter(team_id=TEAM_ID):
l += update_event(event, create_benchcoach_object=True, create_related=True)
for availability in Availability.objects.filter(team_id=TEAM_ID):
l += update_availability(availability, create_benchcoach_object=True, create_related=True)
pass
# l += update_teams(CLIENT, team_id=TEAM_ID)
# l += update_members(CLIENT, team_id=TEAM_ID)
# l += update_locations(CLIENT, team_id=TEAM_ID)
# l += update_events(CLIENT, team_id=TEAM_ID)
# l += update_availabilities(CLIENT, team_id=TEAM_ID)
if __name__ == "__main__":
import_teamsnap()