Merged from develop

remotes/origin/1203
Nazar Kotjuk 10 years ago
commit 1972ffed09
  1. 5
      .gitignore
  2. 2
      article/admin.py
  3. 11
      conference/models.py
  4. 54
      expobanner/admin.py
  5. 6
      expobanner/admin_urls.py
  6. 32
      expobanner/forms.py
  7. 8
      expobanner/models.py
  8. 16
      exposition/models.py
  9. 17
      functions/model_mixin.py
  10. 16
      functions/models_methods.py
  11. 26
      proj/views.py
  12. 30
      service/admin.py
  13. 13
      service/admin_urls.py
  14. 29
      service/forms.py
  15. 63
      service/models.py
  16. 2
      templates/admin/article/blog_form.html
  17. 2
      templates/admin/expobanner/default_form.html
  18. 23
      templates/admin/expobanner/main_list.html
  19. 33
      templates/admin/expobanner/paid_create.html
  20. 2
      templates/admin/includes/admin_nav.html
  21. 39
      templates/admin/service/control_list.html
  22. 16
      templates/admin/service/linked_service.html
  23. 12
      templates/admin/service/linked_service_list.html
  24. 29
      templates/admin/theme/theme_blog_new.html
  25. 15
      templates/client/includes/conference/conference_services.html
  26. 17
      templates/client/includes/exposition/exposition_services.html
  27. 2
      templates/client/includes/index/main_events.html
  28. 30
      templates/client/package.json
  29. 2
      templates/client/service/participation.html
  30. 2
      templates/client/service/remotely.html
  31. 2
      templates/client/service/tickets.html
  32. 2
      templates/client/service/tour.html
  33. 2
      templates/client/service/translator.html
  34. 1
      templates/client/static_client/css/vendor.css
  35. 7
      templates/client/static_client/js/_modules/block.common.js
  36. 2
      templates/client/static_client/js_min/_modules/block.common.min.js
  37. 47
      theme/admin.py
  38. 4
      theme/admin_urls.py
  39. 34
      theme/forms.py
  40. 1
      theme/models.py

5
.gitignore vendored

@ -4,15 +4,16 @@
*~ *~
*.egg-info *.egg-info
*.doc *.doc
# jetbrains data
.idea/ .idea/
media/ media/
media media
logs/ logs/
Thumbs.db Thumbs.db
npm-debug.log
/proj/local.py /proj/local.py
# gulp
node_modules node_modules
npm-debug.log

@ -145,7 +145,7 @@ class BlogList(ListView):
class BlogView(FormView): class BlogView(FormView):
form_class = BlogForm form_class = BlogForm
template_name = 'article/blog_form.html' template_name = 'admin/article/blog_form.html'
success_url = '/admin/article/blog/all/' success_url = '/admin/article/blog/all/'
obj = None obj = None

@ -111,6 +111,7 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
keywords=models.CharField(max_length=250), keywords=models.CharField(max_length=250),
) )
main = models.ForeignKey('expobanner.MainPage', blank=True, null=True, on_delete=models.SET_NULL)
#fields saves information about creating and changing model #fields saves information about creating and changing model
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
@ -132,6 +133,13 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
return list(qs) return list(qs)
#return list(Service.objects.language().filter(url__in=ids, type=Service.type.conference).order_by('sort')) #return list(Service.objects.language().filter(url__in=ids, type=Service.type.conference).order_by('sort'))
def get_services_detail(self):
excluded = ['tickets']
country_ids = [item for item, bool in self.country.services if bool==True]
ids = [item for item, bool in self.services if bool==True]
qs = Service.objects.language().exclude(url__in=excluded).filter(Q(Q(url__in=country_ids) & Q(type=Service.type.conference)) | Q(url__in=ids))
return list(qs)
def get_nearest_events(self): def get_nearest_events(self):
if self.theme.all(): if self.theme.all():
theme = self.theme.all()[0] theme = self.theme.all()[0]
@ -163,6 +171,9 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin):
def get_visit_url(self): def get_visit_url(self):
return '/conference-visit/%s/'%self.id return '/conference-visit/%s/'%self.id
def get_note_url(self):
return '/conference/add-note/%s/'%self.url
def get_note_by_user(self, user_id): def get_note_by_user(self, user_id):
note = self.note.filter(user__id=user_id) note = self.note.filter(user__id=user_id)
try: try:

