Files
axiodl-www/boards/views.py
T
2019-07-10 20:35:10 -07:00

120 lines
3.9 KiB
Python

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required, permission_required
from django.db.models import Count
from django.utils import timezone
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.views.generic import UpdateView, ListView, CreateView, DeleteView
from .forms import NewTopicForm, PostForm
from .models import Category, Board, Topic, Post
class TopicListView(ListView):
model = Topic
context_object_name = 'topics'
template_name = 'boards/topics.html'
paginate_by = 20
board = None
def get_context_data(self, **kwargs):
kwargs['board'] = self.board
return super().get_context_data(**kwargs)
def get_queryset(self):
self.board = get_object_or_404(Board, pk=self.kwargs.get('pk'))
queryset = self.board.topics.order_by('-last_updated').annotate(replies=Count('posts') - 1)
return queryset
@method_decorator(login_required, name='dispatch')
def new_topic(request, pk):
board = get_object_or_404(Board, pk=pk)
if request.method == 'POST':
form = NewTopicForm(request.POST)
if form.is_valid():
topic = form.save(commit=False)
topic.board = board
topic.starter = request.user
topic.save()
post = Post.objects.create(
message=form.cleaned_data.get('message'),
topic=topic,
created_by=request.user
)
return redirect('board.topic.posts', pk=board.pk, topic_pk=topic.pk)
else:
form = NewTopicForm()
return render(request, 'boards/new_topic.html', {'board': board, 'form': form})
class PostListView(ListView):
model = Post
context_object_name = 'posts'
template_name = 'boards/topic_posts.html'
paginate_by = 10
topic = None
def get_context_data(self, **kwargs):
self.topic.views += 1
self.topic.save()
kwargs['topic'] = self.topic
return super().get_context_data(**kwargs)
def get_queryset(self):
self.topic = get_object_or_404(Topic, board__pk=self.kwargs.get('pk'), pk = self.kwargs.get('topic_pk'))
queryset = self.topic.posts.order_by('created_at')
return queryset
@login_required
def reply_topic(request, pk, topic_pk):
topic = get_object_or_404(Topic, board__pk=pk, pk=topic_pk)
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.topic = topic
post.created_by = request.user
post.save()
topic.last_updated = timezone.now()
topic.save()
topic_url = reverse('board.topic.posts', kwargs={'pk': pk, 'topic_pk': topic_pk})
topic_post_url = '{url}?page={page}#{id}'.format(
url=topic_url,
id=post.pk,
page=topic.get_page_count()
)
return redirect(topic_post_url)
else:
form = PostForm()
return render(request, 'boards/reply_topic.html', {'topic': topic, 'form': form})
class CategoryListView(ListView):
model = Category
context_object_name = 'categories'
template_name = 'boards/index.html'
@method_decorator(login_required, name='dispatch')
class PostUpdateView(UpdateView):
model = Post
fields = ('message', )
template_name = 'boards/edit_post.html'
pk_url_kwarg = 'post_pk'
context_object_name = 'post'
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(created_by=self.request.user)
def form_valid(self, form):
post = form.save(commit=False)
post.updated_by = self.request.user
post.updated_at = timezone.now()
post.save()
return redirect('board.topic.posts', pk=post.topic.board.pk, topic_pk=post.topic.pk)