initial commit

This commit is contained in:
2021-11-21 12:28:47 -06:00
parent 9445940df2
commit 05232c7a31
15 changed files with 344 additions and 16 deletions

View File

@@ -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),
),
]

View File

@@ -1,5 +1,5 @@
from django.contrib import admin 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. # Register your models here.
admin.site.register(User) admin.site.register(User)
@@ -7,3 +7,4 @@ admin.site.register(Team)
admin.site.register(Event) admin.site.register(Event)
admin.site.register(Location) admin.site.register(Location)
admin.site.register(Member) admin.site.register(Member)
admin.site.register(Availability)

View File

@@ -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'),
),
]

View File

@@ -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',
),
]

View File

@@ -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,
},
),
]

View File

@@ -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),
),
]

View File

@@ -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'),
),
]

View File

@@ -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'},
),
]

View File

@@ -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),
),
]

View File

@@ -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,
),
]

View File

@@ -1,4 +1,6 @@
from django.db import models from django.db import models
import lineups.models
import teams.models import teams.models
import venues.models import venues.models
import players.models import players.models
@@ -11,23 +13,97 @@ class TeamsnapBaseModel(models.Model):
class Meta: class Meta:
abstract = True abstract = True
def __str__(self):
return f"{self.name} ({self.teamsnap_id})"
class User(TeamsnapBaseModel): class User(TeamsnapBaseModel):
access_token = models.CharField(max_length = 50) access_token = models.CharField(max_length = 50)
name = None name = None
def __str__(self):
return f"{self.teamsnap_id}"
class Team(TeamsnapBaseModel): 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): 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): 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): 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) label = models.CharField(max_length = 50, null=True)
start_date = models.DateTimeField(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) location = models.ForeignKey(Location, null=True, on_delete=models.CASCADE)
formatted_title = models.CharField(max_length = 50, null=True) 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"

View File

@@ -46,6 +46,9 @@ class Location (ApiObject):
class Opponent (ApiObject): class Opponent (ApiObject):
rel = "opponents" rel = "opponents"
class EventLineupEntry (ApiObject):
rel = "event_lineup_entries"
class TeamSnap(APIClient): class TeamSnap(APIClient):
base_url = 'https://api.teamsnap.com/v3' base_url = 'https://api.teamsnap.com/v3'

View File

@@ -4,10 +4,10 @@
{% block content %} {% block content %}
<h1>{{ title }}</h1> <h1>{{ title }}</h1>
<ol class="list-group"> {#<ol class="list-group">#}
{% for item in object_list %} {% for item in object_list %}
<li class="list-group-item"> <ul class="card">
<span class="fs-5 fw-bold">{{ item.formatted_title }}</span> <span class="card-title">{{ item.formatted_title }}</span>
<span class="fs-6">{{ item.subtitle }}</span> <span class="fs-6">{{ item.subtitle }}</span>
{# {% if item.body %}#} {# {% if item.body %}#}
{# <br><span class="fs-6">{{ item.body }}</span>#} {# <br><span class="fs-6">{{ item.body }}</span>#}
@@ -17,7 +17,7 @@
{% for button in item.buttons %} {% for button in item.buttons %}
<a class="btn btn-primary btn-sm" href="{{ button.href }}" role="button">{{ button.label }}</a> <a class="btn btn-primary btn-sm" href="{{ button.href }}" role="button">{{ button.label }}</a>
{% endfor %} {% endfor %}
</li> </ul>
{% endfor %} {% endfor %}
</ol> </ol>
{% endblock %} {% endblock %}

View File

@@ -1,9 +1,11 @@
from django.contrib import admin from django.contrib import admin
from django.urls import path, include from django.urls import path, include
from functools import partial
from . import views from . import views
urlpatterns = [ urlpatterns = [
path('events', views.EventsListView.as_view(), name="teamsnap events list") path('events', views.EventsListView.as_view(), name="teamsnap list events"),
path('edit/event/<int:id>', views.edit_event, name='teamsnap edit event')
] ]

View File

@@ -1,12 +1,32 @@
from django.shortcuts import render from django.shortcuts import render, redirect
# from .teamsnap.api import TeamSnap, Team, Event, Availability # from .teamsnap.api import TeamSnap, Team, Event, Availability
from .models import User, Member, Team, Event, Location from .models import User, Member, Team, Event, Location
from django.views.generic.list import ListView 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): class EventsListView(BenchcoachListView):
model = Event 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): class TeamListView(ListView):
model = Team model = Team