@ -6,9 +6,9 @@ from django.shortcuts import get_object_or_404
from django.db.models import Sum from django.db.models import Sum
from expobanner.models import URL, BannerGroup, Banner, Paid, MainPage, Top from expobanner.models import URL, BannerGroup, Banner, Paid, MainPage, Top
from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\ from expobanner.forms import UrlCreateForm, BannerCreateGroupForm, BannerCreateForm, BannerGroupUpdateForm,\
PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainUpdateForm, TopUpdateForm PaidCreateForm, PaidUpdateForm, TopCreateForm, BannerLinkCreateForm, MainCreateForm, MainConfCreateForm, MainUpdateForm, TopUpdateForm
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference
class BannersControl(TemplateView): class BannersControl(TemplateView):
template_name = 'admin/expobanner/banners_control.html' template_name = 'admin/expobanner/banners_control.html'
@ -203,6 +203,8 @@ class PaidStat(DetailView):
return context return context
# ---------------------------------- # ----------------------------------
class MainList(ListView): class MainList(ListView):
model = Exposition model = Exposition
template_name = 'admin/expobanner/main_list.html' template_name = 'admin/expobanner/main_list.html'
@ -227,7 +229,6 @@ class MainUpdate(UpdateView):
template_name = 'admin/expobanner/default_form.html' template_name = 'admin/expobanner/default_form.html'
success_url = '/admin/expobanners/main/list/' success_url = '/admin/expobanners/main/list/'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MainUpdate, self).get_context_data(**kwargs) context = super(MainUpdate, self).get_context_data(**kwargs)
obj = self.object obj = self.object
@ -235,6 +236,50 @@ class MainUpdate(UpdateView):
return context return context
class MainConfList(ListView):
model = Conference
template_name = 'admin/expobanner/main_list.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self):
qs = self.model.objects.language().filter(main__isnull=False).order_by('-main__public')
if self.request.GET.get('onlypublic'):
qs = qs.filter(main__public=True)
return qs
def get_context_data(self, **kwargs):
context = super(MainConfList, self).get_context_data(**kwargs)
context.update({'conf': True})
return context
from django.core.urlresolvers import reverse_lazy
class MainConfCreate(CreateView):
form_class = MainConfCreateForm
template_name = 'admin/expobanner/paid_create.html'
success_url = reverse_lazy('expobanner-conf-list_main')
def get_context_data(self, **kwargs):
context = super(MainConfCreate, self).get_context_data(**kwargs)
context.update({'conf': True})
return context
class MainConfUpdate(UpdateView):
model = MainPage
form_class = MainUpdateForm
template_name = 'admin/expobanner/default_form.html'
success_url = reverse_lazy('expobanner-conf-list_main')
def get_context_data(self, **kwargs):
context = super(MainConfUpdate, self).get_context_data(**kwargs)
obj = self.object
context['conference'] = obj.get_event()
return context
def main_turn(request, pk, status): def main_turn(request, pk, status):
main = get_object_or_404(MainPage, pk=pk) main = get_object_or_404(MainPage, pk=pk)
if status == 'on': if status == 'on':
@ -242,10 +287,11 @@ def main_turn(request, pk, status):
else: else:
main.public = False main.public = False
main.save() main.save()
return HttpResponseRedirect('/admin/expobanners/main/list/') return HttpResponseRedirect(request.META['HTTP_REFERER'])
from datetime import datetime from datetime import datetime
class MainStat(DetailView): class MainStat(DetailView):
model = MainPage model = MainPage
template_name = 'admin/expobanner/main_stat.html' template_name = 'admin/expobanner/main_stat.html'

@ -36,4 +36,10 @@ urlpatterns = patterns('expobanner.admin',
url(r'^main/$', MainCreate.as_view(), name='expobanner-create_main'), url(r'^main/$', MainCreate.as_view(), name='expobanner-create_main'),
url(r'^main/turn/(?P<pk>\d+)/(?P<status>.*)/$', main_turn, name='expobanner-main-turn'), url(r'^main/turn/(?P<pk>\d+)/(?P<status>.*)/$', main_turn, name='expobanner-main-turn'),
url(r'^main/(?P<pk>\d+)/stat/$', MainStat.as_view(), name='expobanner_stat_main'), url(r'^main/(?P<pk>\d+)/stat/$', MainStat.as_view(), name='expobanner_stat_main'),
# conference on main page
url(r'^main/conf/list/$', MainConfList.as_view(), name='expobanner-conf-list_main'),
url(r'^main/conf/(?P<pk>\d+)/edit/$', MainConfUpdate.as_view(), name='expobanner-conf-update_main'),
url(r'^main/conf/$', MainConfCreate.as_view(), name='expobanner-conf-create_main'),
url(r'^main/conf/turn/(?P<pk>\d+)/(?P<status>.*)/$', main_turn, name='expobanner-conf-main-turn'),
#url(r'^main/conf/(?P<pk>\d+)/stat/$', MainStat.as_view(), name='expobanner_stat_main'),
) )

@ -2,6 +2,7 @@
from django import forms from django import forms
from expobanner.models import URL, BannerGroup, Banner, Paid, Top, MainPage from expobanner.models import URL, BannerGroup, Banner, Paid, Top, MainPage
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference
from country.models import Country from country.models import Country
from ckeditor.widgets import CKEditorWidget from ckeditor.widgets import CKEditorWidget
from theme.models import Theme, Tag from theme.models import Theme, Tag
@ -107,6 +108,7 @@ class PaidCreateForm(forms.ModelForm):
raise forms.ValidationError(u'Такой выставки не существует') raise forms.ValidationError(u'Такой выставки не существует')
return expo return expo
class MainCreateForm(forms.ModelForm): class MainCreateForm(forms.ModelForm):
verbose = u'Добавить выставку на главную' verbose = u'Добавить выставку на главную'
exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput()) exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput())
@ -137,6 +139,36 @@ class MainCreateForm(forms.ModelForm):
return expo return expo
class MainConfCreateForm(forms.ModelForm):
verbose = u'Добавить конференцию на главную'
conf = forms.CharField(label=u'Конференция', widget=forms.HiddenInput())
class Meta:
model = MainPage
fields = ['position', 'public']
def save(self, commit=True):
main = super(MainConfCreateForm, self).save(commit=False)
if commit:
conf = self.cleaned_data['conf']
link = conf.get_permanent_url()
link_b = Banner.objects.create_for_paid(conf, link, 'main_page_link')
main.link = link_b
main.save()
conf.main = main
conf.save()
return main
def clean_conf(self):
conf_id = self.cleaned_data['conf']
try:
conf = Conference.objects.get(id=conf_id)
except Conference.DoesNotExist:
raise forms.ValidationError(u'Такой конференции не существует')
return conf
class PaidUpdateForm(forms.ModelForm): class PaidUpdateForm(forms.ModelForm):
tickets = forms.URLField(label=u'Линк на билеты') tickets = forms.URLField(label=u'Линк на билеты')
participation = forms.URLField(label=u'Линк на участие') participation = forms.URLField(label=u'Линк на участие')

@ -297,7 +297,13 @@ class MainPage(models.Model, StatMixin):
try: try:
return self.exposition_set.all()[0] return self.exposition_set.all()[0]
except IndexError: except IndexError:
return None try:
return self.conference_set.all()[0]
except IndexError:
return None
def __unicode__(self):
return self.get_event().url
def generatePassword(length=5): def generatePassword(length=5):

