Merge branch 'master' into lineup_as_table

This commit is contained in:
2021-11-12 14:30:45 -06:00
14 changed files with 291 additions and 124 deletions

View File

@@ -8,7 +8,7 @@
{{ event.start|date:"l, F j, Y g:i A" }} <br> {{ event.start|date:"l, F j, Y g:i A" }} <br>
{{ event.venue.name }} <br> {{ event.venue.name }} <br>
<a class="btn btn-primary btn-sm" href="{% url 'edit event' event.id%}" role="button">Edit Event Details</a> <a class="btn btn-primary btn-sm" href="{% url 'edit event' event.id%}" role="button">Edit Event Details</a>
<a class="btn btn-primary btn-sm" href="{% url 'edit lineup' event.id%}" role="button">Edit Lineup</a> <a class="btn btn-primary btn-sm" href="{% url 'edit lineup' event_id=event.id%}" role="button">Edit Lineup</a>
</li> </li>
{% endfor %} {% endfor %}
</ol> </ol>

View File

@@ -1,112 +1,80 @@
from django.test import TestCase from django.test import TestCase, Client
from events.models import Player, Event, Availability, Team, Positioning from django.test.utils import setup_test_environment
import datetime from django.urls import reverse
import pytz from .models import Event
# Create your tests here. from datetime import datetime
FIXTURES = ['blaseball']
class BenchcoachTestCase(TestCase): class TestEventModel(TestCase):
def setUp(self): fixtures = FIXTURES
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"]: def test_query_event(self):
Team.objects.create(name=name) """
Return the desired event
"""
event = Event.objects.get(id=1)
self.assertEqual("Chicago Firefighters", event.away_team.name)
self.assertEqual("Dallas Steaks", event.home_team.name)
self.assertEqual('George Fourman Stadium', event.venue.name)
self.assertEqual(datetime(
year=2020,
month=8,
day=24,
hour=16,
minute=0,
second=1), event.start)
for start, home_team_id, away_team_id in [ class TestEventViews(TestCase):
(datetime.datetime(2020, 1, 2, 12, 0), 1, 2), # id = 1 fixtures = FIXTURES
(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 [ def test_event_list(self):
1 response = self.client.get(reverse('schedule'))
]: self.assertEqual(200, response.status_code)
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 [ def test_event_edit(self):
1 response = self.client.get(reverse('edit event', args=[2]))
]: self.assertEqual(200, response.status_code)
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 [ # create new event
2 new_event_data = {
]: 'home_team': 23,
for player_id, available in [ 'away_team': 24,
(1,"Yes"), 'start':datetime(
(2,"Yes") year=2021,
]: month=1,
Availability.objects.create(event_id=event_id, player_id=player_id, available=available) day=1,
hour=9,
minute=0,
second=0),
'venue':19
}
for event_id in [ response = self.client.post(reverse('edit event', args=[0]), data=new_event_data)
3 self.assertEqual(201, response.status_code)
]: new_event = Event.objects.get(id=response.context['id'])
for player_id, available in [ self.assertEqual(new_event_data['home_team'], new_event.home_team.id)
(1,"No"), self.assertEqual(new_event_data['away_team'], new_event.away_team_id)
(2,"No") self.assertEqual(new_event_data['start'], new_event.start)
]:
Availability.objects.create(event_id=event_id, player_id=player_id, available=available)
pass
# modify event
def test_player(self): modified_event_data = {
"""Test that player works""" 'home_team': 23,
player_1 = Player.objects.get(first_name="Rush") 'away_team': 24,
player_2 = Player.objects.get(first_name="Baby") 'start':datetime(
self.assertEqual(str(player_1), f"Valenzuela, Rush") year=2021,
self.assertEqual(str(player_2), f"Triumphant, Baby") month=1,
pass day=1,
hour=9,
def test_event(self): minute=0,
event = Event.objects.get(pk=1) second=0),
self.assertEqual(event.start.year, 2020) 'venue':19
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)
} }
) response = self.client.post(reverse('edit event', args=[1]), data=modified_event_data)
self.assertEqual(200, response.status_code)
self.assertEqual(1, response.context['id'])
modified_event = Event.objects.get(id=response.context['id'])
pass self.assertEqual(modified_event_data['home_team'], modified_event.home_team.id)
self.assertEqual(modified_event_data['away_team'], modified_event.away_team.id)
self.assertEqual(modified_event_data['start'], modified_event.start)
self.assertEqual(modified_event_data['venue'], modified_event.venue.id)

View File

