Show More
@@ -2,9 +2,8 b' import re' | |||||
2 | from captcha.fields import CaptchaField |
|
2 | from captcha.fields import CaptchaField | |
3 | from django import forms |
|
3 | from django import forms | |
4 | from django.forms.util import ErrorList |
|
4 | from django.forms.util import ErrorList | |
5 |
from django.utils import |
|
5 | from django.utils.translation import ugettext_lazy as _ | |
6 | import time |
|
6 | import time | |
7 | import math |
|
|||
8 | from boards.models import TITLE_MAX_LENGTH, User |
|
7 | from boards.models import TITLE_MAX_LENGTH, User | |
9 | from neboard import settings |
|
8 | from neboard import settings | |
10 | from boards import utils |
|
9 | from boards import utils | |
@@ -20,7 +19,27 b' class PlainErrorList(ErrorList):' | |||||
20 | return ''.join([u'(!) %s ' % e for e in self]) |
|
19 | return ''.join([u'(!) %s ' % e for e in self]) | |
21 |
|
20 | |||
22 |
|
21 | |||
23 |
class |
|
22 | class NeboardForm(forms.Form): | |
|
23 | ||||
|
24 | def as_p(self): | |||
|
25 | "Returns this form rendered as HTML <p>s." | |||
|
26 | return self._html_output( | |||
|
27 | normal_row='<div class="form-row">' | |||
|
28 | '<div class="form-label">' | |||
|
29 | '%(label)s' | |||
|
30 | '</div>' | |||
|
31 | '<div class="form-input">' | |||
|
32 | '%(field)s' | |||
|
33 | '</div>' | |||
|
34 | '%(help_text)s' | |||
|
35 | '</div>', | |||
|
36 | error_row='<div class="form-errors">%s</div>', | |||
|
37 | row_ender='</p>', | |||
|
38 | help_text_html=' <span class="helptext">%s</span>', | |||
|
39 | errors_on_separate_row=True) | |||
|
40 | ||||
|
41 | ||||
|
42 | class PostForm(NeboardForm): | |||
24 |
|
43 | |||
25 | MAX_TEXT_LENGTH = 30000 |
|
44 | MAX_TEXT_LENGTH = 30000 | |
26 | MAX_IMAGE_SIZE = 8 * 1024 * 1024 |
|
45 | MAX_IMAGE_SIZE = 8 * 1024 * 1024 | |
@@ -74,7 +93,7 b' class PostForm(forms.Form):' | |||||
74 | image = self.cleaned_data.get('image') |
|
93 | image = self.cleaned_data.get('image') | |
75 |
|
94 | |||
76 | if (not text) and (not image): |
|
95 | if (not text) and (not image): | |
77 | error_message = 'Either text or image must be entered.' |
|
96 | error_message = _('Either text or image must be entered.') | |
78 | self._errors['text'] = self.error_class([error_message]) |
|
97 | self._errors['text'] = self.error_class([error_message]) | |
79 |
|
98 | |||
80 | def _validate_posting_speed(self): |
|
99 | def _validate_posting_speed(self): | |
@@ -108,7 +127,7 b' class ThreadForm(PostForm):' | |||||
108 | if tags: |
|
127 | if tags: | |
109 | if not self.regex_tags.match(tags): |
|
128 | if not self.regex_tags.match(tags): | |
110 | raise forms.ValidationError( |
|
129 | raise forms.ValidationError( | |
111 | 'Inappropriate characters in tags.') |
|
130 | _('Inappropriate characters in tags.')) | |
112 |
|
131 | |||
113 | return tags |
|
132 | return tags | |
114 |
|
133 | |||
@@ -136,7 +155,7 b' class PostCaptchaForm(PostForm):' | |||||
136 | if success: |
|
155 | if success: | |
137 | return cleaned_data |
|
156 | return cleaned_data | |
138 | else: |
|
157 | else: | |
139 |
raise forms.ValidationError(" |
|
158 | raise forms.ValidationError(_("Captcha validation failed")) | |
140 |
|
159 | |||
141 |
|
160 | |||
142 | class ThreadCaptchaForm(ThreadForm): |
|
161 | class ThreadCaptchaForm(ThreadForm): | |
@@ -157,14 +176,22 b' class ThreadCaptchaForm(ThreadForm):' | |||||
157 | if success: |
|
176 | if success: | |
158 | return cleaned_data |
|
177 | return cleaned_data | |
159 | else: |
|
178 | else: | |
160 |
raise forms.ValidationError(" |
|
179 | raise forms.ValidationError(_("Captcha validation failed")) | |
161 |
|
180 | |||
162 |
|
181 | |||
163 |
class SettingsForm( |
|
182 | class SettingsForm(NeboardForm): | |
164 | theme = forms.ChoiceField(choices=settings.THEMES, widget=forms.RadioSelect) |
|
183 | ||
|
184 | theme = forms.ChoiceField(choices=settings.THEMES, | |||
|
185 | label=_('Theme')) | |||
165 |
|
186 | |||
166 |
|
187 | |||
167 |
class |
|
188 | class ModeratorSettingsForm(SettingsForm): | |
|
189 | ||||
|
190 | moderate = forms.BooleanField(required=False, label=_('Enable moderation ' | |||
|
191 | 'panel')) | |||
|
192 | ||||
|
193 | ||||
|
194 | class LoginForm(NeboardForm): | |||
168 | user_id = forms.CharField() |
|
195 | user_id = forms.CharField() | |
169 |
|
196 | |||
170 | def clean_user_id(self): |
|
197 | def clean_user_id(self): | |
@@ -172,7 +199,7 b' class LoginForm(forms.Form):' | |||||
172 | if user_id: |
|
199 | if user_id: | |
173 | users = User.objects.filter(user_id=user_id) |
|
200 | users = User.objects.filter(user_id=user_id) | |
174 | if len(users) == 0: |
|
201 | if len(users) == 0: | |
175 | raise forms.ValidationError('No such user found') |
|
202 | raise forms.ValidationError(_('No such user found')) | |
176 |
|
203 | |||
177 | return user_id |
|
204 | return user_id | |
178 |
|
205 |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
@@ -7,7 +7,7 b' msgid ""' | |||||
7 | msgstr "" |
|
7 | msgstr "" | |
8 | "Project-Id-Version: PACKAGE VERSION\n" |
|
8 | "Project-Id-Version: PACKAGE VERSION\n" | |
9 | "Report-Msgid-Bugs-To: \n" |
|
9 | "Report-Msgid-Bugs-To: \n" | |
10 |
"POT-Creation-Date: 2013-09-1 |
|
10 | "POT-Creation-Date: 2013-09-17 21:58+0300\n" | |
11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
|
11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | |
12 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
|
12 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | |
13 | "Language-Team: LANGUAGE <LL@li.org>\n" |
|
13 | "Language-Team: LANGUAGE <LL@li.org>\n" | |
@@ -18,6 +18,31 b' msgstr ""' | |||||
18 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" |
|
18 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" | |
19 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" |
|
19 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" | |
20 |
|
20 | |||
|
21 | #: forms.py:96 | |||
|
22 | msgid "Either text or image must be entered." | |||
|
23 | msgstr "Π’Π΅ΠΊΡΡ ΠΈΠ»ΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π²Π²Π΅Π΄Π΅Π½Ρ." | |||
|
24 | ||||
|
25 | #: forms.py:130 | |||
|
26 | msgid "Inappropriate characters in tags." | |||
|
27 | msgstr "ΠΠ΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² ΡΠ΅Π³Π°Ρ ." | |||
|
28 | ||||
|
29 | #: forms.py:158 forms.py:179 | |||
|
30 | msgid "Captcha validation failed" | |||
|
31 | msgstr "ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠ°ΠΏΡΠΈ ΠΏΡΠΎΠ²Π°Π»Π΅Π½Π°" | |||
|
32 | ||||
|
33 | #: forms.py:185 | |||
|
34 | msgid "Theme" | |||
|
35 | msgstr "Π’Π΅ΠΌΠ°" | |||
|
36 | ||||
|
37 | #: forms.py:190 | |||
|
38 | msgid "Enable moderation panel" | |||
|
39 | msgstr "ΠΠΊΠ»ΡΡΠΈΡΡ ΠΏΠ°Π½Π΅Π»Ρ ΠΌΠΎΠ΄Π΅ΡΠ°ΡΠΈΠΈ" | |||
|
40 | ||||
|
41 | #: forms.py:202 | |||
|
42 | #, fuzzy | |||
|
43 | msgid "No such user found" | |||
|
44 | msgstr "Π’Π΅Π³ΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Ρ." | |||
|
45 | ||||
21 | #: templates/boards/404.html:6 |
|
46 | #: templates/boards/404.html:6 | |
22 | msgid "Not found" |
|
47 | msgid "Not found" | |
23 | msgstr "ΠΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ" |
|
48 | msgstr "ΠΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ" | |
@@ -168,11 +193,7 b' msgstr "\xd0\x9f\xd0\xb5\xd1\x80\xd0\xb2\xd1\x8b\xd0\xb9 \xd0\xb4\xd0\xbe\xd1\x81\xd1\x82\xd1\x83\xd0\xbf:"' | |||||
168 | msgid "Last access:" |
|
193 | msgid "Last access:" | |
169 | msgstr "ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄ΠΎΡΡΡΠΏ: " |
|
194 | msgstr "ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄ΠΎΡΡΡΠΏ: " | |
170 |
|
195 | |||
171 |
#: templates/boards/settings.html: |
|
196 | #: templates/boards/settings.html:30 | |
172 | msgid "Theme" |
|
|||
173 | msgstr "Π’Π΅ΠΌΠ°" |
|
|||
174 |
|
||||
175 | #: templates/boards/settings.html:43 |
|
|||
176 | msgid "Save" |
|
197 | msgid "Save" | |
177 | msgstr "Π‘ΠΎΡ ΡΠ°Π½ΠΈΡΡ" |
|
198 | msgstr "Π‘ΠΎΡ ΡΠ°Π½ΠΈΡΡ" | |
178 |
|
199 |
@@ -28,7 +28,9 b" FILE_EXTENSION_DELIMITER = '.'" | |||||
28 |
|
28 | |||
29 | RANK_ADMIN = 0 |
|
29 | RANK_ADMIN = 0 | |
30 | RANK_MODERATOR = 10 |
|
30 | RANK_MODERATOR = 10 | |
31 | RANK_USER = 100 |
|
31 | RANK_USER = 100 \ | |
|
32 | ||||
|
33 | SETTING_MODERATE = "moderate" | |||
32 |
|
34 | |||
33 |
|
35 | |||
34 | class PostManager(models.Manager): |
|
36 | class PostManager(models.Manager): | |
@@ -279,7 +281,7 b' class User(models.Model):' | |||||
279 |
|
281 | |||
280 | def save_setting(self, name, value): |
|
282 | def save_setting(self, name, value): | |
281 | setting, created = Setting.objects.get_or_create(name=name, user=self) |
|
283 | setting, created = Setting.objects.get_or_create(name=name, user=self) | |
282 | setting.value = value |
|
284 | setting.value = str(value) | |
283 | setting.save() |
|
285 | setting.save() | |
284 |
|
286 | |||
285 | return setting |
|
287 | return setting |
@@ -24,22 +24,9 b'' | |||||
24 |
|
24 | |||
25 | <div class="post-form-w"> |
|
25 | <div class="post-form-w"> | |
26 | <div class="post-form"> |
|
26 | <div class="post-form"> | |
27 | <span class="form-title">{% trans "Theme" %}</span> |
|
|||
28 | <form method="post">{% csrf_token %} |
|
27 | <form method="post">{% csrf_token %} | |
29 | {% for choice in form.fields.theme.choices %} |
|
28 | {{ form.as_p }} | |
30 | <div class="settings_item"> |
|
29 | <hr /> | |
31 | <label for="{{ choice.0 }}"> |
|
|||
32 | <input type="radio" name="theme" |
|
|||
33 | id="{{ choice.0 }}" |
|
|||
34 | value="{{ choice.0 }}" |
|
|||
35 | {% ifequal form.initial.theme choice.0 %} |
|
|||
36 | checked |
|
|||
37 | {% endifequal %} |
|
|||
38 | /> |
|
|||
39 | {{ choice.1 }} |
|
|||
40 | </label> |
|
|||
41 | </div> |
|
|||
42 | {% endfor %} |
|
|||
43 | <input type="submit" value="{% trans "Save" %}" /> |
|
30 | <input type="submit" value="{% trans "Save" %}" /> | |
44 | </form> |
|
31 | </form> | |
45 | </div> |
|
32 | </div> |
@@ -10,9 +10,9 b' from boards import forms' | |||||
10 | import boards |
|
10 | import boards | |
11 | from boards import utils |
|
11 | from boards import utils | |
12 | from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \ |
|
12 | from boards.forms import ThreadForm, PostForm, SettingsForm, PlainErrorList, \ | |
13 | ThreadCaptchaForm, PostCaptchaForm, LoginForm |
|
13 | ThreadCaptchaForm, PostCaptchaForm, LoginForm, ModeratorSettingsForm | |
14 |
|
14 | |||
15 | from boards.models import Post, Tag, Ban, User, RANK_USER |
|
15 | from boards.models import Post, Tag, Ban, User, RANK_USER, SETTING_MODERATE | |
16 | from boards import authors |
|
16 | from boards import authors | |
17 | import neboard |
|
17 | import neboard | |
18 |
|
18 | |||
@@ -183,22 +183,40 b' def settings(request):' | |||||
183 | """User's settings""" |
|
183 | """User's settings""" | |
184 |
|
184 | |||
185 | context = _init_default_context(request) |
|
185 | context = _init_default_context(request) | |
|
186 | user = _get_user(request) | |||
|
187 | is_moderator = user.is_moderator() | |||
186 |
|
188 | |||
187 | if request.method == 'POST': |
|
189 | if request.method == 'POST': | |
188 | form = SettingsForm(request.POST) |
|
190 | if is_moderator: | |
|
191 | form = ModeratorSettingsForm(request.POST, | |||
|
192 | error_class=PlainErrorList) | |||
|
193 | else: | |||
|
194 | form = SettingsForm(request.POST, error_class=PlainErrorList) | |||
|
195 | ||||
189 | if form.is_valid(): |
|
196 | if form.is_valid(): | |
190 | selected_theme = form.cleaned_data['theme'] |
|
197 | selected_theme = form.cleaned_data['theme'] | |
191 |
|
198 | |||
192 | user = _get_user(request) |
|
|||
193 | user.save_setting('theme', selected_theme) |
|
199 | user.save_setting('theme', selected_theme) | |
194 |
|
200 | |||
195 | return redirect(settings) |
|
201 | if is_moderator: | |
|
202 | moderate = form.cleaned_data['moderate'] | |||
|
203 | user.save_setting(SETTING_MODERATE, moderate) | |||
|
204 | ||||
|
205 | return redirect(settings) | |||
196 | else: |
|
206 | else: | |
197 | selected_theme = _get_theme(request) |
|
207 | selected_theme = _get_theme(request) | |
198 | form = SettingsForm(initial={'theme': selected_theme}) |
|
|||
199 | context['form'] = form |
|
|||
200 |
|
208 | |||
201 | return render(request, 'boards/settings.html', context) |
|
209 | if is_moderator: | |
|
210 | form = ModeratorSettingsForm(initial={'theme': selected_theme, | |||
|
211 | 'moderate': context['moderator']}, | |||
|
212 | error_class=PlainErrorList) | |||
|
213 | else: | |||
|
214 | form = SettingsForm(initial={'theme': selected_theme}, | |||
|
215 | error_class=PlainErrorList) | |||
|
216 | ||||
|
217 | context['form'] = form | |||
|
218 | ||||
|
219 | return render(request, 'boards/settings.html', context) | |||
202 |
|
220 | |||
203 |
|
221 | |||
204 | def all_tags(request): |
|
222 | def all_tags(request): | |
@@ -319,7 +337,12 b' def _init_default_context(request):' | |||||
319 | context['user'] = user |
|
337 | context['user'] = user | |
320 | context['tags'] = user.get_sorted_fav_tags() |
|
338 | context['tags'] = user.get_sorted_fav_tags() | |
321 | context['theme'] = _get_theme(request, user) |
|
339 | context['theme'] = _get_theme(request, user) | |
322 | context['moderator'] = user.is_moderator() |
|
340 | ||
|
341 | moderate = user.get_setting(SETTING_MODERATE) | |||
|
342 | if moderate == 'True': | |||
|
343 | context['moderator'] = user.is_moderator() | |||
|
344 | else: | |||
|
345 | context['moderator'] = False | |||
323 |
|
346 | |||
324 | return context |
|
347 | return context | |
325 |
|
348 |
General Comments 0
You need to be logged in to leave comments.
Login now