Merge branch 'v2' into v2-gamecard

# Conflicts:
#	teamsnap/urls.py
#	teamsnap/views.py
This commit is contained in:
2022-06-09 07:41:10 -05:00
11 changed files with 152 additions and 167 deletions

View File

@@ -52,3 +52,17 @@ class LineupEntryForm(forms.Form):
LineupEntryFormset = formset_factory(
LineupEntryForm, can_delete=True, can_order=True, extra=0
)
class EventChooseForm(forms.Form):
event_id = forms.ChoiceField()
# checked = forms.BooleanField(required=False)
# def __init__(self, events, *args, **kwargs):
# super(EventChooseForm, self).__init__(*args, **kwargs)
# self.fields['foo'].choices = [e.data['id'] for e in events]
LineupEntryFormset = formset_factory(
LineupEntryForm, can_delete=True, can_order=True, extra=0
)

View File

@@ -15,11 +15,25 @@ class Migration(migrations.Migration):
operations = [
migrations.CreateModel(
name='Preferences',
name="Preferences",
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('managed_team_id', models.IntegerField()),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("managed_team_id", models.IntegerField()),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]

View File

@@ -6,10 +6,10 @@ from .views import (
PreferencesFormView,
dashboard,
edit_lineup,
multi_lineup_choose,
schedule_view,
view_event,
submit_lineup,
gamecard
view_event,
)
urlpatterns = default_urlpatterns(TeamsnapProvider)
@@ -31,15 +31,18 @@ urlpatterns += [
name="teamsnap_edit_lineup",
),
path(
'<int:team_id>/event/<int:event_id>/submit_lineup/',
"<int:team_id>/event/<int:event_id>/submit_lineup/",
submit_lineup,
name='teamsnap_submit_lineup'
name="teamsnap_submit_lineup",
),
path(
"<int:team_id>/event/<str:event_ids>/edit_lineup/",
edit_lineup,
name="teamsnap_edit_multiple_lineups",
),
path(
"<int:team_id>/multievent/choose",
multi_lineup_choose,
name="teamsnap_choose_multiple_lineups",
),
path('<int:team_id>/event/<str:event_ids>/edit_lineup/',
edit_lineup,
name='teamsnap_edit_multiple_lineups'
),
path('<int:team_id>/schedule/edit_lineup/<int:event_id>/gamecard/',
gamecard,
name='gamecard'),
]

View File

