diff --git a/apps/article/admin.py b/apps/article/admin.py index 9e36cce2..d944a620 100644 --- a/apps/article/admin.py +++ b/apps/article/admin.py @@ -14,7 +14,7 @@ from ckeditor.widgets import CKEditorWidget from sorl.thumbnail.admin.current import AdminImageWidget #models and forms -from .forms import ArticleForm, ArticleDeleteForm, NewsForm +from .forms import NewsForm from .models import Article, Author from theme.models import Tag @@ -48,101 +48,6 @@ class ArticleDeleteView(DeleteView): return "/admin/article/%s/all/" % type -def article_all(request): - """ - Return list of all articles with pagination - """ - return objects_list(request, Article, 'article_all.html') - -@login_required -def article_copy(request, url): - - article = Article.objects.safe_get(slug=url) - if not article: - return HttpResponseRedirect(get_referer(request)) - else: - article.clone() - return HttpResponseRedirect(get_referer(request)) - - -def article_add(request): - """ - Return form of article and post it on the server. - - If form is posted redirect on the page of all articles. - """ - #get organiser from current user - init_data = {'author':request.user.organiser} - #choices field which will be filled by ajax - choices = {'tag': Tag} - return add_object_with_file(request, ArticleForm, 'article_add.html', '/admin/article/all', - choices, init_data) - - -def article_delete(request, url): - return delete_object(request, Article, ArticleDeleteForm, url, '/admin/article/all') - - -@login_required -def article_change(request, url): - """ - Return form and fill it with existing Article object data. - - If form is posted redirect on the page of all articles. - """ - try: - #check if article_id exists else redirect to the list of cities - article = Article.objects.get(slug=url) - file_form = FileModelForm(initial={'model': 'article.Article'}) - article_id = getattr(article, 'id') - except: - return HttpResponseRedirect('/admin/article/all') - - if request.POST: - form = ArticleForm(request.POST) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] - - if form.is_valid(): - form.save(getattr(article, 'id')) - return HttpResponseRedirect('/admin/article/all') - else: - data = {} - #fill form with data from database - data['author'] = article.author - data['theme'] = [item.id for item in article.theme.all()] - data['tag'] = [item.id for item in article.tag.all()] - #hidden field - data['article_id'] = article_id - - #data from translated fields - for code, name in settings.LANGUAGES: - obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields - data['main_title_%s' % code] = obj.main_title - data['preview_%s' % code] = obj.preview - data['description_%s' % code] = obj.description - data['title_%s' % code] = obj.title - data['keywords_%s' % code] = obj.keywords - data['descriptions_%s' % code] = obj.descriptions - #fill form - form = ArticleForm(initial=data) - #set choices filled by ajax - form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] - - args = {} - args.update(csrf(request)) - - args['form'] = form - args['languages'] = settings.LANGUAGES - args['file_form'] = file_form - - #get list of files which connected with specific model object - args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(article), object_id=getattr(article, 'id')) - args['obj_id'] = getattr(article, 'id') - - - return render_to_response('article_add.html', args) - #----------------------- from django.views.generic import FormView from functions.custom_views import ListView @@ -231,7 +136,7 @@ class BlogView(FormView): class NewsList(ListView): model = Article - template_name = 'article/article_admin_list.html' + template_name = 'c_admin/article/article_admin_list.html' paginate_by = 20 def get_queryset(self): @@ -248,17 +153,3 @@ class NewsView(BlogView): template_name = 'c_admin/article/blog_form.html' success_url = '/admin/article/news/all/' obj = None - - - - -""" -from django.views.generic import CreateView -from models import Blog -from forms import BlogForm - -class BlogCreate(CreateView): - model = Blog - form_class = BlogForm - template_name = 'c_admin/blog/blog_add.html' -""" diff --git a/apps/article/forms.py b/apps/article/forms.py index fc319bc2..1575e005 100644 --- a/apps/article/forms.py +++ b/apps/article/forms.py @@ -97,26 +97,6 @@ class _BlogForm(forms.Form): return [] -class BlogForm(_BlogForm): - author = forms.ModelChoiceField(label=_(u'Автор'), queryset=Author.objects.all()) - draft = forms.BooleanField(label=_(u'Черновик'), required=False, localize=True) - - def __init__(self, *args, **kwargs): - super(BlogForm, self).__init__(*args, **kwargs) - if len(settings.LANGUAGES) in range(10): - for lid, (code, name) in enumerate(settings.LANGUAGES): - # required = True if lid == 0 else False - self.fields['short_description_%s' % code] = forms.CharField(label=_(u'Краткое содержание'), required=False, widget=CKEditorWidget) - - def save(self, author, article=None, commit=True): - article = super(BlogForm, self).save(author, article=article, commit=False) - article.draft = self.cleaned_data['draft'] - article.author_s = self.cleaned_data['author'] - article.save() - return article - - - class NewsForm(_BlogForm): type = Article.news exposition = forms.CharField(label=_(u'Выставка'), widget=forms.HiddenInput(), required=False) @@ -154,157 +134,6 @@ class NewsForm(_BlogForm): return None -class ArticleForm(forms.Form): - """ - Create Article form for creating conference - - __init__ uses for dynamic creates fields - - save function saves data in Article object. If it doesnt exist create new object - """ - #users that have organiser profile - author = forms.ModelChoiceField(label=_(u'Автор'),queryset=User.objects.exclude(organiser__isnull=True)) - - key = forms.CharField(required=False, widget=forms.HiddenInput()) - theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'), queryset=Theme.objects.all()) - #creates select input with empty choices cause it will be filled with ajax - tag = forms.MultipleChoiceField(label=_(u'Теги'), required=False) - - article_id = forms.CharField(required=False, widget=forms.HiddenInput()) - - def __init__(self, *args, **kwargs): - """ - create dynamical translated fields fields - """ - super(ArticleForm, self).__init__(*args, **kwargs) - #creates translated forms 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): - # uses enumerate for detect iteration number - # first iteration is a default lang so it required fields - required = True if lid == 0 else False - self.fields['main_title_%s' % code] = forms.CharField(label=_(u'Заголовок'), required=required) - self.fields['preview_%s' % code] = forms.CharField(label=_(u'Превью'), required=required, widget=CKEditorWidget) - self.fields['description_%s' % code] = forms.CharField(label=_(u'Описание'), required=required, widget=CKEditorWidget) - #meta data - self.fields['title_%s' % code] = forms.CharField(label=_(u'Тайтл'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label=_(u'Дескрипшен'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label=_(u'Кейвордс'), required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - - def save(self, id=None): - """ - change Article object with id = id - N/A add new Article object - usage: form.save(obj) - if change article - form.save() - if add article - """ - data = self.cleaned_data - #create new Article object or get exists - if not id: - article = Article() - else: - article = Article.objects.get(id=id) - #clear manytomany relations - article.theme.clear() - article.tag.clear() - - - if data.get('author'): - article.user = User.objects.get(id=data['author'].id)#.id cause select uses queryset - - #create slug field from russian language - if not getattr(article, 'slug'): - article.slug = translit_with_separator(data['main_title_ru'].strip()).lower() - - # fill translated fields and save object - fill_with_signal(Article, article, data) - # fill manytomany fields - for item in data['theme']: - article.theme.add(item.id)#.id cause select uses queryset - - for item in data['tag']: - article.tag.add(item) - - article.save() - - #save files - check_tmp_files(article, data['key']) - - - def clean(self): - id = self.cleaned_data.get('article_id') - main_title_ru = self.cleaned_data.get('main_title_ru') - - article = Article.objects.filter(url=translit_with_separator(main_title_ru)) - if article and str(article[0].id) != id: - msg = _(u'Статья с таким названием уже существует') - self._errors['main_title_ru'] = ErrorList([msg]) - del self.cleaned_data['main_title_ru'] - - return self.cleaned_data - - -class ArticleDeleteForm(forms.ModelForm): - url = forms.CharField(widget=forms.HiddenInput()) - - class Meta: - model = Article - fields = ('url',) - -#---------------------------------- -""" -from models import Blog - -class BlogForm(forms.ModelForm): - class Meta: - model = Blog - exclude = ('created', 'modified', 'creator', 'theme', 'tag') - - def __init__(self, *args, **kwargs): - super(BlogForm, self).__init__(*args, **kwargs) - - - if len(settings.LANGUAGES) in range(10): - for lid, (code, name) in enumerate(settings.LANGUAGES): - # uses enumerate for detect iteration number - # first iteration is a default lang so it required fields - required = True if lid == 0 else False - self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required) - self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=required, widget=CKEditorWidget) - self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget) - #meta data - self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) - self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255, - widget=forms.TextInput(attrs={'style':'width: 550px'})) -""" - - - -class ArticleFilterForm(forms.Form): - theme = forms.MultipleChoiceField(label=_(u'Тематика:'), required=False, - choices=[(item.id, item.name) for item in Theme.objects.language().distinct()]) - tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) - - ''' - - def __init__(self, *args, **kwargs): - """ - create dynamical translated fields fields - """ - super(ArticleFilterForm, self).__init__(*args, **kwargs) - ids = [item['theme_id'] for item in list(Article.objects.blogs().values('theme_id').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)]) - ''' - - class BlogFilterForm(forms.Form): tag = forms.CharField(label=_(u'Теги:'), widget=forms.HiddenInput(), required=False) diff --git a/apps/article/models.py b/apps/article/models.py index 36f5ccd9..3d21ea1c 100644 --- a/apps/article/models.py +++ b/apps/article/models.py @@ -107,21 +107,6 @@ class Article(TranslatableModel): def __unicode__(self): return self.lazy_translation_getter('main_title', self.pk) - def translation_model(self): - return self._meta.translations_model - - def publish(self): - """ - set publish date. uses when publish date is none - """ - self.in_sitemap = True - if not self.publish_date: - # save time only first time - self.publish_date = now() - self.save() - - return self - def get_event(self): """ get event connected to article @@ -137,17 +122,8 @@ class Article(TranslatableModel): # 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: - # self.description = strip_tags(self.description_from_content()) super(Article, self).save(*args, **kwargs) - def description_from_content(self): - """ - """ - # place for logic - return '' - def generate_unique_slug(self): """ Create a unique slug by passing the result of get_slug() to @@ -173,37 +149,6 @@ class Article(TranslatableModel): """ 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 - our own version instead of Django's so we can hook into the - published manager and concrete subclasses. - """ - arg = "publish_date__gt" if is_next else "publish_date__lt" - order = "publish_date" if is_next else "-publish_date" - lookup = {arg: self.publish_date} - concrete_model = base_concrete_model(Article, self) - try: - queryset = concrete_model.objects.published - except AttributeError: - queryset = concrete_model.objects.all - try: - return queryset(**kwargs).filter(**lookup).order_by(order)[0] - except IndexError: - pass - - def get_next_by_publish_date(self, **kwargs): - """ - Retrieves next object by publish date. - """ - return self._get_next_or_previous_by_publish_date(True, **kwargs) - - def get_previous_by_publish_date(self, **kwargs): - """ - Retrieves previous object by publish date. - """ - return self._get_next_or_previous_by_publish_date(False, **kwargs) - def admin_url(self): """ returns url for admin pages diff --git a/templates/c_admin/article/article_add.html b/templates/c_admin/article/article_add.html deleted file mode 100644 index 5589009b..00000000 --- a/templates/c_admin/article/article_add.html +++ /dev/null @@ -1,186 +0,0 @@ -{% extends 'base.html' %} -{% load static %} -{# Displays article form #} - - {% block scripts %} - - - {# selects #} - - - {# ajax #} - - - - {% endblock %} - -{% block body %} - -{# Uses multilang.html template for translated fields #} -
{% csrf_token %} -
- {% if obj_id %} Изменить {% else %} Добавить {% endif %}статью - -
-
-

