-
-
Notifications
You must be signed in to change notification settings - Fork 331
/
views.py
138 lines (104 loc) · 3.78 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# -*- 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)