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.
 
 
 
 
 
 

193 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
from django.utils.translation import ugettext as _
#models
from models import Service
from country.models import Country, City
from functions.form_check import translit_with_separator
from bitfield.forms import BitFormField
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=_(u'Цена'), required=False,
widget=forms.TextInput(attrs={'placeholder': _(u'Валюта')}))
currency_list = [('USD','USD'), ('EUR','EUR'), ('RUB','RUB')]
currency = forms.ChoiceField(choices=currency_list)
type = BitFormField(label='Тип', choices=[('expo', _(u'Выставки')), ('conference', _(u'Конференции'))])
template = forms.CharField(label='шаблон', required=True)
def __init__(self, *args, **kwargs):
self.instance = kwargs.pop('instance', Service())
super(ServiceForm, self).__init__(*args, **kwargs)
if self.instance.pk:
self.fields['template'].widget.attrs['readonly'] = True
# 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=_(u'Названия'), required=required)
self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required, widget=CKEditorWidget)
self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=required, widget=CKEditorWidget)
self.fields['advantage_%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'Description'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Keywords'), required=False, max_length=255,
widget=forms.TextInput(attrs={'style':'width: 550px'}))
def save(self):
data = self.cleaned_data
self.instance.url = translit_with_separator(data['url']).lower() if data['url']\
else translit_with_separator(data['name_ru'].lower())
self.instance.price = data['price']
self.instance.currency = data['currency']
self.instance.type = data['type']
if not self.instance.pk:
self.instance.template = data['template']
fill_with_signal(Service, self.instance, data)
self.instance.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_name_ru(self):
if not self.cleaned_data.get('url'):
self.cleaned_data['url'] = translit_with_separator(self.cleaned_data['name_ru'].lower())
self.clean_url()
return self.cleaned_data['name_ru']
def clean_url(self):
url = self.cleaned_data['url']
if url:
url = translit_with_separator(url.lower())
if url:
qs = Service.objects.filter(url=url)
if self.instance.pk:
qs = qs.exclude(pk=self.instance.pk)
if qs.exists():
raise forms.ValidationError(
_(u'Сервис с URL "{url}" уже существует'.format(url=url)),
code='invalid')
return url
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
from .models import LinkedService
from django.db.models.query import EmptyQuerySet
class LinkedServiceForm(forms.ModelForm):
type = forms.MultipleChoiceField(label=_(u'Тип'), choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple, required=False)
expositions = forms.CharField(label=_(u'Отображать в выставках'), widget=forms.HiddenInput, required=False)
conferences = forms.CharField(label=_(u'Отображать в конференциях'), widget=forms.HiddenInput, required=False)
exclude_expositions = forms.CharField(label=_(u'Исключить в выставках'), widget=forms.HiddenInput, required=False)
exclude_conferences = forms.CharField(label=_(u'Исключить в конференциях'), widget=forms.HiddenInput, required=False)
countries = forms.MultipleChoiceField(label=_(u'Страны'), choices=[(c.id, c.name) for c in list(set(Country.objects.language()))])
class Meta:
model = LinkedService
fields = [
'countries', 'exclude_countries', 'type', 'expositions',
'conferences', 'exclude_expositions', 'exclude_conferences',
]
help_text = {
'exclude_countries': _(u'При отсутствии стран этот флаг значит ВСЕ страны!')
}
def clean_countries(self):
countries = Country.objects.language().filter(id__in=self.cleaned_data['countries'])
return countries
def clean_expositions(self):
expositions = Exposition.objects.none()
if self.cleaned_data.get('expositions'):
expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['expositions'].split(','))))
return expositions
def clean_conferences(self):
conferences = Conference.objects.none()
if self.cleaned_data.get('conferences'):
conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences'].split(','))))
return conferences
def clean_exclude_expositions(self):
exclude_expositions = Exposition.objects.none()
if self.cleaned_data.get('exclude_expositions'):
exclude_expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['exclude_expositions'].split(','))))
return exclude_expositions
def clean_exclude_conferences(self):
exclude_conferences = Conference.objects.none()
if self.cleaned_data.get('exclude_conferences'):
exclude_conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['exclude_conferences'].split(','))))
return exclude_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