# -*- coding: utf-8 -*- from django import forms from django.conf import settings from ckeditor.widgets import CKEditorWidget from django.core.exceptions import ValidationError from django.core.validators import URLValidator from django.utils.translation import ugettext as _ #models from models import Organiser from country.models import Country from city.models import City from theme.models import Theme, Tag from place_exposition.models import PlaceExposition from place_conference.models import PlaceConference #functions from functions.translate import fill_with_signal from functions.form_check import is_positive_integer, translit_with_separator from functions.files import check_tmp_files from functions.custom_fields import LocationWidget from functions.admin_forms import AdminFilterForm class OrganiserForm(forms.Form): """ Create Orginiser form In __init__ function creates dynamical fields save function saves data in Organiser object. If it doesnt exist create new object """ url = forms.CharField(label=_(u'url'), required=False) #user = forms.ModelChoiceField(label='Пользователь', queryset=User.objects.all(), empty_label='',required=False) country = forms.ChoiceField(label=_(u'Страна'), choices=[(item.id, item.name) for item in Country.objects.all()]) city = forms.CharField(label=_(u'Город'), widget=forms.HiddenInput()) theme = forms.MultipleChoiceField(label=_(u'Тематики'), choices=[(item.id, item.name) for item in Theme.objects.language().all()]) place_exposition = forms.MultipleChoiceField(label=_(u'Места проведения выставок'), required=False, choices=[(item.id, item.name) for item in PlaceExposition.objects.language().all()]) place_conference = forms.MultipleChoiceField(label=_(u'Места проведения конференций'), required=False, choices=[(item.id, item.name) for item in PlaceConference.objects.all()]) #creates select input with empty choices cause it will be filled with ajax tag = forms.CharField(label=_(u'Теги'), widget=forms.HiddenInput(), required=False) logo = forms.ImageField(label=_(u'Logo'), 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=_(u'Факс'), required=False, widget=forms.TextInput(attrs={'placeholder': _(u'Введите факс')})) web_page = forms.CharField(label=_(u'Веб-сайт'), required=False, widget=forms.TextInput(attrs={'placeholder': _(u'Введите адрес сайта')})) email = forms.EmailField(label=_(u'Email'), required=False, widget=forms.TextInput(attrs={'placeholder': _(u'Введите email')})) events_number = forms.CharField(label=_(u'Количество мероприятий в год'), required=False, widget=forms.TextInput(attrs={'placeholder': _(u'Количество')})) foundation = forms.CharField(label=_(u'Год основания'), required=False, widget=forms.TextInput(attrs={'placeholder': _(u'Год основания')})) def __init__(self, *args, **kwargs): """ create dynamical translated fields fields """ super(OrganiserForm, 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['specialization_%s' % code] = forms.CharField(label=_(u'Специализация'), required=False) self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=False, widget=CKEditorWidget) self.fields['representation_%s' % code] = forms.CharField(label=_(u'Представительства'), required=False, max_length=255, widget=forms.TextInput(attrs={'style':'width: 550px'})) 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, obj=None): """ change organisers object N/A add new Organiser object usage: form.save(obj) - if change organiser form.save() - if add organiser """ data = self.cleaned_data #create new Organiser object or get exists if not obj: organiser = Organiser() else: organiser = obj organiser.theme.clear() organiser.tag.clear() organiser.place_conference.clear() organiser.place_exposition.clear() #simple fields organiser.url = translit_with_separator(data['url']).lower() organiser.address = data['address'] organiser.phone = data['phone'] organiser.fax = data['fax'] organiser.web_page = data['web_page'] organiser.email = data['email'] organiser.foundation = data['foundation'] organiser.staff_number = data['staff_number'] organiser.events_number = data['events_number'] if data.get('country'): organiser.country = Country.objects.get(id=data['country'])#.id cause select uses queryset if data.get('city'): organiser.city = City.objects.get(id=data['city']) fill_with_signal(Organiser, organiser, data) #fill manytomany fields organiser.theme.add(*Theme.objects.filter(id__in=data['theme'])) organiser.tag.add(*Tag.objects.filter(id__in=data['tag'])) organiser.place_exposition.add(*PlaceExposition.objects.filter(id__in=data['place_exposition'])) organiser.place_conference.add(*PlaceConference.objects.filter(id__in=data['place_conference'])) organiser.save() #bound organiser to user """ if data.get('user'): user = User.objects.safe_get(id=data['user'].id) if user: user.organiser = organiser user.save() """ def clean_url(self): cleaned_data = super(OrganiserForm, self).clean() url = cleaned_data.get('url').strip() return url def clean_tag(self): tags = self.cleaned_data.get('tag') if tags: res = [] for id in tags.split(','): try: res.append(int(id)) except: continue return res else: return [] def clean_foundation(self): """ checking foundation """ cleaned_data = super(OrganiserForm, self).clean() foundation = cleaned_data.get('foundation').strip() return is_positive_integer(foundation) def clean_events_number(self): """ checking events_number """ cleaned_data = super(OrganiserForm, self).clean() events_number = cleaned_data.get('events_number').strip() return is_positive_integer(events_number) def clean_staff_number(self): """ checking staff_number """ cleaned_data = super(OrganiserForm, self).clean() staff_number = cleaned_data.get('staff_number').strip() return is_positive_integer(staff_number) def clean_web_page(self): cleaned_data = super(OrganiserForm, self).clean() web_page = cleaned_data.get('web_page') if not web_page: return '' validate = URLValidator() try: validate(web_page) except(forms.ValidationError),e: raise forms.ValidationError(e.messages[0]) return web_page def clean_phone(self): """ phone checking """ cleaned_data = super(OrganiserForm, 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(OrganiserForm, 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 OrganiserFilterForm(AdminFilterForm): model = Organiser