Add view capability

This commit is contained in:
Gabriel Augendre 2022-11-06 15:06:29 +01:00
parent 9033c8453c
commit 833584a2b7
10 changed files with 307 additions and 257 deletions

View file

@ -337,3 +337,6 @@ class Character(models.Model):
return HarmfulState.objects.exclude( return HarmfulState.objects.exclude(
pk__in=self.states.all().values_list("pk", flat=True) pk__in=self.states.all().values_list("pk", flat=True)
) )
def managed_by(self, user):
return self in Character.objects.managed_by(user)

View file

@ -7,9 +7,11 @@
{% block content %} {% block content %}
<h1>{{ character.name }}</h1> <h1>{{ character.name }}</h1>
{% if character|managed_by:user %}
<p> <p>
<a href="{% url "admin:character_character_change" object_id=character.pk %}">Edit</a> <a href="{% url "admin:character_character_change" object_id=character.pk %}">Edit</a>
</p> </p>
{% endif %}
<p> <p>
Joueur : {{ character.player.get_full_name|default:character.player.username }} Joueur : {{ character.player.get_full_name|default:character.player.username }}
</p> </p>
@ -28,6 +30,7 @@
<tr> <tr>
<th scope="row"> <th scope="row">
Initiative divers Initiative divers
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
hx-get="{% url "character:initiative_misc_change" pk=character.pk %}?value=ko" hx-get="{% url "character:initiative_misc_change" pk=character.pk %}?value=ko"
@ -52,6 +55,7 @@
disabled disabled
class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td id="initiative-misc"> <td id="initiative-misc">
{{ character.initiative_misc }} {{ character.initiative_misc }}
@ -62,8 +66,10 @@
<td data-bs-toggle="tooltip" <td data-bs-toggle="tooltip"
data-bs-placement="left" data-bs-placement="left"
data-bs-title="{{ character.modifier_dexterity }} (mod. DEX) + {{ character.initiative_misc }} (divers)" data-bs-title="{{ character.modifier_dexterity }} (mod. DEX) + {{ character.initiative_misc }} (divers)"
{% if character|managed_by:user %}
hx-get="{% url "character:get_initiative" pk=character.pk %}" hx-get="{% url "character:get_initiative" pk=character.pk %}"
hx-trigger="update_initiative from:#fight-table"> hx-trigger="update_initiative from:#fight-table"
{% endif %}>
{{ character.modifier_initiative|modifier }} {{ character.modifier_initiative|modifier }}
</td> </td>
</tr> </tr>
@ -103,6 +109,7 @@
<tr> <tr>
<th scope="row"> <th scope="row">
Armure Armure
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
hx-get="{% url "character:armor_change" pk=character.pk %}?value=ko" hx-get="{% url "character:armor_change" pk=character.pk %}?value=ko"
@ -127,6 +134,7 @@
disabled disabled
class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td id="armor"> <td id="armor">
{{ character.armor }} {{ character.armor }}
@ -135,6 +143,7 @@
<tr> <tr>
<th scope="row"> <th scope="row">
Bouclier Bouclier
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
hx-get="{% url "character:shield_change" pk=character.pk %}?value=ko" hx-get="{% url "character:shield_change" pk=character.pk %}?value=ko"
@ -159,6 +168,7 @@
disabled disabled
class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td id="shield"> <td id="shield">
{{ character.shield }} {{ character.shield }}
@ -167,6 +177,7 @@
<tr> <tr>
<th scope="row"> <th scope="row">
Divers défense Divers défense
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
hx-get="{% url "character:defense_misc_change" pk=character.pk %}?value=ko" hx-get="{% url "character:defense_misc_change" pk=character.pk %}?value=ko"
@ -191,6 +202,7 @@
disabled disabled
class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td id="defense-misc"> <td id="defense-misc">
{{ character.defense_misc }} {{ character.defense_misc }}
@ -201,8 +213,10 @@
<td data-bs-toggle="tooltip" <td data-bs-toggle="tooltip"
data-bs-placement="left" data-bs-placement="left"
data-bs-title="10 + armure + bouclier + mod. DEX + divers" data-bs-title="10 + armure + bouclier + mod. DEX + divers"
{% if character|managed_by:user %}
hx-get="{% url "character:get_defense" pk=character.pk %}" hx-get="{% url "character:get_defense" pk=character.pk %}"
hx-trigger="update_defense from:#fight-table"> hx-trigger="update_defense from:#fight-table"
{% endif %}>
{{ character.defense }} {{ character.defense }}
</td> </td>
</tr> </tr>
@ -218,6 +232,7 @@
<tr> <tr>
<th scope="row"> <th scope="row">
Points de vie Points de vie
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
hx-get="{% url "character:health_change" pk=character.pk %}?value=ko" hx-get="{% url "character:health_change" pk=character.pk %}?value=ko"
@ -244,12 +259,14 @@
type="button" type="button"
class="btn btn-outline-success"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-success"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td><span id="health-remaining">{{ character.health_remaining }}</span> / {{ character.health_max }}</td> <td><span id="health-remaining">{{ character.health_remaining }}</span> / {{ character.health_max }}</td>
</tr> </tr>
<tr> <tr>
<th scope="row"> <th scope="row">
Points de mana Points de mana
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
hx-get="{% url "character:mana_change" pk=character.pk %}?value=ko" hx-get="{% url "character:mana_change" pk=character.pk %}?value=ko"
@ -276,6 +293,7 @@
type="button" type="button"
class="btn btn-outline-success"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-success"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td data-bs-toggle="tooltip" <td data-bs-toggle="tooltip"
data-bs-placement="left" data-bs-placement="left"
@ -291,6 +309,7 @@
<tr> <tr>
<th scope="row"> <th scope="row">
Points de récup. Points de récup.
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
type="button" type="button"
@ -313,6 +332,7 @@
disabled disabled
class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-secondary"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td> <td>
<span id="recovery-points-remaining">{{ character.recovery_points_remaining }}</span> / {{ character.recovery_points_max }}</td> <span id="recovery-points-remaining">{{ character.recovery_points_remaining }}</span> / {{ character.recovery_points_max }}</td>
@ -320,6 +340,7 @@
<tr> <tr>
<th scope="row"> <th scope="row">
Points de chance Points de chance
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm float-end" role="group"> <div class="btn-group btn-group-sm float-end" role="group">
<button <button
type="button" type="button"
@ -344,6 +365,7 @@
type="button" type="button"
class="btn btn-outline-success"><i class="fa-solid fa-battery-full"></i></button> class="btn btn-outline-success"><i class="fa-solid fa-battery-full"></i></button>
</div> </div>
{% endif %}
</th> </th>
<td data-bs-toggle="tooltip" <td data-bs-toggle="tooltip"
data-bs-placement="left" data-bs-placement="left"

