From 8a9a955f3abd4000c73de5e04d350bade40b6a6b Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 7 Nov 2021 17:01:20 -0600 Subject: [PATCH] Added edit button and forms for Players, Teams, Venues --- events/tests.py | 112 ++++++++++++++++++++++++++++ players/forms.py | 7 ++ players/templates/players/edit.html | 9 +++ players/tests.py | 3 + players/urls.py | 3 +- players/views.py | 30 +++++++- teams/forms.py | 7 ++ teams/tests.py | 3 + teams/urls.py | 3 +- teams/views.py | 28 ++++++- templates/list.html | 3 +- venues/forms.py | 7 ++ venues/templates/venues/edit.html | 9 +++ venues/tests.py | 3 + venues/urls.py | 3 +- venues/views.py | 28 ++++++- 16 files changed, 248 insertions(+), 10 deletions(-) create mode 100644 events/tests.py create mode 100644 players/forms.py create mode 100644 players/templates/players/edit.html create mode 100644 players/tests.py create mode 100644 teams/forms.py create mode 100644 teams/tests.py create mode 100644 venues/forms.py create mode 100644 venues/templates/venues/edit.html create mode 100644 venues/tests.py diff --git a/events/tests.py b/events/tests.py new file mode 100644 index 0000000..4ed33df --- /dev/null +++ b/events/tests.py @@ -0,0 +1,112 @@ +from django.test import TestCase +from events.models import Player, Event, Availability, Team, Positioning +import datetime +import pytz +# Create your tests here. + +class BenchcoachTestCase(TestCase): + def setUp(self): + for first_name, last_name, jersey_number in [ + ("Rush", "Valenzuela", 1), + ("Baby", "Triumphant", 2) + ]: + Player.objects.create(first_name=first_name, last_name=last_name, jersey_number=jersey_number) + + for name in ["Firefighters", "Garages"]: + Team.objects.create(name=name) + + for start, home_team_id, away_team_id in [ + (datetime.datetime(2020, 1, 2, 12, 0), 1, 2), # id = 1 + (datetime.datetime(2020, 1, 3, 12, 0), 2, 1), # id = 2 + (datetime.datetime(2020, 1, 4, 12, 0), 2, 1) # id = 3 + ]: + Event.objects.create(start=start, home_team_id=home_team_id, away_team_id=away_team_id) + + for event_id in [ + 1 + ]: + for player_id, available in [ + (1,"Yes"), + (2,"No") + ]: + Availability.objects.create(event_id=event_id, player_id=player_id, available=available) + + for event_id in [ + 1 + ]: + for player_id, position in [ + (1, "C"), + (2, "1B") + ]: + Positioning.objects.create(event_id=event_id, player_id=player_id, position=position) + + for event_id in [ + 2 + ]: + for player_id, available in [ + (1,"Yes"), + (2,"Yes") + ]: + Availability.objects.create(event_id=event_id, player_id=player_id, available=available) + + for event_id in [ + 3 + ]: + for player_id, available in [ + (1,"No"), + (2,"No") + ]: + Availability.objects.create(event_id=event_id, player_id=player_id, available=available) + pass + + + def test_player(self): + """Test that player works""" + player_1 = Player.objects.get(first_name="Rush") + player_2 = Player.objects.get(first_name="Baby") + self.assertEqual(str(player_1), f"Valenzuela, Rush") + self.assertEqual(str(player_2), f"Triumphant, Baby") + pass + + def test_event(self): + event = Event.objects.get(pk=1) + self.assertEqual(event.start.year, 2020) + self.assertEqual(event.start.month, 1) + self.assertEqual(event.start.day, 2) + self.assertEqual(event.start.hour, 12) + self.assertEqual(event.start.minute, 0) + self.assertEqual(event.home_team.name, "Firefighters") + self.assertEqual(event.away_team.name, "Garages") + + def test_availability(self): + availability_1 = Availability.objects.get(event_id=1, player_id=1) + availability_2 = Availability.objects.get(event_id=1, player_id=2) + + self.assertEqual(availability_1.available, "Yes") + self.assertEqual(availability_2.available, "No") + pass + + def test_positioning(self): + positioning_1 = Positioning.objects.get(event_id=1, player_id=1) + positioning_2 = Positioning.objects.get(event_id=1, player_id=2) + # positing_1 + pass + + def test_combine_info(self): + event = Event.objects.get(pk=1) + event_id = 1 + player_query = Player.objects.all() + positioning_query = Positioning.objects.filter(event=event).select_related('player') + availability_query = Availability.objects.filter(event=event).select_related('player') + player_event_info = [] + + for player in player_query: + player_event_info.append( + { + "player":player, + "positioning":positioning_query.get(player_id=player.id), + "availability":availability_query.get(player_id=player.id) + } + ) + + pass diff --git a/players/forms.py b/players/forms.py new file mode 100644 index 0000000..9a056b7 --- /dev/null +++ b/players/forms.py @@ -0,0 +1,7 @@ +from django import forms +from .models import Player + +class PlayerForm(forms.ModelForm): + class Meta: + model = Player + fields = ['first_name', 'last_name', 'jersey_number'] \ No newline at end of file diff --git a/players/templates/players/edit.html b/players/templates/players/edit.html new file mode 100644 index 0000000..7643e8b --- /dev/null +++ b/players/templates/players/edit.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %}} + +{% block content %} +
+ {% csrf_token %} + {{ form }} + +
+{% endblock %} \ No newline at end of file diff --git a/players/tests.py b/players/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/players/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/players/urls.py b/players/urls.py index 71c73f7..59d7feb 100644 --- a/players/urls.py +++ b/players/urls.py @@ -4,5 +4,6 @@ from . import views urlpatterns = [ path('', views.root, name="root"), - path('list', views.list, name="players list") + path('list', views.list, name="players list"), + path('edit/', views.edit, name="edit player") ] \ No newline at end of file diff --git a/players/views.py b/players/views.py index ec06eae..ccf515a 100644 --- a/players/views.py +++ b/players/views.py @@ -1,5 +1,7 @@ -from django.shortcuts import render, redirect +from django.shortcuts import render, redirect, get_object_or_404 +from django.http import HttpResponse from .models import Player +from .forms import PlayerForm # Create your views here. def root(request): @@ -7,4 +9,28 @@ def root(request): def list(request): players = Player.objects.all() - return render(request, 'list.html', {'title': "Players", 'items': [f"{player.first_name} {player.last_name}" for player in players]}) \ No newline at end of file + return render(request, 'list.html', {'title': "Players", + 'items': [(player.id, f"{player.first_name} {player.last_name}") for player in players], + 'edit_url_name': 'edit player'}) + +def edit(request, id=None): + # if this is a POST request we need to process the form data + if request.method == 'POST': + # create a form instance and populate it with data from the request: + form = PlayerForm(request.POST) + # check whether it's valid: + if form.is_valid(): + # process the data in form.cleaned_data as required + # ... + # redirect to a new URL: + return HttpResponse(str(form.cleaned_data)) + + # if a GET (or any other method) we'll create a blank form + else: + if id: + instance = get_object_or_404(Player, id=id) + form = PlayerForm(request.POST or None, instance=instance) + else: + form = PlayerForm + + return render(request, 'players/edit.html', {'form': form, 'id': id}) \ No newline at end of file diff --git a/teams/forms.py b/teams/forms.py new file mode 100644 index 0000000..6196f87 --- /dev/null +++ b/teams/forms.py @@ -0,0 +1,7 @@ +from django import forms +from .models import Team + +class TeamForm(forms.ModelForm): + class Meta: + model = Team + fields = ['name'] \ No newline at end of file diff --git a/teams/tests.py b/teams/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/teams/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/teams/urls.py b/teams/urls.py index ee579f9..c8b5b83 100644 --- a/teams/urls.py +++ b/teams/urls.py @@ -6,5 +6,6 @@ from . import views urlpatterns = [ path('', views.root, name="root"), - path('list', views.list, name="teams list") + path('list', views.list, name="teams list"), + path('edit/', views.edit, name="edit team") ] \ No newline at end of file diff --git a/teams/views.py b/teams/views.py index 63321a5..c3d544b 100644 --- a/teams/views.py +++ b/teams/views.py @@ -1,4 +1,6 @@ -from django.shortcuts import render, redirect +from django.shortcuts import render, redirect, get_object_or_404 +from django.http import HttpResponse +from .forms import TeamForm from .models import Team def root(request): @@ -6,4 +8,26 @@ def root(request): def list(request): teams = Team.objects.all() - return render(request, 'list.html', {'title': "Teams", 'items': [f"{team.name}" for team in teams]}) \ No newline at end of file + return render(request, 'list.html', {'title': "Teams", 'items': [(team.id, f"{team.name}") for team in teams], 'edit_url_name':'edit team'}) + +def edit(request, id=None): + # if this is a POST request we need to process the form data + if request.method == 'POST': + # create a form instance and populate it with data from the request: + form = TeamForm(request.POST) + # check whether it's valid: + if form.is_valid(): + # process the data in form.cleaned_data as required + # ... + # redirect to a new URL: + return HttpResponse(str(form.cleaned_data)) + + # if a GET (or any other method) we'll create a blank form + else: + if id: + instance = get_object_or_404(Team, id=id) + form = TeamForm(request.POST or None, instance=instance) + else: + form = TeamForm + + return render(request, 'venues/edit.html', {'form': form, 'id':id}) \ No newline at end of file diff --git a/templates/list.html b/templates/list.html index d1f7a4f..9a98336 100644 --- a/templates/list.html +++ b/templates/list.html @@ -7,7 +7,8 @@
    {% for item in items %}
  1. - {{ item }} +
    {{ item.1 }}
    + Edit
  2. {% endfor %}
