From 818cffc5041d9eba2a6853eb7364f7e2d3404012 Mon Sep 17 00:00:00 2001
From: Amit Kaplansky <106595737+amitKaplansky@users.noreply.github.com>
Date: Fri, 2 Jun 2023 10:58:18 +0300
Subject: [PATCH] Modify game event template Implement logic in join event
---
conftest.py | 22 ++-
.../templates/game_event/game-event.html | 133 ++++++++++--------
.../templates/game_event/join-event.html | 1 +
game_event/templates/game_event/result.html | 64 ---------
game_event/tests.py | 42 ++++--
game_event/views.py | 71 +++++-----
static/css/game-event.css | 40 ++++++
7 files changed, 205 insertions(+), 168 deletions(-)
delete mode 100644 game_event/templates/game_event/result.html
diff --git a/conftest.py b/conftest.py
index 6dda5b9..bc018a2 100644
--- a/conftest.py
+++ b/conftest.py
@@ -57,9 +57,29 @@ def game_event(court, court_ball_game):
level_of_game=5,
min_number_of_players=3,
max_number_of_players=5,
- court=court, ball_game="Basketball")
+ court=court, ball_game=BallGame.Basketball)
@pytest.fixture
def game_event_player(game_event, player):
return GameEventPlayer.objects.create(game_event=game_event, player=player, ball_responsible=False)
+
+
+@pytest.fixture
+def five_players():
+ players = []
+ for i in range(1,6):
+ players.append(Player.create(
+ username=f'Player{i}',
+ password='password',
+ birth_date='1990-01-01',
+ favorite_ball_game=BallGame.Basketball))
+ return players
+
+@pytest.fixture
+def five_game_event_players(game_event, five_players):
+ players = []
+ for i in range(5):
+ players.append(GameEventPlayer.objects.create(game_event=game_event,
+ player=five_players[i], ball_responsible=False))
+ return players
\ No newline at end of file
diff --git a/game_event/templates/game_event/game-event.html b/game_event/templates/game_event/game-event.html
index 618e2fe..a0464f8 100644
--- a/game_event/templates/game_event/game-event.html
+++ b/game_event/templates/game_event/game-event.html
@@ -2,72 +2,89 @@
{% block content %}
{% load static %}
+
-
+
+
Game Event
-
-
+
+
+
+
{% if time %}
- Event Details
- Time: {{ time }}
- Level: {{ level_of_game }}
- Min Players: {{ min_number_of_players }}
- Max Players: {{ max_number_of_players }}
- Court: {{ court }} {{ neighborhood }}
- Game: {{ ball_game }}
- Players:
+ Event Details
+ Time: {{ time }}
+ Level: {{ level_of_game }}
+ Min Players: {{ min_number_of_players }}
+ Max Players: {{ max_number_of_players }}
+ Court: {{ court }} {{ neighborhood }}
+ Game: {{ ball_game }}
+ Players:
+
- |
- Name |
- Brings Ball |
-
+ |
+ Name |
+ Brings Ball |
+
-
- {% for player in event_players %}
-
-
-
- |
- {{ player.first_name }} {{ player.last_name }} |
-
- {% if player.brings_ball == True %}
- Yes
- {% else %}
- No
- {% endif %}
- |
-
- {% endfor %}
-
-
-
- {% else %}
-
-
Event Does not exist.
-
- {% endif %}
-
+
+ {% for player in event_players %}
+
+
+
+ |
+ {{ player.first_name }} {{ player.last_name }} |
+
+ {% if player.brings_ball == True %}
+ Yes
+ {% else %}
+ No
+ {% endif %}
+ |
+
+ {% endfor %}
+
+
+
+
+
+ {% for message in messages %}
+
+ {{ message }}
+
+ {% endfor %}
+
+ {% else %}
+
+
Event Does not exist.
+
+ {% endif %}
+
+
+
-{%endblock%}
+{%endblock%}
\ No newline at end of file
diff --git a/game_event/templates/game_event/join-event.html b/game_event/templates/game_event/join-event.html
index 53cc387..9edc16f 100644
--- a/game_event/templates/game_event/join-event.html
+++ b/game_event/templates/game_event/join-event.html
@@ -3,6 +3,7 @@
+
{% if event_exists %}
diff --git a/game_event/templates/game_event/result.html b/game_event/templates/game_event/result.html
deleted file mode 100644
index 6362fd8..0000000
--- a/game_event/templates/game_event/result.html
+++ /dev/null
@@ -1,64 +0,0 @@
-{% load static %}
-
-
-
-
-
-
-
- {% if event_exists == False %}
-
-
Can not remove from event, Event Does not Exist!
-
- {% else %}
-
- {% if messages %}
-
-
-
-
- {% for message in messages %}
- - {{ message }}
- {% endfor %}
-
-
-
-
- {% else %}
- {% if in_event %}
-
You joined the event!
- {% else %}
-
You are not in the event!
- {% endif %}
- {% endif %}
-
- {% endif %}
-
-
diff --git a/game_event/tests.py b/game_event/tests.py
index 4c1c07e..188c31b 100644
--- a/game_event/tests.py
+++ b/game_event/tests.py
@@ -9,6 +9,7 @@
from datetime import timedelta
import pytest
from django.db import IntegrityError
+from django.http import HttpResponseRedirect
TEST_ID = 2
TEST_TIME = timezone.now()
@@ -198,7 +199,7 @@ def test_success_loading_site_join_game_event(self, client, saved_game_event, pl
client.force_login(player.user)
game_event_id = saved_game_event.id
url = reverse('join_event', args=[game_event_id])
- response = client.get(url)
+ response = client.get(url, follow=True)
assert response.status_code == 200
def test_fail_loading_site_join_game_event(self, client, player):
@@ -211,32 +212,32 @@ def test_success_loading_site_remove_game_event(self, client, saved_game_event,
client.force_login(saved_game_event_player.player.user)
game_event_id = saved_game_event.id
url = reverse('remove_from_event', args=[game_event_id])
- response = client.get(url)
+ response = client.get(url, follow=True)
assert response.status_code == 200
def test_fail_loading_site_remove_game_event_from_player(self, client, player):
client.force_login(player.user)
- response = client.get('/game-events/remove-from-event/-1/')
+ response = client.get('/game-events/remove-from-event/-1/', follow=True)
assert response.status_code == 200
- assert b"Can not remove from event, Event Does not Exist! " in response.content
+ assert b"Event Does not exist." in response.content
def test_fail_loading_remove_from_event_after_deleting_the_game_event(self, client, saved_game_event,
saved_game_event_player):
client.force_login(saved_game_event_player.player.user)
game_event_id = saved_game_event.id
url = reverse('remove_from_event', args=[game_event_id])
- response = client.get(url)
+ response = client.get(url, follow=True)
assert response.status_code == 200
saved_game_event.delete()
- response = client.get(url)
+ response = client.get(url, follow=True)
assert response.status_code == 200
- assert b"Can not remove from event, Event Does not Exist! " in response.content
+ assert b"Event Does not exist." in response.content
def test_remove_player_from_event(self, client, saved_game_event, saved_game_event_player):
client.force_login(saved_game_event_player.player.user)
game_event_id = saved_game_event.id
url = reverse('remove_from_event', args=[game_event_id])
- response = client.get(url)
+ response = client.get(url, follow=True)
assert response.status_code == 200
with pytest.raises(ObjectDoesNotExist):
GameEventPlayer.objects.get(game_event=saved_game_event, player=saved_game_event_player.player)
@@ -252,7 +253,7 @@ def test_add_player_to_event(self, client, saved_game_event, player):
client.force_login(player.user)
game_event_id = saved_game_event.id
url = reverse('process_answer_game_event', args=[game_event_id])
- response = client.post(url, {'answer': 'yes'})
+ response = client.post(url, {'answer': 'yes'}, follow=True)
assert response.status_code == 200
assert response.context['in_event']
assert GameEventPlayer.objects.filter(game_event=saved_game_event, player=player).exists()
@@ -261,7 +262,24 @@ def test_fail_add_player_to_event_already_in_it(self, client, saved_game_event,
client.force_login(player.user)
game_event_id = saved_game_event.id
url = reverse('process_answer_game_event', args=[game_event_id])
- response = client.post(url, {'answer': 'yes'})
+ response = client.post(url, {'answer': 'yes'}, follow=True)
+ assert response.status_code == 200
+ response = client.post(url, {'answer': 'yes'}, follow=True)
+ assert response.status_code == 200
+ assert b"Already in event!" in response.content
+
+ def test_player_can_not_join_full_event(self, client, five_game_event_players, player, game_event):
+ client.force_login(player.user)
+ url = reverse('process_answer_game_event', args=[game_event.id])
+ response = client.post(url, {'answer': 'yes'}, follow=True)
+ assert response.status_code == 200
+ assert b"The event is full! can not join" in response.content
+
+ def test_event_time_constraint(self, client, saved_game_event, saved_game_event_player, court, court_ball_game):
+ client.force_login(saved_game_event_player.player.user)
+ event = GameEvent.create(time=saved_game_event.time + timedelta(hours=2), level_of_game=0, min_number_of_players=2,
+ max_number_of_players=5, court=court, ball_game=BallGame.Basketball)
+ url = reverse('process_answer_game_event', args=[event.id])
+ response = client.post(url, {'answer': 'yes'}, follow=True)
assert response.status_code == 200
- with pytest.raises(IntegrityError):
- response = client.post(url, {'answer': 'yes'})
+ assert b"You have scheduling conflicts. Resolve them before joining the event" in response.content
diff --git a/game_event/views.py b/game_event/views.py
index 42bdca4..478e072 100644
--- a/game_event/views.py
+++ b/game_event/views.py
@@ -86,7 +86,32 @@ def game_event(request, id):
'in_event': False,
}
return render(request, 'game_event/game-event.html', context)
+
+ context = add_content(event, player)
+
+ return render(request, 'game_event/game-event.html', context)
+
+
+def join_event(request, id):
+ try:
+ GameEvent.objects.get(pk=id)
+ except GameEvent.DoesNotExist:
+ return render(request, 'game_event/join-event.html', {'id': id, 'event_exists': False})
+
+ return render(request, 'game_event/join-event.html', {'id': id, 'event_exists': True})
+
+def remove_from_event(request, id):
+ try:
+ event = GameEvent.objects.get(pk=id)
+ except GameEvent.DoesNotExist:
+ return redirect(f"/game-events/{id}", {})
+ player = Player.objects.get(user=request.user)
+ GameEventPlayer.objects.get(game_event=event, player=player).delete()
+ messages.success(request, 'You are removed from the event')
+ return redirect(f"/game-events/{id}", add_content(event, player) )
+
+def add_content(event, player):
event_players = [
{
"first_name": entry.player.user.first_name,
@@ -108,44 +133,26 @@ def game_event(request, id):
'in_event': in_event,
'event_players': event_players
}
- return render(request, 'game_event/game-event.html', context)
-
-
-def join_event(request, id):
- try:
- GameEvent.objects.get(pk=id)
- except GameEvent.DoesNotExist:
- return render(request, 'game_event/join-event.html', {'id': id, 'event_exists': False})
-
- return render(request, 'game_event/join-event.html', {'id': id, 'event_exists': True})
-
-
-def remove_from_event(request, id):
- try:
- event = GameEvent.objects.get(pk=id)
- except GameEvent.DoesNotExist:
- return render(request, 'game_event/result.html', {'event_exists': False})
- player = Player.objects.get(user=request.user)
- GameEventPlayer.objects.get(game_event=event, player=player).delete()
- return render(request, 'game_event/result.html', {'event_exists': True})
-
+ return context
def process_answer_game_event(request, id):
try:
event = GameEvent.objects.get(pk=id)
except GameEvent.DoesNotExist:
- return render(request, 'game_event/result.html', {'event_exists': False})
-
+ return redirect(f"/game-events/{id}", {} )
+ content = {}
player = Player.objects.get(user=request.user)
ball_responsible = request.POST.get('answer') == 'yes'
- content = {}
-
+ if GameEventPlayer.objects.filter(game_event=event, player=player):
+ messages.error(request, "Already in event!")
+ return redirect(f"/game-events/{id}", add_content(event, player) )
+
is_event_full = event.is_event_full()
is_event_time_available = player.is_event_time_available(event.time)
-
+
error_messages = []
if is_event_full:
- error_messages.append("The event is full! cannot join event")
+ error_messages.append("The event is full! can not join")
if not is_event_time_available:
error_messages.append("You have scheduling conflicts. Resolve them before joining the event")
@@ -154,12 +161,10 @@ def process_answer_game_event(request, id):
messages.error(request, error)
else:
GameEventPlayer.objects.create(game_event=event, player=player, ball_responsible=ball_responsible).save()
- in_event = GameEventPlayer.objects.filter(game_event=event, player=player).exists()
- content["in_event"] = in_event
-
- content['event_exists'] = True
-
- return render(request, 'game_event/result.html', content)
+ messages.success(request, "You joined the event")
+
+ content.update(add_content(event, player))
+ return redirect(f"/game-events/{id}", content )
diff --git a/static/css/game-event.css b/static/css/game-event.css
index 6ee9282..c2ab61d 100644
--- a/static/css/game-event.css
+++ b/static/css/game-event.css
@@ -40,3 +40,43 @@
width: 20px;
height: 20px;
}
+
+.button-container {
+ margin-top: 50px;
+ display: flex;
+ flex-direction: column;
+}
+
+.button-container .round-button {
+ margin-bottom: 20px;
+ width: 150px;
+ font-size: 16px;
+ display: flex;
+ justify-content: center;
+ font-weight: bold;
+ align-items: center;
+}
+
+.table-container {
+ margin-top: 30px;
+}
+
+.message-container.success {
+ color: #80c698;
+}
+
+.message-container.error {
+ color: #fc7c7c;
+}
+
+.message-container {
+ margin-top: 10px;
+ padding: 15px;
+ margin-bottom: 5px;
+ font-size: 20px;
+ font-weight: bold;
+ font-family: "Haas Grot Text R Web", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ text-align: left;
+ width: fit-content;
+ line-height: 0.2;
+}