Основная информация

-
-
- {# Hidden input uses for comparing with TmpFile objects #} - {{ form.key }} - {# Hidden input uses in clean method for checking url #} - {{ form.article_id }} - - {# main_title #} - - {% include 'c_admin/forms/multilang.html' with field='main_title' form=form languages=languages %} - {# theme #} -
- -
- {{ form.theme }} - {{ form.theme.errors }} -
-
- {# tag #} -
- -
- {{ form.tag }} - {{ form.tag.errors }} -
-
- {# preview #} - - {% include 'c_admin/forms/multilang.html' with field='preview' form=form languages=languages %} - - {# author #} -
- -
- {{ form.author }} - {{ form.author.errors }} -
-
- {# description #} - {% include 'c_admin/forms/multilang.html' with field='description' form=form languages=languages %} - {# keywords #} - - {% include 'c_admin/forms/multilang.html' with field='keywords' form=form languages=languages %} - - {# title #} - - {% include 'c_admin/forms/multilang.html' with field='title' form=form languages=languages %} - - {# descriptions #} - - {% include 'c_admin/forms/multilang.html' with field='descriptions' form=form languages=languages %} - -
- -
-
-
-

Файлы

-
-
- {# button that shows modal window with file form #} - Добавить файл - {# this div shows list of files and refreshes when new file added #} -
- - - - - - - - - - - - - {% for file in files %} - - - - - - - - - - {% endfor %} - -
idФайлИмяНазначение
{{ file.id }}{{ file.file_name }}{{ file.purpose }} - -
-
- -
-
- -
- - - -
- -
-
- - -{# modal window #} - - -{% endblock %} diff --git a/templates/c_admin/article/article_all.html b/templates/c_admin/article/article_all.html deleted file mode 100644 index bc901b9b..00000000 --- a/templates/c_admin/article/article_all.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends 'base.html' %} -{% block body %} -{% comment %} -Displays lists of all articles in the table - and creating buttons which can change each article -{% endcomment %} - -
-
-

Список статей

-
-
- - - - - - - - - - - - {% for item in objects %} - - - - - - - - - - - {% endfor %} - -
ЗаголовокАвтор 
{{ item.main_title }}{% ifnotequal item.user None %}{{ item.user }} {% endifnotequal %} - - Изменить - - - - Копировать - - - - Удалить - -
- Добавить статью -
- - -
- -{% endblock %} \ No newline at end of file diff --git a/templates/c_admin/article/article_confirm_delete.html b/templates/c_admin/article/article_confirm_delete.html index ac15985c..00dba2dd 100644 --- a/templates/c_admin/article/article_confirm_delete.html +++ b/templates/c_admin/article/article_confirm_delete.html @@ -8,4 +8,4 @@ Нет -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/c_admin/article/blog_form.html b/templates/c_admin/article/blog_form.html index e1c2366c..d1630cfe 100644 --- a/templates/c_admin/article/blog_form.html +++ b/templates/c_admin/article/blog_form.html @@ -1,34 +1,35 @@ {% extends 'base.html' %} -{% load static i18n %} - -{% block scripts %} - - {# selects #} - - - {# ajax #} - - - - - - - - - - - - -{% endblock %} +{% load static %} +{% load i18n %} +{# Displays article form #} + + {% block scripts %} + + + {# selects #} + + + + {# ajax #} + + + + + + + + + {% endblock %} {% block body %} {{ form.errors }} @@ -132,9 +133,38 @@ +
+
+

{% trans "Файлы" %}

+
+
+ {% if article %} + {# button that shows modal window with file form #} + {% trans "Добавить файл" %} + {% else %} +

{% trans "Файлы можно добавлять только после введения основных данных" %}

+ {% endif %} + {# this div shows list of files and refreshes when new file added #} +
+ - {% include 'c_admin/includes/filegallery.html' with object=article model='article.Article' %} + + + + + + + + + + + {% include 'file_list.html' with files=files %} + +
{% trans "id" %}{% trans "Файл" %}{% trans "Имя" %}{% trans "Назначение" %}
+
+
+
{% if form.draft %}
@@ -154,6 +184,7 @@ +{% include 'c_admin/includes/file_form.html' with file_form=file_form object=article %} {% endblock %}