remotes/origin/1203
Nazar Kotjuk 10 years ago
commit ef7a407df8
  1. 11
      article/admin.py
  2. 24
      article/forms.py
  3. 11
      article/models.py
  4. 8
      article/views.py
  5. 4
      conference/admin.py
  6. 2
      conference/forms.py
  7. 8
      emencia/django/newsletter/forms.py
  8. 54
      emencia/django/newsletter/views/admin_views.py
  9. 61
      service/admin.py
  10. 8
      service/admin_urls.py
  11. 44
      service/forms.py
  12. 1
      service/management/__init__.py
  13. 1
      service/management/commands/__init__.py
  14. 24
      service/management/commands/create_linked_services.py
  15. 41
      service/models.py
  16. 22
      static/js/select/select2.min.js
  17. 10
      templates/admin/article/blog_form.html
  18. 7
      templates/admin/conference/conference.html
  19. 10
      templates/admin/conference/conference_add.html
  20. 1
      templates/admin/includes/admin_nav.html
  21. 69
      templates/admin/newsletters/contact_list.html
  22. 142
      templates/admin/service/linked_service.html
  23. 11
      templates/admin/service/linked_service_confirm_delete.html
  24. 48
      templates/admin/service/linked_service_list.html
  25. 2
      templates/admin/service/service_add.html
  26. 11
      templates/admin/theme/theme_blog_confirm_delete.html
  27. 65
      templates/admin/theme/theme_blog_list.html
  28. 49
      templates/admin/theme/theme_blog_new.html
  29. 4
      templates/client/article/article.html
  30. 2
      templates/client/includes/conference/default_description.html
  31. 41
      theme/admin.py
  32. 6
      theme/admin_urls.py
  33. 15
      theme/forms.py
  34. 24
      theme/models.py
  35. 3
      theme/views.py

@ -125,12 +125,14 @@ def article_change(request, url):
return render_to_response('article_add.html', args) return render_to_response('article_add.html', args)
#----------------------- #-----------------------
from django.views.generic import ListView, FormView from django.views.generic import FormView
from functions.custom_views import ListView
from forms import BlogForm from forms import BlogForm
class BlogList(ListView): class BlogList(ListView):
model = Article model = Article
template_name = 'article/article_admin_list.html' template_name = 'admin/article/article_admin_list.html'
paginate_by = settings.ADMIN_PAGINATION
def get_queryset(self): def get_queryset(self):
return self.model.objects.blogs() return self.model.objects.blogs()
@ -140,6 +142,7 @@ class BlogList(ListView):
context['blog_flag'] = True context['blog_flag'] = True
return context return context
class BlogView(FormView): class BlogView(FormView):
form_class = BlogForm form_class = BlogForm
template_name = 'article/blog_form.html' template_name = 'article/blog_form.html'
@ -160,7 +163,6 @@ class BlogView(FormView):
form.save(author, article=self.obj) form.save(author, article=self.obj)
return HttpResponseRedirect(self.success_url) return HttpResponseRedirect(self.success_url)
def get_form(self, form_class): def get_form(self, form_class):
if self.request.POST: if self.request.POST:
return super(BlogView, self).get_form(form_class) return super(BlogView, self).get_form(form_class)
@ -168,7 +170,8 @@ class BlogView(FormView):
if self.obj: if self.obj:
article = self.obj article = self.obj
data = {} data = {}
data['theme'] = [item.id for item in article.theme.all()] data['slug'] = article.slug
data['theme'] = [item.id for item in article.blog_theme.all()]
if article.exposition: if article.exposition:
data['exposition'] = article.exposition.id data['exposition'] = article.exposition.id
if article.conference: if article.conference:

