~widelands-dev/widelands-website/django_staticfiles

« back to all changes in this revision

Viewing changes to pybb/views.py

  • Committer: Holger Rapp
  • Date: 2009-02-25 16:55:36 UTC
  • Revision ID: sirver@kallisto.local-20090225165536-3abfhjx8qsgtzyru
- Added my hacked version of pybb. Remerging new versions is very difficult at this point :(

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import math
 
2
from markdown import Markdown
 
3
from pybb.markups import mypostmarkup 
 
4
 
 
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
 
13
 
 
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,\
 
16
                        MARKUP_CHOICES
 
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
 
20
 
 
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],
 
27
             }
 
28
 
 
29
    cats = {}
 
30
    forums = {}
 
31
 
 
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
 
37
 
 
38
    cmpdef = lambda a, b: cmp(a['cat'].position, b['cat'].position)
 
39
    cats = sorted(cats.values(), cmpdef)
 
40
 
 
41
    return {'cats': cats,
 
42
            'quick': quick,
 
43
            }
 
44
index = render_to('pybb/index.html')(index_ctx)
 
45
 
 
46
 
 
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],
 
54
             }
 
55
    return {'category': category,
 
56
            'quick': quick,
 
57
            }
 
58
show_category = render_to('pybb/category.html')(show_category_ctx)
 
59
 
 
60
 
 
61
def show_forum_ctx(request, forum_id):
 
62
    forum = get_object_or_404(Forum, pk=forum_id)
 
63
 
 
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],
 
69
             }
 
70
 
 
71
    topics = forum.topics.order_by('-sticky', '-updated').select_related()
 
72
    page, paginator = paginate(topics, request, pybb_settings.FORUM_PAGE_SIZE)
 
73
 
 
74
    return {'forum': forum,
 
75
            'topics': page.object_list,
 
76
            'quick': quick,
 
77
            'page': page,
 
78
            'paginator': paginator,
 
79
            }
 
80
show_forum = render_to('pybb/forum.html')(show_forum_ctx)
 
81
 
 
82
    
 
83
def show_topic_ctx(request, topic_id):
 
84
    try:
 
85
        topic = Topic.objects.select_related().get(pk=topic_id)
 
86
    except Topic.DoesNotExist:
 
87
        raise Http404()
 
88
    topic.views += 1
 
89
    topic.save()
 
90
 
 
91
 
 
92
    if request.user.is_authenticated():
 
93
        topic.update_read(request.user)
 
94
 
 
95
    if pybb_settings.FREEZE_FIRST_POST:
 
96
        first_post = topic.posts.order_by('created')[0]
 
97
    else:
 
98
        first_post = None
 
99
    last_post = topic.posts.order_by('-created')[0]
 
100
 
 
101
    initial = {}
 
102
    if request.user.is_authenticated():
 
103
        initial = {'markup': request.user.pybb_profile.markup}
 
104
    form = AddPostForm(topic=topic, initial=initial)
 
105
 
 
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())
 
110
 
 
111
    posts = topic.posts.all().select_related()
 
112
    page, paginator = paginate(posts, request, pybb_settings.TOPIC_PAGE_SIZE,
 
113
                               total_count=topic.post_count)
 
114
 
 
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)
 
118
    
 
119
    for post in page.object_list:
 
120
        post.user.pybb_profile = profiles[post.user.id]
 
121
 
 
122
    load_related(page.object_list, Attachment.objects.all(), 'post')
 
123
 
 
124
    return {'topic': topic,
 
125
            'last_post': last_post,
 
126
            'first_post': first_post,
 
127
            'form': form,
 
128
            'moderator': moderator,
 
129
            'subscribed': subscribed,
 
130
            'posts': page.object_list,
 
131
            'page': page,
 
132
            'paginator': paginator,
 
133
            'form_url': reverse('pybb_add_post', args=[topic.id]),
 
134
            }
 
135
show_topic = render_to('pybb/topic.html')(show_topic_ctx)
 
136
 
 
137
 
 
138
@login_required
 
139
def add_post_ctx(request, forum_id, topic_id):
 
140
    forum = None
 
141
    topic = None
 
142
 
 
143
    if forum_id:
 
144
        forum = get_object_or_404(Forum, pk=forum_id)
 
