Titivillus/quest/views.py

122 lines
3.4 KiB
Python

#!/usr/bin/env python3
"""
Quest and quest accessory views.
"""
from datetime import timedelta, datetime, timezone
from django.contrib import messages
from django.http import HttpResponse
from django.shortcuts import render, redirect
from .models import Quest, DiceRoll, PollOption, PollVote, Page, Post
from .forms import EditQuestForm, QuestForm, PostForm
def index(request):
"""
/quest page index. Possibly not needed.
"""
return HttpResponse("Hello, world. You're at the quest index.")
def quest(request, quest_id, page_num='0'):
"""
Arbituary quest page view.
"""
# TODO: 404 quest not found
quest = Quest.objects.get(id=quest_id)
pages = Page.objects.filter(
quest=quest, appendix=False).order_by('page_num')
appendices = Page.objects.filter(
quest=quest, appendix=True).order_by('title')
chat_messages = quest.message_set.all()
try:
page = Page.objects.get(quest=quest, page_num=page_num)
except Page.DoesNotExist:
messages.error(request, "Page not found, redirecting you.")
return redirect('quest:quest', quest_id=quest.id, page_num='0')
posts = quest.post_set.filter(page=page)
# TODO: filter by page_num as well
dice_rolls = DiceRoll.objects.filter(dicecall__post__quest=quest)
poll_options = PollOption.objects.filter(poll__post__quest=quest)
poll_votes = PollVote.objects.filter(option__poll__post__quest=quest)
ip_address = request.META['REMOTE_ADDR']
context = locals()
if page_num == '0':
return render(request, 'quest/quest_homepage.html', context)
else:
return render(request, 'quest/quest.html', context)
def edit_quest(request, quest_id, page_num=1):
"""
Edit quest page. Only available to the QM.
"""
quest = Quest.objects.get(id=quest_id)
if quest.owner != request.user:
return redirect('quest:quest', quest_id=quest_id, page_num=page_num)
if request.method == 'POST':
form = EditQuestForm(request.POST)
if form.is_valid():
quest.anon_name = form.cleaned_data['anon_name']
quest.live = form.cleaned_data['live']
live_date = form.cleaned_data['live_date']
live_time = form.cleaned_data['live_time']
if live_date and live_time:
live_datetime = datetime.combine(
live_date,
live_time,
timezone.utc
)
tz_delta = timedelta(minutes=form.cleaned_data['timezone'])
live_datetime = live_datetime + tz_delta
quest.live_time = live_datetime
else:
quest.live_time = None
quest.save()
return redirect('quest:quest',quest_id=quest.id, page_num=page_num)
else:
messages.error(request, "Error")
else:
pass
context = locals()
return render(request, 'quest/edit_quest.html', context)
def new_quest(request):
"""
The page for creating new quests.
"""
if request.method == 'POST':
# TODO: clean the post body
quest = Quest(owner=request.user)
quest_form = QuestForm(request.POST, instance=quest)
post = Post(post_type='text')
post_form = PostForm(request.POST, instance=post)
if all((quest_form.is_valid(), post_form.is_valid())):
quest.live = False
quest.save()
page0 = Page(
quest=quest,
page_num=0,
title="Homepage",
appendix=False,
)
page0.save()
page1 = Page(
quest=quest,
page_num=1,
title="Page 1",
appendix=False,
)
page1.save()
post.quest = quest
post.page = page1
post.save()
return redirect('quest:quest', quest_id=quest.id)
else:
quest_form = QuestForm()
post_form = PostForm()
context = {'quest_form': quest_form, 'post_form': post_form}
return render(request, 'quest/new_quest.html', context)