Merge pull request #133 from nephila/feature/cleanup

Cleanup code style
This commit is contained in:
Iacopo Spalletti 2015-07-21 07:09:25 +02:00
commit 3238c0f912
25 changed files with 349 additions and 163 deletions

View file

@ -18,6 +18,8 @@ env:
- DJANGO='django17' CMS='cms30' - DJANGO='django17' CMS='cms30'
- DJANGO='django17' CMS='cms31' - DJANGO='django17' CMS='cms31'
- DJANGO='django17' CMS='cms32' - DJANGO='django17' CMS='cms32'
- TOXENV='pep8'
- TOXENV='isort'
# command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors # command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors
@ -27,9 +29,10 @@ install:
- "if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then export PYVER=py27; fi" - "if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then export PYVER=py27; fi"
- "if [[ $TRAVIS_PYTHON_VERSION == '3.3' ]]; then export PYVER=py33; fi" - "if [[ $TRAVIS_PYTHON_VERSION == '3.3' ]]; then export PYVER=py33; fi"
- "if [[ $TRAVIS_PYTHON_VERSION == '3.4' ]]; then export PYVER=py34; fi" - "if [[ $TRAVIS_PYTHON_VERSION == '3.4' ]]; then export PYVER=py34; fi"
- "if [[ ${DJANGO}z != 'z' ]]; then export TOXENV=$PYVER-$DJANGO-$CMS; fi"
# command to run tests, e.g. python setup.py test # command to run tests, e.g. python setup.py test
script: COMMAND='coverage run' tox -e"$PYVER-$DJANGO-$CMS" script: COMMAND='coverage run' tox -e$TOXENV
after_success: coveralls after_success: coveralls

View file

@ -23,7 +23,7 @@ clean-pyc:
find . -name '*~' -exec rm -f {} + find . -name '*~' -exec rm -f {} +
lint: lint:
flake8 djangocms_blog flake8 djangocms_blog tests
djangocms-helper djangocms_blog pyflakes --cms djangocms-helper djangocms_blog pyflakes --cms
test: test:

View file

