url checking in all forms

fix some bugs and do some stuff what Evgenia write
starting develop deleting objects - make ptotect deleting for bound objects
remotes/origin/1203
Nazar Kotjuk 12 years ago
parent fce8b3176f
commit 174b57ee59
  1. 9
      accounts/models.py
  2. 31
      article/forms.py
  3. 3
      article/models.py
  4. 4
      article/views.py
  5. 31
      city/forms.py
  6. 9
      city/models.py
  7. 4
      city/views.py
  8. 7
      company/models.py
  9. 30
      conference/forms.py
  10. 6
      conference/models.py
  11. 4
      conference/views.py
  12. 27
      country/forms.py
  13. 11
      country/models.py
  14. 1
      country/urls.py
  15. 34
      country/views.py
  16. 27
      exposition/forms.py
  17. 6
      exposition/models.py
  18. 2
      exposition/views.py
  19. 5
      functions/form_check.py
  20. 3
      news/models.py
  21. 6
      organiser/models.py
  22. 24
      place_conference/forms.py
  23. 4
      place_conference/models.py
  24. 2
      place_conference/views.py
  25. 28
      place_exposition/forms.py
  26. 4
      place_exposition/models.py
  27. 3
      place_exposition/views.py
  28. 7
      review/models.py
  29. 28
      seminar/forms.py
  30. 4
      seminar/models.py
  31. 2
      seminar/views.py
  32. 14
      service/admin.py
  33. 115
      service/forms.py
  34. 21
      service/models.py
  35. 7
      service/urls.py
  36. 60
      service/views.py
  37. 4
      templates/admin/article/article_add.html
  38. 2
      templates/admin/city/city_add.html
  39. 2
      templates/admin/conference/conference_add.html
  40. 4
      templates/admin/country/country_add.html
  41. 3
      templates/admin/country/country_all.html
  42. 2
      templates/admin/exposition/exposition_add.html
  43. 2
      templates/admin/place_conference/place_conference_add.html
  44. 2
      templates/admin/place_exposition/place_exposition_add.html
  45. 2
      templates/admin/seminar/seminar_add.html
  46. 2
      templates/admin/service/checkbox_option.html
  47. 2
      templates/admin/theme/theme_all.html
  48. 2
      templates/admin/webinar/webinar_add.html
  49. 3
      templates/base.html
  50. 2
      theme/models.py
  51. 27
      webinar/forms.py
  52. 3
      webinar/urls.py
  53. 63
      webinar/views.py

@ -6,7 +6,6 @@ from django.core.mail import send_mail
from django.utils import timezone from django.utils import timezone
from django.db.models.signals import post_save from django.db.models.signals import post_save
#custom functions #custom functions
from functions.custom_fields import LocationField
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
""" """
from django.contrib.auth.hashers import check_password from django.contrib.auth.hashers import check_password
@ -84,9 +83,11 @@ class User(AbstractBaseUser, PermissionsMixin):
date_registered = models.DateTimeField(blank=True, null=True)# date_registered = models.DateTimeField(blank=True, null=True)#
date_modified = models.DateTimeField(auto_now=True) date_modified = models.DateTimeField(auto_now=True)
#relations #relations
country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, related_name='users') country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True,
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True) on_delete=models.PROTECT, related_name='users')
company = models.ForeignKey('company.Company', blank=True, null=True) city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True,
on_delete=models.PROTECT)
company = models.ForeignKey('company.Company', blank=True, null=True, on_delete=models.PROTECT)
#other user information #other user information
phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True) phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True)
position = models.CharField(verbose_name='Должность', max_length=255, blank=True) position = models.CharField(verbose_name='Должность', max_length=255, blank=True)

@ -3,7 +3,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.template.defaultfilters import slugify from django.forms.util import ErrorList
#functions #functions
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import populate_all, fill_trans_fields_all
from functions.files import check_tmp_files from functions.files import check_tmp_files
@ -27,6 +27,8 @@ class ArticleForm(forms.Form):
#creates select input with empty choices cause it will be filled with ajax #creates select input with empty choices cause it will be filled with ajax
tag = forms.MultipleChoiceField(label='Теги', required=False) tag = forms.MultipleChoiceField(label='Теги', required=False)
article_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
create dynamical translated fields fields create dynamical translated fields fields
@ -69,7 +71,7 @@ class ArticleForm(forms.Form):
article.author = data['author'] article.author = data['author']
#create slug field from russian language #create slug field from russian language
article.url = translit_with_separator(data['main_title_ru']) article.url = translit_with_separator(data['main_title_ru']).lower()
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
article.save() article.save()
@ -94,17 +96,14 @@ class ArticleForm(forms.Form):
check_tmp_files(article, data['key']) check_tmp_files(article, data['key'])
def clean_main_title_ru(self): def clean(self):
""" id = self.cleaned_data.get('article_id')
check main title which must be unique because it generate slug field main_title_ru = self.cleaned_data.get('main_title_ru')
"""
cleaned_data = super(ArticleForm, self).clean() article = Article.objects.filter(url=translit_with_separator(main_title_ru))
main_title_ru = cleaned_data.get('main_title_ru') if article and str(article[0].id) != id:
try: msg = 'Статья с таким названием уже существует'
article = Article.objects.get(url=translit_with_separator(main_title_ru)) self._errors['main_title_ru'] = ErrorList([msg])
if (article.url == translit_with_separator(main_title_ru)): del self.cleaned_data['main_title_ru']
return main_title_ru
except: return self.cleaned_data
return main_title_ru
raise ValidationError('Статья с таким названием уже существует')

