geschichten/stories/writingtogether/views.py

127 lines
4.4 KiB
Python
Raw Normal View History

2021-03-31 01:15:49 +02:00
from django import forms
from django.contrib.auth.mixins import LoginRequiredMixin
2021-03-31 01:15:49 +02:00
from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
2021-03-30 21:25:52 +02:00
# Create your views here.
from django.urls import reverse_lazy, reverse
2021-05-05 22:18:45 +02:00
from django.views.generic import CreateView, UpdateView, RedirectView, DetailView, ListView
from writingtogether.models import Story, StoryPart, StoryRound
2021-03-31 01:15:49 +02:00
2021-05-05 22:18:45 +02:00
class IndexView(LoginRequiredMixin, ListView):
2021-03-31 01:15:49 +02:00
template_name = 'writingtogether/index.html'
2021-04-19 00:19:32 +02:00
context_object_name = 'open_story_round_list'
2021-03-31 01:15:49 +02:00
def get_queryset(self):
2021-04-19 00:19:32 +02:00
# TODO: show open & finished rounds
2021-03-31 01:15:49 +02:00
return StoryRound.objects.order_by('-created')[:5]
2021-05-05 22:18:45 +02:00
class StoryRoundDetailView(LoginRequiredMixin, DetailView):
2021-03-31 01:15:49 +02:00
model = StoryRound
template_name = 'writingtogether/detail.html'
class StoryRoundCreate(LoginRequiredMixin, CreateView):
2021-03-31 01:15:49 +02:00
model = StoryRound
fields = ['name', 'participants', 'number_of_rounds']
success_url = reverse_lazy('writing:index')
2021-03-31 01:15:49 +02:00
def form_valid(self, form):
self.object = form.save()
sorted_participants = sorted([user.pk for user in form.cleaned_data['participants']])
number_of_participants = len(sorted_participants)
2021-03-31 01:15:49 +02:00
for user_index, user_id in enumerate(sorted_participants):
story = Story.objects.create(
2021-03-31 01:15:49 +02:00
part_of_round=self.object,
started_by_id=user_id
2021-03-31 01:15:49 +02:00
)
previous_part=None
for i in range(form.cleaned_data['number_of_rounds']):
current_part = StoryPart.objects.create(
user_id=sorted_participants[(user_index + i) % number_of_participants],
previous_part=previous_part,
part_of=story,
turn_number=i,
)
previous_part = current_part
2021-03-31 01:15:49 +02:00
return HttpResponseRedirect(self.get_success_url())
2021-03-31 01:15:49 +02:00
class StoryUpdate(LoginRequiredMixin, UpdateView):
2021-03-31 01:15:49 +02:00
model = Story
fields = ['name']
class StoryPartUpdate(LoginRequiredMixin, UpdateView):
2021-03-31 01:15:49 +02:00
model = StoryPart
fields = ['text']
template_name = 'writingtogether/story_part.html'
def get_success_url(self):
return reverse(
'writing:redirect_story_part',
kwargs={'story_round_pk': self.object.part_of.part_of_round.pk}
)
def get_context_data(self, **kwargs):
context = super(StoryPartUpdate, self).get_context_data(**kwargs)
context.update({
'current_round': self.object.turn_number + 1,
2021-05-05 22:54:21 +02:00
'total_rounds': self.object.part_of.part_of_round.number_of_rounds,
'previous_part': self.object.previous_part,
})
context.update(self.kwargs)
return context
2021-03-31 01:15:49 +02:00
#def form_valid(self, form):
# form.instance.created_by = self.request.user
# form.instance.previous_part_id = self.kwargs['previous']
# form.instance.part_of_id = self.kwargs['story_pk']
# return super().form_valid(form)
class RedirectToNextOpenPart(LoginRequiredMixin, RedirectView):
permanent = False
query_string = True
pattern_name = 'writing:update_story_part'
def get_redirect_url(self, *args, **kwargs):
story_round = get_object_or_404(StoryRound, pk=kwargs['story_round_pk'])
2021-05-05 22:31:35 +02:00
if story_round.next_round_ready():
status, turn_number = story_round.advance_to_next_turn_and_get_status_and_round_number()
if status == 'finished':
self.pattern_name = 'writing:finished'
kwargs['pk'] = kwargs.pop('story_round_pk')
return super().get_redirect_url(*args, **kwargs)
story_part = story_round.get_next_story_part(user=self.request.user)
2021-05-05 22:18:45 +02:00
if story_part.finished:
self.pattern_name = 'writing:wait_for_others'
kwargs['pk'] = kwargs.pop('story_round_pk')
else:
kwargs['story_pk'] = story_part.part_of.pk
kwargs['pk'] = story_part.pk
2021-05-05 22:31:35 +02:00
return super().get_redirect_url(*args, **kwargs)
2021-05-05 22:18:45 +02:00
class WaitForOthersView(LoginRequiredMixin, DetailView):
model = StoryRound
template_name = 'writingtogether/wait_for_others.html'
2021-05-05 22:54:21 +02:00
class RoundFinishedView(LoginRequiredMixin, ListView):
model = Story
context_object_name = 'stories'
template_name = 'writingtogether/finished.html'
def get_queryset(self):
return Story.objects.filter(part_of_round_id=self.kwargs['pk']).prefetch_related('parts')