@ -12,18 +12,20 @@ from functions.form_check import translit_with_separator
#models #models
from models import Article from models import Article
from accounts.models import User from accounts.models import User
from theme.models import Theme, Tag from theme.models import Theme, Tag, ThemeBlog
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference from conference.models import Conference
class BlogForm(forms.Form): class BlogForm(forms.Form):
type = Article.blog type = Article.blog
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.exclude(article__id=None), required=False, theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=ThemeBlog.objects.all(), required=False,
widget=forms.SelectMultiple(attrs={'style':'width: 550px'})) widget=forms.SelectMultiple(attrs={'style':'width: 550px'}))
slug = forms.SlugField(label=u'URL', max_length=255, min_length=1)
publish_date = forms.DateField(label=u'Дата публикации', input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False) publish_date = forms.DateField(label=u'Дата публикации', input_formats=['%Y-%m-%d', '%d.%m.%Y'], required=False)
tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(), required=False) tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(), required=False)
logo = forms.ImageField(label=u'Лого', required=False) logo = forms.ImageField(label=u'Лого', required=False)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
create dynamical translated fields fields create dynamical translated fields fields
@ -49,21 +51,26 @@ class BlogForm(forms.Form):
def save(self, author, article=None): def save(self, author, article=None):
data = self.cleaned_data data = self.cleaned_data
#create new Article object or get exists # create new Article object or get exists
if not article: if not article:
article = Article() article = Article()
article.author = author article.author = author
article.type = self.type article.type = self.type
article.slug = data.get('slug')
if data['logo']: if data['logo']:
article.logo = data['logo'] article.logo = data['logo']
article.publish_date = data['publish_date'] article.publish_date = data['publish_date']
# fill translated fields and save object # fill translated fields and save object
fill_with_signal(Article, article, data) fill_with_signal(Article, article, data)
# fill manytomany fields # fill manytomany fields
article.theme.clear() if self.type == Article.blog:
article.blog_theme.clear()
article.blog_theme.add(*ThemeBlog.objects.filter(id__in=data['theme']))
else:
article.theme.clear()
article.theme.add(*Theme.objects.filter(id__in=data['theme']))
article.tag.clear() article.tag.clear()
article.theme.add(*Theme.objects.filter(id__in=data['theme']))
article.tag.add(*Tag.objects.filter(id__in=data['tag'])) article.tag.add(*Tag.objects.filter(id__in=data['tag']))
#for item in data['theme']: #for item in data['theme']:
# article.theme.add(item.id)#.id cause select uses queryset # article.theme.add(item.id)#.id cause select uses queryset
@ -92,7 +99,8 @@ class NewsForm(BlogForm):
type = Article.news type = Article.news
exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput(), required=False) exposition = forms.CharField(label=u'Выставка', widget=forms.HiddenInput(), required=False)
conference = forms.CharField(label=u'Конференция', widget=forms.HiddenInput(), required=False) conference = forms.CharField(label=u'Конференция', widget=forms.HiddenInput(), required=False)
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all(), required=False,
widget=forms.SelectMultiple(attrs={'style':'width: 550px'}))
#exposition = forms.ModelChoiceField(label = u'Выставка', required=False, queryset=Exposition.objects.all()) #exposition = forms.ModelChoiceField(label = u'Выставка', required=False, queryset=Exposition.objects.all())
#conference = forms.ModelChoiceField(label = u'Конференция', required=False, queryset=Conference.objects.all()) #conference = forms.ModelChoiceField(label = u'Конференция', required=False, queryset=Conference.objects.all())
@ -258,7 +266,7 @@ class BlogForm(forms.ModelForm):
class ArticleFilterForm(forms.Form): class ArticleFilterForm(forms.Form):
theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False,
choices=[(item.id, item.name) for item in Theme.objects.language().filter(article__type=1).exclude(article__id=None).distinct()]) choices=[(item.id, item.name) for item in ThemeBlog.objects.language().distinct()])
tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False)
''' '''
@ -284,7 +292,7 @@ class BlogFilterForm(forms.Form):
super(BlogFilterForm, self).__init__(*args, **kwargs) super(BlogFilterForm, self).__init__(*args, **kwargs)
ids = [item['theme'] for item in list(Article.objects.blogs().values('theme').distinct())] ids = [item['theme'] for item in list(Article.objects.blogs().values('theme').distinct())]
self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False,
choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)]) choices=[(item.id, item.name) for item in ThemeBlog.objects.language().filter(id__in=ids)])
class NewsFilterForm(forms.Form): class NewsFilterForm(forms.Form):

@ -14,7 +14,6 @@ from functions.form_check import translit_with_separator
from django.core.cache import cache from django.core.cache import cache
class ArticleManager(TranslationManager): class ArticleManager(TranslationManager):
cache_time = 60 cache_time = 60
def safe_get(self, **kwargs): def safe_get(self, **kwargs):
@ -60,7 +59,6 @@ class ArticleManager(TranslationManager):
cache.set(key, blogs, self.cache_time) cache.set(key, blogs, self.cache_time)
return blogs return blogs
return list(self.blogs().filter(publish_date__isnull=False).order_by('-main_page', '-publish_date')[:3])
class Article(TranslatableModel): class Article(TranslatableModel):
""" """
@ -81,6 +79,7 @@ class Article(TranslatableModel):
old_id = models.IntegerField(blank=True, null=True) old_id = models.IntegerField(blank=True, null=True)
logo = ImageField(upload_to='articles_preview', blank=True) logo = ImageField(upload_to='articles_preview', blank=True)
theme = models.ManyToManyField('theme.Theme') theme = models.ManyToManyField('theme.Theme')
blog_theme = models.ManyToManyField('theme.ThemeBlog')
tag = models.ManyToManyField('theme.Tag', blank=True, null=True) tag = models.ManyToManyField('theme.Tag', blank=True, null=True)
author = models.ForeignKey('accounts.User', verbose_name='Автор', author = models.ForeignKey('accounts.User', verbose_name='Автор',
on_delete=models.PROTECT, related_name='articles') on_delete=models.PROTECT, related_name='articles')
@ -148,15 +147,12 @@ class Article(TranslatableModel):
return self.conference return self.conference
return None return None
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# If no slug is provided, generates one before saving. # If no slug is provided, generates one before saving.
if not self.slug: if not self.slug:
self.slug = self.generate_unique_slug() self.slug = self.generate_unique_slug()
# Set the description field on save.
#Set the description field on save. # if self.gen_description:
#if self.gen_description:
# self.description = strip_tags(self.description_from_content()) # self.description = strip_tags(self.description_from_content())
super(Article, self).save(*args, **kwargs) super(Article, self).save(*args, **kwargs)
@ -189,7 +185,6 @@ class Article(TranslatableModel):
#print self.lazy_translation_getter('main_title', self.pk) #print self.lazy_translation_getter('main_title', self.pk)
return u'%s'%self.lazy_translation_getter('main_title', self.pk) return u'%s'%self.lazy_translation_getter('main_title', self.pk)
def _get_next_or_previous_by_publish_date(self, is_next, **kwargs): def _get_next_or_previous_by_publish_date(self, is_next, **kwargs):
""" """
Retrieves next or previous object by publish date. We implement Retrieves next or previous object by publish date. We implement