@ -178,6 +178,13 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
return list(qs) return list(qs)
def get_services_detail(self):
excluded = ['visit', 'tickets']
country_ids = [item for item, bool in self.country.services if bool==True]
ids = [item for item, bool in self.services if bool==True]
qs = Service.objects.language().exclude(url__in=excluded).filter(Q(Q(url__in=country_ids) & Q(type=Service.type.expo)) | Q(url__in=ids))
return list(qs)
def get_parent(self): def get_parent(self):
return {} return {}
def get_absolute_url(self): def get_absolute_url(self):
@ -285,6 +292,9 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def get_visit_url(self): def get_visit_url(self):
return '/exposition-visit/%s/'%self.id return '/exposition-visit/%s/'%self.id
def get_note_url(self):
return '/expo/add-note/%s/'%self.url
def get_timetables_days(self): def get_timetables_days(self):
tables = self.business_program.all() tables = self.business_program.all()
days = [] days = []
@ -306,12 +316,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def theme_ids(self): def theme_ids(self):
return [item['id'] for item in self.theme.all().values('id')] return [item['id'] for item in self.theme.all().values('id')]
def get_main_link(self):
if self.main:
return self.main.link.get_click_link()
else:
return self.get_permanent_url()
def get_top_link(self): def get_top_link(self):
if self.top: if self.top:
return self.top.link.get_click_link() return self.top.link.get_click_link()

@ -5,11 +5,6 @@ from service.models import Service
class ExpoMixin(object): class ExpoMixin(object):
# def get_index_text(self):
# names = [tr.name for tr in self.translations.all()]
# return names
def get_logo(self): def get_logo(self):
logo = self.files.filter(purpose='logo') logo = self.files.filter(purpose='logo')
@ -34,6 +29,12 @@ class EventMixin(object):
url = '%s%s/'%(self.get_catalog_url(), self.url) url = '%s%s/'%(self.get_catalog_url(), self.url)
return url return url
def get_main_link(self):
if self.main:
return self.main.link.get_click_link()
else:
return self.get_permanent_url()
def get_paid_catalog_url(self): def get_paid_catalog_url(self):
return self.paid_new.catalog.get_click_link() return self.paid_new.catalog.get_click_link()
@ -45,12 +46,6 @@ class EventMixin(object):
def get_logo(self): def get_logo(self):
return self.logo return self.logo
"""
logo = self.files.filter(purpose='logo')
if logo:
return logo[0]
return logo
"""
def get_preview(self): def get_preview(self):

@ -39,6 +39,22 @@ class ExpoManager(TranslationManager):
return result return result
def conf_main(self):
lang = translation.get_language()
key = 'conf_main_page_key_%s'%lang
result = cache.get(key)
if not result:
result = list(self.language(lang).
select_related('country', 'city', 'place', 'main').
prefetch_related('tag').
filter(main__isnull=False).
filter(main__public=True))
cache.set(key, result, 50)
return result
class CityManager(TranslationManager): class CityManager(TranslationManager):

@ -1,22 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.core.context_processors import csrf
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.template import RequestContext from django.template import RequestContext
from django.views.generic import TemplateView from django.views.generic import TemplateView
from django.conf import settings from django.conf import settings
from exposition.models import Exposition from django.utils.translation import get_language
from theme.models import Theme from functions.cache_mixin import JitterCacheMixin
from news.models import News from functions.forms import ThemeSearch
from article.models import Article from functions.search_forms import ExpositionSearchForm
from functions.cache_mixin import JitterCacheMixin, CacheMixin
from functions.forms import ThemeSearch, PlaceSearch
from functions.search_forms import EventSearchForm, ExpositionSearchForm
from functions.custom_views import ExpoListView
from accounts.forms import RegistrationCompleteForm, SocialRegistrationCompleteForm from accounts.forms import RegistrationCompleteForm, SocialRegistrationCompleteForm
from meta.models import SeoText from meta.models import SeoText
from django.utils.translation import get_language from theme.models import Theme
from article.models import Article
from exposition.models import Exposition
from conference.models import Conference
def clear_slashes(str_): def clear_slashes(str_):
@ -73,11 +69,13 @@ def error404(request):
class MainPageView(JitterCacheMixin, TemplateView): class MainPageView(JitterCacheMixin, TemplateView):
cache_range = settings.CACHE_RANGE cache_range = settings.CACHE_RANGE
template_name = 'index.html' template_name = 'client/index.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MainPageView, self).get_context_data(**kwargs) context = super(MainPageView, self).get_context_data(**kwargs)
ev = Exposition.objects.expo_main() ex = Exposition.objects.expo_main()
conf = Conference.objects.conf_main()
ev = ex + conf
events = sorted(ev, key=lambda x: x.main.position) events = sorted(ev, key=lambda x: x.main.position)
# update main_page counter # update main_page counter
for event in events: for event in events:

@ -117,34 +117,6 @@ def get_city(request):
return HttpResponse('error') return HttpResponse('error')
class ServiceControlList(ListView):
model = Service
template_name = 'admin/service/control_list.html'
paginate_by = 20
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import FormMixin
from django.views.generic import DetailView
from service.forms import ServiceControlForm
class ServiceControl(FormMixin, DetailView):
form_class = ServiceControlForm
template_name = 'admin/service/control.html'
model = Service
def get_form(self, form_class):
obj = self.object
data = obj.get_current_state()
return form_class(data)
def get_context_data(self, **kwargs):
context = super(ServiceControl, self).get_context_data(**kwargs)
context['form'] = self.get_form(self.form_class)
return context
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.views.generic import UpdateView, ListView, DeleteView from django.views.generic import UpdateView, ListView, DeleteView
from .forms import LinkedServiceForm from .forms import LinkedServiceForm
@ -157,7 +129,7 @@ class LinkedServiceUpdateView(UpdateView):
form_class = LinkedServiceForm form_class = LinkedServiceForm
model = LinkedService model = LinkedService
template_name = "admin/service/linked_service.html" template_name = "admin/service/linked_service.html"
success_url = "/admin/service/test/all/" success_url = "/admin/service/control/all/"
def get_object(self, queryset=None): def get_object(self, queryset=None):
url = self.kwargs['url'] url = self.kwargs['url']