145
    elif topic_id:
 
146
        topic = get_object_or_404(Topic, pk=topic_id)
 
147
 
 
148
    if topic and topic.closed:
 
149
        return HttpResponseRedirect(topic.get_absolute_url())
 
150
 
 
151
    try:
 
152
        quote_id = int(request.GET.get('quote_id'))
 
153
    except TypeError:
 
154
        quote = ''
 
155
    else:
 
156
        post = get_object_or_404(Post, pk=quote_id)
 
157
        quote = quote_text(post.body_text, post.user, request.user.pybb_profile.markup)
 
158
 
 
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})
 
163
 
 
164
    if form.is_valid():
 
165
        post = form.save();
 
166
        return HttpResponseRedirect(post.get_absolute_url())
 
167
 
 
168
    if topic:
 
169
        form_url = reverse('pybb_add_post', args=[topic.id])
 
170
    else:
 
171
        form_url = reverse('pybb_add_topic', args=[forum.id])
 
172
 
 
173
    return {'form': form,
 
174
            'topic': topic,
 
175
            'forum': forum,
 
176
            'form_url': form_url,
 
177
            }
 
178
add_post = render_to('pybb/add_post.html')(add_post_ctx)
 
179
 
 
180
 
 
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,
 
186
            }
 
187
user = render_to('pybb/user.html')(user_ctx)
 
188
 
 
189
 
 
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)
 
196
 
 
197
 
 
198
@login_required
 
199
def edit_profile_ctx(request):
 
200
    form = build_form(EditProfileForm, request, instance=request.user.pybb_profile)
 
201
    if form.is_valid():
 
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,
 
207
            }
 
208
edit_profile = render_to('pybb/edit_profile.html')(edit_profile_ctx)
 
209
 
 
210
    
 
211
@login_required
 
212
def edit_post_ctx(request, post_id):
 
213
    from pybb.templatetags.pybb_extras import pybb_editable_by
 
214
 
 
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())
 
218
 
 
219
    form = build_form(EditPostForm, request, instance=post)
 
220
 
 
221
    if form.is_valid():
 
222
        post = form.save()
 
223
        return HttpResponseRedirect(post.get_absolute_url())
 
224
 
 
225
    return {'form': form,
 
226
            'post': post,
 
227
            }
 
228
edit_post = render_to('pybb/edit_post.html')(edit_post_ctx)
 
229
 
 
230
 
 
231
@login_required
 
232
def stick_topic(request, topic_id):
 
233
    from pybb.templatetags.pybb_extras import pybb_moderated_by
 
234
 
 
235
    topic = get_object_or_404(Topic, pk=topic_id)
 
236
    if pybb_moderated_by(topic, request.user):
 
237
        if not topic.sticky:
 
238
            topic.sticky = True
 
239
            topic.save()
 
240
    return HttpResponseRedirect(topic.get_absolute_url())
 
241
 
 
242
 
 
243
@login_required
 
244
def unstick_topic(request, topic_id):
 
245
    from pybb.templatetags.pybb_extras import pybb_moderated_by
 
246
 
 
247
    topic = get_object_or_404(Topic, pk=topic_id)
 
248
    if pybb_moderated_by(topic, request.user):
 
249
        if topic.sticky:
 
250
            topic.sticky = False
 
251
            topic.save()
 
252
    return HttpResponseRedirect(topic.get_absolute_url())
 
253
 
 
254
 
 
255
@login_required
 
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]
 
259
 
 
260
    allowed = False
 
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):
 
264
        allowed = True
 
265
 
 
266
    if not allowed:
 
267
        return HttpResponseRedirect(post.get_absolute_url())
 
268
 
 
269
    if 'POST' == request.method:
 
270
        topic = post.topic
 
271
        forum = post.topic.forum
 
272
        post.delete()
 
273
 
 
274
        try:
 
275
            Topic.objects.get(pk=topic.id)
 
276
        except Topic.DoesNotExist:
 
277
            return HttpResponseRedirect(forum.get_absolute_url())
 
278
        else:
 
279
            return HttpResponseRedirect(topic.get_absolute_url())
 
280
    else:
 
281
        return {'post': post,
 
282
                }
 
283
delete_post = render_to('pybb/delete_post.html')(delete_post_ctx)
 
