# HG changeset patch # User neko259 # Date 2014-07-05 15:11:11 # Node ID d56cc46f416dc8658069c11dfe7131b3fe67bd42 # Parent a5c2ce32e33fc07b0de945eabc356ac3f04d09a6 Added login and logout for moderators diff --git a/boards/abstracts/settingsmanager.py b/boards/abstracts/settingsmanager.py --- a/boards/abstracts/settingsmanager.py +++ b/boards/abstracts/settingsmanager.py @@ -52,7 +52,15 @@ class SettingsManager: if not permissions: permissions = [permission] else: - permissions += permission + permissions.append(permission) + self.set_setting(SETTING_PERMISSIONS, permissions) + + def del_permission(self, permission): + permissions = self.get_setting(SETTING_PERMISSIONS) + if not permissions: + permissions = [] + else: + permissions.remove(permission) self.set_setting(SETTING_PERMISSIONS, permissions) def get_fav_tags(self): diff --git a/boards/forms.py b/boards/forms.py --- a/boards/forms.py +++ b/boards/forms.py @@ -278,12 +278,6 @@ class SettingsForm(NeboardForm): label=_('Theme')) -class ModeratorSettingsForm(SettingsForm): - - moderate = forms.BooleanField(required=False, label=_('Enable moderation ' - 'panel')) - - class AddTagForm(NeboardForm): tag = forms.CharField(max_length=TAG_MAX_LENGTH, label=LABEL_TAG) @@ -305,4 +299,44 @@ class AddTagForm(NeboardForm): class SearchForm(NeboardForm): - query = forms.CharField(max_length=500, label=LABEL_SEARCH, required=False) \ No newline at end of file + query = forms.CharField(max_length=500, label=LABEL_SEARCH, required=False) + + +class LoginForm(NeboardForm): + + password = forms.CharField() + + session = None + + def clean_password(self): + password = self.cleaned_data['password'] + if board_settings.MASTER_PASSWORD != password: + raise forms.ValidationError(_('Invalid master password')) + + return password + + def _validate_login_speed(self): + can_post = True + + if LAST_LOGIN_TIME in self.session: + now = time.time() + last_login_time = self.session[LAST_LOGIN_TIME] + + current_delay = int(now - last_login_time) + + if current_delay < board_settings.LOGIN_TIMEOUT: + error_message = _('Wait %s minutes after last login') % str( + (board_settings.LOGIN_TIMEOUT - current_delay) / 60) + self._errors['password'] = self.error_class([error_message]) + + can_post = False + + if can_post: + self.session[LAST_LOGIN_TIME] = time.time() + + def clean(self): + self._validate_login_speed() + + cleaned_data = super(LoginForm, self).clean() + + return cleaned_data diff --git a/boards/locale/ru/LC_MESSAGES/django.mo b/boards/locale/ru/LC_MESSAGES/django.mo index b4d12e2f1e9cc3c1f276de818a34ae547f18bb65..e915d161abedfaf0c5988389efe8e717fb0c4520 GIT binary patch literal 6707 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 NiWH%-6Dpy!\n" "Language-Team: LANGUAGE \n" @@ -18,19 +18,19 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: authors.py:5 +#: authors.py:9 msgid "author" msgstr "автор" -#: authors.py:6 +#: authors.py:10 msgid "developer" msgstr "разработчик" -#: authors.py:7 +#: authors.py:11 msgid "javascript developer" msgstr "разработчик javascript" -#: authors.py:8 +#: authors.py:12 msgid "designer" msgstr "дизайнер" @@ -62,7 +62,7 @@ msgstr "Текст" msgid "Tag" msgstr "Тег" -#: forms.py:32 templates/boards/base.html:50 templates/search/search.html:9 +#: forms.py:32 templates/boards/base.html:54 templates/search/search.html:9 #: templates/search/search.html.py:13 msgid "Search" msgstr "Поиск" @@ -71,59 +71,55 @@ msgstr "Поиск" msgid "Image" msgstr "Изображение" -#: forms.py:113 +#: forms.py:114 msgid "e-mail" msgstr "" -#: forms.py:124 +#: forms.py:125 #, python-format msgid "Title must have less than %s characters" msgstr "Заголовок должен иметь меньше %s символов" -#: forms.py:133 +#: forms.py:134 #, python-format msgid "Text must have less than %s characters" msgstr "Текст должен быть короче %s символов" -#: forms.py:144 +#: forms.py:145 #, python-format msgid "Image must be less than %s bytes" msgstr "Изображение должно быть менее %s байт" -#: forms.py:179 +#: forms.py:180 msgid "Either text or image must be entered." msgstr "Текст или картинка должны быть введены." -#: forms.py:202 +#: forms.py:200 #, python-format msgid "Wait %s seconds after last posting" msgstr "Подождите %s секунд после последнего постинга" -#: forms.py:218 templates/boards/tags.html:7 templates/boards/rss/post.html:10 +#: forms.py:216 templates/boards/tags.html:7 templates/boards/rss/post.html:10 msgid "Tags" msgstr "Теги" -#: forms.py:225 forms.py:344 +#: forms.py:223 forms.py:291 msgid "Inappropriate characters in tags." msgstr "Недопустимые символы в тегах." -#: forms.py:253 forms.py:274 +#: forms.py:251 forms.py:272 msgid "Captcha validation failed" msgstr "Проверка капчи провалена" -#: forms.py:280 +#: forms.py:278 msgid "Theme" msgstr "Тема" -#: forms.py:285 -msgid "Enable moderation panel" -msgstr "Включить панель модерации" +#: forms.py:314 +msgid "Invalid master password" +msgstr "Неверный мастер-пароль" -#: forms.py:300 -msgid "No such user found" -msgstr "Данный пользователь не найден" - -#: forms.py:314 +#: forms.py:328 #, python-format msgid "Wait %s minutes after last login" msgstr "Подождите %s минут после последнего входа" @@ -168,17 +164,21 @@ msgstr "Управление тегами" msgid "Settings" msgstr "Настройки" -#: templates/boards/base.html:49 templates/boards/login.html:6 +#: templates/boards/base.html:50 +msgid "Logout" +msgstr "Выход" + +#: templates/boards/base.html:52 templates/boards/login.html:6 #: templates/boards/login.html.py:16 msgid "Login" msgstr "Вход" -#: templates/boards/base.html:52 +#: templates/boards/base.html:56 #, python-format msgid "Speed: %(ppd)s posts per day" msgstr "Скорость: %(ppd)s сообщений в день" -#: templates/boards/base.html:54 +#: templates/boards/base.html:58 msgid "Up" msgstr "Вверх" @@ -249,7 +249,7 @@ msgstr "Предыдущая страница" msgid "Skipped %(count)s replies. Open thread to see all replies." msgstr "Пропущено %(count)s ответов. Откройте тред, чтобы увидеть все ответы." -#: templates/boards/posting_general.html:121 templates/search/search.html:35 +#: templates/boards/posting_general.html:121 templates/search/search.html:33 msgid "Next page" msgstr "Следующая страница" @@ -278,35 +278,15 @@ msgstr "Синтаксис текста" msgid "Pages:" msgstr "Страницы: " -#: templates/boards/settings.html:14 -msgid "User:" -msgstr "Пользователь:" - -#: templates/boards/settings.html:16 +#: templates/boards/settings.html:15 msgid "You are moderator." msgstr "Вы модератор." -#: templates/boards/settings.html:19 -msgid "You are veteran." -msgstr "Вы ветеран." - -#: templates/boards/settings.html:22 -msgid "Posts:" -msgstr "Сообщений:" - -#: templates/boards/settings.html:23 -msgid "First access:" -msgstr "Первый доступ:" - -#: templates/boards/settings.html:25 -msgid "Last access:" -msgstr "Последний доступ: " - -#: templates/boards/settings.html:29 +#: templates/boards/settings.html:20 msgid "Hidden tags:" msgstr "Скрытые теги:" -#: templates/boards/settings.html:44 +#: templates/boards/settings.html:35 msgid "Save" msgstr "Сохранить" @@ -385,8 +365,4 @@ msgstr "Перед этими тегами нужна новая строка:" #: templates/boards/staticpages/help.html:18 msgid "Comment" -msgstr "Комментарий" - -#: templates/search/search.html:30 -msgid "No results found." -msgstr "Результаты не найдены." +msgstr "Комментарий" \ No newline at end of file diff --git a/boards/settings.py b/boards/settings.py --- a/boards/settings.py +++ b/boards/settings.py @@ -17,4 +17,7 @@ LAST_REPLIES_COUNT = 3 # Enable archiving threads instead of deletion when the thread limit is reached ARCHIVE_THREADS = True # Limit posting speed -LIMIT_POSTING_SPEED = False \ No newline at end of file +LIMIT_POSTING_SPEED = False + +# This password is used to add admin permissions to the user +MASTER_PASSWORD = u'password' \ No newline at end of file diff --git a/boards/templates/boards/base.html b/boards/templates/boards/base.html --- a/boards/templates/boards/base.html +++ b/boards/templates/boards/base.html @@ -46,6 +46,11 @@