# -*- coding: utf-8 -*- from django import forms from django.conf import settings from ckeditor.widgets import CKEditorWidget from django.core.exceptions import ValidationError from functions.translate import fill_trans_fields, populate, ZERO_LANGUAGE, populate_all, fill_trans_fields_all #models from models import Review, Service from country.models import Country, City from functions.form_check import translit_with_separator class ServiceForm(forms.Form): countries = [(item.id, item.name) for item in Country.objects.all()] cities = [(item.id, item.name) for item in City.objects.all()] country = forms.MultipleChoiceField(choices=countries) city = forms.MultipleChoiceField(choices=cities) 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) 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 Tag object or get exists if not id: service = Service() else: service = Service.objects.get(id=id) #flag = 0 #for item in data['types']: # flag = flag | getattr(Theme.types, item) #generates bitfield countries = reduce(lambda x,y: x|y, (getattr(Service.country, item) for item in data['country'])) service.country= countries cities = reduce(lambda x,y: x|y, (getattr(Service.city, item) for item in data['city'])) service.city = cities service.url = translit_with_separator(data['name_ru']) service.price = data['price']+' '+data['currency']#%s %s'%(data['price'], data['currency']) # uses because in the next loop data will be overwritten service.save() #populate fields with zero language zero_fields = {} fill_trans_fields_all(Service, service, data, id, zero_fields) #autopopulate #populate empty fields and fields which was already populated service_id = getattr(service, 'id') populate_all(Service, data, service_id, zero_fields) def clean_name_ru(self): """ check name which must be unique because it generate slug field """ cleaned_data = super(ServiceForm, self).clean() name_ru = cleaned_data.get('name_ru') try: Service.objects.get(url=translit_with_separator(name_ru)) except: return name_ru raise ValidationError('Сервис с таким названием уже существует') class ReviewForm(forms.ModelForm): rating = forms.ChoiceField(label='Оценка', choices=[(n, n) for n in range(1,6)], widget=forms.RadioSelect()) comment = forms.CharField(label='Комментарий', widget=CKEditorWidget) class Meta: model = Review """ class ReviewForm(forms.Form): web_page = forms.CharField(label='Сайт', required=False) rating = forms.ChoiceField(label=('Оценка'), choices=[(n,n) for n in range(1,6)],widget=forms.RadioSelect()) def __init__(self, *args, **kwargs): super(ReviewForm, 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['company_%s' % code] = forms.CharField(label='Компания', required=required) self.fields['contact_%s' % code] = forms.CharField(label='Контакт', required=required) self.fields['comment_%s' % code] = forms.CharField(label='Коментарий', required=required, widget=CKEditorWidget) services = [(item.id, item.name) for item in Service.objects.all()] self.fields['service'] = forms.ChoiceField(label='Сервис', choices=services) def save(self, id=None): data = self.cleaned_data if not id: review = Review() else: review = Review.objects.get(id=id) review.rating = data['rating'] review.web_page = data['web_page'] if data.get('service'): review.service = Service.objects.get(id=data['service']) review.save() #populate fields with zero language zero_fields = {} fill_trans_fields_all(Review, review, data, id, zero_fields) #autopopulate #populate empty fields and fields which was already populated review_id = getattr(review, 'id') populate_all(Review, data, review_id, zero_fields) """