284
 
 
285
 
 
286
@login_required
 
287
def close_topic(request, topic_id):
 
288
    from pybb.templatetags.pybb_extras import pybb_moderated_by
 
289
 
 
290
    topic = get_object_or_404(Topic, pk=topic_id)
 
291
    if pybb_moderated_by(topic, request.user):
 
292
        if not topic.closed:
 
293
            topic.closed = True
 
294
            topic.save()
 
295
    return HttpResponseRedirect(topic.get_absolute_url())
 
296
 
 
297
 
 
298
@login_required
 
299
def open_topic(request, topic_id):
 
300
    from pybb.templatetags.pybb_extras import pybb_moderated_by
 
301
 
 
302
    topic = get_object_or_404(Topic, pk=topic_id)
 
303
    if pybb_moderated_by(topic, request.user):
 
304
        if topic.closed:
 
305
            topic.closed = False
 
306
            topic.save()
 
307
    return HttpResponseRedirect(topic.get_absolute_url())
 
308
 
 
309
 
 
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)
 
315
 
 
316
    page, paginator = paginate(users, request, pybb_settings.USERS_PAGE_SIZE)
 
317
 
 
318
    return {'users': page.object_list,
 
319
            'page': page,
 
320
            'paginator': paginator,
 
321
            'form': form,
 
322
            }
 
323
users = render_to('pybb/users.html')(users_ctx)
 
324
 
 
325
 
 
326
@login_required
 
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]))
 
332
    else:
 
333
        return HttpResponseRedirect(reverse('pybb_edit_profile'))
 
334
 
 
335
 
 
336
@login_required
 
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]))
 
341
 
 
342
 
 
343
@login_required
 
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})
 
349
 
 
350
    if form.is_valid():
 
351
        post = form.save();
 
352
        return HttpResponseRedirect(reverse('pybb_pm_outbox'))
 
353
 
 
354
    return {'form': form,
 
355
            'pm_mode': 'create',
 
356
            }
 
357
create_pm = render_to('pybb/pm/create_pm.html')(create_pm_ctx)
 
358
 
 
359
 
 
360
@login_required
 
361
def pm_outbox_ctx(request):
 
362
    messages = PrivateMessage.objects.filter(src_user=request.user)
 
363
    return {'messages': messages,
 
364
            'pm_mode': 'outbox',
 
365
            }
 
366
pm_outbox = render_to('pybb/pm/outbox.html')(pm_outbox_ctx)
 
367
 
 
368
 
 
369
@login_required
 
370
def pm_inbox_ctx(request):
 
371
    messages = PrivateMessage.objects.filter(dst_user=request.user)
 
372
    return {'messages': messages,
 
373
            'pm_mode': 'inbox',
 
374
            }
 
375
pm_inbox = render_to('pybb/pm/inbox.html')(pm_inbox_ctx)
 
376
 
 
377
 
 
378
@login_required
 
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:
 
384
        pm_mode = 'inbox'
 
385
        if not msg.read:
 
386
            msg.read = True
 
387
            msg.save()
 
388
        post_user = msg.src_user
 
389
    else:
 
390
        pm_mode = 'outbox'
 
391
        post_user = msg.dst_user
 
392
    return {'msg': msg,
 
393
            'pm_mode': pm_mode,
 
394
            'post_user': post_user,
 
395
            }
 
396
show_pm = render_to('pybb/pm/message.html')(show_pm_ctx)
 
397
 
 
398
 
 
399
@login_required
 
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)
 
404
 
 
405
 
 
406
@login_required
 
407
@ajax
 
408
def post_ajax_preview(request):
 
409
    content = request.POST.get('content')
 
410
    markup = request.POST.get('markup')
 
411
 
 
412
    if not markup in dict(MARKUP_CHOICES).keys():
 
413
        return {'error': 'Invalid markup'}
 
414
 
 
415
    if not content:
 
416
        return {'content': ''}
 
417
 
 
418
    if markup == 'bbcode':
 
419
        html = mypostmarkup.markup(content, auto_urls=False)
 
420
    elif markup == 'markdown':
 
421
        html = unicode(Markdown(content, safe_mode='escape'))
 
422
 
 
423
    html = urlize(html)
 
424
    return {'content': html}