@ -13,7 +13,8 @@ class Article(TranslatableModel):
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
theme = models.ManyToManyField('theme.Theme') theme = models.ManyToManyField('theme.Theme')
tag = models.ManyToManyField('theme.Tag', related_name='tags',blank=True, null=True) tag = models.ManyToManyField('theme.Tag', related_name='tags',blank=True, null=True)
author = models.CharField(max_length=150, blank=True) organiser = models.ForeignKey('organiser.Organiser', verbose_name='Автор',
on_delete=models.PROTECT, related_name='articles')
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(

@ -42,6 +42,7 @@ def article_change(request, url):
#check if article_id exists else redirect to the list of cities #check if article_id exists else redirect to the list of cities
article = Article.objects.get(url=url) article = Article.objects.get(url=url)
file_form = FileModelForm(initial={'model': 'article.Article'}) file_form = FileModelForm(initial={'model': 'article.Article'})
article_id = getattr(article, 'id')
except: except:
return HttpResponseRedirect('/article/all') return HttpResponseRedirect('/article/all')
@ -59,6 +60,9 @@ def article_change(request, url):
data['author'] = article.author data['author'] = article.author
data['theme'] = [item.id for item in article.theme.all()] data['theme'] = [item.id for item in article.theme.all()]
data['tag'] = [item.id for item in article.tag.all()] data['tag'] = [item.id for item in article.tag.all()]
#hidden field
data['article_id'] = article_id
#data from translated fields #data from translated fields
for code, name in settings.LANGUAGES: for code, name in settings.LANGUAGES:
obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields

@ -3,6 +3,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
#models #models
from models import City from models import City
from country.models import Country from country.models import Country
@ -31,6 +32,8 @@ class CityForm(forms.Form):
country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None) country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None)
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
city_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
@ -79,7 +82,6 @@ class CityForm(forms.Form):
else: else:
city = City.objects.get(id=id) city = City.objects.get(id=id)
city.url = translit_with_separator(data['name_ru'])
city.phone_code = data['phone_code'] city.phone_code = data['phone_code']
city.population = data['population'] city.population = data['population']
if data.get('code_IATA'): if data.get('code_IATA'):
@ -88,8 +90,10 @@ class CityForm(forms.Form):
city.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset city.country = Country.objects.get(id=data['country'].id)#.id cause select uses queryset
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
city.url = '%s-'%translit_with_separator(city.country.name) + translit_with_separator(data['name_ru']).lower()
city.save() city.save()
#will be saved populated fields #will be saved populated fields
zero_fields = {} zero_fields = {}
#fills all translated fields with data #fills all translated fields with data
@ -103,21 +107,20 @@ class CityForm(forms.Form):
#save files #save files
check_tmp_files(city, data['key']) check_tmp_files(city, data['key'])
def clean_name_ru(self):
"""
check name which must be unique because it generate slug field
"""
cleaned_data = super(CityForm, self).clean()
name_ru = cleaned_data.get('name_ru')
try:
city = City.objects.get(url=translit_with_separator(name_ru))
if(city.url == translit_with_separator(name_ru)):
return name_ru
except:
return name_ru
raise ValidationError('Город с таким названием уже существует') def clean(self):
id = self.cleaned_data.get('city_id')
name_ru = self.cleaned_data.get('name_ru')
c = City.objects.get(pk=id)
city = City.objects.filter(
url='%s-%s'%(translit_with_separator(c.country.name), translit_with_separator(name_ru))
)
if city and str(city[0].id) != id:
msg = 'Город с таким названием уже существует'
self._errors['name_ru'] = ErrorList([msg])
del self.cleaned_data['name_ru']
return self.cleaned_data
def clean_phone_code(self): def clean_phone_code(self):
""" """

@ -14,7 +14,12 @@ class City(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class Uses hvad.TranslatableModel which is child of django.db.models class
""" """
flags = []
try:
flags = [str(item.id) for item in Service.objects.all()]
except:
flags = []
""" """
ids = [item.id for item in Service.objects.all() ] ids = [item.id for item in Service.objects.all() ]
if len(ids): if len(ids):
@ -27,7 +32,7 @@ class City(TranslatableModel):
services = BitField(flags=flags) services = BitField(flags=flags)
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
country = models.ForeignKey('country.Country', null=True) country = models.ForeignKey('country.Country', null=True, on_delete=models.PROTECT)
population = models.PositiveIntegerField(blank=True, null=True) population = models.PositiveIntegerField(blank=True, null=True)
phone_code = models.PositiveIntegerField(blank=True, null=True) phone_code = models.PositiveIntegerField(blank=True, null=True)
code_IATA = models.ForeignKey(Iata, null=True) code_IATA = models.ForeignKey(Iata, null=True)

@ -51,8 +51,8 @@ def city_change(request, url):
return HttpResponseRedirect('/city/all') return HttpResponseRedirect('/city/all')
else: else:
#fill form with data from database #fill form with data from database
data = {'population' : c.population, data = {'population' : c.population, 'phone_code' : c.phone_code,
'phone_code' : c.phone_code} 'city_id' : city_id}
if c.country: if c.country:
data['country'] = c.country.id data['country'] = c.country.id

@ -17,9 +17,10 @@ class Company(TranslatableModel):
theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль', theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль',
blank=True, null=True, related_name='companies') blank=True, null=True, related_name='companies')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True, related_name='companies') tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True, related_name='companies')
country = models.ForeignKey('country.Country', verbose_name='Страна', country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True,
blank=True, null=True, related_name='companies') on_delete=models.PROTECT, related_name='companies')
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True, related_name='companies') city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True,
on_delete=models.PROTECT, related_name='companies')
#address. uses LocationField. saves data in json format #address. uses LocationField. saves data in json format
address = LocationField(verbose_name='Адрес', blank=True) address = LocationField(verbose_name='Адрес', blank=True)

@ -2,7 +2,7 @@
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.forms.util import ErrorList
#models #models
from models import Conference, TimeTable, CURRENCY from models import Conference, TimeTable, CURRENCY
from country.models import Country from country.models import Country
@ -52,6 +52,9 @@ class ConferenceCreateForm(forms.Form):
max_price = forms.CharField(label='Максимальная цена', required=False) max_price = forms.CharField(label='Максимальная цена', required=False)
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
conference_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
@ -109,7 +112,7 @@ class ConferenceCreateForm(forms.Form):
conference.tag.clear() conference.tag.clear()
#simple fields #simple fields
conference.url = translit_with_separator(data['name_ru']) conference.url = translit_with_separator(data['name_ru']).lower()
conference.data_begin = data['data_begin'] conference.data_begin = data['data_begin']
conference.data_end = data['data_end'] conference.data_end = data['data_end']
conference.link = data['link'] conference.link = data['link']
@ -152,22 +155,17 @@ class ConferenceCreateForm(forms.Form):
#save files #save files
check_tmp_files(conference, data['key']) check_tmp_files(conference, data['key'])
def clean(self):
id = self.cleaned_data.get('conference_id')
name_ru = self.cleaned_data.get('name_ru')
def clean_name_ru(self): conference = Conference.objects.filter(url=translit_with_separator(name_ru))
""" if conference and str(conference[0].id) != id:
check name which must be unique because it generate slug field msg = 'Конференция с таким названием уже существует'
""" self._errors['name_ru'] = ErrorList([msg])
cleaned_data = super(ConferenceCreateForm, self).clean() del self.cleaned_data['name_ru']
name_ru = cleaned_data.get('name_ru')
try:
conference = Conference.objects.get(url=translit_with_separator(name_ru))
if (conference.url == translit_with_separator(name_ru)):
return name_ru
except:
return name_ru
raise ValidationError('Конференция с таким названием уже существует')
return self.cleaned_data
def clean_web_page(self): def clean_web_page(self):
""" """

@ -18,10 +18,10 @@ class Conference(TranslatableModel):
data_begin = models.DateField(verbose_name='Дата начала') data_begin = models.DateField(verbose_name='Дата начала')
data_end = models.DateField(verbose_name='Дата окончания') data_end = models.DateField(verbose_name='Дата окончания')
#relations #relations
country = models.ForeignKey('country.Country', verbose_name='Страна') country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT)
city = models.ForeignKey('city.City', verbose_name='Город') city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT)
place = models.ForeignKey('place_conference.PlaceConference', verbose_name='Место проведения', place = models.ForeignKey('place_conference.PlaceConference', verbose_name='Место проведения',
blank=True, null=True, related_name='conference_place') blank=True, null=True, on_delete=models.PROTECT, related_name='conference_place')
theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики', theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики',
related_name='conference_themes') related_name='conference_themes')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', tag = models.ManyToManyField('theme.Tag', verbose_name='Теги',

