more basic setup

This commit is contained in:
Niko Abeler 2023-06-10 22:32:45 +02:00
parent 36e2ee216d
commit fc748f8596
13 changed files with 153 additions and 5 deletions

17
guild/forms.py Normal file
View File

@ -0,0 +1,17 @@
from django import forms
from guild.models import PlaySession
class PlaySessionForm(forms.ModelForm):
class Meta:
model = PlaySession
fields = ["date", "characters", "summary"]
# set date wideget to type="date"
widgets = {
"date": forms.DateInput(attrs={"type": "date"}),
}

View File

@ -82,7 +82,10 @@ class PlaySession(models.Model):
return self.name
def get_absolute_url(self):
return reverse("guild:playsession_detail", kwargs={"pk": self.pk})
return reverse(
"guild:playsession_detail",
kwargs={"pk": self.adventure.pk, "playsession_pk": self.pk}
)
class ResourceEarned(models.Model):

View File

@ -0,0 +1,28 @@
{% extends 'base.html' %}
{% load guild_extras %}
{% block content %}
<h1>Adventure: {{ adventure.name }}</h1>
<p>{{adventure.description|md|safe}}</p>
<a href="{% url 'guild:create_playsession' adventure.id %}">Add new Session</a>
{% if not adventure.playsession_set.count %}
<p>No sessions found.</p>
{% else %}
<ul>
{% for playsession in adventure.playsession_set.all %}
<li>
<a href="{% url 'guild:playsession_detail' adventure.id playsession.id %}">
{{ playsession.date }}
</a>
</li>
{% endfor %}
</ul>
{% endif %}
{% endblock content %}

View File

@ -0,0 +1,9 @@
{% extends 'base.html' %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Create Adventure">
</form>
{% endblock content %}

View File

@ -1,5 +1,7 @@
{% extends 'base.html' %}
{% load guild_extras %}
{% block content %}
<h1>Character: {{ character.name }}</h1>
@ -10,6 +12,6 @@
</a>
</h2>
<p>{{character.description}}</p>
<p>{{character.description|md|safe}}</p>
{% endblock content %}

View File

@ -3,8 +3,17 @@
{% block content %}
<h1>Home</h1>
<a href="{% url 'guild:create_player' %}">Create New Player</a>
<a href="{% url 'guild:create_character' %}">Create New Character</a>
<ul>
<li>
<a href="{% url 'guild:create_player' %}">Create New Player</a>
</li>
<li>
<a href="{% url 'guild:create_character' %}">Create New Character</a>
</li>
<li>
<a href="{% url 'guild:create_adventure' %}">Create New Adventure</a>
</li>
</ul>
{% endblock content %}

View File

@ -5,7 +5,7 @@
<h2>Characters</h2>
{% if not player.character_set %}
{% if not player.character_set.count %}
<p>No characters found.</p>
{% else %}
<ul>

View File

@ -0,0 +1,17 @@
{% 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

@ -0,0 +1,9 @@
{% extends 'base.html' %}
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Create Adventure">
</form>
{% endblock content %}

View File

View File

@ -0,0 +1,10 @@
import markdown
from django import template
from django.template.defaultfilters import stringfilter
register = template.Library()
@register.filter(name='md')
@stringfilter
def md(value):
return markdown.markdown(value)

View File

@ -2,6 +2,7 @@ from django.urls import path
import guild.views as views
import guild.views.player as player_views
import guild.views.character as character_views
import guild.views.adventure as adventure_views
urlpatterns = [
path("", views.HomeView.as_view(), name="home"),
@ -10,4 +11,8 @@ urlpatterns = [
path("players/<int:pk>/", player_views.PlayerDetailView.as_view(), name="player_detail"),
path("characters/create/", character_views.CreateCharacterView.as_view(), name="create_character"),
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/<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>/playsession/<int:playsession_pk>/", adventure_views.PlaySessionDetailView.as_view(), name="playsession_detail"),
]

39
guild/views/adventure.py Normal file
View File

@ -0,0 +1,39 @@
from typing import Any, Dict, Optional, Type
from django.forms.models import BaseModelForm
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.views.generic import TemplateView, ListView, DetailView
from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
from guild.forms import PlaySessionForm
from guild.models import Adventure, PlaySession
class CreateAdventureView(LoginRequiredMixin, CreateView):
model = Adventure
fields = ["name", "description", "master"]
class AdventureDetailView(LoginRequiredMixin, DetailView):
model = Adventure
class CreatePlaySessionView(LoginRequiredMixin, CreateView):
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)
def form_valid(self, form: BaseModelForm) -> HttpResponse:
form.instance.adventure = self.adventure
return super().form_valid(form)
class PlaySessionDetailView(LoginRequiredMixin, DetailView):
model = PlaySession
pk_url_kwarg = "playsession_pk"
def get_queryset(self):
return super().get_queryset().filter(adventure_id=self.kwargs["pk"])