You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

402 lines
16 KiB

# -*- coding: utf-8 -*-
import re
import json
import string
import ast
from random import choice
from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.forms.util import ErrorList
from django.utils.translation import ugettext as _, ugettext_lazy
from django.conf import settings
from models import User
from django.db.models import Q
from theme.models import Theme, Tag
from country.models import Area
from country.models import Country
from city.models import City
from company.models import Company
from functions.form_check import is_latin
def clean_relation_field(inst, field_name, model):
id = inst.cleaned_data[field_name]
if id:
try:
return model.objects.get(id=id)
except model.DoesNotExist:
return None
return None
class UserForm(forms.ModelForm):
# email = forms.EmailField(widget=forms.TextInput(attrs={'disabled' : True}), required=False)
country = forms.ChoiceField(label=_(u'Страна'), choices=[(item.id, item.name) for item in Country.objects.language().all()],
required=False)
city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput(), required=False)
company = forms.ChoiceField(label=_(u'Компания'),
choices=[(item.id, item.name) for item in Company.objects.language().all()],
required=False)
title = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
descriptions = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
keywords = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
phone = forms.CharField(widget=forms.TextInput(attrs={'style': 'width: 550px'}), required=False)
web_page = forms.URLField(required=False)
about = forms.CharField(widget=forms.Textarea(), required=False)
avatar = forms.ImageField(required=False)
# ---
skype = forms.CharField(required=False)
facebook = forms.URLField(required=False)
twitter = forms.URLField(required=False)
linkedin = forms.URLField(required=False)
vk = forms.URLField(required=False)
new_password = forms.CharField(required=False, min_length=6, max_length=60,
widget=forms.TextInput(attrs={'class': 'new_password'}))
class Meta:
model = User
exclude = ('organiser', 'username', 'email', 'last_login', 'password', 'is_admin', 'rating', 'is_superuser', 'is_staff'
'date_joined',
'date_registered', 'date_modified', 'is_active')
def save(self, force_insert=False, force_update=False, commit=True):
user = super(UserForm, self).save(commit=False)
data = self.cleaned_data
profile = user.profile
profile.country = data.get('country')
profile.city = data.get('city')
profile.title = data.get('title', '')
profile.descriptions = data.get('descriptions', '')
profile.keywords = data.get('keywords', '')
profile.phone = data.get('phone')
profile.web_page = data.get('web_page')
profile.about = data.get('about')
profile.skype = data.get('skype', '')
profile.facebook = data.get('facebook', '')
profile.twitter = data.get('twitter', '')
profile.linkedin = data.get('linkedin', '')
profile.vk = data.get('vk', '')
profile.avatar = data.get('avatar')
if data['new_password']:
new_pass = data['new_password']
user.set_password(new_pass)
user.email_user('Reset password', 'Your new password: "%s" ' % new_pass, settings.DEFAULT_FROM_EMAIL, )
if commit:
user.save()
profile.save()
return user
def clean_company(self):
return clean_relation_field(self, 'company', Company)
def clean_country(self):
return clean_relation_field(self, 'country', Country)
def clean_city(self):
return clean_relation_field(self, 'city', City)
def clean_phone(self):
"""
phone code checking
"""
cleaned_data = super(UserForm, self).clean()
phone = cleaned_data.get('phone')
if not phone:
return
deduct = ('-', '(', ')', '.', ' ')
for elem in deduct:
phone = phone.replace(elem, '')
if phone.isdigit():
return phone
else:
raise forms.ValidationError(_(u'Введите правильный код страны'))
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': ugettext_lazy(u'Введите старый пароль')}))
new_password = forms.CharField(label=_(u'New password'), required=True,
widget=forms.PasswordInput(render_value=False,
attrs={'placeholder': ugettext_lazy(u'Придумайте новый пароль')}))
new_password_confirm = forms.CharField(label=_(u'Confirm password'), required=True,
widget=forms.PasswordInput(render_value=False,
attrs={
'placeholder': ugettext_lazy(u'Повторите новый пароль')}))
def clean(self):
data = super(ChangePasswordForm, self).clean()
password1 = data.get('new_password')
password2 = data.get('new_password_confirm')
if not password1 or not password2:
return data
# self._errors['new_password'] = ErrorList([_(u'Different passwords!')])
# return data
if password1 and password2 and password1 != password2:
# check if passwords exists and equal
self._errors['new_password'] = ErrorList([_(u'Пароли не совпадают!')])
self._errors['new_password_confirm'] = ErrorList([_(u'Пароли не совпадают!')])
del data['new_password_confirm']
del data['new_password']
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'Пароль должен содержать цифры и буквы')])
self._errors['new_password_confirm'] = ErrorList([_(u'Пароль должен содержать цифры и буквы')])
del data['new_password']
del data['new_password_confirm']
return data
url_regex = re.compile('^\w*$')
class RegistrationCompleteForm(forms.ModelForm):
country = forms.ModelChoiceField(label=_(u'Страна'), queryset=Country.objects.all(),
widget=forms.Select(attrs={'class': 'select2'}))
city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput())
url = forms.CharField(widget=forms.TextInput(), required=False)
# code_country = forms.ChoiceField(label=_(u'код страны'), initial='70',
# choices=[(str(c.phone_code), '+' + str(c.phone_code)) for c in
# Country.objects.all() if c.phone_code is not None],
# widget=forms.Select(attrs={'class': 'select2'}))
# code_city = forms.CharField(label=_(u'код города'))
# phone = forms.CharField(label=_(u'ваш номер'))
class Meta:
model = User
fields = ('url',)
def save(self, force_insert=False, force_update=False, commit=True):
user = super(RegistrationCompleteForm, self).save(commit=False)
data = self.cleaned_data
# phone = data['code_country'] + data['code_city'] + data['phone']
# user.profile.phone = int(phone)
user.profile.country = data['country']
user.profile.city = data['city']
user.profile.save()
if commit:
user.save()
return user
def clean_city(self):
try:
return City.objects.get(id=self.cleaned_data['city'])
except City.DoesNotExist:
return None
def clean_url(self):
url = self.cleaned_data['url']
valid = url_regex.match(url)
if valid is None:
raise forms.ValidationError(_(u'url должен состоять только из латинских букв и цифр'))
if not url:
return self.make_url()
elif not self.check_url(url):
raise forms.ValidationError(_(u'Пользователь с таким url уже существует'))
return url
def check_url(self, url):
try:
User.objects.get(url=url)
except (User.DoesNotExist,):
pass
else:
return False
try:
User.objects.get(id=int(url))
except (ValueError, User.DoesNotExist,):
return True
else:
return False
def make_url(self, url=None):
if url is None:
url = 'id{pk}'.format(pk=self.instance.pk)
else:
url += choice(string.ascii_lowercase)
if not self.check_url(url):
return self.make_url(url)
return url
class SocialRegistrationCompleteForm(RegistrationCompleteForm):
email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': _(u'Email')}), required=True)
class Meta:
model = User
fields = ['email', 'url']
def save(self, force_insert=False, force_update=False, commit=True):
email = self.cleaned_data['email']
# print(email, 'blablabla')
if User.objects.filter(email__iexact=email).exists():
# pass to the view user, that had account before
user = User.objects.get(email__iexact=email)
# social = UserSocialAuth.objects.get(user=self.instance)
# social.user = user # that cause AuthAlreadyAssociated error!
else:
# create new user, with data from social auth
user = super(RegistrationCompleteForm, self).save(commit=False) # creating new user
user.username = email
data = self.cleaned_data
phone = data['code_country'] + data['code_city'] + data['phone']
user.profile.phone = int(phone)
user.profile.country = data['country']
user.profile.city = data['city']
user.profile.save()
# if commit:
user.save()
return user
class UserFilterForm(forms.Form):
model = User
search_req = forms.CharField(label=_(u'Введите e-mail, имя или фамилию для запроса'), required=False)
def filter(self):
"""
return filtered queryset
form must be cleaned before calling this method
"""
data = self.cleaned_data
search_req = data['search_req']
words = search_req.split()
model = self.model
qs = model.objects.all()
if len(words) > 1:
qs = qs.filter(Q(first_name__contains=words[0]) & Q(last_name__contains=words[1]))
elif words:
qs = qs.filter(
Q(email__contains=search_req) | Q(first_name__contains=search_req) | Q(last_name__contains=search_req))
return qs
class FeedFilterForm(forms.Form):
data_with_parents = None
filter = None
th = forms.MultipleChoiceField(label=_(u'Тематика'), choices=[(item.id, item.name) for item in Theme.active.expo_themes()],
required=False, widget=forms.CheckboxSelectMultiple())
tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
area = forms.MultipleChoiceField(label=_(u'Регион'),
choices=[(item.id, item.name) for item in Area.objects.language().all()],
required=False, widget=forms.CheckboxSelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in Country.objects.expo_countries()]
)
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.used.expo_cities()]
)
fr = forms.DateField(required=False,
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateFrom',
'placeholder': _(u'дд.мм.гггг')}))
to = forms.DateField(required=False,
widget=forms.DateInput(attrs={'class': 'date', 'id': 'dateTo',
'placeholder': _(u'дд.мм.гггг')}))
def __init__(self, *args, **kwargs):
user = kwargs.get('user')
if 'user' in kwargs: del kwargs['user']
super(FeedFilterForm, self).__init__(*args, **kwargs)
filter = user.eventfilter
self.filter = filter
self.data_with_parents = self.get_form_data(filter)
def get_form_data(self, filter):
if filter.area.exists():
areas = [{'name': 'area', 'id': item.id, 'parent': None, 'text': item.name} for item in filter.area.all()]
else:
areas = []
if filter.country.exists():
cos = []
for country in filter.country.all():
cos.append({'name': 'area', 'id': country.area_id, 'text': country.area.name, 'children': {
'id': country.id, 'name': 'co', 'text': country.name
}
})
else:
cos = []
if filter.city.exists():
cis = []
for city in filter.city.all():
cis.append({'name': 'area', 'id': city.country.area_id, 'text': city.country.area.name, 'children': {
'id': city.country_id, 'name': 'co', 'text': city.country.name, 'children': {
'name': 'ci', 'id': city.id, 'text': city.name
}
}
})
else:
cis = []
if filter.theme.exists():
ths = [{'name': 'th', 'id': item.id, 'parent': None, 'text': item.name} for item in filter.theme.all()]
else:
ths = []
if filter.tag.exists():
tgs = []
for tag in filter.tag.all():
tgs.append({'name': 'th', 'id': tag.theme_id, 'text': tag.theme.name, 'children': {
'id': tag.id, 'name': 'tg', 'text': tag.name
}
})
else:
tgs = []
finale_list = areas + cos + cis + ths + tgs
result = {'inputs': finale_list}
result = json.dumps(result)
return result
def filter_save(self):
theme = self.cleaned_data['th']
tag = self.cleaned_data['tg']
area = self.cleaned_data['area']
country = self.cleaned_data['co']
city = self.cleaned_data['ci']
filter_obj = self.filter
filter_obj.theme.clear()
filter_obj.theme.add(*Theme.objects.filter(id__in=theme))
filter_obj.tag.clear()
filter_obj.tag.add(*Tag.objects.filter(id__in=tag))
filter_obj.area.clear()
filter_obj.area.add(*Area.objects.filter(id__in=area))
filter_obj.country.clear()
filter_obj.country.add(*Country.objects.filter(id__in=country))
filter_obj.city.clear()
filter_obj.city.add(*City.objects.filter(id__in=city))
def clean_tg(self):
tg = self.cleaned_data.get('tg')
if tg:
res = ast.literal_eval(tg)
return res
return tg