# -*- 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',)