198 lines
7.4 KiB
Python
198 lines
7.4 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, Type, Tuple
|
|
from benchcoachproject.models import Profile as BenchcoachUser
|
|
import benchcoach.models
|
|
from django.db import models
|
|
import pytz
|
|
|
|
def update_teamsnapbasemodel_from_teamsnap(
|
|
TeamsnapModel: Type[TeamsnapBaseModel],
|
|
teamsnap_client: teamsnap.teamsnap.api.TeamSnap,
|
|
fields: List[str]= ['created_at', 'updated_at'],
|
|
additional_fields: List[str] = [],
|
|
related_fields: List[Tuple[str, Type[TeamsnapBaseModel]]] = [],
|
|
create = True,
|
|
create_related = True,
|
|
**teamsnap_search_kwargs
|
|
):
|
|
api_response_objects = TeamsnapModel.ApiObject.search(
|
|
client=teamsnap_client, **teamsnap_search_kwargs
|
|
)
|
|
|
|
r = []
|
|
|
|
for response_object in api_response_objects:
|
|
d = {k:response_object.data[k] for k in fields}
|
|
d.update({k:response_object.data[k] for k in additional_fields})
|
|
|
|
for related_field_name, RelatedTeamSnapModel in related_fields:
|
|
related_field_name = f"{related_field_name}_id"
|
|
filter_criteria = {related_field_name:response_object.data[related_field_name]}
|
|
if related_field_name == "team_id" and RelatedTeamSnapModel.__name__ == "Team":
|
|
filter_criteria = {'id':response_object.data[related_field_name]}
|
|
related_teamsnap_object = RelatedTeamSnapModel.objects.filter(**filter_criteria).first()
|
|
if related_teamsnap_object:
|
|
d[related_field_name] = related_teamsnap_object
|
|
elif not related_teamsnap_object and create_related:
|
|
related_teamsnap_object = RelatedTeamSnapModel(**{related_field_name:response_object.data[related_field_name]})
|
|
related_teamsnap_object.save()
|
|
elif not related_teamsnap_object and not create_related:
|
|
raise RelatedTeamSnapModel.DoesNotExist
|
|
|
|
teamsnap_object = TeamsnapModel.objects.filter(id=response_object.data['id'])
|
|
if teamsnap_object:
|
|
teamsnap_object.update(**d)
|
|
created = False
|
|
r.append((teamsnap_object.first(), created))
|
|
elif not teamsnap_object and create:
|
|
new_teamsnap_object = TeamsnapModel(**d) # create new benchcoach object
|
|
new_teamsnap_object.save()
|
|
created = True
|
|
r.append((new_teamsnap_object, created))
|
|
elif not teamsnap_object and not create:
|
|
raise TeamsnapModel.DoesNotExist
|
|
|
|
return r
|
|
|
|
def update_events(
|
|
teamsnap_client: teamsnap.teamsnap.api.TeamSnap,
|
|
create: bool = True,
|
|
create_related: bool = False,
|
|
**teamsnap_search_kwargs
|
|
):
|
|
r = update_teamsnapbasemodel_from_teamsnap(
|
|
TeamsnapModel= Event,
|
|
teamsnap_client= teamsnap_client,
|
|
additional_fields=['label', 'start_date', 'formatted_title', 'points_for_opponent', 'points_for_team', 'is_game', 'game_type'],
|
|
related_fields=[('location', Location), ('opponent', Opponent), ('team', Team)],
|
|
create=create,
|
|
create_related=create_related,
|
|
**teamsnap_search_kwargs
|
|
)
|
|
|
|
return r
|
|
|
|
def update_opponents(
|
|
teamsnap_client: teamsnap.teamsnap.api.TeamSnap,
|
|
create: bool = True,
|
|
create_related: bool = False,
|
|
**teamsnap_search_kwargs
|
|
):
|
|
r = update_teamsnapbasemodel_from_teamsnap(
|
|
TeamsnapModel= Opponent,
|
|
teamsnap_client= teamsnap_client,
|
|
additional_fields=['name'],
|
|
related_fields=[('team', Team)],
|
|
create=create,
|
|
create_related=create_related,
|
|
**teamsnap_search_kwargs
|
|
)
|
|
|
|
return r
|
|
|
|
def update_teams(
|
|
teamsnap_client: teamsnap.teamsnap.api.TeamSnap,
|
|
create: bool = True,
|
|
create_related: bool = False,
|
|
**teamsnap_search_kwargs
|
|
):
|
|
r = update_teamsnapbasemodel_from_teamsnap(
|
|
TeamsnapModel=Team,
|
|
teamsnap_client=teamsnap_client,
|
|
additional_fields=['name'],
|
|
create=create,
|
|
create_related=create_related,
|
|
**teamsnap_search_kwargs
|
|
)
|
|
|
|
|
|
def update_locations(
|
|
teamsnap_client: teamsnap.teamsnap.api.TeamSnap,
|
|
create: bool = True,
|
|
create_related: bool = False,
|
|
**teamsnap_search_kwargs
|
|
):
|
|
r = update_teamsnapbasemodel_from_teamsnap(
|
|
TeamsnapModel=Location,
|
|
teamsnap_client=teamsnap_client,
|
|
additional_fields=['name'],
|
|
related_fields=[('team', Team)],
|
|
create=create,
|
|
create_related=create_related,
|
|
**teamsnap_search_kwargs
|
|
)
|
|
|
|
def update_availabilities(teamsnap_client: teamsnap.teamsnap.api.TeamSnap,
|
|
create: bool = True,
|
|
create_related: bool = False,
|
|
**teamsnap_search_kwargs
|
|
):
|
|
r = update_teamsnapbasemodel_from_teamsnap(
|
|
TeamsnapModel= Availability,
|
|
teamsnap_client= teamsnap_client,
|
|
related_fields=[('event', Event), ('member', Member), ('team', Team)],
|
|
create=create,
|
|
create_related=create_related,
|
|
**teamsnap_search_kwargs
|
|
)
|
|
|
|
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(managed_by_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(managed_by_team_id=TEAM_ID):
|
|
l += update_location(location, create_benchcoach_object=True, create_related=True)
|
|
|
|
for member in Member.objects.filter(managed_by_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(managed_by_team_id=TEAM_ID):
|
|
l += update_event(event, create_benchcoach_object=True, create_related=True)
|
|
|
|
for availability in Availability.objects.filter(managed_by_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__":
|
|
|
|
TOKEN = BenchcoachUser.objects.get(id=1).teamsnap_access_token
|
|
USER_ID = BenchcoachUser.objects.get(id=1).teamsnap_user_id
|
|
TEAM_ID = BenchcoachUser.objects.get(id=1).teamsnapsettings.managed_team_id
|
|
CLIENT = TeamSnap(token=TOKEN)
|
|
for Obj in [User]:
|
|
a = Obj.ApiObject.search(CLIENT, id=USER_ID)
|
|
for _a in a:
|
|
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
|
|
|
|
for Obj in [Event, Availability, Location, Member, Opponent, Team]:
|
|
a = Obj.ApiObject.search(CLIENT, team_id=TEAM_ID)
|
|
for _a in a:
|
|
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
|
|
# update_opponents(CLIENT, team_id=TEAM_ID)
|
|
# update_events(CLIENT, team_id=TEAM_ID) |