@@ -1,4 +1,6 @@
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponse
from django.urls import reverse
from .models import Event from .models import Event
from .forms import EventForm from .forms import EventForm
from django.http import HttpResponse from django.http import HttpResponse
@@ -24,8 +26,11 @@ def edit(request, id=0):
# process the data in form.cleaned_data as required # process the data in form.cleaned_data as required
# ... # ...
# redirect to a new URL: # redirect to a new URL:
if id == 0: id = None
new_event, did_create = Event.objects.update_or_create(pk=id, defaults=form.cleaned_data) new_event, did_create = Event.objects.update_or_create(pk=id, defaults=form.cleaned_data)
return render(request, 'success.html', {'call_back':'schedule'}) return render(request, 'success.html', {'call_back':reverse('schedule'),'id':new_event.id}, status=201 if did_create else 200)
else:
return HttpResponse(status=400)
# if a GET (or any other method) we'll create a blank form # if a GET (or any other method) we'll create a blank form
else: else:

View File

@@ -9,7 +9,7 @@
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
{# <ul class="list-group">#} {# <ul class="list-group">#}
<form action="{% url 'edit lineup' id=event.id%}" method="post"> <form action="{% url 'edit lineup' event_id=event.id%}" method="post">
{# {% csrf_token %}#} {# {% csrf_token %}#}
{# {{ positionings_formset.management_form }}#} {# {{ positionings_formset.management_form }}#}

View File

@@ -1,3 +1,52 @@
from django.test import TestCase from django.test import TestCase
from django.test import TestCase, Client
from django.test.utils import setup_test_environment
from django.urls import reverse
from .models import Positioning, Player
from .forms import PositioningFormSet
# Create your tests here. class TestVenueViews(TestCase):
fixtures = ['blaseball']
def test_positioning_list(self):
response = self.client.get(reverse('edit lineup', args=[1]))
self.assertEqual(response.status_code, 200)
def test_positioning_formset(self):
event = 1
sample_data = [
# first player positioning
(1, Player.objects.get(id=1).id, 'P'),
(2, Player.objects.get(id=2).id, 'C'),
(3, Player.objects.get(id=3).id, '1B')
]
data = {}
for i, (order, player, position) in enumerate(sample_data):
data[f'form-{i}-order']=order
data[f'form-{i}-player']=player
data[f'form-{i}-position'] = position
management = {
'form-INITIAL_FORMS': '0',
'form-TOTAL_FORMS': len(sample_data),
'form-MAX_NUM_FORMS': ''
}
formset = PositioningFormSet({**management, **data})
self.assertTrue(formset.is_valid())
for form in formset:
self.assertTrue(form.is_valid())
response = self.client.post(reverse('edit lineup', args=[event]), {**management, **data})
self.assertEqual(response.status_code, 200)
for d in sample_data:
with self.subTest(d):
p = Positioning.objects.get(player_id=d[1], event_id=event)
self.assertEqual(d[0], p.order)
self.assertEqual(d[2], p.position)
pass

View File

@@ -5,5 +5,5 @@ from django.urls import path, include
from . import views from . import views
urlpatterns = [ urlpatterns = [
path('edit/<int:id>', views.edit, name="edit lineup"), path('edit/<int:event_id>', views.edit, name="edit lineup"),
] ]

View File

@@ -8,7 +8,7 @@ from events.models import Event
from players.models import Player from players.models import Player
# Create your views here. # Create your views here.
def edit(request, id): def edit(request, event_id):
if request.method == 'POST': if request.method == 'POST':
# create a form instance and populate it with data from the request: # create a form instance and populate it with data from the request:
@@ -18,12 +18,21 @@ def edit(request, id):
# process the data in form.cleaned_data as required # process the data in form.cleaned_data as required
# ... # ...
# redirect to a new URL: # redirect to a new URL:
form.cleaned_data.pop('id') #FIXME this is a workaround, not sure why it is necessary # form.cleaned_data.pop('id')
new_positioning, did_create = Positioning.objects.update_or_create(id=form['id'].data, defaults=form.cleaned_data)
if isinstance(form.cleaned_data['id'], Positioning):
positioning_id = form.cleaned_data.pop('id').id #FIXME this is a workaround, not sure why it is necessary
positioning = Positioning.objects.filter(id=positioning_id)
positioning.update(**form.cleaned_data)
did_create = False
else:
positioning = Positioning.objects.create(**form.cleaned_data, event_id=event_id)
did_create = True
return render(request, 'success.html', {'call_back':'edit lineup','id':event_id}, status=200)
# return render(request, 'success.html', {'call_back':'schedule'}) # return render(request, 'success.html', {'call_back':'schedule'})
event = Event.objects.get(id=id) event = Event.objects.get(id=event_id)
players = Player.objects.all() players = Player.objects.all()
qset = Positioning.objects.filter(event_id=id, order__isnull = False) qset = Positioning.objects.filter(event_id=event_id, order__isnull = False)
formset = PositioningFormSet(queryset=qset) formset = PositioningFormSet(queryset=qset)
for form in formset: for form in formset:
for field in form.fields: for field in form.fields:

View File

@@ -1,3 +1,58 @@
from django.test import TestCase from django.test import TestCase, Client
from django.urls import reverse
from .models import Player
FIXTURES = ['blaseball']
class TestPlayerModel(TestCase):
fixtures = FIXTURES
def test_query_player(self):
"""
Return the desired player
"""
player = Player.objects.get(id=1)
self.assertEqual(player.first_name, "Edric")
self.assertEqual(player.last_name, "Tosser")
self.assertEqual(player.jersey_number, 1)
self.assertEqual(player.team.name, "Chicago Firefighters")
class TestPlayerViews(TestCase):
fixtures = FIXTURES
def test_player_list(self):
response = self.client.get(reverse('players list'))
self.assertEqual(response.status_code, 200)
def test_player_edit(self):
response = self.client.get(reverse('edit player', args=[1]))
self.assertEqual(response.status_code, 200)
# create new player
new_player_data = {
'first_name': "A new player first name",
'last_name': "A new player last name",
'jersey_number':99,
'team':1
}
response = self.client.post(reverse('edit player', args=[0]), data=new_player_data)
self.assertEqual(201, response.status_code)
new_player = Player.objects.get(id=response.context['id'])
self.assertEqual(new_player_data['first_name'], new_player.first_name)
self.assertEqual(new_player_data['last_name'], new_player.last_name)
# modify player
modified_player_data = {
'first_name': "A changed player first name",
'last_name': "A changed player last name",
'jersey_number': 99,
'team': 1
}
response = self.client.post(reverse('edit player', args=[1]), data=modified_player_data)
self.assertEqual(200, response.status_code)
self.assertEqual(1, response.context['id'])
modified_player = Player.objects.get(id=response.context['id'])
self.assertEqual(modified_player_data['first_name'], modified_player.first_name)
self.assertEqual(modified_player_data['last_name'], modified_player.last_name)
# Create your tests here.

View File

@@ -1,5 +1,6 @@
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponse from django.http import HttpResponse
from django.urls import reverse
from .models import Player from .models import Player
from .forms import PlayerForm from .forms import PlayerForm
@@ -30,10 +31,11 @@ def edit(request, id=0):
# check whether it's valid: # check whether it's valid:
if form.is_valid(): if form.is_valid():
# process the data in form.cleaned_data as required # process the data in form.cleaned_data as required
# ... if id == 0: id = None
# redirect to a new URL:
new_player, did_create = Player.objects.update_or_create(pk=id, defaults=form.cleaned_data) new_player, did_create = Player.objects.update_or_create(pk=id, defaults=form.cleaned_data)
return render(request, 'success.html', {'call_back':'players list'}) return render(request, 'success.html', {'call_back':reverse('players list'),'id':new_player.id}, status=201 if did_create else 200)
else:
return HttpResponse(status=400)
# if a GET (or any other method) we'll create a blank form # if a GET (or any other method) we'll create a blank form
else: else:

View File

@@ -1,3 +1,41 @@
from django.urls import reverse
from django.test import TestCase from django.test import TestCase
from .models import Team
# Create your tests here. # Create your tests here.
class TestTeamModel(TestCase):
fixtures = ['blaseball']
def test_query_team(self):
"""
Return the desired team
"""
team = Team.objects.get(id=1)
self.assertEqual(team.name, "Chicago Firefighters")
class TestTeamViews(TestCase):
fixtures = ['blaseball']
def test_team_list(self):
response = self.client.get(reverse('teams list'))
self.assertEqual(response.status_code, 200)
self.assertIn({'id':1, 'title':'Chicago Firefighters'}, response.context['items'])
self.assertIn({'id':2, 'title':'Boston Flowers'}, response.context['items'])
self.assertIn({'id':24, 'title':'Baltimore Crabs'}, response.context['items'])
def test_team_edit(self):
response = self.client.get(reverse('edit team', args=[1]))
self.assertEqual(response.status_code, 200)
#create new team
response = self.client.post(reverse('edit team', args=[0]), data={'name': "A new team"})
self.assertEqual(201, response.status_code)
new_team = Team.objects.get(id=response.context['id'])
self.assertEqual('A new team',new_team.name, )
# modify team
response = self.client.post(reverse('edit team', args=[1]), data={'name': "A different team name"})
self.assertEqual(200, response.status_code)
self.assertEqual(1, response.context['id'])
modified_team = Team.objects.get(id=response.context['id'])
self.assertEqual('A different team name', modified_team.name)

View File

@@ -1,5 +1,6 @@
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponse from django.http import HttpResponse
from django.urls import reverse
from .forms import TeamForm from .forms import TeamForm
from .models import Team from .models import Team
@@ -31,7 +32,7 @@ def edit(request, id=0):
# ... # ...
# redirect to a new URL: # redirect to a new URL:
new_team, did_create = Team.objects.update_or_create(pk=id, defaults=form.cleaned_data) new_team, did_create = Team.objects.update_or_create(pk=id, defaults=form.cleaned_data)
return render(request, 'success.html', {'call_back':'teams list'}) return render(request, 'success.html', {'call_back_url':reverse('teams list'), 'id':new_team.id},status=201 if did_create else 200)
# if a GET (or any other method) we'll create a blank form # if a GET (or any other method) we'll create a blank form
else: else:

View File

@@ -3,10 +3,12 @@
{% block content %} {% block content %}
<head> <head>
<meta http-equiv="refresh" content="2;url={% url call_back %}" />
</head>
<span class="text-success">Success!</span> <span class="text-muted">Redirecting...</span> <meta http-equiv="refresh" content="2;url={{ call_back_url }}" />
</head>
<span class="text-success">Success!</span> <span class="text-muted">Redirecting...</span>
{% endblock %} {% endblock %}

View File

@@ -1,3 +1,40 @@
from django.test import TestCase from django.test import TestCase
from django.urls import reverse
from .models import Venue
# Create your tests here. class TestVenueModel(TestCase):
fixtures = ['blaseball']
def test_query_venue(self):
"""
Return the desired venue
"""
venue = Venue.objects.get(id=1)
self.assertEqual(venue.name, "Chesapeake Racetrack and Ballpark")
class TestVenueViews(TestCase):
fixtures = ['blaseball']
def test_venue_list(self):
response = self.client.get(reverse('venues list'))
self.assertEqual(response.status_code, 200)
self.assertIn({'id':1, 'title':'Chesapeake Racetrack and Ballpark'}, response.context['items'])
self.assertIn({'id':2, 'title':'Tokyo Fitness Center'}, response.context['items'])
self.assertIn({'id':25, 'title':'ILB Historical Preservation Site'}, response.context['items'])
def test_venue_edit(self):
response = self.client.get(reverse('edit venue', args=[1]))
self.assertEqual(response.status_code, 200)
#create new venue
response = self.client.post(reverse('edit venue', args=[0]), data={'name': "A new venue"})
self.assertEqual(201, response.status_code)
new_venue = Venue.objects.get(id=response.context['id'])
self.assertEqual('A new venue',new_venue.name, )
# modify venue
response = self.client.post(reverse('edit venue', args=[1]), data={'name': "A different venue name"})
self.assertEqual(200, response.status_code)
self.assertEqual(1, response.context['id'])
modified_venue = Venue.objects.get(id=response.context['id'])
self.assertEqual('A different venue name', modified_venue.name)

View File

@@ -1,5 +1,6 @@
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.http import HttpResponse, HttpResponseBadRequest from django.http import HttpResponse, HttpResponseBadRequest
from django.urls import reverse
from .models import Venue from .models import Venue
from .forms import VenueForm from .forms import VenueForm
@@ -32,7 +33,7 @@ def edit(request, id=0):
# ... # ...
# redirect to a new URL: # redirect to a new URL:
new_venue, did_create = Venue.objects.update_or_create(pk=id, defaults=form.cleaned_data) new_venue, did_create = Venue.objects.update_or_create(pk=id, defaults=form.cleaned_data)
return render(request, 'success.html', {'call_back':'players list','id':new_venue.id}, status=201 if did_create else 200) return render(request, 'success.html', {'call_back_url':reverse('venues list'), 'id':new_venue.id}, status=201 if did_create else 200)
return HttpResponseBadRequest() return HttpResponseBadRequest()
# if a GET (or any other method) we'll create a blank form # if a GET (or any other method) we'll create a blank form