очистил article от лишнего кода

remotes/origin/HEAD
Slava Kyrachevsky 9 years ago
parent a41865f9ed
commit e75c406714
  1. 113
      apps/article/admin.py
  2. 171
      apps/article/forms.py
  3. 55
      apps/article/models.py
  4. 186
      templates/c_admin/article/article_add.html
  5. 69
      templates/c_admin/article/article_all.html
  6. 2
      templates/c_admin/article/article_confirm_delete.html
  7. 93
      templates/c_admin/article/blog_form.html

@ -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'
"""

@ -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)

@ -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

@ -1,186 +0,0 @@
{% extends 'base.html' %}
{% load static %}
{# Displays article form #}
{% 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>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
{% endblock %}
{% block body %}
{# Uses multilang.html template for translated fields #}
<form method="post" class="form-horizontal" name="form2" id="form2"> {% csrf_token %}
<fieldset>
<legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}статью</legend>
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Основная информация</h2>
</div>
<div class="box-content">
{# 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 #}
<div class="control-group {% if form.theme.errors %}error{% endif %}">
<label class="control-label"><b>{{ form.theme.label }}:</b></label>
<div class="controls">
{{ form.theme }}
<span class="help-inline">{{ form.theme.errors }}</span>
</div>
</div>
{# tag #}
<div class="control-group {% if form.tag.errors %}error{% endif %}">
<label class="control-label">{{ form.tag.label }}:</label>
<div class="controls">
{{ form.tag }}
<span class="help-inline">{{ form.tag.errors }}</span>
</div>
</div>
{# preview #}
{% include 'c_admin/forms/multilang.html' with field='preview' form=form languages=languages %}
{# author #}
<div class="control-group {% if form.author.errors %}error{% endif %}">
<label class="control-label">{{ form.author.label }}:</label>
<div class="controls">
{{ form.author }}
<span class="help-inline">{{ form.author.errors }}</span>
</div>
</div>
{# 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 %}
</div>
</div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> Файлы</h2>
</div>
<div class="box-content">
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить файл</a>
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
<thead>
<tr>
<td>id</td>
<td>Файл</td>
<td>Имя</td>
<td>Назначение</td>
<td></td>
</tr>
</thead>
<tbody>
{% for file in files %}
<tr>
<td>{{ file.id }}</td>
<td><img src="{{ file.file_path.url }}"></td>
<td>{{ file.file_name }}</td>
<td>{{ file.purpose }}</td>
<td>
<button class="btn btn-danger delete_file" value="{{ file.id }}">
<i class="icon-trash icon-white"></i> Удалить
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</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>
{# modal window #}
<div class="modal hide fade" id="myModal" >
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close">&times;</button>
<h3>Добавить файл</h3>
</div>
<div id="form_body">
<div class="modal-body">
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="file_form" id="file_form" > {% csrf_token %}
{# hidden inputs uses for comparing with Article form key#}
{{ file_form.key }}
{{ file_form.model }}
<input type="hidden" id="obj_id" value="{{ obj_id }}">
{# file_path #}
<div class="control-group{% if file_form.file_path.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.file_path.label }}:</b></label>
<div class="controls">{{ file_form.file_path }}
<span class="help-inline">{{ file_form.file_path.errors }}</span>
</div>
</div>
{# file purpose #}
<div class="control-group{% if file_form.purpose.errors %}error{% endif %}">
<label class="control-label"><b>{{ file_form.purpose.label }}:</b></label>
<div class="controls">{{ file_form.purpose }}
<span class="help-inline">{{ file_form.purpose.errors }}</span>
</div>
</div>
{# file_name #}
{% with field='file_name' form=file_form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
{# file_description #}
{% with field='description' form=file_form languages=languages %}
{% include 'c_admin/forms/multilang.html' %}
{% endwith %}
</div>
<div class="modal-footer">
<div class="controls">
<input class="btn btn-primary" type="submit" value="Добавить">
<input type="reset" class="btn" value="Отменить" data-dismiss="modal">
</form>
</div>
</div>
</div>
</div>
{% endblock %}

@ -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 %}
<div class="box span8">
<div class="box-header well">
<h2><i class="icon-arrow-down"></i>Список статей</h2>
</div>
<div class="box-content">
<form class='form-search'>
{{ search_form.search_name }}
<button type="submit" class="btn">Найти</button>
</form>
<table class="table table-hover">
<thead>
<tr>
<th>Заголовок</th>
<th>Автор</th>
<th>&nbsp;</th>
</tr>
</thead>
<tbody>
{% for item in objects %}
<tr>
<td>{{ item.main_title }}</td>
<td>{% ifnotequal item.user None %}{{ item.user }} {% endifnotequal %}</td>
<td class="center sorting_1">
<a class="btn-small btn-info" href="/admin/article/change/{{ item.url|lower }}">
Изменить
</a>
</td>
<td class="center sorting_1">
<a class="btn-small btn-inverse" href="/admin/article/copy/{{ item.url|lower }}">
Копировать
</a>
</td>
<td>
<a class="btn-small btn-danger delete" href="/admin/article/delete/{{ item.url }}/">
Удалить
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-success" href="/admin/article/add"><i class="icon-plus-sign icon-white"></i> Добавить статью</a>
</div>
<div class="pagination pagination-centered">
<ul>
{% if objects.has_previous %}
<li> <a href="?page={{ objects.previous_page_number }}"></a></li>
{% endif %}
{% if objects.has_next %}
<li><a href="?page={{ objects.next_page_number }}"></a></li>
{% endif %}
</ul>
</div>
</div>
{% endblock %}

@ -8,4 +8,4 @@
<a class="btn btn-large btn-primary" href = "/admin/article/blog/all">Нет</a>
</div>
</form>
{% endblock %}
{% endblock %}

@ -1,34 +1,35 @@
{% extends 'base.html' %}
{% load static i18n %}
{% 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>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
<link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/>
<script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
<script>
$(document).ready(function(){
$('#id_publish_date').datetimepicker({
todayHighlight: true,
format : 'yyyy-mm-dd',
minView:2
});
});
</script>
<link rel="stylesheet" href="{% static 'jQuery-filer/css/jquery.filer.css' %}">
<link rel="stylesheet" href="{% static 'jQuery-filer/css/jquery.filer-dragdropbox-theme.css' %}">
<script src="{% static 'jQuery-filer/js/jquery.filer.js' %}"></script>
<script src="{% static 'jQuery-filer/js/init.js' %}"></script>
{% endblock %}
{% load static %}
{% load i18n %}
{# Displays article form #}
{% 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>
{# ajax #}
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script>
<script src="{% static 'custom_js/select_tag.js' %}"></script>
<link href="{% static 'js/datetimepicker/css/datetimepicker.css' %}" rel="stylesheet"/>
<script src="{% static 'js/datetimepicker/js/bootstrap-datetimepicker.js' %}"></script>
<script>
$(document).ready(function(){
$('#id_publish_date').datetimepicker({
todayHighlight: true,
format : 'yyyy-mm-dd',
minView:2
});
});
</script>
{% endblock %}
{% block body %}
{{ form.errors }}
@ -132,9 +133,38 @@
</div>
</div>
<div class="box span8" id="file">
<div class="box-header well">
<h2><i class="icon-pencil"></i> {% trans "Файлы" %}</h2>
</div>
<div class="box-content">
{% if article %}
{# button that shows modal window with file form #}
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">{% trans "Добавить файл" %}</a>
{% else %}
<p>{% trans "Файлы можно добавлять только после введения основных данных" %}</p>
{% endif %}
{# this div shows list of files and refreshes when new file added #}
<div id="file_list">
<table class="table table-hover">
{% include 'c_admin/includes/filegallery.html' with object=article model='article.Article' %}
<thead>
<tr>
<td>{% trans "id" %}</td>
<td>{% trans "Файл" %}</td>
<td>{% trans "Имя" %}</td>
<td>{% trans "Назначение" %}</td>
<td></td>
</tr>
</thead>
<tbody>
{% include 'file_list.html' with files=files %}
</tbody>
</table>
</div>
</div>
</div>
{% if form.draft %}
<div class="box span8">
<div class="control-group {% if form.draft.errors %}error{% endif %}">
@ -154,6 +184,7 @@
</fieldset>
</form>
{% include 'c_admin/includes/file_form.html' with file_form=file_form object=article %}
{% endblock %}

Loading…
Cancel
Save