@ -93,8 +93,8 @@ def conference_change(request, url):
#fill form with data from database #fill form with data from database
data = {'web_page':conference.web_page, 'foundation_year': conference.foundation_year, data = {'web_page':conference.web_page, 'foundation_year': conference.foundation_year,
'data_begin':conference.data_begin, 'data_end':conference.data_end, 'currency':conference.currency, 'data_begin':conference.data_begin, 'data_end':conference.data_end, 'currency':conference.currency,
'tax':conference.tax, 'min_price':conference.min_price, 'tax':conference.tax, 'min_price':conference.min_price, 'max_price':conference.max_price,
'max_price':conference.max_price, 'link':conference.link} 'link':conference.link, 'conference_id':conference.id}
if conference.country: if conference.country:
data['country'] = conference.country.id data['country'] = conference.country.id

@ -3,6 +3,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
#models #models
from models import Country, City from models import Country, City
from directories.models import Language, Currency, Iata from directories.models import Language, Currency, Iata
@ -57,6 +58,8 @@ class CountryForm(forms.Form):
#services = forms.MultipleChoiceField(label='Сервисы', required=False, choices=); #services = forms.MultipleChoiceField(label='Сервисы', required=False, choices=);
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
country_id = forms.CharField(required=False, widget=forms.HiddenInput)
def __init__(self, *args, **kwargs ): def __init__(self, *args, **kwargs ):
@ -124,7 +127,7 @@ class CountryForm(forms.Form):
country.language.clear() country.language.clear()
country.currency.clear() country.currency.clear()
country.url = translit_with_separator(data['name_ru']) country.url = translit_with_separator(data['name_ru']).lower()
country.population = data['population'] country.population = data['population']
country.teritory = data['teritory'] country.teritory = data['teritory']
country.timezone = data['timezone'] country.timezone = data['timezone']
@ -163,22 +166,18 @@ class CountryForm(forms.Form):
#save files #save files
check_tmp_files(country, data['key']) check_tmp_files(country, data['key'])
def clean_name_ru(self):
"""
check name which must be unique because it generate slug field
"""
cleaned_data = super(CountryForm, self).clean()
name_ru = cleaned_data.get('name_ru')
try:
country = Country.objects.get(url=translit_with_separator(name_ru))
if (country.url == translit_with_separator(name_ru)):
return name_ru
except: def clean(self):
return name_ru id = self.cleaned_data.get('country_id')
name_ru = self.cleaned_data.get('name_ru')
raise ValidationError('Страна с таким названием уже существует') country = Country.objects.filter(url=translit_with_separator(name_ru))
if country and str(country[0].id) != id:
msg = 'Страна с таким названием уже существует'
self._errors['name_ru'] = ErrorList([msg])
del self.cleaned_data['name_ru']
return self.cleaned_data
def clean_phone_code(self): def clean_phone_code(self):
""" """

@ -17,20 +17,21 @@ class Country(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class Uses hvad.TranslatableModel which is child of django.db.models class
""" """
flags = [] try:
flags = [str(item.id) for item in Service.objects.all()]
ids = [str(item.id) for item in Service.objects.all() ] except:
flags = []
#max = sorted(ids)[-1] #max = sorted(ids)[-1]
#for i in range(max): #for i in range(max):
# flags.append(str(i)) # flags.append(str(i))
services = BitField(flags=ids) services = BitField(flags=flags)
REGIONS =('europa', 'asia', 'america', 'africa') REGIONS =('europa', 'asia', 'america', 'africa')
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
capital = models.ForeignKey(City,blank=True, null=True, related_name='capital') capital = models.ForeignKey(City,blank=True, null=True, on_delete=models.PROTECT, related_name='capital')
population = models.PositiveIntegerField(blank=True, null=True) population = models.PositiveIntegerField(blank=True, null=True)
teritory = models.PositiveIntegerField(blank=True, null=True) teritory = models.PositiveIntegerField(blank=True, null=True)
timezone = models.FloatField(blank=True, null=True) timezone = models.FloatField(blank=True, null=True)

@ -3,6 +3,7 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('country.views', urlpatterns = patterns('country.views',
url(r'^add.*/$', 'country_add'), url(r'^add.*/$', 'country_add'),
url(r'^delete/(.*)/$', 'country_delete'),
url(r'^change/(.*)/$', 'country_change'), url(r'^change/(.*)/$', 'country_change'),
url(r'^all/$', 'country_all'), url(r'^all/$', 'country_all'),
) )

@ -28,6 +28,38 @@ def country_add(request):
""" """
return add_object_with_file(request, CountryForm, 'country_add.html', '/country/all/') return add_object_with_file(request, CountryForm, 'country_add.html', '/country/all/')
def country_delete(request, url):
try:
c = Country.objects.get(url=url)
country_id = getattr(c, 'id')
except:
return HttpResponseRedirect('/country/all')
c.delete()
return objects_list(request, Country, 'country_all.html')
def objects_list(request, Model, template, item_per_page=10):
"""
Return template with all objects of model Model
Model - objects Model
item_per_page - how many objects view in the one page
"""
list = Model.objects.all()
paginator = Paginator(list, item_per_page)
page = request.GET.get('page')
try:
objects = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
objects = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
objects = paginator.page(paginator._num_pages)
return render_to_response(template, {'objects': objects})
@login_required @login_required
def country_change(request, url): def country_change(request, url):
@ -58,7 +90,7 @@ def country_change(request, url):
else: else:
#fill form with data from database #fill form with data from database
data = {'population' : c.population, 'teritory' : c.teritory, #data from NOT translated fields data = {'population' : c.population, 'teritory' : c.teritory, #data from NOT translated fields
'timezone' : c.timezone, 'region' : c.region, 'timezone' : c.timezone, 'region' : c.region, 'country_id' : country_id,
'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery} 'phone_code' : c.phone_code, 'time_delivery' : c.time_delivery}
if c.capital: if c.capital:

@ -3,6 +3,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
#models #models
from models import Exposition, TimeTable, AUDIENCE1, CURRENCY from models import Exposition, TimeTable, AUDIENCE1, CURRENCY
from country.models import Country from country.models import Country
@ -63,6 +64,8 @@ class ExpositionCreateForm(forms.Form):
registration_payment = forms.CharField(label='Регистрационны взнос', required=False) registration_payment = forms.CharField(label='Регистрационны взнос', required=False)
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
exposition_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -115,7 +118,7 @@ class ExpositionCreateForm(forms.Form):
exposition.tag.clear() exposition.tag.clear()
#simple fields #simple fields
exposition.url = translit_with_separator(data['name_ru']) exposition.url = translit_with_separator(data['name_ru']).lower()
exposition.data_begin = data['data_begin'] exposition.data_begin = data['data_begin']
exposition.data_end = data['data_end'] exposition.data_end = data['data_end']
exposition.periodic = data['periodic'] exposition.periodic = data['periodic']
@ -165,21 +168,17 @@ class ExpositionCreateForm(forms.Form):
#save files #save files
check_tmp_files(exposition, data['key']) check_tmp_files(exposition, data['key'])
def clean_name_ru(self): def clean(self):
""" id = self.cleaned_data.get('exposition_id')
check name which must be unique because it generate slug field name_ru = self.cleaned_data.get('name_ru')
"""
cleaned_data = super(ExpositionCreateForm, self).clean()
name_ru = cleaned_data.get('name_ru')
try:
exposition = Exposition.objects.get(url=translit_with_separator(name_ru))
if (exposition.url == translit_with_separator(name_ru)):
return name_ru
except:
return name_ru
raise ValidationError('Выставка с таким названием уже существует') exposition = Exposition.objects.filter(url=translit_with_separator(name_ru))
if exposition and str(exposition[0].id) != id:
msg = 'Выставка с таким названием уже существует'
self._errors['name_ru'] = ErrorList([msg])
del self.cleaned_data['name_ru']
return self.cleaned_data
def clean_web_page(self): def clean_web_page(self):
""" """

@ -21,10 +21,10 @@ class Exposition(TranslatableModel):
data_begin = models.DateField(verbose_name='Дата начала') data_begin = models.DateField(verbose_name='Дата начала')
data_end = models.DateField(verbose_name='Дата окончания') data_end = models.DateField(verbose_name='Дата окончания')
#relations #relations
country = models.ForeignKey('country.Country', verbose_name='Страна') country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT)
city = models.ForeignKey('city.City', verbose_name='Город') city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT)
place = models.ForeignKey('place_exposition.PlaceExposition', verbose_name='Место проведения', place = models.ForeignKey('place_exposition.PlaceExposition', verbose_name='Место проведения',
blank=True, null=True, related_name='exposition_place') blank=True, null=True, on_delete=models.PROTECT, related_name='exposition_place')
theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики', theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики',
related_name='exposition_themes') related_name='exposition_themes')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', tag = models.ManyToManyField('theme.Tag', verbose_name='Теги',

