diff --git a/accounts/forms.py b/accounts/forms.py index f6c9da49..678ce8ec 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- from django import forms from django.contrib.auth.forms import ReadOnlyPasswordHashField +from django.forms.util import ErrorList +from django.utils.translation import ugettext as _ from models import User from country.models import Country from city.models import City @@ -109,4 +111,46 @@ class UserForm(forms.ModelForm): socket.getaddrinfo(web_page, 80) return web_page except: - return forms.ValidationError('Введите правильный адрес страници') \ No newline at end of file + return forms.ValidationError('Введите правильный адрес страници') + +class ChangePasswordForm(forms.Form): + """ + Form to change password + """ + old_password = forms.CharField(label=_(u'Old password'), required=True, + widget=forms.PasswordInput(render_value=False, + attrs={'placeholder': _(u'Введите старый пароль')})) + new_password = forms.CharField(label=_(u'New password'), + widget=forms.PasswordInput(render_value=False, + attrs={'placeholder': _(u'Придумайте новый пароль')})) + new_password_confirm = forms.CharField(label=_(u'Confirm password'), + widget=forms.PasswordInput(render_value=False, + attrs={'placeholder': _(u'Повторите новый пароль')})) + + def clean(self): + data = self.cleaned_data + password1 = data.get('new_password') + password2 = data.get('new_password_confirm') + + if password1 and password2 and password1 != password2: + # check if passwords exists and equal + self._errors['password'] = ErrorList([_(u'Different passwords!')]) + self._errors['password_confirm'] = ErrorList([_(u'Different passwords!')]) + del data['password'] + del data['password_confirm'] + return data + if not password1.isdigit() and any(char.isdigit() for char in password1) and len(password1)>5: + # password must contain digits and letters and length > 5 + return data + else: + self._errors['new_password'] = ErrorList([_(u'Password must contain symbols and digits')]) + self._errors['new_password_confirm'] = ErrorList([_(u'Password must contain symbols and digits')]) + del data['password'] + del data['password_confirm'] + return data + +class EmailAnnouncementForm(forms.Form): + data = [(1, _(u'Получать приглашения, сообщения и другю корреспонденцию от пользователей Expomap')), + (2, _(u'Получать обзор событий')), + (3, _(u'Получать новости'))] + announcement = forms.MultipleChoiceField(choices=data, widget=forms.CheckboxSelectMultiple()) diff --git a/accounts/views.py b/accounts/views.py index 2a368102..666157a8 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,18 +1,28 @@ # -*- coding: utf-8 -*- from django.shortcuts import render_to_response from django.http import HttpResponseRedirect, HttpResponse +from django.template import RequestContext from django.core.context_processors import csrf from django.contrib.auth.decorators import login_required import random #models and forms from models import User -from forms import UserForm, UserCreationForm +from forms import UserForm, UserCreationForm, ChangePasswordForm, EmailAnnouncementForm #custom views from functions.custom_views import objects_list from hashlib import md5 +@login_required +def profile(request): + args = {'change_password_form': ChangePasswordForm(), + 'email_announcement_form': EmailAnnouncementForm()} + args.update(csrf(request)) + return render_to_response('profile.html', args, context_instance=RequestContext(request)) + + + def user_all(request): """ Return list of all users with pagination @@ -140,6 +150,32 @@ def reset_password_email(request): return HttpResponse('success') return HttpResponse('error') + +@login_required +def change_password(request): + """ + Change current user password if new password is valid + """ + success = {'success': False} + if request.POST: + form = ChangePasswordForm(request.POST) + if form.is_valid(): + user = request.user + if(user.check_password(form.cleaned_data.get('old_password'))): + user.set_password(form.cleaned_data.get('new_password')) + user.save() + success['success'] = True + success['message'] = _(u'Password has been changed') + return HttpResponse(json.dumps(success), content_type='application/json') + else: + errors = {'old_password': _(u'Invalid password')} + success.update(errors) + return HttpResponse(json.dumps(success), content_type='application/json') + else: + success.update(form.errors) + return HttpResponse(json.dumps(success), content_type='application/json') + else: + return HttpResponse(json.dumps(success), content_type='application/json') #-------------------------------------------------------------- ''' from django.views.decorators.debug import sensitive_post_parameters diff --git a/proj/urls.py b/proj/urls.py index 300c7391..09f89bb9 100644 --- a/proj/urls.py +++ b/proj/urls.py @@ -9,9 +9,11 @@ from django.contrib.auth.views import login, logout urlpatterns = patterns('', url(r'^$', 'proj.views.home', name='home'), - url(r'^login/', login), - url(r'^logout/', logout), - url(r'^/', 'proj.views.home', include('registration.backends.default.urls')), + url(r'^login/', 'registration.backends.default.views.LoginView'), + url(r'^logout/', 'registration.backends.default.views.LogoutView'), + url(r'^profile/', 'accounts.views.profile'), + + url(r'^admin/', include('proj.admin_urls')), url(r'^accounts/', include('registration.backends.default.urls')), ) diff --git a/proj/views.py b/proj/views.py index 9c1989ad..39fede23 100644 --- a/proj/views.py +++ b/proj/views.py @@ -20,12 +20,13 @@ from registration.forms import RegistrationFormUniqueEmail, LoginForm def home(request): - reg_form = RegistrationFormUniqueEmail() - login_form = LoginForm() - args = {'reg_form': reg_form, 'login_form': login_form} + #reg_form = RegistrationFormUniqueEmail() + #login_form = LoginForm() + #args = {'reg_form': reg_form, 'login_form': login_form} + args = {} args.update(csrf(request)) - return render_to_response('base_client.html', args, context_instance=RequestContext(request)) + return render_to_response('index.html', args, context_instance=RequestContext(request)) def test(request): return render_to_response('test.html') diff --git a/registration/backends/default/views.py b/registration/backends/default/views.py index 746c89bc..9adb9d06 100644 --- a/registration/backends/default/views.py +++ b/registration/backends/default/views.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from django.conf import settings from django.contrib.sites.models import RequestSite from django.contrib.sites.models import Site @@ -188,7 +189,7 @@ from django.contrib.auth.forms import AuthenticationForm def LoginAjaxView(request): if request.POST: - form = AuthenticationForm(request.POST) + form = AuthenticationForm(data=request.POST) if form.is_valid(): login(request, form.get_user()) return HttpResponseRedirect('/') @@ -199,3 +200,22 @@ def LoginAjaxView(request): form = LoginForm() return HttpResponseRedirect('/') + +def LogoutView(request): + logout(request) + return HttpResponseRedirect(request.META.get('HTTP_REFERER','/')) + +@sensitive_post_parameters('password') +def LoginView(request): + if request.POST: + + form = AuthenticationForm(data=request.POST) + + if form.is_valid(): + login(request, form.get_user()) + return HttpResponseRedirect(request.META.get('HTTP_REFERER','/')) + else: + return HttpResponse(request.POST.get('email')) + + else: + HttpResponseRedirect('/') diff --git a/templates/client/blank.html b/templates/client/blank.html new file mode 100644 index 00000000..c8fa7ba0 --- /dev/null +++ b/templates/client/blank.html @@ -0,0 +1,468 @@ +{% load static %} +{% load i18n %} + + + + + + + + + + {% block title %}{% trans 'Expomap — выставки, конференции, семинары' %}{% endblock %} + + + + + + + + + + + + + + + + {% block style %} + {% endblock %} + + + + +
+ {% block header %} +
+
+ + +
+ +
+ +
+ {% if user.is_authenticated %} + {% if user.organiser %} + + {% endif %} + {% endif %} + +
    +
  • рус
  • +
  • eng
  • +
