##// END OF EJS Templates
Show max file size in the posting templates
neko259 -
r1396:52abbcde default
parent child Browse files
Show More
1 NO CONTENT: modified file, binary diff hidden
@@ -1,501 +1,505 b''
1 1 # SOME DESCRIPTIVE TITLE.
2 2 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3 3 # This file is distributed under the same license as the PACKAGE package.
4 4 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5 5 #
6 6 msgid ""
7 7 msgstr ""
8 8 "Project-Id-Version: PACKAGE VERSION\n"
9 9 "Report-Msgid-Bugs-To: \n"
10 10 "POT-Creation-Date: 2015-10-09 23:21+0300\n"
11 11 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12 12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13 13 "Language-Team: LANGUAGE <LL@li.org>\n"
14 14 "Language: ru\n"
15 15 "MIME-Version: 1.0\n"
16 16 "Content-Type: text/plain; charset=UTF-8\n"
17 17 "Content-Transfer-Encoding: 8bit\n"
18 18 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
19 19 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
20 20
21 21 #: admin.py:22
22 22 msgid "{} posters were banned"
23 23 msgstr ""
24 24
25 25 #: authors.py:9
26 26 msgid "author"
27 27 msgstr "автор"
28 28
29 29 #: authors.py:10
30 30 msgid "developer"
31 31 msgstr "разработчик"
32 32
33 33 #: authors.py:11
34 34 msgid "javascript developer"
35 35 msgstr "разработчик javascript"
36 36
37 37 #: authors.py:12
38 38 msgid "designer"
39 39 msgstr "дизайнер"
40 40
41 41 #: forms.py:30
42 42 msgid "Type message here. Use formatting panel for more advanced usage."
43 43 msgstr ""
44 44 "Вводите сообщение сюда. Используйте панель для более сложного форматирования."
45 45
46 46 #: forms.py:31
47 47 msgid "music images i_dont_like_tags"
48 48 msgstr "музыка картинки теги_не_нужны"
49 49
50 50 #: forms.py:33
51 51 msgid "Title"
52 52 msgstr "Заголовок"
53 53
54 54 #: forms.py:34
55 55 msgid "Text"
56 56 msgstr "Текст"
57 57
58 58 #: forms.py:35
59 59 msgid "Tag"
60 60 msgstr "Метка"
61 61
62 62 #: forms.py:36 templates/boards/base.html:40 templates/search/search.html:7
63 63 msgid "Search"
64 64 msgstr "Поиск"
65 65
66 66 #: forms.py:139
67 67 msgid "File"
68 68 msgstr "Файл"
69 69
70 70 #: forms.py:142
71 71 msgid "File URL"
72 72 msgstr "URL файла"
73 73
74 74 #: forms.py:148
75 75 msgid "e-mail"
76 76 msgstr ""
77 77
78 78 #: forms.py:151
79 79 msgid "Additional threads"
80 80 msgstr "Дополнительные темы"
81 81
82 82 #: forms.py:162
83 83 #, python-format
84 84 msgid "Title must have less than %s characters"
85 85 msgstr "Заголовок должен иметь меньше %s символов"
86 86
87 87 #: forms.py:172
88 88 #, python-format
89 89 msgid "Text must have less than %s characters"
90 90 msgstr "Текст должен быть короче %s символов"
91 91
92 92 #: forms.py:192
93 93 msgid "Invalid URL"
94 94 msgstr "Неверный URL"
95 95
96 96 #: forms.py:213
97 97 msgid "Invalid additional thread list"
98 98 msgstr "Неверный список дополнительных тем"
99 99
100 100 #: forms.py:258
101 101 msgid "Either text or file must be entered."
102 102 msgstr "Текст или файл должны быть введены."
103 103
104 104 #: forms.py:317 templates/boards/all_threads.html:153
105 105 #: templates/boards/rss/post.html:10 templates/boards/tags.html:6
106 106 msgid "Tags"
107 107 msgstr "Метки"
108 108
109 109 #: forms.py:324
110 110 msgid "Inappropriate characters in tags."
111 111 msgstr "Недопустимые символы в метках."
112 112
113 113 #: forms.py:344
114 114 msgid "Need at least one section."
115 115 msgstr "Нужен хотя бы один раздел."
116 116
117 117 #: forms.py:356
118 118 msgid "Theme"
119 119 msgstr "Тема"
120 120
121 121 #: forms.py:357
122 122 msgid "Image view mode"
123 123 msgstr "Режим просмотра изображений"
124 124
125 125 #: forms.py:358
126 126 msgid "User name"
127 127 msgstr "Имя пользователя"
128 128
129 129 #: forms.py:359
130 130 msgid "Time zone"
131 131 msgstr "Часовой пояс"
132 132
133 133 #: forms.py:365
134 134 msgid "Inappropriate characters."
135 135 msgstr "Недопустимые символы."
136 136
137 137 #: templates/boards/404.html:6
138 138 msgid "Not found"
139 139 msgstr "Не найдено"
140 140
141 141 #: templates/boards/404.html:12
142 142 msgid "This page does not exist"
143 143 msgstr "Этой страницы не существует"
144 144
145 145 #: templates/boards/all_threads.html:35
146 146 msgid "Related message"
147 147 msgstr "Связанное сообщение"
148 148
149 149 #: templates/boards/all_threads.html:69
150 150 msgid "Edit tag"
151 151 msgstr "Изменить метку"
152 152
153 153 #: templates/boards/all_threads.html:76
154 154 #, python-format
155 155 msgid "%(count)s active thread"
156 156 msgid_plural "%(count)s active threads"
157 157 msgstr[0] "%(count)s активная тема"
158 158 msgstr[1] "%(count)s активные темы"
159 159 msgstr[2] "%(count)s активных тем"
160 160
161 161 #: templates/boards/all_threads.html:76
162 162 #, python-format
163 163 msgid "%(count)s thread in bumplimit"
164 164 msgid_plural "%(count)s threads in bumplimit"
165 165 msgstr[0] "%(count)s тема в бамплимите"
166 166 msgstr[1] "%(count)s темы в бамплимите"
167 167 msgstr[2] "%(count)s тем в бамплимите"
168 168
169 169 #: templates/boards/all_threads.html:77
170 170 #, python-format
171 171 msgid "%(count)s archived thread"
172 172 msgid_plural "%(count)s archived thread"
173 173 msgstr[0] "%(count)s архивная тема"
174 174 msgstr[1] "%(count)s архивные темы"
175 175 msgstr[2] "%(count)s архивных тем"
176 176
177 177 #: templates/boards/all_threads.html:78 templates/boards/post.html:102
178 178 #, python-format
179 179 #| msgid "%(count)s message"
180 180 #| msgid_plural "%(count)s messages"
181 181 msgid "%(count)s message"
182 182 msgid_plural "%(count)s messages"
183 183 msgstr[0] "%(count)s сообщение"
184 184 msgstr[1] "%(count)s сообщения"
185 185 msgstr[2] "%(count)s сообщений"
186 186
187 187 #: templates/boards/all_threads.html:95 templates/boards/feed.html:30
188 188 #: templates/boards/notifications.html:17 templates/search/search.html:26
189 189 msgid "Previous page"
190 190 msgstr "Предыдущая страница"
191 191
192 192 #: templates/boards/all_threads.html:109
193 193 #, python-format
194 194 msgid "Skipped %(count)s reply. Open thread to see all replies."
195 195 msgid_plural "Skipped %(count)s replies. Open thread to see all replies."
196 196 msgstr[0] "Пропущен %(count)s ответ. Откройте тред, чтобы увидеть все ответы."
197 197 msgstr[1] ""
198 198 "Пропущено %(count)s ответа. Откройте тред, чтобы увидеть все ответы."
199 199 msgstr[2] ""
200 200 "Пропущено %(count)s ответов. Откройте тред, чтобы увидеть все ответы."
201 201
202 202 #: templates/boards/all_threads.html:127 templates/boards/feed.html:40
203 203 #: templates/boards/notifications.html:27 templates/search/search.html:37
204 204 msgid "Next page"
205 205 msgstr "Следующая страница"
206 206
207 207 #: templates/boards/all_threads.html:132
208 208 msgid "No threads exist. Create the first one!"
209 209 msgstr "Нет тем. Создайте первую!"
210 210
211 211 #: templates/boards/all_threads.html:138
212 212 msgid "Create new thread"
213 213 msgstr "Создать новую тему"
214 214
215 215 #: templates/boards/all_threads.html:143 templates/boards/preview.html:16
216 216 #: templates/boards/thread_normal.html:51
217 217 msgid "Post"
218 218 msgstr "Отправить"
219 219
220 220 #: templates/boards/all_threads.html:144 templates/boards/preview.html:6
221 221 #: templates/boards/staticpages/help.html:21
222 222 #: templates/boards/thread_normal.html:52
223 223 msgid "Preview"
224 224 msgstr "Предпросмотр"
225 225
226 226 #: templates/boards/all_threads.html:149
227 227 msgid "Tags must be delimited by spaces. Text or image is required."
228 228 msgstr ""
229 229 "Метки должны быть разделены пробелами. Текст или изображение обязательны."
230 230
231 231 #: templates/boards/all_threads.html:152 templates/boards/thread_normal.html:58
232 232 msgid "Text syntax"
233 233 msgstr "Синтаксис текста"
234 234
235 235 #: templates/boards/all_threads.html:166 templates/boards/feed.html:53
236 236 msgid "Pages:"
237 237 msgstr "Страницы: "
238 238
239 239 #: templates/boards/authors.html:6 templates/boards/authors.html.py:12
240 240 msgid "Authors"
241 241 msgstr "Авторы"
242 242
243 243 #: templates/boards/authors.html:26
244 244 msgid "Distributed under the"
245 245 msgstr "Распространяется под"
246 246
247 247 #: templates/boards/authors.html:28
248 248 msgid "license"
249 249 msgstr "лицензией"
250 250
251 251 #: templates/boards/authors.html:30
252 252 msgid "Repository"
253 253 msgstr "Репозиторий"
254 254
255 255 #: templates/boards/base.html:14 templates/boards/base.html.py:41
256 256 msgid "Feed"
257 257 msgstr "Лента"
258 258
259 259 #: templates/boards/base.html:31
260 260 msgid "All threads"
261 261 msgstr "Все темы"
262 262
263 263 #: templates/boards/base.html:37
264 264 msgid "Add tags"
265 265 msgstr "Добавить метки"
266 266
267 267 #: templates/boards/base.html:39
268 268 msgid "Tag management"
269 269 msgstr "Управление метками"
270 270
271 271 #: templates/boards/base.html:39
272 272 msgid "tags"
273 273 msgstr "метки"
274 274
275 275 #: templates/boards/base.html:40
276 276 msgid "search"
277 277 msgstr "поиск"
278 278
279 279 #: templates/boards/base.html:41 templates/boards/feed.html:11
280 280 msgid "feed"
281 281 msgstr "лента"
282 282
283 283 #: templates/boards/base.html:42 templates/boards/random.html:6
284 284 msgid "Random images"
285 285 msgstr "Случайные изображения"
286 286
287 287 #: templates/boards/base.html:42
288 288 msgid "random"
289 289 msgstr "случайные"
290 290
291 291 #: templates/boards/base.html:44
292 292 msgid "favorites"
293 293 msgstr "избранное"
294 294
295 295 #: templates/boards/base.html:48 templates/boards/base.html.py:49
296 296 #: templates/boards/notifications.html:8
297 297 msgid "Notifications"
298 298 msgstr "Уведомления"
299 299
300 300 #: templates/boards/base.html:56 templates/boards/settings.html:8
301 301 msgid "Settings"
302 302 msgstr "Настройки"
303 303
304 304 #: templates/boards/base.html:59
305 305 msgid "Loading..."
306 306 msgstr "Загрузка..."
307 307
308 308 #: templates/boards/base.html:71
309 309 msgid "Admin"
310 310 msgstr "Администрирование"
311 311
312 312 #: templates/boards/base.html:73
313 313 #, python-format
314 314 msgid "Speed: %(ppd)s posts per day"
315 315 msgstr "Скорость: %(ppd)s сообщений в день"
316 316
317 317 #: templates/boards/base.html:75
318 318 msgid "Up"
319 319 msgstr "Вверх"
320 320
321 321 #: templates/boards/feed.html:45
322 322 msgid "No posts exist. Create the first one!"
323 323 msgstr "Нет сообщений. Создайте первое!"
324 324
325 325 #: templates/boards/post.html:33
326 326 msgid "Open"
327 327 msgstr "Открыть"
328 328
329 329 #: templates/boards/post.html:35 templates/boards/post.html.py:46
330 330 msgid "Reply"
331 331 msgstr "Ответить"
332 332
333 333 #: templates/boards/post.html:41
334 334 msgid " in "
335 335 msgstr " в "
336 336
337 337 #: templates/boards/post.html:51
338 338 msgid "Edit"
339 339 msgstr "Изменить"
340 340
341 341 #: templates/boards/post.html:53
342 342 msgid "Edit thread"
343 343 msgstr "Изменить тему"
344 344
345 345 #: templates/boards/post.html:91
346 346 msgid "Replies"
347 347 msgstr "Ответы"
348 348
349 349 #: templates/boards/post.html:103
350 350 #, python-format
351 351 msgid "%(count)s image"
352 352 msgid_plural "%(count)s images"
353 353 msgstr[0] "%(count)s изображение"
354 354 msgstr[1] "%(count)s изображения"
355 355 msgstr[2] "%(count)s изображений"
356 356
357 357 #: templates/boards/rss/post.html:5
358 358 msgid "Post image"
359 359 msgstr "Изображение сообщения"
360 360
361 361 #: templates/boards/settings.html:15
362 362 msgid "You are moderator."
363 363 msgstr "Вы модератор."
364 364
365 365 #: templates/boards/settings.html:19
366 366 msgid "Hidden tags:"
367 367 msgstr "Скрытые метки:"
368 368
369 369 #: templates/boards/settings.html:25
370 370 msgid "No hidden tags."
371 371 msgstr "Нет скрытых меток."
372 372
373 373 #: templates/boards/settings.html:34
374 374 msgid "Save"
375 375 msgstr "Сохранить"
376 376
377 377 #: templates/boards/staticpages/banned.html:6
378 378 msgid "Banned"
379 379 msgstr "Заблокирован"
380 380
381 381 #: templates/boards/staticpages/banned.html:11
382 382 msgid "Your IP address has been banned. Contact the administrator"
383 383 msgstr "Ваш IP адрес был заблокирован. Свяжитесь с администратором"
384 384
385 385 #: templates/boards/staticpages/help.html:6
386 386 #: templates/boards/staticpages/help.html:10
387 387 msgid "Syntax"
388 388 msgstr "Синтаксис"
389 389
390 390 #: templates/boards/staticpages/help.html:11
391 391 msgid "Italic text"
392 392 msgstr "Курсивный текст"
393 393
394 394 #: templates/boards/staticpages/help.html:12
395 395 msgid "Bold text"
396 396 msgstr "Полужирный текст"
397 397
398 398 #: templates/boards/staticpages/help.html:13
399 399 msgid "Spoiler"
400 400 msgstr "Спойлер"
401 401
402 402 #: templates/boards/staticpages/help.html:14
403 403 msgid "Link to a post"
404 404 msgstr "Ссылка на сообщение"
405 405
406 406 #: templates/boards/staticpages/help.html:15
407 407 msgid "Strikethrough text"
408 408 msgstr "Зачеркнутый текст"
409 409
410 410 #: templates/boards/staticpages/help.html:16
411 411 msgid "Comment"
412 412 msgstr "Комментарий"
413 413
414 414 #: templates/boards/staticpages/help.html:17
415 415 #: templates/boards/staticpages/help.html:18
416 416 msgid "Quote"
417 417 msgstr "Цитата"
418 418
419 419 #: templates/boards/staticpages/help.html:21
420 420 msgid "You can try pasting the text and previewing the result here:"
421 421 msgstr "Вы можете попробовать вставить текст и проверить результат здесь:"
422 422
423 423 #: templates/boards/tags.html:17
424 424 msgid "Sections:"
425 425 msgstr "Разделы:"
426 426
427 427 #: templates/boards/tags.html:30
428 428 msgid "Other tags:"
429 429 msgstr "Другие метки:"
430 430
431 431 #: templates/boards/tags.html:43
432 432 msgid "All tags..."
433 433 msgstr "Все метки..."
434 434
435 435 #: templates/boards/thread.html:14
436 436 msgid "Normal"
437 437 msgstr "Нормальный"
438 438
439 439 #: templates/boards/thread.html:15
440 440 msgid "Gallery"
441 441 msgstr "Галерея"
442 442
443 443 #: templates/boards/thread.html:16
444 444 msgid "Tree"
445 445 msgstr "Дерево"
446 446
447 447 #: templates/boards/thread.html:35
448 448 msgid "message"
449 449 msgid_plural "messages"
450 450 msgstr[0] "сообщение"
451 451 msgstr[1] "сообщения"
452 452 msgstr[2] "сообщений"
453 453
454 454 #: templates/boards/thread.html:38
455 455 msgid "image"
456 456 msgid_plural "images"
457 457 msgstr[0] "изображение"
458 458 msgstr[1] "изображения"
459 459 msgstr[2] "изображений"
460 460
461 461 #: templates/boards/thread.html:40
462 462 msgid "Last update: "
463 463 msgstr "Последнее обновление: "
464 464
465 465 #: templates/boards/thread_gallery.html:36
466 466 msgid "No images."
467 467 msgstr "Нет изображений."
468 468
469 469 #: templates/boards/thread_normal.html:30
470 470 msgid "posts to bumplimit"
471 471 msgstr "сообщений до бамплимита"
472 472
473 473 #: templates/boards/thread_normal.html:44
474 474 msgid "Reply to thread"
475 475 msgstr "Ответить в тему"
476 476
477 477 #: templates/boards/thread_normal.html:44
478 478 msgid "to message "
479 479 msgstr "на сообщение"
480 480
481 481 #: templates/boards/thread_normal.html:59
482 482 msgid "Close form"
483 483 msgstr "Закрыть форму"
484 484
485 485 #: templates/search/search.html:17
486 486 msgid "Ok"
487 487 msgstr "Ок"
488 488
489 489 #: utils.py:120
490 490 #, python-format
491 491 msgid "File must be less than %s bytes"
492 492 msgstr "Файл должен быть менее %s байт"
493 493
494 494 msgid "Please wait %(delay)d second before sending message"
495 495 msgid_plural "Please wait %(delay)d seconds before sending message"
496 496 msgstr[0] "Пожалуйста подождите %(delay)d секунду перед отправкой сообщения"
497 497 msgstr[1] "Пожалуйста подождите %(delay)d секунды перед отправкой сообщения"
498 498 msgstr[2] "Пожалуйста подождите %(delay)d секунд перед отправкой сообщения"
499 499
500 500 msgid "New threads"
501 501 msgstr "Новые темы"
502
503 #, python-format
504 msgid "Max file size is %(size)s."
505 msgstr "Максимальный размер файла %(size)s."
@@ -1,186 +1,189 b''
1 1 {% extends "boards/base.html" %}
2 2
3 3 {% load i18n %}
4 4 {% load board %}
5 5 {% load static %}
6 6 {% load tz %}
7 7
8 8 {% block head %}
9 9 <meta name="robots" content="noindex">
10 10
11 11 {% if tag %}
12 12 <title>{{ tag.name }} - {{ site_name }}</title>
13 13 {% else %}
14 14 <title>{{ site_name }}</title>
15 15 {% endif %}
16 16
17 17 {% if prev_page_link %}
18 18 <link rel="prev" href="{{ prev_page_link }}" />
19 19 {% endif %}
20 20 {% if next_page_link %}
21 21 <link rel="next" href="{{ next_page_link }}" />
22 22 {% endif %}
23 23
24 24 {% endblock %}
25 25
26 26 {% block content %}
27 27
28 28 {% get_current_language as LANGUAGE_CODE %}
29 29 {% get_current_timezone as TIME_ZONE %}
30 30
31 31 {% for banner in banners %}
32 32 <div class="post">
33 33 <div class="title">{{ banner.title }}</div>
34 34 <div>{{ banner.text }}</div>
35 35 <div>{% trans 'Related message' %}: <a href="{{ banner.post.get_absolute_url }}">>>{{ banner.post.id }}</a></div>
36 36 </div>
37 37 {% endfor %}
38 38
39 39 {% if tag %}
40 40 <div class="tag_info" style="border-bottom: solid .5ex #{{ tag.get_color }}">
41 41 {% if random_image_post %}
42 42 <div class="tag-image">
43 43 {% with image=random_image_post.images.first %}
44 44 <a href="{{ random_image_post.get_absolute_url }}"><img
45 45 src="{{ image.image.url_200x150 }}"
46 46 width="{{ image.pre_width }}"
47 47 height="{{ image.pre_height }}"/></a>
48 48 {% endwith %}
49 49 </div>
50 50 {% endif %}
51 51 <div class="tag-text-data">
52 52 <h2>
53 53 <form action="{% url 'tag' tag.name %}" method="post" class="post-button-form">
54 54 {% if is_favorite %}
55 55 <button name="method" value="unsubscribe" class="fav"></button>
56 56 {% else %}
57 57 <button name="method" value="subscribe" class="not_fav"></button>
58 58 {% endif %}
59 59 </form>
60 60 <form action="{% url 'tag' tag.name %}" method="post" class="post-button-form">
61 61 {% if is_hidden %}
62 62 <button name="method" value="unhide" class="fav">H</button>
63 63 {% else %}
64 64 <button name="method" value="hide" class="not_fav">H</button>
65 65 {% endif %}
66 66 </form>
67 67 {{ tag.get_view|safe }}
68 68 {% if perms.change_tag %}
69 69 <span class="moderator_info">| <a href="{% url 'admin:boards_tag_change' tag.id %}">{% trans 'Edit tag' %}</a></span>
70 70 {% endif %}
71 71 </h2>
72 72 {% if tag.get_description %}
73 73 <p>{{ tag.get_description|safe }}</p>
74 74 {% endif %}
75 75 <p>
76 76 {% blocktrans count count=tag.get_active_thread_count %}{{ count }} active thread{% plural %}active threads{% endblocktrans %},
77 77 {% blocktrans count count=tag.get_bumplimit_thread_count %}{{ count }} thread in bumplimit{% plural %} threads in bumplimit{% endblocktrans %},
78 78 {% blocktrans count count=tag.get_archived_thread_count %}{{ count }} archived thread{% plural %}archived threads{% endblocktrans %},
79 79 {% blocktrans count count=tag.get_post_count %}{{ count }} message{% plural %}messages{% endblocktrans %}.
80 80 </p>
81 81 {% if tag.get_all_parents %}
82 82 <p>
83 83 {% for parent in tag.get_all_parents %}
84 84 {{ parent.get_view|safe }} &gt;
85 85 {% endfor %}
86 86 {{ tag.get_view|safe }}
87 87 </p>
88 88 {% endif %}
89 89 </div>
90 90 </div>
91 91 {% endif %}
92 92
93 93 {% if threads %}
94 94 {% if prev_page_link %}
95 95 <div class="page_link">
96 96 <a href="{{ prev_page_link }}">{% trans "Previous page" %}</a>
97 97 </div>
98 98 {% endif %}
99 99
100 100 {% for thread in threads %}
101 101 <div class="thread">
102 102 {% post_view thread.get_opening_post thread=thread truncated=True need_open_link=True %}
103 103 {% if not thread.archived %}
104 104 {% with last_replies=thread.get_last_replies %}
105 105 {% if last_replies %}
106 106 {% with skipped_replies_count=thread.get_skipped_replies_count %}
107 107 {% if skipped_replies_count %}
108 108 <div class="skipped_replies">
109 109 <a href="{% url 'thread' thread.get_opening_post_id %}">
110 110 {% blocktrans count count=skipped_replies_count %}Skipped {{ count }} reply. Open thread to see all replies.{% plural %}Skipped {{ count }} replies. Open thread to see all replies.{% endblocktrans %}
111 111 </a>
112 112 </div>
113 113 {% endif %}
114 114 {% endwith %}
115 115 <div class="last-replies">
116 116 {% for post in last_replies %}
117 117 {% post_view post truncated=True %}
118 118 {% endfor %}
119 119 </div>
120 120 {% endif %}
121 121 {% endwith %}
122 122 {% endif %}
123 123 </div>
124 124 {% endfor %}
125 125
126 126 {% if next_page_link %}
127 127 <div class="page_link">
128 128 <a href="{{ next_page_link }}">{% trans "Next page" %}</a>
129 129 </div>
130 130 {% endif %}
131 131 {% else %}
132 132 <div class="post">
133 133 {% trans 'No threads exist. Create the first one!' %}</div>
134 134 {% endif %}
135 135
136 136 <div class="post-form-w">
137 137 <script src="{% static 'js/panel.js' %}"></script>
138 138 <div class="post-form">
139 139 <div class="form-title">{% trans "Create new thread" %}</div>
140 140 <div class="swappable-form-full">
141 141 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
142 142 {{ form.as_div }}
143 143 <div class="form-submit">
144 144 <input type="submit" value="{% trans "Post" %}"/>
145 145 <button id="preview-button" onclick="return false;">{% trans 'Preview' %}</button>
146 146 </div>
147 147 </form>
148 148 </div>
149 149 <div>
150 150 {% trans 'Tags must be delimited by spaces. Text or image is required.' %}
151 {% with size=max_file_size|filesizeformat %}
152 {% blocktrans %}Max file size is {{ size }}.{% endblocktrans %}
153 {% endwith %}
151 154 </div>
152 155 <div id="preview-text"></div>
153 156 <div><a href="{% url "staticpage" name="help" %}">{% trans 'Text syntax' %}</a></div>
154 157 <div><a href="{% url "tags" "required" %}">{% trans 'Tags' %}</a></div>
155 158 </div>
156 159 </div>
157 160
158 161 <script src="{% static 'js/form.js' %}"></script>
159 162 <script src="{% static 'js/thread_create.js' %}"></script>
160 163
161 164 {% endblock %}
162 165
163 166 {% block metapanel %}
164 167
165 168 <span class="metapanel">
166 169 <b><a href="{% url "authors" %}">{{ site_name }}</a> {{ version }}</b>
167 170 {% trans "Pages:" %}
168 171 [
169 172 {% with dividers=paginator.get_dividers %}
170 173 {% for page in paginator.get_divided_range %}
171 174 {% if page in dividers %}
172 175 …,
173 176 {% endif %}
174 177 <a
175 178 {% ifequal page current_page.number %}
176 179 class="current_page"
177 180 {% endifequal %}
178 181 href="{% page_url paginator page %}">{{ page }}</a>
179 182 {% if not forloop.last %},{% endif %}
180 183 {% endfor %}
181 184 {% endwith %}
182 185 ]
183 186 [<a href="rss/">RSS</a>]
184 187 </span>
185 188
186 189 {% endblock %}
@@ -1,70 +1,75 b''
1 1 {% extends "boards/thread.html" %}
2 2
3 3 {% load i18n %}
4 4 {% load static from staticfiles %}
5 5 {% load board %}
6 6 {% load tz %}
7 7
8 8 {% block thread_content %}
9 9 {% get_current_language as LANGUAGE_CODE %}
10 10 {% get_current_timezone as TIME_ZONE %}
11 11
12 12 <div class="tag_info">
13 13 <h2>
14 14 <form action="{% url 'thread' opening_post.id %}" method="post" class="post-button-form">
15 15 {% if is_favorite %}
16 16 <button name="method" value="unsubscribe" class="fav"></button>
17 17 {% else %}
18 18 <button name="method" value="subscribe" class="not_fav"></button>
19 19 {% endif %}
20 20 </form>
21 21 {{ opening_post.get_title_or_text }}
22 22 </h2>
23 23 </div>
24 24
25 25 {% if bumpable and thread.has_post_limit %}
26 26 <div class="bar-bg">
27 27 <div class="bar-value" style="width:{{ bumplimit_progress }}%" id="bumplimit_progress">
28 28 </div>
29 29 <div class="bar-text">
30 30 <span id="left_to_limit">{{ posts_left }}</span> {% trans 'posts to bumplimit' %}
31 31 </div>
32 32 </div>
33 33 {% endif %}
34 34
35 35 <div class="thread">
36 36 {% for post in thread.get_replies %}
37 37 {% post_view post reply_link=True %}
38 38 {% endfor %}
39 39 </div>
40 40
41 41 {% if not thread.archived %}
42 42 <div class="post-form-w">
43 43 <script src="{% static 'js/panel.js' %}"></script>
44 44 <div class="form-title">{% trans "Reply to thread" %} #{{ opening_post.id }}<span class="reply-to-message"> {% trans "to message " %} #<span id="reply-to-message-id"></span></span></div>
45 45 <div class="post-form" id="compact-form">
46 46 <div class="swappable-form-full">
47 47 <form enctype="multipart/form-data" method="post" id="form">{% csrf_token %}
48 48 <div class="compact-form-text"></div>
49 49 {{ form.as_div }}
50 50 <div class="form-submit">
51 51 <input type="submit" value="{% trans "Post" %}"/>
52 52 <button id="preview-button" onclick="return false;">{% trans 'Preview' %}</button>
53 53 </div>
54 54 </form>
55 55 </div>
56 56 <div id="preview-text"></div>
57 <div>
58 {% with size=max_file_size|filesizeformat %}
59 {% blocktrans %}Max file size is {{ size }}.{% endblocktrans %}
60 {% endwith %}
61 </div>
57 62 <div><a href="{% url "staticpage" name="help" %}">
58 63 {% trans 'Text syntax' %}</a></div>
59 64 <div><a id="form-close-button" href="#" onClick="resetFormPosition(); return false;">{% trans 'Close form' %}</a></div>
60 65 </div>
61 66 </div>
62 67
63 68 <script src="{% static 'js/jquery.form.min.js' %}"></script>
64 69 {% endif %}
65 70
66 71 <script src="{% static 'js/form.js' %}"></script>
67 72 <script src="{% static 'js/thread.js' %}"></script>
68 73 <script src="{% static 'js/thread_update.js' %}"></script>
69 74 <script src="{% static 'js/3party/centrifuge.js' %}"></script>
70 75 {% endblock %}
@@ -1,157 +1,160 b''
1 1 from django.core.urlresolvers import reverse
2 2 from django.core.files import File
3 3 from django.core.files.temp import NamedTemporaryFile
4 4 from django.core.paginator import EmptyPage
5 5 from django.db import transaction
6 6 from django.http import Http404
7 7 from django.shortcuts import render, redirect
8 8 import requests
9 9
10 10 from boards import utils, settings
11 11 from boards.abstracts.paginator import get_paginator
12 12 from boards.abstracts.settingsmanager import get_settings_manager
13 13 from boards.forms import ThreadForm, PlainErrorList
14 14 from boards.models import Post, Thread, Ban, Tag, PostImage, Banner
15 15 from boards.views.banned import BannedView
16 16 from boards.views.base import BaseBoardView, CONTEXT_FORM
17 17 from boards.views.posting_mixin import PostMixin
18 from boards.views.mixins import FileUploadMixin
18 19
19 20
20 21 FORM_TAGS = 'tags'
21 22 FORM_TEXT = 'text'
22 23 FORM_TITLE = 'title'
23 24 FORM_IMAGE = 'image'
24 25 FORM_THREADS = 'threads'
25 26
26 27 TAG_DELIMITER = ' '
27 28
28 29 PARAMETER_CURRENT_PAGE = 'current_page'
29 30 PARAMETER_PAGINATOR = 'paginator'
30 31 PARAMETER_THREADS = 'threads'
31 32 PARAMETER_BANNERS = 'banners'
32 33 PARAMETER_ADDITIONAL = 'additional_params'
34 PARAMETER_MAX_FILE_SIZE = 'max_file_size'
33 35
34 36 PARAMETER_PREV_LINK = 'prev_page_link'
35 37 PARAMETER_NEXT_LINK = 'next_page_link'
36 38
37 39 TEMPLATE = 'boards/all_threads.html'
38 40 DEFAULT_PAGE = 1
39 41
40 42
41 class AllThreadsView(PostMixin, BaseBoardView):
43 class AllThreadsView(PostMixin, FileUploadMixin, BaseBoardView):
42 44
43 45 def __init__(self):
44 46 self.settings_manager = None
45 47 super(AllThreadsView, self).__init__()
46 48
47 49 def get(self, request, form: ThreadForm=None):
48 50 page = request.GET.get('page', DEFAULT_PAGE)
49 51
50 52 params = self.get_context_data(request=request)
51 53
52 54 if not form:
53 55 form = ThreadForm(error_class=PlainErrorList)
54 56
55 57 self.settings_manager = get_settings_manager(request)
56 58
57 59 threads = self.get_threads()
58 60
59 61 order = request.GET.get('order', 'bump')
60 62 if order == 'bump':
61 63 threads = threads.order_by('-bump_time')
62 64 else:
63 65 threads = threads.filter(multi_replies__opening=True).order_by('-multi_replies__pub_time')
64 66
65 67 paginator = get_paginator(threads,
66 68 settings.get_int('View', 'ThreadsPerPage'))
67 69 paginator.current_page = int(page)
68 70
69 71 try:
70 72 threads = paginator.page(page).object_list
71 73 except EmptyPage:
72 74 raise Http404()
73 75
74 76 params[PARAMETER_THREADS] = threads
75 77 params[CONTEXT_FORM] = form
76 78 params[PARAMETER_BANNERS] = Banner.objects.order_by('-id').all()
79 params[PARAMETER_MAX_FILE_SIZE] = self.get_max_upload_size()
77 80
78 81 paginator.set_url(self.get_reverse_url(), request.GET.dict())
79 82 self.get_page_context(paginator, params, page)
80 83
81 84 return render(request, TEMPLATE, params)
82 85
83 86 def post(self, request):
84 87 form = ThreadForm(request.POST, request.FILES,
85 88 error_class=PlainErrorList)
86 89 form.session = request.session
87 90
88 91 if form.is_valid():
89 92 return self.create_thread(request, form)
90 93 if form.need_to_ban:
91 94 # Ban user because he is suspected to be a bot
92 95 self._ban_current_user(request)
93 96
94 97 return self.get(request, form)
95 98
96 99 def get_page_context(self, paginator, params, page):
97 100 """
98 101 Get pagination context variables
99 102 """
100 103
101 104 params[PARAMETER_PAGINATOR] = paginator
102 105 current_page = paginator.page(int(page))
103 106 params[PARAMETER_CURRENT_PAGE] = current_page
104 107 if current_page.has_previous():
105 108 params[PARAMETER_PREV_LINK] = paginator.get_page_url(
106 109 current_page.previous_page_number())
107 110 if current_page.has_next():
108 111 params[PARAMETER_NEXT_LINK] = paginator.get_page_url(
109 112 current_page.next_page_number())
110 113
111 114 def get_reverse_url(self):
112 115 return reverse('index')
113 116
114 117 @transaction.atomic
115 118 def create_thread(self, request, form: ThreadForm, html_response=True):
116 119 """
117 120 Creates a new thread with an opening post.
118 121 """
119 122
120 123 ip = utils.get_client_ip(request)
121 124 is_banned = Ban.objects.filter(ip=ip).exists()
122 125
123 126 if is_banned:
124 127 if html_response:
125 128 return redirect(BannedView().as_view())
126 129 else:
127 130 return
128 131
129 132 data = form.cleaned_data
130 133
131 134 title = form.get_title()
132 135 text = data[FORM_TEXT]
133 136 file = form.get_file()
134 137 threads = data[FORM_THREADS]
135 138
136 139 text = self._remove_invalid_links(text)
137 140
138 141 tags = data[FORM_TAGS]
139 142
140 143 post = Post.objects.create_post(title=title, text=text, file=file,
141 144 ip=ip, tags=tags, opening_posts=threads,
142 145 tripcode=form.get_tripcode())
143 146
144 147 # This is required to update the threads to which posts we have replied
145 148 # when creating this one
146 149 post.notify_clients()
147 150
148 151 if html_response:
149 152 return redirect(post.get_absolute_url())
150 153
151 154 def get_threads(self):
152 155 """
153 156 Gets list of threads that will be shown on a page.
154 157 """
155 158
156 159 return Thread.objects\
157 160 .exclude(tags__in=self.settings_manager.get_hidden_tags())
@@ -1,26 +1,34 b''
1 import boards
2
3
1 4 PARAM_NEXT = 'next'
2 5 PARAMETER_METHOD = 'method'
3 6
4 7
5 8 class DispatcherMixin:
6 9 """
7 10 This class contains a dispather method that can run a method specified by
8 11 'method' request parameter.
9 12 """
10 13
11 14 def __init__(self):
12 15 self.user = None
13 16
14 17 def dispatch_method(self, *args, **kwargs):
15 18 request = args[0]
16 19
17 20 self.user = request.user
18 21
19 22 method_name = None
20 23 if PARAMETER_METHOD in request.GET:
21 24 method_name = request.GET[PARAMETER_METHOD]
22 25 elif PARAMETER_METHOD in request.POST:
23 26 method_name = request.POST[PARAMETER_METHOD]
24 27
25 28 if method_name:
26 29 return getattr(self, method_name)(*args, **kwargs)
30
31
32 class FileUploadMixin:
33 def get_max_upload_size(self):
34 return boards.settings.get_int('Forms', 'MaxFileSize')
@@ -1,30 +1,33 b''
1 1 from boards.views.thread import ThreadView
2 from boards.views.mixins import FileUploadMixin
2 3
3 4 TEMPLATE_NORMAL = 'boards/thread_normal.html'
4 5
5 6 CONTEXT_BUMPLIMIT_PRG = 'bumplimit_progress'
6 7 CONTEXT_POSTS_LEFT = 'posts_left'
7 8 CONTEXT_BUMPABLE = 'bumpable'
9 PARAM_MAX_FILE_SIZE = 'max_file_size'
8 10
9 11
10 class NormalThreadView(ThreadView):
12 class NormalThreadView(ThreadView, FileUploadMixin):
11 13
12 14 def get_template(self):
13 15 return TEMPLATE_NORMAL
14 16
15 17 def get_mode(self):
16 18 return 'normal'
17 19
18 20 def get_data(self, thread):
19 21 params = dict()
20 22
21 23 bumpable = thread.can_bump()
22 24 params[CONTEXT_BUMPABLE] = bumpable
23 25 max_posts = thread.max_posts
24 26 if bumpable and thread.has_post_limit():
25 27 left_posts = max_posts - thread.get_reply_count()
26 28 params[CONTEXT_POSTS_LEFT] = left_posts
27 29 params[CONTEXT_BUMPLIMIT_PRG] = str(
28 30 float(left_posts) / max_posts * 100)
31 params[PARAM_MAX_FILE_SIZE] = self.get_max_upload_size()
29 32
30 33 return params
General Comments 0
You need to be logged in to leave comments. Login now