@ -97,7 +97,7 @@ def exposition_change(request, url):
'max_closed_area':exposition.max_closed_area, 'min_closed_equipped_area':exposition.min_closed_equipped_area, 'max_closed_area':exposition.max_closed_area, 'min_closed_equipped_area':exposition.min_closed_equipped_area,
'max_closed_equipped_area':exposition.max_closed_equipped_area, 'max_closed_equipped_area':exposition.max_closed_equipped_area,
'min_open_area':exposition.min_open_area, 'max_open_area':exposition.max_open_area, 'min_open_area':exposition.min_open_area, 'max_open_area':exposition.max_open_area,
'registration_payment':exposition.registration_payment} 'registration_payment':exposition.registration_payment, 'exposition_id':exposition.id}
if exposition.country: if exposition.country:
data['country'] = exposition.country.id data['country'] = exposition.country.id

@ -19,10 +19,9 @@ def translit_with_separator(string, separator='-'):
usage: translit_with_separator('введите, слово', '_') return 'vvedite_slovo' usage: translit_with_separator('введите, слово', '_') return 'vvedite_slovo'
string must be unicode
""" """
#make string unicode
string = u'%s'%string
#make string translit #make string translit
st = pytils.translit.translify(string) st = pytils.translit.translify(string)
#replace "bad" symbols for '-'symbol #replace "bad" symbols for '-'symbol

@ -18,7 +18,8 @@ class News(TranslatableModel):
type = EnumField(values=TYPES) type = EnumField(values=TYPES)
theme = models.ManyToManyField('theme.Theme', verbose_name='Тема') theme = models.ManyToManyField('theme.Theme', verbose_name='Тема')
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True) tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True)
organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True) organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True,
on_delete=models.PROTECT)
paid = models.BooleanField(default=0) paid = models.BooleanField(default=0)
translations = TranslatedFields( translations = TranslatedFields(

@ -20,8 +20,10 @@ class Organiser(TranslatableModel):
url = models.SlugField(verbose_name='URL', blank=True) url = models.SlugField(verbose_name='URL', blank=True)
#relations #relations
country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True) country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True,
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True) on_delete=models.PROTECT)
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True,
on_delete=models.PROTECT,)
theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль', blank=True, null=True) theme = models.ManyToManyField('theme.Theme', verbose_name='Отрасль', blank=True, null=True)
tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True) tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True)
#address. uses LocationField. saves data in json format #address. uses LocationField. saves data in json format

@ -4,6 +4,7 @@ from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import validate_email, URLValidator from django.core.validators import validate_email, URLValidator
from django.forms.util import ErrorList
#models #models
from models import PlaceConference, Hall, CONFERENCE_TYPE from models import PlaceConference, Hall, CONFERENCE_TYPE
from country.models import Country from country.models import Country
@ -64,6 +65,8 @@ class ConferenceForm(forms.Form):
hotel = forms.BooleanField(label='Гостиница', required=False) hotel = forms.BooleanField(label='Гостиница', required=False)
# #
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
place_conference_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
@ -112,7 +115,7 @@ class ConferenceForm(forms.Form):
place_conference = PlaceConference.objects.get(id=id) place_conference = PlaceConference.objects.get(id=id)
#simple fields #simple fields
place_conference.url = translit_with_separator(data['name_ru']) place_conference.url = translit_with_separator(data['name_ru']).lower()
place_conference.type = data['type'] place_conference.type = data['type']
place_conference.address = data['address'] place_conference.address = data['address']
place_conference.phone = data['phone'] place_conference.phone = data['phone']
@ -153,20 +156,17 @@ class ConferenceForm(forms.Form):
return PlaceConference.objects.get(id=place_conference_id) return PlaceConference.objects.get(id=place_conference_id)
def clean_name_ru(self): def clean(self):
""" id = self.cleaned_data.get('place_conference_id')
check name which must be unique because it generate slug field
"""
name_ru = self.cleaned_data.get('name_ru') name_ru = self.cleaned_data.get('name_ru')
try:
place_conference = PlaceConference.objects.get(url=translit_with_separator(name_ru))
if (place_conference.url == translit_with_separator(name_ru)):
return name_ru
except:
return name_ru
raise ValidationError('Место проведения с таким названием уже существует') place_conference = PlaceConference.objects.filter(url=translit_with_separator(name_ru))
if place_conference and str(place_conference[0].id) != id:
msg = 'Место проведения с таким названием уже существует'
self._errors['name_ru'] = ErrorList([msg])
del self.cleaned_data['name_ru']
return self.cleaned_data
def clean_web_page(self): def clean_web_page(self):
""" """

@ -16,8 +16,8 @@ class PlaceConference(TranslatableModel):
""" """
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
country = models.ForeignKey('country.Country', null=True) country = models.ForeignKey('country.Country', on_delete=models.PROTECT)
city = models.ForeignKey('city.City', null=True) city = models.ForeignKey('city.City', on_delete=models.PROTECT)
#type uses EnumField for creating Enum type field in Mysql database #type uses EnumField for creating Enum type field in Mysql database
type = EnumField(values = [item1 for item1, item2 in CONFERENCE_TYPE]) type = EnumField(values = [item1 for item1, item2 in CONFERENCE_TYPE])
#information #information