View file

@ -1,6 +1,8 @@
{% load character_extras %}
<div class="card" id="damage-reduction"> <div class="card" id="damage-reduction">
<h5 class="card-header"> <h5 class="card-header">
Réduction de dégâts Réduction de dégâts
{% if character|managed_by:user %}
<a hx-get="{% url "character:damage_reduction_change" pk=character.pk %}" <a hx-get="{% url "character:damage_reduction_change" pk=character.pk %}"
hx-target="#damage-reduction" hx-target="#damage-reduction"
hx-swap="outerHTML" hx-swap="outerHTML"
@ -8,6 +10,7 @@
> >
<i class="fa-solid fa-pen-to-square"></i> Edit <i class="fa-solid fa-pen-to-square"></i> Edit
</a> </a>
{% endif %}
</h5> </h5>
<div class="card-body"> <div class="card-body">
<p class="card-text"> <p class="card-text">

View file

@ -1,6 +1,8 @@
{% load character_extras %}
<div class="card" id="equipment"> <div class="card" id="equipment">
<h5 class="card-header"> <h5 class="card-header">
Équipement Équipement
{% if character|managed_by:user %}
<a hx-get="{% url "character:equipment_change" pk=character.pk %}" <a hx-get="{% url "character:equipment_change" pk=character.pk %}"
hx-target="#equipment" hx-target="#equipment"
hx-swap="outerHTML" hx-swap="outerHTML"
@ -8,6 +10,7 @@
> >
<i class="fa-solid fa-pen-to-square"></i> Edit <i class="fa-solid fa-pen-to-square"></i> Edit
</a> </a>
{% endif %}
</h5> </h5>
<div class="card-body"> <div class="card-body">
<p class="card-text"> <p class="card-text">

View file

@ -1,6 +1,8 @@
{% load character_extras %}
<div class="mt-3" id="notes"> <div class="mt-3" id="notes">
<h2> <h2>
Notes Notes
{% if character|managed_by:user %}
<a hx-get="{% url "character:notes_change" pk=character.pk %}" <a hx-get="{% url "character:notes_change" pk=character.pk %}"
hx-target="#notes" hx-target="#notes"
hx-swap="outerHTML" hx-swap="outerHTML"
@ -8,6 +10,7 @@
> >
<i class="fa-solid fa-pen-to-square"></i> Edit <i class="fa-solid fa-pen-to-square"></i> Edit
</a> </a>
{% endif %}
</h2> </h2>
{{ character.get_formatted_notes|safe }} {{ character.get_formatted_notes|safe }}
</div> </div>

