a lot of teamsnap sync work. not entirely happy with all of it

This commit is contained in:
2021-12-21 17:18:39 -06:00
parent 33c772bd2f
commit acf90d4256
8 changed files with 739 additions and 211 deletions

View File

@@ -2,21 +2,22 @@ from django.shortcuts import render, redirect
from .teamsnap.api import Event as TsApiEvent
from .teamsnap.api import TeamSnap
from .models import User, Member, Team, Event, Location, LineupEntry
from django.views.generic.list import ListView
from .models import User, Member, Team, Event, Location, LineupEntry, Opponent, Availability
from lib.views import BenchcoachListView
from .forms import LineupEntryForm, LineupEntryFormSet, EventForm, EventFormSet
from django.forms.models import model_to_dict
from django.urls import reverse
from django.db.models import Case, When
from django.views import View
from django.http import HttpResponse
from benchcoach.models import Profile as BenchcoachUser
from events.models import Event as BenchcoachEvent
import benchcoachproject.models
import benchcoach.models
import teamsnap.teamsnap.api
import json
from django.http import JsonResponse
from .utils.import_teamsnap import update_users, update_teams, update_events, update_members, update_locations, update_availabilities
from .utils.teamsnap_object_utils import update_users, update_teams, update_events, update_members, update_locations, update_availabilities
from django.contrib import messages
from django.template.loader import render_to_string
from .utils.import_teamsnap import update_team, update_event, update_member, update_location, update_opponent, update_availability, update_teamsnap_object
def queryset_from_ids(Model, id_list):
#https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order
@@ -77,13 +78,13 @@ class LocationListView(BenchcoachListView):
page_title = "TeamSnap Locations"
def update_from_teamsnap_event(request):
TOKEN = BenchcoachUser.objects.get(id=1).teamsnap_access_token
TOKEN = benchcoachproject.models.User.objects.get(id=1).teamsnap_access_token
CLIENT = TeamSnap(token=TOKEN)
teamsnap_event_id=request.POST.get('teamsnap event')
benchcoach_event_id=request.POST.get('teamsnap event')
if teamsnap_event_id:
benchcoach_event = BenchcoachEvent.objects.get(id=benchcoach_event_id)
teamsnap_object = Event.objects.get(id=teamsnap_event_id)
benchcoach_event = benchcoach.models.Event.objects.get(id=benchcoach_event_id)
teamsnap_object = benchcoach.models.Event.objects.get(id=teamsnap_event_id)
teamsnap_id = teamsnap_object.teamsnap_id
teamsnap_response = TsApiEvent.search(client=CLIENT, id=teamsnap_id)
if teamsnap_response[0]:
@@ -93,20 +94,85 @@ def update_from_teamsnap_event(request):
return HttpResponse(f'Success, {data}')
def sync_teamsnap(request):
def sync_with_teamsnap_api(request):
'''
This sync the internal TeamSnap Database with the TeamSnap API
'''
TOKEN = request.user.profile.teamsnap_access_token
USER_ID = request.user.profile.teamsnap_user.id
TEAM_ID = request.user.profile.teamsnapsettings.managed_team.id
CLIENT = TeamSnap(token=TOKEN)
l = []
l += update_users(CLIENT, id=USER_ID)
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)
return JsonResponse({'number of objects updated':len(l)})
r = {}
for Obj in [User]:
r[Obj.__name__] = []
a = Obj.ApiObject.search(CLIENT, id=USER_ID)
for _a in a:
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
r[Obj.__name__].append((obj, created))
for Obj in [Event, Availability, Location, Member, Opponent, Team]:
r[Obj.__name__] = []
a = Obj.ApiObject.search(CLIENT, team_id=TEAM_ID)
for _a in a:
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
r[Obj.__name__].append((obj, created))
for object_name, results in r.items():
if len(r) == 0:
messages.error(request, f"Error! No {object_name} objects created or updated")
else:
result = [created for obj, created in results]
messages.success(request, f"Success! {sum(result)} {object_name} objects created, {len(result)-sum(result)} {object_name} objects updated.")
data = {
'msg': render_to_string('messages.html', {}, request),
}
return JsonResponse(data)
def sync_teamsnap_db(request):
'''
This syncs the internal BenchCoach Database and the TeamSnap Database
'''
TEAM_ID = request.user.profile.teamsnapsettings.managed_team.id
r={}
r['team/opponent'] = []
for team in Opponent.objects.filter(team_id=TEAM_ID):
r['team/opponent'] += update_opponent(team, create_benchcoach_object=True, create_related=True)
for team in Team.objects.filter(id=TEAM_ID):
r['team/opponent'] += update_team(team, create_benchcoach_object=True, create_related=True)
r['location'] = []
for location in Location.objects.filter(team_id=TEAM_ID):
r['team/location'] += update_location(location, create_benchcoach_object=True, create_related=True)
r['member'] = []
for member in Member.objects.filter(team_id=TEAM_ID, is_non_player=False):
r['member'] += update_member(member, create_benchcoach_object=True, create_related=True)
r['event'] = []
for event in Event.objects.filter(team_id=TEAM_ID):
r['event'] += update_event(event, create_benchcoach_object=True, create_related=True)
r['availability'] = []
for availability in Availability.objects.filter(team_id=TEAM_ID):
r['availability'] += update_availability(availability, create_benchcoach_object=True, create_related=True)
for object_name, results in r.items():
if len(r) == 0:
messages.error(request, f"Error! No {object_name} objects created or updated")
else:
result = [created for obj, created in results]
messages.success(request, f"Success! {sum(result)} {object_name} objects created, {len(result)-sum(result)} {object_name} objects updated.")
data = {
'msg': render_to_string('messages.html', {}, request),
}
return JsonResponse(data)