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:

+
- - - - + + + + - - {% for player in event_players %} - - - - - - {% endfor %} - -
NameBrings Ball
NameBrings Ball
- Ball Image - {{ player.first_name }} {{ player.last_name }} - {% if player.brings_ball == True %} - Yes - {% else %} - No - {% endif %} -
-
- {% if in_event %} - - Remove Event - - {% else %} - - Join Event - - {% endif %} -
- {% else %} -
-

Event Does not exist.

-
- {% endif %} - + + {% for player in event_players %} + + + Ball Image + + {{ player.first_name }} {{ player.last_name }} + + {% if player.brings_ball == True %} + Yes + {% else %} + No + {% endif %} + + + {% endfor %} + + +
+
+ {% if in_event %} + + Remove Event + + {% else %} + + Join Event + + {% endif %} +
+ + {% 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 %} -
-
- -
-
- {% 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; +}