separated out teamsnap update buttons
This commit is contained in:
@@ -2,16 +2,16 @@
|
|||||||
{% with events_active="active" %}
|
{% with events_active="active" %}
|
||||||
{% block page_heading %}
|
{% block page_heading %}
|
||||||
<span class="d-none d-md-block">
|
<span class="d-none d-md-block">
|
||||||
<img src="{{ event.away_team.image.url }}" height=64>
|
{% if event.away_team.image %} <img src="{{ event.away_team.image.url }}" height=64>{% endif %}
|
||||||
{{ event.away_team.name }} vs. {{ event.home_team.name }}
|
{{ event.away_team.name }} vs. {{ event.home_team.name }}
|
||||||
<img src="{{ event.home_team.image.url }}" height=64>
|
{% if event.home_team.image %}<img src="{{ event.home_team.image.url }}" height=64>{% endif %}
|
||||||
</span>
|
</span>
|
||||||
<span class="d-md-none">
|
<span class="d-md-none">
|
||||||
{% if event.home_team.name == "Hounds" %}
|
{% if event.home_team.name == "Hounds" %}
|
||||||
<img src="{{ event.away_team.image.url }}" height=32>
|
{% if event.away_team.image %} <img src="{{ event.away_team.image.url }}" height=32>{% endif %}
|
||||||
vs. {{ event.away_team }}
|
vs. {{ event.away_team }}
|
||||||
{% elif event.away_team.name == "Hounds" %}
|
{% elif event.away_team.name == "Hounds" %}
|
||||||
<img src="{{ event.home_team.image.url }}" height=32>
|
{% if event.home_team.image %}<img src="{{ event.home_team.image.url }}" height=32>{% endif %}
|
||||||
at {{ event.home_team }}
|
at {{ event.home_team }}
|
||||||
{% else %}
|
{% else %}
|
||||||
Event
|
Event
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}{% load static %}
|
||||||
{% block title %} {{ title }}{% endblock %}
|
{% block title %} {{ title }}{% endblock %}
|
||||||
{% block page_heading %}TeamSnap Info{% endblock %}
|
{% block page_heading %}TeamSnap Info{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
@@ -7,60 +7,23 @@
|
|||||||
<p><b>TeamSnap: </b>{{ teamsnap_user.email }}</p>
|
<p><b>TeamSnap: </b>{{ teamsnap_user.email }}</p>
|
||||||
<p><b>TeamSnap Managed Team: </b>{{ teamsnap_team.name }}</p>
|
<p><b>TeamSnap Managed Team: </b>{{ teamsnap_team.name }}</p>
|
||||||
|
|
||||||
<button type="button" class="btn btn-primary m-1" onclick="sync_teamsnapdb_with_teamsnapapi()">
|
|
||||||
Sync TeamSnapDB with TeamSnap.com
|
|
||||||
<div id="teamsnap-sync-spinner" class="spinner-border spinner-border-sm d-none" role="status">
|
|
||||||
<span class="visually-hidden">Loading...</span>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
<button type="button" class="btn btn-primary m-1" onclick="sync_teamsnapdb_to_benchcoachdb()">
|
|
||||||
Sync BenchCoachDB with TeamSnapDB
|
|
||||||
<div id="benchcoach-sync-spinner" class="spinner-border spinner-border-sm d-none" role="status">
|
|
||||||
<span class="visually-hidden">Loading...</span>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
{% include 'messages.html' %}
|
{% include 'messages.html' %}
|
||||||
<div id="message-area"> </div>
|
|
||||||
<script>
|
|
||||||
|
|
||||||
function sync_teamsnapdb_with_teamsnapapi(){
|
<ul class="list-group">
|
||||||
const progress_spinner = document.getElementById("teamsnap-sync-spinner")
|
{% for obj_name, obj_data in teamsnap_objects.items %}
|
||||||
const Http = new XMLHttpRequest();
|
<li class="list-group-item">
|
||||||
const url='{% url 'sync with teamsnapapi' %}';
|
<span class="fw-bold">{{ obj_name }}:</span> {{ obj_data.object_count }} objects
|
||||||
progress_spinner.classList.remove("d-none");
|
<a class="btn btn-primary btn-sm" href="{% url 'update' object_name=obj_name %}" role="button">
|
||||||
fetch(url)
|
<i class="bi bi-arrow-clockwise"></i>
|
||||||
.then((response) => {
|
TeamSnap.com
|
||||||
progress_spinner.classList.add("d-none")
|
</a>
|
||||||
return response.json();
|
<a class="btn btn-primary btn-sm" href="{% url 'send' object_name=obj_name %}" role="button">
|
||||||
})
|
<i class="bi bi-arrow-clockwise"></i>
|
||||||
.then((myJson) => {
|
BenchCoach
|
||||||
console.log(myJson)
|
</a>
|
||||||
message_area.innerHTML = myJson.msg
|
</li>
|
||||||
});
|
{% endfor %}
|
||||||
}
|
</ul>
|
||||||
|
|
||||||
function sync_teamsnapdb_to_benchcoachdb(){
|
|
||||||
console.log('hello')
|
|
||||||
const progress_spinner = document.getElementById("benchcoach-sync-spinner")
|
|
||||||
const Http = new XMLHttpRequest();
|
|
||||||
const url='{% url 'sync benchcoach' %}';
|
|
||||||
console.log(url)
|
|
||||||
progress_spinner.classList.remove("d-none");
|
|
||||||
fetch(url)
|
|
||||||
.then((response) => {
|
|
||||||
progress_spinner.classList.add("d-none")
|
|
||||||
return response.json();
|
|
||||||
})
|
|
||||||
.then((myJson) => {
|
|
||||||
console.log(myJson)
|
|
||||||
message_area.innerHTML = myJson.msg
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function clear_output_box(){
|
|
||||||
progress_spinner.classList.add('d-none')
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -13,5 +13,7 @@ urlpatterns = [
|
|||||||
path('edit/event/<int:id>', views.edit_event, name='teamsnap edit event'),
|
path('edit/event/<int:id>', views.edit_event, name='teamsnap edit event'),
|
||||||
path('sync_teamsnap_db', views.sync_teamsnapdb_with_teamsnapapi, name="sync with teamsnapapi"),
|
path('sync_teamsnap_db', views.sync_teamsnapdb_with_teamsnapapi, name="sync with teamsnapapi"),
|
||||||
path('sync_benchcoach_db', views.sync_teamsnapdb_to_benchcoachdb, name="sync benchcoach"),
|
path('sync_benchcoach_db', views.sync_teamsnapdb_to_benchcoachdb, name="sync benchcoach"),
|
||||||
|
path('update/<str:object_name>', views.update_teamsnapdb_from_teamsnapapi, name="update"),
|
||||||
|
path('send/<str:object_name>', views.send_to_benchcoach, name="send")
|
||||||
# path('import_teamsnap', views.import_teamsnap, name="import teamsnap"),
|
# path('import_teamsnap', views.import_teamsnap, name="import teamsnap"),
|
||||||
]
|
]
|
||||||
@@ -18,6 +18,9 @@ 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
|
from .utils.import_teamsnap import update_team, update_event, update_member, update_location, update_opponent, update_availability, update_teamsnap_object
|
||||||
from django.forms import modelformset_factory
|
from django.forms import modelformset_factory
|
||||||
import django.db.models
|
import django.db.models
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def queryset_from_ids(Model, id_list):
|
def queryset_from_ids(Model, id_list):
|
||||||
#https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order
|
#https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order
|
||||||
@@ -33,10 +36,16 @@ def home(request):
|
|||||||
current_benchcoach_user = request.user
|
current_benchcoach_user = request.user
|
||||||
current_teamsnap_user = request.user.profile.teamsnap_user
|
current_teamsnap_user = request.user.profile.teamsnap_user
|
||||||
current_teamsnap_team = request.user.profile.teamsnapsettings.managed_team
|
current_teamsnap_team = request.user.profile.teamsnapsettings.managed_team
|
||||||
|
teamsnap_objects = {}
|
||||||
|
for obj in [Availability, Event, LineupEntry, Location, Member, Opponent, Team, User]:
|
||||||
|
teamsnap_objects[obj.__name__.lower()] = {}
|
||||||
|
teamsnap_objects[obj.__name__.lower()]['object_count']=obj.objects.count()
|
||||||
|
|
||||||
context= {
|
context= {
|
||||||
'benchcoach_user': current_benchcoach_user,
|
'benchcoach_user': current_benchcoach_user,
|
||||||
'teamsnap_user': current_teamsnap_user,
|
'teamsnap_user': current_teamsnap_user,
|
||||||
'teamsnap_team':current_teamsnap_team
|
'teamsnap_team':current_teamsnap_team,
|
||||||
|
'teamsnap_objects': teamsnap_objects
|
||||||
}
|
}
|
||||||
return render(request, 'teamsnap/home.html', context)
|
return render(request, 'teamsnap/home.html', context)
|
||||||
|
|
||||||
@@ -78,6 +87,85 @@ class TeamsnapObjTableView(View):
|
|||||||
formset = self.Formset(queryset=qs)
|
formset = self.Formset(queryset=qs)
|
||||||
return render(request, self.template, context={'formset': formset})
|
return render(request, self.template, context={'formset': formset})
|
||||||
|
|
||||||
|
@login_required()
|
||||||
|
def update_teamsnapdb_from_teamsnapapi(request, object_name, object_id=None):
|
||||||
|
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)
|
||||||
|
|
||||||
|
Object = {
|
||||||
|
obj.__name__.lower():obj
|
||||||
|
for obj in
|
||||||
|
[Availability, Event, LineupEntry, Location, Member, Opponent, Team, User]
|
||||||
|
}.get(object_name)
|
||||||
|
|
||||||
|
r = {}
|
||||||
|
|
||||||
|
for Obj in [Object]:
|
||||||
|
r[Obj.__name__.lower()] = []
|
||||||
|
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__.lower()].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.")
|
||||||
|
|
||||||
|
return redirect('teamsnap home')
|
||||||
|
|
||||||
|
@login_required()
|
||||||
|
def send_to_benchcoach(request, object_name):
|
||||||
|
Object = {
|
||||||
|
obj.__name__.lower(): obj
|
||||||
|
for obj in
|
||||||
|
[Availability, Event, LineupEntry, Location, Member, Opponent, Team, User]
|
||||||
|
}.get(object_name)
|
||||||
|
|
||||||
|
TEAM_ID = request.user.profile.teamsnapsettings.managed_team.id
|
||||||
|
r = {}
|
||||||
|
|
||||||
|
r[object_name]=[]
|
||||||
|
|
||||||
|
if object_name == 'team':
|
||||||
|
for team in Object.objects.filter(id=TEAM_ID):
|
||||||
|
r[object_name] += update_opponent(team, create_benchcoach_object=True, create_related=True)
|
||||||
|
|
||||||
|
if object_name == 'opponent':
|
||||||
|
for team in Object.objects.filter(team_id=TEAM_ID):
|
||||||
|
r[object_name] += update_team(team, create_benchcoach_object=True, create_related=True)
|
||||||
|
|
||||||
|
if object_name == 'location':
|
||||||
|
for location in Location.objects.filter(team_id=TEAM_ID):
|
||||||
|
r[object_name] += update_location(location, create_benchcoach_object=True, create_related=True)
|
||||||
|
|
||||||
|
if object_name == 'member':
|
||||||
|
for member in Member.objects.filter(team_id=TEAM_ID, is_non_player=False):
|
||||||
|
r[object_name] += update_member(member, create_benchcoach_object=True, create_related=True)
|
||||||
|
|
||||||
|
if object_name == 'event':
|
||||||
|
for event in Event.objects.filter(team_id=TEAM_ID):
|
||||||
|
r[object_name] += update_event(event, create_benchcoach_object=True, create_related=True)
|
||||||
|
|
||||||
|
if object_name == 'availability':
|
||||||
|
for availability in Availability.objects.filter(team_id=TEAM_ID, member__is_non_player=False):
|
||||||
|
r[object_name] += 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.")
|
||||||
|
|
||||||
|
return redirect('teamsnap home')
|
||||||
|
|
||||||
def sync_teamsnapdb_with_teamsnapapi(request):
|
def sync_teamsnapdb_with_teamsnapapi(request):
|
||||||
'''
|
'''
|
||||||
This sync the internal TeamSnap Database with the TeamSnap API
|
This sync the internal TeamSnap Database with the TeamSnap API
|
||||||
@@ -96,10 +184,11 @@ def sync_teamsnapdb_with_teamsnapapi(request):
|
|||||||
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
|
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
|
||||||
r[Obj.__name__].append((obj, created))
|
r[Obj.__name__].append((obj, created))
|
||||||
|
|
||||||
for Obj in [Event, Availability, Location, Member, Opponent, Team]:
|
for Obj in [Event, Availability]:
|
||||||
r[Obj.__name__] = []
|
r[Obj.__name__] = []
|
||||||
a = Obj.ApiObject.search(CLIENT, team_id=TEAM_ID)
|
a = Obj.ApiObject.search(CLIENT, team_id=TEAM_ID)
|
||||||
for _a in a:
|
for _a in a:
|
||||||
|
print(f"importing {_a}")
|
||||||
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
|
obj, created = Obj.update_or_create_from_teamsnap_api(_a.data)
|
||||||
r[Obj.__name__].append((obj, created))
|
r[Obj.__name__].append((obj, created))
|
||||||
|
|
||||||
|
|||||||
@@ -16,23 +16,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
<span class="mx-auto"></span>
|
<span class="mx-auto"></span>
|
||||||
<span class="navbar-text"></span>
|
<span class="navbar-text"></span>
|
||||||
<ul class="navbar-nav mx-2">
|
|
||||||
<li class="nav-item dropdown">
|
|
||||||
<a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#">{{ request.user }} <img class="rounded-circle" height="24" src="{{ request.user.profile.avatar.url }}" width="24" /></a>
|
|
||||||
<div class="dropdown-menu">
|
|
||||||
{% if user.is_authenticated %}
|
|
||||||
<a href="#" onClick="document.getElementById('logoutform').submit()">
|
|
||||||
<button class="btn" type="button">Logout</button></a>
|
|
||||||
<form id="logoutform" method="POST" action="{% url 'logout_benchcoachproject' %}">
|
|
||||||
{% csrf_token %}
|
|
||||||
<input type="hidden">
|
|
||||||
</form>
|
|
||||||
{% else %}
|
|
||||||
<a href="{% url 'login_view' %}">login</a>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item"></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</nav>
|
</nav>
|
||||||
Reference in New Issue
Block a user