~widelands-dev/widelands-website/django_staticfiles

« back to all changes in this revision

Viewing changes to pybb/views.py

  • Committer: Holger Rapp
  • Date: 2010-09-26 13:30:30 UTC
  • Revision ID: sirver@gmx.de-20100926133030-ceirjf83vde91tyt
Added a simple events model to display dates on the homepage

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
import math
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 
4
4
 
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
14
 
 
15
 
 
16
 
from pybb.util import render_to, paged, build_form, quote_text, ajax, urlize
 
13
 
 
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,\
18
 
    MARKUP_CHOICES
19
 
from pybb.forms import AddPostForm, EditPostForm, UserSearchForm
 
16
                        MARKUP_CHOICES
 
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
22
20
 
23
 
from check_input.models import SuspiciousInput
24
 
 
25
 
try:
26
 
    from notification import models as notification
27
 
except ImportError:
28
 
    notification = None
29
 
 
30
 
 
31
21
def index_ctx(request):
32
 
    cats = Category.objects.all().select_related()
33
 
 
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],
 
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
            }
35
44
index = render_to('pybb/index.html')(index_ctx)
36
45
 
37
46
 
38
47
def show_category_ctx(request, category_id):
39
48
    category = get_object_or_404(Category, pk=category_id)
40
 
 
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],
 
54
             }
 
55
    return {'category': category,
 
56
            'quick': quick,
 
57
            }
42
58
show_category = render_to('pybb/category.html')(show_category_ctx)
43
59
 
44
60
 
45
61
def show_forum_ctx(request, forum_id):
46
62
    forum = get_object_or_404(Forum, pk=forum_id)
47
63
 
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],
 
69
             }
50
70
 
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)
53
73
 
54
74
    return {'forum': forum,
55
 
            'topics': topics,
56
 
            'page_size': pybb_settings.FORUM_PAGE_SIZE,
57
 
            'moderator': moderator,
 
75
            'topics': page.object_list,
 
76
            'quick': quick,
 
77
            'page': page,
 
78
            'paginator': paginator,
58
79
            }
59
80
show_forum = render_to('pybb/forum.html')(show_forum_ctx)
60
81
 
61
 
 
 
82
    
62
83
def show_topic_ctx(request, topic_id):
63
84
    try:
64
85
        topic = Topic.objects.select_related().get(pk=topic_id)
67
88
    topic.views += 1
68
89
    topic.save()
69
90
 
70
 
    if request.user.is_authenticated:
 
91
 
 
92
    if request.user.is_authenticated():
71
93
        topic.update_read(request.user)
72
94
 
73
95
    if pybb_settings.FREEZE_FIRST_POST:
77
99
    last_post = topic.posts.order_by('-created')[0]
78
100
 
79
101
    initial = {}
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)
83
105
 
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())
88
110
 
89
 
 
90
 
    is_spam = False
91
 
    if topic.is_hidden:
92
 
            is_spam = topic.posts.first().is_spam()
93
 
 
94
 
    if moderator:
95
 
        posts = topic.posts.select_related()
96
 
    else:
97
 
        posts = topic.posts.exclude(hidden=True).select_related()
98
 
 
 
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
 
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)
103
 
 
 
120
    
104
121
    # for post in page.object_list:
105
122
    #     post.user.pybb_profile = profiles[post.user.id]
106
123
 
107
 
    load_related(posts, Attachment.objects.all(), 'post')
 
124
    load_related(page.object_list, Attachment.objects.all(), 'post')
108
125
 
109
126
    return {'topic': topic,
110
127
            'last_post': last_post,
112
129
            'form': form,
113
130
            'moderator': moderator,
114
131
            'subscribed': subscribed,
115
 
            'posts': posts,
116
 
            'page_size': pybb_settings.TOPIC_PAGE_SIZE,
 
132
            'posts': page.object_list,
 
133
            'page': page,
 
134
            'paginator': paginator,
117
135
            'form_url': reverse('pybb_add_post', args=[topic.id]),
118
 
            'is_spam': is_spam,
119
136
            }
120
137
show_topic = render_to('pybb/topic.html')(show_topic_ctx)
121
138
 
139
156
        quote = ''
140
157
    else:
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")
143
160
 
 
161
    ip = request.META.get('REMOTE_ADDR', '')
144
162
    form = build_form(AddPostForm, request, topic=topic, forum=forum,
145
 
                      user=request.user,
146
 
                      initial={'markup': 'markdown', 'body': quote})
 
