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

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)