@ -1,16 +1,16 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import sys import sys
from tempfile import mkdtemp from tempfile import mkdtemp
gettext = lambda s: s gettext = lambda s: s
HELPER_SETTINGS = { HELPER_SETTINGS = dict(
'NOSE_ARGS': [ NOSE_ARGS=[
'-s', '-s',
], ],
'ROOT_URLCONF': 'tests.test_utils.urls', ROOT_URLCONF='tests.test_utils.urls',
'INSTALLED_APPS': [ INSTALLED_APPS=[
'admin_enhancer', 'admin_enhancer',
'filer', 'filer',
'parler', 'parler',
@ -22,13 +22,13 @@ HELPER_SETTINGS = {
'cmsplugin_filer_image', 'cmsplugin_filer_image',
'taggit_autosuggest', 'taggit_autosuggest',
], ],
'LANGUAGE_CODE': 'en', LANGUAGE_CODE='en',
'LANGUAGES': ( LANGUAGES=(
('en', gettext('English')), ('en', gettext('English')),
('fr', gettext('French')), ('fr', gettext('French')),
('it', gettext('Italiano')), ('it', gettext('Italiano')),
), ),
'CMS_LANGUAGES': { CMS_LANGUAGES={
1: [ 1: [
{ {
'code': 'en', 'code': 'en',
@ -57,7 +57,7 @@ HELPER_SETTINGS = {
'hide_untranslated': False, 'hide_untranslated': False,
}, },
}, },
'PARLER_LANGUAGES': { PARLER_LANGUAGES={
1: ( 1: (
{'code': 'en'}, {'code': 'en'},
{'code': 'it'}, {'code': 'it'},
@ -71,29 +71,30 @@ HELPER_SETTINGS = {
'hide_untranslated': False, 'hide_untranslated': False,
} }
}, },
'MIGRATION_MODULES': { MIGRATION_MODULES={
'cmsplugin_filer_image': 'cmsplugin_filer_image.migrations_django', 'cmsplugin_filer_image': 'cmsplugin_filer_image.migrations_django',
}, },
'META_SITE_PROTOCOL': 'http', META_SITE_PROTOCOL='http',
'META_SITE_DOMAIN': 'example.com', META_SITE_DOMAIN='example.com',
'META_USE_OG_PROPERTIES': True, META_USE_OG_PROPERTIES=True,
'META_USE_TWITTER_PROPERTIES': True, META_USE_TWITTER_PROPERTIES=True,
'META_USE_GOOGLEPLUS_PROPERTIES': True, META_USE_GOOGLEPLUS_PROPERTIES=True,
'THUMBNAIL_PROCESSORS': ( THUMBNAIL_PROCESSORS=(
'easy_thumbnails.processors.colorspace', 'easy_thumbnails.processors.colorspace',
'easy_thumbnails.processors.autocrop', 'easy_thumbnails.processors.autocrop',
'filer.thumbnail_processors.scale_and_crop_with_subject_location', 'filer.thumbnail_processors.scale_and_crop_with_subject_location',
'easy_thumbnails.processors.filters', 'easy_thumbnails.processors.filters',
), ),
'FILE_UPLOAD_TEMP_DIR': mkdtemp(), FILE_UPLOAD_TEMP_DIR=mkdtemp(),
'SITE_ID': 1 SITE_ID=1
} )
if 'test' in sys.argv: if 'test' in sys.argv or len(sys.argv) == 1:
HELPER_SETTINGS['INSTALLED_APPS'].append('django_nose') HELPER_SETTINGS['INSTALLED_APPS'].append('django_nose')
def run(): def run():
from djangocms_helper import runner from djangocms_helper import runner
if 'test' in sys.argv or len(sys.argv) == 1:
sys.argv.append('--nose-runner') sys.argv.append('--nose-runner')
runner.cms('djangocms_blog') runner.cms('djangocms_blog')

View file

@ -2,14 +2,14 @@
from copy import deepcopy from copy import deepcopy
from admin_enhancer.admin import EnhancedModelAdminMixin from admin_enhancer.admin import EnhancedModelAdminMixin
from cms.admin.placeholderadmin import PlaceholderAdminMixin, FrontendEditableAdminMixin from cms.admin.placeholderadmin import FrontendEditableAdminMixin, PlaceholderAdminMixin
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.contrib import admin from django.contrib import admin
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from parler.admin import TranslatableAdmin from parler.admin import TranslatableAdmin
from .models import Post, BlogCategory from .models import BlogCategory, Post
from .settings import get_setting from .settings import get_setting

View file

@ -1,7 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from cms.app_base import CMSApp from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _, get_language from django.utils.translation import ugettext_lazy as _
from .menu import BlogCategoryMenu from .menu import BlogCategoryMenu

View file

@ -1,12 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy as _
from cms.models.pluginmodel import CMSPlugin from cms.models.pluginmodel import CMSPlugin
from cms.plugin_base import CMSPluginBase from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool from cms.plugin_pool import plugin_pool
from django.utils.translation import ugettext_lazy as _
from .models import AuthorEntriesPlugin, LatestPostsPlugin, Post, BlogCategory
from .forms import LatestEntriesForm from .forms import LatestEntriesForm
from .models import AuthorEntriesPlugin, BlogCategory, LatestPostsPlugin, Post
from .settings import get_setting from .settings import get_setting

View file

@ -4,7 +4,6 @@ from cms.toolbar_pool import toolbar_pool
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from .models import BLOG_CURRENT_POST_IDENTIFIER from .models import BLOG_CURRENT_POST_IDENTIFIER
@ -32,7 +31,7 @@ class BlogToolbar(CMSToolbar):
if current_post and self.request.user.has_perm('djangocms_blog.change_post'): # pragma: no cover if current_post and self.request.user.has_perm('djangocms_blog.change_post'): # pragma: no cover
# removing page meta menu, if present, to avoid confusion # removing page meta menu, if present, to avoid confusion
try: # pragma: no cover try: # pragma: no cover
import djangocms_page_meta import djangocms_page_meta # NOQA
menu = self.request.toolbar.get_or_create_menu('page') menu = self.request.toolbar.get_or_create_menu('page')
pagemeta = menu.get_or_create_menu('pagemeta', 'meta') pagemeta = menu.get_or_create_menu('pagemeta', 'meta')
menu.remove_item(pagemeta) menu.remove_item(pagemeta)
@ -40,7 +39,7 @@ class BlogToolbar(CMSToolbar):
pass pass
# removing page tags menu, if present, to avoid confusion # removing page tags menu, if present, to avoid confusion
try: # pragma: no cover try: # pragma: no cover
import djangocms_page_tags import djangocms_page_tags # NOQA
menu = self.request.toolbar.get_or_create_menu('page') menu = self.request.toolbar.get_or_create_menu('page')
pagetags = menu.get_or_create_menu('pagetags', 'tags') pagetags = menu.get_or_create_menu('pagetags', 'tags')
menu.remove_item(pagetags) menu.remove_item(pagetags)

View file

@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from operator import itemgetter
from heapq import nlargest from heapq import nlargest
from itertools import repeat, ifilter from itertools import ifilter, repeat
from operator import itemgetter
class Counter(dict): class Counter(dict):

View file

@ -1,16 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import django
from django.contrib.sites.models import Site
from django.db.models import Q
try: try:
from collections import Counter from collections import Counter
except ImportError: except ImportError:
from .compat import Counter from .compat import Counter
import django
from django.contrib.sites.models import Site
from django.db import models from django.db import models
from django.utils.timezone import now from django.utils.timezone import now
from parler.managers import TranslationManager, TranslatableQuerySet from parler.managers import TranslatableQuerySet, TranslationManager
class TaggedFilterItem(object): class TaggedFilterItem(object):
@ -78,7 +76,8 @@ class GenericDateQuerySet(TranslatableQuerySet):
publish_field = 'publish' publish_field = 'publish'
def on_site(self): def on_site(self):
return self.filter(Q(sites__isnull=True) | Q(sites=Site.objects.get_current().pk)) return self.filter(models.Q(sites__isnull=True) |
models.Q(sites=Site.objects.get_current().pk))
def published(self): def published(self):
queryset = self.published_future() queryset = self.published_future()

View file

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from cms.menu_bases import CMSAttachMenu from cms.menu_bases import CMSAttachMenu
from django.db.models.signals import post_delete, post_save
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import get_language
from menus.base import Modifier, NavigationNode from menus.base import Modifier, NavigationNode
from menus.menu_pool import menu_pool from menus.menu_pool import menu_pool
from django.db.models.signals import post_save, post_delete
from django.utils.translation import ugettext_lazy as _, get_language
from .models import BlogCategory from .models import BlogCategory
@ -34,7 +36,8 @@ class BlogNavModifier(Modifier):
a corresponding category is selected in menu a corresponding category is selected in menu
""" """
def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb): def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
if post_cut: return nodes if post_cut:
return nodes
if not hasattr(request, 'toolbar'): if not hasattr(request, 'toolbar'):
return nodes return nodes
models = ('djangocms_blog.post', 'djangocms_blog.blogcategory') models = ('djangocms_blog.post', 'djangocms_blog.blogcategory')
@ -45,7 +48,8 @@ class BlogNavModifier(Modifier):
cat = request.toolbar.obj cat = request.toolbar.obj
else: else:
cat = request.toolbar.obj.categories.first() cat = request.toolbar.obj.categories.first()
if not cat: return nodes if not cat:
return nodes
for node in nodes: for node in nodes:
if (node.namespace.startswith(BlogCategoryMenu.__name__) and if (node.namespace.startswith(BlogCategoryMenu.__name__) and
@ -57,6 +61,7 @@ class BlogNavModifier(Modifier):
menu_pool.register_modifier(BlogNavModifier) menu_pool.register_modifier(BlogNavModifier)
def clear_menu_cache(**kwargs): def clear_menu_cache(**kwargs):
menu_pool.clear(all=True) menu_pool.clear(all=True)

View file

@ -0,0 +1,165 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import filer.fields.image
import django.utils.timezone
from django.conf import settings
import djangocms_text_ckeditor.fields
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('djangocms_blog', '0006_auto_20150214_1907'),
]
operations = [
migrations.AlterModelOptions(
name='blogcategorytranslation',
options={'managed': True, 'verbose_name': 'blog category Translation', 'default_permissions': ()},
),
migrations.AlterModelOptions(
name='posttranslation',
options={'managed': True, 'verbose_name': 'blog article Translation', 'default_permissions': ()},
),
migrations.AlterField(
model_name='authorentriesplugin',
name='authors',
field=models.ManyToManyField(verbose_name='authors', to=settings.AUTH_USER_MODEL),
preserve_default=True,
),
migrations.AlterField(
model_name='authorentriesplugin',
name='latest_posts',
field=models.IntegerField(help_text='The number of author articles to be displayed.', verbose_name='articles', default=5),
preserve_default=True,
),
migrations.AlterField(
model_name='blogcategorytranslation',
name='language_code',
field=models.CharField(db_index=True, verbose_name='Language', max_length=15),
preserve_default=True,
),
migrations.AlterField(
model_name='latestpostsplugin',
name='categories',
field=models.ManyToManyField(blank=True, help_text='Show only the blog articles tagged with chosen categories.', verbose_name='filter by category', to='djangocms_blog.BlogCategory'),
preserve_default=True,
),
migrations.AlterField(
model_name='latestpostsplugin',
name='latest_posts',
field=models.IntegerField(help_text='The number of latests articles to be displayed.', verbose_name='articles', default=5),
preserve_default=True,
),
migrations.AlterField(
model_name='latestpostsplugin',
name='tags',
field=models.ManyToManyField(blank=True, help_text='Show only the blog articles tagged with chosen tags.', verbose_name='filter by tag', to='taggit.Tag'),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='author',
field=models.ForeignKey(blank=True, verbose_name='author', to=settings.AUTH_USER_MODEL, related_name='djangocms_blog_post_author', null=True),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='date_created',
field=models.DateTimeField(auto_now_add=True, verbose_name='created'),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='date_modified',
field=models.DateTimeField(auto_now=True, verbose_name='last modified'),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='date_published',
field=models.DateTimeField(verbose_name='published Since', default=django.utils.timezone.now),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='date_published_end',
field=models.DateTimeField(blank=True, verbose_name='published Until', null=True),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='enable_comments',
field=models.BooleanField(verbose_name='enable comments on post', default=True),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='main_image',
field=filer.fields.image.FilerImageField(on_delete=django.db.models.deletion.SET_NULL, blank=True, verbose_name='main image', to='filer.Image', related_name='djangocms_blog_post_image', null=True),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='main_image_full',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, verbose_name='main image full', to='cmsplugin_filer_image.ThumbnailOption', related_name='djangocms_blog_post_full', null=True),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='main_image_thumbnail',
field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, verbose_name='main image thumbnail', to='cmsplugin_filer_image.ThumbnailOption', related_name='djangocms_blog_post_thumbnail', null=True),
preserve_default=True,
),
migrations.AlterField(
model_name='post',
name='publish',
field=models.BooleanField(verbose_name='publish', default=False),
preserve_default=True,
),
migrations.AlterField(
model_name='posttranslation',
name='abstract',
field=djangocms_text_ckeditor.fields.HTMLField(verbose_name='abstract'),
preserve_default=True,
),
migrations.AlterField(
model_name='posttranslation',
name='language_code',
field=models.CharField(db_index=True, verbose_name='Language', max_length=15),
preserve_default=True,
),
migrations.AlterField(
model_name='posttranslation',
name='meta_description',
field=models.TextField(blank=True, verbose_name='post meta description', default=''),
preserve_default=True,
),
migrations.AlterField(
model_name='posttranslation',
name='meta_keywords',
field=models.TextField(blank=True, verbose_name='post meta keywords', default=''),
preserve_default=True,
),
migrations.AlterField(
model_name='posttranslation',
name='meta_title',
field=models.CharField(blank=True, help_text='used in title tag and social sharing', verbose_name='post meta title', max_length=255, default=''),
preserve_default=True,
),
migrations.AlterField(
model_name='posttranslation',
name='post_text',
field=djangocms_text_ckeditor.fields.HTMLField(blank=True, verbose_name='text', default=''),
preserve_default=True,
),
migrations.AlterField(
model_name='posttranslation',
name='title',
field=models.CharField(verbose_name='title', max_length=255),
preserve_default=True,
),
]

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from cms.models import PlaceholderField, CMSPlugin from cms.models import CMSPlugin, PlaceholderField
from cmsplugin_filer_image.models import ThumbnailOption from cmsplugin_filer_image.models import ThumbnailOption
from django.conf import settings as dj_settings from django.conf import settings as dj_settings
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
@ -7,18 +7,19 @@ from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.encoding import force_text, python_2_unicode_compatible
from django.utils.html import strip_tags, escape from django.utils.html import escape, strip_tags
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import ugettext_lazy as _, get_language from django.utils.translation import ugettext_lazy as _
from django.utils.translation import get_language
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 meta_mixin.models import ModelMeta from meta_mixin.models import ModelMeta
from parler.models import TranslatableModel, TranslatedFields
from parler.managers import TranslationManager from parler.managers import TranslationManager
from parler.models import TranslatableModel, TranslatedFields
from taggit_autosuggest.managers import TaggableManager from taggit_autosuggest.managers import TaggableManager
from .settings import get_setting
from .managers import GenericDateTaggedManager from .managers import GenericDateTaggedManager
from .settings import get_setting
BLOG_CURRENT_POST_IDENTIFIER = 'djangocms_post_current' BLOG_CURRENT_POST_IDENTIFIER = 'djangocms_post_current'
@ -76,33 +77,33 @@ class Post(ModelMeta, TranslatableModel):
Blog post Blog post
""" """
author = models.ForeignKey(dj_settings.AUTH_USER_MODEL, author = models.ForeignKey(dj_settings.AUTH_USER_MODEL,
verbose_name=_('Author'), null=True, blank=True, verbose_name=_(u'author'), null=True, blank=True,
related_name='djangocms_blog_post_author') related_name='djangocms_blog_post_author')
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(_(u'created'), auto_now_add=True)
date_modified = models.DateTimeField(auto_now=True) date_modified = models.DateTimeField(_(u'last modified'), auto_now=True)
date_published = models.DateTimeField(_('Published Since'), date_published = models.DateTimeField(_(u'published Since'),
default=timezone.now) default=timezone.now)
date_published_end = models.DateTimeField(_('Published Until'), null=True, date_published_end = models.DateTimeField(_(u'published Until'), null=True,
blank=True) blank=True)
publish = models.BooleanField(_('Publish'), default=False) publish = models.BooleanField(_(u'publish'), default=False)
categories = models.ManyToManyField(BlogCategory, verbose_name=_('category'), categories = models.ManyToManyField(BlogCategory, verbose_name=_(u'category'),
related_name='blog_posts',) related_name='blog_posts',)
main_image = FilerImageField(verbose_name=_('Main image'), blank=True, null=True, main_image = FilerImageField(verbose_name=_(u'main image'), blank=True, null=True,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
related_name='djangocms_blog_post_image') related_name='djangocms_blog_post_image')
main_image_thumbnail = models.ForeignKey(ThumbnailOption, main_image_thumbnail = models.ForeignKey(ThumbnailOption,
verbose_name=_('Main image thumbnail'), verbose_name=_(u'main image thumbnail'),
related_name='djangocms_blog_post_thumbnail', related_name='djangocms_blog_post_thumbnail',
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
blank=True, null=True) blank=True, null=True)
main_image_full = models.ForeignKey(ThumbnailOption, main_image_full = models.ForeignKey(ThumbnailOption,
verbose_name=_('Main image full'), verbose_name=_(u'main image full'),
related_name='djangocms_blog_post_full', related_name='djangocms_blog_post_full',
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
blank=True, null=True) blank=True, null=True)
enable_comments = models.BooleanField( enable_comments = models.BooleanField(
verbose_name=_(u'Enable comments on post'), verbose_name=_(u'enable comments on post'),
default=get_setting('ENABLE_COMMENTS') default=get_setting('ENABLE_COMMENTS')
) )
sites = models.ManyToManyField(Site, verbose_name=_(u'Site(s)'), blank=True, sites = models.ManyToManyField(Site, verbose_name=_(u'Site(s)'), blank=True,
@ -113,18 +114,18 @@ class Post(ModelMeta, TranslatableModel):
) )
translations = TranslatedFields( translations = TranslatedFields(
title=models.CharField(_('Title'), max_length=255), title=models.CharField(_(u'title'), max_length=255),
slug=models.SlugField(_('slug'), blank=True, db_index=True), slug=models.SlugField(_(u'slug'), blank=True, db_index=True),
abstract=HTMLField(_('Abstract'), blank=True, default=''), abstract=HTMLField(_(u'abstract'), blank=True, default=''),
meta_description=models.TextField(verbose_name=_(u'Post meta description'), meta_description=models.TextField(verbose_name=_(u'post meta description'),
blank=True, default=''), blank=True, default=''),
meta_keywords=models.TextField(verbose_name=_(u'Post meta keywords'), meta_keywords=models.TextField(verbose_name=_(u'post meta keywords'),
blank=True, default=''), blank=True, default=''),
meta_title=models.CharField(verbose_name=_(u'Post meta title'), meta_title=models.CharField(verbose_name=_(u'post meta title'),
help_text=_(u'used in title tag and social sharing'), help_text=_(u'used in title tag and social sharing'),
max_length=255, max_length=255,
blank=True, default=''), blank=True, default=''),
post_text=HTMLField(_('Text'), default='', blank=True), post_text=HTMLField(_(u'text'), default='', blank=True),
meta={'unique_together': (('language_code', 'slug'),)} meta={'unique_together': (('language_code', 'slug'),)}
) )
content = PlaceholderField('post_content', related_name='post_content') content = PlaceholderField('post_content', related_name='post_content')
@ -159,6 +160,34 @@ class Post(ModelMeta, TranslatableModel):
'url': 'get_absolute_url', 'url': 'get_absolute_url',
} }
class Meta:
verbose_name = _('blog article')
verbose_name_plural = _('blog articles')
ordering = ('-date_published', '-date_created')
get_latest_by = 'date_published'
def __str__(self):
return self.safe_translation_getter('title')
def get_absolute_url(self):
kwargs = {'year': self.date_published.year,
'month': '%02d' % self.date_published.month,
'day': '%02d' % self.date_published.day,
'slug': self.safe_translation_getter('slug',
language_code=get_language(),
any_language=True)}
return reverse('djangocms_blog:post-detail', kwargs=kwargs)
def save(self, *args, **kwargs):
super(Post, self).save(*args, **kwargs)
main_lang = self.get_current_language()
for lang in self.get_available_languages():
self.set_current_language(lang)
if not self.slug and self.title:
self.slug = slugify(self.title)
self.set_current_language(main_lang)
self.save_translations()
def get_title(self): def get_title(self):
title = self.safe_translation_getter('meta_title', any_language=True) title = self.safe_translation_getter('meta_title', any_language=True)
if not title: if not title:
@ -186,34 +215,6 @@ class Post(ModelMeta, TranslatableModel):
def get_author(self): def get_author(self):
return self.author return self.author
class Meta:
verbose_name = _('blog article')
verbose_name_plural = _('blog articles')
ordering = ('-date_published', '-date_created')
get_latest_by = 'date_published'
def __str__(self):
return self.safe_translation_getter('title')
def save(self, *args, **kwargs):
super(Post, self).save(*args, **kwargs)
main_lang = self.get_current_language()
for lang in self.get_available_languages():
self.set_current_language(lang)
if not self.slug and self.title:
self.slug = slugify(self.title)
self.set_current_language(main_lang)
self.save_translations()
def get_absolute_url(self):
kwargs = {'year': self.date_published.year,
'month': '%02d' % self.date_published.month,
'day': '%02d' % self.date_published.day,
'slug': self.safe_translation_getter('slug',
language_code=get_language(),
any_language=True)}
return reverse('djangocms_blog:post-detail', kwargs=kwargs)
def thumbnail_options(self): def thumbnail_options(self):
if self.main_image_thumbnail_id: if self.main_image_thumbnail_id:
return self.main_image_thumbnail.as_dict return self.main_image_thumbnail.as_dict
@ -244,20 +245,20 @@ class BasePostPlugin(CMSPlugin):
return posts return posts
def __str__(self): def __str__(self):
return unicode(self.latest_posts) return force_text(self.latest_posts)
class LatestPostsPlugin(BasePostPlugin): class LatestPostsPlugin(BasePostPlugin):
latest_posts = models.IntegerField(_(u'Articles'), default=get_setting('LATEST_POSTS'), latest_posts = models.IntegerField(_(u'articles'), default=get_setting('LATEST_POSTS'),
help_text=_('The number of latests articles to be displayed.')) help_text=_(u'The number of latests articles to be displayed.'))
tags = models.ManyToManyField('taggit.Tag', blank=True, tags = models.ManyToManyField('taggit.Tag', blank=True, verbose_name=_(u'filter by tag'),
help_text=_('Show only the blog articles tagged with chosen tags.')) help_text=_(u'Show only the blog articles tagged with chosen tags.'))
categories = models.ManyToManyField('BlogCategory', blank=True, categories = models.ManyToManyField('BlogCategory', blank=True, verbose_name=_(u'filter by category'),
help_text=_('Show only the blog articles tagged with chosen categories.')) help_text=_(u'Show only the blog articles tagged with chosen categories.'))
def __str__(self): def __str__(self):
return u'%s latest articles 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()
@ -273,16 +274,16 @@ class LatestPostsPlugin(BasePostPlugin):
class AuthorEntriesPlugin(BasePostPlugin): class AuthorEntriesPlugin(BasePostPlugin):
authors = models.ManyToManyField( authors = models.ManyToManyField(
dj_settings.AUTH_USER_MODEL, verbose_name=_('Authors'), dj_settings.AUTH_USER_MODEL, verbose_name=_('authors'),
limit_choices_to={'djangocms_blog_post_author__publish': True} limit_choices_to={'djangocms_blog_post_author__publish': True}
) )
latest_posts = models.IntegerField( latest_posts = models.IntegerField(
_(u'Articles'), default=get_setting('LATEST_POSTS'), _(u'articles'), default=get_setting('LATEST_POSTS'),
help_text=_('The number of author articles to be displayed.') help_text=_(u'The number of author articles to be displayed.')
) )
def __str__(self): def __str__(self):
return u'%s latest articles 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()

View file

@ -1,10 +1,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.conf.urls import patterns, url from django.conf.urls import patterns, url
from .views import (PostListView, PostDetailView, TaggedListView,
AuthorEntriesView, PostArchiveView, CategoryEntriesView)
from .feeds import LatestEntriesFeed, TagFeed from .feeds import LatestEntriesFeed, TagFeed
from .views import (AuthorEntriesView, CategoryEntriesView, PostArchiveView, PostDetailView,
PostListView, TaggedListView)
urlpatterns = patterns( urlpatterns = patterns(
'', '',

View file

@ -3,11 +3,10 @@ from django.contrib.auth import get_user_model
from django.core.urlresolvers import resolve from django.core.urlresolvers import resolve
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import get_language from django.utils.translation import get_language
from django.views.generic import ListView, DetailView from django.views.generic import DetailView, ListView
from parler.views import TranslatableSlugMixin, ViewUrlMixin
from parler.views import ViewUrlMixin, TranslatableSlugMixin from .models import BLOG_CURRENT_POST_IDENTIFIER, BlogCategory, Post
from .models import Post, BlogCategory, BLOG_CURRENT_POST_IDENTIFIER
from .settings import get_setting from .settings import get_setting
User = get_user_model() User = get_user_model()

View file

@ -1,7 +1,14 @@
[flake8]
exclude = .git,*.egg-info,build,dist,.tox,djangocms_blog/migrations/*,djangocms_blog/south_migrations/*
ignore = E501
max-line-length = 99
[metadata]
license-file = LICENSE
[wheel] [wheel]
universal = 1 universal = 1
[flake8] [isort]
max-line-length = 100 line_length = 99
ignore = E501 skip = migrations, south_migrations
exclude = djangocms_blog/migrations/*

View file

@ -15,9 +15,9 @@ version = djangocms_blog.__version__
if sys.argv[-1] == 'publish': if sys.argv[-1] == 'publish':
os.system('python setup.py sdist upload') os.system('python setup.py sdist upload')
print("You probably want to also tag the version now:") print('You probably want to also tag the version now:')
print(" git tag -a %s -m 'version %s'" % (version, version)) print(' git tag -a %s -m "version %s"' % (version, version))
print(" git push --tags") print(' git push --tags')
sys.exit() sys.exit()
readme = open('README.rst').read() readme = open('README.rst').read()
@ -50,7 +50,7 @@ setup(
'django-meta>=0.2', 'django-meta>=0.2',
'django-meta-mixin>=0.1.1', 'django-meta-mixin>=0.1.1',
], ],
license="BSD", license='BSD',
zip_safe=False, zip_safe=False,
keywords='djangocms-blog, blog, django, wordpress, multilingual', keywords='djangocms-blog, blog, django, wordpress, multilingual',
test_suite='cms_helper.run', test_suite='cms_helper.run',
@ -63,9 +63,10 @@ setup(
'Framework :: Django', 'Framework :: Django',
'Framework :: Django :: 1.6', 'Framework :: Django :: 1.6',
'Framework :: Django :: 1.7', 'Framework :: Django :: 1.7',
"Programming Language :: Python :: 2", 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
], ],

View file

@ -22,6 +22,7 @@ from djangocms_blog.models import BlogCategory, Post
User = get_user_model() User = get_user_model()
def _get_cat_pk(lang, name): def _get_cat_pk(lang, name):
return lambda: BlogCategory.objects.translated(lang, name=name).get().pk return lambda: BlogCategory.objects.translated(lang, name=name).get().pk

View file

@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import copy import copy
from django.utils.translation import activate from django.utils.translation import activate
from djangocms_blog.views import CategoryEntriesView, PostDetailView
from menus.menu_pool import menu_pool from menus.menu_pool import menu_pool
from parler.utils.context import switch_language from parler.utils.context import switch_language
from djangocms_blog.views import PostDetailView, CategoryEntriesView
from . import BaseTest from . import BaseTest

View file

@ -1,8 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from copy import deepcopy
import parler
from cms.api import add_plugin from cms.api import add_plugin
from cms.utils.copy_plugins import copy_plugins_to from cms.utils.copy_plugins import copy_plugins_to
from cms.utils.plugins import downcast_plugins from cms.utils.plugins import downcast_plugins
from copy import deepcopy
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.contrib.messages.middleware import MessageMiddleware from django.contrib.messages.middleware import MessageMiddleware
@ -10,15 +12,13 @@ from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import get_language, override from django.utils.translation import get_language, override
import parler
from taggit.models import Tag
from djangocms_blog.models import Post from djangocms_blog.models import Post
from djangocms_blog.settings import get_setting from djangocms_blog.settings import get_setting
from taggit.models import Tag
from djangocms_helper.utils import CMS_30
from . import BaseTest from . import BaseTest
from djangocms_helper.utils import CMS_30
class AdminTest(BaseTest): class AdminTest(BaseTest):
@ -215,7 +215,7 @@ class ModelsTest(BaseTest):
self.assertEqual(len(Post.objects.archived()), 1) self.assertEqual(len(Post.objects.archived()), 1)
# counting with language fallback enabled # counting with language fallback enabled
post = self._get_post(self.data['it'][0], post1, 'it') self._get_post(self.data['it'][0], post1, 'it')
self.assertEqual(len(Post.objects.filter_by_language('it')), 2) self.assertEqual(len(Post.objects.filter_by_language('it')), 2)
# No fallback # No fallback
@ -264,7 +264,7 @@ class ModelsTest(BaseTest):
def test_plugin_latest(self): def test_plugin_latest(self):
post1 = self._get_post(self.data['en'][0]) post1 = self._get_post(self.data['en'][0])
post2 = self._get_post(self.data['en'][1]) self._get_post(self.data['en'][1])
post1.tags.add('tag 1') post1.tags.add('tag 1')
post1.save() post1.save()
request = self.get_page_request('/', AnonymousUser(), r'/en/blog/', edit=False) request = self.get_page_request('/', AnonymousUser(), r'/en/blog/', edit=False)

View file

@ -1,13 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import re import re
from cms.api import add_plugin from cms.api import add_plugin
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.template import RequestContext from django.template import RequestContext
from django.utils.timezone import now from django.utils.timezone import now
from djangocms_blog.models import BlogCategory
from taggit.models import Tag from taggit.models import Tag
from . import BaseTest from . import BaseTest
from djangocms_blog.models import BlogCategory
class PluginTest(BaseTest): class PluginTest(BaseTest):
@ -33,7 +34,6 @@ class PluginTest(BaseTest):
self.assertTrue(rendered.find('<article id="post-first-post"') > -1) self.assertTrue(rendered.find('<article id="post-first-post"') > -1)
self.assertTrue(rendered.find(post1.get_absolute_url()) > -1) self.assertTrue(rendered.find(post1.get_absolute_url()) > -1)
category_2 = BlogCategory.objects.create(name=u'category 2') category_2 = BlogCategory.objects.create(name=u'category 2')
category_2.set_current_language('it', initialize=True) category_2.set_current_language('it', initialize=True)
category_2.name = u'categoria 2' category_2.name = u'categoria 2'

View file

@ -3,7 +3,6 @@ from cms.toolbar.items import ModalItem
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from djangocms_blog.models import BLOG_CURRENT_POST_IDENTIFIER from djangocms_blog.models import BLOG_CURRENT_POST_IDENTIFIER
from . import BaseTest from . import BaseTest
@ -24,4 +23,3 @@ class ToolbarTest(BaseTest):
self.assertEqual(len(blog_menu.find_items(ModalItem, url=reverse('admin:djangocms_blog_post_changelist'))), 1) self.assertEqual(len(blog_menu.find_items(ModalItem, url=reverse('admin:djangocms_blog_post_changelist'))), 1)
self.assertEqual(len(blog_menu.find_items(ModalItem, url=reverse('admin:djangocms_blog_post_add'))), 1) self.assertEqual(len(blog_menu.find_items(ModalItem, url=reverse('admin:djangocms_blog_post_add'))), 1)
self.assertEqual(len(blog_menu.find_items(ModalItem, url=reverse('admin:djangocms_blog_post_change', args=(post.pk,)))), 1) self.assertEqual(len(blog_menu.find_items(ModalItem, url=reverse('admin:djangocms_blog_post_change', args=(post.pk,)))), 1)

View file

@ -1,2 +1 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy as _

View file

@ -1,16 +1,15 @@
# -*- coding: utf-8 -*-
from cms.utils.conf import get_cms_setting from cms.utils.conf import get_cms_setting
from django.conf import settings from django.conf import settings
from django.conf.urls import patterns, include, url from django.conf.urls import include, patterns, url
from django.contrib import admin
from django.conf.urls.i18n import i18n_patterns from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.contrib.staticfiles.urls import staticfiles_urlpatterns
admin.autodiscover() admin.autodiscover()
urlpatterns = patterns('', urlpatterns = patterns(
#(r'', include('django.contrib.staticfiles.urls')), '',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
url(r'^media/cms/(?P<path>.*)$', 'django.views.static.serve', url(r'^media/cms/(?P<path>.*)$', 'django.views.static.serve',
@ -21,7 +20,8 @@ urlpatterns = patterns('',
urlpatterns += staticfiles_urlpatterns() urlpatterns += staticfiles_urlpatterns()
urlpatterns += i18n_patterns('', urlpatterns += i18n_patterns(
'',
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
url(r'^blog/', include('djangocms_blog.urls', namespace='djangocms_blog')), url(r'^blog/', include('djangocms_blog.urls', namespace='djangocms_blog')),
url(r'^', include('cms.urls')), url(r'^', include('cms.urls')),

View file

@ -1,16 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.http import Http404 from django.http import Http404
from django.utils.translation import activate
from django.utils.timezone import now from django.utils.timezone import now
from django.utils.translation import activate
from djangocms_blog.feeds import LatestEntriesFeed, TagFeed
from djangocms_blog.sitemaps import BlogSitemap
from djangocms_blog.views import (AuthorEntriesView, CategoryEntriesView, PostArchiveView,
PostDetailView, PostListView, TaggedListView)
from parler.tests.utils import override_parler_settings from parler.tests.utils import override_parler_settings
from parler.utils.conf import add_default_language_settings from parler.utils.conf import add_default_language_settings
from parler.utils.context import switch_language from parler.utils.context import switch_language
from djangocms_blog.feeds import LatestEntriesFeed, TagFeed
from djangocms_blog.sitemaps import BlogSitemap
from djangocms_blog.views import (PostListView, PostDetailView,
PostArchiveView, CategoryEntriesView,
AuthorEntriesView, TaggedListView)
from . import BaseTest from . import BaseTest
@ -68,7 +67,7 @@ class ViewTest(BaseTest):
1: ( 1: (
{'code': 'en'}, {'code': 'en'},
{'code': 'it'}, {'code': 'it'},
{'code': 'fr', 'hide_untranslated': True,}, {'code': 'fr', 'hide_untranslated': True},
), ),
'default': { 'default': {
'fallback': 'en', 'fallback': 'en',
@ -82,7 +81,7 @@ class ViewTest(BaseTest):
view_obj.request = request view_obj.request = request
view_obj.kwargs = {} view_obj.kwargs = {}
view_obj.object_list = view_obj.get_queryset() view_obj.object_list = view_obj.get_queryset()
context = view_obj.get_context_data(object_list=view_obj.object_list) view_obj.get_context_data(object_list=view_obj.object_list)
self.assertEqual(view_obj.get_queryset().count(), 2) self.assertEqual(view_obj.get_queryset().count(), 2)
PARLER_FALLBACK = add_default_language_settings(PARLER_FALLBACK) PARLER_FALLBACK = add_default_language_settings(PARLER_FALLBACK)
@ -94,7 +93,7 @@ class ViewTest(BaseTest):
view_obj.request = request view_obj.request = request
view_obj.kwargs = {} view_obj.kwargs = {}
view_obj.object_list = view_obj.get_queryset() view_obj.object_list = view_obj.get_queryset()
context = view_obj.get_context_data(object_list=view_obj.object_list) view_obj.get_context_data(object_list=view_obj.object_list)
self.assertEqual(view_obj.get_queryset().count(), 0) self.assertEqual(view_obj.get_queryset().count(), 0)
def test_post_detail_view(self): def test_post_detail_view(self):

10
tox.ini
View file

@ -1,5 +1,5 @@
[tox] [tox]
envlist = py{26}-django{16}-cms{30,31,32},py{27,33,34}-django{16,17}-cms{30,31,32} envlist = py{26}-django{16}-cms{30,31,32},py{27,33,34}-django{16,17}-cms{30,31,32},isort,pep8
[testenv] [testenv]
commands = {env:COMMAND:python} setup.py test commands = {env:COMMAND:python} setup.py test
@ -12,3 +12,11 @@ deps =
cms32: https://github.com/divio/django-cms/archive/develop.zip cms32: https://github.com/divio/django-cms/archive/develop.zip
py26: unittest2 py26: unittest2
-r{toxinidir}/requirements-test.txt -r{toxinidir}/requirements-test.txt
[testenv:isort]
deps = isort
commands = isort -c -rc djangocms_blog tests
[testenv:pep8]
deps = flake8
commands = flake8