From 05232c7a313ee6bb5287b5c877a7f379739f8148 Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 21 Nov 2021 12:28:47 -0600 Subject: [PATCH] initial commit --- .../0007_alter_positioning_position.py | 18 ++++ teamsnap/admin.py | 5 +- .../migrations/0003_auto_20211121_1540.py | 60 +++++++++++++ .../migrations/0004_remove_member_name.py | 17 ++++ teamsnap/migrations/0005_availability.py | 30 +++++++ .../0006_alter_availability_status_code.py | 18 ++++ .../migrations/0007_auto_20211121_1628.py | 24 +++++ .../0008_alter_availability_options.py | 17 ++++ .../migrations/0009_auto_20211121_1757.py | 23 +++++ teamsnap/migrations/0010_event_is_game.py | 19 ++++ teamsnap/models.py | 88 +++++++++++++++++-- teamsnap/teamsnap/api.py | 3 + teamsnap/templates/teamsnap/event_list.html | 8 +- teamsnap/urls.py | 4 +- teamsnap/views.py | 26 +++++- 15 files changed, 344 insertions(+), 16 deletions(-) create mode 100644 lineups/migrations/0007_alter_positioning_position.py create mode 100644 teamsnap/migrations/0003_auto_20211121_1540.py create mode 100644 teamsnap/migrations/0004_remove_member_name.py create mode 100644 teamsnap/migrations/0005_availability.py create mode 100644 teamsnap/migrations/0006_alter_availability_status_code.py create mode 100644 teamsnap/migrations/0007_auto_20211121_1628.py create mode 100644 teamsnap/migrations/0008_alter_availability_options.py create mode 100644 teamsnap/migrations/0009_auto_20211121_1757.py create mode 100644 teamsnap/migrations/0010_event_is_game.py diff --git a/lineups/migrations/0007_alter_positioning_position.py b/lineups/migrations/0007_alter_positioning_position.py new file mode 100644 index 0000000..08c686c --- /dev/null +++ b/lineups/migrations/0007_alter_positioning_position.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-11-21 16:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lineups', '0006_alter_positioning_order'), + ] + + operations = [ + migrations.AlterField( + model_name='positioning', + name='position', + field=models.CharField(blank=True, choices=[('EH', 'EH'), ('P', 'P'), ('C', 'C'), ('1B', '1B'), ('2B', '2B'), ('3B', '3B'), ('SS', 'SS'), ('LF', 'LF'), ('CF', 'CF'), ('RF', 'RF'), ('DH', 'DH')], default=None, max_length=2, null=True), + ), + ] diff --git a/teamsnap/admin.py b/teamsnap/admin.py index d73b133..b5e2280 100644 --- a/teamsnap/admin.py +++ b/teamsnap/admin.py @@ -1,9 +1,10 @@ from django.contrib import admin -from .models import User, Team, Location, Event, Member +from .models import User, Team, Location, Event, Member, Availability # Register your models here. admin.site.register(User) admin.site.register(Team) admin.site.register(Event) admin.site.register(Location) -admin.site.register(Member) \ No newline at end of file +admin.site.register(Member) +admin.site.register(Availability) \ No newline at end of file diff --git a/teamsnap/migrations/0003_auto_20211121_1540.py b/teamsnap/migrations/0003_auto_20211121_1540.py new file mode 100644 index 0000000..2b78008 --- /dev/null +++ b/teamsnap/migrations/0003_auto_20211121_1540.py @@ -0,0 +1,60 @@ +# Generated by Django 3.2.6 on 2021-11-21 15:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0002_auto_20211121_0035'), + ] + + operations = [ + migrations.RenameField( + model_name='event', + old_name='event', + new_name='bencoach_event', + ), + migrations.RenameField( + model_name='location', + old_name='venue', + new_name='bencoach_venue', + ), + migrations.RenameField( + model_name='member', + old_name='player', + new_name='bencoach_player', + ), + migrations.RenameField( + model_name='team', + old_name='team', + new_name='bencoach_team', + ), + migrations.AddField( + model_name='member', + name='first_name', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='member', + name='is_non_player', + field=models.BooleanField(default=False), + preserve_default=False, + ), + migrations.AddField( + model_name='member', + name='jersey_number', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='member', + name='last_name', + field=models.CharField(max_length=50, null=True), + ), + migrations.AddField( + model_name='member', + name='team', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.team'), + ), + ] diff --git a/teamsnap/migrations/0004_remove_member_name.py b/teamsnap/migrations/0004_remove_member_name.py new file mode 100644 index 0000000..19dff06 --- /dev/null +++ b/teamsnap/migrations/0004_remove_member_name.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.6 on 2021-11-21 15:44 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0003_auto_20211121_1540'), + ] + + operations = [ + migrations.RemoveField( + model_name='member', + name='name', + ), + ] diff --git a/teamsnap/migrations/0005_availability.py b/teamsnap/migrations/0005_availability.py new file mode 100644 index 0000000..02e08c5 --- /dev/null +++ b/teamsnap/migrations/0005_availability.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.6 on 2021-11-21 16:11 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('lineups', '0007_alter_positioning_position'), + ('teamsnap', '0004_remove_member_name'), + ] + + operations = [ + migrations.CreateModel( + name='Availability', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('teamsnap_id', models.CharField(max_length=10, unique=True)), + ('status_code', models.SmallIntegerField(null=True)), + ('benchcoach_availability', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='lineups.availability')), + ('event', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.event')), + ('member', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.member')), + ('team', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.team')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/teamsnap/migrations/0006_alter_availability_status_code.py b/teamsnap/migrations/0006_alter_availability_status_code.py new file mode 100644 index 0000000..24aeb64 --- /dev/null +++ b/teamsnap/migrations/0006_alter_availability_status_code.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-11-21 16:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0005_availability'), + ] + + operations = [ + migrations.AlterField( + model_name='availability', + name='status_code', + field=models.SmallIntegerField(choices=[(1, 'Yes'), (0, 'No'), (2, 'Maybe'), (None, 'Unknown')], default=None, null=True), + ), + ] diff --git a/teamsnap/migrations/0007_auto_20211121_1628.py b/teamsnap/migrations/0007_auto_20211121_1628.py new file mode 100644 index 0000000..638c677 --- /dev/null +++ b/teamsnap/migrations/0007_auto_20211121_1628.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.6 on 2021-11-21 16:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0006_alter_availability_status_code'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='team', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.team'), + ), + migrations.AlterField( + model_name='event', + name='opponent', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opponent', to='teamsnap.team'), + ), + ] diff --git a/teamsnap/migrations/0008_alter_availability_options.py b/teamsnap/migrations/0008_alter_availability_options.py new file mode 100644 index 0000000..a9e2671 --- /dev/null +++ b/teamsnap/migrations/0008_alter_availability_options.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.6 on 2021-11-21 16:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0007_auto_20211121_1628'), + ] + + operations = [ + migrations.AlterModelOptions( + name='availability', + options={'verbose_name_plural': 'availabilities'}, + ), + ] diff --git a/teamsnap/migrations/0009_auto_20211121_1757.py b/teamsnap/migrations/0009_auto_20211121_1757.py new file mode 100644 index 0000000..6b49c38 --- /dev/null +++ b/teamsnap/migrations/0009_auto_20211121_1757.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.6 on 2021-11-21 17:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0008_alter_availability_options'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='points_for_opponent', + field=models.PositiveSmallIntegerField(null=True), + ), + migrations.AddField( + model_name='event', + name='points_for_team', + field=models.PositiveSmallIntegerField(null=True), + ), + ] diff --git a/teamsnap/migrations/0010_event_is_game.py b/teamsnap/migrations/0010_event_is_game.py new file mode 100644 index 0000000..a7fde38 --- /dev/null +++ b/teamsnap/migrations/0010_event_is_game.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.6 on 2021-11-21 18:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0009_auto_20211121_1757'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='is_game', + field=models.BooleanField(default=False), + preserve_default=False, + ), + ] diff --git a/teamsnap/models.py b/teamsnap/models.py index 3d960ec..45cb086 100644 --- a/teamsnap/models.py +++ b/teamsnap/models.py @@ -1,4 +1,6 @@ from django.db import models + +import lineups.models import teams.models import venues.models import players.models @@ -11,23 +13,97 @@ class TeamsnapBaseModel(models.Model): class Meta: abstract = True + def __str__(self): + return f"{self.name} ({self.teamsnap_id})" + class User(TeamsnapBaseModel): access_token = models.CharField(max_length = 50) name = None + def __str__(self): + return f"{self.teamsnap_id}" + class Team(TeamsnapBaseModel): - team = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE) + bencoach_team = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE) + + @property + def view_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/team/view/{self.teamsnap_id}" + + @property + def edit_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/team/edit/{self.teamsnap_id}" class Location(TeamsnapBaseModel): - venue = models.ForeignKey(venues.models.Venue, null=True, on_delete=models.CASCADE) + bencoach_venue = models.ForeignKey(venues.models.Venue, null=True, on_delete=models.CASCADE) + + @property + def view_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/location/view/{self.teamsnap_id}" + + @property + def edit_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/location/edit/{self.teamsnap_id}" class Member(TeamsnapBaseModel): - player = models.ForeignKey(players.models.Player, null=True, on_delete=models.CASCADE) + name = None + bencoach_player = models.ForeignKey(players.models.Player, null=True, on_delete=models.CASCADE) + team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE) + first_name = models.CharField(max_length = 50, null=True) + last_name = models.CharField(max_length = 50, null=True) + jersey_number = models.IntegerField(null=True) + is_non_player = models.BooleanField() + + def __str__(self): + return f"{self.last_name}, {self.first_name} ({self.teamsnap_id})" + + @property + def view_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/player/{self.teamsnap_id}" + + @property + def edit_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/edit/{self.teamsnap_id}" class Event(TeamsnapBaseModel): - event = models.ForeignKey(events.models.Event, null=True, on_delete=models.CASCADE) + bencoach_event = models.ForeignKey(events.models.Event, null=True, on_delete=models.CASCADE) label = models.CharField(max_length = 50, null=True) start_date = models.DateTimeField(null=True) - opponent = models.ForeignKey(Team, null=True, on_delete=models.CASCADE) + opponent = models.ForeignKey(Team, null=True, on_delete=models.CASCADE, related_name="opponent") + team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE) location = models.ForeignKey(Location, null=True, on_delete=models.CASCADE) - formatted_title = models.CharField(max_length = 50, null=True) \ No newline at end of file + formatted_title = models.CharField(max_length = 50, null=True) + points_for_opponent = models.PositiveSmallIntegerField(null=True) + points_for_team = models.PositiveSmallIntegerField(null=True) + is_game = models.BooleanField() + + @property + def view_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/view_game/{self.teamsnap_id}" + + @property + def edit_url(self): + return f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/edit_game/{self.teamsnap_id}" + + def __str__(self): + return f"{self.formatted_title} ({self.teamsnap_id})" + +class Availability(TeamsnapBaseModel): + status_codes = [ + (1, 'Yes'), + (0, 'No'), + (2, 'Maybe'), + (None, 'Unknown') + ] + name = None + team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE) + event = models.ForeignKey(Event, null=True, on_delete=models.CASCADE) + member = models.ForeignKey(Member, null=True, on_delete=models.CASCADE) + benchcoach_availability = models.ForeignKey(lineups.models.Availability, null=True, on_delete=models.CASCADE) + status_code = models.SmallIntegerField(null=True, choices=status_codes, default=None) + + def __str__(self): + return f"{self.member} - {self.event} ({self.teamsnap_id})" + + class Meta: + verbose_name_plural = "availabilities" \ No newline at end of file diff --git a/teamsnap/teamsnap/api.py b/teamsnap/teamsnap/api.py index 1eaa44f..2386993 100644 --- a/teamsnap/teamsnap/api.py +++ b/teamsnap/teamsnap/api.py @@ -46,6 +46,9 @@ class Location (ApiObject): class Opponent (ApiObject): rel = "opponents" +class EventLineupEntry (ApiObject): + rel = "event_lineup_entries" + class TeamSnap(APIClient): base_url = 'https://api.teamsnap.com/v3' diff --git a/teamsnap/templates/teamsnap/event_list.html b/teamsnap/templates/teamsnap/event_list.html index 3da4c94..c973204 100644 --- a/teamsnap/templates/teamsnap/event_list.html +++ b/teamsnap/templates/teamsnap/event_list.html @@ -4,10 +4,10 @@ {% block content %}

