##// END OF EJS Templates
Do not parse links to posts that do not exists in the time of posting.
neko259 -
r312:c4a9a992 default
parent child Browse files
Show More
@@ -1,459 +1,478 b''
1 import hashlib
1 import hashlib
2 import string
2 import string
3 from django.core import serializers
3 from django.core import serializers
4 from django.core.urlresolvers import reverse
4 from django.core.urlresolvers import reverse
5 from django.http import HttpResponseRedirect
5 from django.http import HttpResponseRedirect
6 from django.http.response import HttpResponse
6 from django.http.response import HttpResponse
7 from django.template import RequestContext
7 from django.template import RequestContext
8 from django.shortcuts import render, redirect, get_object_or_404
8 from django.shortcuts import render, redirect, get_object_or_404
9 from django.utils import timezone
9 from django.utils import timezone
10
10
11 from boards import forms
11 from boards import forms
12 import boards
12 import boards
13 from boards import utils
13 from boards import utils
14 from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
14 from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \
15 ThreadCaptchaForm, PostCaptchaForm, LoginForm, ModeratorSettingsForm
15 ThreadCaptchaForm, PostCaptchaForm, LoginForm, ModeratorSettingsForm
16
16
17 from boards.models import Post, Tag, Ban, User, RANK_USER, SETTING_MODERATE
17 from boards.models import Post, Tag, Ban, User, RANK_USER, SETTING_MODERATE, \
18 REGEX_REPLY
18 from boards import authors
19 from boards import authors
19 from boards.utils import get_client_ip
20 from boards.utils import get_client_ip
20 import neboard
21 import neboard
22 import re
21
23
22
24
23 def index(request, page=0):
25 def index(request, page=0):
24 context = _init_default_context(request)
26 context = _init_default_context(request)
25
27
26 if utils.need_include_captcha(request):
28 if utils.need_include_captcha(request):
27 threadFormClass = ThreadCaptchaForm
29 threadFormClass = ThreadCaptchaForm
28 kwargs = {'request': request}
30 kwargs = {'request': request}
29 else:
31 else:
30 threadFormClass = ThreadForm
32 threadFormClass = ThreadForm
31 kwargs = {}
33 kwargs = {}
32
34
33 if request.method == 'POST':
35 if request.method == 'POST':
34 form = threadFormClass(request.POST, request.FILES,
36 form = threadFormClass(request.POST, request.FILES,
35 error_class=PlainErrorList, **kwargs)
37 error_class=PlainErrorList, **kwargs)
36 form.session = request.session
38 form.session = request.session
37
39
38 if form.is_valid():
40 if form.is_valid():
39 return _new_post(request, form)
41 return _new_post(request, form)
40 if form.need_to_ban:
42 if form.need_to_ban:
41 # Ban user because he is suspected to be a bot
43 # Ban user because he is suspected to be a bot
42 _ban_current_user(request)
44 _ban_current_user(request)
43 else:
45 else:
44 form = threadFormClass(error_class=PlainErrorList, **kwargs)
46 form = threadFormClass(error_class=PlainErrorList, **kwargs)
45
47
46 threads = []
48 threads = []
47 for thread in Post.objects.get_threads(page=int(page)):
49 for thread in Post.objects.get_threads(page=int(page)):
48 threads.append({'thread': thread,
50 threads.append({'thread': thread,
49 'bumpable': thread.can_bump()})
51 'bumpable': thread.can_bump()})
50
52
51 context['threads'] = None if len(threads) == 0 else threads
53 context['threads'] = None if len(threads) == 0 else threads
52 context['form'] = form
54 context['form'] = form
53 context['pages'] = range(Post.objects.get_thread_page_count())
55 context['pages'] = range(Post.objects.get_thread_page_count())
54
56
55 return render(request, 'boards/posting_general.html',
57 return render(request, 'boards/posting_general.html',
56 context)
58 context)
57
59
58
60
59 def _new_post(request, form, thread_id=boards.models.NO_PARENT):
61 def _new_post(request, form, thread_id=boards.models.NO_PARENT):
60 """Add a new post (in thread or as a reply)."""
62 """Add a new post (in thread or as a reply)."""
61
63
62 ip = get_client_ip(request)
64 ip = get_client_ip(request)
63 is_banned = Ban.objects.filter(ip=ip).exists()
65 is_banned = Ban.objects.filter(ip=ip).exists()
64
66
65 if is_banned:
67 if is_banned:
66 return redirect(you_are_banned)
68 return redirect(you_are_banned)
67
69
68 data = form.cleaned_data
70 data = form.cleaned_data
69
71
70 title = data['title']
72 title = data['title']
71 text = data['text']
73 text = data['text']
72
74
75 text = _remove_invalid_links(text)
76
73 if 'image' in data.keys():
77 if 'image' in data.keys():
74 image = data['image']
78 image = data['image']
75 else:
79 else:
76 image = None
80 image = None
77
81
78 tags = []
82 tags = []
79
83
80 new_thread = thread_id == boards.models.NO_PARENT
84 new_thread = thread_id == boards.models.NO_PARENT
81 if new_thread:
85 if new_thread:
82 tag_strings = data['tags']
86 tag_strings = data['tags']
83
87
84 if tag_strings:
88 if tag_strings:
85 tag_strings = tag_strings.split(' ')
89 tag_strings = tag_strings.split(' ')
86 for tag_name in tag_strings:
90 for tag_name in tag_strings:
87 tag_name = string.lower(tag_name.strip())
91 tag_name = string.lower(tag_name.strip())
88 if len(tag_name) > 0:
92 if len(tag_name) > 0:
89 tag, created = Tag.objects.get_or_create(name=tag_name)
93 tag, created = Tag.objects.get_or_create(name=tag_name)
90 tags.append(tag)
94 tags.append(tag)
91
95
92 linked_tags = tag.get_linked_tags()
96 linked_tags = tag.get_linked_tags()
93 if len(linked_tags) > 0:
97 if len(linked_tags) > 0:
94 tags.extend(linked_tags)
98 tags.extend(linked_tags)
95
99
96 op = None if thread_id == boards.models.NO_PARENT else \
100 op = None if thread_id == boards.models.NO_PARENT else \
97 get_object_or_404(Post, id=thread_id)
101 get_object_or_404(Post, id=thread_id)
98 post = Post.objects.create_post(title=title, text=text, ip=ip,
102 post = Post.objects.create_post(title=title, text=text, ip=ip,
99 thread=op, image=image,
103 thread=op, image=image,
100 tags=tags, user=_get_user(request))
104 tags=tags, user=_get_user(request))
101
105
102 thread_to_show = (post.id if new_thread else thread_id)
106 thread_to_show = (post.id if new_thread else thread_id)
103
107
104 if new_thread:
108 if new_thread:
105 return redirect(thread, post_id=thread_to_show)
109 return redirect(thread, post_id=thread_to_show)
106 else:
110 else:
107 return redirect(reverse(thread, kwargs={'post_id': thread_to_show}) +
111 return redirect(reverse(thread, kwargs={'post_id': thread_to_show}) +
108 '#' + str(post.id))
112 '#' + str(post.id))
109
113
110
114
111 def tag(request, tag_name, page=0):
115 def tag(request, tag_name, page=0):
112 """
116 """
113 Get all tag threads. Threads are split in pages, so some page is
117 Get all tag threads. Threads are split in pages, so some page is
114 requested. Default page is 0.
118 requested. Default page is 0.
115 """
119 """
116
120
117 tag = get_object_or_404(Tag, name=tag_name)
121 tag = get_object_or_404(Tag, name=tag_name)
118 threads = []
122 threads = []
119 for thread in Post.objects.get_threads(tag=tag, page=int(page)):
123 for thread in Post.objects.get_threads(tag=tag, page=int(page)):
120 threads.append({'thread': thread,
124 threads.append({'thread': thread,
121 'bumpable': thread.can_bump()})
125 'bumpable': thread.can_bump()})
122
126
123 if request.method == 'POST':
127 if request.method == 'POST':
124 form = ThreadForm(request.POST, request.FILES,
128 form = ThreadForm(request.POST, request.FILES,
125 error_class=PlainErrorList)
129 error_class=PlainErrorList)
126 form.session = request.session
130 form.session = request.session
127
131
128 if form.is_valid():
132 if form.is_valid():
129 return _new_post(request, form)
133 return _new_post(request, form)
130 if form.need_to_ban:
134 if form.need_to_ban:
131 # Ban user because he is suspected to be a bot
135 # Ban user because he is suspected to be a bot
132 _ban_current_user(request)
136 _ban_current_user(request)
133 else:
137 else:
134 form = forms.ThreadForm(initial={'tags': tag_name},
138 form = forms.ThreadForm(initial={'tags': tag_name},
135 error_class=PlainErrorList)
139 error_class=PlainErrorList)
136
140
137 context = _init_default_context(request)
141 context = _init_default_context(request)
138 context['threads'] = None if len(threads) == 0 else threads
142 context['threads'] = None if len(threads) == 0 else threads
139 context['tag'] = tag
143 context['tag'] = tag
140 context['pages'] = range(Post.objects.get_thread_page_count(tag=tag))
144 context['pages'] = range(Post.objects.get_thread_page_count(tag=tag))
141
145
142 context['form'] = form
146 context['form'] = form
143
147
144 return render(request, 'boards/posting_general.html',
148 return render(request, 'boards/posting_general.html',
145 context)
149 context)
146
150
147
151
148 def thread(request, post_id):
152 def thread(request, post_id):
149 """Get all thread posts"""
153 """Get all thread posts"""
150
154
151 if utils.need_include_captcha(request):
155 if utils.need_include_captcha(request):
152 postFormClass = PostCaptchaForm
156 postFormClass = PostCaptchaForm
153 kwargs = {'request': request}
157 kwargs = {'request': request}
154 else:
158 else:
155 postFormClass = PostForm
159 postFormClass = PostForm
156 kwargs = {}
160 kwargs = {}
157
161
158 if request.method == 'POST':
162 if request.method == 'POST':
159 form = postFormClass(request.POST, request.FILES,
163 form = postFormClass(request.POST, request.FILES,
160 error_class=PlainErrorList, **kwargs)
164 error_class=PlainErrorList, **kwargs)
161 form.session = request.session
165 form.session = request.session
162
166
163 if form.is_valid():
167 if form.is_valid():
164 return _new_post(request, form, post_id)
168 return _new_post(request, form, post_id)
165 if form.need_to_ban:
169 if form.need_to_ban:
166 # Ban user because he is suspected to be a bot
170 # Ban user because he is suspected to be a bot
167 _ban_current_user(request)
171 _ban_current_user(request)
168 else:
172 else:
169 form = postFormClass(error_class=PlainErrorList, **kwargs)
173 form = postFormClass(error_class=PlainErrorList, **kwargs)
170
174
171 posts = Post.objects.get_thread(post_id)
175 posts = Post.objects.get_thread(post_id)
172
176
173 context = _init_default_context(request)
177 context = _init_default_context(request)
174
178
175 context['posts'] = posts
179 context['posts'] = posts
176 context['form'] = form
180 context['form'] = form
177 context['bumpable'] = posts[0].can_bump()
181 context['bumpable'] = posts[0].can_bump()
178 if context['bumpable']:
182 if context['bumpable']:
179 context['posts_left'] = neboard.settings.MAX_POSTS_PER_THREAD - len(
183 context['posts_left'] = neboard.settings.MAX_POSTS_PER_THREAD - len(
180 posts)
184 posts)
181 context['bumplimit_progress'] = str(float(context['posts_left']) /
185 context['bumplimit_progress'] = str(float(context['posts_left']) /
182 neboard.settings.MAX_POSTS_PER_THREAD * 100)
186 neboard.settings.MAX_POSTS_PER_THREAD * 100)
183
187
184 return render(request, 'boards/thread.html', context)
188 return render(request, 'boards/thread.html', context)
185
189
186
190
187 def login(request):
191 def login(request):
188 """Log in with user id"""
192 """Log in with user id"""
189
193
190 context = _init_default_context(request)
194 context = _init_default_context(request)
191
195
192 if request.method == 'POST':
196 if request.method == 'POST':
193 form = LoginForm(request.POST, request.FILES,
197 form = LoginForm(request.POST, request.FILES,
194 error_class=PlainErrorList)
198 error_class=PlainErrorList)
195 form.session = request.session
199 form.session = request.session
196
200
197 if form.is_valid():
201 if form.is_valid():
198 user = User.objects.get(user_id=form.cleaned_data['user_id'])
202 user = User.objects.get(user_id=form.cleaned_data['user_id'])
199 request.session['user_id'] = user.id
203 request.session['user_id'] = user.id
200 return redirect(index)
204 return redirect(index)
201
205
202 else:
206 else:
203 form = LoginForm()
207 form = LoginForm()
204
208
205 context['form'] = form
209 context['form'] = form
206
210
207 return render(request, 'boards/login.html', context)
211 return render(request, 'boards/login.html', context)
208
212
209
213
210 def settings(request):
214 def settings(request):
211 """User's settings"""
215 """User's settings"""
212
216
213 context = _init_default_context(request)
217 context = _init_default_context(request)
214 user = _get_user(request)
218 user = _get_user(request)
215 is_moderator = user.is_moderator()
219 is_moderator = user.is_moderator()
216
220
217 if request.method == 'POST':
221 if request.method == 'POST':
218 if is_moderator:
222 if is_moderator:
219 form = ModeratorSettingsForm(request.POST,
223 form = ModeratorSettingsForm(request.POST,
220 error_class=PlainErrorList)
224 error_class=PlainErrorList)
221 else:
225 else:
222 form = SettingsForm(request.POST, error_class=PlainErrorList)
226 form = SettingsForm(request.POST, error_class=PlainErrorList)
223
227
224 if form.is_valid():
228 if form.is_valid():
225 selected_theme = form.cleaned_data['theme']
229 selected_theme = form.cleaned_data['theme']
226
230
227 user.save_setting('theme', selected_theme)
231 user.save_setting('theme', selected_theme)
228
232
229 if is_moderator:
233 if is_moderator:
230 moderate = form.cleaned_data['moderate']
234 moderate = form.cleaned_data['moderate']
231 user.save_setting(SETTING_MODERATE, moderate)
235 user.save_setting(SETTING_MODERATE, moderate)
232
236
233 return redirect(settings)
237 return redirect(settings)
234 else:
238 else:
235 selected_theme = _get_theme(request)
239 selected_theme = _get_theme(request)
236
240
237 if is_moderator:
241 if is_moderator:
238 form = ModeratorSettingsForm(initial={'theme': selected_theme,
242 form = ModeratorSettingsForm(initial={'theme': selected_theme,
239 'moderate': context['moderator']},
243 'moderate': context['moderator']},
240 error_class=PlainErrorList)
244 error_class=PlainErrorList)
241 else:
245 else:
242 form = SettingsForm(initial={'theme': selected_theme},
246 form = SettingsForm(initial={'theme': selected_theme},
243 error_class=PlainErrorList)
247 error_class=PlainErrorList)
244
248
245 context['form'] = form
249 context['form'] = form
246
250
247 return render(request, 'boards/settings.html', context)
251 return render(request, 'boards/settings.html', context)
248
252
249
253
250 def all_tags(request):
254 def all_tags(request):
251 """All tags list"""
255 """All tags list"""
252
256
253 context = _init_default_context(request)
257 context = _init_default_context(request)
254 context['all_tags'] = Tag.objects.get_not_empty_tags()
258 context['all_tags'] = Tag.objects.get_not_empty_tags()
255
259
256 return render(request, 'boards/tags.html', context)
260 return render(request, 'boards/tags.html', context)
257
261
258
262
259 def jump_to_post(request, post_id):
263 def jump_to_post(request, post_id):
260 """Determine thread in which the requested post is and open it's page"""
264 """Determine thread in which the requested post is and open it's page"""
261
265
262 post = get_object_or_404(Post, id=post_id)
266 post = get_object_or_404(Post, id=post_id)
263
267
264 if not post.thread:
268 if not post.thread:
265 return redirect(thread, post_id=post.id)
269 return redirect(thread, post_id=post.id)
266 else:
270 else:
267 return redirect(reverse(thread, kwargs={'post_id': post.thread.id})
271 return redirect(reverse(thread, kwargs={'post_id': post.thread.id})
268 + '#' + str(post.id))
272 + '#' + str(post.id))
269
273
270
274
271 def authors(request):
275 def authors(request):
272 """Show authors list"""
276 """Show authors list"""
273
277
274 context = _init_default_context(request)
278 context = _init_default_context(request)
275 context['authors'] = boards.authors.authors
279 context['authors'] = boards.authors.authors
276
280
277 return render(request, 'boards/authors.html', context)
281 return render(request, 'boards/authors.html', context)
278
282
279
283
280 def delete(request, post_id):
284 def delete(request, post_id):
281 """Delete post"""
285 """Delete post"""
282
286
283 user = _get_user(request)
287 user = _get_user(request)
284 post = get_object_or_404(Post, id=post_id)
288 post = get_object_or_404(Post, id=post_id)
285
289
286 if user.is_moderator():
290 if user.is_moderator():
287 # TODO Show confirmation page before deletion
291 # TODO Show confirmation page before deletion
288 Post.objects.delete_post(post)
292 Post.objects.delete_post(post)
289
293
290 if not post.thread:
294 if not post.thread:
291 return _redirect_to_next(request)
295 return _redirect_to_next(request)
292 else:
296 else:
293 return redirect(thread, post_id=post.thread.id)
297 return redirect(thread, post_id=post.thread.id)
294
298
295
299
296 def ban(request, post_id):
300 def ban(request, post_id):
297 """Ban user"""
301 """Ban user"""
298
302
299 user = _get_user(request)
303 user = _get_user(request)
300 post = get_object_or_404(Post, id=post_id)
304 post = get_object_or_404(Post, id=post_id)
301
305
302 if user.is_moderator():
306 if user.is_moderator():
303 # TODO Show confirmation page before ban
307 # TODO Show confirmation page before ban
304 Ban.objects.get_or_create(ip=post.poster_ip)
308 Ban.objects.get_or_create(ip=post.poster_ip)
305
309
306 return _redirect_to_next(request)
310 return _redirect_to_next(request)
307
311
308
312
309 def you_are_banned(request):
313 def you_are_banned(request):
310 """Show the page that notifies that user is banned"""
314 """Show the page that notifies that user is banned"""
311
315
312 context = _init_default_context(request)
316 context = _init_default_context(request)
313 return render(request, 'boards/staticpages/banned.html', context)
317 return render(request, 'boards/staticpages/banned.html', context)
314
318
315
319
316 def page_404(request):
320 def page_404(request):
317 """Show page 404 (not found error)"""
321 """Show page 404 (not found error)"""
318
322
319 context = _init_default_context(request)
323 context = _init_default_context(request)
320 return render(request, 'boards/404.html', context)
324 return render(request, 'boards/404.html', context)
321
325
322
326
323 def tag_subscribe(request, tag_name):
327 def tag_subscribe(request, tag_name):
324 """Add tag to favorites"""
328 """Add tag to favorites"""
325
329
326 user = _get_user(request)
330 user = _get_user(request)
327 tag = get_object_or_404(Tag, name=tag_name)
331 tag = get_object_or_404(Tag, name=tag_name)
328
332
329 if not tag in user.fav_tags.all():
333 if not tag in user.fav_tags.all():
330 user.fav_tags.add(tag)
334 user.fav_tags.add(tag)
331
335
332 return _redirect_to_next(request)
336 return _redirect_to_next(request)
333
337
334
338
335 def tag_unsubscribe(request, tag_name):
339 def tag_unsubscribe(request, tag_name):
336 """Remove tag from favorites"""
340 """Remove tag from favorites"""
337
341
338 user = _get_user(request)
342 user = _get_user(request)
339 tag = get_object_or_404(Tag, name=tag_name)
343 tag = get_object_or_404(Tag, name=tag_name)
340
344
341 if tag in user.fav_tags.all():
345 if tag in user.fav_tags.all():
342 user.fav_tags.remove(tag)
346 user.fav_tags.remove(tag)
343
347
344 return _redirect_to_next(request)
348 return _redirect_to_next(request)
345
349
346
350
347 def static_page(request, name):
351 def static_page(request, name):
348 """Show a static page that needs only tags list and a CSS"""
352 """Show a static page that needs only tags list and a CSS"""
349
353
350 context = _init_default_context(request)
354 context = _init_default_context(request)
351 return render(request, 'boards/staticpages/' + name + '.html', context)
355 return render(request, 'boards/staticpages/' + name + '.html', context)
352
356
353
357
354 def api_get_post(request, post_id):
358 def api_get_post(request, post_id):
355 """
359 """
356 Get the JSON of a post. This can be
360 Get the JSON of a post. This can be
357 used as and API for external clients.
361 used as and API for external clients.
358 """
362 """
359
363
360 post = get_object_or_404(Post, id=post_id)
364 post = get_object_or_404(Post, id=post_id)
361
365
362 json = serializers.serialize("json", [post], fields=(
366 json = serializers.serialize("json", [post], fields=(
363 "pub_time", "_text_rendered", "title", "text", "image",
367 "pub_time", "_text_rendered", "title", "text", "image",
364 "image_width", "image_height", "replies", "tags"
368 "image_width", "image_height", "replies", "tags"
365 ))
369 ))
366
370
367 return HttpResponse(content=json)
371 return HttpResponse(content=json)
368
372
369
373
370 def get_post(request, post_id):
374 def get_post(request, post_id):
371 """Get the html of a post. Used for popups."""
375 """Get the html of a post. Used for popups."""
372
376
373 post = get_object_or_404(Post, id=post_id)
377 post = get_object_or_404(Post, id=post_id)
374
378
375 context = RequestContext(request)
379 context = RequestContext(request)
376 context["post"] = post
380 context["post"] = post
377
381
378 return render(request, 'boards/post.html', context)
382 return render(request, 'boards/post.html', context)
379
383
380
384
381 def _get_theme(request, user=None):
385 def _get_theme(request, user=None):
382 """Get user's CSS theme"""
386 """Get user's CSS theme"""
383
387
384 if not user:
388 if not user:
385 user = _get_user(request)
389 user = _get_user(request)
386 theme = user.get_setting('theme')
390 theme = user.get_setting('theme')
387 if not theme:
391 if not theme:
388 theme = neboard.settings.DEFAULT_THEME
392 theme = neboard.settings.DEFAULT_THEME
389
393
390 return theme
394 return theme
391
395
392
396
393 def _init_default_context(request):
397 def _init_default_context(request):
394 """Create context with default values that are used in most views"""
398 """Create context with default values that are used in most views"""
395
399
396 context = RequestContext(request)
400 context = RequestContext(request)
397
401
398 user = _get_user(request)
402 user = _get_user(request)
399 context['user'] = user
403 context['user'] = user
400 context['tags'] = user.get_sorted_fav_tags()
404 context['tags'] = user.get_sorted_fav_tags()
401
405
402 theme = _get_theme(request, user)
406 theme = _get_theme(request, user)
403 context['theme'] = theme
407 context['theme'] = theme
404 context['theme_css'] = 'css/' + theme + '/base_page.css'
408 context['theme_css'] = 'css/' + theme + '/base_page.css'
405
409
406 # This shows the moderator panel
410 # This shows the moderator panel
407 moderate = user.get_setting(SETTING_MODERATE)
411 moderate = user.get_setting(SETTING_MODERATE)
408 if moderate == 'True':
412 if moderate == 'True':
409 context['moderator'] = user.is_moderator()
413 context['moderator'] = user.is_moderator()
410 else:
414 else:
411 context['moderator'] = False
415 context['moderator'] = False
412
416
413 return context
417 return context
414
418
415
419
416 def _get_user(request):
420 def _get_user(request):
417 """
421 """
418 Get current user from the session. If the user does not exist, create
422 Get current user from the session. If the user does not exist, create
419 a new one.
423 a new one.
420 """
424 """
421
425
422 session = request.session
426 session = request.session
423 if not 'user_id' in session:
427 if not 'user_id' in session:
424 request.session.save()
428 request.session.save()
425
429
426 md5 = hashlib.md5()
430 md5 = hashlib.md5()
427 md5.update(session.session_key)
431 md5.update(session.session_key)
428 new_id = md5.hexdigest()
432 new_id = md5.hexdigest()
429
433
430 time_now = timezone.now()
434 time_now = timezone.now()
431 user = User.objects.create(user_id=new_id, rank=RANK_USER,
435 user = User.objects.create(user_id=new_id, rank=RANK_USER,
432 registration_time=time_now)
436 registration_time=time_now)
433
437
434 session['user_id'] = user.id
438 session['user_id'] = user.id
435 else:
439 else:
436 user = User.objects.get(id=session['user_id'])
440 user = User.objects.get(id=session['user_id'])
437
441
438 return user
442 return user
439
443
440
444
441 def _redirect_to_next(request):
445 def _redirect_to_next(request):
442 """
446 """
443 If a 'next' parameter was specified, redirect to the next page. This is
447 If a 'next' parameter was specified, redirect to the next page. This is
444 used when the user is required to return to some page after the current
448 used when the user is required to return to some page after the current
445 view has finished its work.
449 view has finished its work.
446 """
450 """
447
451
448 if 'next' in request.GET:
452 if 'next' in request.GET:
449 next_page = request.GET['next']
453 next_page = request.GET['next']
450 return HttpResponseRedirect(next_page)
454 return HttpResponseRedirect(next_page)
451 else:
455 else:
452 return redirect(index)
456 return redirect(index)
453
457
454
458
455 def _ban_current_user(request):
459 def _ban_current_user(request):
456 """Add current user to the IP ban list"""
460 """Add current user to the IP ban list"""
457
461
458 ip = utils.get_client_ip(request)
462 ip = utils.get_client_ip(request)
459 Ban.objects.get_or_create(ip=ip)
463 Ban.objects.get_or_create(ip=ip)
464
465
466 def _remove_invalid_links(text):
467 """
468 Replace invalid links in posts so that they won't be parsed.
469 Invalid links are links to non-existent posts
470 """
471
472 for reply_number in re.finditer(REGEX_REPLY, text):
473 id = reply_number.group(1)
474 post = Post.objects.filter(id=id)
475 if not post.exists():
476 text = string.replace(text, '>>' + id, id)
477
478 return text
General Comments 0
You need to be logged in to leave comments. Login now