@ -5,7 +5,7 @@ from functions.custom_views import ListView
from django.http import HttpResponse from django.http import HttpResponse
from models import Article from models import Article
from forms import ArticleFilterForm from forms import ArticleFilterForm
from theme.models import Tag, Theme from theme.models import Tag, Theme, ThemeBlog
from meta.views import MetadataMixin from meta.views import MetadataMixin
@ -71,7 +71,7 @@ class BlogList(MetadataMixin, ListView):
themes = self.request.GET.getlist('theme') themes = self.request.GET.getlist('theme')
if themes: if themes:
qs = qs.filter(theme__id__in=themes) qs = qs.filter(blog_theme__id__in=themes)
tags = self.request.GET.getlist('tag') tags = self.request.GET.getlist('tag')
if u'' in tags: if u'' in tags:
@ -180,10 +180,10 @@ class BlogsFilterCatalog(MetadataMixin, ListView):
self.filter_object = tag self.filter_object = tag
qs = Article.objects.blogs().filter(tag=tag) qs = Article.objects.blogs().filter(tag=tag)
else: else:
theme = get_object_or_404(Theme, url=slug) theme = get_object_or_404(ThemeBlog, url=slug)
self.kwargs['theme'] = theme self.kwargs['theme'] = theme
self.filter_object = theme self.filter_object = theme
qs = Article.objects.blogs().filter(theme = theme) qs = Article.objects.blogs().filter(blog_theme = theme)
year = self.kwargs.get('year') year = self.kwargs.get('year')
if year: if year:

