Move custom css loading to admin. Don't show author if not superuser.
Fix unique together for translated fields. Fix some manager issues. Add default pagination to views Simplify tag_clog() code
This commit is contained in:
parent
3a772007f1
commit
1ac18873a0
10 changed files with 121 additions and 61 deletions
|
@ -1,7 +1,9 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from admin_enhancer.admin import EnhancedModelAdminMixin
|
from admin_enhancer.admin import EnhancedModelAdminMixin
|
||||||
from cms.admin.placeholderadmin import PlaceholderAdmin, FrontendEditableAdmin
|
from cms.admin.placeholderadmin import PlaceholderAdmin, FrontendEditableAdmin
|
||||||
|
from copy import deepcopy
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from django.conf import settings
|
||||||
from parler.admin import TranslatableAdmin
|
from parler.admin import TranslatableAdmin
|
||||||
|
|
||||||
from .models import Post, BlogCategory
|
from .models import Post, BlogCategory
|
||||||
|
@ -11,6 +13,12 @@ class BlogCategoryAdmin(EnhancedModelAdminMixin, TranslatableAdmin):
|
||||||
def get_prepopulated_fields(self, request, obj=None):
|
def get_prepopulated_fields(self, request, obj=None):
|
||||||
return {"slug": ("name",)}
|
return {"slug": ("name",)}
|
||||||
|
|
||||||
|
class Media:
|
||||||
|
css = {
|
||||||
|
'all': ('%sdjangocms_blog/css/%s' % (settings.STATIC_URL,
|
||||||
|
"djangocms_blog_admin.css"),)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class PostAdmin(EnhancedModelAdminMixin, FrontendEditableAdmin,
|
class PostAdmin(EnhancedModelAdminMixin, FrontendEditableAdmin,
|
||||||
PlaceholderAdmin, TranslatableAdmin):
|
PlaceholderAdmin, TranslatableAdmin):
|
||||||
|
@ -19,13 +27,12 @@ class PostAdmin(EnhancedModelAdminMixin, FrontendEditableAdmin,
|
||||||
raw_id_fields = ['author']
|
raw_id_fields = ['author']
|
||||||
frontend_editable_fields = ("title", "abstract")
|
frontend_editable_fields = ("title", "abstract")
|
||||||
enhance_exclude = ('main_image', 'tags')
|
enhance_exclude = ('main_image', 'tags')
|
||||||
change_form_template = "admin/djangocms_blog/post_change_form.html"
|
|
||||||
|
|
||||||
fieldsets = [
|
_fieldsets = [
|
||||||
(None, {
|
(None, {
|
||||||
'fields': [('title', 'slug', 'publish'),
|
'fields': [('title', 'slug', 'publish'),
|
||||||
('categories', 'tags'),
|
('categories', 'tags'),
|
||||||
('date_published', 'date_published_end'), 'author']
|
('date_published', 'date_published_end')]
|
||||||
}),
|
}),
|
||||||
(None, {
|
(None, {
|
||||||
'fields': [('main_image', 'main_image_thumbnail', 'main_image_full'),
|
'fields': [('main_image', 'main_image_thumbnail', 'main_image_full'),
|
||||||
|
@ -33,6 +40,14 @@ class PostAdmin(EnhancedModelAdminMixin, FrontendEditableAdmin,
|
||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def get_fieldsets(self, request, obj=None):
|
||||||
|
if request.user.is_superuser:
|
||||||
|
fsets = deepcopy(self._fieldsets)
|
||||||
|
fsets[0][1]['fields'].append('author')
|
||||||
|
return fsets
|
||||||
|
else:
|
||||||
|
return self._fieldsets
|
||||||
|
|
||||||
def get_prepopulated_fields(self, request, obj=None):
|
def get_prepopulated_fields(self, request, obj=None):
|
||||||
return {"slug": ("title",)}
|
return {"slug": ("title",)}
|
||||||
|
|
||||||
|
@ -41,5 +56,12 @@ class PostAdmin(EnhancedModelAdminMixin, FrontendEditableAdmin,
|
||||||
obj.author = request.user
|
obj.author = request.user
|
||||||
super(PostAdmin, self).save_model(request, obj, form, change)
|
super(PostAdmin, self).save_model(request, obj, form, change)
|
||||||
|
|
||||||
|
class Media:
|
||||||
|
css = {
|
||||||
|
'all': ('%sdjangocms_blog/css/%s' % (settings.STATIC_URL,
|
||||||
|
"djangocms_blog_admin.css"),)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(BlogCategory, BlogCategoryAdmin)
|
admin.site.register(BlogCategory, BlogCategoryAdmin)
|
||||||
admin.site.register(Post, PostAdmin)
|
admin.site.register(Post, PostAdmin)
|
||||||
|
|
|
@ -10,13 +10,13 @@ from .forms import LatestEntriesForm
|
||||||
|
|
||||||
|
|
||||||
class BlogPlugin(CMSPluginBase):
|
class BlogPlugin(CMSPluginBase):
|
||||||
|
|
||||||
module = 'Blog'
|
module = 'Blog'
|
||||||
|
|
||||||
|
|
||||||
class LatestEntriesPlugin(BlogPlugin):
|
class LatestEntriesPlugin(BlogPlugin):
|
||||||
|
|
||||||
render_template = 'djangocms_blog/plugins/latest_entries.html'
|
render_template = 'djangocms_blog/plugins/latest_entries.html'
|
||||||
name = _('Latest Blog Entries')
|
name = _('Latest Blog Articles')
|
||||||
model = LatestPostsPlugin
|
model = LatestPostsPlugin
|
||||||
form = LatestEntriesForm
|
form = LatestEntriesForm
|
||||||
filter_horizontal = ('categories',)
|
filter_horizontal = ('categories',)
|
||||||
|
@ -25,10 +25,12 @@ class LatestEntriesPlugin(BlogPlugin):
|
||||||
context['instance'] = instance
|
context['instance'] = instance
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class AuthorPostsPlugin(BlogPlugin):
|
class AuthorPostsPlugin(BlogPlugin):
|
||||||
module = _('Blog')
|
module = _('Blog')
|
||||||
name = _('Author Blog posts')
|
name = _('Author Blog Articles')
|
||||||
model = AuthorEntriesPlugin
|
model = AuthorEntriesPlugin
|
||||||
|
form = LatestEntriesForm
|
||||||
render_template = 'djangocms_blog/plugins/authors.html'
|
render_template = 'djangocms_blog/plugins/authors.html'
|
||||||
filter_horizontal = ['authors']
|
filter_horizontal = ['authors']
|
||||||
|
|
||||||
|
@ -36,6 +38,7 @@ class AuthorPostsPlugin(BlogPlugin):
|
||||||
context['instance'] = instance
|
context['instance'] = instance
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class BlogTagsPlugin(BlogPlugin):
|
class BlogTagsPlugin(BlogPlugin):
|
||||||
module = _('Blog')
|
module = _('Blog')
|
||||||
name = _('Tags')
|
name = _('Tags')
|
||||||
|
@ -46,6 +49,7 @@ class BlogTagsPlugin(BlogPlugin):
|
||||||
context['tags'] = Post.objects.tag_cloud(queryset=Post.objects.published())
|
context['tags'] = Post.objects.tag_cloud(queryset=Post.objects.published())
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class BlogCategoryPlugin(BlogPlugin):
|
class BlogCategoryPlugin(BlogPlugin):
|
||||||
module = _('Blog')
|
module = _('Blog')
|
||||||
name = _('Categories')
|
name = _('Categories')
|
||||||
|
@ -56,6 +60,7 @@ class BlogCategoryPlugin(BlogPlugin):
|
||||||
context['categories'] = BlogCategory.objects.all()
|
context['categories'] = BlogCategory.objects.all()
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class BlogArchivePlugin(BlogPlugin):
|
class BlogArchivePlugin(BlogPlugin):
|
||||||
module = _('Blog')
|
module = _('Blog')
|
||||||
name = _('Archive')
|
name = _('Archive')
|
||||||
|
@ -66,6 +71,7 @@ class BlogArchivePlugin(BlogPlugin):
|
||||||
context['dates'] = Post.objects.get_months(queryset=Post.objects.published())
|
context['dates'] = Post.objects.get_months(queryset=Post.objects.published())
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
plugin_pool.register_plugin(LatestEntriesPlugin)
|
plugin_pool.register_plugin(LatestEntriesPlugin)
|
||||||
plugin_pool.register_plugin(AuthorPostsPlugin)
|
plugin_pool.register_plugin(AuthorPostsPlugin)
|
||||||
plugin_pool.register_plugin(BlogTagsPlugin)
|
plugin_pool.register_plugin(BlogTagsPlugin)
|
||||||
|
|
|
@ -13,16 +13,16 @@ class LatestEntriesFeed(Feed):
|
||||||
return reverse('djangocms_blog:latest-posts')
|
return reverse('djangocms_blog:latest-posts')
|
||||||
|
|
||||||
def title(self):
|
def title(self):
|
||||||
return _('Blog posts on %(site_name)s') % {'site_name': Site.objects.get_current().name}
|
return _('Blog articles on %(site_name)s') % {'site_name': Site.objects.get_current().name}
|
||||||
|
|
||||||
def items(self, obj):
|
def items(self, obj):
|
||||||
return Post.objects.published().order_by('-date_published')[:10]
|
return Post.objects.published().order_by('-date_published')[:10]
|
||||||
|
|
||||||
def item_title(self, item):
|
def item_title(self, item):
|
||||||
return item.lazy_translation_getter('title')
|
return item.safe_translation_getter('title')
|
||||||
|
|
||||||
def item_description(self, item):
|
def item_description(self, item):
|
||||||
return item.lazy_translation_getter('abstract')
|
return item.safe_translation_getter('abstract')
|
||||||
|
|
||||||
|
|
||||||
class TagFeed(LatestEntriesFeed):
|
class TagFeed(LatestEntriesFeed):
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from south.modelsinspector import add_introspection_rules
|
|
||||||
add_introspection_rules([], ["^djangocms_blog\.fields\.UsersWithPermsManyToManyField"])
|
|
||||||
|
|
||||||
|
|
||||||
class UsersWithPermsManyToManyField(models.ManyToManyField):
|
class UsersWithPermsManyToManyField(models.ManyToManyField):
|
||||||
|
@ -27,4 +25,4 @@ class UsersWithPermsManyToManyField(models.ManyToManyField):
|
||||||
}
|
}
|
||||||
defaults.update(kwargs)
|
defaults.update(kwargs)
|
||||||
|
|
||||||
return super(UsersWithPermsManyToManyField, self).formfield(**defaults)
|
return super(UsersWithPermsManyToManyField, self).formfield(**defaults)
|
||||||
|
|
|
@ -7,12 +7,12 @@ import django_select2
|
||||||
class LatestEntriesForm(forms.ModelForm):
|
class LatestEntriesForm(forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
||||||
widgets = {
|
widgets = {
|
||||||
'tags': django_select2.Select2MultipleWidget
|
'tags': django_select2.Select2MultipleWidget
|
||||||
}
|
}
|
||||||
|
|
||||||
class Media:
|
class Media:
|
||||||
css = {
|
css = {
|
||||||
'all': ('%s/css/%s' % (settings.STATIC_URL, "djangocms_blog_admin.css"),)
|
'all': ('%sdjangocms_blog/css/%s' % (settings.STATIC_URL,
|
||||||
|
"djangocms_blog_admin.css"),)
|
||||||
}
|
}
|
|
@ -50,23 +50,22 @@ class TaggedFilterItem(object):
|
||||||
qs = self.tag_list(other_model, queryset)
|
qs = self.tag_list(other_model, queryset)
|
||||||
return qs.values("slug")
|
return qs.values("slug")
|
||||||
|
|
||||||
def tag_cloud(self, other_model=None, queryset=None, start=None):
|
def tag_cloud(self, other_model=None, queryset=None, published=True):
|
||||||
from taggit_templatetags.templatetags.taggit_extras import get_weight_fun
|
|
||||||
from taggit.models import TaggedItem
|
from taggit.models import TaggedItem
|
||||||
tag_ids = self._taglist(other_model, queryset)
|
tag_ids = self._taglist(other_model, queryset)
|
||||||
tagquery = TaggedItem.tags_for(self.model).filter(id__in=tag_ids)
|
kwargs = {}
|
||||||
if start is not None:
|
if published:
|
||||||
tagquery = tagquery.filter(name__istartswith=start)
|
kwargs = TaggedItem.bulk_lookup_kwargs(self.model.objects.published())
|
||||||
tagquery = tagquery.annotate(count=models.Count('taggit_taggeditem_items'))
|
kwargs['tag_id__in'] = tag_ids
|
||||||
count = tagquery.values_list('count', flat=True)
|
counted_tags = dict(TaggedItem.objects
|
||||||
if len(count) > 0:
|
.filter(**kwargs)
|
||||||
weight_fun = get_weight_fun(BLOG_TAGCLOUD_MIN,
|
.values('tag')
|
||||||
BLOG_TAGCLOUD_MAX,
|
.annotate(count=models.Count('tag'))
|
||||||
min(count), BLOG_TAGCLOUD_MAX)
|
.values_list('tag', 'count'))
|
||||||
tagquery = tagquery.order_by('name')
|
tags = TaggedItem.tag_model().objects.filter(pk__in=counted_tags.keys())
|
||||||
for tag in tagquery:
|
for tag in tags:
|
||||||
tag.weight = weight_fun(tag.count)
|
tag.count = counted_tags[tag.pk]
|
||||||
return tagquery
|
return sorted(tags, key=lambda x: -x.count)
|
||||||
|
|
||||||
|
|
||||||
class GenericDateTaggedManager(TaggedFilterItem, TranslationManager):
|
class GenericDateTaggedManager(TaggedFilterItem, TranslationManager):
|
||||||
|
|
|
@ -12,12 +12,15 @@ class Migration(SchemaMigration):
|
||||||
db.create_table(u'djangocms_blog_blogcategory_translation', (
|
db.create_table(u'djangocms_blog_blogcategory_translation', (
|
||||||
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||||
('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
|
('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
|
||||||
('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
|
('name', self.gf('django.db.models.fields.CharField')(max_length=200)),
|
||||||
('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50, blank=True)),
|
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, blank=True, db_index=True)),
|
||||||
('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['djangocms_blog.BlogCategory'])),
|
('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['djangocms_blog.BlogCategory'])),
|
||||||
))
|
))
|
||||||
db.send_create_signal(u'djangocms_blog', ['BlogCategoryTranslation'])
|
db.send_create_signal(u'djangocms_blog', ['BlogCategoryTranslation'])
|
||||||
|
|
||||||
|
# Adding unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'slug']
|
||||||
|
db.create_unique(u'djangocms_blog_blogcategory_translation', ['language_code', 'slug'])
|
||||||
|
|
||||||
# Adding unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'master']
|
# Adding unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'master']
|
||||||
db.create_unique(u'djangocms_blog_blogcategory_translation', ['language_code', 'master_id'])
|
db.create_unique(u'djangocms_blog_blogcategory_translation', ['language_code', 'master_id'])
|
||||||
|
|
||||||
|
@ -35,12 +38,15 @@ class Migration(SchemaMigration):
|
||||||
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||||
('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
|
('language_code', self.gf('django.db.models.fields.CharField')(max_length=15, db_index=True)),
|
||||||
('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
|
('title', self.gf('django.db.models.fields.CharField')(max_length=255)),
|
||||||
('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50, blank=True)),
|
('slug', self.gf('django.db.models.fields.SlugField')(db_index=True, max_length=50, blank=True)),
|
||||||
('abstract', self.gf('djangocms_text_ckeditor.fields.HTMLField')()),
|
('abstract', self.gf('djangocms_text_ckeditor.fields.HTMLField')()),
|
||||||
('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['djangocms_blog.Post'])),
|
('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['djangocms_blog.Post'])),
|
||||||
))
|
))
|
||||||
db.send_create_signal(u'djangocms_blog', ['PostTranslation'])
|
db.send_create_signal(u'djangocms_blog', ['PostTranslation'])
|
||||||
|
|
||||||
|
# Adding unique constraint on 'PostTranslation', fields ['language_code', 'slug']
|
||||||
|
db.create_unique(u'djangocms_blog_post_translation', ['language_code', 'slug'])
|
||||||
|
|
||||||
# Adding unique constraint on 'PostTranslation', fields ['language_code', 'master']
|
# Adding unique constraint on 'PostTranslation', fields ['language_code', 'master']
|
||||||
db.create_unique(u'djangocms_blog_post_translation', ['language_code', 'master_id'])
|
db.create_unique(u'djangocms_blog_post_translation', ['language_code', 'master_id'])
|
||||||
|
|
||||||
|
@ -77,7 +83,7 @@ class Migration(SchemaMigration):
|
||||||
db.send_create_signal(u'djangocms_blog', ['LatestPostsPlugin'])
|
db.send_create_signal(u'djangocms_blog', ['LatestPostsPlugin'])
|
||||||
|
|
||||||
# Adding M2M table for field tags on 'LatestPostsPlugin'
|
# Adding M2M table for field tags on 'LatestPostsPlugin'
|
||||||
m2m_table_name = db.shorten_name(u'cmsplugin_latestpostsplugin_tags')
|
m2m_table_name = db.shorten_name(u'djangocms_blog_latestpostsplugin_tags')
|
||||||
db.create_table(m2m_table_name, (
|
db.create_table(m2m_table_name, (
|
||||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
|
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
|
||||||
('latestpostsplugin', models.ForeignKey(orm[u'djangocms_blog.latestpostsplugin'], null=False)),
|
('latestpostsplugin', models.ForeignKey(orm[u'djangocms_blog.latestpostsplugin'], null=False)),
|
||||||
|
@ -86,7 +92,7 @@ class Migration(SchemaMigration):
|
||||||
db.create_unique(m2m_table_name, ['latestpostsplugin_id', 'tag_id'])
|
db.create_unique(m2m_table_name, ['latestpostsplugin_id', 'tag_id'])
|
||||||
|
|
||||||
# Adding M2M table for field categories on 'LatestPostsPlugin'
|
# Adding M2M table for field categories on 'LatestPostsPlugin'
|
||||||
m2m_table_name = db.shorten_name(u'cmsplugin_latestpostsplugin_categories')
|
m2m_table_name = db.shorten_name(u'djangocms_blog_latestpostsplugin_categories')
|
||||||
db.create_table(m2m_table_name, (
|
db.create_table(m2m_table_name, (
|
||||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
|
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
|
||||||
('latestpostsplugin', models.ForeignKey(orm[u'djangocms_blog.latestpostsplugin'], null=False)),
|
('latestpostsplugin', models.ForeignKey(orm[u'djangocms_blog.latestpostsplugin'], null=False)),
|
||||||
|
@ -102,7 +108,7 @@ class Migration(SchemaMigration):
|
||||||
db.send_create_signal(u'djangocms_blog', ['AuthorEntriesPlugin'])
|
db.send_create_signal(u'djangocms_blog', ['AuthorEntriesPlugin'])
|
||||||
|
|
||||||
# Adding M2M table for field authors on 'AuthorEntriesPlugin'
|
# Adding M2M table for field authors on 'AuthorEntriesPlugin'
|
||||||
m2m_table_name = db.shorten_name(u'cmsplugin_authorentriesplugin_authors')
|
m2m_table_name = db.shorten_name(u'djangocms_blog_authorentriesplugin_authors')
|
||||||
db.create_table(m2m_table_name, (
|
db.create_table(m2m_table_name, (
|
||||||
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
|
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
|
||||||
('authorentriesplugin', models.ForeignKey(orm[u'djangocms_blog.authorentriesplugin'], null=False)),
|
('authorentriesplugin', models.ForeignKey(orm[u'djangocms_blog.authorentriesplugin'], null=False)),
|
||||||
|
@ -115,9 +121,15 @@ class Migration(SchemaMigration):
|
||||||
# Removing unique constraint on 'PostTranslation', fields ['language_code', 'master']
|
# Removing unique constraint on 'PostTranslation', fields ['language_code', 'master']
|
||||||
db.delete_unique(u'djangocms_blog_post_translation', ['language_code', 'master_id'])
|
db.delete_unique(u'djangocms_blog_post_translation', ['language_code', 'master_id'])
|
||||||
|
|
||||||
|
# Removing unique constraint on 'PostTranslation', fields ['language_code', 'slug']
|
||||||
|
db.delete_unique(u'djangocms_blog_post_translation', ['language_code', 'slug'])
|
||||||
|
|
||||||
# Removing unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'master']
|
# Removing unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'master']
|
||||||
db.delete_unique(u'djangocms_blog_blogcategory_translation', ['language_code', 'master_id'])
|
db.delete_unique(u'djangocms_blog_blogcategory_translation', ['language_code', 'master_id'])
|
||||||
|
|
||||||
|
# Removing unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'slug']
|
||||||
|
db.delete_unique(u'djangocms_blog_blogcategory_translation', ['language_code', 'slug'])
|
||||||
|
|
||||||
# Deleting model 'BlogCategoryTranslation'
|
# Deleting model 'BlogCategoryTranslation'
|
||||||
db.delete_table(u'djangocms_blog_blogcategory_translation')
|
db.delete_table(u'djangocms_blog_blogcategory_translation')
|
||||||
|
|
||||||
|
@ -137,16 +149,16 @@ class Migration(SchemaMigration):
|
||||||
db.delete_table(u'cmsplugin_latestpostsplugin')
|
db.delete_table(u'cmsplugin_latestpostsplugin')
|
||||||
|
|
||||||
# Removing M2M table for field tags on 'LatestPostsPlugin'
|
# Removing M2M table for field tags on 'LatestPostsPlugin'
|
||||||
db.delete_table(db.shorten_name(u'cmsplugin_latestpostsplugin_tags'))
|
db.delete_table(db.shorten_name(u'djangocms_blog_latestpostsplugin_tags'))
|
||||||
|
|
||||||
# Removing M2M table for field categories on 'LatestPostsPlugin'
|
# Removing M2M table for field categories on 'LatestPostsPlugin'
|
||||||
db.delete_table(db.shorten_name(u'cmsplugin_latestpostsplugin_categories'))
|
db.delete_table(db.shorten_name(u'djangocms_blog_latestpostsplugin_categories'))
|
||||||
|
|
||||||
# Deleting model 'AuthorEntriesPlugin'
|
# Deleting model 'AuthorEntriesPlugin'
|
||||||
db.delete_table(u'cmsplugin_authorentriesplugin')
|
db.delete_table(u'cmsplugin_authorentriesplugin')
|
||||||
|
|
||||||
# Removing M2M table for field authors on 'AuthorEntriesPlugin'
|
# Removing M2M table for field authors on 'AuthorEntriesPlugin'
|
||||||
db.delete_table(db.shorten_name(u'cmsplugin_authorentriesplugin_authors'))
|
db.delete_table(db.shorten_name(u'djangocms_blog_authorentriesplugin_authors'))
|
||||||
|
|
||||||
|
|
||||||
models = {
|
models = {
|
||||||
|
@ -230,12 +242,12 @@ class Migration(SchemaMigration):
|
||||||
'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['djangocms_blog.BlogCategory']", 'null': 'True', 'blank': 'True'})
|
'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['djangocms_blog.BlogCategory']", 'null': 'True', 'blank': 'True'})
|
||||||
},
|
},
|
||||||
u'djangocms_blog.blogcategorytranslation': {
|
u'djangocms_blog.blogcategorytranslation': {
|
||||||
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'djangocms_blog_blogcategory_translation'"},
|
'Meta': {'unique_together': "[('language_code', 'slug'), ('language_code', 'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'djangocms_blog_blogcategory_translation'"},
|
||||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
|
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
|
||||||
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['djangocms_blog.BlogCategory']"}),
|
'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['djangocms_blog.BlogCategory']"}),
|
||||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
|
||||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'blank': 'True'})
|
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'})
|
||||||
},
|
},
|
||||||
u'djangocms_blog.latestpostsplugin': {
|
u'djangocms_blog.latestpostsplugin': {
|
||||||
'Meta': {'object_name': 'LatestPostsPlugin', 'db_table': "u'cmsplugin_latestpostsplugin'", '_ormbases': ['cms.CMSPlugin']},
|
'Meta': {'object_name': 'LatestPostsPlugin', 'db_table': "u'cmsplugin_latestpostsplugin'", '_ormbases': ['cms.CMSPlugin']},
|
||||||
|
@ -245,7 +257,7 @@ class Migration(SchemaMigration):
|
||||||
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'})
|
'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'})
|
||||||
},
|
},
|
||||||
u'djangocms_blog.post': {
|
u'djangocms_blog.post': {
|
||||||
'Meta': {'object_name': 'Post'},
|
'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'},
|
||||||
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
|
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
|
||||||
'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['djangocms_blog.BlogCategory']"}),
|
'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['djangocms_blog.BlogCategory']"}),
|
||||||
'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
|
'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}),
|
||||||
|
@ -260,7 +272,7 @@ class Migration(SchemaMigration):
|
||||||
'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
|
||||||
},
|
},
|
||||||
u'djangocms_blog.posttranslation': {
|
u'djangocms_blog.posttranslation': {
|
||||||
'Meta': {'unique_together': "[('language_code', 'master')]", 'object_name': 'PostTranslation', 'db_table': "u'djangocms_blog_post_translation'"},
|
'Meta': {'unique_together': "[('language_code', 'slug'), ('language_code', 'master')]", 'object_name': 'PostTranslation', 'db_table': "u'djangocms_blog_post_translation'"},
|
||||||
'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}),
|
'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}),
|
||||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||||
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
|
'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}),
|
||||||
|
@ -321,4 +333,4 @@ class Migration(SchemaMigration):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
complete_apps = ['djangocms_blog']
|
complete_apps = ['djangocms_blog']
|
||||||
|
|
|
@ -11,10 +11,12 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
from djangocms_text_ckeditor.fields import HTMLField
|
from djangocms_text_ckeditor.fields import HTMLField
|
||||||
from filer.fields.image import FilerImageField
|
from filer.fields.image import FilerImageField
|
||||||
from parler.models import TranslatableModel, TranslatedFields
|
from parler.models import TranslatableModel, TranslatedFields
|
||||||
|
from parler.managers import TranslationManager
|
||||||
from taggit_autosuggest.managers import TaggableManager
|
from taggit_autosuggest.managers import TaggableManager
|
||||||
|
|
||||||
from .managers import GenericDateTaggedManager
|
|
||||||
from . import settings
|
from . import settings
|
||||||
|
from .managers import GenericDateTaggedManager
|
||||||
|
from .fields import UsersWithPermsManyToManyField
|
||||||
|
|
||||||
|
|
||||||
class BlogCategory(TranslatableModel):
|
class BlogCategory(TranslatableModel):
|
||||||
|
@ -28,16 +30,19 @@ class BlogCategory(TranslatableModel):
|
||||||
|
|
||||||
translations = TranslatedFields(
|
translations = TranslatedFields(
|
||||||
name=models.CharField(_('name'), max_length=255),
|
name=models.CharField(_('name'), max_length=255),
|
||||||
slug=models.SlugField(_('slug'), blank=True, unique=True),
|
slug=models.SlugField(_('slug'), blank=True, db_index=True),
|
||||||
|
meta={'unique_together': (('language_code', 'slug'),)}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
objects = TranslationManager()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('blog category')
|
verbose_name = _('blog category')
|
||||||
verbose_name_plural = _('blog categories')
|
verbose_name_plural = _('blog categories')
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def count(self):
|
def count(self):
|
||||||
return self.blog_posts.count()
|
return self.blog_posts.filter(publish=True).count()
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.safe_translation_getter('name')
|
return self.safe_translation_getter('name')
|
||||||
|
@ -55,7 +60,7 @@ class Post(TranslatableModel):
|
||||||
"""
|
"""
|
||||||
Blog post
|
Blog post
|
||||||
"""
|
"""
|
||||||
author = models.ForeignKey(User)
|
author = models.ForeignKey(User, blank=True)
|
||||||
|
|
||||||
date_created = models.DateTimeField(auto_now_add=True)
|
date_created = models.DateTimeField(auto_now_add=True)
|
||||||
date_modified = models.DateTimeField(auto_now=True)
|
date_modified = models.DateTimeField(auto_now=True)
|
||||||
|
@ -76,9 +81,9 @@ class Post(TranslatableModel):
|
||||||
|
|
||||||
translations = TranslatedFields(
|
translations = TranslatedFields(
|
||||||
title=models.CharField(max_length=255),
|
title=models.CharField(max_length=255),
|
||||||
slug=models.SlugField(_('slug'), blank=True, unique=True),
|
slug=models.SlugField(_('slug'), blank=True, db_index=True),
|
||||||
abstract=HTMLField(),
|
abstract=HTMLField(),
|
||||||
|
meta={'unique_together': (('language_code', 'slug'),)}
|
||||||
)
|
)
|
||||||
content = PlaceholderField("post_content")
|
content = PlaceholderField("post_content")
|
||||||
|
|
||||||
|
@ -86,8 +91,9 @@ class Post(TranslatableModel):
|
||||||
tags = TaggableManager(blank=True)
|
tags = TaggableManager(blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _('blog post')
|
verbose_name = _('blog article')
|
||||||
verbose_name_plural = _('blog post')
|
verbose_name_plural = _('blog articles')
|
||||||
|
ordering = ("-date_published", "-date_created")
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return self.safe_translation_getter('title')
|
return self.safe_translation_getter('title')
|
||||||
|
@ -129,12 +135,15 @@ class Post(TranslatableModel):
|
||||||
|
|
||||||
class LatestPostsPlugin(CMSPlugin):
|
class LatestPostsPlugin(CMSPlugin):
|
||||||
|
|
||||||
latest_posts = models.IntegerField(default=5, help_text=_('The number of latests posts to be displayed.'))
|
latest_posts = models.IntegerField(_(u'Articles'), default=settings.BLOG_LATEST_POSTS,
|
||||||
tags = models.ManyToManyField('taggit.Tag', blank=True, help_text=_('Show only the blog posts tagged with chosen tags.'))
|
help_text=_('The number of latests articles to be displayed.'))
|
||||||
categories = models.ManyToManyField('BlogCategory', blank=True, help_text=_('Show only the blog posts tagged with chosen tags.'))
|
tags = models.ManyToManyField('taggit.Tag', blank=True,
|
||||||
|
help_text=_('Show only the blog articles tagged with chosen tags.'))
|
||||||
|
categories = models.ManyToManyField('BlogCategory', blank=True,
|
||||||
|
help_text=_('Show only the blog articles tagged with chosen tags.'))
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return u"%s latest post by tag" % self.latest_posts
|
return u"%s latest articles by tag" % self.latest_posts
|
||||||
|
|
||||||
def copy_relations(self, oldinstance):
|
def copy_relations(self, oldinstance):
|
||||||
self.tags = oldinstance.tags.all()
|
self.tags = oldinstance.tags.all()
|
||||||
|
@ -148,11 +157,14 @@ class LatestPostsPlugin(CMSPlugin):
|
||||||
|
|
||||||
|
|
||||||
class AuthorEntriesPlugin(CMSPlugin):
|
class AuthorEntriesPlugin(CMSPlugin):
|
||||||
authors = models.ManyToManyField(User, verbose_name=_('Authors'))
|
#authors = models.ManyToManyField(User, verbose_name=_('Authors'))
|
||||||
latest_posts = models.IntegerField(default=5, help_text=_('The number of author entries to be displayed.'))
|
authors = UsersWithPermsManyToManyField(perms=['add_post'],
|
||||||
|
verbose_name=_('Authors'))
|
||||||
|
latest_posts = models.IntegerField(_(u'Articles'), default=settings.BLOG_LATEST_POSTS,
|
||||||
|
help_text=_('The number of author articles to be displayed.'))
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return u"%s latest post by author" % self.latest_posts
|
return u"%s latest articles by author" % self.latest_posts
|
||||||
|
|
||||||
def copy_relations(self, oldinstance):
|
def copy_relations(self, oldinstance):
|
||||||
self.authors = oldinstance.authors.all()
|
self.authors = oldinstance.authors.all()
|
||||||
|
@ -163,4 +175,7 @@ class AuthorEntriesPlugin(CMSPlugin):
|
||||||
|
|
||||||
def get_authors(self):
|
def get_authors(self):
|
||||||
authors = self.authors.all()
|
authors = self.authors.all()
|
||||||
|
for author in authors:
|
||||||
|
if author.post_set.filter(publish=True).exists:
|
||||||
|
author.count = author.post_set.filter(publish=True).count()
|
||||||
return authors
|
return authors
|
||||||
|
|
|
@ -13,4 +13,6 @@ BLOG_IMAGE_FULL_SIZE = {
|
||||||
}
|
}
|
||||||
|
|
||||||
BLOG_TAGCLOUD_MIN = 1
|
BLOG_TAGCLOUD_MIN = 1
|
||||||
BLOG_TAGCLOUD_MAX = 10
|
BLOG_TAGCLOUD_MAX = 10
|
||||||
|
BLOG_PAGINATION = 10
|
||||||
|
BLOG_LATEST_POSTS = 5
|
|
@ -8,6 +8,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
from django.views.generic import ListView, DetailView
|
from django.views.generic import ListView, DetailView
|
||||||
|
|
||||||
from .models import Post, BlogCategory
|
from .models import Post, BlogCategory
|
||||||
|
from .settings import BLOG_PAGINATION
|
||||||
|
|
||||||
|
|
||||||
class BaseBlogView(object):
|
class BaseBlogView(object):
|
||||||
|
@ -28,6 +29,7 @@ class PostListView(BaseBlogView, ListView):
|
||||||
model = Post
|
model = Post
|
||||||
context_object_name = 'post_list'
|
context_object_name = 'post_list'
|
||||||
template_name = "djangocms_blog/post_list.html"
|
template_name = "djangocms_blog/post_list.html"
|
||||||
|
paginate_by = BLOG_PAGINATION
|
||||||
|
|
||||||
|
|
||||||
class PostDetailView(BaseBlogView, DetailView):
|
class PostDetailView(BaseBlogView, DetailView):
|
||||||
|
@ -44,6 +46,7 @@ class PostArchiveView(BaseBlogView, ListView):
|
||||||
date_field = 'date_published'
|
date_field = 'date_published'
|
||||||
allow_empty = True
|
allow_empty = True
|
||||||
allow_future = True
|
allow_future = True
|
||||||
|
paginate_by = BLOG_PAGINATION
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super(PostArchiveView, self).get_queryset()
|
qs = super(PostArchiveView, self).get_queryset()
|
||||||
|
@ -65,6 +68,7 @@ class TaggedListView(BaseBlogView, ListView):
|
||||||
model = Post
|
model = Post
|
||||||
context_object_name = 'post_list'
|
context_object_name = 'post_list'
|
||||||
template_name = "djangocms_blog/post_list.html"
|
template_name = "djangocms_blog/post_list.html"
|
||||||
|
paginate_by = BLOG_PAGINATION
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super(TaggedListView, self).get_queryset()
|
qs = super(TaggedListView, self).get_queryset()
|
||||||
|
@ -80,6 +84,7 @@ class AuthorEntriesView(BaseBlogView, ListView):
|
||||||
model = Post
|
model = Post
|
||||||
context_object_name = 'post_list'
|
context_object_name = 'post_list'
|
||||||
template_name = "djangocms_blog/post_list.html"
|
template_name = "djangocms_blog/post_list.html"
|
||||||
|
paginate_by = BLOG_PAGINATION
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super(AuthorEntriesView, self).get_queryset()
|
qs = super(AuthorEntriesView, self).get_queryset()
|
||||||
|
@ -97,6 +102,7 @@ class CategoryEntriesView(BaseBlogView, ListView):
|
||||||
context_object_name = 'post_list'
|
context_object_name = 'post_list'
|
||||||
template_name = "djangocms_blog/post_list.html"
|
template_name = "djangocms_blog/post_list.html"
|
||||||
_category = None
|
_category = None
|
||||||
|
paginate_by = BLOG_PAGINATION
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def category(self):
|
def category(self):
|
||||||
|
|
Loading…
Reference in a new issue