diff --git a/guild/models.py b/guild/models.py
index 001a94a..04d37b2 100644
--- a/guild/models.py
+++ b/guild/models.py
@@ -83,9 +83,9 @@ class PlaySession(models.Model):
def get_absolute_url(self):
return reverse(
- "guild:playsession_detail",
- kwargs={"pk": self.adventure.pk, "playsession_pk": self.pk}
- )
+ "guild:adventure_detail",
+ kwargs={"pk": self.adventure.pk}
+ ) + "#playsession" + str(self.pk)
class ResourceEarned(models.Model):
diff --git a/guild/templates/guild/adventure_detail.html b/guild/templates/guild/adventure_detail.html
index 4c4a678..fd5ea4f 100644
--- a/guild/templates/guild/adventure_detail.html
+++ b/guild/templates/guild/adventure_detail.html
@@ -3,25 +3,63 @@
{% load guild_extras %}
{% block content %}
-
Adventure: {{ adventure.name }}
+
+
+
+
Adventure: {{ adventure.name }}
+
+
+
+
+
{{adventure.description|md|safe}}
-Add new Session
+
+
{% if not adventure.playsession_set.count %}
- No sessions found.
+ No sessions yet.
{% else %}
-
{% for playsession in adventure.playsession_set.all %}
- -
-
- {{ playsession.date }}
-
-
+
+
+
{{ playsession.date }}
+
+
+
+
+
+ Characters
+
+
+ {% for character in playsession.characters.all %}
+ - {{character.name}}
+ {% endfor %}
+
+
+ Summary
+
+ {{playsession.summary|md|safe}}
+
+
{% endfor %}
-
{% endif %}
diff --git a/guild/templates/guild/adventure_form.html b/guild/templates/guild/adventure_form.html
index b40688e..11bb9ef 100644
--- a/guild/templates/guild/adventure_form.html
+++ b/guild/templates/guild/adventure_form.html
@@ -4,6 +4,10 @@
{% endblock content %}
\ No newline at end of file
diff --git a/guild/templates/guild/home.html b/guild/templates/guild/home.html
index 22a2e86..c6445d3 100644
--- a/guild/templates/guild/home.html
+++ b/guild/templates/guild/home.html
@@ -15,5 +15,15 @@
+Adventures
+
+
+
{% endblock content %}
\ No newline at end of file
diff --git a/guild/templates/guild/playsession_confirm_delete.html b/guild/templates/guild/playsession_confirm_delete.html
new file mode 100644
index 0000000..6e36c56
--- /dev/null
+++ b/guild/templates/guild/playsession_confirm_delete.html
@@ -0,0 +1,14 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+Session Delete
+
+Are you sure you want to delete "{{ playsession.date }}" of the adventure {{ playsession.adventure.name}}?
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/guild/templates/guild/playsession_detail.html b/guild/templates/guild/playsession_detail.html
deleted file mode 100644
index 652c322..0000000
--- a/guild/templates/guild/playsession_detail.html
+++ /dev/null
@@ -1,17 +0,0 @@
-{% extends 'base.html' %}
-
-{% load guild_extras %}
-
-{% block content %}
-Session: {{ playsession.name }}
-
-
-{{playsession.summary|md|safe}}
-
-
-{% endblock content %}
\ No newline at end of file
diff --git a/guild/templates/guild/playsession_form.html b/guild/templates/guild/playsession_form.html
index b40688e..207308b 100644
--- a/guild/templates/guild/playsession_form.html
+++ b/guild/templates/guild/playsession_form.html
@@ -4,6 +4,6 @@
{% endblock content %}
\ No newline at end of file
diff --git a/guild/urls.py b/guild/urls.py
index e494887..6d4b20e 100644
--- a/guild/urls.py
+++ b/guild/urls.py
@@ -13,6 +13,9 @@ urlpatterns = [
path("characters//", character_views.CharacterDetailView.as_view(), name="character_detail"),
path("adventures/create/", adventure_views.CreateAdventureView.as_view(), name="create_adventure"),
path("adventures//", adventure_views.AdventureDetailView.as_view(), name="adventure_detail"),
- path("adventures//playsession/create/", adventure_views.CreatePlaySessionView.as_view(), name="create_playsession"),
- path("adventures//playsession//", adventure_views.PlaySessionDetailView.as_view(), name="playsession_detail"),
+ path("adventures//update/", adventure_views.AdventureUpdateView.as_view(), name="adventure_update"),
+ path("adventures//delete/", adventure_views.AdventureDeleteView.as_view(), name="adventure_delete"),
+ path("adventures//playsession/create/", adventure_views.PlaySessionCreateView.as_view(), name="create_playsession"),
+ path("adventures//playsession//update/", adventure_views.PlaySessionUpdateView.as_view(), name="playsession_update"),
+ path("adventures//playsession//delete/", adventure_views.PlaySessionDeleteView.as_view(), name="playsession_delete"),
]
diff --git a/guild/views/__init__.py b/guild/views/__init__.py
index 56e8cac..1807868 100644
--- a/guild/views/__init__.py
+++ b/guild/views/__init__.py
@@ -2,9 +2,15 @@ from django.views.generic import TemplateView, ListView, DetailView
from django.views.generic.edit import CreateView
from django.contrib.auth.mixins import LoginRequiredMixin
-from guild.models import Player
+from guild.models import Adventure, Player
# Create your views here.
class HomeView(LoginRequiredMixin, TemplateView):
template_name = "guild/home.html"
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+ context["adventures"] = Adventure.objects.all()
+ return context
+
+
diff --git a/guild/views/adventure.py b/guild/views/adventure.py
index 769a307..11f2440 100644
--- a/guild/views/adventure.py
+++ b/guild/views/adventure.py
@@ -4,7 +4,7 @@ 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.views.generic.edit import CreateView, UpdateView, DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin
from guild.forms import PlaySessionForm
@@ -18,7 +18,15 @@ class CreateAdventureView(LoginRequiredMixin, CreateView):
class AdventureDetailView(LoginRequiredMixin, DetailView):
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
form_class = PlaySessionForm
@@ -30,10 +38,21 @@ class CreatePlaySessionView(LoginRequiredMixin, CreateView):
form.instance.adventure = self.adventure
return super().form_valid(form)
-
-class PlaySessionDetailView(LoginRequiredMixin, DetailView):
+class PlaySessionUpdateView(LoginRequiredMixin, UpdateView):
+ 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
pk_url_kwarg = "playsession_pk"
- def get_queryset(self):
- return super().get_queryset().filter(adventure_id=self.kwargs["pk"])
+ def dispatch(self, request, *args, **kwargs):
+ 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()
\ No newline at end of file
diff --git a/static/milligram.min.css b/static/milligram.min.css
new file mode 100644
index 0000000..5e8955c
--- /dev/null
+++ b/static/milligram.min.css
@@ -0,0 +1,3 @@
+*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;font-size:62.5%}body{color:#606c76;font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;font-size:1.6em;font-weight:300;letter-spacing:.01em;line-height:1.6}blockquote{border-left:0.3rem solid #d1d1d1;margin-left:0;margin-right:0;padding:1rem 1.5rem}blockquote *:last-child{margin-bottom:0}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#9b4dca;border:0.1rem solid #9b4dca;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3.0rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#9b4dca;border-color:#9b4dca}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#9b4dca}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#9b4dca}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#9b4dca}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#9b4dca}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap}pre{background:#f4f5f6;border-left:0.3rem solid #9b4dca;overflow-y:hidden}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre}hr{border:0;border-top:0.1rem solid #f4f5f6;margin:3.0rem 0}input[type='color'],input[type='date'],input[type='datetime'],input[type='datetime-local'],input[type='email'],input[type='month'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],input[type='week'],input:not([type]),textarea,select{-webkit-appearance:none;background-color:transparent;border:0.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1.0rem .7rem;width:100%}input[type='color']:focus,input[type='date']:focus,input[type='datetime']:focus,input[type='datetime-local']:focus,input[type='email']:focus,input[type='month']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,input[type='week']:focus,input:not([type]):focus,textarea:focus,select:focus{border-color:#9b4dca;outline:0}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8,')}select[multiple]{background:none;height:auto}textarea{min-height:6.5rem}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}.container{margin:0 auto;max-width:112.0rem;padding:0 2.0rem;position:relative;width:100%}.row{display:flex;flex-direction:column;padding:0;width:100%}.row.row-no-padding{padding:0}.row.row-no-padding>.column{padding:0}.row.row-wrap{flex-wrap:wrap}.row.row-top{align-items:flex-start}.row.row-bottom{align-items:flex-end}.row.row-center{align-items:center}.row.row-stretch{align-items:stretch}.row.row-baseline{align-items:baseline}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%}.row .column.column-offset-10{margin-left:10%}.row .column.column-offset-20{margin-left:20%}.row .column.column-offset-25{margin-left:25%}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%}.row .column.column-offset-40{margin-left:40%}.row .column.column-offset-50{margin-left:50%}.row .column.column-offset-60{margin-left:60%}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%}.row .column.column-offset-75{margin-left:75%}.row .column.column-offset-80{margin-left:80%}.row .column.column-offset-90{margin-left:90%}.row .column.column-10{flex:0 0 10%;max-width:10%}.row .column.column-20{flex:0 0 20%;max-width:20%}.row .column.column-25{flex:0 0 25%;max-width:25%}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%}.row .column.column-40{flex:0 0 40%;max-width:40%}.row .column.column-50{flex:0 0 50%;max-width:50%}.row .column.column-60{flex:0 0 60%;max-width:60%}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%}.row .column.column-75{flex:0 0 75%;max-width:75%}.row .column.column-80{flex:0 0 80%;max-width:80%}.row .column.column-90{flex:0 0 90%;max-width:90%}.row .column .column-top{align-self:flex-start}.row .column .column-bottom{align-self:flex-end}.row .column .column-center{align-self:center}@media (min-width: 40rem){.row{flex-direction:row;margin-left:-1.0rem;width:calc(100% + 2.0rem)}.row .column{margin-bottom:inherit;padding:0 1.0rem}}a{color:#9b4dca;text-decoration:none}a:focus,a:hover{color:#606c76}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3.0rem}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem}table{border-spacing:0;display:block;overflow-x:auto;text-align:left;width:100%}td,th{border-bottom:0.1rem solid #e1e1e1;padding:1.2rem 1.5rem}td:first-child,th:first-child{padding-left:0}td:last-child,th:last-child{padding-right:0}@media (min-width: 40rem){table{display:table;overflow-x:initial}}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right}
+
+/*# sourceMappingURL=milligram.min.css.map */
\ No newline at end of file
diff --git a/templates/base.html b/templates/base.html
index 5b6409e..f5e4498 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -5,7 +5,7 @@
-
+
Guild Journal