@ -2,11 +2,9 @@
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \ from views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \
ParticipationListView, RemoteListView,TicketsListView ParticipationListView, RemoteListView,TicketsListView
from service.admin import ServiceControlList, ServiceControl, LinkedServiceList, LinkedServiceUpdateView, LinkedServiceDeleteView from service.admin import LinkedServiceList, LinkedServiceUpdateView, LinkedServiceDeleteView
urlpatterns = patterns('service.admin', urlpatterns = patterns('service.admin',
url(r'^control/list/$', ServiceControlList.as_view()),
url(r'^control/(?P<pk>.*)/$', ServiceControl.as_view()),
url(r'^add.*/$', 'service_add'), url(r'^add.*/$', 'service_add'),
url(r'^delete/(?P<url>.*)/$', 'service_delete'), url(r'^delete/(?P<url>.*)/$', 'service_delete'),
url(r'^change/(?P<url>.*)/$', 'service_change'), url(r'^change/(?P<url>.*)/$', 'service_change'),
@ -18,14 +16,11 @@ urlpatterns = patterns('service.admin',
url(r'order/participation/$', ParticipationListView.as_view()), url(r'order/participation/$', ParticipationListView.as_view()),
url(r'order/remote/$', RemoteListView.as_view()), url(r'order/remote/$', RemoteListView.as_view()),
url(r'order/tickets/$', TicketsListView.as_view()), url(r'order/tickets/$', TicketsListView.as_view()),
url('^test/delete/(?P<url>[a-z]*)/', LinkedServiceDeleteView.as_view(), name='linked_service_delete'), url(r'^control/delete/(?P<url>[a-z]*)/', LinkedServiceDeleteView.as_view(), name='linked_service_delete'),
url('^test/all/', LinkedServiceList.as_view(), name = 'linked_service_all'), url(r'^control/all/', LinkedServiceList.as_view(), name='linked_service_all'),
url('^test/(?P<url>[a-z]*)/', LinkedServiceUpdateView.as_view(), name= 'linked_service_update'), url(r'^control/(?P<url>[a-z]*)/', LinkedServiceUpdateView.as_view(), name='linked_service_update'),
#ajax #ajax
url(r'^get_city/$', 'get_city'), url(r'^get_city/$', 'get_city'),
#url(r'^get_country/$', 'get_country'),
) )

@ -128,35 +128,16 @@ from country.models import Area, Country
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference 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 .models import LinkedService
from django.db.models.query import EmptyQuerySet from django.db.models.query import EmptyQuerySet
class LinkedServiceForm(forms.ModelForm): class LinkedServiceForm(forms.ModelForm):
type = forms.MultipleChoiceField(choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple, required=False) type = forms.MultipleChoiceField(label='Тип', choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple, required=False)
expositions = forms.CharField(widget=forms.HiddenInput,required=False) expositions = forms.CharField(label='Выставки', widget=forms.HiddenInput,required=False)
conferences = forms.CharField(widget=forms.HiddenInput, required=False) conferences = forms.CharField(label='Конференции', widget=forms.HiddenInput, required=False)
countries = forms.MultipleChoiceField(label='Страны', choices=[(c.id, c.name) for c in list(set(Country.objects.language()))])
class Meta: class Meta:
model = LinkedService model = LinkedService
@ -166,7 +147,7 @@ class LinkedServiceForm(forms.ModelForm):
} }
def clean_countries(self): def clean_countries(self):
countries = Country.objects.language().filter(id__in=self.cleaned_data['countries']) countries = Country.objects.language().filter(id__in=self.cleaned_data['countries'])
return countries return countries
def clean_expositions(self): def clean_expositions(self):

@ -47,60 +47,6 @@ class Service(TranslatableModel):
def get_price(self): def get_price(self):
pr = self.price pr = self.price
def get_current_state(self):
"""
uses for control form
:return:
"""
from country.models import Country
country_all = False
country = []
region = []
expositions = []
conferences = []
service = self.url
event_type = [key for key, value in self.type.iteritems() if value]
if not event_type:
return {'event_type': event_type,
'region': region,
'country': country,
'country_all': country_all,
'expositions': expositions,
'conferences': conferences}
count1 = Country.objects.filter().count()
count2 = Country.objects.filter(services=getattr(Country.services, service)).count()
country_all = count1 == count2
if not country_all:
from exposition.models import Exposition
from conference.models import Conference
from country.models import Area
from django.utils.translation import get_language
lang = get_language()
countries = list(Country.objects.language(lang).filter(services=getattr(Country.services, service)))
expositions = [(item.id, item.name) for item in Exposition.enable.upcoming().exclude(country__in=countries, services=getattr(Exposition.services, service))]
conferences = [(item.id, item.name) for item in Conference.enable.upcoming().exclude(country__in=countries, services=getattr(Conference.services, service))]
region = []
countries = set(countries)
for item in list(Area.objects.language(lang).all()):
print(item)
area_countries = item.countries()
if set(area_countries).issubset(countries):
region.append((item.id, item.name))
countries = countries - set(area_countries)
country = [(item.id, item.name) for item in list(countries)]
state = {'event_type': event_type,
'region': region,
'country': country,
'country_all': country_all,
'expositions': expositions,
'conferences': conferences}
return state
from django.db.models.signals import post_save from django.db.models.signals import post_save
from functions.signal_handlers import post_save_handler from functions.signal_handlers import post_save_handler
@ -238,5 +184,14 @@ class LinkedService(models.Model):
self.update_expositions_flag() self.update_expositions_flag()
self.update_conferences_flag() self.update_conferences_flag()
def countries_count(self):
if not self.exclude_countries:
return self.countries.all().count()
else:
from country.models import Country
all = Country.objects.filter().count()
excluded = self.countries.all().count()
return all - excluded
def __unicode__(self): def __unicode__(self):
return u'Linked service for %s'%self.service.url return u'Linked service for %s'%self.service.url

