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.
 
 
 
 
 
 

263 lines
11 KiB

# -*- coding: utf-8 -*-
from django import forms
from django.conf import settings
from ckeditor.widgets import CKEditorWidget
from django.forms.util import ErrorList
#models
from models import Conference, TimeTable, CURRENCY
from country.models import Country
from city.models import City
from theme.models import Theme
from organiser.models import Organiser
from accounts.models import User
from company.models import Company
from service.models import Service
from place_conference.models import PlaceConference
#functions
from functions.translate import populate_all, fill_trans_fields_all
from functions.form_check import is_positive_integer
from functions.files import check_tmp_files
from functions.form_check import translit_with_separator
class ConferenceCreateForm(forms.Form):
"""
Create Conference form for creating conference
__init__ uses for dynamic creates fields
save function saves data in Conference object. If it doesnt exist create new object
"""
currencies = [(item, item) for item in CURRENCY]
data_begin = forms.DateField(label='Дата начала')
data_end = forms.DateField(label='Дата окночания')
country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None)
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all())
place = forms.ModelChoiceField(label='Место проведения', queryset=PlaceConference.objects.all(),
empty_label='', required=False)
#creates select input with empty choices cause it will be filled with ajax
city = forms.ChoiceField(label='Город', choices=[('','')])
tag = forms.MultipleChoiceField(label='Теги', required=False)
web_page = forms.CharField(label='Веб страница', required=False)
link = forms.CharField(label='Линк на регистрацию', required=False)
foundation_year = forms.CharField(label='Год основания', required=False)
#
currency = forms.ChoiceField(label='Валюта', choices=currencies, required=False)
tax = forms.BooleanField(label='Налог включен', initial=True, required=False)
min_price = forms.CharField(label='Минимальная цена', required=False)
max_price = forms.CharField(label='Максимальная цена', required=False)
#field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput())
#
conference_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
"""
super(ConferenceCreateForm, 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='Название', required=required)
self.fields['main_title_%s' % code] = forms.CharField(label='Краткое описание',
required=False, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label='Описание',
required=False, widget=CKEditorWidget)
self.fields['time_%s' % code] = forms.CharField(label='Время работы',
required=False, widget=CKEditorWidget)
self.fields['main_themes_%s' % code] = forms.CharField(label='Основные темы',
required=False, widget=CKEditorWidget)
self.fields['discount_%s' % code] = forms.CharField(label='Условия и скидки',
required=False, widget=CKEditorWidget)
#meta data
self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=required, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=required, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=required, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
#!service has bitfield. uncomment when country data will be filled
#services = [(item.id, item.name) for item in Service.objects.all()]
#self.fields['service'] = forms.ChoiceField(label='Услуги', choices=services, required=False)
def save(self, id=None):
"""
changes Conference model object with id = id
N/A add new Conference model object
usage: form.save(obj) - if change conference
form.save() - if add conference
"""
data = self.cleaned_data
#create new conference object or get exists
if not id:
conference = Conference()
else:
conference = Conference.objects.get(id=id)
conference.theme.clear()
conference.tag.clear()
#simple fields
conference.url = translit_with_separator(data['name_ru']).lower()
conference.data_begin = data['data_begin']
conference.data_end = data['data_end']
conference.link = data['link']
conference.web_page= data['web_page']
conference.foundation_year = data['foundation_year']
#
conference.currency = data['currency']
conference.tax = data['tax']
conference.min_price = data['min_price']
conference.max_price = data['max_price']
if data.get('country'):
conference.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset
if data.get('city'):
conference.city = City.objects.get(id=data['city'])
if data.get('place'):
conference.place = PlaceConference.objects.get(id=data['place'].id)#.id cause select uses queryset
# uses because in the next loop data will be overwritten
conference.save()
#fill manytomany fields
for item in data['theme']:
conference.theme.add(item.id)#.id cause select uses queryset
for item in data['tag']:
conference.tag.add(item)
# uses because in the next loop data will be overwritten
conference.save()
#will be saved populated fields
zero_fields = {}
#fills all translated fields with data
#if saves new object, will fill city object. otherwise existing object of City model
fill_trans_fields_all(Conference, conference, data, id, zero_fields)
#autopopulate
#populate empty fields and fields which was already populated
conference_id = getattr(conference, 'id')
populate_all(Conference, data, conference_id, zero_fields)
#save files
check_tmp_files(conference, data['key'])
def clean(self):
id = self.cleaned_data.get('conference_id')
name_ru = self.cleaned_data.get('name_ru')
conference = Conference.objects.filter(url=translit_with_separator(name_ru))
if conference and str(conference[0].id) != id:
msg = 'Конференция с таким названием уже существует'
self._errors['name_ru'] = ErrorList([msg])
del self.cleaned_data['name_ru']
return self.cleaned_data
def clean_web_page(self):
"""
checking web_page
"""
cleaned_data = super(ConferenceCreateForm, self).clean()
web_page = cleaned_data.get('web_page')
if not web_page:
return web_page
import socket
try:
socket.getaddrinfo(web_page, 80)
return web_page
except:
raise forms.ValidationError('Введите правильный адрес страници')
def clean_link(self):
"""
checking link
"""
cleaned_data = super(ConferenceCreateForm, self).clean()
link = cleaned_data.get('link')
if not link:
return link
import socket
try:
socket.getaddrinfo(link, 80)
return link
except:
raise forms.ValidationError('Введите правильный адрес страници')
def clean_foundation_year(self):
"""
checking foundation_year
"""
cleaned_data = super(ConferenceCreateForm, self).clean()
foundation_year = cleaned_data.get('foundation_year').strip()
return is_positive_integer(foundation_year)
def clean_min_price(self):
"""
checking min_price
"""
cleaned_data = super(ConferenceCreateForm, self).clean()
min_price = cleaned_data.get('min_price').strip()
return is_positive_integer(min_price)
def clean_max_price(self):
"""
checking max_price
"""
cleaned_data = super(ConferenceCreateForm, self).clean()
max_price = cleaned_data.get('max_price').strip()
return is_positive_integer(max_price)
class ConferenceChangeForm(ConferenceCreateForm):
"""
add some fields to ConferenceCreateForm
"""
organiser = forms.ModelMultipleChoiceField(label='Организаторы', queryset=Organiser.objects.all(), required=False)
company = forms.ModelMultipleChoiceField(label='Компании', queryset=Company.objects.all(), required=False)
users = forms.ModelMultipleChoiceField(label='Пользователи', queryset=User.objects.all(), required=False)
class TimeTableForm(forms.Form):
"""
Create TimeTable form
day field must save automatically
"""
begin = forms.DateTimeField(label='Время начала')
end = forms.DateTimeField(label='Время окончания')
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
and fills select fields
"""
super(TimeTableForm, 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='Название', required=required)
def save(self, id=None):
pass