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 .models import User, Team, Location, Event, Member
from .models import User, Team, Location, Event, Member, Availability
# Register your models here.
admin.site.register(User)
@@ -7,3 +7,4 @@ admin.site.register(Team)
admin.site.register(Event)
admin.site.register(Location)
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
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)
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):
rel = "opponents"
class EventLineupEntry (ApiObject):
rel = "event_lineup_entries"
class TeamSnap(APIClient):
base_url = 'https://api.teamsnap.com/v3'

View File

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

View File

@@ -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/<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 .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