diff --git a/teamsnap/migrations/0019_auto_20211216_1851.py b/teamsnap/migrations/0019_auto_20211216_1851.py new file mode 100644 index 0000000..af24b49 --- /dev/null +++ b/teamsnap/migrations/0019_auto_20211216_1851.py @@ -0,0 +1,72 @@ +# Generated by Django 3.2.6 on 2021-12-16 18:51 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0004_delete_availability'), + ('teamsnap', '0018_user_managed_teams'), + ] + + operations = [ + migrations.RenameField( + model_name='availability', + old_name='team', + new_name='managed_by_team', + ), + migrations.RenameField( + model_name='event', + old_name='team', + new_name='managed_by_team', + ), + migrations.RenameField( + model_name='member', + old_name='team', + new_name='managed_by_team', + ), + migrations.RenameField( + model_name='team', + old_name='bencoach_team', + new_name='benchcoach_object', + ), + migrations.AddField( + model_name='lineupentry', + name='managed_by_team', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.team'), + ), + migrations.AddField( + model_name='location', + name='managed_by_team', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.team'), + ), + migrations.AddField( + model_name='team', + name='managed_by_team', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.team'), + ), + migrations.AlterField( + model_name='event', + name='benchcoach_object', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='teamsnap_event', to='events.event'), + ), + migrations.CreateModel( + name='Opponent', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('teamsnap_id', models.CharField(max_length=10, unique=True)), + ('name', models.CharField(max_length=50, null=True)), + ('managed_by_team', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teamsnap.team')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AlterField( + model_name='event', + name='opponent', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='opponent', to='teamsnap.opponent'), + ), + ] diff --git a/teamsnap/migrations/0020_auto_20211216_1903.py b/teamsnap/migrations/0020_auto_20211216_1903.py new file mode 100644 index 0000000..17853fd --- /dev/null +++ b/teamsnap/migrations/0020_auto_20211216_1903.py @@ -0,0 +1,41 @@ +# Generated by Django 3.2.6 on 2021-12-16 19:03 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0019_auto_20211216_1851'), + ] + + operations = [ + migrations.RemoveField( + model_name='availability', + name='teamsnap_id', + ), + migrations.RemoveField( + model_name='event', + name='teamsnap_id', + ), + migrations.RemoveField( + model_name='location', + name='teamsnap_id', + ), + migrations.RemoveField( + model_name='member', + name='teamsnap_id', + ), + migrations.RemoveField( + model_name='opponent', + name='teamsnap_id', + ), + migrations.RemoveField( + model_name='team', + name='teamsnap_id', + ), + migrations.RemoveField( + model_name='user', + name='teamsnap_id', + ), + ] diff --git a/teamsnap/migrations/0021_auto_20211216_1905.py b/teamsnap/migrations/0021_auto_20211216_1905.py new file mode 100644 index 0000000..a49bd6b --- /dev/null +++ b/teamsnap/migrations/0021_auto_20211216_1905.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.6 on 2021-12-16 19:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0020_auto_20211216_1903'), + ] + + operations = [ + migrations.AlterField( + model_name='availability', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='event', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='lineupentry', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='location', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='member', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='opponent', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='team', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='user', + name='id', + field=models.CharField(max_length=10, primary_key=True, serialize=False, unique=True), + ), + ] diff --git a/teamsnap/migrations/0022_auto_20211216_1909.py b/teamsnap/migrations/0022_auto_20211216_1909.py new file mode 100644 index 0000000..2c0c034 --- /dev/null +++ b/teamsnap/migrations/0022_auto_20211216_1909.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.6 on 2021-12-16 19:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0021_auto_20211216_1905'), + ] + + operations = [ + migrations.AlterField( + model_name='availability', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='event', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='lineupentry', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='location', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='member', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='opponent', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='team', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + migrations.AlterField( + model_name='user', + name='id', + field=models.CharField(max_length=50, primary_key=True, serialize=False, unique=True), + ), + ] diff --git a/teamsnap/migrations/0023_auto_20211216_1951.py b/teamsnap/migrations/0023_auto_20211216_1951.py new file mode 100644 index 0000000..51de447 --- /dev/null +++ b/teamsnap/migrations/0023_auto_20211216_1951.py @@ -0,0 +1,21 @@ +# Generated by Django 3.2.6 on 2021-12-16 19:51 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0022_auto_20211216_1909'), + ] + + operations = [ + migrations.RemoveField( + model_name='lineupentry', + name='teamsnap_id', + ), + migrations.RemoveField( + model_name='team', + name='managed_by_team', + ), + ] diff --git a/teamsnap/migrations/0024_auto_20211216_1703.py b/teamsnap/migrations/0024_auto_20211216_1703.py new file mode 100644 index 0000000..5bdcb94 --- /dev/null +++ b/teamsnap/migrations/0024_auto_20211216_1703.py @@ -0,0 +1,109 @@ +# Generated by Django 3.2.6 on 2021-12-16 23:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0023_auto_20211216_1951'), + ] + + operations = [ + migrations.AddField( + model_name='availability', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='availability', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='event', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='event', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='lineupentry', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='lineupentry', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='location', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='location', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='member', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='member', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='opponent', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='opponent', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='team', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='team', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='user', + name='created_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + migrations.AddField( + model_name='user', + name='updated_at', + field=models.DateTimeField(default='2000-10-31T01:30:00.000-05:00'), + preserve_default=False, + ), + ] diff --git a/teamsnap/migrations/0025_opponent_benchcoach_object.py b/teamsnap/migrations/0025_opponent_benchcoach_object.py new file mode 100644 index 0000000..15fa911 --- /dev/null +++ b/teamsnap/migrations/0025_opponent_benchcoach_object.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.6 on 2021-12-16 23:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('teams', '0001_initial'), + ('teamsnap', '0024_auto_20211216_1703'), + ] + + operations = [ + migrations.AddField( + model_name='opponent', + name='benchcoach_object', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='teams.team'), + ), + ] diff --git a/teamsnap/migrations/0026_auto_20211216_2003.py b/teamsnap/migrations/0026_auto_20211216_2003.py new file mode 100644 index 0000000..7f1017c --- /dev/null +++ b/teamsnap/migrations/0026_auto_20211216_2003.py @@ -0,0 +1,100 @@ +# Generated by Django 3.2.6 on 2021-12-17 02:03 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('teams', '0001_initial'), + ('teamsnap', '0025_opponent_benchcoach_object'), + ] + + operations = [ + migrations.AlterField( + model_name='availability', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='availability', + name='updated_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='event', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='event', + name='updated_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='lineupentry', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='lineupentry', + name='updated_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='location', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='location', + name='updated_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='member', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='member', + name='updated_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='opponent', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='opponent', + name='updated_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='team', + name='benchcoach_object', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='teamsnapteam', to='teams.team'), + ), + migrations.AlterField( + model_name='team', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='team', + name='updated_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='user', + name='created_at', + field=models.DateTimeField(null=True), + ), + migrations.AlterField( + model_name='user', + name='updated_at', + field=models.DateTimeField(null=True), + ), + ] diff --git a/teamsnap/models.py b/teamsnap/models.py index fe06ded..068adda 100644 --- a/teamsnap/models.py +++ b/teamsnap/models.py @@ -7,104 +7,114 @@ import players.models import events.models class TeamsnapBaseModel(models.Model): - teamsnap_id = models.CharField(max_length=10, unique=True) + type = None + id = models.CharField(max_length=50, unique=True, primary_key=True) name = models.CharField(max_length=50, null=True) + created_at = models.DateTimeField(null=True) + updated_at = models.DateTimeField(null=True) class Meta: abstract = True def __str__(self): - return f"TeamSnap {self.__class__.__name__} Object ({self.teamsnap_id})" + return f"TeamSnap {self.__class__.__name__} Object ({self.id})" + + @property + def api_url(self): + return "https://api.teamsnap.com/v3/{type}/{id}".format(type=self.type, id=self.id) class Team(TeamsnapBaseModel): - bencoach_team = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE) + type = 'team' + managed_by_team = None + benchcoach_object = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE,related_name="teamsnapteam") + +class User(TeamsnapBaseModel): + type = 'user' + name = None + first_name = models.CharField(max_length=50, null=True) + last_name = models.CharField(max_length = 50, null=True) + email = models.EmailField(null=True) + managed_teams = models.ManyToManyField(Team) + +class TeamsnapManagedObjectModel(TeamsnapBaseModel): + managed_by_team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE) + + class Meta: + abstract = True @property - def view_url(self): - return f"https://go.teamsnap.com/{self.team.teamsnap_id}/team/view/{self.teamsnap_id}" + def url(self, endpoint='view'): + return f"https://go.teamsnap.com/{self.managed_by_team.id}/{self.type}/{endpoint}/{self.id}" - @property - def edit_url(self): - return f"https://go.teamsnap.com/{self.team.teamsnap_id}/team/edit/{self.teamsnap_id}" +class Opponent(TeamsnapManagedObjectModel): + type = 'opponent' + benchcoach_object = models.ForeignKey(teams.models.Team, null=True, on_delete=models.CASCADE) -class Location(TeamsnapBaseModel): +class Location(TeamsnapManagedObjectModel): benchcoach_object = 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): - name = None +class Member(TeamsnapManagedObjectModel): + # url format is + # f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/player/{self.teamsnap_id}" + # f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/edit/{self.teamsnap_id}" + type = 'member' benchcoach_object = 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})" + return f"{self.last_name}, {self.first_name} ({self.id})" @property - def view_url(self): - return f"https://go.teamsnap.com/{self.team.teamsnap_id}/roster/player/{self.teamsnap_id}" + def name(self): + return f"{self.first_name} {self.last_name}" - @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(TeamsnapManagedObjectModel): + # url is + # f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/view_game/{self.teamsnap_id}" + # f"https://go.teamsnap.com/{self.team.teamsnap_id}/schedule/edit_game/{self.teamsnap_id}" + type = 'event' name = None - benchcoach_object = models.ForeignKey(events.models.Event, null=True, on_delete=models.CASCADE) + benchcoach_object = models.ForeignKey(events.models.Event, null=True, on_delete=models.CASCADE, related_name ='teamsnap_event') label = models.CharField(max_length = 50, null=True) start_date = models.DateTimeField(null=True) - opponent = models.ForeignKey(Team, null=True, on_delete=models.CASCADE, related_name="opponent") - team = models.ForeignKey(Team, null=True, on_delete=models.CASCADE) + opponent = models.ForeignKey(Opponent, null=True, on_delete=models.CASCADE, related_name="opponent") 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})" + return f"{self.formatted_title} ({self.id})" -class Availability(TeamsnapBaseModel): +class Availability(TeamsnapManagedObjectModel): + YES = 1 + NO = 0 + MAYBE = 2 + UNKNOWN = None status_codes = [ - (1, 'Yes'), - (0, 'No'), - (2, 'Maybe'), - (None, 'Unknown') + (YES, 'Yes'), + (NO, 'No'), + (MAYBE, 'Maybe'), + (UNKNOWN, '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_object = 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})" + return f"{self.member} - {self.event} ({self.id})" class Meta: verbose_name_plural = "availabilities" -class LineupEntry(TeamsnapBaseModel): +class LineupEntry(TeamsnapManagedObjectModel): name = None - teamsnap_id = models.CharField(max_length=10, unique=True, null=True, blank=True) member = models.ForeignKey(Member, on_delete=models.CASCADE) event = models.ForeignKey(Event, on_delete=models.CASCADE) positions = [ @@ -124,11 +134,4 @@ class LineupEntry(TeamsnapBaseModel): sequence = models.PositiveSmallIntegerField(default=0, null=True, blank=True) class Meta: - unique_together = ('member', 'event',) - -class User(TeamsnapBaseModel): - name = None - first_name = models.CharField(max_length=50, null=True) - last_name = models.CharField(max_length = 50, null=True) - email = models.EmailField(null=True) - managed_teams = models.ManyToManyField(Team) \ No newline at end of file + unique_together = ('member', 'event',) \ No newline at end of file diff --git a/teamsnap/teamsnap/__init__.py b/teamsnap/teamsnap/__init__.py index 31d7a75..a0d7ca1 100644 --- a/teamsnap/teamsnap/__init__.py +++ b/teamsnap/teamsnap/__init__.py @@ -1,3 +1,3 @@ -from .api import TeamSnap - -__all__ = ['TeamSnap'] \ No newline at end of file +# from .utils import TeamSnap +# +# __all__ = ['TeamSnap'] \ No newline at end of file diff --git a/teamsnap/templates/teamsnap/home.html b/teamsnap/templates/teamsnap/home.html index 9a9fe24..c284b61 100644 --- a/teamsnap/templates/teamsnap/home.html +++ b/teamsnap/templates/teamsnap/home.html @@ -6,5 +6,44 @@
BenchCoach: {{ user }} ({{ user.email }})
TeamSnap: {{ teamsnap_user.email }}
+TeamSnap Managed Team: {{ teamsnap_team.name }}
+ + + + + + {% endblock %} \ No newline at end of file diff --git a/teamsnap/urls.py b/teamsnap/urls.py index 03f0c39..0e53057 100644 --- a/teamsnap/urls.py +++ b/teamsnap/urls.py @@ -10,5 +10,6 @@ urlpatterns = [ path('events', views.EventsListView.as_view(), name="teamsnap list events"), path('events-table', views.EventsTableView.as_view(), name="teamsnap table events"), path('edit/event/