diff --git a/teamsnap/fixtures/_2021cmba.json b/teamsnap/fixtures/_2021cmba.json deleted file mode 100644 index 280ad39..0000000 --- a/teamsnap/fixtures/_2021cmba.json +++ /dev/null @@ -1 +0,0 @@ -[{"model": "teamsnap.user", "pk": 1, "fields": {"teamsnap_id": "25560745", "access_token": "u2SqDq78FumVvhkt1D-V1CQ2ZIaB-nUVlzGwd1YhGtA"}}, {"model": "teamsnap.team", "pk": 1, "fields": {"teamsnap_id": "7644001", "name": null, "bencoach_team": null}}] \ No newline at end of file diff --git a/teamsnap/forms.py b/teamsnap/forms.py index f69398d..fefcf35 100644 --- a/teamsnap/forms.py +++ b/teamsnap/forms.py @@ -1,25 +1,29 @@ from django import forms -from .models import LineupEntry, Event -import benchcoach.models +from .models import Team, Location, Opponent, Event, Member from django.forms import modelformset_factory -class LineupEntryForm(forms.ModelForm): - availability = None - class Meta: - model = LineupEntry - widgets = { - 'label': forms.Select(attrs={'class': 'form-control form-control-sm'}) - } - exclude = () +select_kwargs = { + 'attrs':{'class': 'form-control form-control-sm'} +} -LineupEntryFormSet = modelformset_factory( - model=LineupEntry, - form=LineupEntryForm, - extra=0 -) +text_input_kwargs = { + 'attrs':{"readonly": "readonly", 'class':'form-control form-control-sm'} +} + +class MemberForm(forms.ModelForm): + class Meta: + model = Member + fields = ('first_name', 'last_name', 'benchcoach_object') + labels = { + 'benchcoach_object': 'BenchCoach Link', + } + widgets = { + "benchcoach_object": forms.Select(**select_kwargs), + "first_name": forms.TextInput(**text_input_kwargs), + "last_name": forms.TextInput(**text_input_kwargs), + } class EventForm(forms.ModelForm): - availability = None class Meta: model = Event fields = ('formatted_title', 'start_date', 'benchcoach_object') @@ -29,12 +33,45 @@ class EventForm(forms.ModelForm): 'start_date':'Date/Time' } widgets = { - "formatted_title":forms.TextInput(attrs={"disabled":"disabled"}), - "start_date": forms.DateTimeInput(attrs={"disabled": "disabled"}) + "benchcoach_object": forms.Select(**select_kwargs), + "formatted_title":forms.TextInput(**text_input_kwargs), + "start_date": forms.DateTimeInput(**text_input_kwargs) } -EventFormSet = modelformset_factory( - model=Event, - form=EventForm, - extra=0 -) +class TeamForm(forms.ModelForm): + class Meta: + model = Team + fields = ('name', 'benchcoach_object') + labels ={ + 'benchcoach_object':'BenchCoach Link', + } + widgets = { + "name":forms.TextInput(**text_input_kwargs), + "benchcoach_object": forms.Select(**select_kwargs) + } + +class OpponentForm(forms.ModelForm): + class Meta: + model = Opponent + fields = ('name', 'benchcoach_object') + labels ={ + 'benchcoach_object':'BenchCoach Link', + } + widgets = { + "name":forms.TextInput(**text_input_kwargs), + "benchcoach_object": forms.Select(**select_kwargs) + } + +class LocationForm(forms.ModelForm): + class Meta: + model = Location + fields = ('name', 'benchcoach_object') + labels ={ + 'benchcoach_object':'BenchCoach Link', + } + widgets = { + "name":forms.TextInput(**text_input_kwargs), + "benchcoach_object": forms.Select(**select_kwargs) + } + + diff --git a/teamsnap/migrations/0004_auto_20211222_0957.py b/teamsnap/migrations/0004_auto_20211222_0957.py new file mode 100644 index 0000000..a9803d6 --- /dev/null +++ b/teamsnap/migrations/0004_auto_20211222_0957.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.6 on 2021-12-22 15:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teamsnap', '0003_auto_20211219_2058'), + ] + + operations = [ + migrations.AlterField( + model_name='event', + name='is_game', + field=models.BooleanField(null=True), + ), + migrations.AlterField( + model_name='member', + name='is_non_player', + field=models.BooleanField(null=True), + ), + ] diff --git a/teamsnap/models.py b/teamsnap/models.py index 3562cef..409b09b 100644 --- a/teamsnap/models.py +++ b/teamsnap/models.py @@ -26,6 +26,7 @@ class Team(TeamsnapBaseModel): benchcoach_object = models.OneToOneField( benchcoach.models.Team, null=True, + blank=True, on_delete=models.CASCADE, related_name="teamsnap_team" ) @@ -35,7 +36,8 @@ class Team(TeamsnapBaseModel): def update_or_create_from_teamsnap_api(cls, teamsnap_data): fields = ['id', 'name', 'created_at', 'updated_at'] data = {k: teamsnap_data[k] for k in fields} - team, created = cls.objects.update_or_create(**data) + id = data.pop('id') + team, created = cls.objects.update_or_create(id=id, defaults=data) return (team, created) class User(TeamsnapBaseModel): @@ -55,7 +57,8 @@ class User(TeamsnapBaseModel): obj, created = Team.objects.get_or_create(id=managed_team_id) managed_teams.append(obj) pass - user, created = cls.objects.update_or_create(**user_data) + id = user_data.pop('id') + user, created = cls.objects.update_or_create(id=id, defaults=user_data) user.managed_teams.add(*managed_teams) return (user, created) @@ -80,6 +83,7 @@ class Opponent(TeamsnapManagedObjectModel): benchcoach_object = models.OneToOneField( benchcoach.models.Team, null=True, + blank=True, on_delete=models.CASCADE, related_name="teamsnap_opponent" ) @@ -90,8 +94,10 @@ class Opponent(TeamsnapManagedObjectModel): fields = ['id', 'name', 'created_at', 'updated_at'] opponent_data = {k: teamsnap_data[k] for k in fields} team, created = Team.objects.get_or_create(id=teamsnap_data['team_id']) - opponent, created = cls.objects.update_or_create(**opponent_data) + id = opponent_data.pop('id') + opponent, created = cls.objects.update_or_create(id=id, defaults=opponent_data) opponent.team = team + opponent.save() return (opponent, created) class Location(TeamsnapManagedObjectModel): @@ -100,6 +106,7 @@ class Location(TeamsnapManagedObjectModel): benchcoach_object = models.OneToOneField( benchcoach.models.Venue, null=True, + blank=True, on_delete=models.CASCADE, related_name="teamsnap_location" ) @@ -110,8 +117,10 @@ class Location(TeamsnapManagedObjectModel): fields = ['id', 'name', 'created_at', 'updated_at'] opponent_data = {k: teamsnap_data[k] for k in fields} team, created = Team.objects.get_or_create(id=teamsnap_data['team_id']) - location, created = cls.objects.update_or_create(**opponent_data) + id = opponent_data.pop('id') + location, created = cls.objects.update_or_create(id=id, defaults=opponent_data) location.team = team + location.save() return (location, created) class Member(TeamsnapManagedObjectModel): @@ -123,13 +132,14 @@ class Member(TeamsnapManagedObjectModel): benchcoach_object = models.OneToOneField( benchcoach.models.Player, null=True, + blank=True, on_delete=models.CASCADE, related_name="teamsnap_member" ) 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() + is_non_player = models.BooleanField(null=True) ApiObject = teamsnap.teamsnap.api.Member @classmethod @@ -137,8 +147,10 @@ class Member(TeamsnapManagedObjectModel): fields = ['id', 'created_at', 'updated_at', 'first_name', 'last_name', 'jersey_number','is_non_player'] member_data = {k: teamsnap_data[k] for k in fields} team, created = Team.objects.get_or_create(id=teamsnap_data['team_id']) - member, created = cls.objects.update_or_create(**member_data) + id = member_data.pop('id') + member, created = cls.objects.update_or_create(id=id, defaults= member_data) member.team = team + member.save() return (member, created) def __str__(self): @@ -156,6 +168,7 @@ class Event(TeamsnapManagedObjectModel): benchcoach_object = models.OneToOneField( benchcoach.models.Event, null=True, + blank=True, on_delete=models.CASCADE, related_name="teamsnap_event" ) @@ -166,7 +179,7 @@ class Event(TeamsnapManagedObjectModel): 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() + is_game = models.BooleanField(null=True) game_type = models.CharField(max_length = 50, null=True) ApiObject = teamsnap.teamsnap.api.Event @@ -187,13 +200,15 @@ class Event(TeamsnapManagedObjectModel): event_data = {k: teamsnap_data[k] for k in fields} location, created = Location.objects.get_or_create(id=teamsnap_data['location_id']) team, created = Team.objects.get_or_create(id=teamsnap_data['team_id']) - event, created = cls.objects.update_or_create(**event_data) + id = event_data.pop('id') + event, created = cls.objects.update_or_create(id=id, defaults=event_data) event.location = location if teamsnap_data['opponent_id']: opponent, created = Opponent.objects.get_or_create(id=teamsnap_data['opponent_id']) event.opponent = opponent event.team = team - return (location, created) + event.save() + return (team, created) def __str__(self): return f"{self.formatted_title} ({self.id})" @@ -214,6 +229,7 @@ class Availability(TeamsnapManagedObjectModel): benchcoach_object = models.OneToOneField( benchcoach.models.Availability, null=True, + blank=True, on_delete=models.CASCADE, related_name="teamsnap_availability" ) @@ -238,10 +254,12 @@ class Availability(TeamsnapManagedObjectModel): member, created = Member.objects.get_or_create(id=teamsnap_data['member_id']) team, created = Team.objects.get_or_create(id=teamsnap_data['team_id']) event, created = Event.objects.get_or_create(id=teamsnap_data['event_id']) - availability, created = cls.objects.update_or_create(**availability_data) + id = availability_data.pop('id') + availability, created = cls.objects.update_or_create(id=id, defaults=availability_data) availability.team = team availability.event = event availability.member = member + availability.save() return (availability, created) class LineupEntry(TeamsnapManagedObjectModel): @@ -263,6 +281,7 @@ class LineupEntry(TeamsnapManagedObjectModel): benchcoach_object = models.OneToOneField( benchcoach.models.Positioning, null=True, + blank=True, on_delete=models.CASCADE, related_name="teamsnap_lineupentry" ) @@ -283,8 +302,10 @@ class LineupEntry(TeamsnapManagedObjectModel): member, created = Member.objects.get_or_create(id=teamsnap_data['member_id']) team, created = Team.objects.get_or_create(id=teamsnap_data['team_id']) event, created = Event.objects.get_or_create(id=teamsnap_data['event_id']) - lineup_entry, created = cls.objects.update_or_create(**lineup_entry_data) + id = lineup_entry_data.pop('id') + lineup_entry, created = cls.objects.update_or_create(id=id, defaults=lineup_entry_data) lineup_entry.team = team lineup_entry.event = event lineup_entry.member = member + lineup_entry.save() return (lineup_entry, created) \ No newline at end of file diff --git a/teamsnap/templates/teamsnap/event_list.html b/teamsnap/templates/teamsnap/event_list.html deleted file mode 100644 index c973204..0000000 --- a/teamsnap/templates/teamsnap/event_list.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "base.html" %} -{% block title %} {{ title }}{% endblock %} - -{% block content %} - -

