# -*- coding: utf-8 -*- import json import ast 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 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 UserCreationForm(forms.ModelForm): password1 = forms.CharField(label=_(u'Пароль'), widget=forms.PasswordInput(render_value=False)) password2 = forms.CharField(label=_(u'Повторите пароль'), widget=forms.PasswordInput(render_value=False)) class Meta: model = User fields = ('email', 'first_name', 'last_name') def clean_email(self): """ checking if user already exist """ email = self.cleaned_data.get('email') try: User.objects.get(email=email) except User.DoesNotExist: return email raise forms.ValidationError(_(u'Пользователь с таким email уже существует')) def clean_password2(self): password1 = self.cleaned_data.get('password1') password2 = self.cleaned_data.get('password2') if password1 and password2 and password1 != password2: raise forms.ValidationError(_(u'Пароли не совпадают')) return password2 def save(self, commit=True): user = super(UserCreationForm, self).save(commit=False) user.set_password(self.cleaned_data['password2']) if commit: user.save() return user 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': _(u'Введите старый пароль')})) new_password = forms.CharField(label=_(u'New password'), required=True, widget=forms.PasswordInput(render_value=False, attrs={'placeholder': _(u'Придумайте новый пароль')})) new_password_confirm = forms.CharField(label=_(u'Confirm password'), required=True, widget=forms.PasswordInput(render_value=False, attrs={ 'placeholder': _(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 class EmailAnnouncementForm(forms.Form): data = [(1, _(u'Получать приглашения, сообщения и другую корреспонденцию от пользователей Expomap')), (2, _(u'Получать обзор событий')), (3, _(u'Получать новости'))] announcement = forms.MultipleChoiceField(choices=data, widget=forms.CheckboxSelectMultiple()) 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(attrs={'placeholder': _(u'url(обязательно)')})) # 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'] if not is_latin(url): raise forms.ValidationError(_(u'url должен состоять только из латинских букв')) try: User.objects.get(url=url) raise forms.ValidationError(_(u'Пользователь с таким url уже существует')) except User.DoesNotExist: 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'] if User.objects.filter(email=email).exists(): # pass to the view user, that had account before user = User.objects.get(email=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