@ -124,7 +124,7 @@ def conference_change(request, url):
'exposition_hall': place.exposition_hall, 'exp_hall_area': place.exp_hall_area, 'exposition_hall': place.exposition_hall, 'exp_hall_area': place.exp_hall_area,
'wifi': place.wifi, 'multimedia_equipment': place.multimedia_equipment, 'conference_call':place.conference_call, 'wifi': place.wifi, 'multimedia_equipment': place.multimedia_equipment, 'conference_call':place.conference_call,
'translate_equipment': place.translate_equipment, 'banquet_hall': place.banquet_hall, 'translate_equipment': place.translate_equipment, 'banquet_hall': place.banquet_hall,
'catering': place.catering, 'hotel': place.hotel} 'catering': place.catering, 'hotel': place.hotel, 'place_conference_id':place.id}
if place.country: if place.country:
data['country'] = place.country.id data['country'] = place.country.id

@ -4,6 +4,7 @@ from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.validators import validate_email, URLValidator from django.core.validators import validate_email, URLValidator
from django.forms.util import ErrorList
#models #models
from models import PlaceExposition, EXPOSITION_TYPE, Hall from models import PlaceExposition, EXPOSITION_TYPE, Hall
from country.models import Country from country.models import Country
@ -69,6 +70,8 @@ class ExpositionForm(forms.Form):
mobile_application = forms.BooleanField(label='Мобильное приложение', required=False) mobile_application = forms.BooleanField(label='Мобильное приложение', required=False)
# #
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
place_exposition_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
@ -112,7 +115,7 @@ class ExpositionForm(forms.Form):
place_exposition = PlaceExposition.objects.get(id=id) place_exposition = PlaceExposition.objects.get(id=id)
#simple fields #simple fields
place_exposition.url = translit_with_separator(data['name_ru']) place_exposition.url = translit_with_separator(data['name_ru']).lower()
place_exposition.type = data['type'] place_exposition.type = data['type']
place_exposition.address = data['address'] place_exposition.address = data['address']
place_exposition.phone = data['phone'] place_exposition.phone = data['phone']
@ -159,22 +162,17 @@ class ExpositionForm(forms.Form):
return PlaceExposition.objects.get(id=place_exposition_id) return PlaceExposition.objects.get(id=place_exposition_id)
def clean(self):
id = self.cleaned_data.get('place_exposition_id')
name_ru = self.cleaned_data.get('name_ru')
def clean_name_ru(self): place_exposition = PlaceExposition.objects.filter(url=translit_with_separator(name_ru))
""" if place_exposition and str(place_exposition[0].id) != id:
check name which must be unique because it generate slug field msg = 'Место проведения с таким названием уже существует'
""" self._errors['name_ru'] = ErrorList([msg])
cleaned_data = super(ExpositionForm, self).clean() del self.cleaned_data['name_ru']
name_ru = cleaned_data.get('name_ru')
try:
place_exposittion = PlaceExposition.objects.get(url=translit_with_separator(name_ru))
if(place_exposittion.url == translit_with_separator(name_ru)):
return name_ru
except:
return name_ru
raise ValidationError('Место проведения с таким названием уже существует')
return self.cleaned_data
def clean_web_page(self): def clean_web_page(self):
""" """

@ -16,8 +16,8 @@ class PlaceExposition(TranslatableModel):
""" """
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
country = models.ForeignKey('country.Country') country = models.ForeignKey('country.Country', on_delete=models.PROTECT)
city = models.ForeignKey('city.City') city = models.ForeignKey('city.City', on_delete=models.PROTECT)
#type uses EnumField for creating Enum type field in Mysql database #type uses EnumField for creating Enum type field in Mysql database
type = EnumField(values = [item1 for item1, item2 in EXPOSITION_TYPE]) type = EnumField(values = [item1 for item1, item2 in EXPOSITION_TYPE])
#information #information

@ -128,7 +128,8 @@ def exposition_change(request, url):
'disabled_service': place.disabled_service, 'conference_centre': place.conference_centre, 'disabled_service': place.disabled_service, 'conference_centre': place.conference_centre,
'business_centre': place.business_centre, 'online_registration': place.online_registration, 'business_centre': place.business_centre, 'online_registration': place.online_registration,
'cafe': place.cafe, 'terminals': place.terminals, 'parking': place.parking, 'cafe': place.cafe, 'terminals': place.terminals, 'parking': place.parking,
'press_centre': place.press_centre, 'mobile_application': place.mobile_application} 'press_centre': place.press_centre, 'mobile_application': place.mobile_application,
'place_exposition_id':place.id}
if place.country: if place.country:
data['country'] = place.country.id data['country'] = place.country.id

@ -10,20 +10,19 @@ from django.contrib.contenttypes import generic
class Review(models.Model): class Review(models.Model):
""" """
Create Review model Create Review model
Uses hvad.TranslatableModel which is child of django.db.models class
Uses ContentType for connection Review with another models Uses ContentType for connection Review with another models
content_type = model which linked Review object content_type = model which linked Review object
object_id = specific object of model which linked Review object object_id = specific object of model which linked Review object
""" """
#connection with models
content_type = models.ForeignKey(ContentType, null=True) content_type = models.ForeignKey(ContentType, null=True)
object_id = models.PositiveIntegerField(blank=True, null=True) object_id = models.PositiveIntegerField(blank=True, null=True)
object = generic.GenericForeignKey(content_type, object_id) object = generic.GenericForeignKey(content_type, object_id)
user = models.ForeignKey('accounts.User', blank=True, null=True,
user = models.ForeignKey('accounts.User', related_name='reviews') on_delete=models.PROTECT, related_name='reviews')
comment = models.TextField(verbose_name='Отзыв') comment = models.TextField(verbose_name='Отзыв')
rating = models.SmallIntegerField(verbose_name='Оценка', blank=True, null=True) rating = models.SmallIntegerField(verbose_name='Оценка', blank=True, null=True)