163
                      user=request.user, ip=ip,
 
164
                      initial={'markup': "markdown", 'body': quote})
147
165
 
148
166
    if form.is_valid():
149
 
        post = form.save()
150
 
 
151
 
        is_spam = False
152
 
        # Check for spam in topics name for new topics
153
 
        if not topic:
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
157
 
        if not is_spam:
158
 
            is_spam = SuspiciousInput.check_input(
159
 
                content_object=post, user=post.user, text=post.body)
160
 
 
161
 
        if is_spam:
162
 
            post.hidden = is_spam
163
 
            post.save(update_fields=['hidden'])
164
 
            return HttpResponseRedirect('/moderated/')
165
 
 
166
 
        if notification:
167
 
            if not topic:
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,
173
 
                                   'post': post,
174
 
                                   'user': post.topic.user
175
 
                                   },
176
 
                                  queue = True)
177
 
                # Topics author is subscriber for all new posts in his topic
178
 
                post.topic.subscribers.add(request.user)
179
 
 
180
 
            else:
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)
184
 
 
 
167
        post = form.save();
185
168
        return HttpResponseRedirect(post.get_absolute_url())
186
169
 
187
170
    if topic:
210
193
    post = get_object_or_404(Post, pk=post_id)
211
194
    count = post.topic.posts.filter(created__lt=post.created).count() + 1
212
195
    page = math.ceil(count / float(pybb_settings.TOPIC_PAGE_SIZE))
213
 
    url = '%s?page=%d#post-%d' % (reverse('pybb_topic',
214
 
                                          args=[post.topic.id]), page, post.id)
 
196
    url = '%s?page=%d#post-%d' % (reverse('pybb_topic', args=[post.topic.id]), page, post.id)
215
197
    return HttpResponseRedirect(url)
216
198
 
217
199
 
227
209
 
228
210
    if form.is_valid():
229
211
        post = form.save()
230
 
        is_spam = SuspiciousInput.check_input(content_object=post, user=post.user, text=post.body)
231
 
        if is_spam:
232
 
            post.hidden = is_spam
233
 
            post.save()
234
 
            return HttpResponseRedirect('/moderated/')
235
212
        return HttpResponseRedirect(post.get_absolute_url())
236
213
 
237
214
    return {'form': form,
271
248
 
272
249
    allowed = False
273
250
    if request.user.is_superuser or\
274
 
            request.user in post.topic.forum.moderators.all() or \
275
 
            (post.user == request.user and post == last_post):
 
251
        request.user in post.topic.forum.moderators.all() or \
 
252
        (post.user == request.user and post == last_post):
276
253
        allowed = True
277
254
 
278
255
    if not allowed:
352
329
    return HttpResponseRedirect(reverse('pybb_topic', args=[topic.id]))
353
330
 
354
331
 
 
332
 
355
333
@login_required
356
334
def show_attachment(request, hash):
357
335
    attachment = get_object_or_404(Attachment, hash=hash)
363
341
@ajax
364
342
def post_ajax_preview(request):
365
343
    content = request.POST.get('content')
366
 
    markup = request.POST.get('markup')
 
344
    markup = "markdown"
367
345
 
368
346
    if not markup in dict(MARKUP_CHOICES).keys():
369
347
        return {'error': 'Invalid markup'}
374
352
    if markup == 'bbcode':
375
353
        html = mypostmarkup.markup(content, auto_urls=False)
376
354
    elif markup == 'markdown':
377
 
        html = unicode(do_wl_markdown(content, 'bleachit'))
 
355
        html = unicode(Markdown(content, safe_mode='escape'))
 
356
 
378
357
 
379
358
    html = urlize(html)
380
359
    return {'content': html}
381
 
 
382
 
 
383
 
def pybb_moderate_info(request):
384
 
    return render(request, 'pybb/pybb_moderate_info.html')
385
 
 
386
 
 
387
 
def toggle_hidden_topic(request, topic_id):
388
 
    topic = get_object_or_404(Topic, pk=topic_id)
389
 
    first_post = topic.posts.all()[0]
390
 
    if first_post.hidden:
391
 
        first_post.hidden = False
392
 
    else:
393
 
        first_post.hidden = True
394
 
    first_post.save()
395
 
    
396
 
    return redirect(topic)
 
 
b'\\ No newline at end of file'