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 %} + + + + + +
+ + + +
+
+ {% endblock %}
+ 