@ -3,6 +3,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
#models #models
from models import Seminar, CURRENCY from models import Seminar, CURRENCY
from country.models import Country from country.models import Country
@ -50,6 +51,8 @@ class SeminarCreateForm(forms.Form):
max_price = forms.CharField(label='Максимальная цена', required=False) max_price = forms.CharField(label='Максимальная цена', required=False)
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
seminar_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
@ -101,7 +104,7 @@ class SeminarCreateForm(forms.Form):
seminar.tag.clear() seminar.tag.clear()
#simple fields #simple fields
seminar.url = translit_with_separator(data['name_ru']) seminar.url = translit_with_separator(data['name_ru']).lower()
seminar.data_begin = data['data_begin'] seminar.data_begin = data['data_begin']
seminar.data_end = data['data_end'] seminar.data_end = data['data_end']
seminar.link = data['link'] seminar.link = data['link']
@ -143,20 +146,17 @@ class SeminarCreateForm(forms.Form):
#save files #save files
check_tmp_files(seminar, data['key']) check_tmp_files(seminar, data['key'])
def clean_name_ru(self): def clean(self):
""" id = self.cleaned_data.get('seminar_id')
check main title which must be unique because it generate slug field name_ru = self.cleaned_data.get('name_ru')
"""
cleaned_data = super(SeminarCreateForm, self).clean() seminar = Seminar.objects.filter(url=translit_with_separator(name_ru))
name_ru = cleaned_data.get('name_ru') if seminar and str(seminar[0].id) != id:
try: msg = 'Семинар с таким названием уже существует'
seminar = Seminar.objects.get(url=translit_with_separator(name_ru)) self._errors['name_ru'] = ErrorList([msg])
if(seminar.url == translit_with_separator(name_ru)): del self.cleaned_data['name_ru']
return name_ru
except:
return name_ru
raise ValidationError('Семинар с таким названием уже существует') return self.cleaned_data
def clean_web_page(self): def clean_web_page(self):

@ -18,8 +18,8 @@ class Seminar(TranslatableModel):
data_begin = models.DateTimeField(verbose_name='Дата начала') data_begin = models.DateTimeField(verbose_name='Дата начала')
data_end = models.DateTimeField(verbose_name='Дата окончания') data_end = models.DateTimeField(verbose_name='Дата окончания')
#relations #relations
country = models.ForeignKey('country.Country', verbose_name='Страна') country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT)
city = models.ForeignKey('city.City', verbose_name='Город') city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT)
address = LocationField(verbose_name='Адрес', blank=True) address = LocationField(verbose_name='Адрес', blank=True)
theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики', theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики',
related_name='seminar_themes') related_name='seminar_themes')

@ -94,7 +94,7 @@ def seminar_change(request, url):
data = {'web_page':seminar.web_page, 'foundation_year': seminar.foundation_year, data = {'web_page':seminar.web_page, 'foundation_year': seminar.foundation_year,
'data_begin':seminar.data_begin, 'data_end':seminar.data_end, 'currency':seminar.currency, 'data_begin':seminar.data_begin, 'data_end':seminar.data_end, 'currency':seminar.currency,
'tax':seminar.tax, 'min_price':seminar.min_price, 'link':seminar.link, 'tax':seminar.tax, 'min_price':seminar.min_price, 'link':seminar.link,
'max_price':seminar.max_price, 'address':seminar.address} 'max_price':seminar.max_price, 'address':seminar.address, 'seminar_id':seminar.id}
if seminar.country: if seminar.country:
data['country'] = seminar.country.id data['country'] = seminar.country.id

@ -1,19 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib import admin from django.contrib import admin
from hvad.admin import TranslatableAdmin from hvad.admin import TranslatableAdmin
from models import Service, Review from models import Service
from bitfield import BitField
from bitfield.forms import BitFieldCheckboxSelectMultiple
from bitfield import BitField
from bitfield.forms import BitFieldCheckboxSelectMultiple
class ServiceAdmin(TranslatableAdmin): class ServiceAdmin(TranslatableAdmin):
formfield_overrides = {
BitField: {'widget': BitFieldCheckboxSelectMultiple},
}
class ReviewAdmin(TranslatableAdmin):
pass pass
admin.site.register(Service, ServiceAdmin) admin.site.register(Service, ServiceAdmin)
admin.site.register(Review, ReviewAdmin)

