From 1a9c219592dc0d4288869b4733ee1cb0fc4f2446 Mon Sep 17 00:00:00 2001 From: Bachurin Sergey Date: Sat, 16 Aug 2014 11:20:22 +0300 Subject: [PATCH] captcha to login and callback form --- project/callback/forms.py | 30 ++++++++++++------ project/myauth/forms.py | 7 +++- project/myauth/views.py | 17 ++++++---- project/settings.py | 2 ++ project/static/img/refresh.png | Bin 0 -> 357 bytes project/static/js/commons.js | 13 ++++++++ project/static/js/dialogs.js | 4 +++ project/templates/callback/callback_btn.html | 2 +- project/templates/callback/callback_form.html | 2 +- project/templates/docs/invoice/as_pdf.html | 18 +++++------ project/templates/myauth/login_form.html | 2 +- project/urls.py | 1 + 12 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 project/static/img/refresh.png diff --git a/project/callback/forms.py b/project/callback/forms.py index e10254b..3e02291 100644 --- a/project/callback/forms.py +++ b/project/callback/forms.py @@ -1,11 +1,15 @@ # -*- coding: utf-8 -*- from django import forms +from captcha.fields import CaptchaField + from . import models class ReqAvailForm(forms.ModelForm): """Форма заказа товара.""" + captcha = CaptchaField(label=u'Введите код с картинки') + class Meta: model = models.ReqAvail fields = ('name', 'phone', 'message') @@ -18,14 +22,22 @@ class ReqAvailForm(forms.ModelForm): self.fields['name'].widget.attrs['width'] = u'Ваше имя, отчество' def clean(self): - super(ReqAvailForm, self).clean() - name = self.cleaned_data.get('name', '').strip() - phone = self.cleaned_data.get('phone', '').strip() - - if not name: - raise forms.ValidationError(u'Укажите Ваше имя.') - - if not phone: - raise forms.ValidationError(u'Укажите Ваш телефон.') + cleaned_data = super(ReqAvailForm, self).clean() + if (cleaned_data.get('name') and cleaned_data.get('message') and cleaned_data.get('phone')) and not(cleaned_data.get('captcha')): + raise forms.ValidationError(u"Проверьте правильность кода проверки") + elif not (cleaned_data.get('name') and cleaned_data.get('message') and cleaned_data.get('phone') and cleaned_data.get('captcha')): + if self.errors.get('phone') and self.data.get('phone'): + raise forms.ValidationError(u"Проверьте правильность ввода контактов") + else: + raise forms.ValidationError(u"Заполните все поля") + return cleaned_data + #name = self.cleaned_data.get('name', '').strip() + #phone = self.cleaned_data.get('phone', '').strip() + + #if not name: + # raise forms.ValidationError(u'Укажите Ваше имя.') + + #if not phone: + # raise forms.ValidationError(u'Укажите Ваш телефон.') return self.cleaned_data diff --git a/project/myauth/forms.py b/project/myauth/forms.py index 6ce7989..6599fc6 100644 --- a/project/myauth/forms.py +++ b/project/myauth/forms.py @@ -2,10 +2,12 @@ from django import forms from django.conf import settings from django.contrib.auth import authenticate +from django.contrib.auth.forms import UserCreationForm, UserChangeForm + +from captcha.fields import CaptchaField from project.commons.forms import set_field_error from project.customer import consts as customer_consts -from django.contrib.auth.forms import UserCreationForm, UserChangeForm from models import DokUser @@ -182,6 +184,9 @@ class LoginForm(forms.Form): return self.user_cache +class CaptchedLoginForm(LoginForm): + captcha = CaptchaField(label=u'Введите код с картинки') + class CustomUserCreationForm(UserCreationForm): """ diff --git a/project/myauth/views.py b/project/myauth/views.py index 2e94dec..dfd98c5 100644 --- a/project/myauth/views.py +++ b/project/myauth/views.py @@ -209,11 +209,16 @@ def change_email(request): @csrf_protect def login(request): """Вход в систему.""" - form_class = forms.LoginForm + if request.session.get('login_count', None): + request.session['login_count'] += 1 + else: + form_class = forms.LoginForm + request.session['login_count'] = 0 + if request.session['login_count'] > 0: + form_class = forms.CaptchedLoginForm form_prefix = 'login' template_name = 'myauth/login.html' success_url = 'customer_index' - if request.method == 'POST': form = form_class(data=request.POST, prefix=form_prefix) if form.is_valid(): @@ -221,14 +226,12 @@ def login(request): old_session_key = request.user.profile.user_session_key request.user.profile.user_session_key = request.session.session_key request.user.profile.save() - #try: - # session = session.objects.get(session_key=old_session_key) - # session.delete() - #except: - # pass + del request.session['login_count'] if request.user.profile.check_name_not_filled(): success_url = 'customer_profile_edit' return redirect(success_url) + else: + request.session['login_count'] += 1 else: form = form_class(prefix=form_prefix) diff --git a/project/settings.py b/project/settings.py index 15cb498..31aed89 100644 --- a/project/settings.py +++ b/project/settings.py @@ -272,6 +272,8 @@ CELERYBEAT_SCHEDULE = { }, } +CAPTCHA_OUTPUT_FORMAT = u"%(hidden_field)s%(text_field)s %(image)s" + try: from project.local_settings import * except ImportError: diff --git a/project/static/img/refresh.png b/project/static/img/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..d51062811238326ab1da2da16d1ac0c41bf65e62 GIT binary patch literal 357 zcmV-r0h<1aP)#GVZJffEof z24Yck31+B7ECX>s2#DDkketZ}#QH$|7l>C8X~;Wt7nA{U0ucX#2Hsf)GJr8O7OnxY z0SWqSfH)UfAO(mWNH9PLh%W;14PB+<5FM^#M^+l1&H;a35pTwN^KyngJuhB zWKE1%3=)UN7RZp#K>Q7eIf0lLh;Kl{;wiEQfB*vk`Qay3V!S)a00000NkvXXu0mjf DR?2#e literal 0 HcmV?d00001 diff --git a/project/static/js/commons.js b/project/static/js/commons.js index 2cd5571..68e2522 100644 --- a/project/static/js/commons.js +++ b/project/static/js/commons.js @@ -1,5 +1,18 @@ $(document).ready(function() { $('.has-datepicker').datepicker({dateFormat: 'dd.mm.yy'}); + + $('.captcha_refresh').click(function(e) { + e.preventDefault(); + var $form = $(this).parents('form'); + var url = location.protocol + "//" + window.location.hostname + ":" + + location.port + "/captcha/refresh/"; + + $.getJSON(url, {}, function(json) { + $form.find('input[name="captcha_1"]').val(''); + $form.find('input[name="captcha_0"]').val(json.key); + $form.find('img.captcha').attr('src', json.image_url); + }); + }); }); function fetch_data(url, async) { diff --git a/project/static/js/dialogs.js b/project/static/js/dialogs.js index 0845795..e0bcd24 100644 --- a/project/static/js/dialogs.js +++ b/project/static/js/dialogs.js @@ -61,6 +61,10 @@ $(document).ready(function() { else { // process form errors if (data.form_errors) { + var captcha = $(form).find('img.captcha'); + if (captcha) { + $(form).find('a.captcha_refresh').click(); + } var errors = $('.errors-layout', form); var html = '
    '; for (var err in data.form_errors) { diff --git a/project/templates/callback/callback_btn.html b/project/templates/callback/callback_btn.html index c0c55e2..ccf4479 100644 --- a/project/templates/callback/callback_btn.html +++ b/project/templates/callback/callback_btn.html @@ -1 +1 @@ -Заказать обратный звонок +Задать вопрос diff --git a/project/templates/callback/callback_form.html b/project/templates/callback/callback_form.html index 1d745f4..174362a 100644 --- a/project/templates/callback/callback_form.html +++ b/project/templates/callback/callback_form.html @@ -1,4 +1,4 @@ -
    + {% csrf_token %}
    Оставьте свои контакты и мы перезвоним вам, ответим на все ваши вопросы
    diff --git a/project/templates/docs/invoice/as_pdf.html b/project/templates/docs/invoice/as_pdf.html index 134176b..231caf7 100644 --- a/project/templates/docs/invoice/as_pdf.html +++ b/project/templates/docs/invoice/as_pdf.html @@ -166,7 +166,7 @@ {{ profile.get_boss_title }} - {% if obj.add_sign_and_stamp and profile.boss_sign %} {# TODO передавать флаг из вьюхи #} + {% if profile.boss_sign %} {# TODO передавать флаг из вьюхи #} {# подпись руководителя #} {% endif %} @@ -182,7 +182,7 @@ Главный бухгалтер - {% if obj.add_sign_and_stamp and profile.glavbuh_sign %} {# TODO передавать флаг из вьюхи #} + {% if profile.glavbuh_sign %} {# TODO передавать флаг из вьюхи #} {# подпись главбуха #} {% else %}
      @@ -197,15 +197,13 @@ Главный бухгалтер - {% if obj.add_sign_and_stamp %} {# TODO передавать флаг из вьюхи #} - {% if profile.glavbuh_sign %} - {# подпись главбуха #} + {% if profile.glavbuh_sign %} + {# подпись главбуха #} + {% else %} + {% if profile.boss_sign %} + {# или подпись руководителя #} {% else %} - {% if profile.boss_sign %} - {# или подпись руководителя #} - {% else %} -
      - {% endif %} +
      {% endif %} {% endif %} diff --git a/project/templates/myauth/login_form.html b/project/templates/myauth/login_form.html index b9572be..d36b582 100644 --- a/project/templates/myauth/login_form.html +++ b/project/templates/myauth/login_form.html @@ -10,7 +10,7 @@ {{ hidden }} {% endfor %} - {% for field in form %} + {% for field in form.visible_fields %}
    {% if field.label %} {{ field.label_tag }} diff --git a/project/urls.py b/project/urls.py index ab68330..df91be0 100644 --- a/project/urls.py +++ b/project/urls.py @@ -28,6 +28,7 @@ urlpatterns = patterns('', url(r'^my/callback/', include('project.callback.urls')), url(r'^user/', include('project.myauth.urls')), + url(r'^captcha/', include('captcha.urls')), url(r'^', include('cms.urls')), )