View file

@ -2,6 +2,7 @@
<div class="col-12 col-md-6 col-xl-4"> <div class="col-12 col-md-6 col-xl-4">
<h5> <h5>
{{ path.display_name }} ({{ path|max_rank:character }}) {{ path.display_name }} ({{ path|max_rank:character }})
{% if character|managed_by:user %}
<div class="btn-group btn-group-sm"> <div class="btn-group btn-group-sm">
<button hx-get="{% url "character:remove_last_in_path" character_pk=character.pk path_pk=path.pk %}" <button hx-get="{% url "character:remove_last_in_path" character_pk=character.pk path_pk=path.pk %}"
hx-target="#paths-and-capabilities" hx-target="#paths-and-capabilities"
@ -18,6 +19,7 @@
</button> </button>
{% endif %} {% endif %}
</div> </div>
{% endif %}
</h5> </h5>
{% if path.notes %} {% if path.notes %}
<div class="alert alert-primary">{{ path.notes }}</div> <div class="alert alert-primary">{{ path.notes }}</div>

View file

@ -1,5 +1,7 @@
{% load character_extras %}
{% load django_bootstrap5 %} {% load django_bootstrap5 %}
<div id="paths-and-capabilities"> <div id="paths-and-capabilities">
{% if character|managed_by:user %}
<form> <form>
{% csrf_token %} {% csrf_token %}
<div class="row"> <div class="row">
@ -18,6 +20,7 @@
</div> </div>
</div> </div>
</form> </form>
{% endif %}
<div class="row mt-2 gy-3"> <div class="row mt-2 gy-3">
{% for path, capabilities in character.get_capabilities_by_path.items %} {% for path, capabilities in character.get_capabilities_by_path.items %}
{% include "character/snippets/character_details/path.html" %} {% include "character/snippets/character_details/path.html" %}

View file

@ -1,3 +1,4 @@
{% load character_extras %}
<div class="col"> <div class="col">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
@ -21,18 +22,22 @@
{% endfor %} {% endfor %}
{% endwith %} {% endwith %}
</p> </p>
{% if character.player == user %}
<div class="btn-group btn-group-sm"> <div class="btn-group btn-group-sm">
{% if character|managed_by:user %}
<a href="{% url "character:view" pk=character.pk %}" class="btn btn-success"> <a href="{% url "character:view" pk=character.pk %}" class="btn btn-success">
<i class="fa-solid fa-user"></i> Jouer <i class="fa-solid fa-user"></i> {% if character.player == user %}Jouer{% else %}Gérer{% endif %}
</a> </a>
{% if party %} {% if party %}
<a href="{% url "party:leave" pk=party.pk character_pk=character.pk %}" class="btn btn-warning"> <a href="{% url "party:leave" pk=party.pk character_pk=character.pk %}" class="btn btn-warning">
<i class="fa-solid fa-person-walking-arrow-right"></i> Quitter le groupe <i class="fa-solid fa-person-walking-arrow-right"></i> Quitter le groupe
</a> </a>
{% endif %} {% endif %}
</div> {% else %}
<a href="{% url "character:view" pk=character.pk %}" class="btn btn-primary">
<i class="fa-solid fa-eye"></i> Observer
</a>
{% endif %} {% endif %}
</div> </div>
</div> </div>
</div> </div>
</div>

View file

@ -1,6 +1,7 @@
from django import template from django import template
from character.models import Character, Path, Weapon from character.models import Character, Path, Weapon
from common.models import User
register = template.Library() register = template.Library()
@ -37,3 +38,8 @@ def has_next_capability(path: Path, character: Character) -> bool:
@register.filter @register.filter
def max_rank(path: Path, character: Character) -> int: def max_rank(path: Path, character: Character) -> int:
return path.max_rank(character) return path.max_rank(character)
@register.filter
def managed_by(character: Character, user: User) -> bool:
return character.managed_by(user)

View file

@ -27,7 +27,7 @@ def character_create(request):
@login_required @login_required
def character_view(request, pk: int): def character_view(request, pk: int):
character = get_object_or_404( character = get_object_or_404(
Character.objects.managed_by(request.user) Character.objects.all()
.select_related("player", "racial_capability", "profile", "race") .select_related("player", "racial_capability", "profile", "race")
.prefetch_related("capabilities__path", "weapons"), .prefetch_related("capabilities__path", "weapons"),
pk=pk, pk=pk,