{{ title }}

-
    +{#
      #} {% for item in object_list %} -
    1. - {{ item.formatted_title }} +
        + {{ item.formatted_title }} {{ item.subtitle }} {# {% if item.body %}#} {#
        {{ item.body }}#} @@ -17,7 +17,7 @@ {% for button in item.buttons %} {{ button.label }} {% endfor %} - +
      {% endfor %}
    {% endblock %} \ No newline at end of file diff --git a/teamsnap/urls.py b/teamsnap/urls.py index fdfa498..a8e65a1 100644 --- a/teamsnap/urls.py +++ b/teamsnap/urls.py @@ -1,9 +1,11 @@ from django.contrib import admin from django.urls import path, include +from functools import partial from . import views urlpatterns = [ - path('events', views.EventsListView.as_view(), name="teamsnap events list") + path('events', views.EventsListView.as_view(), name="teamsnap list events"), + path('edit/event/', views.edit_event, name='teamsnap edit event') ] \ No newline at end of file diff --git a/teamsnap/views.py b/teamsnap/views.py index 01b55d6..e4e3da4 100644 --- a/teamsnap/views.py +++ b/teamsnap/views.py @@ -1,12 +1,32 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect # from .teamsnap.api import TeamSnap, Team, Event, Availability from .models import User, Member, Team, Event, Location from django.views.generic.list import ListView +from lib.views import BenchcoachListView +def edit_event(request, id): + event = Event.objects.get(id = id) + return redirect(event.edit_url) -class EventsListView(ListView): - model = Event +class EventsListView(BenchcoachListView): + Model = Event + edit_url = 'teamsnap edit event' + list_url = 'teamsnap list events' + page_title = "TeamSnap Events" + title_strf = '{item.formatted_title}' + body_strf = "{item.start_date:%a, %b %-d, %-I:%M %p},\n{item.location.name}" + + # def get_context_data(self): + # context = super().get_context_data() + # for item in context['items']: + # item['buttons'].append( + # { + # 'label': 'Edit Lineup', + # 'href': reverse('edit lineup', args=[item['id']]) + # } + # ) + # return context class TeamListView(ListView): model = Team