2
from mainpage.templatetags.wl_markdown import do_wl_markdown
3
from pybb.markups import mypostmarkup
2
from mainpage.templatetags.wl_markdown import do_wl_markdown as Markdown
3
from pybb.markups import mypostmarkup
5
5
from django.shortcuts import get_object_or_404
6
6
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseNotFound, Http404
7
7
from django.contrib.auth.models import User
8
8
from django.contrib.auth.decorators import login_required
9
9
from django.conf import settings
10
from django.urls import reverse
10
from django.core.urlresolvers import reverse
11
11
from django.db import connection
12
12
from django.utils import translation
13
from django.shortcuts import render, redirect
16
from pybb.util import render_to, paged, build_form, quote_text, ajax, urlize
14
from pybb.util import render_to, paged, build_form, quote_text, paginate, set_language, ajax, urlize
17
15
from pybb.models import Category, Forum, Topic, Post, PrivateMessage, Attachment,\
19
from pybb.forms import AddPostForm, EditPostForm, UserSearchForm
17
from pybb.forms import AddPostForm, EditPostForm, UserSearchForm
20
18
from pybb import settings as pybb_settings
21
19
from pybb.orm import load_related
23
from check_input.models import SuspiciousInput
26
from notification import models as notification
31
21
def index_ctx(request):
32
cats = Category.objects.all().select_related()
34
return {'cats': cats }
22
quick = {'posts': Post.objects.count(),
23
'topics': Topic.objects.count(),
24
'users': User.objects.count(),
25
'last_topics': Topic.objects.all().select_related()[:pybb_settings.QUICK_TOPICS_NUMBER],
26
'last_posts': Post.objects.order_by('-created').select_related()[:pybb_settings.QUICK_POSTS_NUMBER],
32
for forum in Forum.objects.all().select_related():
33
cat = cats.setdefault(forum.category.id,
34
{'cat': forum.category, 'forums': []})
35
cat['forums'].append(forum)
36
forums[forum.id] = forum
38
cmpdef = lambda a, b: cmp(a['cat'].position, b['cat'].position)
39
cats = sorted(cats.values(), cmpdef)
35
44
index = render_to('pybb/index.html')(index_ctx)
38
47
def show_category_ctx(request, category_id):
39
48
category = get_object_or_404(Category, pk=category_id)
41
return {'category': category }
49
quick = {'posts': category.posts.count(),
50
'topics': category.topics.count(),
51
'last_topics': category.topics.select_related()[:pybb_settings.QUICK_TOPICS_NUMBER],
52
'last_posts': category.posts.order_by('-created').select_related()\
53
[:pybb_settings.QUICK_POSTS_NUMBER],
55
return {'category': category,
42
58
show_category = render_to('pybb/category.html')(show_category_ctx)
45
61
def show_forum_ctx(request, forum_id):
46
62
forum = get_object_or_404(Forum, pk=forum_id)
48
moderator = (request.user.is_superuser or
49
request.user in forum.moderators.all())
64
quick = {'posts': forum.post_count,
65
'topics': forum.topics.count(),
66
'last_topics': forum.topics.all().select_related()[:pybb_settings.QUICK_TOPICS_NUMBER],
67
'last_posts': forum.posts.order_by('-created').select_related()\
68
[:pybb_settings.QUICK_POSTS_NUMBER],
51
topics = forum.topics.order_by(
52
'-sticky', '-updated').select_related()
71
topics = forum.topics.order_by('-sticky', '-updated').select_related()
72
page, paginator = paginate(topics, request, pybb_settings.FORUM_PAGE_SIZE)
54
74
return {'forum': forum,
56
'page_size': pybb_settings.FORUM_PAGE_SIZE,
57
'moderator': moderator,
75
'topics': page.object_list,
78
'paginator': paginator,
59
80
show_forum = render_to('pybb/forum.html')(show_forum_ctx)
62
83
def show_topic_ctx(request, topic_id):
64
85
topic = Topic.objects.select_related().get(pk=topic_id)
77
99
last_post = topic.posts.order_by('-created')[0]
80
if request.user.is_authenticated:
81
initial = {'markup': 'markdown'}
102
if request.user.is_authenticated():
103
initial = {'markup': "markdown" }
82
104
form = AddPostForm(topic=topic, initial=initial)
84
106
moderator = (request.user.is_superuser or
85
107
request.user in topic.forum.moderators.all())
86
subscribed = (request.user.is_authenticated and
108
subscribed = (request.user.is_authenticated() and
87
109
request.user in topic.subscribers.all())
92
is_spam = topic.posts.first().is_spam()
95
posts = topic.posts.select_related()
97
posts = topic.posts.exclude(hidden=True).select_related()
111
posts = topic.posts.all().select_related()
112
page, paginator = paginate(posts, request, pybb_settings.TOPIC_PAGE_SIZE,
113
total_count=topic.post_count)
99
116
# TODO: fetch profiles
100
117
# profiles = Profile.objects.filter(user__pk__in=
101
118
# set(x.user.id for x in page.object_list))
102
119
# profiles = dict((x.user_id, x) for x in profiles)
104
121
# for post in page.object_list:
105
122
# post.user.pybb_profile = profiles[post.user.id]
107
load_related(posts, Attachment.objects.all(), 'post')
124
load_related(page.object_list, Attachment.objects.all(), 'post')
109
126
return {'topic': topic,
110
127
'last_post': last_post,
141
158
post = get_object_or_404(Post, pk=quote_id)
142
quote = quote_text(post.body, post.user, 'markdown')
159
quote = quote_text(post.body_text, post.user, "markdown")
161
ip = request.META.get('REMOTE_ADDR', '')
144
162
form = build_form(AddPostForm, request, topic=topic, forum=forum,
146
initial={'markup': 'markdown', 'body': quote})
163
user=request.user, ip=ip,
164
initial={'markup': "markdown", 'body': quote})
148
166
if form.is_valid():
152
# Check for spam in topics name for new topics
154
is_spam = SuspiciousInput.check_input(
155
content_object=post.topic, user=post.topic.user, text=post.topic.name)
156
# Check for spam in Post
158
is_spam = SuspiciousInput.check_input(
159
content_object=post, user=post.user, text=post.body)
162
post.hidden = is_spam
163
post.save(update_fields=['hidden'])
164
return HttpResponseRedirect('/moderated/')
168
# Inform subscribers of a new topic
169
subscribers = notification.get_observers_for('forum_new_topic',
170
excl_user=request.user)
171
notification.send(subscribers, 'forum_new_topic',
172
{'topic': post.topic,
174
'user': post.topic.user
177
# Topics author is subscriber for all new posts in his topic
178
post.topic.subscribers.add(request.user)
181
# Send mails about a new post to topic subscribers
182
notification.send(post.topic.subscribers.exclude(username=post.user), 'forum_new_post',
183
{'post': post, 'topic': topic, 'user': post.user}, queue = True)
185
168
return HttpResponseRedirect(post.get_absolute_url())