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