165 lines
6.4 KiB
Python
165 lines
6.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
|
|
from benchcoachproject.models import Profile as BenchcoachUser
|
|
|
|
|
|
def update_object_from_teamsnap(
|
|
TeamsnapApiObject: teamsnap.teamsnap.api.ApiObject,
|
|
TeamsnapDbModelClass: teamsnap.models.TeamsnapBaseModel,
|
|
TeamsnapClient: teamsnap.teamsnap.api.TeamSnap,
|
|
teamsnap_search_kwargs: dict,
|
|
fetching_keys: List[tuple] = ['id'],
|
|
default_keys: List[tuple] = ['name'],
|
|
related_objects: List[tuple] = []
|
|
):
|
|
|
|
"""
|
|
Import or Update database objects from TeamSnap API. Currently this depends on being run in a particular order when the database is empty.
|
|
|
|
additional_fetching_keys (key,) or (api_key, db_field_name) or (api_key, db_field_name, callable)
|
|
Additional kwargs used to fetch an object from the database. ('id', 'teamsnap_id') are already included
|
|
Callable will be run with the retrieved value as an argument. Example uses for this callable are to sanitize the value
|
|
such as for a date, or to retrieve another database object
|
|
|
|
additional_default_keys
|
|
Additional Keys used to update the object (key,) or (api_key, db_field_name) or (api_key, db_field_name, callable)
|
|
('name',) is already included
|
|
Callable will be run with the retrieved value as an argument. Example uses for this callable are to sanitize the value
|
|
such as for a date, or to retrieve another database object
|
|
|
|
:rtype: object
|
|
"""
|
|
api_response = TeamsnapApiObject.search(client=TeamsnapClient, **teamsnap_search_kwargs)
|
|
|
|
# This routine allows, for convenience, simplers tuples in which the additional detail is not needed
|
|
# for example [('key', 'key', None)] can be passed as ['key'] if the TeamsnapApi key is the same as the TeamsnapDb field/key
|
|
# and doesn't need to be sanitized
|
|
for d in [fetching_keys, fetching_keys, default_keys]:
|
|
for i, key in enumerate(d):
|
|
if isinstance(key, tuple):
|
|
if len(key) == 1:
|
|
d[i] = (key[0], key[0], None)
|
|
if len(key) == 2:
|
|
d[i] = (key[0], key[1], None)
|
|
elif isinstance(key, str):
|
|
d[i] = (key, key, None)
|
|
|
|
r = []
|
|
for related_object in related_objects:
|
|
pass
|
|
|
|
for data in [items.data for items in api_response]:
|
|
kwargs, defaults = {}, {}
|
|
for api_key, db_field_name, callable_function in fetching_keys:
|
|
if api_key in data.keys():
|
|
kwargs[db_field_name] = callable_function(data[api_key]) if callable_function else data[api_key]
|
|
for api_key, db_field_name, callable_function in default_keys:
|
|
if api_key in data.keys():
|
|
defaults[db_field_name] = callable_function(data[api_key]) if callable_function else data[api_key]
|
|
defaults ={k:v for k,v in defaults.items() if v is not None}
|
|
obj, created = TeamsnapDbModelClass.objects.update_or_create(**kwargs, defaults=defaults)
|
|
r.append((obj,created))
|
|
return r
|
|
|
|
def update_locations (client, **kwargs):
|
|
return update_object_from_teamsnap(
|
|
teamsnap.teamsnap.api.Location,
|
|
Location,
|
|
TeamsnapClient=client,
|
|
teamsnap_search_kwargs=kwargs,
|
|
default_keys=[
|
|
'name', 'created_at', 'updated_at',
|
|
('team_id', 'managed_by_team_id')
|
|
]
|
|
)
|
|
|
|
def update_teams (client, **kwargs):
|
|
teams = update_object_from_teamsnap(
|
|
teamsnap.teamsnap.api.Team,
|
|
Team,
|
|
TeamsnapClient=client,
|
|
teamsnap_search_kwargs=kwargs,
|
|
default_keys=[
|
|
'name', 'created_at', 'updated_at'
|
|
],
|
|
related_objects = [
|
|
('team_id', 'managed_by_team_id')
|
|
]
|
|
)
|
|
opponents = update_object_from_teamsnap(
|
|
teamsnap.teamsnap.api.Opponent,
|
|
Opponent,
|
|
TeamsnapClient=client,
|
|
teamsnap_search_kwargs=kwargs,
|
|
default_keys= [
|
|
'name', 'created_at', 'updated_at',
|
|
('team_id', 'managed_by_team_id')
|
|
]
|
|
)
|
|
return teams + opponents
|
|
|
|
def update_members (client, **kwargs):
|
|
return update_object_from_teamsnap(
|
|
TeamsnapApiObject=teamsnap.teamsnap.api.Member,
|
|
TeamsnapDbModelClass=Member,
|
|
TeamsnapClient=client,
|
|
teamsnap_search_kwargs=kwargs,
|
|
default_keys=['first_name','last_name','jersey_number','is_non_player', 'created_at', 'updated_at',
|
|
('team_id', 'managed_by_team_id'),
|
|
]
|
|
)
|
|
pass
|
|
|
|
def update_availabilities(client, **kwargs):
|
|
return update_object_from_teamsnap(
|
|
TeamsnapApiObject=teamsnap.teamsnap.api.Availability,
|
|
TeamsnapDbModelClass=Availability,
|
|
TeamsnapClient=client,
|
|
teamsnap_search_kwargs=kwargs,
|
|
default_keys=[ 'status_code',
|
|
'member_id',
|
|
'event_id',
|
|
'created_at',
|
|
'updated_at',
|
|
('team_id', 'managed_by_team_id')
|
|
]
|
|
)
|
|
|
|
def update_events(client, **kwargs):
|
|
return update_object_from_teamsnap(
|
|
TeamsnapApiObject=teamsnap.teamsnap.api.Event,
|
|
TeamsnapDbModelClass=Event,
|
|
TeamsnapClient=client,
|
|
teamsnap_search_kwargs=kwargs,
|
|
default_keys=['formatted_title','label','points_for_opponent','points_for_team','is_game','opponent_id','location_id',
|
|
'start_date', 'created_at', 'updated_at', 'game_type',
|
|
('team_id', 'managed_by_team_id')
|
|
]
|
|
)
|
|
|
|
def update_users(client, **kwargs):
|
|
return update_object_from_teamsnap(
|
|
TeamsnapApiObject=teamsnap.teamsnap.api.User,
|
|
TeamsnapDbModelClass=User,
|
|
TeamsnapClient=client,
|
|
teamsnap_search_kwargs=kwargs,
|
|
default_keys=['first_name', 'last_name', 'email', 'created_at', 'updated_at',]
|
|
)
|
|
|
|
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)
|
|
# update_users(CLIENT, id=USER_ID)
|
|
update_teams(CLIENT, team_id=TEAM_ID) |