2
from markdown import Markdown
3
from pybb.markups import mypostmarkup
5
from django.shortcuts import get_object_or_404
6
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseNotFound, Http404
7
from django.contrib.auth.models import User
8
from django.contrib.auth.decorators import login_required
9
from django.conf import settings
10
from django.core.urlresolvers import reverse
11
from django.db import connection
12
from django.utils import translation
14
from pybb.util import render_to, paged, build_form, quote_text, paginate, set_language, ajax, urlize
15
from pybb.models import Category, Forum, Topic, Post, Profile, PrivateMessage, Attachment,\
17
from pybb.forms import AddPostForm, EditProfileForm, EditPostForm, UserSearchForm, CreatePMForm
18
from pybb import settings as pybb_settings
19
from pybb.orm import load_related
21
def index_ctx(request):
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)
44
index = render_to('pybb/index.html')(index_ctx)
47
def show_category_ctx(request, category_id):
48
category = get_object_or_404(Category, pk=category_id)
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,
58
show_category = render_to('pybb/category.html')(show_category_ctx)
61
def show_forum_ctx(request, forum_id):
62
forum = get_object_or_404(Forum, pk=forum_id)
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],
71
topics = forum.topics.order_by('-sticky', '-updated').select_related()
72
page, paginator = paginate(topics, request, pybb_settings.FORUM_PAGE_SIZE)
74
return {'forum': forum,
75
'topics': page.object_list,
78
'paginator': paginator,
80
show_forum = render_to('pybb/forum.html')(show_forum_ctx)
83
def show_topic_ctx(request, topic_id):
85
topic = Topic.objects.select_related().get(pk=topic_id)
86
except Topic.DoesNotExist:
92
if request.user.is_authenticated():
93
topic.update_read(request.user)
95
if pybb_settings.FREEZE_FIRST_POST:
96
first_post = topic.posts.order_by('created')[0]
99
last_post = topic.posts.order_by('-created')[0]
102
if request.user.is_authenticated():
103
initial = {'markup': request.user.pybb_profile.markup}
104
form = AddPostForm(topic=topic, initial=initial)
106
moderator = (request.user.is_superuser or
107
request.user in topic.forum.moderators.all())
108
subscribed = (request.user.is_authenticated() and
109
request.user in topic.subscribers.all())
111
posts = topic.posts.all().select_related()
112
page, paginator = paginate(posts, request, pybb_settings.TOPIC_PAGE_SIZE,
113
total_count=topic.post_count)
115
profiles = Profile.objects.filter(user__pk__in=
116
set(x.user.id for x in page.object_list))
117
profiles = dict((x.user_id, x) for x in profiles)
119
for post in page.object_list:
120
post.user.pybb_profile = profiles[post.user.id]
122
load_related(page.object_list, Attachment.objects.all(), 'post')
124
return {'topic': topic,
125
'last_post': last_post,
126
'first_post': first_post,
128
'moderator': moderator,
129
'subscribed': subscribed,
130
'posts': page.object_list,
132
'paginator': paginator,
133
'form_url': reverse('pybb_add_post', args=[topic.id]),
135
show_topic = render_to('pybb/topic.html')(show_topic_ctx)
139
def add_post_ctx(request, forum_id, topic_id):
144
forum = get_object_or_404(Forum, pk=forum_id)
146
topic = get_object_or_404(Topic, pk=topic_id)
148
if topic and topic.closed:
149
return HttpResponseRedirect(topic.get_absolute_url())
152
quote_id = int(request.GET.get('quote_id'))
156
post = get_object_or_404(Post, pk=quote_id)
157
quote = quote_text(post.body_text, post.user, request.user.pybb_profile.markup)
159
ip = request.META.get('REMOTE_ADDR', '')
160
form = build_form(AddPostForm, request, topic=topic, forum=forum,
161
user=request.user, ip=ip,
162
initial={'markup': request.user.pybb_profile.markup, 'body': quote})
166
return HttpResponseRedirect(post.get_absolute_url())
169
form_url = reverse('pybb_add_post', args=[topic.id])
171
form_url = reverse('pybb_add_topic', args=[forum.id])
173
return {'form': form,
176
'form_url': form_url,
178
add_post = render_to('pybb/add_post.html')(add_post_ctx)
181
def user_ctx(request, username):
182
user = get_object_or_404(User, username=username)
183
topic_count = Topic.objects.filter(user=user).count()
184
return {'profile': user,
185
'topic_count': topic_count,
187
user = render_to('pybb/user.html')(user_ctx)
190
def show_post(request, post_id):
191
post = get_object_or_404(Post, pk=post_id)
192
count = post.topic.posts.filter(created__lt=post.created).count() + 1
193
page = math.ceil(count / float(pybb_settings.TOPIC_PAGE_SIZE))
194
url = '%s?page=%d#post-%d' % (reverse('pybb_topic', args=[post.topic.id]), page, post.id)
195
return HttpResponseRedirect(url)
199
def edit_profile_ctx(request):
200
form = build_form(EditProfileForm, request, instance=request.user.pybb_profile)
202
profile = form.save()
203
set_language(request, profile.language)
204
return HttpResponseRedirect(reverse('pybb_edit_profile'))
205
return {'form': form,
206
'profile': request.user.pybb_profile,
208
edit_profile = render_to('pybb/edit_profile.html')(edit_profile_ctx)
212
def edit_post_ctx(request, post_id):
213
from pybb.templatetags.pybb_extras import pybb_editable_by
215
post = get_object_or_404(Post, pk=post_id)
216
if not pybb_editable_by(post, request.user):
217
return HttpResponseRedirect(post.get_absolute_url())
219
form = build_form(EditPostForm, request, instance=post)
223
return HttpResponseRedirect(post.get_absolute_url())
225
return {'form': form,
228
edit_post = render_to('pybb/edit_post.html')(edit_post_ctx)
232
def stick_topic(request, topic_id):
233
from pybb.templatetags.pybb_extras import pybb_moderated_by
235
topic = get_object_or_404(Topic, pk=topic_id)
236
if pybb_moderated_by(topic, request.user):
240
return HttpResponseRedirect(topic.get_absolute_url())
244
def unstick_topic(request, topic_id):
245
from pybb.templatetags.pybb_extras import pybb_moderated_by
247
topic = get_object_or_404(Topic, pk=topic_id)
248
if pybb_moderated_by(topic, request.user):
252
return HttpResponseRedirect(topic.get_absolute_url())
256
def delete_post_ctx(request, post_id):
257
post = get_object_or_404(Post, pk=post_id)
258
last_post = post.topic.posts.order_by('-created')[0]
261
if request.user.is_superuser or\
262
request.user in post.topic.forum.moderators.all() or \
263
(post.user == request.user and post == last_post):
267
return HttpResponseRedirect(post.get_absolute_url())
269
if 'POST' == request.method:
271
forum = post.topic.forum
275
Topic.objects.get(pk=topic.id)
276
except Topic.DoesNotExist:
277
return HttpResponseRedirect(forum.get_absolute_url())
279
return HttpResponseRedirect(topic.get_absolute_url())
281
return {'post': post,
283
delete_post = render_to('pybb/delete_post.html')(delete_post_ctx)
287
def close_topic(request, topic_id):
288
from pybb.templatetags.pybb_extras import pybb_moderated_by
290
topic = get_object_or_404(Topic, pk=topic_id)
291
if pybb_moderated_by(topic, request.user):
295
return HttpResponseRedirect(topic.get_absolute_url())
299
def open_topic(request, topic_id):
300
from pybb.templatetags.pybb_extras import pybb_moderated_by
302
topic = get_object_or_404(Topic, pk=topic_id)
303
if pybb_moderated_by(topic, request.user):
307
return HttpResponseRedirect(topic.get_absolute_url())
310
@render_to('pybb/users.html')
311
def users_ctx(request):
312
users = User.objects.order_by('username')
313
form = UserSearchForm(request.GET)
314
users = form.filter(users)
316
page, paginator = paginate(users, request, pybb_settings.USERS_PAGE_SIZE)
318
return {'users': page.object_list,
320
'paginator': paginator,
323
users = render_to('pybb/users.html')(users_ctx)
327
def delete_subscription(request, topic_id):
328
topic = get_object_or_404(Topic, pk=topic_id)
329
topic.subscribers.remove(request.user)
330
if 'from_topic' in request.GET:
331
return HttpResponseRedirect(reverse('pybb_topic', args=[topic.id]))
333
return HttpResponseRedirect(reverse('pybb_edit_profile'))
337
def add_subscription(request, topic_id):
338
topic = get_object_or_404(Topic, pk=topic_id)
339
topic.subscribers.add(request.user)
340
return HttpResponseRedirect(reverse('pybb_topic', args=[topic.id]))
344
def create_pm_ctx(request):
345
recipient = request.GET.get('recipient', '')
346
form = build_form(CreatePMForm, request, user=request.user,
347
initial={'markup': request.user.pybb_profile.markup,
348
'recipient': recipient})
352
return HttpResponseRedirect(reverse('pybb_pm_outbox'))
354
return {'form': form,
357
create_pm = render_to('pybb/pm/create_pm.html')(create_pm_ctx)
361
def pm_outbox_ctx(request):
362
messages = PrivateMessage.objects.filter(src_user=request.user)
363
return {'messages': messages,
366
pm_outbox = render_to('pybb/pm/outbox.html')(pm_outbox_ctx)
370
def pm_inbox_ctx(request):
371
messages = PrivateMessage.objects.filter(dst_user=request.user)
372
return {'messages': messages,
375
pm_inbox = render_to('pybb/pm/inbox.html')(pm_inbox_ctx)
379
def show_pm_ctx(request, pm_id):
380
msg = get_object_or_404(PrivateMessage, pk=pm_id)
381
if not request.user in [msg.dst_user, msg.src_user]:
382
return HttpRedirectException('/')
383
if request.user == msg.dst_user:
388
post_user = msg.src_user
391
post_user = msg.dst_user
394
'post_user': post_user,
396
show_pm = render_to('pybb/pm/message.html')(show_pm_ctx)
400
def show_attachment(request, hash):
401
attachment = get_object_or_404(Attachment, hash=hash)
402
file_obj = file(attachment.get_absolute_path())
403
return HttpResponse(file_obj, content_type=attachment.content_type)
408
def post_ajax_preview(request):
409
content = request.POST.get('content')
410
markup = request.POST.get('markup')
412
if not markup in dict(MARKUP_CHOICES).keys():
413
return {'error': 'Invalid markup'}
416
return {'content': ''}
418
if markup == 'bbcode':
419
html = mypostmarkup.markup(content, auto_urls=False)
420
elif markup == 'markdown':
421
html = unicode(Markdown(content, safe_mode='escape'))
424
return {'content': html}