mirror of
https://github.com/AxioDL/axiodl-www.git
synced 2026-07-11 06:19:06 -07:00
120 lines
3.9 KiB
Python
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)
|