##// END OF EJS Templates
Fixed some translation issues. Changed default captcha setting to "off" to pass tests. Removed the maximum page scale. This refs #36 and fixes #26, #2
neko259 -
r85:895eadaa default
parent child Browse files
Show More
1 NO CONTENT: modified file, binary diff hidden
@@ -1,141 +1,141 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 "POT-Creation-Date: 2013-06-09 17:35+0300\n"
10 "POT-Creation-Date: 2013-06-10 22:27+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 #: templates/base.html:27
21 #: templates/boards/base.html:27
22 22 msgid "All threads"
23 23 msgstr "Все темы"
24 24
25 #: templates/base.html:33
25 #: templates/boards/base.html:33
26 26 msgid "Settings"
27 27 msgstr "Настройки"
28 28
29 #: templates/base.html:40
29 #: templates/boards/base.html:40
30 30 msgid "Up"
31 31 msgstr "Вверх"
32 32
33 #: templates/posting_general.html:18
33 #: templates/boards/posting_general.html:18
34 34 msgid "Tag: "
35 35 msgstr "Тег: "
36 36
37 #: templates/posting_general.html:35 templates/posting_general.html.py:79
38 #: templates/thread.html:27
37 #: templates/boards/posting_general.html:35
38 #: templates/boards/posting_general.html:79 templates/boards/thread.html:27
39 39 #, fuzzy
40 40 msgid "Post image"
41 41 msgstr "Изображение сообщения"
42 42
43 #: templates/posting_general.html:46
43 #: templates/boards/posting_general.html:46
44 44 msgid "Reply"
45 45 msgstr "Ответ"
46 46
47 #: templates/posting_general.html:53 templates/thread.html:107
47 #: templates/boards/posting_general.html:53 templates/boards/thread.html:107
48 48 msgid "replies"
49 49 msgstr "ответов"
50 50
51 #: templates/posting_general.html:54 templates/thread.html:108
51 #: templates/boards/posting_general.html:54 templates/boards/thread.html:108
52 52 msgid "images"
53 53 msgstr "изображений"
54 54
55 #: templates/posting_general.html:56 templates/posting_general.html.py:127
56 #: templates/thread.html:49
55 #: templates/boards/posting_general.html:56
56 #: templates/boards/posting_general.html:127 templates/boards/thread.html:49
57 57 msgid "Tags"
58 58 msgstr "Теги"
59 59
60 #: templates/posting_general.html:109
60 #: templates/boards/posting_general.html:109
61 61 msgid "Create new thread"
62 62 msgstr "Создать новую тему"
63 63
64 #: templates/posting_general.html:112 templates/thread.html:71
64 #: templates/boards/posting_general.html:112 templates/boards/thread.html:71
65 65 msgid "Title"
66 66 msgstr "Заголовок"
67 67
68 #: templates/posting_general.html:117 templates/thread.html:76
68 #: templates/boards/posting_general.html:117 templates/boards/thread.html:76
69 69 msgid "Text"
70 70 msgstr "Текст"
71 71
72 #: templates/posting_general.html:122 templates/thread.html:81
72 #: templates/boards/posting_general.html:122 templates/boards/thread.html:81
73 73 msgid "Image"
74 74 msgstr "Изображение"
75 75
76 #: templates/posting_general.html:136 templates/thread.html:91
76 #: templates/boards/posting_general.html:136 templates/boards/thread.html:91
77 77 msgid "Post"
78 78 msgstr "Отправить"
79 79
80 #: templates/posting_general.html:152
81 #, fuzzy
80 #: templates/boards/posting_general.html:138
81 msgid "Tags must be delimited by spaces. Text or image is required."
82 msgstr ""
83 "Теги должны быть разделены пробелами. Текст или изображение обязательны."
84
85 #: templates/boards/posting_general.html:141 templates/boards/thread.html:93
86 msgid "Basic markdown syntax."
87 msgstr "Базовый синтаксис markdown."
88
89 #: templates/boards/posting_general.html:152
82 90 msgid "Pages:"
83 91 msgstr "Страницы: "
84 92
85 #: templates/settings.html:13
93 #: templates/boards/settings.html:13
86 94 msgid "Theme"
87 95 msgstr "Тема"
88 96
89 #: templates/settings.html:29
97 #: templates/boards/settings.html:29
90 98 msgid "Save"
91 99 msgstr "Сохранить"
92 100
93 #: templates/tags.html:7
101 #: templates/boards/tags.html:7
94 102 msgid "tags"
95 103 msgstr "тегов"
96 104
97 #: templates/thread.html:39
105 #: templates/boards/thread.html:39
98 106 msgid "Get!"
99 107 msgstr "Гет!"
100 108
101 #: templates/thread.html:68
109 #: templates/boards/thread.html:68
102 110 msgid "Reply to thread"
103 111 msgstr "Ответить в тему"
104 112
105 #: templates/thread.html:93
106 msgid "Basic markdown syntax."
107 msgstr "Базовый синтаксис markdown."
108
109 #: templates/thread.html:94
113 #: templates/boards/thread.html:94
110 114 msgid "Example: "
111 115 msgstr "Пример: "
112 116
113 #: templates/thread.html:94
117 #: templates/boards/thread.html:94
114 118 msgid "italic"
115 119 msgstr "курсив"
116 120
117 #: templates/thread.html:95
121 #: templates/boards/thread.html:95
118 122 msgid "bold"
119 123 msgstr "полужирный"
120 124
121 #: templates/thread.html:96
125 #: templates/boards/thread.html:96
122 126 msgid "Quotes can be inserted with"
123 127 msgstr "Цитаты могут быть вставлены при помощи"
124 128
125 #: templates/thread.html:97
129 #: templates/boards/thread.html:97
126 130 msgid "Links to answers can be inserted with"
127 131 msgstr "Ссылки на ответы могут быть вставлены с помощью"
128 132
129 #: templates/thread.html:109
133 #: templates/boards/thread.html:109
130 134 msgid "Last update: "
131 135 msgstr "Последнее обновление: "
132 136
133 137 #~ msgid "View"
134 138 #~ msgstr "Просмотр"
135 139
136 140 #~ msgid "gets"
137 141 #~ msgstr "гетов"
138
139 #~ msgid "Tags must be delimited by spaces. Text or image is required."
140 #~ msgstr ""
141 #~ "Теги должны быть разделены пробелами. Текст или изображение обязательны."
@@ -1,288 +1,288 b''
1 1 import os
2 2 from random import random
3 3 import re
4 4 import time
5 5 import math
6 6
7 7 from django.db import models
8 8 from django.http import Http404
9 9 from django.utils import timezone
10 10 from markupfield.fields import MarkupField
11 11
12 12 from neboard import settings
13 13 import thumbs
14 14
15 15 IMAGE_THUMB_SIZE = (200, 150)
16 16
17 17 TITLE_MAX_LENGTH = 50
18 18
19 19 DEFAULT_MARKUP_TYPE = 'markdown'
20 20
21 21 NO_PARENT = -1
22 22 NO_IP = '0.0.0.0'
23 23 UNKNOWN_UA = ''
24 24 ALL_PAGES = -1
25 OPENING_POST_WEIGHT = 5
25 OPENING_POST_POPULARITY_WEIGHT = 2
26 26 IMAGES_DIRECTORY = 'images/'
27 27 FILE_EXTENSION_DELIMITER = '.'
28 28
29 29 REGEX_PRETTY = re.compile(r'^\d(0)+$')
30 30 REGEX_SAME = re.compile(r'^(.)\1+$')
31 31
32 32
33 33 class PostManager(models.Manager):
34 34 def create_post(self, title, text, image=None, parent_id=NO_PARENT,
35 35 ip=NO_IP, tags=None):
36 36 post = self.create(title=title,
37 37 text=text,
38 38 pub_time=timezone.now(),
39 39 parent=parent_id,
40 40 image=image,
41 41 poster_ip=ip,
42 42 poster_user_agent=UNKNOWN_UA,
43 43 last_edit_time=timezone.now())
44 44
45 45 if tags:
46 46 map(post.tags.add, tags)
47 47
48 48 if parent_id != NO_PARENT:
49 49 self._bump_thread(parent_id)
50 50 else:
51 51 self._delete_old_threads()
52 52
53 53 return post
54 54
55 55 def delete_post(self, post):
56 56 children = self.filter(parent=post.id)
57 57 for child in children:
58 58 self.delete_post(child)
59 59 post.delete()
60 60
61 61 def delete_posts_by_ip(self, ip):
62 62 posts = self.filter(poster_ip=ip)
63 63 for post in posts:
64 64 self.delete_post(post)
65 65
66 66 def get_threads(self, tag=None, page=ALL_PAGES):
67 67 if tag:
68 68 threads = self.filter(parent=NO_PARENT, tags=tag)
69 69 else:
70 70 threads = self.filter(parent=NO_PARENT)
71 71
72 72 if not threads:
73 73 raise Http404
74 74
75 75 threads = threads.order_by('-last_edit_time')
76 76
77 77 if page != ALL_PAGES:
78 78 thread_count = len(threads)
79 79
80 80 if page < self.get_thread_page_count(tag=tag):
81 81 start_thread = page * settings.THREADS_PER_PAGE
82 82 end_thread = min(start_thread + settings.THREADS_PER_PAGE,
83 83 thread_count)
84 84 threads = threads[start_thread:end_thread]
85 85
86 86 return threads
87 87
88 88 def get_thread(self, opening_post_id):
89 89 try:
90 90 opening_post = self.get(id=opening_post_id)
91 91 except Post.DoesNotExist:
92 92 raise Http404
93 93
94 94 if opening_post.parent == NO_PARENT:
95 95 replies = self.filter(parent=opening_post_id)
96 96
97 97 thread = [opening_post]
98 98 thread.extend(replies)
99 99
100 100 return thread
101 101
102 102 def exists(self, post_id):
103 103 posts = self.filter(id=post_id)
104 104
105 105 return posts.count() > 0
106 106
107 107 def get_thread_page_count(self, tag=None):
108 108 if tag:
109 109 threads = self.filter(parent=NO_PARENT, tags=tag)
110 110 else:
111 111 threads = self.filter(parent=NO_PARENT)
112 112
113 113 return int(math.ceil(threads.count() / float(
114 114 settings.THREADS_PER_PAGE)))
115 115
116 116 def _delete_old_threads(self):
117 117 """
118 118 Preserves maximum thread count. If there are too many threads,
119 119 delete the old ones.
120 120 """
121 121
122 122 # TODO Move old threads to the archive instead of deleting them.
123 123 # Maybe make some 'old' field in the model to indicate the thread
124 124 # must not be shown and be able for replying.
125 125
126 126 threads = self.get_threads()
127 127 thread_count = len(threads)
128 128
129 129 if thread_count > settings.MAX_THREAD_COUNT:
130 130 num_threads_to_delete = thread_count - settings.MAX_THREAD_COUNT
131 131 old_threads = threads[thread_count - num_threads_to_delete:]
132 132
133 133 for thread in old_threads:
134 134 self.delete_post(thread)
135 135
136 136 def _bump_thread(self, thread_id):
137 137 thread = self.get(id=thread_id)
138 138
139 139 if thread.can_bump():
140 140 thread.last_edit_time = timezone.now()
141 141 thread.save()
142 142
143 143
144 144 class TagManager(models.Manager):
145 145 def get_not_empty_tags(self):
146 146 all_tags = self.all().order_by('name')
147 147 tags = []
148 148 for tag in all_tags:
149 149 if not tag.is_empty():
150 150 tags.append(tag)
151 151
152 152 return tags
153 153
154 154 def get_popular_tags(self):
155 155 all_tags = self.get_not_empty_tags()
156 156
157 157 sorted_tags = sorted(all_tags, key=lambda tag: tag.get_popularity(),
158 158 reverse=True)
159 159
160 160 return sorted_tags[:settings.POPULAR_TAGS]
161 161
162 162
163 163 class Tag(models.Model):
164 164 """
165 165 A tag is a text node assigned to the post. The tag serves as a board
166 166 section. There can be multiple tags for each message
167 167 """
168 168
169 169 objects = TagManager()
170 170
171 171 name = models.CharField(max_length=100)
172 172 # TODO Connect the tag to its posts to check the number of threads for
173 173 # the tag.
174 174
175 175 def __unicode__(self):
176 176 return self.name
177 177
178 178 def is_empty(self):
179 179 return self.get_post_count() == 0
180 180
181 181 def get_post_count(self):
182 182 posts_with_tag = Post.objects.get_threads(tag=self)
183 183 return posts_with_tag.count()
184 184
185 185 def get_popularity(self):
186 186 posts_with_tag = Post.objects.get_threads(tag=self)
187 187 reply_count = 0
188 188 for post in posts_with_tag:
189 189 reply_count += post.get_reply_count()
190 reply_count += OPENING_POST_WEIGHT
190 reply_count += OPENING_POST_POPULARITY_WEIGHT
191 191
192 192 return reply_count
193 193
194 194
195 195 class Post(models.Model):
196 196 """A post is a message."""
197 197
198 198 objects = PostManager()
199 199
200 200 def _update_image_filename(self, filename):
201 201 """Get unique image filename"""
202 202
203 203 path = IMAGES_DIRECTORY
204 204 new_name = str(int(time.mktime(time.gmtime())))
205 205 new_name += str(int(random() * 1000))
206 206 new_name += FILE_EXTENSION_DELIMITER
207 207 new_name += filename.split(FILE_EXTENSION_DELIMITER)[-1:][0]
208 208
209 209 return os.path.join(path, new_name)
210 210
211 211 title = models.CharField(max_length=TITLE_MAX_LENGTH)
212 212 pub_time = models.DateTimeField()
213 213 text = MarkupField(default_markup_type=DEFAULT_MARKUP_TYPE,
214 214 escape_html=True)
215 215 image = thumbs.ImageWithThumbsField(upload_to=_update_image_filename,
216 216 blank=True, sizes=(IMAGE_THUMB_SIZE,))
217 217 poster_ip = models.IPAddressField()
218 218 poster_user_agent = models.TextField()
219 219 parent = models.BigIntegerField()
220 220 tags = models.ManyToManyField(Tag)
221 221 last_edit_time = models.DateTimeField()
222 222
223 223 def __unicode__(self):
224 224 return '#' + str(self.id) + ' ' + self.title + ' (' + self.text.raw + \
225 225 ')'
226 226
227 227 def _get_replies(self):
228 228 return Post.objects.filter(parent=self.id)
229 229
230 230 def get_reply_count(self):
231 231 return self._get_replies().count()
232 232
233 233 def get_images_count(self):
234 234 images_count = 1 if self.image else 0
235 235 for reply in self._get_replies():
236 236 if reply.image:
237 237 images_count += 1
238 238
239 239 return images_count
240 240
241 241 def get_gets_count(self):
242 242 gets_count = 1 if self.is_get() else 0
243 243 for reply in self._get_replies():
244 244 if reply.is_get():
245 245 gets_count += 1
246 246
247 247 return gets_count
248 248
249 249 def is_get(self):
250 250 """If the post has pretty id (1, 1000, 77777), than it is called GET"""
251 251
252 252 first = self.id == 1
253 253
254 254 id_str = str(self.id)
255 255 pretty = REGEX_PRETTY.match(id_str)
256 256 same_digits = REGEX_SAME.match(id_str)
257 257
258 258 return first or pretty or same_digits
259 259
260 260 def can_bump(self):
261 261 """Check if the thread can be bumped by replying"""
262 262
263 263 replies_count = len(Post.objects.get_thread(self.id))
264 264
265 265 return replies_count <= settings.MAX_POSTS_PER_THREAD
266 266
267 267 def get_last_replies(self):
268 268 if settings.LAST_REPLIES_COUNT > 0:
269 269 reply_count = self.get_reply_count()
270 270
271 271 if reply_count > 0:
272 272 reply_count_to_show = min(settings.LAST_REPLIES_COUNT,
273 273 reply_count)
274 274 last_replies = self._get_replies()[reply_count
275 275 - reply_count_to_show:]
276 276
277 277 return last_replies
278 278
279 279
280 280 class Admin(models.Model):
281 281 """
282 282 Model for admin users
283 283 """
284 284 name = models.CharField(max_length=100)
285 285 password = models.CharField(max_length=100)
286 286
287 287 def __unicode__(self):
288 288 return self.name + '/' + '*' * len(self.password)
@@ -1,44 +1,44 b''
1 1 {% load staticfiles %}
2 2 {% load i18n %}
3 3
4 4 <!DOCTYPE html>
5 5 <html>
6 6 <head>
7 7 <link rel="stylesheet" type="text/css"
8 8 href="{{ STATIC_URL }}css/jquery.fancybox.css" media="all"/>
9 9 <link rel="stylesheet" type="text/css"
10 10 href="{{ STATIC_URL }}css/{{ theme }}/base_page.css" media="all"/>
11 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
11 <meta name="viewport" content="width=device-width, initial-scale=1"/>
12 12 {% block head %}{% endblock %}
13 13 </head>
14 14 <body>
15 15 <script src="{{ STATIC_URL }}js/jquery-2.0.1.min.js"></script>
16 16 <script src="{{ STATIC_URL }}js/jquery.fancybox.pack.js"></script>
17 17 <script src="{{ STATIC_URL }}js/main.js"></script>
18 18 <div id="admin_panel">
19 19
20 20 {% if request.session.admin == True %}
21 21 Admin panel TODO: Need to implement <BR />
22 22 {% endif %}
23 23
24 24 </div>
25 25
26 26 <div class="navigation_panel">
27 27 <a class="link" href="{% url 'index' %}">{% trans "All threads" %}</a>
28 28 {% for tag in tags %}
29 29 <a class="tag" href=" {% url 'tag' tag_name=tag.name %}">
30 30 {{ tag.name }}</a>({{ tag.get_post_count }})
31 31 {% endfor %}
32 32 <a class="tag" href="{% url 'tags' %}">[...]</a>
33 33 <a class="link" href="{% url 'settings' %}">{% trans 'Settings' %}</a>
34 34 </div>
35 35
36 36 {% block content %}{% endblock %}
37 37
38 38 <div class="navigation_panel">
39 39 {% block metapanel %}{% endblock %}
40 40 <a class="link" href="#top">{% trans 'Up' %}</a>
41 41 </div>
42 42
43 43 </body>
44 44 </html> No newline at end of file
@@ -1,164 +1,164 b''
1 1 {% extends "boards/base.html" %}
2 2
3 3 {% load i18n %}
4 4 {% load markup %}
5 5
6 6 {% block head %}
7 7 {% if tag %}
8 8 <title>Neboard - {{ tag }}</title>
9 9 {% else %}
10 10 <title>Neboard</title>
11 11 {% endif %}
12 12 {% endblock %}
13 13
14 14 {% block content %}
15 15
16 16 {% if tag %}
17 17 <div class="tag_info">
18 18 <h2>{% trans 'Tag: ' %}{{ tag }}</h2>
19 19 </div>
20 20 {% endif %}
21 21
22 22 {% if threads %}
23 23 {% for thread in threads %}
24 24 <div class="thread">
25 25 {% if thread.can_bump %}
26 26 <div class="post">
27 27 {% else %}
28 28 <div class="post dead_post">
29 29 {% endif %}
30 30 {% if thread.image %}
31 31 <div class="image">
32 32 <a class="fancy"
33 33 href="{{ thread.image.url }}"><img
34 34 src="{{ thread.image.url_200x150 }}"
35 35 alt="{% trans 'Post image' %}" />
36 36 </a>
37 37 </div>
38 38 {% endif %}
39 39 <div class="message">
40 40 <div class="post-info">
41 41 <span class="title">{{ thread.title }}</span>
42 42 <a class="post_id" href="{% url 'thread' thread.id %}">
43 43 (#{{ thread.id }})</a>
44 44 [{{ thread.pub_time }}]
45 45 [<a class="link" href="{% url 'thread' thread.id %}#form"
46 46 >{% trans "Reply" %}</a>]
47 47 </div>
48 48 {% autoescape off %}
49 49 {{ thread.text.rendered|truncatewords_html:50 }}
50 50 {% endautoescape %}
51 51 </div>
52 52 <div class="metadata">
53 53 {{ thread.get_reply_count }} {% trans 'replies' %},
54 54 {{ thread.get_images_count }} {% trans 'images' %}.
55 55 {% if thread.tags.all %}
56 56 <span class="tags">{% trans 'Tags' %}:
57 57 {% for tag in thread.tags.all %}
58 58 <a class="tag" href="
59 59 {% url 'tag' tag_name=tag.name %}">
60 60 {{ tag.name }}</a>
61 61 {% endfor %}
62 62 </span>
63 63 {% endif %}
64 64 </div>
65 65 </div>
66 66 {% if thread.get_last_replies %}
67 67 <div class="last-replies">
68 68 {% for post in thread.get_last_replies %}
69 69 {% if thread.can_bump %}
70 70 <div class="post">
71 71 {% else %}
72 72 <div class="post dead_post">
73 73 {% endif %}
74 74 {% if post.image %}
75 75 <div class="image">
76 76 <a class="fancy"
77 77 href="{{ post.image.url }}"><img
78 78 src=" {{ post.image.url_200x150 }}"
79 79 alt="{% trans 'Post image' %}" />
80 80 </a>
81 81 </div>
82 82 {% endif %}
83 83 <div class="message">
84 84 <div class="post-info">
85 85 <span class="title">{{ post.title }}</span>
86 86 <a class="post_id" href="
87 87 {% url 'thread' thread.id %}#{{ post.id }}">
88 88 (#{{ post.id }})</a>
89 89 [{{ post.pub_time }}]
90 90 </div>
91 91 {% autoescape off %}
92 92 {{ post.text.rendered|truncatewords_html:50 }}
93 93 {% endautoescape %}
94 94 </div>
95 95 </div>
96 96 {% endfor %}
97 97 </div>
98 98 {% endif %}
99 99 </div>
100 100 {% endfor %}
101 101 {% else %}
102 102 No threads found.
103 103 <hr />
104 104 {% endif %}
105 105
106 106 <form enctype="multipart/form-data" method="post">{% csrf_token %}
107 107 <div class="post-form-w">
108 108
109 109 <div class="form-title">{% trans "Create new thread" %}</div>
110 110 <div class="post-form">
111 111 <div class="form-row">
112 112 <div class="form-label">{% trans 'Title' %}</div>
113 113 <div class="form-input">{{ form.title }}</div>
114 114 <div class="form-errors">{{ form.title.errors }}</div>
115 115 </div>
116 116 <div class="form-row">
117 117 <div class="form-label">{% trans 'Text' %}</div>
118 118 <div class="form-input">{{ form.text }}</div>
119 119 <div class="form-errors">{{ form.text.errors }}</div>
120 120 </div>
121 121 <div class="form-row">
122 122 <div class="form-label">{% trans 'Image' %}</div>
123 123 <div class="form-input">{{ form.image }}</div>
124 124 <div class="form-errors">{{ form.image.errors }}</div>
125 125 </div>
126 126 <div class="form-row">
127 127 <div class="form-label">{% trans 'Tags' %}</div>
128 128 <div class="form-input">{{ form.tags }}</div>
129 129 <div class="form-errors">{{ form.tags.errors }}</div>
130 130 </div>
131 131 <div class="form-row">
132 132 {{ form.captcha }}
133 133 </div>
134 134 </div>
135 135 <div class="form-submit">
136 136 <input type="submit" value="{% trans "Post" %}"/></div>
137 <div>Tags must be delimited by spaces. Text or image is required
138 </div>
139 <div>Use <a
140 href="http://daringfireball.net/projects/markdown/basics">
141 markdown</a> syntax for posting.</div>
137 <div>
138 {% trans 'Tags must be delimited by spaces. Text or image is required.' %}
139 </div>
140 <div><a href="http://daringfireball.net/projects/markdown/basics">
141 {% trans 'Basic markdown syntax.' %}</a></div>
142 142 </div>
143 143 </form>
144 144
145 145 {% endblock %}
146 146
147 147 {% block metapanel %}
148 148
149 149 <span class="metapanel">
150 150 <b><a href="https://bitbucket.org/neko259/neboard/">Neboard</a>
151 2013-05 (dev)</b>
151 pre1.0</b>
152 152 {% trans "Pages:" %}
153 153 {% for page in pages %}
154 154 [<a href="
155 155 {% if tag %}
156 156 {% url "tag" tag_name=tag page=page %}
157 157 {% else %}
158 158 {% url "index" page=page %}
159 159 {% endif %}
160 160 ">{{ page }}</a>]
161 161 {% endfor %}
162 162 </span>
163 163
164 164 {% endblock %}
@@ -1,195 +1,195 b''
1 1 # Django settings for neboard project.
2 2 import os
3 3 import markdown
4 4 from boards.mdx_neboard import markdown_extended
5 5
6 6 DEBUG = True
7 7 TEMPLATE_DEBUG = DEBUG
8 8
9 9 ADMINS = (
10 10 # ('Your Name', 'your_email@example.com'),
11 11 ('admin', 'admin@example.com')
12 12 )
13 13
14 14 MANAGERS = ADMINS
15 15
16 16 DATABASES = {
17 17 'default': {
18 18 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
19 19 'NAME': 'database.db', # Or path to database file if using sqlite3.
20 20 'USER': '', # Not used with sqlite3.
21 21 'PASSWORD': '', # Not used with sqlite3.
22 22 'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
23 23 'PORT': '', # Set to empty string for default. Not used with sqlite3.
24 24 }
25 25 }
26 26
27 27 # Local time zone for this installation. Choices can be found here:
28 28 # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
29 29 # although not all choices may be available on all operating systems.
30 30 # In a Windows environment this must be set to your system time zone.
31 31 TIME_ZONE = 'Europe/Kiev'
32 32
33 33 # Language code for this installation. All choices can be found here:
34 34 # http://www.i18nguy.com/unicode/language-identifiers.html
35 35 LANGUAGE_CODE = 'ru-RU'
36 36
37 37 SITE_ID = 1
38 38
39 39 # If you set this to False, Django will make some optimizations so as not
40 40 # to load the internationalization machinery.
41 41 USE_I18N = True
42 42
43 43 # If you set this to False, Django will not format dates, numbers and
44 44 # calendars according to the current locale.
45 45 USE_L10N = True
46 46
47 47 # If you set this to False, Django will not use timezone-aware datetimes.
48 48 USE_TZ = True
49 49
50 50 # Absolute filesystem path to the directory that will hold user-uploaded files.
51 51 # Example: "/home/media/media.lawrence.com/media/"
52 52 MEDIA_ROOT = './media/'
53 53
54 54 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
55 55 # trailing slash.
56 56 # Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
57 57 MEDIA_URL = '/media/'
58 58
59 59 # Absolute path to the directory static files should be collected to.
60 60 # Don't put anything in this directory yourself; store your static files
61 61 # in apps' "static/" subdirectories and in STATICFILES_DIRS.
62 62 # Example: "/home/media/media.lawrence.com/static/"
63 63 STATIC_ROOT = ''
64 64
65 65 # URL prefix for static files.
66 66 # Example: "http://media.lawrence.com/static/"
67 67 STATIC_URL = '/static/'
68 68
69 69 # Additional locations of static files
70 70 # It is really a hack, put real paths, not related
71 71 STATICFILES_DIRS = (
72 72 os.path.dirname(__file__) + '/boards/static',
73 73
74 74 # '/d/work/python/django/neboard/neboard/boards/static',
75 75 # Put strings here, like "/home/html/static" or "C:/www/django/static".
76 76 # Always use forward slashes, even on Windows.
77 77 # Don't forget to use absolute paths, not relative paths.
78 78 )
79 79
80 80 # List of finder classes that know how to find static files in
81 81 # various locations.
82 82 STATICFILES_FINDERS = (
83 83 'django.contrib.staticfiles.finders.FileSystemFinder',
84 84 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
85 85 # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
86 86 )
87 87
88 88 # Make this unique, and don't share it with anybody.
89 89 SECRET_KEY = '@1rc$o(7=tt#kd+4s$u6wchm**z^)4x90)7f6z(i&amp;55@o11*8o'
90 90
91 91 # List of callables that know how to import templates from various sources.
92 92 TEMPLATE_LOADERS = (
93 93 'django.template.loaders.filesystem.Loader',
94 94 'django.template.loaders.app_directories.Loader',
95 95 # 'django.template.loaders.eggs.Loader',
96 96 )
97 97
98 98 TEMPLATE_CONTEXT_PROCESSORS = (
99 99 'django.core.context_processors.media',
100 100 'django.core.context_processors.static',
101 101 'django.core.context_processors.request',
102 102 'django.contrib.auth.context_processors.auth',
103 103 )
104 104
105 105 MIDDLEWARE_CLASSES = (
106 106 'django.middleware.common.CommonMiddleware',
107 107 'django.contrib.sessions.middleware.SessionMiddleware',
108 108 # 'django.middleware.csrf.CsrfViewMiddleware',
109 109 'django.contrib.auth.middleware.AuthenticationMiddleware',
110 110 'django.contrib.messages.middleware.MessageMiddleware',
111 111 # Uncomment the next line for simple clickjacking protection:
112 112 # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
113 113 )
114 114
115 115 ROOT_URLCONF = 'neboard.urls'
116 116
117 117 # Python dotted path to the WSGI application used by Django's runserver.
118 118 WSGI_APPLICATION = 'neboard.wsgi.application'
119 119
120 120 TEMPLATE_DIRS = (
121 121 # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
122 122 # Always use forward slashes, even on Windows.
123 123 # Don't forget to use absolute paths, not relative paths.
124 124 'templates',
125 125 )
126 126
127 127 INSTALLED_APPS = (
128 128 'django.contrib.auth',
129 129 'django.contrib.contenttypes',
130 130 'django.contrib.sessions',
131 131 'django.contrib.sites',
132 132 'django.contrib.messages',
133 133 'django.contrib.staticfiles',
134 134 # Uncomment the next line to enable the admin:
135 135 'django.contrib.admin',
136 136 # Uncomment the next line to enable admin documentation:
137 137 # 'django.contrib.admindocs',
138 138 'django.contrib.markup',
139 139 'django_cleanup',
140 140 'boards',
141 141 'captcha',
142 142 )
143 143
144 144 # TODO: NEED DESIGN FIXES
145 145 CAPTCHA_OUTPUT_FORMAT = (u' %(hidden_field)s '
146 146 u'<div class="form-label">%(image)s</div>'
147 147 u'<div class="form-text">%(text_field)s</div>')
148 148
149 149 # A sample logging configuration. The only tangible logging
150 150 # performed by this configuration is to send an email to
151 151 # the site admins on every HTTP 500 error when DEBUG=False.
152 152 # See http://docs.djangoproject.com/en/dev/topics/logging for
153 153 # more details on how to customize your logging configuration.
154 154 LOGGING = {
155 155 'version': 1,
156 156 'disable_existing_loggers': False,
157 157 'filters': {
158 158 'require_debug_false': {
159 159 '()': 'django.utils.log.RequireDebugFalse'
160 160 }
161 161 },
162 162 'handlers': {
163 163 'mail_admins': {
164 164 'level': 'ERROR',
165 165 'filters': ['require_debug_false'],
166 166 'class': 'django.utils.log.AdminEmailHandler'
167 167 }
168 168 },
169 169 'loggers': {
170 170 'django.request': {
171 171 'handlers': ['mail_admins'],
172 172 'level': 'ERROR',
173 173 'propagate': True,
174 174 },
175 175 }
176 176 }
177 177
178 178 MARKUP_FIELD_TYPES = (
179 179 ('markdown', markdown_extended),
180 180 )
181 181 # Custom imageboard settings
182 182 MAX_POSTS_PER_THREAD = 10 # Thread bumplimit
183 183 MAX_THREAD_COUNT = 500 # Old threads will be deleted to preserve this count
184 184 THREADS_PER_PAGE = 10
185 185 SITE_NAME = 'Neboard'
186 186
187 187 THEMES = [
188 188 ('md', 'Mystic Dark'),
189 189 ('sw', 'Snow White') ]
190 190 DEFAULT_THEME = 'md'
191 191
192 192 POPULAR_TAGS = 10
193 193 LAST_REPLIES_COUNT = 3
194 194
195 ENABLE_CAPTCHA = True No newline at end of file
195 ENABLE_CAPTCHA = False No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now