@ -159,7 +159,7 @@ def conference_change(request, url):
#initial StatisticFormSet #initial StatisticFormSet
StatisticFormSet = modelformset_factory(Statistic, form=StatisticForm, exclude=('conference',)) StatisticFormSet = modelformset_factory(Statistic, form=StatisticForm, exclude=('conference',))
#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, 'place_alt': conference.place_alt, '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, 'max_price':conference.max_price, 'tax':conference.tax, 'min_price':conference.min_price, 'max_price':conference.max_price,
'link':conference.link, 'conference_id':conference.id, 'expohit': conference.expohit, 'link':conference.link, 'conference_id':conference.id, 'expohit': conference.expohit,
@ -233,7 +233,7 @@ class ConferenceView(AdminView):
return super(ConferenceView, self).get_form(form_class) return super(ConferenceView, self).get_form(form_class)
obj = self.set_obj() obj = self.set_obj()
if obj: if obj:
data = {'web_page':obj.web_page, 'foundation_year': obj.foundation_year, data = {'web_page':obj.web_page, 'place_alt':obj.place_alt, 'foundation_year': obj.foundation_year,
'data_begin':obj.data_begin, 'data_end':obj.data_end, 'currency':obj.currency, 'data_begin':obj.data_begin, 'data_end':obj.data_end, 'currency':obj.currency,
'tax':obj.tax, 'min_price':obj.min_price, 'max_price':obj.max_price, 'tax':obj.tax, 'min_price':obj.min_price, 'max_price':obj.max_price,
'link':obj.link, 'conference_id':obj.id, 'expohit': obj.expohit, 'periodic':obj.periodic, 'link':obj.link, 'conference_id':obj.id, 'expohit': obj.expohit, 'periodic':obj.periodic,

@ -56,6 +56,7 @@ class ConferenceCreateForm(forms.Form):
place = forms.ChoiceField(label=u'Место проведения', required=False, place = forms.ChoiceField(label=u'Место проведения', required=False,
choices=places) choices=places)
place_alt = forms.CharField(label = u"Альтернативное название места", required=False)
#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
city = forms.CharField(label=u'Город', widget=forms.HiddenInput()) city = forms.CharField(label=u'Город', widget=forms.HiddenInput())
@ -160,6 +161,7 @@ class ConferenceCreateForm(forms.Form):
conference.canceled = data['canceled'] conference.canceled = data['canceled']
conference.moved = data['moved'] conference.moved = data['moved']
conference.periodic = data['periodic'] conference.periodic = data['periodic']
conference.place_alt = data['place_alt']
# generates bitfield # generates bitfield
flag = 0 flag = 0
if data['quality_label']: if data['quality_label']:

@ -6,6 +6,7 @@ from django.utils.translation import ugettext_lazy as _
from emencia.django.newsletter.models import Contact, ContactSettings from emencia.django.newsletter.models import Contact, ContactSettings
from emencia.django.newsletter.models import MailingList from emencia.django.newsletter.models import MailingList
from theme.models import Theme from theme.models import Theme
from country.models import Country, Area
class MailingListSubscriptionForm(forms.ModelForm): class MailingListSubscriptionForm(forms.ModelForm):
@ -64,6 +65,7 @@ class ContactForm(forms.ModelForm):
model = Contact model = Contact
fields = ('email', 'first_name', ) fields = ('email', 'first_name', )
class ContactSettingsForm(forms.ModelForm): class ContactSettingsForm(forms.ModelForm):
theme = forms.MultipleChoiceField(choices=[(str(item.id), item.name) for item in list(Theme.objects.language().all())], theme = forms.MultipleChoiceField(choices=[(str(item.id), item.name) for item in list(Theme.objects.language().all())],
widget=forms.CheckboxSelectMultiple(attrs={'class': 'pr-checkbox'}), required=False) widget=forms.CheckboxSelectMultiple(attrs={'class': 'pr-checkbox'}), required=False)
@ -77,3 +79,9 @@ class ContactSettingsForm(forms.ModelForm):
return Theme.objects.filter(id__in=theme) return Theme.objects.filter(id__in=theme)
else: else:
return Theme.objects.none() return Theme.objects.none()
class ContactFilterForm(forms.Form):
email = forms.EmailField(label=_("Email"), max_length=255)
theme = forms.ChoiceField(label=_("Тематика"), choices = [(t.id, t.name) for t in Theme.objects.language()])
country = forms.ChoiceField(label=_("Страна"), choices = [(c.id, c.name) for c in Country.objects.language().distinct()])
area = forms.ChoiceField(label=_("Страна"), choices = [(c.id, c.name) for c in Country.objects.language().distinct()])

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DetailView from django.views.generic import TemplateView, CreateView, ListView, UpdateView, DetailView, FormView
from django.views.generic.list import MultipleObjectMixin
from django.conf import settings from django.conf import settings
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.forms.formsets import BaseFormSet, formset_factory from django.forms.formsets import BaseFormSet, formset_factory
@ -7,12 +8,61 @@ from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter, Attachment
from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm, AttachmentForm from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm, AttachmentForm
from emencia.django.newsletter.models import Contact, ContactSettings, MailingList, Newsletter
from emencia.django.newsletter.admin_forms import ContactSettingsForm, MailingListForm, NewsletterForm
from ..forms import ContactFilterForm
from functions.admin_views import paginate_results
class ContactList(ListView): class ContactList(FormView):
paginate_by = settings.ADMIN_PAGINATION paginate_by = settings.ADMIN_PAGINATION
model = Contact model = Contact
template_name = 'admin/newsletters/contact_list.html' template_name = 'admin/newsletters/contact_list.html'
form_class = ContactFilterForm
queryset = Contact.objects.all()
def get_form(self, form_class):
if self.request.GET:
return form_class(self.request.GET)
else:
return form_class(**self.get_form_kwargs())
def get(self, request, *args, **kwargs):
if request.GET:
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
else:
return super(ContactList, self).get(request, *args, **kwargs)
def form_valid(self, form):
"""
filtering queryset and return paginated results
"""
qs = form.filter()
result = paginate_results(qs, page=self.request.GET.get('page'))
context = self.get_context_data(form=form)
context.update({'object_list': result})
return self.render_to_response(context)
def get_context_data(self, **kwargs):
context = super(ContactList, self).get_context_data(**kwargs)
qs = self.model.objects.all()
result = paginate_results(qs, page=self.request.GET.get('page'))
context['object_list'] = result
return context
class UpdateContact(UpdateView): class UpdateContact(UpdateView):

@ -142,3 +142,64 @@ class ServiceControl(FormMixin, DetailView):
context = super(ServiceControl, self).get_context_data(**kwargs) context = super(ServiceControl, self).get_context_data(**kwargs)
context['form'] = self.get_form(self.form_class) context['form'] = self.get_form(self.form_class)
return context return context
from django.shortcuts import get_object_or_404
from django.views.generic import UpdateView, ListView, DeleteView
from .forms import LinkedServiceForm
from .models import LinkedService
class LinkedServiceUpdateView(UpdateView):
form_class = LinkedServiceForm
model = LinkedService
template_name = "admin/service/linked_service.html"
success_url = "/admin/service/test/all/"
def get_object(self, queryset=None):
url = self.kwargs['url']
service = get_object_or_404(Service, url=url)
obj = LinkedService.objects.get(service=service)
return obj
def get_initial(self):
types = {0:[], 1:['expo'], 2:['conference'], 3:['expo', 'conference']}
initial = {
'expositions': ",".join("%s:%s"%(item.id, item.name) for item in self.object.expositions.all()),
'conferences': ",".join("%s:%s"%(item.id, item.name) for item in self.object.conferences.all()),
'type': types[self.object.service.type.mask]
}
return initial
def get_success_url(self):
return self.success_url
def form_valid(self, form):
obj = form.save()
obj.countries = form.cleaned_data['countries']
obj.expositions = form.cleaned_data['expositions']
obj.conferences = form.cleaned_data['conferences']
obj.save()
obj.update_all_flags()
return HttpResponseRedirect(self.get_success_url())
class LinkedServiceList(ListView):
model = LinkedService
template_name = 'admin/service/linked_service_list.html'
class LinkedServiceDeleteView(DeleteView):
model = LinkedService
template_name = 'admin/service/linked_service_confirm_delete.html'
success_url = '/admin/service/test/all'
slug_url_kwarg = 'url'
def get_object(self, queryset=None):
url = self.kwargs['url']
service = get_object_or_404(Service, url=url)
obj = LinkedService.objects.get(service=service)
return obj

@ -2,7 +2,7 @@
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 from service.admin import ServiceControlList, ServiceControl, LinkedServiceList, LinkedServiceUpdateView, LinkedServiceDeleteView
urlpatterns = patterns('service.admin', urlpatterns = patterns('service.admin',
url(r'^control/list/$', ServiceControlList.as_view()), url(r'^control/list/$', ServiceControlList.as_view()),
@ -18,8 +18,14 @@ 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('^test/all/', LinkedServiceList.as_view(), name = 'linked_service_all'),
url('^test/(?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'), #url(r'^get_country/$', 'get_country'),
) )

@ -147,3 +147,47 @@ class ServiceControlForm(forms.Form):
widget=forms.CheckboxSelectMultiple(), widget=forms.CheckboxSelectMultiple(),
choices=[(item['service_bit'], item['verbose']) choices=[(item['service_bit'], item['verbose'])
for item in self.event]) for item in self.event])
from .models import LinkedService
from django.db.models.query import EmptyQuerySet
class LinkedServiceForm(forms.ModelForm):
type = forms.MultipleChoiceField(choices = [(x, x) for x in list(Service.type)], widget = forms.CheckboxSelectMultiple, required=False)
expositions = forms.CharField(widget=forms.HiddenInput,required=False)
conferences = forms.CharField(widget=forms.HiddenInput, required=False)
class Meta:
model = LinkedService
fields = ['countries', 'exclude_countries', 'expositions', 'conferences']
help_text = {
'exclude_countries': u'При отсутствии стран этот флаг значит ВСЕ страны!'
}
def clean_countries(self):
countries = Country.objects.language().filter(id__in=self.cleaned_data['countries'])
return countries
def clean_expositions(self):
expositions = EmptyQuerySet()
if self.cleaned_data.get('expositions'):
expositions = Exposition.objects.language().filter(id__in=list(set(self.cleaned_data['expositions'].split(','))))
return expositions
def clean_conferences(self):
conferences = EmptyQuerySet()
if self.cleaned_data.get('conferences'):
conferences = Conference.objects.language().filter(id__in=list(set(self.cleaned_data['conferences'].split(','))))
return conferences
def save(self, commit=True):
obj = super(LinkedServiceForm, self).save(commit=True)
data = self.cleaned_data
# manage service type bit field
types = data['type']
obj.service.type = 0
for type in types:
obj.service.type = obj.service.type | getattr(Service.type, type)
obj.service.save()
return obj