@ -54,7 +54,7 @@
</div> </div>
{% if not article %} {% if not article %}
<div class="control-group {% if form.slug.errors %}error{% endif %}"> <div class="control-group {% if form.slug.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.slug.label }}:</b></label> <label class="control-label">{{ form.slug.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.slug }} {{ form.slug }}
<span class="help-inline">{{ form.slug.errors }}</span> <span class="help-inline">{{ form.slug.errors }}</span>

@ -51,7 +51,7 @@
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-pencil"></i>{{ form.verbose }}</h2> <h2><i class="icon-pencil"></i> {% if form.verbose %} {{ form.verbose }} {% else %} {{ object.get_event }} {% endif %}</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{% for field in form %} {% for field in form %}

@ -4,13 +4,17 @@
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список выставок на главной</h2> <h2><i class="icon-arrow-down"></i>Список {% if conf %}конференций{% else %}выставок{% endif %} на главной</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{% block list_table %} {% block list_table %}
<div style="float:left;"> <div style="float:left;">
{% if conf %}
<a class="btn btn-success" href="{% url 'expobanner-conf-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить конференцию</a>
{% else %}
<a class="btn btn-success" href="{% url 'expobanner-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a> <a class="btn btn-success" href="{% url 'expobanner-create_main' %}"><i class="icon-plus-sign icon-white"></i> Добавить выставку</a>
</div> {% endif %}
</div>
<div style="float:right;"> <div style="float:right;">
<form method="get" id="form"> <form method="get" id="form">
Только опубликование<input id="public" type="checkbox" name="onlypublic" value="true"> Только опубликование<input id="public" type="checkbox" name="onlypublic" value="true">
@ -19,7 +23,11 @@
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th>Выставка</th> {% if conf %}
<th>Конференция</th>
{% else %}
<th>Выставка</th>
{% endif %}
<th>Позиция</th> <th>Позиция</th>
<th>&nbsp;</th> <th>&nbsp;</th>
<th>&nbsp;</th> <th>&nbsp;</th>
@ -31,8 +39,13 @@
<tr> <tr>
<td>{{ item }}</td> <td>{{ item }}</td>
<td>{{ item.main.position }}</td> <td>{{ item.main.position }}</td>
<td><a href="{% url 'expobanner-update_main' item.main.id %}">Изменить</a> </td> {% if conf %}
<td>{% if item.main.public %}<a href="{% url 'expobanner-main-turn' item.main.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-main-turn' item.main.id 'on' %}">включить</a>{% endif %} </td> <td><a href="{% url 'expobanner-conf-update_main' item.main.id %}">Изменить</a> </td>
<td>{% if item.main.public %}<a href="{% url 'expobanner-conf-main-turn' item.main.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-conf-main-turn' item.main.id 'on' %}">включить</a>{% endif %} </td>
{% else %}
<td><a href="{% url 'expobanner-update_main' item.main.id %}">Изменить</a> </td>
<td>{% if item.main.public %}<a href="{% url 'expobanner-main-turn' item.main.id 'off' %}">отключить</a>{% else %}<a href="{% url 'expobanner-main-turn' item.main.id 'on' %}">включить</a>{% endif %} </td>
{% endif %}
<td><a href="{% url 'expobanner_stat_main' item.main.id %}">Статистика</a> </td> <td><a href="{% url 'expobanner_stat_main' item.main.id %}">Статистика</a> </td>
</tr> </tr>
{% endfor %} {% endfor %}

@ -39,6 +39,39 @@
} }
}); });
$('#id_conf').select2({
placeholder: 'Найти',
width: 'element',
ajax: {
url: '/admin/conference/search/',
dataType: "json",
quietMillis: 200,
multiple: true,
data: function(term, page){
return {term: term,
page: page};
},
results: function (data) {
var results = [];
$.each(data, function(index, item){
results.push({
id: item.id,
text: item.label
});
});
return {results: results};
}
},
initSelection : function(element, callback) {
var id= $(element).val();
var text = $(element).attr('data-init-text');
callback({id: id, text:text});
}
});
}); });
</script> </script>
{% endblock %} {% endblock %}

@ -43,6 +43,7 @@
<li><a href="/admin/theme/blog_theme/all">Тематики для блогов</a></li> <li><a href="/admin/theme/blog_theme/all">Тематики для блогов</a></li>
<li><a href="/admin/theme/tag/all">Теги</a></li> <li><a href="/admin/theme/tag/all">Теги</a></li>
<li><a href="/admin/service/all">Услуги</a></li> <li><a href="/admin/service/all">Услуги</a></li>
<li><a href="{% url 'linked_service_all' %}">Управление услугами</a></li>
<li><a href="/admin/settings/main-page/">Главная страница</a></li> <li><a href="/admin/settings/main-page/">Главная страница</a></li>
<li><a href="/admin/meta/all/">Мета</a></li> <li><a href="/admin/meta/all/">Мета</a></li>
@ -107,6 +108,7 @@
<li><a href="/admin/expobanners/paid/list/">Платные выставки</a></li> <li><a href="/admin/expobanners/paid/list/">Платные выставки</a></li>
<li><a href="/admin/expobanners/top/list/">Выставки в топе</a></li> <li><a href="/admin/expobanners/top/list/">Выставки в топе</a></li>
<li><a href="/admin/expobanners/main/list/">Выставки на главной</a></li> <li><a href="/admin/expobanners/main/list/">Выставки на главной</a></li>
<li><a href="/admin/expobanners/main/conf/list/">Конференции на главной</a></li>
</ul> </ul>
</li> </li>

