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. 10
      emencia/django/newsletter/forms.py
  8. 54
      emencia/django/newsletter/views/admin_views.py
  9. 63
      service/admin.py
  10. 8
      service/admin_urls.py
  11. 46
      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. 43
      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. 43
      theme/admin.py
  32. 6
      theme/admin_urls.py
  33. 17
      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)
#-----------------------
from django.views.generic import ListView, FormView
from django.views.generic import FormView
from functions.custom_views import ListView
from forms import BlogForm
class BlogList(ListView):
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):
return self.model.objects.blogs()
@ -140,6 +142,7 @@ class BlogList(ListView):
context['blog_flag'] = True
return context
class BlogView(FormView):
form_class = BlogForm
template_name = 'article/blog_form.html'
@ -160,7 +163,6 @@ class BlogView(FormView):
form.save(author, article=self.obj)
return HttpResponseRedirect(self.success_url)
def get_form(self, form_class):
if self.request.POST:
return super(BlogView, self).get_form(form_class)
@ -168,7 +170,8 @@ class BlogView(FormView):
if self.obj:
article = self.obj
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:
data['exposition'] = article.exposition.id
if article.conference:

@ -12,18 +12,20 @@ from functions.form_check import translit_with_separator
#models
from models import Article
from accounts.models import User
from theme.models import Theme, Tag
from theme.models import Theme, Tag, ThemeBlog
from exposition.models import Exposition
from conference.models import Conference
class BlogForm(forms.Form):
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'}))
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)
tag = forms.CharField(label=u'Теги', widget=forms.HiddenInput(), required=False)
logo = forms.ImageField(label=u'Лого', required=False)
def __init__(self, *args, **kwargs):
"""
create dynamical translated fields fields
@ -49,21 +51,26 @@ class BlogForm(forms.Form):
def save(self, author, article=None):
data = self.cleaned_data
#create new Article object or get exists
# create new Article object or get exists
if not article:
article = Article()
article.author = author
article.type = self.type
article.slug = data.get('slug')
if data['logo']:
article.logo = data['logo']
article.publish_date = data['publish_date']
# fill translated fields and save object
fill_with_signal(Article, article, data)
# 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.theme.add(*Theme.objects.filter(id__in=data['theme']))
article.tag.add(*Tag.objects.filter(id__in=data['tag']))
#for item in data['theme']:
# article.theme.add(item.id)#.id cause select uses queryset
@ -92,7 +99,8 @@ class NewsForm(BlogForm):
type = Article.news
exposition = 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())
#conference = forms.ModelChoiceField(label = u'Конференция', required=False, queryset=Conference.objects.all())
@ -258,7 +266,7 @@ class BlogForm(forms.ModelForm):
class ArticleFilterForm(forms.Form):
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)
'''
@ -284,7 +292,7 @@ class BlogFilterForm(forms.Form):
super(BlogFilterForm, self).__init__(*args, **kwargs)
ids = [item['theme'] for item in list(Article.objects.blogs().values('theme').distinct())]
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):

@ -14,7 +14,6 @@ from functions.form_check import translit_with_separator
from django.core.cache import cache
class ArticleManager(TranslationManager):
cache_time = 60
def safe_get(self, **kwargs):
@ -60,7 +59,6 @@ class ArticleManager(TranslationManager):
cache.set(key, blogs, self.cache_time)
return blogs
return list(self.blogs().filter(publish_date__isnull=False).order_by('-main_page', '-publish_date')[:3])
class Article(TranslatableModel):
"""
@ -81,6 +79,7 @@ class Article(TranslatableModel):
old_id = models.IntegerField(blank=True, null=True)
logo = ImageField(upload_to='articles_preview', blank=True)
theme = models.ManyToManyField('theme.Theme')
blog_theme = models.ManyToManyField('theme.ThemeBlog')
tag = models.ManyToManyField('theme.Tag', blank=True, null=True)
author = models.ForeignKey('accounts.User', verbose_name='Автор',
on_delete=models.PROTECT, related_name='articles')
@ -148,15 +147,12 @@ class Article(TranslatableModel):
return self.conference
return None
def save(self, *args, **kwargs):
# If no slug is provided, generates one before saving.
if not self.slug:
self.slug = self.generate_unique_slug()
#Set the description field on save.
#if self.gen_description:
# Set the description field on save.
# if self.gen_description:
# self.description = strip_tags(self.description_from_content())
super(Article, self).save(*args, **kwargs)
@ -189,7 +185,6 @@ class Article(TranslatableModel):
#print 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):
"""
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 models import Article
from forms import ArticleFilterForm
from theme.models import Tag, Theme
from theme.models import Tag, Theme, ThemeBlog
from meta.views import MetadataMixin
@ -71,7 +71,7 @@ class BlogList(MetadataMixin, ListView):
themes = self.request.GET.getlist('theme')
if themes:
qs = qs.filter(theme__id__in=themes)
qs = qs.filter(blog_theme__id__in=themes)
tags = self.request.GET.getlist('tag')
if u'' in tags:
@ -180,10 +180,10 @@ class BlogsFilterCatalog(MetadataMixin, ListView):
self.filter_object = tag
qs = Article.objects.blogs().filter(tag=tag)
else:
theme = get_object_or_404(Theme, url=slug)
theme = get_object_or_404(ThemeBlog, url=slug)
self.kwargs['theme'] = 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')
if year:

@ -159,7 +159,7 @@ def conference_change(request, url):
#initial StatisticFormSet
StatisticFormSet = modelformset_factory(Statistic, form=StatisticForm, exclude=('conference',))
#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,
'tax':conference.tax, 'min_price':conference.min_price, 'max_price':conference.max_price,
'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)
obj = self.set_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,
'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,

@ -56,6 +56,7 @@ class ConferenceCreateForm(forms.Form):
place = forms.ChoiceField(label=u'Место проведения', required=False,
choices=places)
place_alt = forms.CharField(label = u"Альтернативное название места", required=False)
#creates select input with empty choices cause it will be filled with ajax
city = forms.CharField(label=u'Город', widget=forms.HiddenInput())
@ -160,6 +161,7 @@ class ConferenceCreateForm(forms.Form):
conference.canceled = data['canceled']
conference.moved = data['moved']
conference.periodic = data['periodic']
conference.place_alt = data['place_alt']
# generates bitfield
flag = 0
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 MailingList
from theme.models import Theme
from country.models import Country, Area
class MailingListSubscriptionForm(forms.ModelForm):
@ -64,6 +65,7 @@ class ContactForm(forms.ModelForm):
model = Contact
fields = ('email', 'first_name', )
class ContactSettingsForm(forms.ModelForm):
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)
@ -76,4 +78,10 @@ class ContactSettingsForm(forms.ModelForm):
if theme:
return Theme.objects.filter(id__in=theme)
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 -*-
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.http import HttpResponseRedirect
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 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.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
model = Contact
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):

@ -141,4 +141,65 @@ class ServiceControl(FormMixin, DetailView):
def get_context_data(self, **kwargs):
context = super(ServiceControl, self).get_context_data(**kwargs)
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 views import CallBackListView, VisitListView, TranslationListView, AdvertisingListView, \
ParticipationListView, RemoteListView,TicketsListView
from service.admin import ServiceControlList, ServiceControl
from service.admin import ServiceControlList, ServiceControl, LinkedServiceList, LinkedServiceUpdateView, LinkedServiceDeleteView
urlpatterns = patterns('service.admin',
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/remote/$', RemoteListView.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
url(r'^get_city/$', 'get_city'),
#url(r'^get_country/$', 'get_country'),
)

@ -146,4 +146,48 @@ class ServiceControlForm(forms.Form):
self.fields['event_type'] = forms.MultipleChoiceField(required=False, label = 'Тип события',
widget=forms.CheckboxSelectMultiple(),
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()

@ -198,4 +198,45 @@ class CallBack(models.Model):
viewed = models.DateTimeField(null=True, blank=True)
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>
</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 #}
<div class="control-group {% if form.theme.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.theme.label }}:</b></label>

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

@ -47,7 +47,7 @@
<div class="box span8" >
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
<h2><i class="icon-pencil"></i> Основная информаdция</h2>
</div>
<div class="box-content">
{# Hidden inputs uses for comparing with TmpFile objects #}
@ -99,6 +99,14 @@
<span class="help-inline">{{ form.place.errors }}</span>
</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 #}
<div class="control-group {% if form.theme.errors %}error{% endif %}">
<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/city/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/service/all">Услуги</a></li>
<li><a href="/admin/settings/main-page/">Главная страница</a></li>

@ -2,13 +2,70 @@
{% block body %}
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список контактов</h2>
</div>
<div class="box-content">
<div class="box span10">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список контактов</h2>
</div>
<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>
<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' %}
{% endwith %}
{# 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>
<div class="controls">
{{ 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 %}
<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 %}
<a target="_blank" class="button green " href="/admin/article/blog/{{ object.slug }}/">{% trans 'изменить' %}</a>
{% endif %}
@ -53,7 +53,7 @@
<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>
<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>
{% endfor %}

@ -2,7 +2,7 @@
<div class="ied-text" style="text-align: justify">
{% blocktrans with name=conf.name%}
<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}}.
Посмотреть, как проехать в место проведения конференции, можно на сайте конгрессной площадки.
Деловая программа {{name}} разбита на секции по дням и размещается на сайте мероприятия с подробным списком

@ -3,15 +3,13 @@ from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.core.context_processors import csrf
from django.conf import settings
from django.forms.formsets import BaseFormSet, formset_factory
from django.forms.models import modelformset_factory
from django.contrib.contenttypes.models import ContentType
from django.views.generic import CreateView, UpdateView, DeleteView
from django.contrib.auth.decorators import login_required
#forms and models
from forms import ThemeForm, TagForm, ThemeDeleteForm, TagDeleteForm, TagFilterForm, ThemeFilterForm
from models import Theme, Tag
from models import Theme, Tag, ThemeBlog
#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.admin_views import AdminListView
@ -170,4 +168,37 @@ class ThemeListView(AdminListView):
class TagListView(AdminListView):
template_name = 'admin/theme/tag_list.html'
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 -*-
from django.conf.urls import patterns, include, url
from admin import TagListView, ThemeListView
from .admin import ThemeBlogCreateView, ThemeBlogUpdateView, ThemeBlogDeleteView, ThemeBlogListView
urlpatterns = patterns('theme.admin',
url(r'^theme/add.*/$', 'theme_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'^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'^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'^theme/copy/(?P<theme_id>\d+).*/$', 'theme_copy'),
url(r'^tag/copy/(?P<tag_id>\d+).*/$', 'tag_copy'),
#url(r'^theme/all/$', 'theme_all'),
#url(r'^tag/all/$', 'tag_all'),
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/search/$', 'search_tag'),
url(r'^tag/search-without-theme/$', 'search2'),

@ -143,4 +143,19 @@ class ThemeFilterForm(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 = {}
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
class Tag(TranslatableModel):
"""

@ -21,11 +21,8 @@ def get_tag(request):
def get_article_tags(request):
themes = request.GET.getlist('themes[]')
term = request.GET['term'].capitalize()
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:
qs = qs.filter(translations__name__contains=term)
result = [{'id': tag.id, 'label': '%s (%s)'%(tag.name, tag.theme.name)} for tag in qs]

Loading…
Cancel
Save