@@ -1,19 +1,25 @@
import datetime
import pyteamsnap.api
import requests
from allauth.socialaccount.providers.oauth2.views import (
OAuth2Adapter,
OAuth2CallbackView,
OAuth2LoginView,
)
from django.http import (
HttpResponse,
HttpResponseNotAllowed,
HttpResponseServerError,
JsonResponse,
)
from django.shortcuts import redirect, render
from django.views.generic.edit import FormView
from django.http import HttpResponseNotAllowed, HttpResponse, JsonResponse, HttpResponseServerError
from .forms import PreferencesForm
from .models import Preferences
from .provider import TeamsnapProvider
import pyteamsnap.api
class TeamsnapAdapter(OAuth2Adapter):
provider_id = TeamsnapProvider.id
@@ -46,6 +52,7 @@ class TeamsnapAdapter(OAuth2Adapter):
oauth2_login = OAuth2LoginView.adapter_view(TeamsnapAdapter)
oauth2_callback = OAuth2CallbackView.adapter_view(TeamsnapAdapter)
def get_teamsnap_client(request):
request.user.socialaccount_set.filter(provider="teamsnap").first()
current_teamsnap_user = request.user.socialaccount_set.filter(
@@ -58,6 +65,7 @@ def get_teamsnap_client(request):
return pyteamsnap.api.TeamSnap(token=ts_token)
class PreferencesFormView(FormView):
template_name = "preferences.html"
form_class = PreferencesForm
@@ -190,8 +198,6 @@ def view_event(request, event_id, team_id=None):
def edit_lineup(request, event_ids, team_id):
import re
from teamsnap.forms import LineupEntryFormset
from pyteamsnap.api import (
Availability,
AvailabilitySummary,
@@ -199,9 +205,10 @@ def edit_lineup(request, event_ids, team_id):
EventLineup,
EventLineupEntry,
Member,
TeamSnap,
)
from teamsnap.forms import LineupEntryFormset
client = get_teamsnap_client(request)
event_ids = str(event_ids).split(",")
@@ -231,28 +238,34 @@ def edit_lineup(request, event_ids, team_id):
for lineup_entry in ts_lineup_entries:
members.append(
{
"member": getattr(ts_member_lookup[lineup_entry.data['member_id']],'data'),
"member": getattr(
ts_member_lookup[lineup_entry.data["member_id"]], "data"
),
"availability": getattr(
ts_availability_lookup.get(lineup_entry.data['member_id'], {}), "data", {}
),
"lineup_entry": getattr(
lineup_entry, "data", {}
ts_availability_lookup.get(lineup_entry.data["member_id"], {}),
"data",
{},
),
"lineup_entry": getattr(lineup_entry, "data", {}),
}
)
in_lineup_already = [m['member'] for m in members]
in_lineup_already = [m["member"] for m in members]
for member in ts_members:
if not member.data in in_lineup_already:
if member.data not in in_lineup_already:
members.append(
{
"member": getattr(member, "data"),
"availability": getattr(
ts_availability_lookup.get(member.data["id"], {}), "data", {}
ts_availability_lookup.get(member.data["id"], {}),
"data",
{},
),
"lineup_entry": getattr(
ts_lineup_entries_lookup.get(member.data["id"], {}), "data", {}
ts_lineup_entries_lookup.get(member.data["id"], {}),
"data",
{},
),
}
)
@@ -346,9 +359,7 @@ def edit_lineup(request, event_ids, team_id):
}
)
return render(
request, "lineup/multiple_edit.html", context={"contexts": contexts}
)
return render(request, "lineup/multiple_edit.html", context={"contexts": contexts})
def dashboard(request, team_id=None):
@@ -389,14 +400,14 @@ def dashboard(request, team_id=None):
def submit_lineup(request, team_id, event_id):
from pyteamsnap.api import Event, EventLineup, EventLineupEntry
from teamsnap.forms import LineupEntryFormset
from pyteamsnap.api import EventLineup, TeamSnap, EventLineupEntry, Event
client = get_teamsnap_client(request)
ts_event = Event.get(client,event_id)
ts_event = Event.get(client, event_id)
ts_lineup = EventLineup.search(client, event_id=event_id)
event_lineup_id = ts_lineup[0].data['id']
event_lineup_id = ts_lineup[0].data["id"]
if request.GET:
return HttpResponseNotAllowed()
if request.POST:
@@ -405,12 +416,14 @@ def submit_lineup(request, team_id, event_id):
r = []
for form in formset:
data = form.cleaned_data
if data.get('event_lineup_entry_id'):
event_lineup_entry = EventLineupEntry.get(client, id=data.get('event_lineup_entry_id'))
if data.get('position_only'):
data['label'] = data['label'] + ' [PO]'
if data.get("event_lineup_entry_id"):
event_lineup_entry = EventLineupEntry.get(
client, id=data.get("event_lineup_entry_id")
)
if data.get("position_only"):
data["label"] = data["label"] + " [PO]"
event_lineup_entry.data.update(data)
if not data.get('sequence') and not data.get('label'):
if not data.get("sequence") and not data.get("label"):
try:
r.append(event_lineup_entry.delete())
except Exception as e:
@@ -418,13 +431,14 @@ def submit_lineup(request, team_id, event_id):
else:
try:
r.append(event_lineup_entry.put())
except:
except Exception as e:
e
pass
pass
elif data.get('sequence') is not None and data.get('label'):
elif data.get("sequence") is not None and data.get("label"):
event_lineup_entry = EventLineupEntry.new(client)
if data.get('position_only'):
data['label'] = data['label'] + ' [PO]'
if data.get("position_only"):
data["label"] = data["label"] + " [PO]"
event_lineup_entry.data.update(data)
event_lineup_entry.data.update({"event_lineup_id": event_lineup_id})
try:
@@ -441,92 +455,57 @@ def submit_lineup(request, team_id, event_id):
return JsonResponse(ts_event.data)
pass
return HttpResponseServerError
def gamecard(request, team_id, event_id):
import re
from pyteamsnap.api import Event, Availability, Member, EventLineupEntry, EventLineup, \
AvailabilitySummary
def multi_lineup_choose(request, team_id):
from django.forms import formset_factory
from pyteamsnap.api import Event
from .forms import EventChooseForm
client = get_teamsnap_client(request)
ts_bulkload = client.bulk_load(team_id=team_id,
types=[Event, EventLineup, EventLineupEntry, AvailabilitySummary, Member],
event__id=event_id)
formsets_lineup = []
formsets_bench = []
formsets = []
events = []
contexts = []
ts_event = [i for i in ts_bulkload if isinstance(i, Event) and i.data['id'] == event_id][0]
ts_availabilities = Availability.search(client, event_id=ts_event.data['id'])
ts_availability_summary = \
[i for i in ts_bulkload if isinstance(i, AvailabilitySummary) and i.data['event_id'] == event_id][0]
ts_lineup_entries = EventLineupEntry.search(client, event_id=event_id)
if ts_lineup_entries:
ts_lineup = EventLineup.get(client, id=ts_lineup_entries[0].data['event_lineup_id'])
else:
ts_lineup = EventLineup.search(client, event_id=event_id)
if request.method == "POST":
ts_events = Event.search(client, team_id=team_id)
EventChooseFormset = formset_factory(EventChooseForm)
formset = EventChooseFormset(request.POST)
choices = [(e.data["id"], e.data["formatted_title"]) for e in ts_events]
ts_members = [i for i in ts_bulkload if isinstance(i, Member)]
ts_member_lookup = {m.data['id']: m for m in ts_members}
ts_availability_lookup = {m.data['member_id']: m for m in ts_availabilities}
ts_lineup_entries_lookup = {m.data['member_id']: m for m in ts_lineup_entries}
for form in formset:
form.fields["event_id"].choices = choices
members = []
for member in ts_members:
if not member.data['is_non_player']:
members.append({
"member": getattr(member, 'data'),
"availability": getattr(ts_availability_lookup.get(member.data['id'], {}), 'data', {}),
"lineup_entry": getattr(ts_lineup_entries_lookup.get(member.data['id'], {}), 'data', {})
}
)
members = sorted(members, key=lambda d: (
{
None: 3, # No Response
0: 2, # No
2: 1, # Maybe
1: 0 # Yes
}.get(d['availability'].get('status_code')),
d['member'].get('last_name'))
)
members_startinglineup = []
members_startingpositiononly = []
for member in members:
if re.search(r'([A-Z0-9]+)(?:\s+\[(.*)\])?', member['lineup_entry'].get('label', '')):
position, position_note = re.search(r'([A-Z0-9]+)(?:\s+\[(.*)\])?',
member['lineup_entry'].get('label', '')).groups()
if formset.is_valid():
event_ids = [f.cleaned_data["event_id"] for f in formset]
else:
position, position_note = ("", "")
event_ids = request.GET.get("event_ids").split(",")
EventChooseFormset = formset_factory(EventChooseForm)
formset = EventChooseFormset(request.POST)
position_only = position_note == "PO"
return redirect(
"teamsnap_edit_multiple_lineups",
team_id=team_id,
event_ids=",".join(event_ids),
)
elif not request.GET.get("num"):
return HttpResponse(500)
else:
num = int(request.GET.get("num"))
TEAM_ID = team_id
if position_only:
member['lineup_entry']['label'] = position
ts_events = Event.search(client, team_id=TEAM_ID)
ts_events = {e.data["id"]: e for e in ts_events}
if member['lineup_entry'].get('id') and not position_only:
members_startinglineup.append(member)
elif member['lineup_entry'].get('id') and position_only:
members_startingpositiononly.append(member)
EventChooseFormset = formset_factory(EventChooseForm, extra=num)
formset = EventChooseFormset()
members_startinglineup = sorted(
members_startinglineup,
key=lambda d: d.get('lineup_entry',{}).get('sequence', 100)
choices = [(id, e.data["formatted_title"]) for id, e in ts_events.items()]
for form in formset:
form.fields["event_id"].choices = choices
pass
return render(
request,
"lineup/multiple_choose.html",
context={"formset": formset, "team_id": team_id},
)
from teamsnap.forms import LineupEntryFormset, LineupEntryForm
initial = []
l=[]
# l = [(member,ts_availability_lookup.get(member['member_id'])) for member in members if not member['is_non_player']]
context={
"event": ts_event,
"members": members,
"members_startinglineup":members_startinglineup,
"members_startingpositiononly":members_startingpositiononly
}
return render(request, "lineup/gamecard.html", context=context)