mirror of
https://github.com/Crocmagnon/charasheet.git
synced 2024-12-22 22:01:48 +01:00
parent
ba3916c4b6
commit
12d6ee7a91
7 changed files with 74 additions and 5 deletions
|
@ -147,13 +147,12 @@ def test_delete_character(selenium: WebDriver, live_server: LiveServer):
|
|||
|
||||
|
||||
@pytest.mark.django_db
|
||||
@pytest.mark.parametrize("profile_name", ["Magicien", "Druide", "Guerrier"])
|
||||
def test_reset_stats_view(
|
||||
profile_name: str, selenium: WebDriver, live_server: LiveServer, initial_data: None
|
||||
selenium: WebDriver, live_server: LiveServer, initial_data: None
|
||||
):
|
||||
username, password = "user", "some_password"
|
||||
player = User.objects.create_user(username, password=password)
|
||||
profile = Profile.objects.get(name__iexact=profile_name)
|
||||
profile = Profile.objects.get(name__iexact="Magicien")
|
||||
character = create_hurt_character(player, profile)
|
||||
|
||||
login(selenium, live_server, username, password)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.urls import reverse
|
||||
from django_extensions.db.models import TimeStampedModel
|
||||
|
||||
from character.models import Character
|
||||
|
@ -53,3 +54,10 @@ class Party(UniquelyNamedModel, TimeStampedModel, models.Model):
|
|||
class Meta(UniquelyNamedModel.Meta, TimeStampedModel.Meta):
|
||||
verbose_name = "Groupe"
|
||||
verbose_name_plural = "Groupes"
|
||||
|
||||
def get_absolute_url(self) -> str:
|
||||
return reverse("party:details", kwargs={"pk": self.pk})
|
||||
|
||||
def reset_stats(self):
|
||||
for character in self.characters.all():
|
||||
character.reset_stats()
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
{% block content %}
|
||||
<h1>{{ party.name }}</h1>
|
||||
<p>MJ : {{ party.game_master.get_full_name|default:party.game_master.username }}</p>
|
||||
<p>
|
||||
<a href="{% url "party:reset_stats" pk=party.pk %}" id="reset-stats">Réinitialiser les stats</a>
|
||||
</p>
|
||||
<h2>Personnages</h2>
|
||||
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 row-cols-xl-4 g-4">
|
||||
{% for character in party.characters.all %}
|
||||
|
|
17
src/party/templates/party/party_reset_stats.html
Normal file
17
src/party/templates/party/party_reset_stats.html
Normal file
|
@ -0,0 +1,17 @@
|
|||
{% extends "common/base.html" %}
|
||||
|
||||
{% block title %}Réinitialisation des stats des membres de {{ party.name }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h1>Réinitialisation des stats des membres de {{ party.name }}</h1>
|
||||
<form action="{% url "party:reset_stats" pk=party.pk %}" method=post>
|
||||
{% csrf_token %}
|
||||
<p>
|
||||
Êtes-vous certain de vouloir réinitialiser les stats de tous les membres de {{ party.name }} ?<br>
|
||||
Cette action est irréversible.
|
||||
</p>
|
||||
<button class="btn btn-primary" type="submit">
|
||||
<i class="fa-solid fa-suitcase-medical"></i> Réinitialiser les stats
|
||||
</button>
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -7,8 +7,8 @@ from selenium.webdriver.common.by import By
|
|||
from selenium.webdriver.firefox.webdriver import WebDriver
|
||||
from selenium.webdriver.support.select import Select
|
||||
|
||||
from character.models import Character
|
||||
from character.tests.test_interactions import login
|
||||
from character.models import Character, Profile
|
||||
from character.tests.test_interactions import create_hurt_character, login
|
||||
from common.models import User
|
||||
from party.models import Party
|
||||
|
||||
|
@ -90,3 +90,31 @@ def test_gm_observe_invited_character_in_two_groups(
|
|||
).click()
|
||||
title = selenium.find_element(By.TAG_NAME, "h1").text.strip()
|
||||
assert title == character.name
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reset_stats_view(
|
||||
selenium: WebDriver, live_server: LiveServer, initial_data: None
|
||||
):
|
||||
user, password = "gm", "password"
|
||||
gm = User.objects.create_user(user, password=password)
|
||||
assert Profile.objects.count() > 1
|
||||
for profile in Profile.objects.all():
|
||||
player = User.objects.create_user(f"user{profile}", password="password")
|
||||
create_hurt_character(player, profile)
|
||||
party = baker.make(Party, game_master=gm)
|
||||
party.characters.set(Character.objects.all())
|
||||
|
||||
login(selenium, live_server, user, password)
|
||||
|
||||
url = reverse("party:details", kwargs={"pk": party.pk})
|
||||
selenium.get(live_server.url + url)
|
||||
selenium.find_element(By.ID, "reset-stats").click()
|
||||
selenium.find_element(By.CSS_SELECTOR, "[type=submit]").click()
|
||||
assert selenium.current_url == live_server.url + party.get_absolute_url()
|
||||
|
||||
for character in Character.objects.all():
|
||||
assert character.health_remaining == character.health_max
|
||||
assert character.mana_remaining == character.mana_max
|
||||
assert character.recovery_points_remaining == character.recovery_points_max
|
||||
assert character.luck_points_remaining == character.luck_points_max
|
||||
|
|
|
@ -9,6 +9,7 @@ urlpatterns = [
|
|||
path("<int:pk>/", views.party_details, name="details"),
|
||||
path("<int:pk>/change/", views.party_change, name="change"),
|
||||
path("<int:pk>/delete/", views.party_delete, name="delete"),
|
||||
path("<int:pk>/reset_stats/", views.party_reset_stats, name="reset_stats"),
|
||||
path("<int:pk>/leave/<int:character_pk>/", views.party_leave, name="leave"),
|
||||
path("<int:pk>/join/<int:character_pk>/", views.party_join, name="join"),
|
||||
path("<int:pk>/refuse/<int:character_pk>/", views.party_refuse, name="refuse"),
|
||||
|
|
|
@ -55,6 +55,19 @@ def party_delete(request, pk):
|
|||
return render(request, "party/party_delete.html", context)
|
||||
|
||||
|
||||
@login_required
|
||||
def party_reset_stats(request, pk):
|
||||
party = get_object_or_404(Party.objects.managed_by(request.user), pk=pk)
|
||||
context = {"party": party}
|
||||
if request.method == "POST":
|
||||
name = party.name
|
||||
party.reset_stats()
|
||||
message = f"Les stats de tous les membres de {name} ont été réinitialisées."
|
||||
messages.success(request, message)
|
||||
return redirect(party)
|
||||
return render(request, "party/party_reset_stats.html", context)
|
||||
|
||||
|
||||
@login_required
|
||||
def party_change(request, pk):
|
||||
party = get_object_or_404(Party.objects.managed_by(request.user), pk=pk)
|
||||
|
|
Loading…
Reference in a new issue