refining adventure

This commit is contained in:
Niko Abeler 2023-06-11 20:01:36 +02:00
parent fc748f8596
commit 765cb98e13
12 changed files with 122 additions and 42 deletions

View File

@ -83,9 +83,9 @@ class PlaySession(models.Model):
def get_absolute_url(self): def get_absolute_url(self):
return reverse( return reverse(
"guild:playsession_detail", "guild:adventure_detail",
kwargs={"pk": self.adventure.pk, "playsession_pk": self.pk} kwargs={"pk": self.adventure.pk}
) ) + "#playsession" + str(self.pk)
class ResourceEarned(models.Model): class ResourceEarned(models.Model):

View File

@ -3,25 +3,63 @@
{% load guild_extras %} {% load guild_extras %}
{% block content %} {% block content %}
<h1>Adventure: {{ adventure.name }}</h1>
<div class="row">
<div class="column column-75">
<h1>Adventure: {{ adventure.name }}</h1>
</div>
<div class="column">
<a class="button button-outline" href="{% url 'guild:adventure_update' adventure.id %}">Edit</a>
</div>
<div class="column">
<a class="button button-clear" href="{% url 'guild:adventure_delete' adventure.id %}">Delete</a>
</div>
</div>
<p>{{adventure.description|md|safe}}</p> <p>{{adventure.description|md|safe}}</p>
<a href="{% url 'guild:create_playsession' adventure.id %}">Add new Session</a>
<div class="row">
<div class="column column-75">
<h2>Sessions</h2>
</div>
<div class="column">
<a class="button" href="{% url 'guild:create_playsession' adventure.id %}">Add new Session</a>
</div>
</div>
{% if not adventure.playsession_set.count %} {% if not adventure.playsession_set.count %}
<p>No sessions found.</p> <p>No sessions yet.</p>
{% else %} {% else %}
<ul>
{% for playsession in adventure.playsession_set.all %} {% for playsession in adventure.playsession_set.all %}
<li> <div class="row">
<a href="{% url 'guild:playsession_detail' adventure.id playsession.id %}"> <div class="column column-75">
{{ playsession.date }} <h3>{{ playsession.date }}</h3>
</a> </div>
</li> <div class="column">
<a class="button button-outline" href="{% url 'guild:playsession_update' adventure.id playsession.id %}">Edit</a>
</div>
<div class="column">
<a class="button button-clear" href="{% url 'guild:playsession_delete' adventure.id playsession.id %}">Delete</a>
</div>
</div>
<h4>Characters</h4>
<ul>
{% for character in playsession.characters.all %}
<li>{{character.name}}</li>
{% endfor %}
</ul>
<h4>Summary</h4>
<p>{{playsession.summary|md|safe}}</p>
<hr>
{% endfor %} {% endfor %}
</ul>
{% endif %} {% endif %}

View File