@ -1,39 +0,0 @@
{% extends 'admin_list.html' %}
{% block body %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список услуг</h2>
</div>
<div class="box-content">
<table class="table table-hover">
<thead>
<tr>
<th>id</th>
<th>Название</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>
<a class="btn-small btn-info" href="/admin/service/control/{{ item.id }}/">
Управлять
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}

@ -15,6 +15,7 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
console.log(1); console.log(1);
$("#id_countries").select2({width:'element'});
$('#id_expositions').select2({ $('#id_expositions').select2({
placeholder: "Expositions", placeholder: "Expositions",
width: 'element', width: 'element',
@ -118,11 +119,12 @@
{# Uses multilang.html template for translated fields #} {# Uses multilang.html template for translated fields #}
<form class="form-horizontal" method="post" action="">{% csrf_token %} <form class="form-horizontal" method="post" action="">{% csrf_token %}
<fieldset>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2> <h2><i class="icon-pencil"></i> </h2>
</div> </div>
<div class="box-content">
{% for f in form %} {% for f in form %}
<div class="control-group {% if f.errors %}error{% endif %}"> <div class="control-group {% if f.errors %}error{% endif %}">
<label class="control-label"><b>{{ f.label }}:</b></label> <label class="control-label"><b>{{ f.label }}:</b></label>
@ -131,11 +133,13 @@
</div> </div>
</div> </div>
{% endfor %} {% endfor %}
<div class="controls">
<button type="submit" class="btn btn-large btn-primary">Submit</button>
<button type="reset" class="btn btn-large">Reset</button>
</div>
</div> </div>
</div>
<div class="controls">
<button type="submit" class="btn btn-large btn-primary">Submit</button>
<button type="reset" class="btn btn-large">Reset</button>
</div>
</fieldset>
</form> </form>

@ -2,7 +2,7 @@
{% block body %} {% block body %}
<div class="box span8"> <div class="box span10">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-arrow-down"></i>Настройки услуг</h2> <h2><i class="icon-arrow-down"></i>Настройки услуг</h2>
</div> </div>
@ -25,17 +25,15 @@
<tr> <tr>
<td>{{ item.id }}</td> <td>{{ item.id }}</td>
<td>{{ item.service.name }}</td> <td>{{ item.service.name }}</td>
<td>{% if item.service.type.mask == 1 %} expo {% elif item.service.type.mask == 2%} conf {% elif item.service.type.mask == 3 %} expo, conf{% endif %}</td> <td>{% if item.service.type.mask == 1 %} выставки {% elif item.service.type.mask == 2%} конференции {% elif item.service.type.mask == 3 %} выставки и конференции{% endif %}</td>
<td>{{ item.countries.count }}</td> <td>{{ item.countries_count }}</td>
<td>{{ item.expositions.count }}</td> <td>{{ item.expositions.count }}</td>
<td>{{ item.conferences.count }}</td> <td>{{ item.conferences.count }}</td>
<td class="center sorting_1"> <td class="center sorting_1">
<a class="btn btn-info" href="{% url 'linked_service_update' item.service.url %}"> <a class="btn btn-info" href="{% url 'linked_service_update' item.service.url %}">
<i class="icon-edit icon-white"></i> Изменить <i class="icon-edit icon-white"></i> Управление
</a>
<a class="btn btn-danger" href="{% url 'linked_service_delete' item.service.url %}">
<i class="icon-trash icon-white"></i> Удалить
</a> </a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

@ -7,7 +7,6 @@
{# selects #} {# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> <link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script> <script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
@ -15,25 +14,27 @@
{% block body %} {% block body %}
<form method="post" class="form-horizontal"> {% csrf_token %}{{ form.errors }} <form method="post" class="form-horizontal" > {% csrf_token %}
<fieldset> <fieldset>
<legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}тему</legend> <legend><i class="icon-edit"></i>{% if theme_id %} Изменить {% else %} Добавить {% endif %}тему</legend>
<div class="box span8"> <div class="box span8">
<div class="box-header well"> <div class="box-header well">
<h2><i class="icon-pencil"></i> Информация</h2> <h2><i class="icon-pencil"></i> Информация</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{% for field in form %} {# name #}
{% with field='name' form=form languages=languages %}
<div {% if object and forloop.first %} style="display:none;"{% endif %} class="control-group {% if field.errors %}error{% endif %}"> {% include 'admin/forms/multilang.html' %}
<label class="control-label">{{ field.label }}:</label> {% endwith %}
<div class="controls">
{{ field }} {# main_title #}
<span class="help-inline">{{ field.errors }}</span> {% with field='main_title' form=form languages=languages %}
</div> {% include 'admin/forms/multilang.html' %}
</div> {% endwith %}
{# description #}
{% endfor %} {% with field='description' form=form languages=languages %}
{% include 'admin/forms/multilang.html' %}
{% endwith %}
</div> </div>
</div> </div>

@ -2,13 +2,12 @@
<div class="i-sub-articles"> <div class="i-sub-articles">
<ul> <ul>
<li> {% with services=object.get_services_detail %}
<a href="{{ event.get_permanent_url }}service/translator/">{% trans 'Устный переводчик' %}</a> {% for service in services %}
</li> <li>
{% if event.country_id not in sng_countries %} <a href="{{ exposition.get_permanent_url }}service/{{ service.url }}/">{{ service.name }}</a>
<li> </li>
<a href="{{ event.get_permanent_url }}service/visit/">{% trans 'Бизнес-тур "под ключ"' %}</a> {% endfor %}
</li> {% endwith %}
{% endif %}
</ul> </ul>
</div> </div>

@ -2,15 +2,12 @@
<div class="i-sub-articles"> <div class="i-sub-articles">
<ul> <ul>
<li> {% with services=object.get_services_detail %}
<a href="{{ exposition.get_permanent_url }}service/participation/">{% trans 'Участие со стендом' %}</a> {% for service in services %}
</li> <li>
<li> <a href="{{ exposition.get_permanent_url }}service/{{ service.url }}/">{{ service.name }}</a>
<a href="{{ exposition.get_permanent_url }}service/translator/">{% trans 'Устный переводчик' %}</a> </li>
</li> {% endfor %}
{% endwith %}
<li>
<a href="{{ exposition.get_permanent_url }}service/remote/">{% trans 'Заочное посещение' %}</a>
</li>
</ul> </ul>
</div> </div>

@ -36,7 +36,7 @@
<div class="re-buttons"> <div class="re-buttons">
<a class="button blue icon-calendar {% if event|in_calendar:request.user %}removecalendar {% else %}addcalendar {% endif %}" href="{{ event.get_calendar_url }}">{% if event|in_calendar:request.user %}{% trans 'Убрать из календаря' %}{% else %}{% trans 'добавить в календарь' %}{% endif %}</a> <a class="button blue icon-calendar {% if event|in_calendar:request.user %}removecalendar {% else %}addcalendar {% endif %}" href="{{ event.get_calendar_url }}">{% if event|in_calendar:request.user %}{% trans 'Убрать из календаря' %}{% else %}{% trans 'добавить в календарь' %}{% endif %}</a>
<div class="main-page {% if request.user.is_authenticated%}note-wrap{% else %}note-wrap-disabled{% endif %}"> <div class="main-page {% if request.user.is_authenticated%}note-wrap{% else %}note-wrap-disabled{% endif %}">
<a class="button green icon-note {% if note %}active{% endif %} note-button" href="/expo/add-note/{{ event.url }}/">{% trans 'заметка' %}</a> <a class="button green icon-note {% if note %}active{% endif %} note-button" href="{{ event.get_note_url }}">{% trans 'заметка' %}</a>
<div class="note-overlay"> <div class="note-overlay">
<form action=""> <form action="">
<textarea name="note_text" class="note-text"> {{ note }}</textarea> <textarea name="note_text" class="note-text"> {{ note }}</textarea>

@ -0,0 +1,30 @@
{
"name": "kotzilla",
"version": "0.0.0",
"description": "",
"main": "gulpfile.js",
"dependencies": {
"gulp": "~3.9.0"
},
"devDependencies": {
"connect": "~3.4.0",
"gulp-concat": "~2.6.0",
"gulp-livereload": "~3.8.1",
"gulp": "~3.9.0",
"gulp-stylus": "~2.1.0",
"gulp-uglify": "~1.4.1",
"gulp-jade": "~1.1.0",
"gulp-imagemin": "~2.3.0",
"gulp-csso": "~1.0.0",
"gulp-myth": "~1.0.3",
"gulp-rename": "~1.2.2",
"gulp-autoprefixer": "~3.0.2",
"gulp-cssmin": "~0.1.7",
"gulp-newer": "~0.5.1"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "BSD-2-Clause"
}

@ -55,7 +55,7 @@
</div> </div>
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}> <div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}>
<form method="post">{% csrf_token %} <form id="id_service_participation" method="post">{% csrf_token %}
<hr /> <hr />

@ -58,7 +58,7 @@
</div> </div>
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}> <div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}>
<form method="post">{% csrf_token %} <form id="id_service_remote" method="post">{% csrf_token %}
<hr /> <hr />

@ -51,7 +51,7 @@
</div> </div>
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}> <div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}>
<form method="post">{% csrf_token %} <form id="id_service_tickets" method="post">{% csrf_token %}
<hr /> <hr />

@ -53,7 +53,7 @@
</div> </div>
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}> <div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}>
<form method="post">{% csrf_token %} <form id="id_service_tour" method="post">{% csrf_token %}
<hr /> <hr />

@ -51,7 +51,7 @@
<div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}> <div class="rq-form service-page" {% if form.errors %}style="display:block"{% endif %}>
{% comment %}{{ form.errors }}{% endcomment %} {% comment %}{{ form.errors }}{% endcomment %}
<form method="post">{% csrf_token %} <form id="id_service_translator" method="post">{% csrf_token %}
<hr /> <hr />

