diff --git a/article/admin.py b/article/admin.py index 70698ca5..0ba6754c 100644 --- a/article/admin.py +++ b/article/admin.py @@ -171,10 +171,7 @@ class BlogView(FormView): article = self.obj data = {} data['slug'] = article.slug - if self.obj.type == Article.blog: - data['theme'] = [item.id for item in article.blog_theme.all()] - else: - data['theme'] = [item.id for item in article.theme.all()] + data['theme'] = [item.id for item in article.theme.all()] if article.exposition: data['exposition'] = article.exposition.id if article.conference: diff --git a/article/forms.py b/article/forms.py index 9fc5304c..d5c265dd 100644 --- a/article/forms.py +++ b/article/forms.py @@ -9,15 +9,19 @@ from functions.files import check_tmp_files from functions.form_check import translit_with_separator from models import Article from accounts.models import User -from theme.models import Theme, Tag, ThemeBlog +from theme.models import Theme, Tag from exposition.models import Exposition from conference.models import Conference class _BlogForm(forms.Form): type = Article.blog - theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=ThemeBlog.objects.all(), required=False, - widget=forms.SelectMultiple(attrs={'style':'width: 550px'})) + theme = forms.ModelMultipleChoiceField( + label='Тематики', + queryset=Theme.objects.filter(types=Theme.types.article), + required=False, + widget=forms.SelectMultiple(attrs={'style':'width: 550px'}) + ) slug = forms.SlugField(label=u'URL', max_length=255, min_length=1, 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) @@ -63,12 +67,8 @@ class _BlogForm(forms.Form): # fill translated fields and save object fill_with_signal(Article, article, data) # fill manytomany fields - 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.theme.clear() + article.theme.add(*Theme.objects.filter(id__in=data['theme'])) article.tag.clear() article.tag.add(*Tag.objects.filter(id__in=data['tag'])) #for item in data['theme']: @@ -301,9 +301,11 @@ class BlogFilterForm(forms.Form): create dynamical translated fields fields """ super(BlogFilterForm, self).__init__(*args, **kwargs) - ids = set([item['blog_theme'] for item in list(Article.objects.blogs().filter(blog_theme__isnull=False).values('blog_theme'))]) - self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, - choices=[(item.id, item.name) for item in ThemeBlog.objects.language().filter(id__in=ids)]) + ids = set(Article.objects.filter(type=Article.blog, theme__isnull=False).values_list('theme', flat=True)) + # ids = set([item['theme'] for item in list(Article.objects.blogs().filter(theme__isnull=False).values('theme'))]) + self.fields['theme'] = forms.MultipleChoiceField(label=_(u'Тематика:'), + required=False, + choices=[(item.id, item.name) for item in Theme.objects.language().filter(id__in=ids)]) class NewsFilterForm(forms.Form): diff --git a/article/models.py b/article/models.py index bf6d7079..7532986a 100644 --- a/article/models.py +++ b/article/models.py @@ -31,7 +31,6 @@ class Article(TranslatableModel): old_id = models.IntegerField(verbose_name=_(u'Id из старой базы'), blank=True, null=True) logo = ImageField(verbose_name=_(u'Логотип'), upload_to='articles_preview', blank=True) theme = models.ManyToManyField('theme.Theme', verbose_name=_(u'Тематики')) - blog_theme = models.ManyToManyField('theme.ThemeBlog', verbose_name=_(u'Тематики для блогов'), ) tag = models.ManyToManyField('theme.Tag', blank=True, null=True, verbose_name=_(u'Теги'), ) author = models.ForeignKey('accounts.User', verbose_name=_(u'Автор'), on_delete=models.PROTECT, related_name='articles') diff --git a/article/views.py b/article/views.py index bea635c3..6e6122ea 100644 --- a/article/views.py +++ b/article/views.py @@ -7,7 +7,7 @@ from django.utils.translation import ugettext as _ from functions.custom_views import ListView from models import Article from forms import BlogFilterForm, NewsFilterForm -from theme.models import Tag, ThemeBlog +from theme.models import Tag, Theme from meta.views import MetadataMixin @@ -80,7 +80,7 @@ class BlogList(MetadataMixin, ListView): themes = self.request.GET.getlist('theme') if themes: - qs = qs.filter(blog_theme__id__in=themes) + qs = qs.filter(theme__id__in=themes) tags = self.request.GET.getlist('tag') if u'' in tags: @@ -192,10 +192,10 @@ class BlogsFilterCatalog(MetadataMixin, ListView): self.filter_object = tag qs = Article.objects.blogs().filter(tag=tag) else: - theme = get_object_or_404(ThemeBlog, url=slug) + theme = get_object_or_404(Theme, url=slug) self.kwargs['theme'] = theme self.filter_object = theme - qs = Article.objects.blogs().filter(blog_theme = theme) + qs = Article.objects.blogs().filter(theme=theme) year = self.kwargs.get('year') if year: diff --git a/templates/admin/includes/admin_nav.html b/templates/admin/includes/admin_nav.html index 1b0347e3..6dae6a4e 100644 --- a/templates/admin/includes/admin_nav.html +++ b/templates/admin/includes/admin_nav.html @@ -41,7 +41,7 @@
  • Страна
  • Город
  • Тематики
  • -
  • Тематики для блогов
  • + {#
  • Тематики для блогов
  • #}
  • Теги
  • Услуги
  • Управление услугами
  • diff --git a/templates/admin/theme/theme_add.html b/templates/admin/theme/theme_add.html index 1131164b..347e2c37 100644 --- a/templates/admin/theme/theme_add.html +++ b/templates/admin/theme/theme_add.html @@ -35,15 +35,6 @@ {{ form.types.errors }} - {# blogtheme_linking #} -
    - -
    - {{ form.blogtheme_linking }} - {{ form.blogtheme_linking.errors }} -

    {{ form.blogtheme_linking.help_text }}

    -
    -
    {# main_title #} {% with field='main_title' form=form languages=languages %} {% include 'admin/forms/multilang.html' %} diff --git a/templates/client/article/article.html b/templates/client/article/article.html index 9b6050e9..b2a7ca5f 100644 --- a/templates/client/article/article.html +++ b/templates/client/article/article.html @@ -19,7 +19,7 @@ {% include 'client/includes/article/article_logo.html' with obj=object %}

    {{ object.main_title }}

    - {{ object.publish_date|date:"d E Y" }}{% if object.blog_theme.all.exists %}{% include 'client/includes/article_theme.html' with obj=object %}{% endif %} + {{ object.publish_date|date:"d E Y" }}{% if object.theme.all.exists %}{% include 'client/includes/article_theme.html' with obj=object %}{% endif %} {% if request.user.is_admin %} {% trans 'изменить' %} {% endif %} diff --git a/templates/client/includes/article_theme.html b/templates/client/includes/article_theme.html index 039ee796..0a02a1f2 100644 --- a/templates/client/includes/article_theme.html +++ b/templates/client/includes/article_theme.html @@ -1,6 +1,6 @@ -{% with theme=obj.blog_theme.all %} - {% for theme in obj.blog_theme.all %} +{% with theme=obj.theme.all %} + {% for theme in obj.theme.all %} {{ theme.name }}{% if forloop.counter != themes|length %},{% endif %} {% endfor %} -{% endwith %} \ No newline at end of file +{% endwith %} diff --git a/theme/admin.py b/theme/admin.py index 30d7886a..5f92fd5b 100644 --- a/theme/admin.py +++ b/theme/admin.py @@ -1,4 +1,4 @@ -#custom views +# -*- coding: utf-8 -*- import json from django.conf import settings @@ -8,16 +8,6 @@ from django.core.urlresolvers import reverse_lazy from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import render_to_response from django.views.generic import CreateView, DeleteView, UpdateView -# -*- coding: utf-8 -*- -#forms and models -from forms import ( - TagDeleteForm, - TagFilterForm, - TagForm, - ThemeDeleteForm, - ThemeFilterForm, - ThemeForm -) from functions.admin_views import AdminListView from functions.custom_views import ( ListView, @@ -27,8 +17,15 @@ from functions.custom_views import ( ) from functions.views_help import get_referer -from .forms import ThemeBlogForm -from .models import Tag, Theme, ThemeBlog +from .forms import ( + TagDeleteForm, + TagFilterForm, + TagForm, + ThemeDeleteForm, + ThemeFilterForm, + ThemeForm +) +from .models import Tag, Theme def theme_all(request): @@ -42,15 +39,19 @@ def tag_all(request): def theme_add(request): return add_object(request, ThemeForm, 'theme_add.html', '/admin/theme/theme/all') + def tag_add(request): return add_object(request, TagForm, 'tag_add.html', '/admin/theme/tag/all') + def theme_delete(request, theme_id): return delete_object(request, Theme, ThemeDeleteForm, theme_id, '/admin/theme/theme/all') + def tag_delete(request, tag_id): return delete_object(request, Tag, TagDeleteForm, tag_id, '/admin/theme/tag/all') + @login_required def theme_copy(request, theme_id): @@ -71,6 +72,7 @@ def tag_copy(request, tag_id): tag.clone() return HttpResponseRedirect(get_referer(request)) + @login_required def theme_change(request, theme_id=None): try: @@ -86,8 +88,6 @@ def theme_change(request, theme_id=None): data = {} #bitfeild data['types'] = [item for item, bool in theme.types if bool==True] - data['blogtheme_linking'] = theme.blogtheme_linking - #data from translated fields for code, name in settings.LANGUAGES: @@ -112,6 +112,7 @@ def theme_change(request, theme_id=None): return render_to_response('theme_add.html', args) + @login_required def tag_change(request, tag_id=None): try: @@ -185,66 +186,3 @@ class TagListView(AdminListView): template_name = 'admin/theme/tag_list.html' form_class = TagFilterForm model = Tag - - - - -class ThemeBlogListView(ListView): - template_name = 'admin/theme/theme_blog_list.html' - model = ThemeBlog - paginate_by = settings.ADMIN_PAGINATION - - -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" - - -def blog_theme_add(request): - return add_object(request, ThemeBlogForm, 'theme_blog_new.html', reverse_lazy("theme_blog_all")) - -@login_required -def blog_theme_change(request, theme_id=None): - try: - theme = ThemeBlog.objects.get(id=theme_id) - except: - return HttpResponseRedirect('theme_blog_all') - if request.POST: - form = ThemeBlogForm(request.POST) - if form.is_valid(): - form.save(theme_id) - return HttpResponseRedirect(reverse_lazy("theme_blog_all")) - else: - data = {} - for code, name in settings.LANGUAGES: - obj = ThemeBlog._meta.translations_model.objects.get(language_code = code,master__id=theme_id) #access to translated fields - data['name_%s'%code] = obj.name - data['description_%s'%code] = obj.description - data['main_title_%s'%code] = obj.main_title - form = ThemeBlogForm(data) - args = {} - args.update(csrf(request)) - args['form'] = form - args['languages'] = settings.LANGUAGES - args['theme_id'] = theme_id - - return render_to_response('admin/theme/theme_blog_new.html', args) - - - -# ====================================================== -class ThemeBlogUpdateView(UpdateView): - 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 ThemeBlogCreateView(CreateView): - template_name = "admin/theme/theme_blog_new.html" - model = ThemeBlog - form_class = ThemeBlogForm - success_url = reverse_lazy("theme_blog_all") diff --git a/theme/admin_urls.py b/theme/admin_urls.py index 423c6dc4..395ed46a 100644 --- a/theme/admin_urls.py +++ b/theme/admin_urls.py @@ -1,26 +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 +from django.conf.urls import include, patterns, url +from .admin import TagListView, ThemeListView urlpatterns = patterns('theme.admin', + # add url(r'^theme/add.*/$', 'theme_add'), url(r'^tag/add.*/$', 'tag_add'), - url(r'^blog_theme/add/$', 'blog_theme_add', name = 'theme_blog_new'), + # delete url(r'^theme/delete/(?P\d+)/$', 'theme_delete'), url(r'^tag/delete/(?P\d+)/$', 'tag_delete'), - url(r'^blog_theme/delete/(?P\d+)/$', ThemeBlogDeleteView.as_view(), name = 'theme_blog_delete'), + # change url(r'^theme/change/(?P\d+).*/$', 'theme_change'), - url(r'^blog_theme/change/(?P\d+).*/$', 'blog_theme_change', name= "theme_blog_change"), url(r'^tag/change/(?P\d+).*/$', 'tag_change'), + # copy url(r'^theme/copy/(?P\d+).*/$', 'theme_copy'), url(r'^tag/copy/(?P\d+).*/$', 'tag_copy'), - #url(r'^theme/all/$', 'theme_all'), - #url(r'^tag/all/$', 'tag_all'), + # 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()), + # search url(r'^tag/search/$', 'search_tag'), url(r'^tag/search-without-theme/$', 'search2'), ) diff --git a/theme/forms.py b/theme/forms.py index 1c9e2831..a344c5ed 100644 --- a/theme/forms.py +++ b/theme/forms.py @@ -10,15 +10,11 @@ from functions.form_check import translit_with_separator from functions.translate import fill_with_signal from hvad.forms import TranslatableModelForm -from .models import Tag, Theme, ThemeBlog +from .models import Tag, Theme class ThemeForm(forms.Form): types = forms.MultipleChoiceField(label='Тип', required=False, choices=Theme.FLAGS, widget=forms.CheckboxSelectMultiple()) - blogtheme_linking = forms.ModelChoiceField( - label=u'тема для блога', queryset=ThemeBlog.objects.all(), cache_choices=True, required=False, - help_text=u'''Выберите тему для блога, которая будет заменена на текущую тему.''' - u''' После миграции данных это поле будет удалено, а у всех статей у которых указана выбранная тема, будет заменена на текущую.''') def __init__(self, *args, **kwargs): super(ThemeForm, self).__init__(*args, **kwargs) @@ -60,7 +56,6 @@ class ThemeForm(forms.Form): #generates bitfield flag = reduce(lambda x,y: x|y, (getattr(Theme.types, item) for item in data['types'])) theme.types = flag - theme.blogtheme_linking = data['blogtheme_linking'] if theme.pk and theme.url: theme.save() @@ -148,45 +143,3 @@ class ThemeFilterForm(AdminFilterForm): class TagFilterForm(AdminFilterForm): model = Tag - - -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) - - -class ThemeBlogForm(forms.Form): - - def __init__(self, *args, **kwargs): - super(ThemeBlogForm, self).__init__(*args, **kwargs) - # creates translated form fields, example: name_ru, name_en - # len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs - if len(settings.LANGUAGES) in range(10): - for lid, (code, name) in enumerate(settings.LANGUAGES): - # using enumerate for detect iteration number - # first iteration is a default lang so it required fields - required = True if lid == 0 else False - self.fields['name_%s' % code] = forms.CharField(label='Название', required=required) - self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required) - self.fields['description_%s' % code] = forms.CharField(label='Описание', required=False, widget=CKEditorWidget)#with saving form - - def save(self, id=None): - data = self.cleaned_data - if not id: - theme = ThemeBlog() - else: - theme = ThemeBlog.objects.get(id=id) - if not getattr(theme, 'url'): - theme.url = translit_with_separator(data['name_ru'].strip()).lower() - - fill_with_signal(ThemeBlog, theme, data) - if not theme.url: - theme.url = translit_with_separator(theme.name) - theme.save() diff --git a/theme/management/commands/themeblog_to_blog.py b/theme/management/commands/themeblog_to_blog.py deleted file mode 100644 index 4a720ec9..00000000 --- a/theme/management/commands/themeblog_to_blog.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.core.management.base import BaseCommand, CommandError -from theme.models import Theme, ThemeBlog -from article.models import Article - - -class Command(BaseCommand): - def handle(self, *args, **options): - for article in Article.objects.filter(type=Article.blog).prefetch_related('blog_theme'): - blogthemes = article.blog_theme.all().values_list('id', flat=True) - themes = Theme.objects.filter( - types=Theme.types.article, - blogtheme_linking_id__in=blogthemes) - article.theme.clear() - article.theme.add(*themes) diff --git a/theme/models.py b/theme/models.py index 04e1a986..69d1f3db 100644 --- a/theme/models.py +++ b/theme/models.py @@ -43,8 +43,6 @@ class Theme(TranslatableModel): url = models.SlugField(unique=True, max_length=255) old_url = models.SlugField(unique=True, max_length=255) types = BitField([k for k, v in FLAGS]) - blogtheme_linking = models.ForeignKey('ThemeBlog', verbose_name=u'тема для блога', null=True, default=None, - help_text=u'Выберите тему для блога, которая будет заменена на текущую тему') #translated fields translations = TranslatedFields( name = models.CharField(max_length=255), @@ -142,29 +140,6 @@ class Theme(TranslatableModel): 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()) - - class Tag(TranslatableModel): """ Create Tag model @@ -271,7 +246,6 @@ def pre_save_handler(sender, **kwargs): pre_save.connect(pre_save_handler, sender=Tag) post_save.connect(post_save_handler, sender=Theme) -post_save.connect(post_save_handler, sender=ThemeBlog) post_save.connect(post_save_handler, sender=Tag)