From df210b71a2f17e2c8a231f71824766a4b2cd51da Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 10 Jun 2022 07:17:38 -0500 Subject: [PATCH 1/2] clean up merge --- config/settings/base.py | 8 +++- teamsnap/dashboard/urls.py | 3 +- teamsnap/migrations/0001_initial.py | 38 ++++++++----------- .../migrations/0004_auto_20220609_0722.py | 33 ---------------- teamsnap/urls.py | 4 +- 5 files changed, 26 insertions(+), 60 deletions(-) delete mode 100644 teamsnap/migrations/0004_auto_20220609_0722.py diff --git a/config/settings/base.py b/config/settings/base.py index 47189c3..d58ab24 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -272,5 +272,11 @@ SOCIALACCOUNT_FORMS = {"signup": "benchcoach.users.forms.UserSocialSignupForm"} # Your stuff... # ------------------------------------------------------------------------------ -INSTALLED_APPS += ["teamsnap", "instagen", "teamsnap.lineup", "teamsnap.dashboard"] +INSTALLED_APPS += [ + "teamsnap", + "instagen", + "gamecard", + "teamsnap.lineup", + "teamsnap.dashboard", +] SOCIALACCOUNT_PROVIDERS = {"teamsnap": {"SCOPE": ["read", "write"]}} diff --git a/teamsnap/dashboard/urls.py b/teamsnap/dashboard/urls.py index 22b0d55..3c97730 100644 --- a/teamsnap/dashboard/urls.py +++ b/teamsnap/dashboard/urls.py @@ -1,5 +1,6 @@ from django.urls import path -from views import dashboard + +from .views import dashboard urlpatterns = [ path("/dashboard/", dashboard, name="teamsnap_dashboard"), diff --git a/teamsnap/migrations/0001_initial.py b/teamsnap/migrations/0001_initial.py index 9a9aaea..9818a15 100644 --- a/teamsnap/migrations/0001_initial.py +++ b/teamsnap/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.13 on 2022-06-09 12:09 +# Generated by Django 3.2.13 on 2022-06-09 23:57 from django.conf import settings from django.db import migrations, models @@ -15,33 +15,27 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Team', + name='Opponent', fields=[ ('id', models.IntegerField(primary_key=True, serialize=False)), - ('logo', models.ImageField(upload_to='logos')), - ('logo_mono', models.ImageField(upload_to='logos_mono')), + ('logo', models.ImageField(blank=True, null=True, upload_to='logos')), + ('logo_mono', models.ImageField(blank=True, null=True, upload_to='logos_mono')), ], ), migrations.CreateModel( - name="Preferences", + name='Team', 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.IntegerField(primary_key=True, serialize=False)), + ('logo', models.ImageField(blank=True, null=True, upload_to='logos')), + ('logo_mono', models.ImageField(blank=True, null=True, upload_to='logos_mono')), + ], + ), + migrations.CreateModel( + 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)), ], ), ] diff --git a/teamsnap/migrations/0004_auto_20220609_0722.py b/teamsnap/migrations/0004_auto_20220609_0722.py deleted file mode 100644 index c74d7fa..0000000 --- a/teamsnap/migrations/0004_auto_20220609_0722.py +++ /dev/null @@ -1,33 +0,0 @@ -# Generated by Django 3.2.13 on 2022-06-09 12:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('teamsnap', '0003_auto_20220609_0721'), - ] - - operations = [ - migrations.AlterField( - model_name='opponent', - name='logo', - field=models.ImageField(blank=True, null=True, upload_to='logos'), - ), - migrations.AlterField( - model_name='opponent', - name='logo_mono', - field=models.ImageField(blank=True, null=True, upload_to='logos_mono'), - ), - migrations.AlterField( - model_name='team', - name='logo', - field=models.ImageField(blank=True, null=True, upload_to='logos'), - ), - migrations.AlterField( - model_name='team', - name='logo_mono', - field=models.ImageField(blank=True, null=True, upload_to='logos_mono'), - ), - ] diff --git a/teamsnap/urls.py b/teamsnap/urls.py index 3a34725..22cf9cd 100644 --- a/teamsnap/urls.py +++ b/teamsnap/urls.py @@ -2,15 +2,13 @@ from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns from django.urls import include, path from .provider import TeamsnapProvider -from .views import PreferencesFormView, dashboard, schedule_view, view_event +from .views import PreferencesFormView, schedule_view, view_event urlpatterns = default_urlpatterns(TeamsnapProvider) urlpatterns += [ path("preferences/", PreferencesFormView.as_view(), name="teamsnap_preferences"), path("/schedule/", schedule_view, name="teamsnap_schedule"), - path("/dashboard/", dashboard, name="teamsnap_dashboard"), - path("dashboard/", dashboard, name="teamsnap_dashboard"), path("schedule/", schedule_view, name="teamsnap_schedule"), path( "/schedule/view_event/", From a93d37a083e420e25a7d27c3efb6af23a3a26e7f Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 10 Jun 2022 11:44:44 -0500 Subject: [PATCH 2/2] add past and future availabilities to gamecard --- config/settings/base.py | 1 + gamecard/templates/gamecard/gamecard.html | 405 ++++++++++++---------- gamecard/views.py | 52 ++- setup.cfg | 2 +- teamsnap/dashboard/views.py | 3 +- 5 files changed, 275 insertions(+), 188 deletions(-) diff --git a/config/settings/base.py b/config/settings/base.py index d58ab24..e79480a 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -276,6 +276,7 @@ INSTALLED_APPS += [ "teamsnap", "instagen", "gamecard", + "gamechanger", "teamsnap.lineup", "teamsnap.dashboard", ] diff --git a/gamecard/templates/gamecard/gamecard.html b/gamecard/templates/gamecard/gamecard.html index 65bd032..7913e48 100644 --- a/gamecard/templates/gamecard/gamecard.html +++ b/gamecard/templates/gamecard/gamecard.html @@ -1,191 +1,240 @@ {% load static %} + - - - Title + + + Title
-
-
-
- - - - - - - -
- {{ event.data.formatted_title }} {{ event.data.start_date|date:'m/d/Y g:i A' }} - {# G#01 at Browns 05/01/2021 12:30 PM#} - {{ event.data.game_type }}
- - - - - - - - - - - - - - - - - - - {% for member in members_startinglineup %} - - - - - - - - - - - - - - - {% endfor %} - -
- - - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - X -
{{ member.lineup_entry.sequence | add:"1" }}{{ member.member.last_name }}{{ member.member.jersey_number }}{{ member.lineup_entry.label }}
- - - {% for member in members_startingpositiononly %} - - - - - - - - - - - - - - - {% endfor %} - -
{{ member.member.last_name }}{{ member.member.jersey_number }}{{ member.lineup_entry.label }}
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - {% for member in members %} - - - - - - - - - - - - - - - - - - - {% endfor %} - -
AvailableAVG/OBP/SLG:PA
{{ member.member.jersey_number }}{{ member.member.last_name }}
-
-
+
+
+
+ + + + + + + +
+ {{ event.data.formatted_title }} {{ event.data.start_date|date:'m/d/Y g:i A' }} + {# G#01 at Browns 05/01/2021 12:30 PM#} + {{ event.data.game_type }}
+ + + + + + + + + + + + + + + + + + + {% for member in members_startinglineup %} + + + + + + + + + + + + + + + {% endfor %} + +
+ + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + X +
{{ member.lineup_entry.sequence | add:"1" }}{{ member.member.last_name }}{{ member.member.jersey_number }}{{ member.lineup_entry.label }}
+ + + {% for member in members_startingpositiononly %} + + + + + + + + + + + + + + + {% endfor %} + +
{{ member.member.last_name }}{{ member.member.jersey_number }}{{ member.lineup_entry.label }}
+
-
-
-
-
-
-
-
- - - - - - - - - - + + + + + + + + + + + + + + + + + {% endfor %} + +
- {{ event.data.start_date|date:"D, F j, Y g:i A" }} -
- {{ event.data.location_name }} -
+
+
+ + + + + + + + + + + + {% for event in events_future %} + + {% endfor %} + {% for event in events_past %} + + {% endfor %} + + + + {% for member in members %} - - - -
AvailableAVG/OBP/SLG:PAPCIFOF + + {{ event.data.start_date|date:'D' }} + + + + {{ event.data.start_date|date:'D' }} + +
-
-
- -
-
- VS. -
-
- -
-
-
-
- +
{{ member.member.jersey_number }}{{ member.member.last_name }} + {% if "P" in member.member.position %} + + {% else %} + + {% endif %} + + {% if "C" in member.member.position %} + + {% else %} + + {% endif %} + + {% if "IF" in member.member.position or "1B" in member.member.position %} + + {% else %} + + {% endif %} + + {% if "OF" in member.member.position %} + + {% else %} + + {% endif %} + + {{ member.availability_future.0.data.status.0 }} + + {{ member.availability_future.1.data.status.0 }} + + {{ member.availability_future.2.data.status.0 }} + + {{ member.availability_future.3.data.status.0 }} + + {{ member.availability_past.0.data.status.0 }} + + {{ member.availability_past.1.data.status.0 }} + + {{ member.availability_past.2.data.status.0 }} + + {{ member.availability_past.3.data.status.0 }} +
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + +
+ {{ event.data.start_date|date:"D, F j, Y g:i A" }} +
+ {{ event.data.location_name }} +
+ +
+
+
+ +
+
+ VS. +
+
+ {% if ts_opponent %} + + {% endif %} +
+
+
+
+
+
diff --git a/gamecard/views.py b/gamecard/views.py index d5cc273..add918a 100644 --- a/gamecard/views.py +++ b/gamecard/views.py @@ -1,9 +1,12 @@ +# TODO Remove VCR +import vcr from django.shortcuts import render from teamsnap.models import Opponent, Team from teamsnap.utils import get_teamsnap_client +@vcr.use_cassette("gamecard/fixtures/gamecard.yaml", record_mode="new_episodes") def gamecard(request, team_id, event_id): import re @@ -20,13 +23,28 @@ def gamecard(request, team_id, event_id): ts_bulkload = client.bulk_load( team_id=team_id, types=[Event, EventLineup, EventLineupEntry, AvailabilitySummary, Member], - event__id=event_id, ) - 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_events = [e for e in ts_bulkload if isinstance(e, Event)] + ts_events.sort(key=lambda d: d.data.get("start_date")) + ts_event = [e for e in ts_events if e.data["id"] == event_id][0] + ts_events_future = ts_events[ts_events.index(ts_event) + 1 :] + ts_events_past = ts_events[: ts_events.index(ts_event)] + + ts_availabilities = Availability.search(client, team_id=team_id) + + ts_availabilities_future = list( + filter( + lambda a: a.data["event_id"] in [e.data["id"] for e in ts_events_future], + ts_availabilities, + ) + ) + ts_availabilities_past = list( + filter( + lambda a: a.data["event_id"] in [e.data["id"] for e in ts_events_past], + ts_availabilities, + ) + ) ts_lineup_entries = EventLineupEntry.search(client, event_id=event_id) @@ -41,7 +59,7 @@ def gamecard(request, team_id, event_id): 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_availability_lookup = {m.data["id"]: m for m in ts_availabilities} ts_lineup_entries_lookup = {m.data["member_id"]: m for m in ts_lineup_entries} members = [] @@ -52,11 +70,27 @@ def gamecard(request, team_id, event_id): { "member": getattr(member, "data"), "availability": getattr( - ts_availability_lookup.get(member.data["id"], {}), "data", {} + ts_availability_lookup.get( + f"{member.data['id']}-{event_id}", {} + ), + "data", + {}, ), "lineup_entry": getattr( ts_lineup_entries_lookup.get(member.data["id"], {}), "data", {} ), + "availability_future": list( + filter( + lambda a: a.data.get("member_id") == member.data["id"], + ts_availabilities_future, + ) + )[:4], + "availability_past": list( + filter( + lambda a: a.data.get("member_id") == member.data["id"], + ts_availabilities_past, + ) + )[:4], } ) @@ -100,10 +134,12 @@ def gamecard(request, team_id, event_id): context = { "event": ts_event, + "events_future": ts_events_future[:4], + "events_past": list(reversed(ts_events_past))[:4], "members": members, "members_startinglineup": members_startinglineup, "members_startingpositiononly": members_startingpositiononly, "ts_team": Team.objects.get(id=team_id), - "ts_opponent": Opponent.objects.get(id=ts_event.data["opponent_id"]), + "ts_opponent": Opponent.objects.filter(id=ts_event.data["opponent_id"]).first, } return render(request, "gamecard/gamecard.html", context=context) diff --git a/setup.cfg b/setup.cfg index 0e936ed..afe0601 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [flake8] max-line-length = 120 exclude = .tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules,venv -ignore = W503 +ignore = W503, E203 [pycodestyle] max-line-length = 120 diff --git a/teamsnap/dashboard/views.py b/teamsnap/dashboard/views.py index 2a786ac..8c6adf3 100644 --- a/teamsnap/dashboard/views.py +++ b/teamsnap/dashboard/views.py @@ -8,7 +8,8 @@ from teamsnap.views import get_teamsnap_client def dashboard(request, team_id=None): if not team_id: return redirect( - "teamsnap_dashboard", team_id=request.user.preferences.managed_team_id + "teamsnap_dashboard", + team_id=request.user.teamsnap_preferences.managed_team_id, ) from pyteamsnap.api import AvailabilitySummary, Event