+
+ +
+
    +
  • RSS
  • +
  • Facebook' %}
  • +
  • LinkedIn' %}
  • +
  • В контакте' %}
  • +
  • Twitter' %}
  • +
+ {% if user.is_authenticated %} + + {% else %} + + {% endif %} +
+ +
+ + + +
+
+
+ {% endblock %} + + {% block top %} + {% endblock %} + + {% block search %} + {% endblock %} + + {% block catalog %} + {% endblock %} + + {% block announces %} + {% endblock %} + + {% block partners %} + {% endblock %} + + {% block services %} + {% endblock %} + + {% block footer %} + + {% endblock %} +
+
+ {% if not user.is_authenticated %} + + + + {% endif %} + + + + + + {% block popup %} + {% endblock %} +
+ + + + + + + + + + + + + + + + {% block scripts %} + {% endblock %} + + + diff --git a/templates/client/index.html b/templates/client/index.html new file mode 100644 index 00000000..a0f46df7 --- /dev/null +++ b/templates/client/index.html @@ -0,0 +1,406 @@ +{% extends "blank.html" %} +{% load static %} +{% load i18n %} + +{% block top %} +
+
+ + + + + +
+
+{% endblock %} + +{% block search %} + +{% endblock %} + +{% block catalog %} +
+
+ + + + + +
+
+{% endblock %} + +{% block announces %} +
+
+ + + +
+ +
+ +
+
+{% endblock %} + +{% block partners %} +
+ + +
+
{% trans 'Наши партнеры:' %}
+ +
+ + +
+{% endblock %} + +{% block services %} +
+
+ + + + + +
+
+{% endblock %} diff --git a/templates/client/profile.html b/templates/client/profile.html new file mode 100644 index 00000000..2b8bf6fe --- /dev/null +++ b/templates/client/profile.html @@ -0,0 +1,800 @@ +{% extends 'blank.html' %} + +{% load i18n %} + +{% block catalog %} +
+
+ + + +
+ +
+ +
{% csrf_token %} +
{% trans 'поиск событий' %}
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+
+
{% trans 'Тематика:' %} Не важно
+
{% trans 'Место:' %} Не важно
+
{% trans 'Период:' %} Не важно
+
+
+
+
+ + + +
+

Настройки

+
+ +
+ +
+
{% trans 'смена пароля' %}
+
+
{% csrf_token %} +
+
+ {{ change_password_form.old_password }} +
+
+ +
+
+ {{ change_password_form.new_password }} +
+ +
+ {{ change_password_form.new_password_confirm }} +
+
+ +
+ +
+
+
+
+ +
+
{% trans 'настройка e-mail уведомлений' %}
+
+ +
{% csrf_token %} + {% for choice in email_announcement_form.announcement.field.choices %} +
+ +
+ {% endfor %} + +
+ +
+
+
+
+ +
+
{% trans 'социализация и sharing' %}
+
+
+ +
+
+
Подключено:
+ +
+
Artem Zubkevich
+ очистить +
+
+
@zubkevich
+ очистить +
+ +
+ +
+
Подключить:
+ +
+
    + +
  • +
  • +
  • +
  • +
  • +
+
+
+
+ +
Публиковать на ваши страницы:
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+ + + + +
+ +
+ +
+
+ +{% endblock %} + +{% block popup %} + +{% endblock %} \ No newline at end of file