diff --git a/venues/forms.py b/venues/forms.py new file mode 100644 index 0000000..d94c265 --- /dev/null +++ b/venues/forms.py @@ -0,0 +1,7 @@ +from django import forms +from .models import Venue + +class VenueForm(forms.ModelForm): + class Meta: + model = Venue + fields = ['name'] \ No newline at end of file diff --git a/venues/templates/venues/edit.html b/venues/templates/venues/edit.html new file mode 100644 index 0000000..7eacdd6 --- /dev/null +++ b/venues/templates/venues/edit.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %}} + +{% block content %} +
+ {% csrf_token %} + {{ form }} + +
+{% endblock %} \ No newline at end of file diff --git a/venues/tests.py b/venues/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/venues/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/venues/urls.py b/venues/urls.py index a9dfb43..b67b468 100644 --- a/venues/urls.py +++ b/venues/urls.py @@ -4,5 +4,6 @@ from . import views urlpatterns = [ path('', views.root, name="root"), - path('list', views.list, name="venues list") + path('list', views.list, name="venues list"), + path('edit/', views.edit, name="edit venue") ] \ No newline at end of file diff --git a/venues/views.py b/venues/views.py index 47eeecf..b5d9193 100644 --- a/venues/views.py +++ b/venues/views.py @@ -1,4 +1,5 @@ -from django.shortcuts import render, redirect +from django.shortcuts import render, redirect, get_object_or_404 +from django.http import HttpResponse from .models import Venue def root(request): @@ -6,4 +7,27 @@ def root(request): def list(request): venues = Venue.objects.all() - return render(request, 'list.html', {'title': "Venues", 'items': [f"{venue.name}" for venue in venues]}) \ No newline at end of file + return render(request, 'list.html', {'title': "Venues", 'items': [(venue.id, f"{venue.name}") for venue in venues], 'edit_url_name': 'edit venue'}) + +from .forms import VenueForm +def edit(request, id=None): + # if this is a POST request we need to process the form data + if request.method == 'POST': + # create a form instance and populate it with data from the request: + form = VenueForm(request.POST) + # check whether it's valid: + if form.is_valid(): + # process the data in form.cleaned_data as required + # ... + # redirect to a new URL: + return HttpResponse(str(form.cleaned_data)) + + # if a GET (or any other method) we'll create a blank form + else: + if id: + instance = get_object_or_404(Venue, id=id) + form = VenueForm(request.POST or None, instance=instance) + else: + form = VenueForm + + return render(request, 'venues/edit.html', {'form': form, 'id':id}) \ No newline at end of file