mirror of
https://github.com/QingdaoU/Spirit.git
synced 2024-12-29 16:02:04 +00:00
6dc6c87a04
* add yarn * spirit startproject command * readme usage * remove example from travis * readme run tests * exit instead of raise * remove yarn.lock * core.conf settings * django.conf.settings -> core.conf.settings everywhere * editorconfig makefiles * docs * core.conf.defaults docs * installation docs * upgrade docs * update history * spirit.settings deprecation warning * update readme
139 lines
3.8 KiB
Python
139 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.http import HttpResponsePermanentRedirect
|
|
|
|
from djconfig import config
|
|
|
|
from ..core.utils.paginator import paginate, yt_paginate
|
|
from ..core.utils.ratelimit.decorators import ratelimit
|
|
from ..category.models import Category
|
|
from ..comment.models import MOVED
|
|
from ..comment.forms import CommentForm
|
|
from ..comment.utils import comment_posted
|
|
from ..comment.models import Comment
|
|
from .models import Topic
|
|
from .forms import TopicForm
|
|
from . import utils
|
|
|
|
|
|
@login_required
|
|
@ratelimit(rate='1/10s')
|
|
def publish(request, category_id=None):
|
|
if category_id:
|
|
get_object_or_404(
|
|
Category.objects.visible(),
|
|
pk=category_id)
|
|
|
|
user = request.user
|
|
|
|
if request.method == 'POST':
|
|
form = TopicForm(user=user, data=request.POST)
|
|
cform = CommentForm(user=user, data=request.POST)
|
|
|
|
if (all([form.is_valid(), cform.is_valid()]) and
|
|
not request.is_limited()):
|
|
if not user.st.update_post_hash(form.get_topic_hash()):
|
|
return redirect(
|
|
request.POST.get('next', None) or
|
|
form.get_category().get_absolute_url())
|
|
|
|
# wrap in transaction.atomic?
|
|
topic = form.save()
|
|
cform.topic = topic
|
|
comment = cform.save()
|
|
comment_posted(comment=comment, mentions=cform.mentions)
|
|
return redirect(topic.get_absolute_url())
|
|
else:
|
|
form = TopicForm(user=user, initial={'category': category_id})
|
|
cform = CommentForm()
|
|
|
|
context = {
|
|
'form': form,
|
|
'cform': cform,
|
|
}
|
|
|
|
return render(request, 'spirit/topic/publish.html', context)
|
|
|
|
|
|
@login_required
|
|
def update(request, pk):
|
|
topic = Topic.objects.for_update_or_404(pk, request.user)
|
|
|
|
if request.method == 'POST':
|
|
form = TopicForm(user=request.user, data=request.POST, instance=topic)
|
|
category_id = topic.category_id
|
|
|
|
if form.is_valid():
|
|
topic = form.save()
|
|
|
|
if topic.category_id != category_id:
|
|
Comment.create_moderation_action(user=request.user, topic=topic, action=MOVED)
|
|
|
|
return redirect(request.POST.get('next', topic.get_absolute_url()))
|
|
else:
|
|
form = TopicForm(user=request.user, instance=topic)
|
|
|
|
context = {
|
|
'form': form,
|
|
}
|
|
|
|
return render(request, 'spirit/topic/update.html', context)
|
|
|
|
|
|
def detail(request, pk, slug):
|
|
topic = Topic.objects.get_public_or_404(pk, request.user)
|
|
|
|
if topic.slug != slug:
|
|
return HttpResponsePermanentRedirect(topic.get_absolute_url())
|
|
|
|
utils.topic_viewed(request=request, topic=topic)
|
|
|
|
comments = Comment.objects\
|
|
.for_topic(topic=topic)\
|
|
.with_likes(user=request.user)\
|
|
.with_polls(user=request.user)\
|
|
.order_by('date')
|
|
|
|
comments = paginate(
|
|
comments,
|
|
per_page=config.comments_per_page,
|
|
page_number=request.GET.get('page', 1)
|
|
)
|
|
|
|
context = {
|
|
'topic': topic,
|
|
'comments': comments
|
|
}
|
|
|
|
return render(request, 'spirit/topic/detail.html', context)
|
|
|
|
|
|
def index_active(request):
|
|
categories = Category.objects\
|
|
.visible()\
|
|
.parents()
|
|
|
|
topics = Topic.objects\
|
|
.visible()\
|
|
.global_()\
|
|
.with_bookmarks(user=request.user)\
|
|
.order_by('-is_globally_pinned', '-last_active')\
|
|
.select_related('category')
|
|
|
|
topics = yt_paginate(
|
|
topics,
|
|
per_page=config.topics_per_page,
|
|
page_number=request.GET.get('page', 1)
|
|
)
|
|
|
|
context = {
|
|
'categories': categories,
|
|
'topics': topics
|
|
}
|
|
|
|
return render(request, 'spirit/topic/active.html', context)
|