@ -0,0 +1 @@
__author__ = 'dev'

@ -0,0 +1,24 @@
from django.core.management.base import BaseCommand
from django.utils.translation import activate
from service.models import Service,LinkedService
from country.models import Country
from exposition.models import Exposition
from conference.models import Conference
class Command(BaseCommand):
def handle(self, *args, **options):
activate('ru')
LinkedService.objects.all().delete()
services = Service.objects.all()
for service in services:
linked = LinkedService()
linked.service = service
linked.save()
if Country.objects.language().filter(services=getattr(Country.services, service.url)).count() > 180:
linked.exclude_countries = True
linked.countries = Country.objects.language().exclude(services=getattr(Country.services, service.url))
else:
linked.countries = Country.objects.language().filter(services=getattr(Country.services, service.url))
linked.save()

@ -199,3 +199,44 @@ class CallBack(models.Model):
class Meta: class Meta:
ordering = ['-created'] ordering = ['-created']
from country.models import Country
from exposition.models import Exposition
from conference.models import Conference
from django.db.models import F
class LinkedService(models.Model):
service = models.ForeignKey(Service, blank=False)
countries = models.ManyToManyField(Country, blank=True, verbose_name=u"Страны")
exclude_countries = models.BooleanField(default=False, verbose_name=u"Исключить страны")
expositions = models.ManyToManyField(Exposition, blank=True, verbose_name= u"Выставки")
conferences = models.ManyToManyField(Conference, blank=True, verbose_name=u'Конференции')
def update_countries_flag(self):
if self.exclude_countries:
'filter all countries except selected and set flag to true'
Country.objects.language().exclude(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitor(getattr(Country.services, self.service.url)))
'set another flags to false'
Country.objects.language().filter(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitand(~getattr(Country.services, self.service.url)))
else:
'if not exclude, filter all selected countries and set flag to true'
self.countries.update(services=F('services').bitor(getattr(Country.services, self.service.url)))
Country.objects.exclude(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitand(~getattr(Country.services, self.service.url)))
def update_expositions_flag(self):
self.expositions.update(services=F('services').bitor(getattr(Exposition.services, self.service.url)))
Exposition.objects.exclude(id__in=[c.id for c in self.expositions.all()]).update(services=F('services').bitand(~getattr(Exposition.services, self.service.url)))
def update_conferences_flag(self):
self.conferences.update(services=F('services').bitor(getattr(Conference.services, self.service.url)))
Conference.objects.exclude(id__in=[c.id for c in self.conferences.all()]).update(services=F('services').bitand(~getattr(Conference.services, self.service.url)))
def update_all_flags(self):
self.update_countries_flag()
self.update_expositions_flag()
self.update_conferences_flag()
def __unicode__(self):
return u'Linked service for %s'%self.service.url

File diff suppressed because one or more lines are too long

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

