# -*- 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]) 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) countries = forms.MultipleChoiceField(choices=[(c.id, c.name) for c in list(set(Country.objects.language()))]) class Meta: model = LinkedService fields = ['countries', 'exclude_countries', 'expositions', '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 = EmptyQuerySet() 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 = EmptyQuerySet() if self.cleaned_data.get('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