Merge branch 'v2' into v2-gamecard
# Conflicts: # teamsnap/urls.py # teamsnap/views.py
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
@@ -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'),
|
||||
]
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user