@ -4,6 +4,10 @@
<form action="" method="post"> <form action="" method="post">
{% csrf_token %} {% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<input type="submit" value="Create Adventure"> {% if object %}
<input type="submit" value="Update Adventure">
{% else %}
<input type="submit" value="Create Adventure">
{% endif %}
</form> </form>
{% endblock content %} {% endblock content %}

View File

@ -15,5 +15,15 @@
</li> </li>
</ul> </ul>
<h2>Adventures</h2>
<ul>
{% for adventure in adventures %}
<li>
<a href="{% url 'guild:adventure_detail' adventure.id %}">{{ adventure.name }}</a>
</li>
{% endfor %}
</ul>
{% endblock content %} {% endblock content %}

View File

@ -0,0 +1,14 @@
{% extends 'base.html' %}
{% block content %}
<h1>Session Delete</h1>
<p>Are you sure you want to delete <strong>"{{ playsession.date }}"</strong> of the adventure <strong>{{ playsession.adventure.name}}</strong>?</p>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Delete Session">
</form>
{% endblock content %}

View File

@ -1,17 +0,0 @@
{% extends 'base.html' %}
{% load guild_extras %}
{% block content %}
<h1>Session: {{ playsession.name }}</h1>
<h2>
Adventure:
<a href="{% url 'guild:adventure_detail' playsession.adventure.id %}">
{{ playsession.adventure.name }}
</a>
</h2>
<p>{{playsession.summary|md|safe}}</p>
{% endblock content %}

View File

@ -4,6 +4,6 @@
<form action="" method="post"> <form action="" method="post">
{% csrf_token %} {% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<input type="submit" value="Create Adventure"> <input type="submit" value="Create Session">
</form> </form>
{% endblock content %} {% endblock content %}

View File

@ -13,6 +13,9 @@ urlpatterns = [
path("characters/<int:pk>/", character_views.CharacterDetailView.as_view(), name="character_detail"), path("characters/<int:pk>/", character_views.CharacterDetailView.as_view(), name="character_detail"),
path("adventures/create/", adventure_views.CreateAdventureView.as_view(), name="create_adventure"), path("adventures/create/", adventure_views.CreateAdventureView.as_view(), name="create_adventure"),
path("adventures/<int:pk>/", adventure_views.AdventureDetailView.as_view(), name="adventure_detail"), path("adventures/<int:pk>/", adventure_views.AdventureDetailView.as_view(), name="adventure_detail"),
path("adventures/<int:pk>/playsession/create/", adventure_views.CreatePlaySessionView.as_view(), name="create_playsession"), path("adventures/<int:pk>/update/", adventure_views.AdventureUpdateView.as_view(), name="adventure_update"),
path("adventures/<int:pk>/playsession/<int:playsession_pk>/", adventure_views.PlaySessionDetailView.as_view(), name="playsession_detail"), path("adventures/<int:pk>/delete/", adventure_views.AdventureDeleteView.as_view(), name="adventure_delete"),
path("adventures/<int:pk>/playsession/create/", adventure_views.PlaySessionCreateView.as_view(), name="create_playsession"),
path("adventures/<int:pk>/playsession/<int:playsession_pk>/update/", adventure_views.PlaySessionUpdateView.as_view(), name="playsession_update"),
path("adventures/<int:pk>/playsession/<int:playsession_pk>/delete/", adventure_views.PlaySessionDeleteView.as_view(), name="playsession_delete"),
] ]

View File

@ -2,9 +2,15 @@ from django.views.generic import TemplateView, ListView, DetailView
from django.views.generic.edit import CreateView from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from guild.models import Player from guild.models import Adventure, Player
# Create your views here. # Create your views here.
class HomeView(LoginRequiredMixin, TemplateView): class HomeView(LoginRequiredMixin, TemplateView):
template_name = "guild/home.html" template_name = "guild/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["adventures"] = Adventure.objects.all()
return context

View File

@ -4,7 +4,7 @@ from django.forms.models import BaseModelForm
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.generic import TemplateView, ListView, DetailView from django.views.generic import TemplateView, ListView, DetailView
from django.views.generic.edit import CreateView from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from guild.forms import PlaySessionForm from guild.forms import PlaySessionForm
@ -18,7 +18,15 @@ class CreateAdventureView(LoginRequiredMixin, CreateView):
class AdventureDetailView(LoginRequiredMixin, DetailView): class AdventureDetailView(LoginRequiredMixin, DetailView):
model = Adventure model = Adventure
class CreatePlaySessionView(LoginRequiredMixin, CreateView): class AdventureUpdateView(LoginRequiredMixin, UpdateView):
model = Adventure
fields = ["name", "description", "master"]
class AdventureDeleteView(LoginRequiredMixin, DeleteView):
model = Adventure
success_url = "/"
class PlaySessionCreateView(LoginRequiredMixin, CreateView):
model = PlaySession model = PlaySession
form_class = PlaySessionForm form_class = PlaySessionForm
@ -30,10 +38,21 @@ class CreatePlaySessionView(LoginRequiredMixin, CreateView):
form.instance.adventure = self.adventure form.instance.adventure = self.adventure
return super().form_valid(form) return super().form_valid(form)
class PlaySessionUpdateView(LoginRequiredMixin, UpdateView):
class PlaySessionDetailView(LoginRequiredMixin, DetailView): model = PlaySession
form_class = PlaySessionForm
def dispatch(self, request, *args, **kwargs):
self.adventure = get_object_or_404(Adventure, pk=kwargs["pk"])
return super().dispatch(request, *args, **kwargs)
class PlaySessionDeleteView(LoginRequiredMixin, DeleteView):
model = PlaySession model = PlaySession
pk_url_kwarg = "playsession_pk" pk_url_kwarg = "playsession_pk"
def get_queryset(self): def dispatch(self, request, *args, **kwargs):
return super().get_queryset().filter(adventure_id=self.kwargs["pk"]) self.adventure = get_object_or_404(Adventure, pk=kwargs["pk"])
return super().dispatch(request, *args, **kwargs)
def get_success_url(self) -> str:
return self.adventure.get_absolute_url()

3
static/milligram.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -5,7 +5,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{% static 'pico.min.css' %}"> <link rel="stylesheet" href="{% static 'milligram.min.css' %}">
<title>Guild Journal</title> <title>Guild Journal</title>
</head> </head>
<body> <body>