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.
 
 
 
 
 
 

300 lines
13 KiB

# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from django.utils.translation import ugettext as _
from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
from django.core.validators import validate_email, URLValidator
#models
from models import Company
from country.models import Country
from theme.models import Theme
from city.models import City
#functions
from functions.translate import fill_with_signal
from functions.form_check import is_positive_integer, translit_with_separator, is_latin
from functions.files import check_tmp_files
from functions.custom_fields import LocationWidget
from functions.admin_forms import AdminFilterForm
class CompanyForm(forms.Form):
"""
Create Company form
In __init__ function creates dynamical fields
save function saves data in Company object. If it doesnt exist create new object
"""
url = forms.CharField(label=_(u'URL'), widget=forms.TextInput(attrs={'placeholder': _(u'Введите URL')}))
country = forms.ModelChoiceField(label=_(u'Страна'), queryset=Country.objects.all(), empty_label=None)
theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all())
#creates select input with empty choices cause it will be filled with ajax
city = forms.ChoiceField(label=_(u'Город'), choices=[('','')])
tag = forms.MultipleChoiceField(label=_(u'Теги'), required=False)
staff_number = forms.CharField(label=_(u'Количество сотрудников'), required=False,
widget=forms.TextInput(attrs={'placeholder': _(u'Количество сотрудников')}))
#uses locationwidget
address = forms.CharField(label=_(u'Адрес'), required=False, widget=LocationWidget)
phone = forms.CharField(label=_(u'Телефон'), required=False,
widget=forms.TextInput(attrs={'placeholder': _(u'Введите телефон')}))
fax = forms.CharField(label='Факс', required=False,
widget=forms.TextInput(attrs={'placeholder': _(u'Введите факс')}))
web_page = forms.CharField(label=_(u'Веб-сайт'), required=False,
widget=forms.TextInput(attrs={'placeholder': _(u'Введите адрес сайта')}))
email = forms.CharField(label=_(u'Email'), required=False,
widget=forms.TextInput(attrs={'placeholder': _(u'Введите email')}))
social = forms.CharField(label=_(u'Социальные страници'), required=False)
foundation = forms.CharField(label=_(u'Год основания'), required=False,
widget=forms.TextInput(attrs={'placeholder': _(u'Год основания')}))
#field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput())
#
company_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(CompanyForm, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['name_%s' % code] = forms.CharField(label=_(u'Название'), required=required)
self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'),
required=False, widget=CKEditorWidget)
self.fields['specialization_%s' % code] = forms.CharField(label=_(u'Специализация'), required=False)
self.fields['address_inf_%s' % code] = forms.CharField(label=_(u'Доп инф по адресу'),
required=False, widget=CKEditorWidget)
#meta data
self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Дескрипшен'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Кейвордс'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None):
"""
change company object with id = id
N/A add new Company object
usage: form.save(obj) - if change company
form.save() - if add company
"""
data = self.cleaned_data
#create new Company object or get exists
if not id:
company = Company()
else:
company = Company.objects.get(id=id)
company.theme.clear()
company.tag.clear()
#simple fields
company.url = translit_with_separator(data['url'].strip()).lower()
company.staff_number = data['staff_number']
company.address = data['address']
company.phone = data['phone']
company.fax = data['fax']
company.web_page = data['web_page']
company.email = data['email']
company.foundation = data['foundation']
company.social = data['social']
if data.get('country'):
company.country = Country.objects.get(id=data['country'].id)
if data.get('city'):
company.city = City.objects.get(id=data['city'])
# fill translated fields and save object
fill_with_signal(Company, company, data)
#fill manytomany fields
for item in data['theme']:
company.theme.add(item.id)#.id cause select uses queryset
for item in data['tag']:
company.tag.add(item)
# uses because in the next loop data will be overwritten
company.save()
#save files
check_tmp_files(company, data['key'])
def clean(self):
id = self.cleaned_data.get('company_id')
url = self.cleaned_data.get('url')
company = Company.objects.filter(url=translit_with_separator(url))
if company and str(company[0].id) != id:
msg = _(u'Такой урл уже занят')
self._errors['url'] = ErrorList([msg])
del self.cleaned_data['url']
return self.cleaned_data
def clean_foundation(self):
"""
checking foundation
"""
cleaned_data = super(CompanyForm, self).clean()
foundation = cleaned_data.get('foundation').strip()
return is_positive_integer(foundation)
def clean_web_page(self):
cleaned_data = super(CompanyForm, self).clean()
web_page = cleaned_data.get('web_page')
if not web_page:
return ''
validate = URLValidator()
try:
validate(web_page)
except(ValidationError),e:
raise ValidationError(e.messages[0])
return web_page
def clean_phone(self):
"""
phone checking
"""
cleaned_data = super(CompanyForm, 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 ValidationError(_(u'Введите правильный телефон'))
def clean_fax(self):
"""
fax checking
"""
cleaned_data = super(CompanyForm, self).clean()
fax = cleaned_data.get('fax')
if not fax:
return
deduct = ('-','(',')','.',' ')
for elem in deduct:
fax = fax.replace(elem, '')
if fax.isdigit():
return fax
else:
raise ValidationError(_(u'Введите правильный факс'))
class CompanyDeleteForm(forms.ModelForm):
id = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Company
fields = ('id',)
class CompanyFormClient(forms.Form):
# translated fields
name = forms.CharField(label=_(u'название'))
specialization = forms.CharField(label=_(u'краткое описание компании'), required=False)
address_inf = forms.CharField(label=_(u'адрес компании'), required=False)
description = forms.CharField(label=_(u'подробное описание компании'), required=False)
#
logo = forms.ImageField(required=False)
country = forms.ModelChoiceField(label=_(u'Страна'), queryset=Country.objects.all(), empty_label=None)
city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput())
theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all())
tag = forms.CharField(label=_(u'Теги'), widget=forms.HiddenInput(), required=False)
phone = forms.CharField(label=_(u'Телефон'), required=False)
fax = forms.CharField(label=_(u'Факс'), required=False)
web_page = forms.URLField(label=_(u'Веб-сайт'), required=False)
email = forms.EmailField(label=_(u'Email'), required=False)
foundation = forms.IntegerField(label=_(u'Год основания'), required=False)
staff_number = forms.IntegerField(label=_(u'Количество сотрудников'), required=False)
vk = forms.URLField(label=_(u'в контакте'), required=False)
twitter = forms.URLField(label=_(u'Twitter'), required=False)
facebook = forms.URLField(label=_(u'Facebook'), required=False)
linkedin = forms.URLField(label=_(u'Linkedin'), required=False)
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(CompanyFormClient, self).__init__(*args, **kwargs)
#creates translated forms example: name_ru, name_en
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs
if len(settings.LANGUAGES) in range(10):
for lid, (code, name) in enumerate(settings.LANGUAGES):
# uses enumerate for detect iteration number
# first iteration is a default lang so it required fields
required = True if lid == 0 else False
self.fields['name_%s' % code] = forms.CharField(label=_(u'название'), required=required)
self.fields['description_%s' % code] = forms.CharField(label=_(u'подробное описание компании'),
required=False)
self.fields['specialization_%s' % code] = forms.CharField(label=_(u'краткое описание компании'),
required=False)
self.fields['address_inf_%s' % code] = forms.CharField(label=_(u'адрес компании'),
required=False)
class CreateCompanyForm(forms.Form):
action = '/company/create-company/'
name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': _(u'Введите название компании')}))
url = forms.CharField(widget=forms.TextInput(attrs={'placeholder': _(u'Введите url(только латиница)')}))
theme = forms.ModelMultipleChoiceField(queryset=Theme.objects.all())
def save(self, user):
data = self.cleaned_data
company = Company(url=data['url'], creator=user)
lang = 'ru'
company.translate(lang)
company.name = data['name']
company.save()
themes = [theme.id for theme in data['theme']]
company.theme.add(*Theme.objects.filter(id__in=themes))
user.company = company
user.save()
return company
def clean_url(self):
url = self.cleaned_data['url']
url = url.replace('http://expomap.ru/members/', '')
if not is_latin(url):
raise forms.ValidationError(_(u'url должен состоять только из латинских букв'))
company = Company.objects.filter(url=translit_with_separator(url))
if company:
msg = _(u'Такой урл уже занят')
raise ValidationError(msg)
return translit_with_separator(url)
class CompanyFilterForm(AdminFilterForm):
model = Company