@ -2,18 +2,15 @@
from django.db.models import F from django.db.models import F
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.forms.util import ErrorList
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError
from functions.translate import populate_all, fill_trans_fields_all from functions.translate import populate_all, fill_trans_fields_all
#models #models
from models import Review, Service from models import Service
from country.models import Country, City from country.models import Country, City
from functions.form_check import translit_with_separator from functions.form_check import translit_with_separator
from django.forms.util import ErrorList
class ServiceForm(forms.Form): class ServiceForm(forms.Form):
europa = forms.ModelMultipleChoiceField(queryset=Country.objects.filter(region='europa'), required=False, europa = forms.ModelMultipleChoiceField(queryset=Country.objects.filter(region='europa'), required=False,
@ -26,7 +23,7 @@ class ServiceForm(forms.Form):
widget=forms.CheckboxSelectMultiple()) widget=forms.CheckboxSelectMultiple())
# city = forms.MultipleChoiceField(choices=cities) city = forms.MultipleChoiceField(required=False, choices="")
url = forms.CharField(label='url', required=False) url = forms.CharField(label='url', required=False)
@ -71,7 +68,8 @@ class ServiceForm(forms.Form):
service = Service.objects.get(id=id) service = Service.objects.get(id=id)
service.url = translit_with_separator(data['url']) if data['url'] else translit_with_separator(data['name_ru']) 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']+' '+data['currency']#%s %s'%(data['price'], data['currency'])
# uses because in the next loop data will be overwritten # uses because in the next loop data will be overwritten
service.save() service.save()
@ -83,6 +81,8 @@ class ServiceForm(forms.Form):
#autopopulate #autopopulate
#populate empty fields and fields which was already populated #populate empty fields and fields which was already populated
service_id = getattr(service, 'id') service_id = getattr(service, 'id')
populate_all(Service, data, service_id, zero_fields) populate_all(Service, data, service_id, zero_fields)
@ -91,102 +91,29 @@ class ServiceForm(forms.Form):
countries += [item.id for item in data['america']] countries += [item.id for item in data['america']]
countries += [item.id for item in data['africa']] countries += [item.id for item in data['africa']]
cities = [item for item in data['city']]
#add service to checked countries #add service to checked countries
Country.objects.filter(id__in=countries).\ Country.objects.filter(id__in=countries).\
update(services = F('services').bitor(getattr(Country.services, str(service.id))) ) update(services = F('services').bitor(getattr(Country.services, str(service.id))) )
Country.objects.exclude(id__in=countries).\ Country.objects.exclude(id__in=countries).\
update(services = F('services').bitand(~getattr(Country.services, str(service.id)))) 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): def clean(self):
id = self.cleaned_data.get('service_id') id = self.cleaned_data.get('service_id')
url = self.cleaned_data.get('url') url = self.cleaned_data.get('url')
try: service = Service.objects.filter(url=translit_with_separator(url))
service = Service.objects.get(url=translit_with_separator(url)) if service and str(service[0].id) != id:
if (str(service.id) != str(id)): msg = 'Такой урл уже занят'
msg = 'Такой урл уже занят' self._errors['url'] = ErrorList([msg])
self._errors['url'] = ErrorList([msg]) del self.cleaned_data['url']
del self.cleaned_data['url']
except:
pass
return self.cleaned_data
def clean_url(self):
"""
check name which must be unique because it generate slug field
"""
cleaned_data = super(ServiceForm, self).clean()
url = cleaned_data.get('url')
id = cleaned_data.get('service_id')
try:
service = Service.objects.get(url=translit_with_separator(url))
if (translit_with_separator(url) == service.url):
return url
except:
return url
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)
""" return self.cleaned_data

@ -1,20 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from hvad.models import TranslatableModel, TranslatedFields from hvad.models import TranslatableModel, TranslatedFields
from bitfield import BitField
#from country.models import Country, City
class Service(TranslatableModel): class Service(TranslatableModel):
#event = models.ManyToManyField()
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
"""
countries = [str(item.id) for item in Country.objects.all()]
cities = [str(item.id) for item in City.objects.all()]
country = BitField(flags=countries)
city = BitField(flags=cities)
"""
price = models.CharField(max_length=20, blank=True) price = models.CharField(max_length=20, blank=True)
params = models.CharField(max_length=255, blank=True) params = models.CharField(max_length=255, blank=True)
#translated fields #translated fields
@ -30,12 +21,4 @@ class Service(TranslatableModel):
) )
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', self.pk) return self.lazy_translation_getter('name', self.pk)
class Review(models.Model):
service = models.ForeignKey(Service, related_name='services')
web_page = models.CharField(max_length=50, blank=True)
rating = models.SmallIntegerField()
company = models.CharField(verbose_name='Компания', max_length=255)
contact= models.CharField(verbose_name='Контакты', max_length=255)
comment = models.TextField(verbose_name='Коментарий')

@ -5,13 +5,8 @@ urlpatterns = patterns('',
url(r'^add.*/$', 'service.views.service_add'), url(r'^add.*/$', 'service.views.service_add'),
url(r'^change/(.*)/$', 'service.views.service_change'), url(r'^change/(.*)/$', 'service.views.service_change'),
url(r'^all/$', 'service.views.service_all'), url(r'^all/$', 'service.views.service_all'),
#ajax
url(r'^get_city/$', 'service.views.get_city'), url(r'^get_city/$', 'service.views.get_city'),
url(r'^get_country/$', 'service.views.get_country'), url(r'^get_country/$', 'service.views.get_country'),
url(r'^review/add.*/$', 'service.views.review_add'),
url(r'^review/change/(?P<review_id>\d+).*/$', 'service.views.review_change'),
url(r'^review/all/$', 'service.views.review_all'),
) )

@ -1,13 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect
from django.core.context_processors import csrf from django.core.context_processors import csrf
from django.conf import settings from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
#models and forms #models and forms
from models import Service, Review from models import Service
from forms import ServiceForm, ReviewForm from forms import ServiceForm
from country.models import Country from country.models import Country
from city.models import City from city.models import City
#custom views #custom views
@ -20,14 +19,6 @@ def service_all(request):
""" """
return objects_list(request, Service, 'service_all.html') return objects_list(request, Service, 'service_all.html')
def review_all(request):
"""
return list of all reviews with pagination
"""
return objects_list(request, Review, 'review_all.html')
@login_required @login_required
def service_change(request, url): def service_change(request, url):
try: try:
@ -37,6 +28,8 @@ def service_change(request, url):
return HttpResponseRedirect('/service/all') return HttpResponseRedirect('/service/all')
if request.POST: if request.POST:
form = ServiceForm(request.POST) form = ServiceForm(request.POST)
form.fields['city'].choices = [(item.id, item.name) for item in City.objects.all()]
if form.is_valid(): if form.is_valid():
form.save(service_id) form.save(service_id)
@ -100,49 +93,6 @@ def service_add(request):
return render_to_response('service_add.html', args) return render_to_response('service_add.html', args)
@login_required
def review_add(request):
if request.POST:
form = ReviewForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/service/review/all')
else:
form = ReviewForm()
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
return render_to_response('review_add.html', args)
@login_required
def review_change(request, review_id):
try:
review = Review.objects.get(id=review_id)
except:
return HttpResponseRedirect('/service/review/all')
if request.POST:
form = ReviewForm(request.POST, instance=review)
if form.is_valid():
form.save()
return HttpResponseRedirect('/service/review/all')
else:
form = ReviewForm(instance=review)
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
return render_to_response('review_add.html', args)
def get_country(request): def get_country(request):
if request.GET: if request.GET:
country_region = request.GET['region'] country_region = request.GET['region']

@ -28,8 +28,10 @@
<h2><i class="icon-pencil"></i> Основная информация</h2> <h2><i class="icon-pencil"></i> Основная информация</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden input uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.article_id }}
{# main_title #} {# main_title #}
{% with field='main_title' form=form languages=languages %} {% with field='main_title' form=form languages=languages %}

@ -29,6 +29,8 @@
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.city_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -53,6 +53,8 @@
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.conference_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -28,8 +28,10 @@
<h2><i class="icon-pencil"></i> Основная информация</h2> <h2><i class="icon-pencil"></i> Основная информация</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden input uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.country_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -31,6 +31,9 @@ Displays lists of all countries in the table
<a class="btn btn-info" href="/country/change/{{ item.url|lower }}"> <a class="btn btn-info" href="/country/change/{{ item.url|lower }}">
<i class="icon-edit icon-white"></i> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </a>
<a class="btn btn-danger" href="/country/delete/{{ item.url }}">
<i class="icon-trash icon-white"></i> Удалить
</a>
</td> </td>
</tr> </tr>

@ -57,6 +57,8 @@
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.exposition_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -37,6 +37,8 @@
<div class="box-content"> <div class="box-content">
{# Hidden input uses for comparing with TmpFile objects #} {# Hidden input uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.place_conference_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -35,6 +35,8 @@
<div class="box-content"> <div class="box-content">
{# Hidden input uses for comparing with TmpFile objects #} {# Hidden input uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.place_exposition_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -54,6 +54,8 @@
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.seminar_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -2,7 +2,7 @@
{% for item in options %} {% for item in options %}
<li> <li>
<label for="id_{{ item.country }}_{{ item.id }}"> <label for="id_{{ item.country }}_{{ item.id }}">
<input type="checkbox" id="id_{{ item.country }}_{{ item.id }}" name="{{ item.country }}" <input type="checkbox" id="id_{{ item.country }}_{{ item.id }}" name="city"
checked="true" value="{{ item.id }}">{{ item.name }}</label> checked="true" value="{{ item.id }}">{{ item.name }}</label>
</li> </li>
{% endfor %} {% endfor %}

@ -25,7 +25,7 @@
<td>{{ item.main_title }}</td> <td>{{ item.main_title }}</td>
<td class="center sorting_1"> <td class="center sorting_1">
<a class="btn btn-info" href="/theme/theme/change/{{ theme.id }}"> <a class="btn btn-info" href="/theme/theme/change/{{ item.id }}">
<i class="icon-edit icon-white"></i> Изменить <i class="icon-edit icon-white"></i> Изменить
</a> </a>
</td> </td>

@ -49,6 +49,8 @@
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden inputs uses for comparing with TmpFile objects #}
{{ form.key }} {{ form.key }}
{# Hidden input uses in clean method for checking url #}
{{ form.webinar_id }}
{# name #} {# name #}
{% with field='name' form=form languages=languages %} {% with field='name' form=form languages=languages %}

@ -130,8 +130,7 @@
<li><a href="/city/all">Город</a></li> <li><a href="/city/all">Город</a></li>
<li><a href="/theme/theme/all">Тематики</a></li> <li><a href="/theme/theme/all">Тематики</a></li>
<li><a href="/theme/tag/all">Теги</a></li> <li><a href="/theme/tag/all">Теги</a></li>
<li><a href="/service/service/all">Услуги</a></li> <li><a href="/service/all">Услуги</a></li>
<li><a href="/service/review/all">Отзывы к услугам</a></li>
<li><a href="/settings">Настройки</a></li> <li><a href="/settings">Настройки</a></li>
</ul> </ul>
</li> </li>

@ -43,7 +43,7 @@ class Tag(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class Uses hvad.TranslatableModel which is child of django.db.models class
""" """
theme = models.ForeignKey(Theme, related_name='themes') theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name='themes')
#translated fields #translated fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(max_length=100), name = models.CharField(max_length=100),

@ -3,6 +3,7 @@ from django import forms
from django.conf import settings from django.conf import settings
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms.util import ErrorList
#models #models
from models import Webinar, CURRENCY from models import Webinar, CURRENCY
from theme.models import Theme from theme.models import Theme
@ -41,6 +42,8 @@ class WebinarCreateForm(forms.Form):
max_price = forms.CharField(label='Максимальная цена', required=False) max_price = forms.CharField(label='Максимальная цена', required=False)
#field for comparing tmp files #field for comparing tmp files
key = forms.CharField(required=False, widget=forms.HiddenInput()) key = forms.CharField(required=False, widget=forms.HiddenInput())
#
webinar_id = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
@ -96,7 +99,7 @@ class WebinarCreateForm(forms.Form):
webinar.tag.clear() webinar.tag.clear()
#simple fields #simple fields
webinar.url = translit_with_separator(data['name_ru']) webinar.url = translit_with_separator(data['name_ru']).lower()
webinar.data_begin = data['data_begin'] webinar.data_begin = data['data_begin']
webinar.link = data['link'] webinar.link = data['link']
webinar.web_page= data['web_page'] webinar.web_page= data['web_page']
@ -128,21 +131,17 @@ class WebinarCreateForm(forms.Form):
#save files #save files
check_tmp_files(webinar, data['key']) check_tmp_files(webinar, data['key'])
def clean_name_ru(self): def clean(self):
""" id = self.cleaned_data.get('webinar_id')
check main title which must be unique because it generate slug field name_ru = self.cleaned_data.get('name_ru')
"""
cleaned_data = super(WebinarCreateForm, self).clean()
name_ru = cleaned_data.get('name_ru')
try:
webinar = Webinar.objects.get(url=translit_with_separator(name_ru))
if (webinar.url == translit_with_separator(name_ru)):
return name_ru
except:
return name_ru
raise ValidationError('Вебинар с таким названием уже существует') webinar = Webinar.objects.filter(url=translit_with_separator(name_ru))
if webinar and str(webinar[0].id) != id:
msg = 'Вебинар с таким названием уже существует'
self._errors['name_ru'] = ErrorList([msg])
del self.cleaned_data['name_ru']
return self.cleaned_data
def clean_web_page(self): def clean_web_page(self):
""" """

@ -3,7 +3,6 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^add.*/$', 'webinar.views.webinar_add'), url(r'^add.*/$', 'webinar.views.webinar_add'),
url(r'^change/(.*)/$', 'webinar.views.webinar_change2'), url(r'^change/(.*)/$', 'webinar.views.webinar_change'),
url(r'^change/(?P<webinar_id>\d+).*/$', 'webinar.views.webinar_change'),
url(r'^all/$', 'webinar.views.webinar_all'), url(r'^all/$', 'webinar.views.webinar_all'),
) )

@ -60,64 +60,7 @@ def webinar_add(request):
@login_required @login_required
def webinar_change(request, webinar_id): def webinar_change(request, url):
"""
Return form of Webinar and fill it with existing Webinar object data.
If form of webinar is posted redirect on the page of all webinars.
"""
try:
#check if webinar_id exists else redirect to the list of webinars
webinar = Webinar.objects.get(id=webinar_id)
file_form = FileModelForm(initial={'model': 'webinar.Webinar'})
except:
return HttpResponseRedirect('/webinar/all/')
if request.POST:
form = WebinarChangeForm(request.POST)
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()]
if form.is_valid():
form.save(webinar_id)
return HttpResponseRedirect('/webinar/all/')
else:
#fill form with data from database
data = {'web_page':webinar.web_page, 'data_begin':webinar.data_begin, 'currency':webinar.currency,
'tax':webinar.tax, 'min_price':webinar.min_price, 'link':webinar.link,
'max_price':webinar.max_price}
data['theme'] = [item.id for item in webinar.theme.all()]
data['tag'] = [item.id for item in webinar.tag.all()]
#data from translated fields
for code, name in settings.LANGUAGES:
obj = Webinar._meta.translations_model.objects.get(language_code = code,master__id=webinar_id) #access to translated fields
data['name_%s' % code] = obj.name
data['programm_%s' % code] = obj.programm
data['main_title_%s' % code] = obj.main_title
data['discount_%s' % code] = obj.discount
data['title_%s' % code] = obj.title
data['keywords_%s' % code] = obj.keywords
data['descriptions_%s' % code] = obj.descriptions
#initial form
form = WebinarChangeForm(data)
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])]
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['file_form'] = file_form
#get list of files which connected with specific model object
args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(webinar),
object_id=getattr(webinar, 'id'))
args['obj_id'] = webinar_id
return render_to_response('webinar_add.html', args)
@login_required
def webinar_change2(request, url):
""" """
Return form of Webinar and fill it with existing Webinar object data. Return form of Webinar and fill it with existing Webinar object data.
@ -134,13 +77,13 @@ def webinar_change2(request, url):
form = WebinarChangeForm(request.POST) form = WebinarChangeForm(request.POST)
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()]
if form.is_valid(): if form.is_valid():
form.save(getattr(webinar, id)) form.save(getattr(webinar, 'id'))
return HttpResponseRedirect('/webinar/all/') return HttpResponseRedirect('/webinar/all/')
else: else:
#fill form with data from database #fill form with data from database
data = {'web_page':webinar.web_page, 'data_begin':webinar.data_begin, 'currency':webinar.currency, data = {'web_page':webinar.web_page, 'data_begin':webinar.data_begin, 'currency':webinar.currency,
'tax':webinar.tax, 'min_price':webinar.min_price, 'link':webinar.link, 'tax':webinar.tax, 'min_price':webinar.min_price, 'link':webinar.link,
'max_price':webinar.max_price} 'max_price':webinar.max_price, 'webinar_id':webinar.id}
data['theme'] = [item.id for item in webinar.theme.all()] data['theme'] = [item.id for item in webinar.theme.all()]
data['tag'] = [item.id for item in webinar.tag.all()] data['tag'] = [item.id for item in webinar.tag.all()]

Loading…
Cancel
Save