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.
 
 
 
 
 
 

197 lines
9.4 KiB

# -*- coding: utf-8 -*-
from django.db.models import F
from django import forms
from django.conf import settings
from django.forms.util import ErrorList
from ckeditor.widgets import CKEditorWidget
from functions.translate import fill_with_signal
#models
from models import Service
from country.models import Country, City
from functions.form_check import translit_with_separator
class ServiceForm(forms.Form):
#europa = forms.ModelMultipleChoiceField(queryset=Country.objects.filter(region='europa'), required=False,
# widget=forms.CheckboxSelectMultiple())
#asia = forms.ModelMultipleChoiceField(queryset=Country.objects.filter(region='asia'), required=False,
# widget=forms.CheckboxSelectMultiple())
#america = forms.ModelMultipleChoiceField(queryset=Country.objects.filter(region='america'),required=False,
# widget=forms.CheckboxSelectMultiple())
#africa = forms.ModelMultipleChoiceField(queryset=Country.objects.filter(region='africa'),required=False,
# widget=forms.CheckboxSelectMultiple())
# city = forms.MultipleChoiceField(required=False, choices="")
url = forms.CharField(label='url', required=False)
price = forms.IntegerField(label='Цена', required=False,
widget=forms.TextInput(attrs={'placeholder':'Валюта'}))
#price = forms.CharField(label='Цена', required=False,
# widget=forms.TextInput(attrs={'placeholder':'Валюта'}))
currency_list = [('USD','USD'), ('EUR','EUR'), ('RUB','RUB')]
currency = forms.ChoiceField(choices=currency_list)
type = forms.MultipleChoiceField(label='Тип', choices=[('expo', 'expo'), ('conference', 'conference')])
service_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
super(ServiceForm, self).__init__(*args, **kwargs)
# creates translated form fields, 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):
# using 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=required, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget)
self.fields['advantage_%s' % code] = forms.CharField(label='Преимущества', required=False, widget=CKEditorWidget)
#meta data
self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['keywords_%s' % code] = forms.CharField(label='Description', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label='Keywords', required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self, id=None):
data = self.cleaned_data
#create new Service object or get exists
if not id:
service = Service()
else:
service = Service.objects.get(id=id)
service.url = translit_with_separator(data['url']).lower() if data['url']\
else translit_with_separator(data['name_ru'].lower())
#service.price = data['price']+' '+data['currency']#%s %s'%(data['price'], data['currency'])
service.price = data['price']
service.currency = data['currency']
#data['type']
fill_with_signal(Service, service, data)
#service.save()
"""
countries = [item.id for item in data['europa']]
countries += [item.id for item in data['asia']]
countries += [item.id for item in data['america']]
countries += [item.id for item in data['africa']]
cities = [item for item in data['city']]
#add service to checked countries
Country.objects.filter(id__in=countries).\
update(services = F('services').bitor(getattr(Country.services, str(service.id))) )
Country.objects.exclude(id__in=countries).\
update(services = F('services').bitand(~getattr(Country.services, str(service.id))))
#add service to checked cities
City.objects.filter(id__in=cities).\
update(services = F('services').bitor(getattr(City.services, str(service.id))) )
City.objects.exclude(id__in=cities).\
update(services = F('services').bitand(~getattr(City.services, str(service.id))))
"""
def clean(self):
id = self.cleaned_data.get('service_id')
url = self.cleaned_data.get('url')
service = Service.objects.filter(url=translit_with_separator(url))
if service and str(service[0].id) != id:
msg = 'Такой урл уже занят'
self._errors['url'] = ErrorList([msg])
del self.cleaned_data['url']
return self.cleaned_data
class ServiceDeleteForm(forms.ModelForm):
url = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Service
fields = ('url',)
from country.models import Area, Country
from exposition.models import Exposition
from conference.models import Conference
class ServiceControlForm(forms.Form):
event = [{'verbose': 'Выставки', 'model': Exposition, 'id': 1, 'service_bit': 'expo'},
{'verbose': 'Конференции', 'model': Conference, 'id': 2, 'service_bit': 'conference'}]
region = forms.ChoiceField(required=False, label='Регион',
choices=[('', '')]+[(item.id, item.name)
for item in list(Area.objects.all())])
country = forms.MultipleChoiceField(required=False, label='Страны',
choices=[('', '')]+[(item.id, item.name)
for item in list(Country.objects.all())])
country_all = forms.BooleanField(required=False)
expositions = forms.CharField(label=u'Выставки', widget=forms.HiddenInput(), required=False)
conferences = forms.CharField(label=u'Конференции', widget=forms.HiddenInput(), required=False)
def __init__(self, *args, **kwargs):
super(ServiceControlForm, self).__init__(*args, **kwargs)
self.fields['event_type'] = forms.MultipleChoiceField(required=False, label = 'Тип события',
widget=forms.CheckboxSelectMultiple(),
choices=[(item['service_bit'], item['verbose'])
for item in self.event])
class _ServiceForm(forms.Form):
type = forms.MultipleChoiceField(choices=[(x, x) for x in Service.type], widget=forms.CheckboxSelectMultiple)
countries = forms.MultipleChoiceField(choices=[(x.id,x.name) for x in Country.objects.language().all()])
all_counties = forms.BooleanField(widget=forms.CheckboxInput)
expos = forms.CharField(widget=forms.HiddenInput)
confs = forms.CharField(widget=forms.HiddenInput)
from .models import LinkedService
from django.db.models.query import EmptyQuerySet
class LinkedServiceForm(forms.ModelForm):
type = forms.MultipleChoiceField(choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple, required=False)
expositions = forms.CharField(widget=forms.HiddenInput,required=False)
conferences = forms.CharField(widget=forms.HiddenInput, required=False)
class Meta:
model = LinkedService
fields = ['countries', 'all_countries', 'expositions', 'conferences']
def clean_countries(self):
return list(set(self.cleaned_data['countries']))
def clean_expositions(self):
expositions = EmptyQuerySet()
if self.cleaned_data['expositions']:
expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['expositions'].split(','))))
return expositions
def clean_conferences(self):
conferences = EmptyQuerySet()
if self.cleaned_data['conferences']:
conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences'].split(','))))
return conferences
def save(self, commit=True):
obj = super(LinkedServiceForm, self).save(commit=True)
data = self.cleaned_data
# manage service type bit field
types = data['type']
obj.service.type = 0
for type in types:
obj.service.type = obj.service.type | getattr(Service.type, type)
obj.service.save()
return obj