@ -2809,4 +2809,3 @@ html[dir="rtl"] .select2-container-multi .select2-choices li
height: 100px; height: 100px;
overflow: scroll; overflow: scroll;
} }

@ -93,7 +93,12 @@ if (EXPO.common){
$.fancybox.close(true); $.fancybox.close(true);
$.fancybox('#'+EXPO.common.opt.successRegisterId); $.fancybox('#'+EXPO.common.opt.successRegisterId);
}else{ }else{
if($(self.DOM).attr('id') == 'log_form'){
dataLayer.push({'event': 'logform'});
}
if($(self.DOM).attr('id') == 'end-reg-form'){
dataLayer.push({'event': 'endregform'});
}
window.location.reload(); window.location.reload();
} }
}else{ }else{

File diff suppressed because one or more lines are too long

@ -182,13 +182,46 @@ class ThemeBlogListView(ListView):
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
class ThemeBlogCreateView(CreateView): class ThemeBlogDeleteView(DeleteView):
template_name = "admin/theme/theme_blog_new.html" template_name = "admin/theme/theme_blog_confirm_delete.html"
model = ThemeBlog model = ThemeBlog
form_class = ThemeBlogForm
success_url = reverse_lazy("theme_blog_all") success_url = reverse_lazy("theme_blog_all")
pk_url_kwarg = "theme_id"
def blog_theme_add(request):
return add_object(request, ThemeBlogForm, 'theme_blog_new.html', reverse_lazy("theme_blog_all"))
@login_required
def blog_theme_change(request, theme_id=None):
try:
theme = ThemeBlog.objects.get(id=theme_id)
except:
return HttpResponseRedirect('theme_blog_all')
if request.POST:
form = ThemeBlogForm(request.POST)
if form.is_valid():
form.save(theme_id)
return HttpResponseRedirect(reverse_lazy("theme_blog_all"))
else:
data = {}
for code, name in settings.LANGUAGES:
obj = ThemeBlog._meta.translations_model.objects.get(language_code = code,master__id=theme_id) #access to translated fields
data['name_%s'%code] = obj.name
data['description_%s'%code] = obj.description
data['main_title_%s'%code] = obj.main_title
form = ThemeBlogForm(data)
args = {}
args.update(csrf(request))
args['form'] = form
args['languages'] = settings.LANGUAGES
args['theme_id'] = theme_id
return render_to_response('admin/theme/theme_blog_new.html', args)
# ======================================================
class ThemeBlogUpdateView(UpdateView): class ThemeBlogUpdateView(UpdateView):
template_name = "admin/theme/theme_blog_new.html" template_name = "admin/theme/theme_blog_new.html"
model = ThemeBlog model = ThemeBlog
@ -197,8 +230,8 @@ class ThemeBlogUpdateView(UpdateView):
pk_url_kwarg = "theme_id" pk_url_kwarg = "theme_id"
class ThemeBlogDeleteView(DeleteView): class ThemeBlogCreateView(CreateView):
template_name = "admin/theme/theme_blog_confirm_delete.html" template_name = "admin/theme/theme_blog_new.html"
model = ThemeBlog model = ThemeBlog
success_url = reverse_lazy("theme_blog_all") form_class = ThemeBlogForm
pk_url_kwarg = "theme_id" success_url = reverse_lazy("theme_blog_all")

@ -7,12 +7,12 @@ from .admin import ThemeBlogCreateView, ThemeBlogUpdateView, ThemeBlogDeleteView
urlpatterns = patterns('theme.admin', urlpatterns = patterns('theme.admin',
url(r'^theme/add.*/$', 'theme_add'), url(r'^theme/add.*/$', 'theme_add'),
url(r'^tag/add.*/$', 'tag_add'), url(r'^tag/add.*/$', 'tag_add'),
url(r'^blog_theme/add/$', ThemeBlogCreateView.as_view(), name = 'theme_blog_new'), url(r'^blog_theme/add/$', 'blog_theme_add', name = 'theme_blog_new'),
url(r'^theme/delete/(?P<theme_id>\d+)/$', 'theme_delete'), url(r'^theme/delete/(?P<theme_id>\d+)/$', 'theme_delete'),
url(r'^tag/delete/(?P<tag_id>\d+)/$', 'tag_delete'), url(r'^tag/delete/(?P<tag_id>\d+)/$', 'tag_delete'),
url(r'^blog_theme/delete/(?P<theme_id>\d+)/$', ThemeBlogDeleteView.as_view(), name = 'theme_blog_delete'), url(r'^blog_theme/delete/(?P<theme_id>\d+)/$', ThemeBlogDeleteView.as_view(), name = 'theme_blog_delete'),
url(r'^theme/change/(?P<theme_id>\d+).*/$', 'theme_change'), url(r'^theme/change/(?P<theme_id>\d+).*/$', 'theme_change'),
url(r'^blog_theme/change/(?P<theme_id>\d+).*/$', ThemeBlogUpdateView.as_view(), name= "theme_blog_change"), url(r'^blog_theme/change/(?P<theme_id>\d+).*/$', 'blog_theme_change', name= "theme_blog_change"),
url(r'^tag/change/(?P<tag_id>\d+).*/$', 'tag_change'), url(r'^tag/change/(?P<tag_id>\d+).*/$', 'tag_change'),
url(r'^theme/copy/(?P<theme_id>\d+).*/$', 'theme_copy'), url(r'^theme/copy/(?P<theme_id>\d+).*/$', 'theme_copy'),
url(r'^tag/copy/(?P<tag_id>\d+).*/$', 'tag_copy'), url(r'^tag/copy/(?P<tag_id>\d+).*/$', 'tag_copy'),

@ -149,7 +149,7 @@ from hvad.forms import TranslatableModelForm
from .models import ThemeBlog from .models import ThemeBlog
class ThemeBlogForm(TranslatableModelForm): class _ThemeBlogForm(TranslatableModelForm):
class Meta: class Meta:
model = ThemeBlog model = ThemeBlog
fields = ['url', 'name', 'main_title', 'description', 'inflect'] fields = ['url', 'name', 'main_title', 'description', 'inflect']
@ -158,4 +158,34 @@ class ThemeBlogForm(TranslatableModelForm):
def save(self, commit= True): def save(self, commit= True):
if not 'url' in self.cleaned_data: if not 'url' in self.cleaned_data:
self.cleaned_data['url'] = translit_with_separator(self.cleaned_data['name']) self.cleaned_data['url'] = translit_with_separator(self.cleaned_data['name'])
return super(ThemeBlogForm, self).save(commit=True) return super(_ThemeBlogForm, self).save(commit=True)
class ThemeBlogForm(forms.Form):
def __init__(self, *args, **kwargs):
super(ThemeBlogForm, 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)
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=False, widget=CKEditorWidget)#with saving form
def save(self, id=None):
data = self.cleaned_data
if not id:
theme = ThemeBlog()
else:
theme = ThemeBlog.objects.get(id=id)
if not getattr(theme, 'url'):
theme.url = translit_with_separator(data['name_ru'].strip()).lower()
fill_with_signal(ThemeBlog, theme, data)
if not theme.url:
theme.url = translit_with_separator(theme.name)
theme.save()

@ -273,6 +273,7 @@ def pre_save_handler(sender, **kwargs):
pre_save.connect(pre_save_handler, sender=Tag) pre_save.connect(pre_save_handler, sender=Tag)
post_save.connect(post_save_handler, sender=Theme) post_save.connect(post_save_handler, sender=Theme)
post_save.connect(post_save_handler, sender=ThemeBlog)
post_save.connect(post_save_handler, sender=Tag) post_save.connect(post_save_handler, sender=Tag)

Loading…
Cancel
Save