@ -134,6 +134,13 @@
<span class="help-inline">{{ form.place.errors }}</span> <span class="help-inline">{{ form.place.errors }}</span>
</div> </div>
</div> </div>
{# place_alt #}
<div class="control-group {% if form.place_alt.errors %}error{% endif %}">
<label class="control-label">{{ form.place_alt.label }}:</label>
<div class="controls">{{ form.place_alt }}
<span class="help-inline">{{ form.place_alt.errors }}</span>
</div>
</div>
{# theme #} {# theme #}
<div class="control-group {% if form.theme.errors %}error{% endif %}"> <div class="control-group {% if form.theme.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.theme.label }}:</b></label> <label class="control-label"><b>{{ form.theme.label }}:</b></label>

@ -47,7 +47,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> Основная информация</h2> <h2><i class="icon-pencil"></i> Основная информаdция</h2>
</div> </div>
<div class="box-content"> <div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #} {# Hidden inputs uses for comparing with TmpFile objects #}
@ -99,6 +99,14 @@
<span class="help-inline">{{ form.place.errors }}</span> <span class="help-inline">{{ form.place.errors }}</span>
</div> </div>
</div> </div>
{# place #}
<div class="control-group {% if form.place_alt.errors %}error{% endif %}">
<label class="control-label">{{ form.place_alt.label }}:</label>
<div class="controls">{{ form.place_alt }}
<span class="help-inline">{{ form.place_alt.errors }}</span>
</div>
</div>
{# theme #} {# theme #}
<div class="control-group {% if form.theme.errors %}error{% endif %}"> <div class="control-group {% if form.theme.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.theme.label }}:</b></label> <label class="control-label"><b>{{ form.theme.label }}:</b></label>

@ -40,6 +40,7 @@
<li><a href="/admin/country/all">Страна</a></li> <li><a href="/admin/country/all">Страна</a></li>
<li><a href="/admin/city/all">Город</a></li> <li><a href="/admin/city/all">Город</a></li>
<li><a href="/admin/theme/theme/all">Тематики</a></li> <li><a href="/admin/theme/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="/admin/settings/main-page/">Главная страница</a></li> <li><a href="/admin/settings/main-page/">Главная страница</a></li>

@ -2,13 +2,70 @@
{% block body %} {% block body %}
<div class="box span10"> <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>
<div class="box-content"> <div class="box-content">
<form class="form-horizontal" method="get">
<fieldset>
<!-- Form Name -->
<legend>Filter subscribers</legend>
<!-- Search input-->
<div class="control-group">
<label class="control-label" for="id_email">{{ form.email.label }}</label>
<div class="controls">
{# <input id="Email" name="Email" type="text" placeholder="Email"#}
{# class="input-xlarge search-query">#}
{{ form.email }}
</div>
</div>
<!-- Select Basic -->
<div class="control-group">
<label class="control-label" for="id_theme">{{ form.theme.label }}</label>
<div class="controls">
{{ form.theme }}
</div>
</div>
<!-- Select Basic -->
<div class="control-group">
<label class="control-label" for="id_country">{{ form.id_country }}</label>
<div class="controls">
{{ form.country }}
</div>
</div>
<!-- Select Basic -->
<div class="control-group">
<label class="control-label" for="id_area">{{ form.area.label }}</label>
<div class="controls">
{{ form.area }}
</div>
</div>
<!-- Button -->
<div class="control-group">
<label class="control-label" for="submit"></label>
<div class="controls">
<button id="submit" name="submit" class="btn btn-info">Filter</button>
</div>
</div>
</fieldset>
</form>
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>

@ -0,0 +1,142 @@
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<style>
ul {
list-style: none;
}
</style>
<script src="{% static 'js/select/select2.js' %}"></script>
<script>
$(document).ready(function () {
console.log(1);
$('#id_expositions').select2({
placeholder: "Expositions",
width: 'element',
multiple: true,
ajax: {
url: "/admin/exposition/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 data = [];
var values = element.val();
element.val("");
$(values.split(",")).each(function (i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
console.log("initselection data: ");
console.log(data);
callback(data);
}
});
$('#id_conferences').select2({
placeholder: "Conferences",
width: 'element',
multiple: true,
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 data = [];
var values = element.val();
element.val("");
$(values.split(",")).each(function (i) {
var item = this.split(':');
data.push({
id: item[0],
text: item[1]
});
});
callback(data);
}
});
});
</script>
{% endblock %}
{% block body %}
{# Uses multilang.html template for translated fields #}
<form class="form-horizontal" method="post" action="">{% csrf_token %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
{% for f in form %}
<div class="control-group {% if f.errors %}error{% endif %}">
<label class="control-label"><b>{{ f.label }}:</b></label>
<div class="controls">{{ f }}
<span class="help-inline">{{ f.errors }}</span>
</div>
</div>
{% 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>
</form>
{% endblock %}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить настройку для сервиса "{{ object.service.name }}" ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'linked_service_all' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -0,0 +1,48 @@
{% extends 'base.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>Тип</th>
<th>Стран</th>
<th>Виставок</th>
<th>Конференций</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{{ object }}
{% for item in object_list %}
<tr>
<td>{{ item.id }}</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>{{ item.countries.count }}</td>
<td>{{ item.expositions.count }}</td>
<td>{{ item.conferences.count }}</td>
<td class="center sorting_1">
<a class="btn btn-info" href="{% url 'linked_service_update' item.service.url %}">
<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>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}

@ -48,7 +48,7 @@
{% include 'admin/forms/multilang.html' %} {% include 'admin/forms/multilang.html' %}
{% endwith %} {% endwith %}
{# url #} {# url #}
<div class="control-group {% if form.url.errors %}error{% endif %}"> <div class="control-group {% if form.url.errors %}error{% endif %}">
<label class="control-label">{{ form.url.label }}:</label> <label class="control-label">{{ form.url.label }}:</label>
<div class="controls"> <div class="controls">
{{ form.url }} {{ form.url }}

@ -0,0 +1,11 @@
{% extends 'base.html' %}
{% block sidebar %}{% endblock %}
{% block body %}
<form action="" method="post">{% csrf_token %}
<div class="controls">
<p>Вы точно хотите удалить "{{ object.name }}" ?</p>
<input class="btn btn-large btn-danger delete" type="submit" value="Да" />
<a class="btn btn-large btn-primary" href = {% url 'theme_blog_all' %}>Нет</a>
</div>
</form>
{% endblock %}

@ -0,0 +1,65 @@
{% 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">#}
{# <form>#}
{# {{ form }}#}
{##}
{# <button type="submit" class="btn">Найти</button>#}
{# </form>#}
{# </div>#}
{##}
{#</div>#}
<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">
<colgroup>
<col width="10%">
<col width="70%">
<col width="10%">
<col width="10%">
</colgroup>
<thead>
<tr>
<th>id</th>
<th>Название</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href="{% url "theme_blog_change" item.id %}">
Изменить
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href="{% url "theme_blog_delete" item.id %}">
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="{% url "theme_blog_new" %}"><i class="icon-plus-sign icon-white"></i> Добавить тематику</a>
</div>
{# pagination #}
{% include 'admin/includes/admin_pagination.html' with page_obj=object_list %}
</div>
{% endblock %}

@ -0,0 +1,49 @@
{% extends 'base.html' %}
{% load static %}
{% block scripts %}
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script>
{# selects #}
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/>
<script src="{% static 'js/select/select2.js' %}"></script>
<script src="{% static 'custom_js/make_select.js' %}"></script>
{% endblock %}
{% block body %}
<form method="post" class="form-horizontal"> {% csrf_token %}{{ form.errors }}
<fieldset>
<legend><i class="icon-edit"></i>{% if object %} Изменить {% else %} Добавить {% endif %}тему</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Информация</h2>
</div>
<div class="box-content">
{% for field in form %}
<div {% if object and forloop.first %} style="display:none;"{% endif %} class="control-group {% if field.errors %}error{% endif %}">
<label class="control-label">{{ field.label }}:</label>
<div class="controls">
{{ field }}
<span class="help-inline">{{ field.errors }}</span>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="controls">
<input class="btn btn-large btn-primary" type="submit" value="Добавить">
<input class="btn btn-large" type="reset" value="Отмена">
</div>
</fieldset>
</form>
{% endblock %}

@ -19,7 +19,7 @@
{% include 'client/includes/article/article_logo.html' with obj=object %} {% include 'client/includes/article/article_logo.html' with obj=object %}
<h1>{{ object.main_title }}</h1> <h1>{{ object.main_title }}</h1>
<strong><span>{{ object.publish_date|date:"d E Y" }}</span>{% if object.theme.all.exists %}{% include 'includes/article_theme.html' with obj=object %}{% endif %}</strong> <strong><span>{{ object.publish_date|date:"d E Y" }}</span>{% if object.blog_theme.all.exists %}{% include 'client/includes/article_theme.html' with obj=object %}{% endif %}</strong>
{% if request.user.is_admin %} {% if request.user.is_admin %}
<a target="_blank" class="button green " href="/admin/article/blog/{{ object.slug }}/">{% trans 'изменить' %}</a> <a target="_blank" class="button green " href="/admin/article/blog/{{ object.slug }}/">{% trans 'изменить' %}</a>
{% endif %} {% endif %}
@ -53,7 +53,7 @@
<a href="{{ blog.get_permanent_url }}" title="">{% include 'includes/show_logo.html' with obj=blog %}</a> <a href="{{ blog.get_permanent_url }}" title="">{% include 'includes/show_logo.html' with obj=blog %}</a>
<h3><a href="{{ blog.get_permanent_url }}" title="">{{ blog.main_title }}</a></h3> <h3><a href="{{ blog.get_permanent_url }}" title="">{{ blog.main_title }}</a></h3>
<p>{{ blog.preview }}</p> <p>{{ blog.preview }}</p>
<strong><span>{{ blog.created|date:"d E Y" }}</span><a href="{{ blog.author.get_permanent_url }}" title=""><i>Евгения Булавина</i></a></strong> <strong><span>{{ blog.publish_date|date:"d E Y" }}</span><a href="{{ blog.author.get_permanent_url }}" title=""><i>Евгения Булавина</i></a></strong>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

@ -2,7 +2,7 @@
<div class="ied-text" style="text-align: justify"> <div class="ied-text" style="text-align: justify">
{% blocktrans with name=conf.name%} {% blocktrans with name=conf.name%}
<p>Конференция {{name}} проходит {% endblocktrans %}{% include 'client/includes/show_date_block.html' with obj=conf %} <p>Конференция {{name}} проходит {% endblocktrans %}{% include 'client/includes/show_date_block.html' with obj=conf %}
{% blocktrans with city=conf.name country=country.name name=conf.name id=conf.city.id code=request.LANGUAGE_CODE date1=conf.data_begin|date:'j' date2=conf.data_begin|date:'Y' date3=conf.data_begin|date:'n' date4=conf.data_end|date:'j' date5=conf.data_end|date:'Y' date6=conf.data_end|date:'n' %} {% blocktrans with city=city.name country=country.name name=conf.name id=conf.city.id code=request.LANGUAGE_CODE date1=conf.data_begin|date:'j' date2=conf.data_begin|date:'Y' date3=conf.data_begin|date:'n' date4=conf.data_end|date:'j' date5=conf.data_end|date:'Y' date6=conf.data_end|date:'n' %}
в городе {{city}}, {{country}}. в городе {{city}}, {{country}}.
Посмотреть, как проехать в место проведения конференции, можно на сайте конгрессной площадки. Посмотреть, как проехать в место проведения конференции, можно на сайте конгрессной площадки.
Деловая программа {{name}} разбита на секции по дням и размещается на сайте мероприятия с подробным списком Деловая программа {{name}} разбита на секции по дням и размещается на сайте мероприятия с подробным списком

@ -3,15 +3,13 @@ from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse from django.http import HttpResponseRedirect, HttpResponse
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.forms.formsets import BaseFormSet, formset_factory from django.views.generic import CreateView, UpdateView, DeleteView
from django.forms.models import modelformset_factory
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
#forms and models #forms and models
from forms import ThemeForm, TagForm, ThemeDeleteForm, TagDeleteForm, TagFilterForm, ThemeFilterForm from forms import ThemeForm, TagForm, ThemeDeleteForm, TagDeleteForm, TagFilterForm, ThemeFilterForm
from models import Theme, Tag from models import Theme, Tag, ThemeBlog
#custom views #custom views
from functions.custom_views import objects_list, add_object, delete_object from functions.custom_views import objects_list, add_object, delete_object, ListView
from functions.views_help import get_referer from functions.views_help import get_referer
from functions.admin_views import AdminListView from functions.admin_views import AdminListView
@ -171,3 +169,36 @@ class TagListView(AdminListView):
template_name = 'admin/theme/tag_list.html' template_name = 'admin/theme/tag_list.html'
form_class = TagFilterForm form_class = TagFilterForm
model = Tag model = Tag
from functions.custom_views import ListView
from django.core.urlresolvers import reverse_lazy
from .forms import ThemeBlogForm
class ThemeBlogListView(ListView):
template_name = 'admin/theme/theme_blog_list.html'
model = ThemeBlog
paginate_by = settings.ADMIN_PAGINATION
class ThemeBlogCreateView(CreateView):
template_name = "admin/theme/theme_blog_new.html"
model = ThemeBlog
form_class = ThemeBlogForm
success_url = reverse_lazy("theme_blog_all")
class ThemeBlogUpdateView(UpdateView):
template_name = "admin/theme/theme_blog_new.html"
model = ThemeBlog
form_class = ThemeBlogForm
success_url = reverse_lazy("theme_blog_all")
pk_url_kwarg = "theme_id"
class ThemeBlogDeleteView(DeleteView):
template_name = "admin/theme/theme_blog_confirm_delete.html"
model = ThemeBlog
success_url = reverse_lazy("theme_blog_all")
pk_url_kwarg = "theme_id"

@ -1,19 +1,25 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url from django.conf.urls import patterns, include, url
from admin import TagListView, ThemeListView from admin import TagListView, ThemeListView
from .admin import ThemeBlogCreateView, ThemeBlogUpdateView, ThemeBlogDeleteView, ThemeBlogListView
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'^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'^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'^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'),
#url(r'^theme/all/$', 'theme_all'), #url(r'^theme/all/$', 'theme_all'),
#url(r'^tag/all/$', 'tag_all'), #url(r'^tag/all/$', 'tag_all'),
url(r'^theme/all/$', ThemeListView.as_view()), url(r'^theme/all/$', ThemeListView.as_view()),
url(r'^blog_theme/all/$', ThemeBlogListView.as_view(), name="theme_blog_all"),
url(r'^tag/all/$', TagListView.as_view()), url(r'^tag/all/$', TagListView.as_view()),
url(r'^tag/search/$', 'search_tag'), url(r'^tag/search/$', 'search_tag'),
url(r'^tag/search-without-theme/$', 'search2'), url(r'^tag/search-without-theme/$', 'search2'),

@ -144,3 +144,18 @@ class ThemeFilterForm(AdminFilterForm):
class TagFilterForm(AdminFilterForm): class TagFilterForm(AdminFilterForm):
model = Tag model = Tag
from hvad.forms import TranslatableModelForm
from .models import ThemeBlog
class ThemeBlogForm(TranslatableModelForm):
class Meta:
model = ThemeBlog
fields = ['url', 'name', 'main_title', 'description', 'inflect']
widgets = {'url':forms.TextInput(attrs={'required':False})}
def save(self, commit= True):
if not 'url' in self.cleaned_data:
self.cleaned_data['url'] = translit_with_separator(self.cleaned_data['name'])
return super(ThemeBlogForm, self).save(commit=True)

@ -133,6 +133,30 @@ class Theme(TranslatableModel):
parent = {} parent = {}
return parent return parent
class ThemeBlog(TranslatableModel):
url = models.SlugField(unique=True, max_length=255)
translations = TranslatedFields(
name=models.CharField(max_length=255),
main_title=models.CharField(max_length=255, blank=True),
description=models.TextField(blank=True)
)
inflect = models.CharField(max_length=255, blank=True)
def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk))
def get_all_names(self):
return [item['name'] for item in self.translations.all().values('name')]
def get_index_text(self):
translation.activate('ru')
return ' '.join(self.get_all_names())
from django.db import IntegrityError from django.db import IntegrityError
class Tag(TranslatableModel): class Tag(TranslatableModel):
""" """

@ -21,11 +21,8 @@ def get_tag(request):
def get_article_tags(request): def get_article_tags(request):
themes = request.GET.getlist('themes[]')
term = request.GET['term'].capitalize() term = request.GET['term'].capitalize()
qs = Tag.objects.language().exclude(article=None).filter(article__type=1).distinct() qs = Tag.objects.language().exclude(article=None).filter(article__type=1).distinct()
if themes:
qs = qs.filter(theme__id__in=themes).order_by('translations__name')
if term: if term:
qs = qs.filter(translations__name__contains=term) qs = qs.filter(translations__name__contains=term)
result = [{'id': tag.id, 'label': '%s (%s)'%(tag.name, tag.theme.name)} for tag in qs] result = [{'id': tag.id, 'label': '%s (%s)'%(tag.name, tag.theme.name)} for tag in qs]

Loading…
Cancel
Save