{{ title }}

-{#
    #} -{% for item in object_list %} - -{% endfor %} -
-{% endblock %} \ No newline at end of file diff --git a/teamsnap/templates/teamsnap/home.html b/teamsnap/templates/teamsnap/home.html index 8d65c96..7779e31 100644 --- a/teamsnap/templates/teamsnap/home.html +++ b/teamsnap/templates/teamsnap/home.html @@ -7,32 +7,30 @@

TeamSnap: {{ teamsnap_user.email }}

TeamSnap Managed Team: {{ teamsnap_team.name }}

- - {% include 'messages.html' %}
- - -{% endblock %} \ No newline at end of file diff --git a/teamsnap/templates/teamsnap/player-table.html b/teamsnap/templates/teamsnap/player-table.html deleted file mode 100644 index e56044b..0000000 --- a/teamsnap/templates/teamsnap/player-table.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - {# #} - {# #} - {# #} - {# #} - - - - {% for form in formset %} - - {{ form.id.as_hidden }} - {{ form.event.as_hidden }} - {{ form.sequence.as_hidden }} - {{ form.member.as_hidden }} - {{ form.teamsnap_id.as_hidden }} - - - - - {# #} - - {% endfor %} - -
NamePos
- {% if form.availability.status_code == 2 %} - - {% elif form.availability.status_code == 1%} - - Maybe - {% elif form.availability.status_code == 0%} - - No - {% else %} - - Unknown - {% endif %} - - {% if form.sequence.value %} - - {% elif form.sequence.value == 0 %} - - {% endif %} - - {{ form.instance.member.first_name }} {{ form.instance.member.last_name }}  - #{{ form.instance.member.jersey_number }} - {#
{{ form.statline }}#} -
- {{ form.label }} - {{ form.instance.position }}
\ No newline at end of file diff --git a/teamsnap/templates/teamsnap/event-table.html b/teamsnap/templates/teamsnap/table.html similarity index 62% rename from teamsnap/templates/teamsnap/event-table.html rename to teamsnap/templates/teamsnap/table.html index 3850a13..7881eb1 100644 --- a/teamsnap/templates/teamsnap/event-table.html +++ b/teamsnap/templates/teamsnap/table.html @@ -1,13 +1,8 @@ - - - - - Title - - - -{{ formset.management_form }} - +{% extends 'base.html' %} +{% block content %} + +{{ formset.management_form }}{% csrf_token %} +
{% for _, field in formset.0.base_fields.items %} @@ -24,6 +19,6 @@ {% endfor %}
{{ field.label }}
- - - \ No newline at end of file + + +{% endblock %} \ No newline at end of file diff --git a/teamsnap/urls.py b/teamsnap/urls.py index c8d30d8..dd6c8e5 100644 --- a/teamsnap/urls.py +++ b/teamsnap/urls.py @@ -7,9 +7,11 @@ from . import views urlpatterns = [ path('', views.home, name='teamsnap home'), - path('events', views.EventsListView.as_view(), name="teamsnap list events"), - path('events-table', views.EventsTableView.as_view(), name="teamsnap table events"), + # path('events', views.EventsListView.as_view(), name="teamsnap list events"), + # path('event-table', views.EventsTableView.as_view(), name="teamsnap table events"), + path('table/', views.TeamsnapObjTableView.as_view(), name="teamsnap table obj"), path('edit/event/', views.edit_event, name='teamsnap edit event'), - path('sync_teamsnap_db', views.sync_teamsnap_db, name="sync teamsnap db"), + path('sync_teamsnap_db', views.sync_teamsnapdb_with_teamsnapapi, name="sync with teamsnapapi"), + path('sync_benchcoach_db', views.sync_teamsnapdb_to_benchcoachdb, name="sync benchcoach"), # path('import_teamsnap', views.import_teamsnap, name="import teamsnap"), ] \ No newline at end of file diff --git a/teamsnap/utils/import_teamsnap.py b/teamsnap/utils/import_teamsnap.py index cb8665a..5297686 100644 --- a/teamsnap/utils/import_teamsnap.py +++ b/teamsnap/utils/import_teamsnap.py @@ -29,9 +29,10 @@ def update_teamsnap_object(d, teamsnap_object: TeamsnapBaseModel, benchcoach_mod if teamsnap_object.benchcoach_object: #TODO I'm not sure this does anything. need to make sure. - benchcoach_object = benchcoach_model.objects.filter(id=teamsnap_object.benchcoach_object.id).first() + benchcoach_object = benchcoach_model.objects.filter(id=teamsnap_object.benchcoach_object.id) + benchcoach_object.update(**d) created = False - r.append((benchcoach_object, created)) + r.append((benchcoach_object.first(), created)) elif not teamsnap_object.benchcoach_object and create_benchcoach_object: benchcoach_object = benchcoach_model(**d) # create new benchcoach object teamsnap_object.benchcoach_object = benchcoach_object diff --git a/teamsnap/utils/import_teamsnap_2.py b/teamsnap/utils/import_teamsnap_2.py deleted file mode 100644 index e52d471..0000000 --- a/teamsnap/utils/import_teamsnap_2.py +++ /dev/null @@ -1,198 +0,0 @@ -import os -import sys - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "benchcoachproject.settings") -os.environ["DJANGO_SETTINGS_MODULE"] = "benchcoachproject.settings" -import django -django.setup() - -from teamsnap.teamsnap.api import TeamSnap -import teamsnap.teamsnap.api -from teamsnap.models import User, Member, Team, Event, Location, Availability, Opponent, TeamsnapBaseModel -from typing import List, Type, Tuple -from benchcoachproject.models import Profile as BenchcoachUser -import benchcoach.models -from django.db import models -import pytz - -def update_teamsnapbasemodel_from_teamsnap( - TeamsnapModel: Type[TeamsnapBaseModel], - teamsnap_client: teamsnap.teamsnap.api.TeamSnap, - fields: List[str]= ['created_at', 'updated_at'], - additional_fields: List[str] = [], - related_fields: List[Tuple[str, Type[TeamsnapBaseModel]]] = [], - create = True, - create_related = True, - **teamsnap_search_kwargs -): - api_response_objects = TeamsnapModel.ApiObject.search( - client=teamsnap_client, **teamsnap_search_kwargs - ) - - r = [] - - for response_object in api_response_objects: - d = {k:response_object.data[k] for k in fields} - d.update({k:response_object.data[k] for k in additional_fields}) - - for related_field_name, RelatedTeamSnapModel in related_fields: - related_field_name = f"{related_field_name}_id" - filter_criteria = {related_field_name:response_object.data[related_field_name]} - if related_field_name == "team_id" and RelatedTeamSnapModel.__name__ == "Team": - filter_criteria = {'id':response_object.data[related_field_name]} - related_teamsnap_object = RelatedTeamSnapModel.objects.filter(**filter_criteria).first() - if related_teamsnap_object: - d[related_field_name] = related_teamsnap_object - elif not related_teamsnap_object and create_related: - related_teamsnap_object = RelatedTeamSnapModel(**{related_field_name:response_object.data[related_field_name]}) - related_teamsnap_object.save() - elif not related_teamsnap_object and not create_related: - raise RelatedTeamSnapModel.DoesNotExist - - teamsnap_object = TeamsnapModel.objects.filter(id=response_object.data['id']) - if teamsnap_object: - teamsnap_object.update(**d) - created = False - r.append((teamsnap_object.first(), created)) - elif not teamsnap_object and create: - new_teamsnap_object = TeamsnapModel(**d) # create new benchcoach object - new_teamsnap_object.save() - created = True - r.append((new_teamsnap_object, created)) - elif not teamsnap_object and not create: - raise TeamsnapModel.DoesNotExist - - return r - -def update_events( - teamsnap_client: teamsnap.teamsnap.api.TeamSnap, - create: bool = True, - create_related: bool = False, - **teamsnap_search_kwargs -): - r = update_teamsnapbasemodel_from_teamsnap( - TeamsnapModel= Event, - teamsnap_client= teamsnap_client, - additional_fields=['label', 'start_date', 'formatted_title', 'points_for_opponent', 'points_for_team', 'is_game', 'game_type'], - related_fields=[('location', Location), ('opponent', Opponent), ('team', Team)], - create=create, - create_related=create_related, - **teamsnap_search_kwargs - ) - - return r - -def update_opponents( - teamsnap_client: teamsnap.teamsnap.api.TeamSnap, - create: bool = True, - create_related: bool = False, - **teamsnap_search_kwargs -): - r = update_teamsnapbasemodel_from_teamsnap( - TeamsnapModel= Opponent, - teamsnap_client= teamsnap_client, - additional_fields=['name'], - related_fields=[('team', Team)], - create=create, - create_related=create_related, - **teamsnap_search_kwargs - ) - - return r - -def update_teams( - teamsnap_client: teamsnap.teamsnap.api.TeamSnap, - create: bool = True, - create_related: bool = False, - **teamsnap_search_kwargs -): - r = update_teamsnapbasemodel_from_teamsnap( - TeamsnapModel=Team, - teamsnap_client=teamsnap_client, - additional_fields=['name'], - create=create, - create_related=create_related, - **teamsnap_search_kwargs - ) - - -def update_locations( - teamsnap_client: teamsnap.teamsnap.api.TeamSnap, - create: bool = True, - create_related: bool = False, - **teamsnap_search_kwargs -): - r = update_teamsnapbasemodel_from_teamsnap( - TeamsnapModel=Location, - teamsnap_client=teamsnap_client, - additional_fields=['name'], - related_fields=[('team', Team)], - create=create, - create_related=create_related, - **teamsnap_search_kwargs - ) - -def update_availabilities(teamsnap_client: teamsnap.teamsnap.api.TeamSnap, - create: bool = True, - create_related: bool = False, - **teamsnap_search_kwargs -): - r = update_teamsnapbasemodel_from_teamsnap( - TeamsnapModel= Availability, - teamsnap_client= teamsnap_client, - related_fields=[('event', Event), ('member', Member), ('team', Team)], - create=create, - create_related=create_related, - **teamsnap_search_kwargs - ) - -def import_teamsnap(): - user = BenchcoachUser.objects.get(id=1) - TOKEN = user.teamsnap_access_token - USER_ID = user.teamsnap_user.id - TEAM_ID = user.teamsnapsettings.managed_team.id - CLIENT = TeamSnap(token=TOKEN) - - l = [] - for team in Opponent.objects.filter(managed_by_team_id=TEAM_ID): - l += update_opponent(team, create_benchcoach_object=True, create_related=True) - - for team in Team.objects.filter(id=TEAM_ID): - l += update_team(team, create_benchcoach_object=True, create_related=True) - - for location in Location.objects.filter(managed_by_team_id=TEAM_ID): - l += update_location(location, create_benchcoach_object=True, create_related=True) - - for member in Member.objects.filter(managed_by_team_id=TEAM_ID, is_non_player=False): - l += update_member(member, create_benchcoach_object= True, create_related=True) - - for event in Event.objects.filter(managed_by_team_id=TEAM_ID): - l += update_event(event, create_benchcoach_object=True, create_related=True) - - for availability in Availability.objects.filter(managed_by_team_id=TEAM_ID): - l += update_availability(availability, create_benchcoach_object=True, create_related=True) - - pass - # l += update_teams(CLIENT, team_id=TEAM_ID) - # l += update_members(CLIENT, team_id=TEAM_ID) - # l += update_locations(CLIENT, team_id=TEAM_ID) - # l += update_events(CLIENT, team_id=TEAM_ID) - # l += update_availabilities(CLIENT, team_id=TEAM_ID) - -if __name__ == "__main__": - - TOKEN = BenchcoachUser.objects.get(id=1).teamsnap_access_token - USER_ID = BenchcoachUser.objects.get(id=1).teamsnap_user_id - TEAM_ID = BenchcoachUser.objects.get(id=1).teamsnapsettings.managed_team_id - CLIENT = TeamSnap(token=TOKEN) - for Obj in [User]: - a = Obj.ApiObject.search(CLIENT, id=USER_ID) - for _a in a: - obj, created = Obj.update_or_create_from_teamsnap_api(_a.data) - - for Obj in [Event, Availability, Location, Member, Opponent, Team]: - a = Obj.ApiObject.search(CLIENT, team_id=TEAM_ID) - for _a in a: - obj, created = Obj.update_or_create_from_teamsnap_api(_a.data) - # update_opponents(CLIENT, team_id=TEAM_ID) - # update_events(CLIENT, team_id=TEAM_ID) \ No newline at end of file diff --git a/teamsnap/views.py b/teamsnap/views.py index 090ccb3..ce3c94a 100644 --- a/teamsnap/views.py +++ b/teamsnap/views.py @@ -4,20 +4,20 @@ from .teamsnap.api import Event as TsApiEvent from .teamsnap.api import TeamSnap from .models import User, Member, Team, Event, Location, LineupEntry, Opponent, Availability from lib.views import BenchcoachListView -from .forms import LineupEntryForm, LineupEntryFormSet, EventForm, EventFormSet +from .forms import EventForm, MemberForm, OpponentForm, TeamForm, LocationForm from django.urls import reverse from django.db.models import Case, When from django.views import View from django.http import HttpResponse import benchcoachproject.models import benchcoach.models -import teamsnap.teamsnap.api -import json from django.http import JsonResponse from .utils.teamsnap_object_utils import update_users, update_teams, update_events, update_members, update_locations, update_availabilities from django.contrib import messages from django.template.loader import render_to_string from .utils.import_teamsnap import update_team, update_event, update_member, update_location, update_opponent, update_availability, update_teamsnap_object +from django.forms import modelformset_factory +import django.db.models def queryset_from_ids(Model, id_list): #https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order @@ -40,61 +40,45 @@ def home(request): } return render(request, 'teamsnap/home.html', context) -class EventsTableView(View): - def get(self, request): - qs = Event.objects.all() - formset = EventFormSet(queryset=qs) - return render(request,'teamsnap/event-table.html', context={'formset':formset}) +class TeamsnapObjTableView(View): + Model = None + Form = None + template = 'teamsnap/table.html' + options = { + 'event': (Event, EventForm), + 'location': (Location, LocationForm), + 'member': (Member, MemberForm), + 'opponent': (Opponent, OpponentForm), + 'team': (Team, TeamForm) + } -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 post(self, request, object): + self.Model, self.Form = self.options[object] + self.Formset = modelformset_factory( + model=self.Model, + form=self.Form, + extra=0 + ) + formset = self.Formset(request.POST, request.FILES) + if formset.is_valid(): + formset.save() + return HttpResponse(200) + else: + return HttpResponse(422) + pass - def get_context_data(self): - context = super().get_context_data() - for item in context['items']: - item['buttons'].append( - { - 'label': 'Edit Lineup', - 'href': reverse('teamsnap edit lineup', args=[item['id']]) - } - ) - return context + def get(self, request, object): + self.Model, self.Form = self.options[object] + self.Formset = modelformset_factory( + model=self.Model, + form=self.Form, + extra=0 + ) + qs = self.Model.objects.all() + formset = self.Formset(queryset=qs) + return render(request, self.template, context={'formset': formset}) -class TeamListView(BenchcoachListView): - Model = Team - edit_url = 'teamsnap edit team' - list_url = 'teamsnap list teams' - page_title = "TeamSnap Teams" - -class LocationListView(BenchcoachListView): - Model = Location - edit_url = 'teamsnap edit location' - list_url = 'teamsnap list locations' - page_title = "TeamSnap Locations" - -def update_from_teamsnap_event(request): - TOKEN = benchcoachproject.models.User.objects.get(id=1).teamsnap_access_token - CLIENT = TeamSnap(token=TOKEN) - teamsnap_event_id=request.POST.get('teamsnap event') - benchcoach_event_id=request.POST.get('teamsnap event') - if teamsnap_event_id: - benchcoach_event = benchcoach.models.Event.objects.get(id=benchcoach_event_id) - teamsnap_object = benchcoach.models.Event.objects.get(id=teamsnap_event_id) - teamsnap_id = teamsnap_object.teamsnap_id - teamsnap_response = TsApiEvent.search(client=CLIENT, id=teamsnap_id) - if teamsnap_response[0]: - data = teamsnap_response[0].data - location = Location.objects.get(teamsnap_id=data['location_id']) - opponent = Team.objects.get(teamsnap_id=data['opponent_id']) - - return HttpResponse(f'Success, {data}') - -def sync_with_teamsnap_api(request): +def sync_teamsnapdb_with_teamsnapapi(request): ''' This sync the internal TeamSnap Database with the TeamSnap API ''' @@ -119,6 +103,7 @@ def sync_with_teamsnap_api(request): obj, created = Obj.update_or_create_from_teamsnap_api(_a.data) r[Obj.__name__].append((obj, created)) + for object_name, results in r.items(): if len(r) == 0: messages.error(request, f"Error! No {object_name} objects created or updated") @@ -132,7 +117,7 @@ def sync_with_teamsnap_api(request): return JsonResponse(data) -def sync_teamsnap_db(request): +def sync_teamsnapdb_to_benchcoachdb(request): ''' This syncs the internal BenchCoach Database and the TeamSnap Database ''' @@ -148,7 +133,7 @@ def sync_teamsnap_db(request): r['location'] = [] for location in Location.objects.filter(team_id=TEAM_ID): - r['team/location'] += update_location(location, create_benchcoach_object=True, create_related=True) + r['location'] += update_location(location, create_benchcoach_object=True, create_related=True) r['member'] = [] for member in Member.objects.filter(team_id=TEAM_ID, is_non_player=False): @@ -159,8 +144,9 @@ def sync_teamsnap_db(request): r['event'] += update_event(event, create_benchcoach_object=True, create_related=True) r['availability'] = [] - for availability in Availability.objects.filter(team_id=TEAM_ID): + for availability in Availability.objects.filter(team_id=TEAM_ID, member__is_non_player=False): r['availability'] += update_availability(availability, create_benchcoach_object=True, create_related=True) + pass for object_name, results in r.items(): if len(r) == 0: