diff --git a/blog/__init__.py b/blog/__init__.py new file mode 100644 index 0000000..197b337 --- /dev/null +++ b/blog/__init__.py @@ -0,0 +1,5 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +__author__ = 'Iacopo Spalletti' +__email__ = 'i.spalletti@nephila.it' +__version__ = '0.4.0.post1' diff --git a/blog/admin.py b/blog/admin.py new file mode 100755 index 0000000..e92f371 --- /dev/null +++ b/blog/admin.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +from admin_enhancer.admin import EnhancedModelAdminMixin +from cms.admin.placeholderadmin import PlaceholderAdminMixin, FrontendEditableAdminMixin +from copy import deepcopy +from django.contrib import admin +from django.conf import settings +from django.contrib.auth import get_user_model +from parler.admin import TranslatableAdmin + +from aldryn_apphooks_config.admin import BaseAppHookConfig, ModelAppHookConfig + + +from .forms import PostAdminForm +from .models import Post, BlogCategory, BlogConfig +from .settings import get_setting + + +class BlogCategoryAdmin(EnhancedModelAdminMixin, TranslatableAdmin): + def get_prepopulated_fields(self, request, obj=None): + return {'slug': ('name',)} + + class Media: + css = { + 'all': ('%sblog/css/%s' % (settings.STATIC_URL, + 'blog_admin.css'),) + } + + +class PostAdmin(EnhancedModelAdminMixin, FrontendEditableAdminMixin, + PlaceholderAdminMixin, TranslatableAdmin, admin.ModelAdmin): + form = PostAdminForm + list_display = ['title', 'author', 'date_published', 'date_published_end'] + date_hierarchy = 'date_published' + raw_id_fields = ['author'] + frontend_editable_fields = ('title', 'abstract', 'post_text') + enhance_exclude = ('main_image', 'tags') + _fieldsets = [ + (None, { + 'fields': [('title', 'categories', 'publish'), 'abstract'] + }), + ('Info', { + 'fields': (['slug', 'tags'], + ('date_published', 'date_published_end', 'enable_comments')), + 'classes': ('collapse',) + }), + ('Immagine', { + 'fields': (('main_image', 'main_image_thumbnail', 'main_image_full'),), + 'classes': ('collapse',) + }), + ('SEO', { + 'fields': [('meta_description', 'meta_title', 'meta_keywords')], + 'classes': ('collapse',) + }), + ] + + def get_fieldsets(self, request, obj=None): + fsets = deepcopy(self._fieldsets) + if not get_setting('USE_PLACEHOLDER'): + fsets[0][1]['fields'].append('post_text') + if get_setting('MULTISITE'): + fsets[1][1]['fields'][0].append('sites') + if request.user.is_superuser: + fsets[1][1]['fields'][0].append('author') + return fsets + + def get_prepopulated_fields(self, request, obj=None): + return {'slug': ('title',)} + + def save_model(self, request, obj, form, change): + if not obj.author_id and get_setting('AUTHOR_DEFAULT'): + if get_setting('AUTHOR_DEFAULT') is True: + user = request.user + else: + user = get_user_model().objects.get(username=get_setting('AUTHOR_DEFAULT')) + obj.author = user + super(PostAdmin, self).save_model(request, obj, form, change) + + class Media: + css = { + 'all': ('%sblog/css/%s' % (settings.STATIC_URL, + 'blog_admin.css'),) + } + + +class BlogConfigAdmin( + PlaceholderAdminMixin, + BaseAppHookConfig, + TranslatableAdmin +): + def get_config_fields(self): + return ( + 'app_title', 'category_slug', + 'paginate_by' ) + +admin.site.register(BlogConfig, BlogConfigAdmin) + +admin.site.register(BlogCategory, BlogCategoryAdmin) +admin.site.register(Post, PostAdmin) diff --git a/blog/cms_app.py b/blog/cms_app.py new file mode 100644 index 0000000..9b4a4c0 --- /dev/null +++ b/blog/cms_app.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from aldryn_apphooks_config.app_base import CMSConfigApp +from cms.apphook_pool import apphook_pool +from django.utils.translation import ugettext_lazy as _ + +from .models import BlogConfig + + +class BlogApp(CMSConfigApp): + app_config = BlogConfig + name = _('Blog') + urls = ['blog.urls'] + app_name = 'blog' + +apphook_pool.register(BlogApp) diff --git a/blog/cms_appconfig.py b/blog/cms_appconfig.py new file mode 100644 index 0000000..1f6a7e9 --- /dev/null +++ b/blog/cms_appconfig.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + +from django import forms +from django.conf import settings +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from aldryn_apphooks_config.utils import setup_config +from aldryn_apphooks_config.models import AppHookConfig +from app_data import AppDataForm +from parler.models import TranslatableModel +from parler.models import TranslatedFields + +from cms.models.fields import PlaceholderField + + +class BlogConfig(TranslatableModel, AppHookConfig): + """Adds some translatable, per-app-instance fields.""" + translations = TranslatedFields( + app_title=models.CharField(_('application title'), max_length=234), + ) + + category_slug = models.CharField( + _('Category slug'), + blank=True, + max_length=255, + help_text=_('Only category to display')) + + # blog_PAGINATE_BY + paginate_by = models.PositiveIntegerField( + _('Paginate size'), + blank=False, + default=5, + help_text=_('When paginating list views, how many articles per page?'), + ) + + placeholder_base_top = PlaceholderField( + 'newsblog_base_top', + related_name='blog_base_top', + ) + + placeholder_base_sidebar = PlaceholderField( + 'newsblog_base_sidebar', + related_name='blog_base_sidebar', + ) + + placeholder_list_top = PlaceholderField( + 'newsblog_list_top', + related_name='blog_list_top', + ) + + placeholder_list_footer = PlaceholderField( + 'newsblog_list_footer', + related_name='blog_list_footer', + ) + + placeholder_detail_top = PlaceholderField( + 'newsblog_detail_top', + related_name='blog_detail_top', + ) + + placeholder_detail_bottom = PlaceholderField( + 'newsblog_detail_bottom', + related_name='blog_detail_bottom', + ) + + placeholder_detail_footer = PlaceholderField( + 'newsblog_detail_footer', + related_name='blog_detail_footer', + ) + + def get_app_title(self): + return getattr(self, 'app_title', _('untitled')) + + +class BlogConfigForm(AppDataForm): + default_published = forms.BooleanField( + label=_(u'Post published by default'), required=False, + initial=getattr(settings, 'BLOG_DEFAULT_PUBLISHED', True)) +setup_config(BlogConfigForm, BlogConfig) diff --git a/blog/cms_plugins.py b/blog/cms_plugins.py new file mode 100644 index 0000000..d5502b4 --- /dev/null +++ b/blog/cms_plugins.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +from django.utils.translation import ugettext_lazy as _ + +from cms.models.pluginmodel import CMSPlugin +from cms.plugin_base import CMSPluginBase +from cms.plugin_pool import plugin_pool + +from .models import AuthorEntriesPlugin, LatestPostsPlugin, Post, BlogCategory +from .forms import LatestEntriesForm +from .settings import get_setting + + +class BlogPlugin(CMSPluginBase): + module = 'Blog' + + +class BlogLatestEntriesPlugin(BlogPlugin): + """ + Non cached plugin which returns the latest posts taking into account the + user / toolbar state + """ + render_template = 'blog/plugins/latest_entries.html' + name = _('Latest Blog Articles') + model = LatestPostsPlugin + form = LatestEntriesForm + filter_horizontal = ('categories',) + cache = False + + def render(self, context, instance, placeholder): + context = super(BlogLatestEntriesPlugin, self).render(context, instance, placeholder) + context['posts_list'] = instance.get_posts(context['request']) + + if instance.categories.exists(): + context['category'] = instance.categories.all()[0].slug + else: + context['category'] = "all" + + context['TRUNCWORDS_COUNT'] = get_setting('POSTS_LIST_TRUNCWORDS_COUNT') + return context + + +class BlogLatestEntriesPluginCached(BlogPlugin): + """ + Cached plugin which returns the latest published posts + """ + render_template = 'blog/plugins/latest_entries.html' + name = _('Latest Blog Articles') + model = LatestPostsPlugin + form = LatestEntriesForm + filter_horizontal = ('categories',) + + def render(self, context, instance, placeholder): + context = super(BlogLatestEntriesPluginCached, self).render(context, instance, placeholder) + context['posts_list'] = instance.get_posts() + context['TRUNCWORDS_COUNT'] = get_setting('POSTS_LIST_TRUNCWORDS_COUNT') + return context + + +class BlogAuthorPostsPlugin(BlogPlugin): + module = _('Blog') + name = _('Author Blog Articles') + model = AuthorEntriesPlugin + form = LatestEntriesForm + render_template = 'blog/plugins/authors.html' + filter_horizontal = ['authors'] + + def render(self, context, instance, placeholder): + context = super(BlogAuthorPostsPlugin, self).render(context, instance, placeholder) + context['authors_list'] = instance.get_authors() + return context + + +class BlogTagsPlugin(BlogPlugin): + module = _('Blog') + name = _('Tags') + model = CMSPlugin + render_template = 'blog/plugins/tags.html' + + def render(self, context, instance, placeholder): + context = super(BlogTagsPlugin, self).render(context, instance, placeholder) + context['tags'] = Post.objects.tag_cloud(queryset=Post.objects.published()) + return context + + +class BlogCategoryPlugin(BlogPlugin): + module = _('Blog') + name = _('Categories') + model = CMSPlugin + render_template = 'blog/plugins/categories.html' + + def render(self, context, instance, placeholder): + context = super(BlogCategoryPlugin, self).render(context, instance, placeholder) + context['categories'] = BlogCategory.objects.all() + return context + + +class BlogArchivePlugin(BlogPlugin): + module = _('Blog') + name = _('Archive') + model = CMSPlugin + render_template = 'blog/plugins/archive.html' + + def render(self, context, instance, placeholder): + context = super(BlogArchivePlugin, self).render(context, instance, placeholder) + context['dates'] = Post.objects.get_months(queryset=Post.objects.published()) + return context + + +plugin_pool.register_plugin(BlogLatestEntriesPlugin) +plugin_pool.register_plugin(BlogAuthorPostsPlugin) +plugin_pool.register_plugin(BlogTagsPlugin) +plugin_pool.register_plugin(BlogArchivePlugin) +plugin_pool.register_plugin(BlogCategoryPlugin) diff --git a/blog/cms_toolbar.py b/blog/cms_toolbar.py new file mode 100644 index 0000000..701c92f --- /dev/null +++ b/blog/cms_toolbar.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +from cms.toolbar_base import CMSToolbar +from cms.toolbar_pool import toolbar_pool +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext_lazy as _ + + +from .models import BLOG_CURRENT_POST_IDENTIFIER + + +@toolbar_pool.register +class BlogToolbar(CMSToolbar): + + def populate(self): + # TODO: Readd if not self.is_current_app condition when CMS 3.0.4 is released + if not self.request.user.has_perm('blog.add_post'): + return # pragma: no cover + admin_menu = self.toolbar.get_or_create_menu('blog', _('Blog')) + url = reverse('admin:blog_post_changelist') + admin_menu.add_modal_item(_('Post list'), url=url) + url = reverse('admin:blog_post_add') + admin_menu.add_modal_item(_('Add post'), url=url) + + current_post = getattr(self.request, BLOG_CURRENT_POST_IDENTIFIER, None) + if current_post and self.request.user.has_perm('blog.change_post'): # pragma: no cover + admin_menu.add_modal_item(_('Edit Post'), reverse( + 'admin:blog_post_change', args=(current_post.pk,)), + active=True) + + def post_template_populate(self): + current_post = getattr(self.request, BLOG_CURRENT_POST_IDENTIFIER, None) + if current_post and self.request.user.has_perm('blog.change_post'): # pragma: no cover + # removing page meta menu, if present, to avoid confusion + try: # pragma: no cover + import djangocms_page_meta + menu = self.request.toolbar.get_or_create_menu('page') + pagemeta = menu.get_or_create_menu('pagemeta', 'meta') + menu.remove_item(pagemeta) + except ImportError: + pass + # removing page tags menu, if present, to avoid confusion + try: # pragma: no cover + import djangocms_page_tags + menu = self.request.toolbar.get_or_create_menu('page') + pagetags = menu.get_or_create_menu('pagetags', 'tags') + menu.remove_item(pagetags) + except ImportError: + pass diff --git a/blog/compat.py b/blog/compat.py new file mode 100644 index 0000000..e573006 --- /dev/null +++ b/blog/compat.py @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +from operator import itemgetter +from heapq import nlargest +from itertools import repeat, ifilter + + +class Counter(dict): + """ + Dict subclass for counting hashable objects. Sometimes called a bag + or multiset. Elements are stored as dictionary keys and their counts + are stored as dictionary values. + + >>> Counter('zyzygy') + Counter({'y': 3, 'z': 2, 'g': 1}) + """ + + def __init__(self, iterable=None, **kwds): + """ + Create a new, empty Counter object. And if given, count elements + from an input iterable. Or, initialize the count from another mapping + of elements to their counts. + + >>> c = Counter() # a new, empty counter + >>> c = Counter('gallahad') # a new counter from an iterable + >>> c = Counter({'a': 4, 'b': 2}) # a new counter from a mapping + >>> c = Counter(a=4, b=2) # a new counter from keyword args + + """ + self.update(iterable, **kwds) + + def __missing__(self, key): + return 0 + + def most_common(self, n=None): + """List the n most common elements and their counts from the most + common to the least. If n is None, then list all element counts. + + >>> Counter('abracadabra').most_common(3) + [('a', 5), ('r', 2), ('b', 2)] + + """ + if n is None: + return sorted(self.iteritems(), key=itemgetter(1), reverse=True) + return nlargest(n, self.iteritems(), key=itemgetter(1)) + + def elements(self): + """Iterator over elements repeating each as many times as its count. + + >>> c = Counter('ABCABC') + >>> sorted(c.elements()) + ['A', 'A', 'B', 'B', 'C', 'C'] + + If an element's count has been set to zero or is a negative number, + elements() will ignore it. + + """ + for elem, count in self.iteritems(): + for _ in repeat(None, count): + yield elem + + # Override dict methods where the meaning changes for Counter objects. + + @classmethod + def fromkeys(cls, iterable, v=None): + raise NotImplementedError( + 'Counter.fromkeys() is undefined. Use Counter(iterable) instead.') + + def update(self, iterable=None, **kwds): + """Like dict.update() but add counts instead of replacing them. + + Source can be an iterable, a dictionary, or another Counter instance. + + >>> c = Counter('which') + >>> c.update('witch') # add elements from another iterable + >>> d = Counter('watch') + >>> c.update(d) # add elements from another counter + >>> c['h'] # four 'h' in which, witch, and watch + 4 + + """ + if iterable is not None: + if hasattr(iterable, 'iteritems'): + if self: + self_get = self.get + for elem, count in iterable.iteritems(): + self[elem] = self_get(elem, 0) + count + else: + dict.update(self, iterable) # fast path when counter is empty + else: + self_get = self.get + for elem in iterable: + self[elem] = self_get(elem, 0) + 1 + if kwds: + self.update(kwds) + + def copy(self): + 'Like dict.copy() but returns a Counter instance instead of a dict.' + return Counter(self) + + def __delitem__(self, elem): + 'Like dict.__delitem__() but does not raise KeyError for missing values.' + if elem in self: + dict.__delitem__(self, elem) + + def __repr__(self): + if not self: + return '%s()' % self.__class__.__name__ + items = ', '.join(map('%r: %r'.__mod__, self.most_common())) + return '%s({%s})' % (self.__class__.__name__, items) + + # Multiset-style mathematical operations discussed in: + # Knuth TAOCP Volume II section 4.6.3 exercise 19 + # and at http://en.wikipedia.org/wiki/Multiset + # + # Outputs guaranteed to only include positive counts. + # + # To strip negative and zero counts, add-in an empty counter: + # c += Counter() + + def __add__(self, other): + """Add counts from two counters. + + >>> Counter('abbb') + Counter('bcc') + Counter({'b': 4, 'c': 2, 'a': 1}) + + + """ + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem in set(self) | set(other): + newcount = self[elem] + other[elem] + if newcount > 0: + result[elem] = newcount + return result + + def __sub__(self, other): + """ Subtract count, but keep only results with positive counts. + + >>> Counter('abbbc') - Counter('bccd') + Counter({'b': 2, 'a': 1}) + + """ + if not isinstance(other, Counter): + return NotImplemented + result = Counter() + for elem in set(self) | set(other): + newcount = self[elem] - other[elem] + if newcount > 0: + result[elem] = newcount + return result + + def __or__(self, other): + """Union is the maximum of value in either of the input counters. + + >>> Counter('abbb') | Counter('bcc') + Counter({'b': 3, 'c': 2, 'a': 1}) + + """ + if not isinstance(other, Counter): + return NotImplemented + _max = max + result = Counter() + for elem in set(self) | set(other): + newcount = _max(self[elem], other[elem]) + if newcount > 0: + result[elem] = newcount + return result + + def __and__(self, other): + """ Intersection is the minimum of corresponding counts. + + >>> Counter('abbb') & Counter('bcc') + Counter({'b': 1}) + + """ + if not isinstance(other, Counter): + return NotImplemented + _min = min + result = Counter() + if len(self) < len(other): + self, other = other, self + for elem in ifilter(self.__contains__, other): + newcount = _min(self[elem], other[elem]) + if newcount > 0: + result[elem] = newcount + return result diff --git a/blog/feeds.py b/blog/feeds.py new file mode 100644 index 0000000..1497d88 --- /dev/null +++ b/blog/feeds.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from django.contrib.sites.models import Site +from django.contrib.syndication.views import Feed +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext as _ + +from .models import Post + + +class LatestEntriesFeed(Feed): + + def link(self): + return reverse('blog:posts-latest') + + def title(self): + return _('Blog articles on %(site_name)s') % {'site_name': Site.objects.get_current().name} + + def items(self, obj=None): + return Post.objects.published().order_by('-date_published')[:10] + + def item_title(self, item): + return item.safe_translation_getter('title') + + def item_description(self, item): + return item.safe_translation_getter('abstract') + + +class TagFeed(LatestEntriesFeed): + + def get_object(self, request, tag): + return tag # pragma: no cover + + def items(self, obj=None): + return Post.objects.published().filter(tags__slug=obj)[:10] diff --git a/blog/forms.py b/blog/forms.py new file mode 100644 index 0000000..2968523 --- /dev/null +++ b/blog/forms.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.conf import settings +from parler.forms import TranslatableModelForm +from taggit_autosuggest.widgets import TagAutoSuggest + +from .models import Post + + +class LatestEntriesForm(forms.ModelForm): + + def __init__(self, *args, **kwargs): + super(LatestEntriesForm, self).__init__(*args, **kwargs) + + class Media: + css = { + 'all': ('%sblog/css/%s' % (settings.STATIC_URL, + 'blog_admin.css'),) + } + + +class PostAdminForm(TranslatableModelForm): + + def __init__(self, *args, **kwargs): + super(PostAdminForm, self).__init__(*args, **kwargs) + original_attrs = self.fields['meta_description'].widget.attrs + original_attrs['maxlength'] = 160 + self.fields['meta_description'].widget = forms.TextInput(original_attrs) + self.fields['meta_title'].max_length = 70 + + class Meta: + model = Post + exclude = () diff --git a/blog/locale/ar/LC_MESSAGES/django.mo b/blog/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000..87f17d0 Binary files /dev/null and b/blog/locale/ar/LC_MESSAGES/django.mo differ diff --git a/blog/locale/ar/LC_MESSAGES/django.po b/blog/locale/ar/LC_MESSAGES/django.po new file mode 100644 index 0000000..a627d3d --- /dev/null +++ b/blog/locale/ar/LC_MESSAGES/django.po @@ -0,0 +1,279 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Bashar Al-Abdulhadi, 2014 +msgid "" +msgstr "" +"Project-Id-Version: djangocms-blog\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-30 12:49+0100\n" +"PO-Revision-Date: 2014-11-30 11:49+0000\n" +"Last-Translator: yakky \n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/djangocms-blog/language/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"X-Generator: Lokalize 1.5\n" + +#: cms_app.py:8 cms_plugins.py:32 cms_plugins.py:45 cms_plugins.py:56 +#: cms_plugins.py:67 cms_toolbar.py:18 +msgid "Blog" +msgstr "المدونة" + +#: cms_plugins.py:20 +msgid "Latest Blog Articles" +msgstr "آخر مواضيع المدونة" + +#: cms_plugins.py:33 +msgid "Author Blog Articles" +msgstr "ناشر مواضيع المدونة" + +#: cms_plugins.py:46 templates/djangocms_blog/plugins/tags.html:4 +msgid "Tags" +msgstr "علامات" + +#: cms_plugins.py:57 templates/djangocms_blog/plugins/categories.html:4 +msgid "Categories" +msgstr "الأقسام" + +#: cms_plugins.py:68 templates/djangocms_blog/post_list.html:12 +#: templates/djangocms_blog/plugins/archive.html:4 +msgid "Archive" +msgstr "الأرشيف" + +#: cms_toolbar.py:20 +msgid "Post list" +msgstr "قائمة المواضيع" + +#: cms_toolbar.py:22 +msgid "Add post" +msgstr "إضافة موضوع" + +#: cms_toolbar.py:26 +msgid "Edit Post" +msgstr "التعديل على موضوع" + +#: feeds.py:16 +#, python-format +msgid "Blog articles on %(site_name)s" +msgstr "مواضيع المدونة على %(site_name)s" + +#: models.py:31 +msgid "parent" +msgstr "" + +#: models.py:33 +msgid "created at" +msgstr "" + +#: models.py:34 +msgid "modified at" +msgstr "" + +#: models.py:37 +msgid "name" +msgstr "" + +#: models.py:38 models.py:105 +msgid "slug" +msgstr "" + +#: models.py:45 +msgid "blog category" +msgstr "" + +#: models.py:46 +msgid "blog categories" +msgstr "" + +#: models.py:70 +msgid "Author" +msgstr "" + +#: models.py:75 +msgid "Published Since" +msgstr "" + +#: models.py:77 +msgid "Published Until" +msgstr "" + +#: models.py:79 +msgid "Publish" +msgstr "" + +#: models.py:80 +msgid "category" +msgstr "" + +#: models.py:82 +msgid "Main image" +msgstr "" + +#: models.py:85 +msgid "Main image thumbnail" +msgstr "" + +#: models.py:89 +msgid "Main image full" +msgstr "" + +#: models.py:93 +msgid "Enable comments on post" +msgstr "" + +#: models.py:96 +msgid "Site(s)" +msgstr "" + +#: models.py:98 +msgid "" +"Select sites in which to show the post. If none is set it will be visible in" +" all the configured sites." +msgstr "" + +#: models.py:104 +msgid "Title" +msgstr "" + +#: models.py:106 +msgid "Abstract" +msgstr "" + +#: models.py:107 +msgid "Post meta description" +msgstr "" + +#: models.py:109 +msgid "Post meta keywords" +msgstr "" + +#: models.py:111 +msgid "Post meta title" +msgstr "" + +#: models.py:112 +msgid "used in title tag and social sharing" +msgstr "" + +#: models.py:115 +msgid "Text" +msgstr "" + +#: models.py:178 +msgid "blog article" +msgstr "" + +#: models.py:179 +msgid "blog articles" +msgstr "" + +#: models.py:222 models.py:250 +msgid "Articles" +msgstr "" + +#: models.py:223 +msgid "The number of latests articles to be displayed." +msgstr "" + +#: models.py:225 +msgid "Show only the blog articles tagged with chosen tags." +msgstr "" + +#: models.py:227 +msgid "Show only the blog articles tagged with chosen categories." +msgstr "" + +#: models.py:246 templates/djangocms_blog/plugins/authors.html:3 +msgid "Authors" +msgstr "" + +#: models.py:251 +msgid "The number of author articles to be displayed." +msgstr "" + +#: templates/djangocms_blog/post_detail.html:18 +#: templates/djangocms_blog/includes/blog_item.html:11 +msgid "by" +msgstr "" + +#: templates/djangocms_blog/post_list.html:11 +msgid "Articles by" +msgstr "" + +#: templates/djangocms_blog/post_list.html:13 +msgid "Tag" +msgstr "" + +#: templates/djangocms_blog/post_list.html:14 +msgid "Category" +msgstr "" + +#: templates/djangocms_blog/post_list.html:21 +#: templates/djangocms_blog/plugins/archive.html:27 +#: templates/djangocms_blog/plugins/authors.html:15 +#: templates/djangocms_blog/plugins/categories.html:16 +#: templates/djangocms_blog/plugins/latest_entries.html:7 +#: templates/djangocms_blog/plugins/tags.html:16 +msgid "No article found." +msgstr "" + +#: templates/djangocms_blog/post_list.html:24 +msgid "Back" +msgstr "" + +#: templates/djangocms_blog/post_list.html:30 +msgid "previous" +msgstr "" + +#: templates/djangocms_blog/post_list.html:33 +msgid "Page" +msgstr "" + +#: templates/djangocms_blog/post_list.html:33 +msgid "of" +msgstr "" + +#: templates/djangocms_blog/post_list.html:36 +msgid "next" +msgstr "" + +#: templates/djangocms_blog/includes/blog_item.html:46 +msgid "read more" +msgstr "" + +#: templates/djangocms_blog/plugins/archive.html:18 +#: templates/djangocms_blog/plugins/authors.html:10 +#: templates/djangocms_blog/plugins/categories.html:11 +#: templates/djangocms_blog/plugins/tags.html:11 +#, python-format +msgid "1 article" +msgid_plural "%(articles)s articles" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/djangocms_blog/plugins/archive.html:19 +#: templates/djangocms_blog/plugins/authors.html:11 +#: templates/djangocms_blog/plugins/categories.html:12 +#: templates/djangocms_blog/plugins/tags.html:12 +msgid "0 articles" +msgstr "" + +#~ msgid "blog post" +#~ msgstr "blog post" + +#~ msgid "Posts" +#~ msgstr "Posts" + +#~ msgid "Entries by" +#~ msgstr "Entries by" + +#~ msgid "No entry found." +#~ msgstr "No entry found." diff --git a/blog/locale/de/LC_MESSAGES/django.mo b/blog/locale/de/LC_MESSAGES/django.mo new file mode 100644 index 0000000..2fe45d2 Binary files /dev/null and b/blog/locale/de/LC_MESSAGES/django.mo differ diff --git a/blog/locale/de/LC_MESSAGES/django.po b/blog/locale/de/LC_MESSAGES/django.po new file mode 100644 index 0000000..68dc3da --- /dev/null +++ b/blog/locale/de/LC_MESSAGES/django.po @@ -0,0 +1,275 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Christoph Reimers , 2014 +msgid "" +msgstr "" +"Project-Id-Version: djangocms-blog\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-30 12:49+0100\n" +"PO-Revision-Date: 2014-11-30 17:34+0000\n" +"Last-Translator: Christoph Reimers \n" +"Language-Team: German (http://www.transifex.com/projects/p/djangocms-blog/language/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.5\n" + +#: cms_app.py:8 cms_plugins.py:32 cms_plugins.py:45 cms_plugins.py:56 +#: cms_plugins.py:67 cms_toolbar.py:18 +msgid "Blog" +msgstr "Blog" + +#: cms_plugins.py:20 +msgid "Latest Blog Articles" +msgstr "Letzte Blog-Einträge" + +#: cms_plugins.py:33 +msgid "Author Blog Articles" +msgstr "Autoren Blog-Artikel" + +#: cms_plugins.py:46 templates/djangocms_blog/plugins/tags.html:4 +msgid "Tags" +msgstr "Tags" + +#: cms_plugins.py:57 templates/djangocms_blog/plugins/categories.html:4 +msgid "Categories" +msgstr "Kategorien" + +#: cms_plugins.py:68 templates/djangocms_blog/post_list.html:12 +#: templates/djangocms_blog/plugins/archive.html:4 +msgid "Archive" +msgstr "Archiv" + +#: cms_toolbar.py:20 +msgid "Post list" +msgstr "Post Liste" + +#: cms_toolbar.py:22 +msgid "Add post" +msgstr "Post hinzufügen" + +#: cms_toolbar.py:26 +msgid "Edit Post" +msgstr "Post bearbeiten" + +#: feeds.py:16 +#, python-format +msgid "Blog articles on %(site_name)s" +msgstr "Blog-Artikel auf %(site_name)s" + +#: models.py:31 +msgid "parent" +msgstr "übergeordnetes Element" + +#: models.py:33 +msgid "created at" +msgstr "erstellt am" + +#: models.py:34 +msgid "modified at" +msgstr "bearbeitet am" + +#: models.py:37 +msgid "name" +msgstr "Name" + +#: models.py:38 models.py:105 +msgid "slug" +msgstr "slug" + +#: models.py:45 +msgid "blog category" +msgstr "Blog-Kategorie" + +#: models.py:46 +msgid "blog categories" +msgstr "Blog-Kategorien" + +#: models.py:70 +msgid "Author" +msgstr "Autor" + +#: models.py:75 +msgid "Published Since" +msgstr "Veröffentlicht seit" + +#: models.py:77 +msgid "Published Until" +msgstr "Veröffentlicht bis" + +#: models.py:79 +msgid "Publish" +msgstr "Veröffentlichen" + +#: models.py:80 +msgid "category" +msgstr "Kategorie" + +#: models.py:82 +msgid "Main image" +msgstr "Haupt-Bild" + +#: models.py:85 +msgid "Main image thumbnail" +msgstr "Haupt-Bild Vorschau" + +#: models.py:89 +msgid "Main image full" +msgstr "volles Haupt-Bild" + +#: models.py:93 +msgid "Enable comments on post" +msgstr "Kommentare einschalten" + +#: models.py:96 +msgid "Site(s)" +msgstr "Seite(n)" + +#: models.py:98 +msgid "" +"Select sites in which to show the post. If none is set it will be visible in" +" all the configured sites." +msgstr "Wähle Seiten aus, auf welchen der Post angezeigt wird. Ohne Auswahl sichtbar auf allen konfigurierten Seiten." + +#: models.py:104 +msgid "Title" +msgstr "Titel" + +#: models.py:106 +msgid "Abstract" +msgstr "Auszug" + +#: models.py:107 +msgid "Post meta description" +msgstr "Post Meta-Description" + +#: models.py:109 +msgid "Post meta keywords" +msgstr "Post Meta-Keywords" + +#: models.py:111 +msgid "Post meta title" +msgstr "Post Meta-Titel" + +#: models.py:112 +msgid "used in title tag and social sharing" +msgstr "Wird im Titel-Tag und für das soziale Teilen genutzt" + +#: models.py:115 +msgid "Text" +msgstr "Text" + +#: models.py:178 +msgid "blog article" +msgstr "Blog-Artikel" + +#: models.py:179 +msgid "blog articles" +msgstr "Blog-Artikel" + +#: models.py:222 models.py:250 +msgid "Articles" +msgstr "Artikel" + +#: models.py:223 +msgid "The number of latests articles to be displayed." +msgstr "Anzahl der anzuzeigenden letzten Artikel" + +#: models.py:225 +msgid "Show only the blog articles tagged with chosen tags." +msgstr "Nur die Blog-Einträge mit dem ausgewählten Tag anzeigen" + +#: models.py:227 +msgid "Show only the blog articles tagged with chosen categories." +msgstr "Nur die Blog-Einträge der ausgewählten Kategorie anzeigen" + +#: models.py:246 templates/djangocms_blog/plugins/authors.html:3 +msgid "Authors" +msgstr "Authoren" + +#: models.py:251 +msgid "The number of author articles to be displayed." +msgstr "Die Anzahl der anzuzeigenden Autoren-Artikel" + +#: templates/djangocms_blog/post_detail.html:18 +#: templates/djangocms_blog/includes/blog_item.html:11 +msgid "by" +msgstr "von" + +#: templates/djangocms_blog/post_list.html:11 +msgid "Articles by" +msgstr "Artikel von" + +#: templates/djangocms_blog/post_list.html:13 +msgid "Tag" +msgstr "Tag" + +#: templates/djangocms_blog/post_list.html:14 +msgid "Category" +msgstr "Kategorie" + +#: templates/djangocms_blog/post_list.html:21 +#: templates/djangocms_blog/plugins/archive.html:27 +#: templates/djangocms_blog/plugins/authors.html:15 +#: templates/djangocms_blog/plugins/categories.html:16 +#: templates/djangocms_blog/plugins/latest_entries.html:7 +#: templates/djangocms_blog/plugins/tags.html:16 +msgid "No article found." +msgstr "Kein Artikel gefunden." + +#: templates/djangocms_blog/post_list.html:24 +msgid "Back" +msgstr "Zurück" + +#: templates/djangocms_blog/post_list.html:30 +msgid "previous" +msgstr "vorheriger" + +#: templates/djangocms_blog/post_list.html:33 +msgid "Page" +msgstr "Seite" + +#: templates/djangocms_blog/post_list.html:33 +msgid "of" +msgstr "von" + +#: templates/djangocms_blog/post_list.html:36 +msgid "next" +msgstr "nächste" + +#: templates/djangocms_blog/includes/blog_item.html:46 +msgid "read more" +msgstr "weiterlesen" + +#: templates/djangocms_blog/plugins/archive.html:18 +#: templates/djangocms_blog/plugins/authors.html:10 +#: templates/djangocms_blog/plugins/categories.html:11 +#: templates/djangocms_blog/plugins/tags.html:11 +#, python-format +msgid "1 article" +msgid_plural "%(articles)s articles" +msgstr[0] "Ein Artikel" +msgstr[1] "%(articles)s Artikel" + +#: templates/djangocms_blog/plugins/archive.html:19 +#: templates/djangocms_blog/plugins/authors.html:11 +#: templates/djangocms_blog/plugins/categories.html:12 +#: templates/djangocms_blog/plugins/tags.html:12 +msgid "0 articles" +msgstr "0 Artikel" + +#~ msgid "blog post" +#~ msgstr "blog post" + +#~ msgid "Posts" +#~ msgstr "Posts" + +#~ msgid "Entries by" +#~ msgstr "Entries by" + +#~ msgid "No entry found." +#~ msgstr "No entry found." diff --git a/blog/locale/en/LC_MESSAGES/django.mo b/blog/locale/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000..fbf2d2b Binary files /dev/null and b/blog/locale/en/LC_MESSAGES/django.mo differ diff --git a/blog/locale/en/LC_MESSAGES/django.po b/blog/locale/en/LC_MESSAGES/django.po new file mode 100644 index 0000000..8f44053 --- /dev/null +++ b/blog/locale/en/LC_MESSAGES/django.po @@ -0,0 +1,276 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Iacopo Spalletti, 2014. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-30 12:50+0100\n" +"PO-Revision-Date: 2014-03-05 18:09+0100\n" +"Last-Translator: Iacopo Spalletti\n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.5\n" + +#: cms_app.py:8 cms_plugins.py:32 cms_plugins.py:45 cms_plugins.py:56 +#: cms_plugins.py:67 cms_toolbar.py:18 +msgid "Blog" +msgstr "Blog" + +#: cms_plugins.py:20 +msgid "Latest Blog Articles" +msgstr "Latest Blog Articles" + +#: cms_plugins.py:33 +msgid "Author Blog Articles" +msgstr "Author Blog Articles" + +#: cms_plugins.py:46 templates/djangocms_blog/plugins/tags.html:4 +msgid "Tags" +msgstr "Tags" + +#: cms_plugins.py:57 templates/djangocms_blog/plugins/categories.html:4 +msgid "Categories" +msgstr "Categories" + +#: cms_plugins.py:68 templates/djangocms_blog/post_list.html:12 +#: templates/djangocms_blog/plugins/archive.html:4 +msgid "Archive" +msgstr "Archive" + +#: cms_toolbar.py:20 +msgid "Post list" +msgstr "Post list" + +#: cms_toolbar.py:22 +msgid "Add post" +msgstr "Add post" + +#: cms_toolbar.py:26 +msgid "Edit Post" +msgstr "" + +#: feeds.py:16 +#, python-format +msgid "Blog articles on %(site_name)s" +msgstr "Blog articles on %(site_name)s" + +#: models.py:31 +msgid "parent" +msgstr "parent" + +#: models.py:33 +msgid "created at" +msgstr "created at" + +#: models.py:34 +msgid "modified at" +msgstr "modified at" + +#: models.py:37 +msgid "name" +msgstr "name" + +#: models.py:38 models.py:105 +msgid "slug" +msgstr "slug" + +#: models.py:45 +msgid "blog category" +msgstr "blog category" + +#: models.py:46 +msgid "blog categories" +msgstr "blog categories" + +#: models.py:70 +msgid "Author" +msgstr "Author" + +#: models.py:75 +msgid "Published Since" +msgstr "Published Since" + +#: models.py:77 +msgid "Published Until" +msgstr "Published Until" + +#: models.py:79 +msgid "Publish" +msgstr "Publish" + +#: models.py:80 +msgid "category" +msgstr "category" + +#: models.py:82 +msgid "Main image" +msgstr "Main image" + +#: models.py:85 +msgid "Main image thumbnail" +msgstr "Main image thumbnail" + +#: models.py:89 +msgid "Main image full" +msgstr "Main image full" + +#: models.py:93 +msgid "Enable comments on post" +msgstr "" + +#: models.py:96 +msgid "Site(s)" +msgstr "" + +#: models.py:98 +msgid "" +"Select sites in which to show the post. If none is set it will be visible in " +"all the configured sites." +msgstr "" + +#: models.py:104 +msgid "Title" +msgstr "Title" + +#: models.py:106 +msgid "Abstract" +msgstr "" + +#: models.py:107 +msgid "Post meta description" +msgstr "Post meta description" + +#: models.py:109 +#, fuzzy +msgid "Post meta keywords" +msgstr "Post meta description" + +#: models.py:111 +#, fuzzy +msgid "Post meta title" +msgstr "Post meta description" + +#: models.py:112 +msgid "used in title tag and social sharing" +msgstr "" + +#: models.py:115 +msgid "Text" +msgstr "Text" + +#: models.py:178 +msgid "blog article" +msgstr "blog article" + +#: models.py:179 +msgid "blog articles" +msgstr "blog articles" + +#: models.py:222 models.py:250 +msgid "Articles" +msgstr "Articles" + +#: models.py:223 +msgid "The number of latests articles to be displayed." +msgstr "The number of latests articles to be displayed." + +#: models.py:225 +msgid "Show only the blog articles tagged with chosen tags." +msgstr "Show only the blog articles tagged with chosen tags." + +#: models.py:227 +msgid "Show only the blog articles tagged with chosen categories." +msgstr "Show only the blog articles tagged with chosen categories." + +#: models.py:246 templates/djangocms_blog/plugins/authors.html:3 +msgid "Authors" +msgstr "Authors" + +#: models.py:251 +msgid "The number of author articles to be displayed." +msgstr "The number of author articles to be displayed." + +#: templates/djangocms_blog/post_detail.html:18 +#: templates/djangocms_blog/includes/blog_item.html:11 +msgid "by" +msgstr "by" + +#: templates/djangocms_blog/post_list.html:11 +msgid "Articles by" +msgstr "Articles by" + +#: templates/djangocms_blog/post_list.html:13 +msgid "Tag" +msgstr "Tag" + +#: templates/djangocms_blog/post_list.html:14 +msgid "Category" +msgstr "Category" + +#: templates/djangocms_blog/post_list.html:21 +#: templates/djangocms_blog/plugins/archive.html:27 +#: templates/djangocms_blog/plugins/authors.html:15 +#: templates/djangocms_blog/plugins/categories.html:16 +#: templates/djangocms_blog/plugins/latest_entries.html:7 +#: templates/djangocms_blog/plugins/tags.html:16 +msgid "No article found." +msgstr "No article found." + +#: templates/djangocms_blog/post_list.html:24 +msgid "Back" +msgstr "Back" + +#: templates/djangocms_blog/post_list.html:30 +msgid "previous" +msgstr "previous" + +#: templates/djangocms_blog/post_list.html:33 +msgid "Page" +msgstr "Page" + +#: templates/djangocms_blog/post_list.html:33 +msgid "of" +msgstr "of" + +#: templates/djangocms_blog/post_list.html:36 +msgid "next" +msgstr "next" + +#: templates/djangocms_blog/includes/blog_item.html:46 +msgid "read more" +msgstr "read more" + +#: templates/djangocms_blog/plugins/archive.html:18 +#: templates/djangocms_blog/plugins/authors.html:10 +#: templates/djangocms_blog/plugins/categories.html:11 +#: templates/djangocms_blog/plugins/tags.html:11 +#, python-format +msgid "1 article" +msgid_plural "%(articles)s articles" +msgstr[0] "1 article" +msgstr[1] "%(articles)s articles" + +#: templates/djangocms_blog/plugins/archive.html:19 +#: templates/djangocms_blog/plugins/authors.html:11 +#: templates/djangocms_blog/plugins/categories.html:12 +#: templates/djangocms_blog/plugins/tags.html:12 +msgid "0 articles" +msgstr "0 articles" + +#~ msgid "blog post" +#~ msgstr "blog post" + +#~ msgid "Posts" +#~ msgstr "Posts" + +#~ msgid "Entries by" +#~ msgstr "Entries by" + +#~ msgid "No entry found." +#~ msgstr "No entry found." diff --git a/blog/locale/it/LC_MESSAGES/django.mo b/blog/locale/it/LC_MESSAGES/django.mo new file mode 100644 index 0000000..287b7fd Binary files /dev/null and b/blog/locale/it/LC_MESSAGES/django.mo differ diff --git a/blog/locale/it/LC_MESSAGES/django.po b/blog/locale/it/LC_MESSAGES/django.po new file mode 100644 index 0000000..a1c2d80 --- /dev/null +++ b/blog/locale/it/LC_MESSAGES/django.po @@ -0,0 +1,276 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Iacopo Spalletti, 2014 +# yakky , 2014 +msgid "" +msgstr "" +"Project-Id-Version: djangocms-blog\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-30 12:49+0100\n" +"PO-Revision-Date: 2014-11-30 11:51+0000\n" +"Last-Translator: yakky \n" +"Language-Team: Italian (http://www.transifex.com/projects/p/djangocms-blog/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Lokalize 1.5\n" + +#: cms_app.py:8 cms_plugins.py:32 cms_plugins.py:45 cms_plugins.py:56 +#: cms_plugins.py:67 cms_toolbar.py:18 +msgid "Blog" +msgstr "Blog" + +#: cms_plugins.py:20 +msgid "Latest Blog Articles" +msgstr "Ultimi articoli" + +#: cms_plugins.py:33 +msgid "Author Blog Articles" +msgstr "Articoli per autore" + +#: cms_plugins.py:46 templates/djangocms_blog/plugins/tags.html:4 +msgid "Tags" +msgstr "Tag" + +#: cms_plugins.py:57 templates/djangocms_blog/plugins/categories.html:4 +msgid "Categories" +msgstr "Categorie" + +#: cms_plugins.py:68 templates/djangocms_blog/post_list.html:12 +#: templates/djangocms_blog/plugins/archive.html:4 +msgid "Archive" +msgstr "Archivio" + +#: cms_toolbar.py:20 +msgid "Post list" +msgstr "Lista degli articoli" + +#: cms_toolbar.py:22 +msgid "Add post" +msgstr "Aggiungi articolo" + +#: cms_toolbar.py:26 +msgid "Edit Post" +msgstr "Modifica articolo" + +#: feeds.py:16 +#, python-format +msgid "Blog articles on %(site_name)s" +msgstr "Articoli del blog su %(site_name)s" + +#: models.py:31 +msgid "parent" +msgstr "superiore" + +#: models.py:33 +msgid "created at" +msgstr "creato il" + +#: models.py:34 +msgid "modified at" +msgstr "modificato il" + +#: models.py:37 +msgid "name" +msgstr "nome" + +#: models.py:38 models.py:105 +msgid "slug" +msgstr "slug" + +#: models.py:45 +msgid "blog category" +msgstr "categoria del blog" + +#: models.py:46 +msgid "blog categories" +msgstr "categorie del blog" + +#: models.py:70 +msgid "Author" +msgstr "Autore" + +#: models.py:75 +msgid "Published Since" +msgstr "Pubblicato il" + +#: models.py:77 +msgid "Published Until" +msgstr "fino al" + +#: models.py:79 +msgid "Publish" +msgstr "Pubblicato" + +#: models.py:80 +msgid "category" +msgstr "categoria" + +#: models.py:82 +msgid "Main image" +msgstr "Immagine" + +#: models.py:85 +msgid "Main image thumbnail" +msgstr "Dimensione miniatura" + +#: models.py:89 +msgid "Main image full" +msgstr "Dimensione piena" + +#: models.py:93 +msgid "Enable comments on post" +msgstr "Abilita commenti sul post" + +#: models.py:96 +msgid "Site(s)" +msgstr "Sito/i" + +#: models.py:98 +msgid "" +"Select sites in which to show the post. If none is set it will be visible in" +" all the configured sites." +msgstr "Seleziona i siti in cui deve apparire l'articolo. Se non è selezionato nessun sito, l'articolo comparirà in tutti i siti configurati." + +#: models.py:104 +msgid "Title" +msgstr "Titolo" + +#: models.py:106 +msgid "Abstract" +msgstr "Riassunto" + +#: models.py:107 +msgid "Post meta description" +msgstr "Descrizione SEO dell'articolo" + +#: models.py:109 +msgid "Post meta keywords" +msgstr "Keyword SEO dell'articolo" + +#: models.py:111 +msgid "Post meta title" +msgstr "Titolo SEO dell'articolo" + +#: models.py:112 +msgid "used in title tag and social sharing" +msgstr "Usato nel tag title e nei titoli per le condivisioni sui social network" + +#: models.py:115 +msgid "Text" +msgstr "Test" + +#: models.py:178 +msgid "blog article" +msgstr "articolo del blog" + +#: models.py:179 +msgid "blog articles" +msgstr "articoli del blog" + +#: models.py:222 models.py:250 +msgid "Articles" +msgstr "Articoli" + +#: models.py:223 +msgid "The number of latests articles to be displayed." +msgstr "Il numero di articoli da mostrare." + +#: models.py:225 +msgid "Show only the blog articles tagged with chosen tags." +msgstr "Mostra solo gli articoli marcati con i tag selezionati." + +#: models.py:227 +msgid "Show only the blog articles tagged with chosen categories." +msgstr "Mostra solo gli articoli marcati con i categorie selezionati." + +#: models.py:246 templates/djangocms_blog/plugins/authors.html:3 +msgid "Authors" +msgstr "Autori" + +#: models.py:251 +msgid "The number of author articles to be displayed." +msgstr "Numero di elementi per autore da mostrare." + +#: templates/djangocms_blog/post_detail.html:18 +#: templates/djangocms_blog/includes/blog_item.html:11 +msgid "by" +msgstr "di" + +#: templates/djangocms_blog/post_list.html:11 +msgid "Articles by" +msgstr "Articoli di" + +#: templates/djangocms_blog/post_list.html:13 +msgid "Tag" +msgstr "Tag" + +#: templates/djangocms_blog/post_list.html:14 +msgid "Category" +msgstr "Categoria" + +#: templates/djangocms_blog/post_list.html:21 +#: templates/djangocms_blog/plugins/archive.html:27 +#: templates/djangocms_blog/plugins/authors.html:15 +#: templates/djangocms_blog/plugins/categories.html:16 +#: templates/djangocms_blog/plugins/latest_entries.html:7 +#: templates/djangocms_blog/plugins/tags.html:16 +msgid "No article found." +msgstr "Nessun articolo trovato." + +#: templates/djangocms_blog/post_list.html:24 +msgid "Back" +msgstr "Indietro" + +#: templates/djangocms_blog/post_list.html:30 +msgid "previous" +msgstr "precedente" + +#: templates/djangocms_blog/post_list.html:33 +msgid "Page" +msgstr "Pagina" + +#: templates/djangocms_blog/post_list.html:33 +msgid "of" +msgstr "di" + +#: templates/djangocms_blog/post_list.html:36 +msgid "next" +msgstr "successivo" + +#: templates/djangocms_blog/includes/blog_item.html:46 +msgid "read more" +msgstr "leggi" + +#: templates/djangocms_blog/plugins/archive.html:18 +#: templates/djangocms_blog/plugins/authors.html:10 +#: templates/djangocms_blog/plugins/categories.html:11 +#: templates/djangocms_blog/plugins/tags.html:11 +#, python-format +msgid "1 article" +msgid_plural "%(articles)s articles" +msgstr[0] "1 articolo" +msgstr[1] "%(articles)s articoli" + +#: templates/djangocms_blog/plugins/archive.html:19 +#: templates/djangocms_blog/plugins/authors.html:11 +#: templates/djangocms_blog/plugins/categories.html:12 +#: templates/djangocms_blog/plugins/tags.html:12 +msgid "0 articles" +msgstr "0 articoli" + +#~ msgid "blog post" +#~ msgstr "blog post" + +#~ msgid "Posts" +#~ msgstr "Posts" + +#~ msgid "Entries by" +#~ msgstr "Entries by" + +#~ msgid "No entry found." +#~ msgstr "No entry found." diff --git a/blog/locale/pt_BR/LC_MESSAGES/django.mo b/blog/locale/pt_BR/LC_MESSAGES/django.mo new file mode 100644 index 0000000..d26d46d Binary files /dev/null and b/blog/locale/pt_BR/LC_MESSAGES/django.mo differ diff --git a/blog/locale/pt_BR/LC_MESSAGES/django.po b/blog/locale/pt_BR/LC_MESSAGES/django.po new file mode 100644 index 0000000..6a5b51e --- /dev/null +++ b/blog/locale/pt_BR/LC_MESSAGES/django.po @@ -0,0 +1,274 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: djangocms-blog\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-30 12:49+0100\n" +"PO-Revision-Date: 2014-11-30 11:49+0000\n" +"Last-Translator: yakky \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/djangocms-blog/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Lokalize 1.5\n" + +#: cms_app.py:8 cms_plugins.py:32 cms_plugins.py:45 cms_plugins.py:56 +#: cms_plugins.py:67 cms_toolbar.py:18 +msgid "Blog" +msgstr "" + +#: cms_plugins.py:20 +msgid "Latest Blog Articles" +msgstr "" + +#: cms_plugins.py:33 +msgid "Author Blog Articles" +msgstr "" + +#: cms_plugins.py:46 templates/djangocms_blog/plugins/tags.html:4 +msgid "Tags" +msgstr "" + +#: cms_plugins.py:57 templates/djangocms_blog/plugins/categories.html:4 +msgid "Categories" +msgstr "" + +#: cms_plugins.py:68 templates/djangocms_blog/post_list.html:12 +#: templates/djangocms_blog/plugins/archive.html:4 +msgid "Archive" +msgstr "" + +#: cms_toolbar.py:20 +msgid "Post list" +msgstr "" + +#: cms_toolbar.py:22 +msgid "Add post" +msgstr "" + +#: cms_toolbar.py:26 +msgid "Edit Post" +msgstr "" + +#: feeds.py:16 +#, python-format +msgid "Blog articles on %(site_name)s" +msgstr "" + +#: models.py:31 +msgid "parent" +msgstr "" + +#: models.py:33 +msgid "created at" +msgstr "" + +#: models.py:34 +msgid "modified at" +msgstr "" + +#: models.py:37 +msgid "name" +msgstr "" + +#: models.py:38 models.py:105 +msgid "slug" +msgstr "" + +#: models.py:45 +msgid "blog category" +msgstr "" + +#: models.py:46 +msgid "blog categories" +msgstr "" + +#: models.py:70 +msgid "Author" +msgstr "" + +#: models.py:75 +msgid "Published Since" +msgstr "" + +#: models.py:77 +msgid "Published Until" +msgstr "" + +#: models.py:79 +msgid "Publish" +msgstr "" + +#: models.py:80 +msgid "category" +msgstr "" + +#: models.py:82 +msgid "Main image" +msgstr "" + +#: models.py:85 +msgid "Main image thumbnail" +msgstr "" + +#: models.py:89 +msgid "Main image full" +msgstr "" + +#: models.py:93 +msgid "Enable comments on post" +msgstr "" + +#: models.py:96 +msgid "Site(s)" +msgstr "" + +#: models.py:98 +msgid "" +"Select sites in which to show the post. If none is set it will be visible in" +" all the configured sites." +msgstr "" + +#: models.py:104 +msgid "Title" +msgstr "" + +#: models.py:106 +msgid "Abstract" +msgstr "" + +#: models.py:107 +msgid "Post meta description" +msgstr "" + +#: models.py:109 +msgid "Post meta keywords" +msgstr "" + +#: models.py:111 +msgid "Post meta title" +msgstr "" + +#: models.py:112 +msgid "used in title tag and social sharing" +msgstr "" + +#: models.py:115 +msgid "Text" +msgstr "" + +#: models.py:178 +msgid "blog article" +msgstr "" + +#: models.py:179 +msgid "blog articles" +msgstr "" + +#: models.py:222 models.py:250 +msgid "Articles" +msgstr "" + +#: models.py:223 +msgid "The number of latests articles to be displayed." +msgstr "" + +#: models.py:225 +msgid "Show only the blog articles tagged with chosen tags." +msgstr "" + +#: models.py:227 +msgid "Show only the blog articles tagged with chosen categories." +msgstr "" + +#: models.py:246 templates/djangocms_blog/plugins/authors.html:3 +msgid "Authors" +msgstr "" + +#: models.py:251 +msgid "The number of author articles to be displayed." +msgstr "" + +#: templates/djangocms_blog/post_detail.html:18 +#: templates/djangocms_blog/includes/blog_item.html:11 +msgid "by" +msgstr "" + +#: templates/djangocms_blog/post_list.html:11 +msgid "Articles by" +msgstr "" + +#: templates/djangocms_blog/post_list.html:13 +msgid "Tag" +msgstr "" + +#: templates/djangocms_blog/post_list.html:14 +msgid "Category" +msgstr "" + +#: templates/djangocms_blog/post_list.html:21 +#: templates/djangocms_blog/plugins/archive.html:27 +#: templates/djangocms_blog/plugins/authors.html:15 +#: templates/djangocms_blog/plugins/categories.html:16 +#: templates/djangocms_blog/plugins/latest_entries.html:7 +#: templates/djangocms_blog/plugins/tags.html:16 +msgid "No article found." +msgstr "" + +#: templates/djangocms_blog/post_list.html:24 +msgid "Back" +msgstr "" + +#: templates/djangocms_blog/post_list.html:30 +msgid "previous" +msgstr "" + +#: templates/djangocms_blog/post_list.html:33 +msgid "Page" +msgstr "" + +#: templates/djangocms_blog/post_list.html:33 +msgid "of" +msgstr "" + +#: templates/djangocms_blog/post_list.html:36 +msgid "next" +msgstr "" + +#: templates/djangocms_blog/includes/blog_item.html:46 +msgid "read more" +msgstr "" + +#: templates/djangocms_blog/plugins/archive.html:18 +#: templates/djangocms_blog/plugins/authors.html:10 +#: templates/djangocms_blog/plugins/categories.html:11 +#: templates/djangocms_blog/plugins/tags.html:11 +#, python-format +msgid "1 article" +msgid_plural "%(articles)s articles" +msgstr[0] "" +msgstr[1] "" + +#: templates/djangocms_blog/plugins/archive.html:19 +#: templates/djangocms_blog/plugins/authors.html:11 +#: templates/djangocms_blog/plugins/categories.html:12 +#: templates/djangocms_blog/plugins/tags.html:12 +msgid "0 articles" +msgstr "" + +#~ msgid "blog post" +#~ msgstr "blog post" + +#~ msgid "Posts" +#~ msgstr "Posts" + +#~ msgid "Entries by" +#~ msgstr "Entries by" + +#~ msgid "No entry found." +#~ msgstr "No entry found." diff --git a/blog/locale/ru/LC_MESSAGES/django.mo b/blog/locale/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000..5d2559d Binary files /dev/null and b/blog/locale/ru/LC_MESSAGES/django.mo differ diff --git a/blog/locale/ru/LC_MESSAGES/django.po b/blog/locale/ru/LC_MESSAGES/django.po new file mode 100644 index 0000000..3916659 --- /dev/null +++ b/blog/locale/ru/LC_MESSAGES/django.po @@ -0,0 +1,276 @@ +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Translators: +# Iacopo Spalletti, 2014 +msgid "" +msgstr "" +"Project-Id-Version: djangocms-blog\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-11-30 12:49+0100\n" +"PO-Revision-Date: 2014-11-30 11:49+0000\n" +"Last-Translator: yakky \n" +"Language-Team: Russian (http://www.transifex.com/projects/p/djangocms-blog/language/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 1.5\n" + +#: cms_app.py:8 cms_plugins.py:32 cms_plugins.py:45 cms_plugins.py:56 +#: cms_plugins.py:67 cms_toolbar.py:18 +msgid "Blog" +msgstr "Блог" + +#: cms_plugins.py:20 +msgid "Latest Blog Articles" +msgstr "Последние статьи блога" + +#: cms_plugins.py:33 +msgid "Author Blog Articles" +msgstr "Автор" + +#: cms_plugins.py:46 templates/djangocms_blog/plugins/tags.html:4 +msgid "Tags" +msgstr "Тэги" + +#: cms_plugins.py:57 templates/djangocms_blog/plugins/categories.html:4 +msgid "Categories" +msgstr "Categories" + +#: cms_plugins.py:68 templates/djangocms_blog/post_list.html:12 +#: templates/djangocms_blog/plugins/archive.html:4 +msgid "Archive" +msgstr "Архив" + +#: cms_toolbar.py:20 +msgid "Post list" +msgstr "Список статей" + +#: cms_toolbar.py:22 +msgid "Add post" +msgstr "Добавить статью" + +#: cms_toolbar.py:26 +msgid "Edit Post" +msgstr "" + +#: feeds.py:16 +#, python-format +msgid "Blog articles on %(site_name)s" +msgstr "Статьи из блог на %(site_name)s" + +#: models.py:31 +msgid "parent" +msgstr "предок" + +#: models.py:33 +msgid "created at" +msgstr "время создания" + +#: models.py:34 +msgid "modified at" +msgstr "время изменения" + +#: models.py:37 +msgid "name" +msgstr "название" + +#: models.py:38 models.py:105 +msgid "slug" +msgstr "URL" + +#: models.py:45 +msgid "blog category" +msgstr "категория блога" + +#: models.py:46 +msgid "blog categories" +msgstr "категории блога" + +#: models.py:70 +msgid "Author" +msgstr "Автор" + +#: models.py:75 +msgid "Published Since" +msgstr "Опубликована с" + +#: models.py:77 +msgid "Published Until" +msgstr "Опубликована до" + +#: models.py:79 +msgid "Publish" +msgstr "Показывать на сайте" + +#: models.py:80 +msgid "category" +msgstr "категория" + +#: models.py:82 +msgid "Main image" +msgstr "Картинка для статьи" + +#: models.py:85 +msgid "Main image thumbnail" +msgstr "Уменьшенная копия" + +#: models.py:89 +msgid "Main image full" +msgstr "Полный размер" + +#: models.py:93 +msgid "Enable comments on post" +msgstr "" + +#: models.py:96 +msgid "Site(s)" +msgstr "" + +#: models.py:98 +msgid "" +"Select sites in which to show the post. If none is set it will be visible in" +" all the configured sites." +msgstr "" + +#: models.py:104 +msgid "Title" +msgstr "Заголовок" + +#: models.py:106 +msgid "Abstract" +msgstr "" + +#: models.py:107 +msgid "Post meta description" +msgstr "" + +#: models.py:109 +msgid "Post meta keywords" +msgstr "" + +#: models.py:111 +msgid "Post meta title" +msgstr "" + +#: models.py:112 +msgid "used in title tag and social sharing" +msgstr "" + +#: models.py:115 +msgid "Text" +msgstr "" + +#: models.py:178 +msgid "blog article" +msgstr "статья блога" + +#: models.py:179 +msgid "blog articles" +msgstr "статьи блога" + +#: models.py:222 models.py:250 +msgid "Articles" +msgstr "Статьи" + +#: models.py:223 +msgid "The number of latests articles to be displayed." +msgstr "Количество показываемых последних статей." + +#: models.py:225 +msgid "Show only the blog articles tagged with chosen tags." +msgstr "Показывать только статьи с выбранными тэгами." + +#: models.py:227 +msgid "Show only the blog articles tagged with chosen categories." +msgstr "Показывать только статьи из выбранныех категорий." + +#: models.py:246 templates/djangocms_blog/plugins/authors.html:3 +msgid "Authors" +msgstr "Авторы" + +#: models.py:251 +msgid "The number of author articles to be displayed." +msgstr "Количество статей автора, которые будут показаны." + +#: templates/djangocms_blog/post_detail.html:18 +#: templates/djangocms_blog/includes/blog_item.html:11 +msgid "by" +msgstr "создана" + +#: templates/djangocms_blog/post_list.html:11 +msgid "Articles by" +msgstr "Статьи созданы" + +#: templates/djangocms_blog/post_list.html:13 +msgid "Tag" +msgstr "Тэг" + +#: templates/djangocms_blog/post_list.html:14 +msgid "Category" +msgstr "Категория" + +#: templates/djangocms_blog/post_list.html:21 +#: templates/djangocms_blog/plugins/archive.html:27 +#: templates/djangocms_blog/plugins/authors.html:15 +#: templates/djangocms_blog/plugins/categories.html:16 +#: templates/djangocms_blog/plugins/latest_entries.html:7 +#: templates/djangocms_blog/plugins/tags.html:16 +msgid "No article found." +msgstr "Не найдено ни одной статьи." + +#: templates/djangocms_blog/post_list.html:24 +msgid "Back" +msgstr "Назад" + +#: templates/djangocms_blog/post_list.html:30 +msgid "previous" +msgstr "предыдущая" + +#: templates/djangocms_blog/post_list.html:33 +msgid "Page" +msgstr "Страница" + +#: templates/djangocms_blog/post_list.html:33 +msgid "of" +msgstr "из" + +#: templates/djangocms_blog/post_list.html:36 +msgid "next" +msgstr "следующая" + +#: templates/djangocms_blog/includes/blog_item.html:46 +msgid "read more" +msgstr "продолжение" + +#: templates/djangocms_blog/plugins/archive.html:18 +#: templates/djangocms_blog/plugins/authors.html:10 +#: templates/djangocms_blog/plugins/categories.html:11 +#: templates/djangocms_blog/plugins/tags.html:11 +#, python-format +msgid "1 article" +msgid_plural "%(articles)s articles" +msgstr[0] "%(articles)s статья" +msgstr[1] "%(articles)s статьи" +msgstr[2] "%(articles)s статей" + +#: templates/djangocms_blog/plugins/archive.html:19 +#: templates/djangocms_blog/plugins/authors.html:11 +#: templates/djangocms_blog/plugins/categories.html:12 +#: templates/djangocms_blog/plugins/tags.html:12 +msgid "0 articles" +msgstr "0 статей" + +#~ msgid "blog post" +#~ msgstr "blog post" + +#~ msgid "Posts" +#~ msgstr "Posts" + +#~ msgid "Entries by" +#~ msgstr "Entries by" + +#~ msgid "No entry found." +#~ msgstr "No entry found." diff --git a/blog/managers.py b/blog/managers.py new file mode 100644 index 0000000..cc728cd --- /dev/null +++ b/blog/managers.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +import django +from django.contrib.sites.models import Site +from django.db.models import Q + +try: + from collections import Counter +except ImportError: + from .compat import Counter + +from django.db import models +from django.utils.timezone import now +from parler.managers import TranslationManager, TranslatableQuerySet + + +class TaggedFilterItem(object): + + def tagged(self, other_model=None, queryset=None): + """ + Restituisce una queryset di elementi del model taggati, + o con gli stessi tag di un model o un queryset + """ + tags = self._taglist(other_model, queryset) + return self.get_queryset().filter(taglist__in=tags) + + def _taglist(self, other_model=None, queryset=None): + """ + Restituisce una lista di id di tag comuni al model corrente e al model + o queryset passati come argomento + """ + from taggit.models import TaggedItem + filtro = None + if queryset is not None: + filtro = set() + for item in queryset.all(): + filtro.update(item.tags.all()) + filtro = set([tag.id for tag in filtro]) + elif other_model is not None: + filtro = set(TaggedItem.objects.filter(content_type__model=other_model.__name__.lower()).values_list('tag_id', flat=True)) + tags = set(TaggedItem.objects.filter(content_type__model=self.model.__name__.lower()).values_list('tag_id', flat=True)) + if filtro is not None: + tags = tags.intersection(filtro) + return list(tags) + + def tag_list(self, other_model=None, queryset=None): + """ + Restituisce un queryset di tag comuni al model corrente e + al model o queryset passati come argomento + """ + from taggit.models import Tag + return Tag.objects.filter(id__in=self._taglist(other_model, queryset)) + + def tag_list_slug(self, other_model=None, queryset=None): + queryset = self.tag_list(other_model, queryset) + return queryset.values('slug') + + def tag_cloud(self, other_model=None, queryset=None, published=True): + from taggit.models import TaggedItem + tag_ids = self._taglist(other_model, queryset) + kwargs = {} + if published: + kwargs = TaggedItem.bulk_lookup_kwargs(self.model.objects.published()) + kwargs['tag_id__in'] = tag_ids + counted_tags = dict(TaggedItem.objects + .filter(**kwargs) + .values('tag') + .annotate(count=models.Count('tag')) + .values_list('tag', 'count')) + tags = TaggedItem.tag_model().objects.filter(pk__in=counted_tags.keys()) + for tag in tags: + tag.count = counted_tags[tag.pk] + return sorted(tags, key=lambda x: -x.count) + + +class GenericDateQuerySet(TranslatableQuerySet): + start_date_field = 'date_published' + end_date_field = 'date_published_end' + publish_field = 'publish' + + def on_site(self): + return self.filter(Q(sites__isnull=True) | Q(sites=Site.objects.get_current().pk)) + + def published(self): + queryset = self.published_future() + if self.start_date_field: + return queryset.filter( + **{'%s__lte' % self.start_date_field: now()}) + else: + return queryset + + def published_future(self): + queryset = self.on_site() + if self.end_date_field: + qfilter = ( + models.Q(**{'%s__gte' % self.end_date_field: now()}) + | models.Q(**{'%s__isnull' % self.end_date_field: True}) + ) + queryset = queryset.filter(qfilter) + return queryset.filter(**{self.publish_field: True}) + + def archived(self): + queryset = self.on_site() + if self.end_date_field: + qfilter = ( + models.Q(**{'%s__lte' % self.end_date_field: now()}) + | models.Q(**{'%s__isnull' % self.end_date_field: False}) + ) + queryset = queryset.filter(qfilter) + return queryset.filter(**{self.publish_field: True}) + + def available(self): + return self.on_site().filter(**{self.publish_field: True}) + + def filter_by_language(self, language): + return self.active_translations(language_code=language).on_site() + + +class GenericDateTaggedManager(TaggedFilterItem, TranslationManager): + use_for_related_fields = True + + queryset_class = GenericDateQuerySet + + def get_queryset(self, *args, **kwargs): + try: + return super(GenericDateTaggedManager, self).get_queryset(*args, **kwargs) + except AttributeError: # pragma: no cover + return super(GenericDateTaggedManager, self).get_query_set(*args, **kwargs) + if django.VERSION < (1, 8): + get_query_set = get_queryset + + def published(self): + return self.get_queryset().published() + + def available(self): + return self.get_queryset().available() + + def archived(self): + return self.get_queryset().archived() + + def published_future(self): + return self.get_queryset().published_future() + + def filter_by_language(self, language): + return self.get_queryset().filter_by_language(language) + + def get_months(self, queryset=None): + """ + Get months with aggregate count (how much posts is in the month). Results are ordered by date. + """ + if queryset is None: + queryset = self.get_queryset() + queryset = queryset.on_site() + dates = queryset.values_list(queryset.start_date_field, flat=True) + dates = [(x.year, x.month) for x in dates] + date_counter = Counter(dates) + dates = set(dates) + dates = sorted(dates, reverse=True) + return [{'date': now().replace(year=year, month=month, day=1), + 'count': date_counter[year, month]} for year, month in dates] diff --git a/blog/menu.py b/blog/menu.py new file mode 100644 index 0000000..4fc9759 --- /dev/null +++ b/blog/menu.py @@ -0,0 +1,49 @@ +# # -*- coding: utf-8 -*- + +# from __future__ import unicode_literals + +# from django.utils.translation import ( +# get_language_from_request, +# ugettext_lazy as _, +# ) + +# from cms.menu_bases import CMSAttachMenu +# from cms.apphook_pool import apphook_pool +# from menus.base import NavigationNode +# from menus.menu_pool import menu_pool + +# from .models import BlogCategory + + +# class BlogMenu(CMSAttachMenu): +# name = _('Blog Menu') + +# def get_queryset(self, request): +# """Returns base queryset with support for preview-mode.""" +# queryset = BlogCategory.objects.all() +# # if not (request.toolbar and request.toolbar.edit_mode): +# # queryset = queryset.published() +# return queryset + +# def get_nodes(self, request): +# nodes = [] +# language = get_language_from_request(request, check_path=True) +# articles = self.get_queryset(request).active_translations(language) + +# # if hasattr(self, 'instance') and self.instance: +# # app = apphook_pool.get_apphook(self.instance.application_urls) +# # config = app.get_config(self.instance.application_namespace) +# # if config: +# articles = articles.all() + +# for article in articles: +# node = NavigationNode( +# article.safe_translation_getter('name', +# language_code=language), +# article.get_absolute_url(), +# article.pk, +# ) +# nodes.append(node) +# return nodes + +# menu_pool.register_menu(BlogMenu) diff --git a/blog/migrations/0001_initial.py b/blog/migrations/0001_initial.py new file mode 100644 index 0000000..927dc72 --- /dev/null +++ b/blog/migrations/0001_initial.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import taggit_autosuggest.managers +import filer.fields.image +import meta_mixin.models +import djangocms_text_ckeditor.fields +import cms.models.fields +import django.utils.timezone +from django.conf import settings +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cms', '0003_auto_20140926_2347'), + ('taggit', '__first__'), + ('filer', '0001_initial'), + ('cmsplugin_filer_image', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='AuthorEntriesPlugin', + fields=[ + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('latest_posts', models.IntegerField(default=5, help_text='The number of author articles to be displayed.', verbose_name='Articles')), + ('authors', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Authors')), + ], + options={ + 'abstract': False, + }, + bases=('cms.cmsplugin',), + ), + migrations.CreateModel( + name='BlogCategory', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('date_created', models.DateTimeField(auto_now_add=True, verbose_name='created at')), + ('date_modified', models.DateTimeField(auto_now=True, verbose_name='modified at')), + ('parent', models.ForeignKey(verbose_name='parent', blank=True, to='blog.BlogCategory', null=True)), + ], + options={ + 'verbose_name': 'blog category', + 'verbose_name_plural': 'blog categories', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BlogCategoryTranslation', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('language_code', models.CharField(db_index=True, max_length=15, verbose_name='Language', choices=settings.LANGUAGES)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('slug', models.SlugField(verbose_name='slug', blank=True)), + ('master', models.ForeignKey(related_name='translations', editable=False, to='blog.BlogCategory', null=True)), + ], + options={ + 'db_table': 'blog_blogcategory_translation', + 'verbose_name': 'blog category Translation', + 'default_permissions': (), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='LatestPostsPlugin', + fields=[ + ('cmsplugin_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='cms.CMSPlugin')), + ('latest_posts', models.IntegerField(default=5, help_text='The number of latests articles to be displayed.', verbose_name='Articles')), + ('categories', models.ManyToManyField(help_text='Show only the blog articles tagged with chosen categories.', to='blog.BlogCategory', blank=True)), + ('tags', models.ManyToManyField(help_text='Show only the blog articles tagged with chosen tags.', to='taggit.Tag', blank=True)), + ], + options={ + 'abstract': False, + }, + bases=('cms.cmsplugin',), + ), + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('date_created', models.DateTimeField(auto_now_add=True)), + ('date_modified', models.DateTimeField(auto_now=True)), + ('date_published', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Published Since')), + ('date_published_end', models.DateTimeField(null=True, verbose_name='Published Until', blank=True)), + ('publish', models.BooleanField(default=False, verbose_name='Publish')), + ('enable_comments', models.BooleanField(default=True, verbose_name='Enable comments on post')), + ('author', models.ForeignKey(related_name='blog_post_author', verbose_name='Author', blank=True, to=settings.AUTH_USER_MODEL, null=True)), + ('categories', models.ManyToManyField(related_name='blog_posts', verbose_name='category', to='blog.BlogCategory')), + ('content', cms.models.fields.PlaceholderField(slotname='post_content', editable=False, to='cms.Placeholder', null=True)), + ('main_image', filer.fields.image.FilerImageField(related_name='blog_post_image', verbose_name='Main image', blank=True, to='filer.Image', null=True)), + ('main_image_full', models.ForeignKey(related_name='blog_post_full', verbose_name='Main image full', blank=True, to='cmsplugin_filer_image.ThumbnailOption', null=True)), + ('main_image_thumbnail', models.ForeignKey(related_name='blog_post_thumbnail', verbose_name='Main image thumbnail', blank=True, to='cmsplugin_filer_image.ThumbnailOption', null=True)), + ('tags', taggit_autosuggest.managers.TaggableManager(to='taggit.Tag', through='taggit.TaggedItem', blank=True, help_text='A comma-separated list of tags.', verbose_name='Tags')), + ], + options={ + 'ordering': ('-date_published', '-date_created'), + 'get_latest_by': 'date_published', + 'verbose_name': 'blog article', + 'verbose_name_plural': 'blog articles', + }, + bases=(meta_mixin.models.ModelMeta, models.Model), + ), + migrations.CreateModel( + name='PostTranslation', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('language_code', models.CharField(db_index=True, max_length=15, verbose_name='Language', choices=settings.LANGUAGES)), + ('title', models.CharField(max_length=255, verbose_name='Title')), + ('slug', models.SlugField(verbose_name='slug', blank=True)), + ('abstract', djangocms_text_ckeditor.fields.HTMLField(verbose_name='Abstract')), + ('meta_description', models.TextField(default='', verbose_name='Post meta description', blank=True)), + ('meta_keywords', models.TextField(default='', verbose_name='Post meta keywords', blank=True)), + ('meta_title', models.CharField(default='', help_text='used in title tag and social sharing', max_length=255, verbose_name='Post meta title', blank=True)), + ('post_text', djangocms_text_ckeditor.fields.HTMLField(default='', verbose_name='Text', blank=True)), + ('master', models.ForeignKey(related_name='translations', editable=False, to='blog.Post', null=True)), + ], + options={ + 'db_table': 'blog_post_translation', + 'verbose_name': 'blog article Translation', + 'default_permissions': (), + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='posttranslation', + unique_together=set([('language_code', 'master'), ('language_code', 'slug')]), + ), + migrations.AlterUniqueTogether( + name='blogcategorytranslation', + unique_together=set([('language_code', 'master'), ('language_code', 'slug')]), + ), + ] diff --git a/blog/migrations/0002_post_sites.py b/blog/migrations/0002_post_sites.py new file mode 100644 index 0000000..501aa79 --- /dev/null +++ b/blog/migrations/0002_post_sites.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + ('blog', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='post', + name='sites', + field=models.ManyToManyField(help_text='Select sites in which to show the post. If none is set it will bevisible in all the configured sites.', to='sites.Site', null=True, verbose_name='Site(s', blank=True), + preserve_default=True, + ), + ] diff --git a/blog/migrations/0003_auto_20141201_2252.py b/blog/migrations/0003_auto_20141201_2252.py new file mode 100644 index 0000000..c380eed --- /dev/null +++ b/blog/migrations/0003_auto_20141201_2252.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_post_sites'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='sites', + field=models.ManyToManyField(help_text='Select sites in which to show the post. If none is set it will be visible in all the configured sites.', to='sites.Site', null=True, verbose_name='Site(s)', blank=True), + preserve_default=True, + ), + ] diff --git a/blog/migrations/0004_auto_20150108_1435.py b/blog/migrations/0004_auto_20150108_1435.py new file mode 100644 index 0000000..3edfd02 --- /dev/null +++ b/blog/migrations/0004_auto_20150108_1435.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import filer.fields.image +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0003_auto_20141201_2252'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='main_image', + field=filer.fields.image.FilerImageField(related_name='blog_post_image', on_delete=django.db.models.deletion.SET_NULL, verbose_name='Main image', blank=True, to='filer.Image', null=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='post', + name='main_image_full', + field=models.ForeignKey(related_name='blog_post_full', on_delete=django.db.models.deletion.SET_NULL, verbose_name='Main image full', blank=True, to='cmsplugin_filer_image.ThumbnailOption', null=True), + preserve_default=True, + ), + migrations.AlterField( + model_name='post', + name='main_image_thumbnail', + field=models.ForeignKey(related_name='blog_post_thumbnail', on_delete=django.db.models.deletion.SET_NULL, verbose_name='Main image thumbnail', blank=True, to='cmsplugin_filer_image.ThumbnailOption', null=True), + preserve_default=True, + ), + ] diff --git a/blog/migrations/0005_auto_20150212_1118.py b/blog/migrations/0005_auto_20150212_1118.py new file mode 100644 index 0000000..36e64be --- /dev/null +++ b/blog/migrations/0005_auto_20150212_1118.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import cms.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_auto_20150108_1435'), + ] + + operations = [ + migrations.AlterField( + model_name='post', + name='content', + field=cms.models.fields.PlaceholderField(slotname='post_content', to='cms.Placeholder', null=True, related_name='post_content', editable=False), + preserve_default=True, + ), + migrations.AlterField( + model_name='post', + name='enable_comments', + field=models.BooleanField(default=False, verbose_name='Enable comments on post'), + preserve_default=True, + ), + ] diff --git a/blog/migrations/0006_auto_20150713_1220.py b/blog/migrations/0006_auto_20150713_1220.py new file mode 100644 index 0000000..ea786a4 --- /dev/null +++ b/blog/migrations/0006_auto_20150713_1220.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import datetime +from django.utils.timezone import utc +import app_data.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0005_auto_20150212_1118'), + ] + + operations = [ + migrations.CreateModel( + name='BlogConfig', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('type', models.CharField(max_length=100, verbose_name='type')), + ('namespace', models.CharField(default=None, unique=True, max_length=100, verbose_name='instance namespace')), + ('app_data', app_data.fields.AppDataField(default=b'{}', editable=False)), + ('category_slug', models.CharField(help_text='How to handle non-permalink urls?', max_length=255, verbose_name='non-permalink handling', blank=True)), + ('paginate_by', models.PositiveIntegerField(default=5, help_text='When paginating list views, how many articles per page?', verbose_name='Paginate size')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='BlogConfigTranslation', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('language_code', models.CharField(max_length=15, verbose_name='Language', db_index=True)), + ('app_title', models.CharField(max_length=234, verbose_name='application title')), + ('master', models.ForeignKey(related_name='translations', editable=False, to='blog.BlogConfig', null=True)), + ], + options={ + 'managed': True, + 'db_table': 'blog_blogconfig_translation', + 'db_tablespace': '', + 'default_permissions': (), + 'verbose_name': 'blog config Translation', + }, + bases=(models.Model,), + ) + ] diff --git a/blog/migrations/0007_auto_20150713_1250.py b/blog/migrations/0007_auto_20150713_1250.py new file mode 100644 index 0000000..10124de --- /dev/null +++ b/blog/migrations/0007_auto_20150713_1250.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0006_auto_20150713_1220'), + ] + + operations = [ + migrations.AddField( + model_name='authorentriesplugin', + name='app_config', + field=models.ForeignKey(to='blog.BlogConfig'), + preserve_default=False, + ), + migrations.AddField( + model_name='latestpostsplugin', + name='app_config', + field=models.ForeignKey(to='blog.BlogConfig'), + preserve_default=False, + ) + ] diff --git a/blog/migrations/0008_auto_20150713_1609.py b/blog/migrations/0008_auto_20150713_1609.py new file mode 100644 index 0000000..35fa553 --- /dev/null +++ b/blog/migrations/0008_auto_20150713_1609.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import cms.models.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('cms', '0012_auto_20150607_2207'), + ('blog', '0007_auto_20150713_1250'), + ] + + operations = [ + migrations.AddField( + model_name='blogconfig', + name='placeholder_base_sidebar', + field=cms.models.fields.PlaceholderField(related_name='blog_base_sidebar', slotname='newsblog_base_sidebar', editable=False, to='cms.Placeholder', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='blogconfig', + name='placeholder_base_top', + field=cms.models.fields.PlaceholderField(related_name='blog_base_top', slotname='newsblog_base_top', editable=False, to='cms.Placeholder', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='blogconfig', + name='placeholder_detail_bottom', + field=cms.models.fields.PlaceholderField(related_name='blog_detail_bottom', slotname='newsblog_detail_bottom', editable=False, to='cms.Placeholder', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='blogconfig', + name='placeholder_detail_footer', + field=cms.models.fields.PlaceholderField(related_name='blog_detail_footer', slotname='newsblog_detail_footer', editable=False, to='cms.Placeholder', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='blogconfig', + name='placeholder_detail_top', + field=cms.models.fields.PlaceholderField(related_name='blog_detail_top', slotname='newsblog_detail_top', editable=False, to='cms.Placeholder', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='blogconfig', + name='placeholder_list_footer', + field=cms.models.fields.PlaceholderField(related_name='blog_list_footer', slotname='newsblog_list_footer', editable=False, to='cms.Placeholder', null=True), + preserve_default=True, + ), + migrations.AddField( + model_name='blogconfig', + name='placeholder_list_top', + field=cms.models.fields.PlaceholderField(related_name='blog_list_top', slotname='newsblog_list_top', editable=False, to='cms.Placeholder', null=True), + preserve_default=True, + ), + ] diff --git a/blog/migrations/__init__.py b/blog/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/models.py b/blog/models.py new file mode 100644 index 0000000..6fd8f96 --- /dev/null +++ b/blog/models.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +from cms.models import PlaceholderField, CMSPlugin +from cmsplugin_filer_image.models import ThumbnailOption +from django.conf import settings as dj_settings +from django.contrib.sites.models import Site +from django.core.urlresolvers import reverse +from django.db import models +from django.utils import timezone +from django.utils.encoding import force_text, python_2_unicode_compatible +from django.utils.html import strip_tags, escape +from django.utils.text import slugify +from django.utils.translation import ugettext_lazy as _, get_language +from djangocms_text_ckeditor.fields import HTMLField +from filer.fields.image import FilerImageField +from meta_mixin.models import ModelMeta +from parler.models import TranslatableModel, TranslatedFields +from parler.managers import TranslationManager +from taggit_autosuggest.managers import TaggableManager + +from .cms_appconfig import BlogConfig +from .settings import get_setting +from .managers import GenericDateTaggedManager + + +BLOG_CURRENT_POST_IDENTIFIER = 'djangocms_post_current' + + +@python_2_unicode_compatible +class BlogCategory(TranslatableModel): + """ + Blog category + """ + parent = models.ForeignKey('self', verbose_name=_('parent'), null=True, + blank=True) + date_created = models.DateTimeField(_('created at'), auto_now_add=True) + date_modified = models.DateTimeField(_('modified at'), auto_now=True) + + translations = TranslatedFields( + name=models.CharField(_('name'), max_length=255), + slug=models.SlugField(_('slug'), blank=True, db_index=True), + meta={'unique_together': (('language_code', 'slug'),)} + ) + + objects = TranslationManager() + + class Meta: + verbose_name = _('blog category') + verbose_name_plural = _('blog categories') + + @property + def count(self): + return self.blog_posts.filter(publish=True).count() + + def __str__(self): + return self.safe_translation_getter('name') + + def save(self, *args, **kwargs): + super(BlogCategory, self).save(*args, **kwargs) + for lang in self.get_available_languages(): + self.set_current_language(lang) + if not self.slug and self.name: + self.slug = slugify(force_text(self.name)) + self.save_translations() + + def get_absolute_url(self): + kwargs = {'slug': self.safe_translation_getter('slug', + language_code=get_language(), + any_language=True)} + + return reverse('blog:posts-category', kwargs=kwargs) + +@python_2_unicode_compatible +class Post(ModelMeta, TranslatableModel): + """ + Blog post + """ + author = models.ForeignKey(dj_settings.AUTH_USER_MODEL, + verbose_name=_('Author'), null=True, blank=True, + related_name='blog_post_author') + + date_created = models.DateTimeField(auto_now_add=True) + date_modified = models.DateTimeField(auto_now=True) + date_published = models.DateTimeField(_('Published Since'), + default=timezone.now) + date_published_end = models.DateTimeField(_('Published Until'), null=True, + blank=True) + publish = models.BooleanField(_('Publish'), default=False) + categories = models.ManyToManyField(BlogCategory, verbose_name=_('category'), + related_name='blog_posts',) + main_image = FilerImageField(verbose_name=_('Main image'), blank=True, null=True, + on_delete=models.SET_NULL, + related_name='blog_post_image') + main_image_thumbnail = models.ForeignKey(ThumbnailOption, + verbose_name=_('Main image thumbnail'), + related_name='blog_post_thumbnail', + on_delete=models.SET_NULL, + blank=True, null=True) + main_image_full = models.ForeignKey(ThumbnailOption, + verbose_name=_('Main image full'), + related_name='blog_post_full', + on_delete=models.SET_NULL, + blank=True, null=True) + enable_comments = models.BooleanField( + verbose_name=_(u'Enable comments on post'), + default=get_setting('ENABLE_COMMENTS') + ) + sites = models.ManyToManyField(Site, verbose_name=_(u'Site(s)'), blank=True, + null=True, + help_text=_(u'Select sites in which to show the post. ' + u'If none is set it will be ' + u'visible in all the configured sites.') + ) + + translations = TranslatedFields( + title=models.CharField(_('Title'), max_length=255), + slug=models.SlugField(_('slug'), blank=True, db_index=True), + abstract=HTMLField(_('Abstract')), + meta_description=models.TextField(verbose_name=_(u'Post meta description'), + blank=True, default=''), + meta_keywords=models.TextField(verbose_name=_(u'Post meta keywords'), + blank=True, default=''), + meta_title=models.CharField(verbose_name=_(u'Post meta title'), + help_text=_(u'used in title tag and social sharing'), + max_length=255, + blank=True, default=''), + post_text=HTMLField(_('Text'), default='', blank=True), + meta={'unique_together': (('language_code', 'slug'),)} + ) + content = PlaceholderField('post_content', related_name='post_content') + + objects = GenericDateTaggedManager() + tags = TaggableManager(blank=True, related_name='blog_tags') + + _metadata = { + 'title': 'get_title', + 'description': 'get_description', + 'og_description': 'get_description', + 'twitter_description': 'get_description', + 'gplus_description': 'get_description', + 'keywords': 'get_keywords', + 'locale': None, + 'image': 'get_image_full_url', + 'object_type': get_setting('TYPE'), + 'og_type': get_setting('FB_TYPE'), + 'og_app_id': get_setting('FB_APPID'), + 'og_profile_id': get_setting('FB_PROFILE_ID'), + 'og_publisher': get_setting('FB_PUBLISHER'), + 'og_author_url': get_setting('FB_AUTHOR_URL'), + 'twitter_type': get_setting('TWITTER_TYPE'), + 'twitter_site': get_setting('TWITTER_SITE'), + 'twitter_author': get_setting('TWITTER_AUTHOR'), + 'gplus_type': get_setting('GPLUS_TYPE'), + 'gplus_author': get_setting('GPLUS_AUTHOR'), + 'published_time': 'date_published', + 'modified_time': 'date_modified', + 'expiration_time': 'date_published_end', + 'tag': 'get_tags', + 'url': 'get_absolute_url', + } + + def get_title(self): + title = self.safe_translation_getter('meta_title', any_language=True) + if not title: + title = self.safe_translation_getter('title', any_language=True) + return title.strip() + + def get_keywords(self): + return self.safe_translation_getter('meta_keywords').strip().split(',') + + def get_description(self): + description = self.safe_translation_getter('meta_description', any_language=True) + if not description: + description = self.safe_translation_getter('abstract', any_language=True) + return escape(strip_tags(description)).strip() + + def get_image_full_url(self): + if self.main_image: + return self.make_full_url(self.main_image.url) + return '' + + def get_tags(self): + taglist = [tag.name for tag in self.tags.all()] + return ','.join(taglist) + + def get_author(self): + 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, namespace="blog"): + 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)} + + if self.categories.exists(): + namespace = self.categories.all()[0].slug + + return reverse('{0}:post-detail'.format(namespace), kwargs=kwargs) + + # return reverse('blog:post-detail', kwargs=kwargs) + + def thumbnail_options(self): + if self.main_image_thumbnail_id: + return self.main_image_thumbnail.as_dict + else: + return get_setting('IMAGE_THUMBNAIL_SIZE') + + def full_image_options(self): + if self.main_image_full_id: + return self.main_image_full.as_dict + else: + return get_setting('IMAGE_FULL_SIZE') + + def get_full_url(self): + return self.make_full_url(self.get_absolute_url()) + + +@python_2_unicode_compatible +class BasePostPlugin(CMSPlugin): + app_config = models.ForeignKey(BlogConfig) + + class Meta: + abstract = True + + def post_queryset(self, request=None): + language = get_language() + posts = Post._default_manager.active_translations(language_code=language) + if not request or not getattr(request, 'toolbar', False) or not request.toolbar.edit_mode: + posts = posts.published() + return posts + + def __str__(self): + return unicode(self.latest_posts) + + +class LatestPostsPlugin(BasePostPlugin): + + latest_posts = models.IntegerField(_(u'Articles'), default=get_setting('LATEST_POSTS'), + help_text=_('The number of latests articles to be displayed.')) + categories = models.ManyToManyField('BlogCategory', blank=True, + help_text=_('Show only the blog articles tagged with chosen categories.')) + + def __str__(self): + return u'%s latest articles by category' % self.latest_posts + + + def get_posts(self, request): + posts = self.post_queryset(request) + + if self.categories.exists(): + posts = posts.filter(categories__in=list(self.categories.all())) + + return posts[:self.latest_posts] + + +class AuthorEntriesPlugin(BasePostPlugin): + authors = models.ManyToManyField( + dj_settings.AUTH_USER_MODEL, verbose_name=_('Authors'), + limit_choices_to={'blog_post_author__publish': True} + ) + latest_posts = models.IntegerField( + _(u'Articles'), default=get_setting('LATEST_POSTS'), + help_text=_('The number of author articles to be displayed.') + ) + + def __str__(self): + return u'%s latest articles by author' % self.latest_posts + + def copy_relations(self, oldinstance): + self.authors = oldinstance.authors.all() + + def get_posts(self, request): + posts = self.post_queryset(request) + return posts[:self.latest_posts] + + def get_authors(self): + authors = self.authors.all() + for author in authors: + author.count = 0 + if author.blog_post_author.filter(publish=True).exists(): + author.count = author.blog_post_author.filter(publish=True).count() + return authors diff --git a/blog/settings.py b/blog/settings.py new file mode 100644 index 0000000..316eed7 --- /dev/null +++ b/blog/settings.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + + +def get_setting(name): + from django.conf import settings + from meta_mixin import settings as meta_settings + + default = { + 'BLOG_IMAGE_THUMBNAIL_SIZE': getattr(settings, 'BLOG_IMAGE_THUMBNAIL_SIZE', { + 'size': '120x120', + 'crop': True, + 'upscale': False + }), + + 'BLOG_IMAGE_FULL_SIZE': getattr(settings, 'BLOG_IMAGE_FULL_SIZE', { + 'size': '640x120', + 'crop': True, + 'upscale': False + }), + + 'BLOG_TAGCLOUD_MIN': getattr(settings, 'BLOG_TAGCLOUD_MIN', 1), + 'BLOG_TAGCLOUD_MAX': getattr(settings, 'BLOG_TAGCLOUD_MAX', 10), + 'BLOG_PAGINATION': getattr(settings, 'BLOG_PAGINATION', 10), + 'BLOG_LATEST_POSTS': getattr(settings, 'BLOG_LATEST_POSTS', 5), + 'BLOG_POSTS_LIST_TRUNCWORDS_COUNT': getattr(settings, + 'BLOG_POSTS_LIST_TRUNCWORDS_COUNT', + 100), + 'BLOG_TYPE': getattr(settings, 'BLOG_TYPE', 'Article'), + 'BLOG_FB_TYPE': getattr(settings, 'BLOG_FB_TYPE', 'Article'), + 'BLOG_FB_APPID': getattr(settings, 'BLOG_FB_APPID', + meta_settings.FB_APPID), + 'BLOG_FB_PROFILE_ID': getattr(settings, 'BLOG_FB_PROFILE_ID', + meta_settings.FB_PROFILE_ID), + 'BLOG_FB_PUBLISHER': getattr(settings, 'BLOG_FB_PUBLISHER', + meta_settings.FB_PUBLISHER), + 'BLOG_FB_AUTHOR_URL': getattr(settings, 'BLOG_FB_AUTHOR_URL', + 'get_author_url'), + 'BLOG_FB_AUTHOR': getattr(settings, 'BLOG_FB_AUTHOR', + 'get_author_name'), + 'BLOG_TWITTER_TYPE': getattr(settings, 'BLOG_TWITTER_TYPE', 'Summary'), + 'BLOG_TWITTER_SITE': getattr(settings, 'BLOG_TWITTER_SITE', + meta_settings.TWITTER_SITE), + 'BLOG_TWITTER_AUTHOR': getattr(settings, 'BLOG_TWITTER_AUTHOR', + 'get_author_twitter'), + 'BLOG_GPLUS_TYPE': getattr(settings, 'BLOG_GPLUS_SCOPE_CATEGORY', + 'Blog'), + 'BLOG_GPLUS_AUTHOR': getattr(settings, 'BLOG_GPLUS_AUTHOR', + 'get_author_gplus'), + 'BLOG_ENABLE_COMMENTS': getattr(settings, 'BLOG_ENABLE_COMMENTS', True), + 'BLOG_USE_PLACEHOLDER': getattr(settings, 'BLOG_USE_PLACEHOLDER', True), + 'BLOG_MULTISITE': getattr(settings, 'BLOG_MULTISITE', True), + 'BLOG_AUTHOR_DEFAULT': getattr(settings, 'BLOG_AUTHOR_DEFAULT', True), + } + return default['BLOG_%s' % name] diff --git a/blog/sitemaps/__init__.py b/blog/sitemaps/__init__.py new file mode 100644 index 0000000..b23e5f7 --- /dev/null +++ b/blog/sitemaps/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +from django.contrib.sitemaps import Sitemap + +from ..models import Post + + +class BlogSitemap(Sitemap): + changefreq = "never" + priority = 0.5 + + def items(self): + return Post.objects.published() + + def lastmod(self, obj): + return obj.date_modified diff --git a/blog/south_migrations/0001_initial.py b/blog/south_migrations/0001_initial.py new file mode 100644 index 0000000..a496b67 --- /dev/null +++ b/blog/south_migrations/0001_initial.py @@ -0,0 +1,342 @@ +# -*- coding: utf-8 -*- +from django.contrib.auth import get_user_model +from django.utils import timezone +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +User = get_user_model() +user_orm_label = '%s.%s' % (User._meta.app_label, User._meta.object_name) +user_model_label = '%s.%s' % (User._meta.app_label, User._meta.module_name) + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'BlogCategoryTranslation' + db.create_table(u'blog_blogcategory_translation', ( + (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)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=200)), + ('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['blog.BlogCategory'])), + )) + db.send_create_signal(u'blog', ['BlogCategoryTranslation']) + + # Adding unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'slug'] + db.create_unique(u'blog_blogcategory_translation', ['language_code', 'slug']) + + # Adding unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'master'] + db.create_unique(u'blog_blogcategory_translation', ['language_code', 'master_id']) + + # Adding model 'BlogCategory' + db.create_table(u'blog_blogcategory', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('parent', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['blog.BlogCategory'], null=True, blank=True)), + ('date_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('date_modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + )) + db.send_create_signal(u'blog', ['BlogCategory']) + + # Adding model 'PostTranslation' + db.create_table(u'blog_post_translation', ( + (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)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('slug', self.gf('django.db.models.fields.SlugField')(db_index=True, max_length=50, blank=True)), + ('abstract', self.gf('djangocms_text_ckeditor.fields.HTMLField')()), + ('master', self.gf('django.db.models.fields.related.ForeignKey')(related_name='translations', null=True, to=orm['blog.Post'])), + )) + db.send_create_signal(u'blog', ['PostTranslation']) + + # Adding unique constraint on 'PostTranslation', fields ['language_code', 'slug'] + db.create_unique(u'blog_post_translation', ['language_code', 'slug']) + + # Adding unique constraint on 'PostTranslation', fields ['language_code', 'master'] + db.create_unique(u'blog_post_translation', ['language_code', 'master_id']) + + # Adding model 'Post' + db.create_table(u'blog_post', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[user_orm_label])), + ('date_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('date_modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + ('date_published', self.gf('django.db.models.fields.DateTimeField')(default=timezone.now)), + ('date_published_end', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)), + ('publish', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('main_image', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['filer.Image'], null=True, blank=True)), + ('main_image_thumbnail', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='blog_post_thumbnail', null=True, to=orm['cmsplugin_filer_image.ThumbnailOption'])), + ('main_image_full', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='blog_post_full', null=True, to=orm['cmsplugin_filer_image.ThumbnailOption'])), + ('content', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['cms.Placeholder'], null=True)), + )) + db.send_create_signal(u'blog', ['Post']) + + # Adding M2M table for field categories on 'Post' + m2m_table_name = db.shorten_name(u'blog_post_categories') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('post', models.ForeignKey(orm[u'blog.post'], null=False)), + ('blogcategory', models.ForeignKey(orm[u'blog.blogcategory'], null=False)) + )) + db.create_unique(m2m_table_name, ['post_id', 'blogcategory_id']) + + # Adding model 'LatestPostsPlugin' + db.create_table(u'cmsplugin_latestpostsplugin', ( + (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), + ('latest_posts', self.gf('django.db.models.fields.IntegerField')(default=5)), + )) + db.send_create_signal(u'blog', ['LatestPostsPlugin']) + + # Adding M2M table for field tags on 'LatestPostsPlugin' + m2m_table_name = db.shorten_name(u'blog_latestpostsplugin_tags') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('latestpostsplugin', models.ForeignKey(orm[u'blog.latestpostsplugin'], null=False)), + ('tag', models.ForeignKey(orm[u'taggit.tag'], null=False)) + )) + db.create_unique(m2m_table_name, ['latestpostsplugin_id', 'tag_id']) + + # Adding M2M table for field categories on 'LatestPostsPlugin' + m2m_table_name = db.shorten_name(u'blog_latestpostsplugin_categories') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('latestpostsplugin', models.ForeignKey(orm[u'blog.latestpostsplugin'], null=False)), + ('blogcategory', models.ForeignKey(orm[u'blog.blogcategory'], null=False)) + )) + db.create_unique(m2m_table_name, ['latestpostsplugin_id', 'blogcategory_id']) + + # Adding model 'AuthorEntriesPlugin' + db.create_table(u'cmsplugin_authorentriesplugin', ( + (u'cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), + ('latest_posts', self.gf('django.db.models.fields.IntegerField')(default=5)), + )) + db.send_create_signal(u'blog', ['AuthorEntriesPlugin']) + + # Adding M2M table for field authors on 'AuthorEntriesPlugin' + m2m_table_name = db.shorten_name(u'blog_authorentriesplugin_authors') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('authorentriesplugin', models.ForeignKey(orm[u'blog.authorentriesplugin'], null=False)), + ('user', models.ForeignKey(orm[user_orm_label], null=False)) + )) + db.create_unique(m2m_table_name, ['authorentriesplugin_id', 'user_id']) + + + def backwards(self, orm): + # Removing unique constraint on 'PostTranslation', fields ['language_code', 'master'] + db.delete_unique(u'blog_post_translation', ['language_code', 'master_id']) + + # Removing unique constraint on 'PostTranslation', fields ['language_code', 'slug'] + db.delete_unique(u'blog_post_translation', ['language_code', 'slug']) + + # Removing unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'master'] + db.delete_unique(u'blog_blogcategory_translation', ['language_code', 'master_id']) + + # Removing unique constraint on 'BlogCategoryTranslation', fields ['language_code', 'slug'] + db.delete_unique(u'blog_blogcategory_translation', ['language_code', 'slug']) + + # Deleting model 'BlogCategoryTranslation' + db.delete_table(u'blog_blogcategory_translation') + + # Deleting model 'BlogCategory' + db.delete_table(u'blog_blogcategory') + + # Deleting model 'PostTranslation' + db.delete_table(u'blog_post_translation') + + # Deleting model 'Post' + db.delete_table(u'blog_post') + + # Removing M2M table for field categories on 'Post' + db.delete_table(db.shorten_name(u'blog_post_categories')) + + # Deleting model 'LatestPostsPlugin' + db.delete_table(u'cmsplugin_latestpostsplugin') + + # Removing M2M table for field tags on 'LatestPostsPlugin' + db.delete_table(db.shorten_name(u'blog_latestpostsplugin_tags')) + + # Removing M2M table for field categories on 'LatestPostsPlugin' + db.delete_table(db.shorten_name(u'blog_latestpostsplugin_categories')) + + # Deleting model 'AuthorEntriesPlugin' + db.delete_table(u'cmsplugin_authorentriesplugin') + + # Removing M2M table for field authors on 'AuthorEntriesPlugin' + db.delete_table(db.shorten_name(u'blog_authorentriesplugin_authors')) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + user_model_label: { + 'Meta': {'object_name': User.__name__, 'db_table': "'%s'" % User._meta.db_table}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', 'db_table': "u'cmsplugin_authorentriesplugin'", '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['%s']" % user_orm_label, 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), ('language_code', 'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', 'db_table': "u'cmsplugin_latestpostsplugin'", '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s']" % user_orm_label}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), ('language_code', 'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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['blog.Post']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': u"orm['%s']" % user_orm_label}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': u"orm['%s']" % user_orm_label}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'related_url': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + } + } + + complete_apps = ['blog'] diff --git a/blog/south_migrations/0002_auto__del_blogcategorytranslation__del_unique_blogcategorytranslation_.py b/blog/south_migrations/0002_auto__del_blogcategorytranslation__del_unique_blogcategorytranslation_.py new file mode 100644 index 0000000..fc11ccd --- /dev/null +++ b/blog/south_migrations/0002_auto__del_blogcategorytranslation__del_unique_blogcategorytranslation_.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +from django.conf import settings as dj_settings +from south.db import db +from south.v2 import SchemaMigration + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Changing field 'Post.author' + db.alter_column(u'blog_post', 'author_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[dj_settings.AUTH_USER_MODEL], null=True)) + + def backwards(self, orm): + raise RuntimeError("Cannot reverse this migration. 'Post.author' and its values cannot be restored.") + + # The following code is provided here to aid in writing a correct migration + # Changing field 'Post.author' + db.alter_column(u'blog_post', 'author_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm[dj_settings.AUTH_USER_MODEL])) + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', 'db_table': "u'cmsplugin_authorentriesplugin'", '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategory_translation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), ('language_code', 'master')]", 'object_name': 'BlogCategory_Translation'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', 'db_table': "u'cmsplugin_latestpostsplugin'", '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'null': 'True', 'blank': 'True'}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.post_translation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), ('language_code', 'master')]", 'object_name': 'Post_Translation'}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': '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['blog.Post']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'related_url': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + } + } + + complete_apps = ['blog'] diff --git a/blog/south_migrations/0003_rename_plugins.py b/blog/south_migrations/0003_rename_plugins.py new file mode 100644 index 0000000..baf2431 --- /dev/null +++ b/blog/south_migrations/0003_rename_plugins.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +from django.conf import settings as dj_settings +from south.db import db +from south.v2 import SchemaMigration + + +class Migration(SchemaMigration): + + def forwards(self, orm): + db.rename_table(u'cmsplugin_latestpostsplugin', u'blog_latestpostsplugin') + db.rename_table(u'cmsplugin_authorentriesplugin', u'blog_authorentriesplugin') + + + def backwards(self, orm): + db.rename_table(u'blog_latestpostsplugin', u'cmsplugin_latestpostsplugin') + db.rename_table(u'blog_authorentriesplugin', u'cmsplugin_authorentriesplugin') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'null': 'True', 'blank': 'True'}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'taggit.taggeditem': { + 'Meta': {'object_name': 'TaggedItem'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) + } + } + + complete_apps = ['blog'] diff --git a/blog/south_migrations/0004_auto__add_field_posttranslation_meta_description.py b/blog/south_migrations/0004_auto__add_field_posttranslation_meta_description.py new file mode 100644 index 0000000..f8ca1c8 --- /dev/null +++ b/blog/south_migrations/0004_auto__add_field_posttranslation_meta_description.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- +from django.conf import settings as dj_settings +from south.db import db +from south.v2 import SchemaMigration + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'PostTranslation.meta_description' + db.add_column(u'blog_post_translation', 'meta_description', + self.gf('django.db.models.fields.TextField')(default='', blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'PostTranslation.meta_description' + db.delete_column(u'blog_post_translation', 'meta_description') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'null': 'True', 'blank': 'True'}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'taggit.taggeditem': { + 'Meta': {'object_name': 'TaggedItem'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) + } + } + + complete_apps = ['blog'] \ No newline at end of file diff --git a/blog/south_migrations/0005_auto__add_field_posttranslation_meta_keywords.py b/blog/south_migrations/0005_auto__add_field_posttranslation_meta_keywords.py new file mode 100644 index 0000000..160c4cb --- /dev/null +++ b/blog/south_migrations/0005_auto__add_field_posttranslation_meta_keywords.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +from django.conf import settings as dj_settings +from south.db import db +from south.v2 import SchemaMigration + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'PostTranslation.meta_keywords' + db.add_column(u'blog_post_translation', 'meta_keywords', + self.gf('django.db.models.fields.TextField')(default='', blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'PostTranslation.meta_keywords' + db.delete_column(u'blog_post_translation', 'meta_keywords') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'null': 'True', 'blank': 'True'}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['filer.Image']", 'null': 'True', 'blank': 'True'}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_keywords': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + 'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'all_files'", 'null': 'True', 'to': "orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owned_files'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.folder': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('parent', 'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'filer_owned_folders'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': ['filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + }, + u'taggit.taggeditem': { + 'Meta': {'object_name': 'TaggedItem'}, + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_tagged_items'", 'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}), + 'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'taggit_taggeditem_items'", 'to': u"orm['taggit.Tag']"}) + } + } + + complete_apps = ['blog'] \ No newline at end of file diff --git a/blog/south_migrations/0006_auto__add_field_post_enable_comments.py b/blog/south_migrations/0006_auto__add_field_post_enable_comments.py new file mode 100644 index 0000000..5c27719 --- /dev/null +++ b/blog/south_migrations/0006_auto__add_field_post_enable_comments.py @@ -0,0 +1,196 @@ +# -*- coding: utf-8 -*- +from django.conf import settings as dj_settings +from south.db import db +from south.v2 import SchemaMigration + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Post.enable_comments' + db.add_column(u'blog_post', 'enable_comments', + self.gf('django.db.models.fields.BooleanField')(default=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Post.enable_comments' + db.delete_column(u'blog_post', 'enable_comments') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_author'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'enable_comments': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_image'", 'null': 'True', 'to': "orm['filer.Image']"}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_keywords': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'all_files'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'owned_files'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + u'filer.folder': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'parent', u'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filer_owned_folders'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'children'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': [u'filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'related_url': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + } + } + + complete_apps = ['blog'] \ No newline at end of file diff --git a/blog/south_migrations/0007_auto__add_field_posttranslation_post_text.py b/blog/south_migrations/0007_auto__add_field_posttranslation_post_text.py new file mode 100644 index 0000000..ec4b3a3 --- /dev/null +++ b/blog/south_migrations/0007_auto__add_field_posttranslation_post_text.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +from django.conf import settings as dj_settings +from south.db import db +from south.v2 import SchemaMigration + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'PostTranslation.post_text' + db.add_column(u'blog_post_translation', 'post_text', + self.gf('djangocms_text_ckeditor.fields.HTMLField')(default='', blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'PostTranslation.post_text' + db.delete_column(u'blog_post_translation', 'post_text') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL, 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_author'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'enable_comments': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_image'", 'null': 'True', 'to': "orm['filer.Image']"}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_keywords': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'post_text': ('djangocms_text_ckeditor.fields.HTMLField', [], {'default': "''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'all_files'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'owned_files'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + u'filer.folder': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'parent', u'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filer_owned_folders'", 'null': 'True', 'to': u"orm['%s']" % dj_settings.AUTH_USER_MODEL}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'children'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': [u'filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'related_url': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + } + } + + complete_apps = ['blog'] \ No newline at end of file diff --git a/blog/south_migrations/0008_auto__add_field_posttranslation_meta_title.py b/blog/south_migrations/0008_auto__add_field_posttranslation_meta_title.py new file mode 100644 index 0000000..124b5c5 --- /dev/null +++ b/blog/south_migrations/0008_auto__add_field_posttranslation_meta_title.py @@ -0,0 +1,199 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'PostTranslation.meta_title' + db.add_column(u'blog_post_translation', 'meta_title', + self.gf('django.db.models.fields.CharField')(default='', max_length=255, blank=True), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'PostTranslation.meta_title' + db.delete_column(u'blog_post_translation', 'meta_title') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "(u'width', u'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_author'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'enable_comments': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_image'", 'null': 'True', 'to': "orm['filer.Image']"}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_keywords': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'post_text': ('djangocms_text_ckeditor.fields.HTMLField', [], {'default': "''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'all_files'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'owned_files'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + u'filer.folder': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'parent', u'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filer_owned_folders'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'children'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': [u'filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'related_url': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + } + } + + complete_apps = ['blog'] \ No newline at end of file diff --git a/blog/south_migrations/0009_auto.py b/blog/south_migrations/0009_auto.py new file mode 100644 index 0000000..c9dd4b5 --- /dev/null +++ b/blog/south_migrations/0009_auto.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding M2M table for field sites on 'Post' + m2m_table_name = db.shorten_name(u'blog_post_sites') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('post', models.ForeignKey(orm[u'blog.post'], null=False)), + ('site', models.ForeignKey(orm[u'sites.site'], null=False)) + )) + db.create_unique(m2m_table_name, ['post_id', 'site_id']) + + + def backwards(self, orm): + # Removing M2M table for field sites on 'Post' + db.delete_table(db.shorten_name(u'blog_post_sites')) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "('width', 'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin', '_ormbases': ['cms.CMSPlugin']}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_author'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'enable_comments': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_image'", 'null': 'True', 'to': "orm['filer.Image']"}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_keywords': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'post_text': ('djangocms_text_ckeditor.fields.HTMLField', [], {'default': "''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'all_files'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'owned_files'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + u'filer.folder': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'parent', u'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filer_owned_folders'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'children'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image', '_ormbases': [u'filer.File']}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'sites.site': { + 'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + } + } + + complete_apps = ['blog'] \ No newline at end of file diff --git a/blog/south_migrations/0010_auto__chg_field_post_main_image_full__chg_field_post_main_image__chg_f.py b/blog/south_migrations/0010_auto__chg_field_post_main_image_full__chg_field_post_main_image__chg_f.py new file mode 100644 index 0000000..839d52c --- /dev/null +++ b/blog/south_migrations/0010_auto__chg_field_post_main_image_full__chg_field_post_main_image__chg_f.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'Post.main_image_full' + db.alter_column(u'blog_post', 'main_image_full_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, on_delete=models.SET_NULL, to=orm['cmsplugin_filer_image.ThumbnailOption'])) + + # Changing field 'Post.main_image' + db.alter_column(u'blog_post', 'main_image_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, on_delete=models.SET_NULL, to=orm['filer.Image'])) + + # Changing field 'Post.main_image_thumbnail' + db.alter_column(u'blog_post', 'main_image_thumbnail_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, on_delete=models.SET_NULL, to=orm['cmsplugin_filer_image.ThumbnailOption'])) + + def backwards(self, orm): + + # Changing field 'Post.main_image_full' + db.alter_column(u'blog_post', 'main_image_full_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['cmsplugin_filer_image.ThumbnailOption'])) + + # Changing field 'Post.main_image' + db.alter_column(u'blog_post', 'main_image_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['filer.Image'])) + + # Changing field 'Post.main_image_thumbnail' + db.alter_column(u'blog_post', 'main_image_thumbnail_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['cmsplugin_filer_image.ThumbnailOption'])) + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'cms.cmsplugin': { + 'Meta': {'object_name': 'CMSPlugin'}, + 'changed_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), + 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), + 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), + 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) + }, + 'cms.placeholder': { + 'Meta': {'object_name': 'Placeholder'}, + 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'slot': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}) + }, + u'cmsplugin_filer_image.thumbnailoption': { + 'Meta': {'ordering': "(u'width', u'height')", 'object_name': 'ThumbnailOption'}, + 'crop': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'upscale': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'blog.authorentriesplugin': { + 'Meta': {'object_name': 'AuthorEntriesPlugin'}, + 'authors': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'symmetrical': 'False'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}) + }, + u'blog.blogcategory': { + 'Meta': {'object_name': 'BlogCategory'}, + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['blog.BlogCategory']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.blogcategorytranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'BlogCategoryTranslation', 'db_table': "u'blog_blogcategory_translation'"}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.BlogCategory']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}) + }, + u'blog.latestpostsplugin': { + 'Meta': {'object_name': 'LatestPostsPlugin'}, + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['blog.BlogCategory']", 'symmetrical': 'False', 'blank': 'True'}), + u'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), + 'latest_posts': ('django.db.models.fields.IntegerField', [], {'default': '5'}), + 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['taggit.Tag']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'blog.post': { + 'Meta': {'ordering': "('-date_published', '-date_created')", 'object_name': 'Post'}, + 'author': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_author'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'categories': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'blog_posts'", 'symmetrical': 'False', 'to': u"orm['blog.BlogCategory']"}), + 'content': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), + 'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'date_published': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'date_published_end': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'enable_comments': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'main_image': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_image'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['filer.Image']"}), + 'main_image_full': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_full'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'main_image_thumbnail': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'blog_post_thumbnail'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': u"orm['cmsplugin_filer_image.ThumbnailOption']"}), + 'publish': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'sites': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['sites.Site']", 'null': 'True', 'blank': 'True'}) + }, + u'blog.posttranslation': { + 'Meta': {'unique_together': "[('language_code', 'slug'), (u'language_code', u'master')]", 'object_name': 'PostTranslation', 'db_table': "u'blog_post_translation'"}, + 'abstract': ('djangocms_text_ckeditor.fields.HTMLField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'language_code': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), + u'master': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'translations'", 'null': 'True', 'to': u"orm['blog.Post']"}), + 'meta_description': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_keywords': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}), + 'meta_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}), + 'post_text': ('djangocms_text_ckeditor.fields.HTMLField', [], {'default': "''", 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'blank': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}) + }, + u'filer.file': { + 'Meta': {'object_name': 'File'}, + '_file_size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'folder': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'all_files'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + 'has_all_mandatory_data': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}), + 'original_filename': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'owned_files'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'polymorphic_ctype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'polymorphic_filer.file_set'", 'null': 'True', 'to': u"orm['contenttypes.ContentType']"}), + 'sha1': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '40', 'blank': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + u'filer.folder': { + 'Meta': {'ordering': "(u'name',)", 'unique_together': "((u'parent', u'name'),)", 'object_name': 'Folder'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + u'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'modified_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filer_owned_folders'", 'null': 'True', 'to': u"orm['auth.User']"}), + 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'children'", 'null': 'True', 'to': u"orm['filer.Folder']"}), + u'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + u'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), + 'uploaded_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}) + }, + 'filer.image': { + 'Meta': {'object_name': 'Image'}, + '_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + '_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'author': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'date_taken': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'default_alt_text': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'default_caption': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + u'file_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['filer.File']", 'unique': 'True', 'primary_key': 'True'}), + 'must_always_publish_author_credit': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'must_always_publish_copyright': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subject_location': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '64', 'null': 'True', 'blank': 'True'}) + }, + u'sites.site': { + 'Meta': {'ordering': "(u'domain',)", 'object_name': 'Site', 'db_table': "u'django_site'"}, + 'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'taggit.tag': { + 'Meta': {'object_name': 'Tag'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100'}) + } + } + + complete_apps = ['blog'] \ No newline at end of file diff --git a/blog/south_migrations/__init__.py b/blog/south_migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/blog/static/blog/css/djangocms_blog.css b/blog/static/blog/css/djangocms_blog.css new file mode 100644 index 0000000..e69de29 diff --git a/blog/static/blog/css/djangocms_blog_admin.css b/blog/static/blog/css/djangocms_blog_admin.css new file mode 100644 index 0000000..855da1b --- /dev/null +++ b/blog/static/blog/css/djangocms_blog_admin.css @@ -0,0 +1,46 @@ +.select2-container-multi .select2-choices .select2-search-field input { + min-width: 100px; +} + +.selector select[multiple] { + display: block; +} + +.selector { + width: auto; + margin-right: 12px; +} + +.selector-available, .selector-chosen { + width: auto; +} + +.selector .selector-available input, .selector .selector-chosen input { + margin: 0; +} + +form select { + max-width: 266px; +} + +.as-selections.vTextField { + width: 300px; +} + +.as-results ul.as-list { + margin-left:9em; + padding-left:0; + box-shadow: none !important; + border: 1px solid #888888 !important; +} +.as-results ul.as-list li { + list-style: none; +} +ul.as-selections.vTextField { + padding-left: 10px; + margin-left:9em; +} + +ul.as-selections li { + list-style: none; +} \ No newline at end of file diff --git a/blog/templates/blog/base.html b/blog/templates/blog/base.html new file mode 100644 index 0000000..e392ad3 --- /dev/null +++ b/blog/templates/blog/base.html @@ -0,0 +1,13 @@ +{% extends CMS_TEMPLATE %} + +{% block meta %} + {% if meta %} + {% include "meta_mixin/meta.html" %} + {% endif %} +{% endblock meta %} + +{% block content_safe %} +
+ {% block content_blog %}{% endblock %} +
+{% endblock content_safe %} diff --git a/blog/templates/blog/includes/blog_item.html b/blog/templates/blog/includes/blog_item.html new file mode 100644 index 0000000..7c0640a --- /dev/null +++ b/blog/templates/blog/includes/blog_item.html @@ -0,0 +1,16 @@ +{% load i18n thumbnail cms_tags %} +{% load url from future %} + +
+
+

{{ post.title }}

+

{{ post.date_published|date:"DATE_FORMAT" }}

+
+ {% if post.main_image_id %} +
+ {% thumbnail post.main_image post.full_image_options.size crop=post.full_image_options.crop upscale=post.full_image_options.upscale subject_location=post.main_image.subject_location quality=100 as thumb %} + {{ post.main_image.default_alt_text }} +
+ {% endif %} +
{% render_model post "abstract" %}
+
\ No newline at end of file diff --git a/blog/templates/blog/includes/blog_meta.html b/blog/templates/blog/includes/blog_meta.html new file mode 100644 index 0000000..017d448 --- /dev/null +++ b/blog/templates/blog/includes/blog_meta.html @@ -0,0 +1,27 @@ +{% load i18n thumbnail cms_tags %} +{% load url from future %} + + +
    + {% if post.categories.exists %} + {% for category in post.categories.all %} + {% if category.slug %} +
  • {{ category.name }}{% if not forloop.last %}, {% endif %}
  • + {% endif %} + {% endfor %} + {% endif %} + {% if post.tags.exists %} + {% for tag in post.tags.all %} +
  • {{ tag.name }}{% if not forloop.last %}, {% endif %}
  • + {% endfor %} + {% endif %} +
\ No newline at end of file diff --git a/blog/templates/blog/plugins/archive.html b/blog/templates/blog/plugins/archive.html new file mode 100644 index 0000000..a6e740a --- /dev/null +++ b/blog/templates/blog/plugins/archive.html @@ -0,0 +1,32 @@ +{% load i18n %} +{% load url from future %}{% spaceless %} +
+

{% trans "Archive" %}

+ {% regroup dates by date.year as years %} + {% with current_year=year current_month=month %} + + {% endwith %} +
+{% endspaceless %} \ No newline at end of file diff --git a/blog/templates/blog/plugins/authors.html b/blog/templates/blog/plugins/authors.html new file mode 100644 index 0000000..535c824 --- /dev/null +++ b/blog/templates/blog/plugins/authors.html @@ -0,0 +1,19 @@ +{% load i18n thumbnail %}{% spaceless %} + +{% endspaceless %} \ No newline at end of file diff --git a/blog/templates/blog/plugins/categories.html b/blog/templates/blog/plugins/categories.html new file mode 100644 index 0000000..a78db45 --- /dev/null +++ b/blog/templates/blog/plugins/categories.html @@ -0,0 +1,20 @@ +{% load i18n %} +{% load url from future %}{% spaceless %} + +{% endspaceless %} \ No newline at end of file diff --git a/blog/templates/blog/plugins/latest_entries.html b/blog/templates/blog/plugins/latest_entries.html new file mode 100644 index 0000000..ebd5439 --- /dev/null +++ b/blog/templates/blog/plugins/latest_entries.html @@ -0,0 +1,14 @@ +{% load i18n %}{% spaceless %} +
+
    + {% for post in posts_list %} +
  • + {{ post.title }} +

    {{ post.date_published|date:"DATE_FORMAT" }}

    +
  • + {% empty %} +
  • {% trans "No article found." %}
  • + {% endfor %} +
+
+{% endspaceless %} \ No newline at end of file diff --git a/blog/templates/blog/plugins/tags.html b/blog/templates/blog/plugins/tags.html new file mode 100644 index 0000000..99b4705 --- /dev/null +++ b/blog/templates/blog/plugins/tags.html @@ -0,0 +1,20 @@ +{% load i18n %} +{% load url from future %}{% spaceless %} + +{% endspaceless %} \ No newline at end of file diff --git a/blog/templates/blog/post_archive.html b/blog/templates/blog/post_archive.html new file mode 100644 index 0000000..d1c6493 --- /dev/null +++ b/blog/templates/blog/post_archive.html @@ -0,0 +1,2 @@ +{% extends "blog/post_list.html" %} + diff --git a/blog/templates/blog/post_detail.html b/blog/templates/blog/post_detail.html new file mode 100644 index 0000000..e0206a3 --- /dev/null +++ b/blog/templates/blog/post_detail.html @@ -0,0 +1,33 @@ +{% extends "blog/base.html" %} +{% load i18n thumbnail cms_tags menu_tags %} +{% load url from future %} + +{% block meta_description %}{{ post.meta_description }}{% endblock meta_description %} +{% block meta_keywords %}{{ post.meta_keywords }}{% endblock meta_keywords %} +{% block canonical_url %}{% endblock canonical_url %} +{% block title %}{{ post.get_title }}{% endblock %} + +{% block breadcrumb %} + +{% endblock breadcrumb %} + +{% block content_blog %}{% spaceless %} + +
+
+

{% render_model post "title" %}

+

{{ post.date_published|date:"DATE_FORMAT" }}

+
+ {% if post.main_image_id %} +
+ {% thumbnail post.main_image post.full_image_options.size crop=post.full_image_options.crop upscale=post.full_image_options.upscale subject_location=post.main_image.subject_location quality=100 as thumb %} + {{ post.main_image.default_alt_text }} +
+ {% endif %} + {% endspaceless %} + +
{% render_model post "abstract" %}
+
+{% endblock content_blog %} diff --git a/blog/templates/blog/post_list.html b/blog/templates/blog/post_list.html new file mode 100644 index 0000000..c8b781e --- /dev/null +++ b/blog/templates/blog/post_list.html @@ -0,0 +1,43 @@ +{% extends "blog/base.html" %} +{% load i18n thumbnail cms_tags %}{% spaceless %} + +{% block canonical_url %}{% endblock canonical_url %} + +{% block content_blog %} +
+ {% render_placeholder view.config.placeholder_list_top language placeholder_language %} + {% block blog_title %} +
+

+ {% if author %}{% trans "Articles by" %} {{ author.get_full_name }} + {% elif archive_date %}{% trans "Archive" %} – {% if month %}{{ archive_date|date:'F' }} {% endif %}{{ year }} + {% elif tagged_entries %}{% trans "Tag" %} – {{ tagged_entries|capfirst }} + {% elif category %}{% trans "Category" %} – {{ category }}{% endif %} + {{ category }} +

+
+ {% endblock %} + {% for post in post_list %} + {% include "blog/includes/blog_item.html" with post=post image="true" TRUNCWORDS_COUNT=TRUNCWORDS_COUNT %} + {% empty %} +

{% trans "No article found." %}

+ {% endfor %} + {% if author or archive_date or tagged_entries %} +

{% trans "Back" %}

+ {% endif %} + {% if is_paginated %} + + {% endif %} +
+{% endblock %} +{% endspaceless %} \ No newline at end of file diff --git a/blog/urls.py b/blog/urls.py new file mode 100644 index 0000000..41cf7a4 --- /dev/null +++ b/blog/urls.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import patterns, url + +from .views import (PostListView, PostDetailView, TaggedListView, + AuthorEntriesView, PostArchiveView, CategoryEntriesView) +from .feeds import LatestEntriesFeed, TagFeed + + +urlpatterns = patterns( + '', + url(r'^$', PostListView.as_view(), name='posts-latest'), + url(r'^feed/$', LatestEntriesFeed(), name='posts-latest-feed'), + url(r'^(?P\d{4})/$', PostArchiveView.as_view(), name='posts-archive'), + url(r'^(?P\d{4})/(?P\d{1,2})/$', PostArchiveView.as_view(), name='posts-archive'), + url(r'^(?P\d{4})/(?P\d{1,2})/(?P\d{1,2})/(?P\w[-\w]*)/$', PostDetailView.as_view(), name='post-detail'), + url(r'^author/(?P[\w\.@+-]+)/$', AuthorEntriesView.as_view(), name='posts-author'), + url(r'^category/(?P[\w\.@+-]+)/$', CategoryEntriesView.as_view(), name='posts-category'), + url(r'^tag/(?P[-\w]+)/$', TaggedListView.as_view(), name='posts-tagged'), + url(r'^tag/(?P[-\w]+)/feed/$', TagFeed(), name='posts-tagged-feed'), +) diff --git a/blog/views.py b/blog/views.py new file mode 100644 index 0000000..2ef0318 --- /dev/null +++ b/blog/views.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +from django.contrib.auth import get_user_model +from django.core.urlresolvers import resolve +from django.utils.timezone import now +from django.utils.translation import get_language +from django.views.generic import ListView, DetailView + +from parler.views import ViewUrlMixin, TranslatableSlugMixin + +from aldryn_apphooks_config.mixins import AppConfigMixin + +from .models import Post, BlogCategory, BLOG_CURRENT_POST_IDENTIFIER +from .settings import get_setting + +User = get_user_model() + + +class BaseBlogView(ViewUrlMixin, AppConfigMixin): + + def get_queryset(self): + language = get_language() + queryset = self.model._default_manager.active_translations(language_code=language) + + print self.config + if self.config and self.config.category_slug: + self._category = BlogCategory.objects.active_translations(get_language(), slug=self.config.category_slug).latest('pk') + queryset = queryset.filter(categories=self._category.pk) + + if not getattr(self.request, 'toolbar', False) or not self.request.toolbar.edit_mode: + queryset = queryset.published() + + return queryset.on_site() + + def render_to_response(self, context, **response_kwargs): + response_kwargs['current_app'] = resolve(self.request.path).namespace + return super(BaseBlogView, self).render_to_response(context, **response_kwargs) + + +class PostListView(BaseBlogView, ListView): + model = Post + context_object_name = 'post_list' + template_name = 'blog/post_list.html' + paginate_by = get_setting('PAGINATION') + view_url_name = 'blog:posts-latest' + + def get_context_data(self, **kwargs): + context = super(PostListView, self).get_context_data(**kwargs) + context['TRUNCWORDS_COUNT'] = get_setting('POSTS_LIST_TRUNCWORDS_COUNT') + return context + + +class PostDetailView(TranslatableSlugMixin, BaseBlogView, DetailView): + model = Post + context_object_name = 'post' + template_name = 'blog/post_detail.html' + slug_field = 'slug' + view_url_name = 'blog:post-detail' + + def get_context_data(self, **kwargs): + context = super(PostDetailView, self).get_context_data(**kwargs) + context['meta'] = self.get_object().as_meta() + context['use_placeholder'] = get_setting('USE_PLACEHOLDER') + setattr(self.request, BLOG_CURRENT_POST_IDENTIFIER, self.get_object()) + return context + + +class PostArchiveView(BaseBlogView, ListView): + model = Post + context_object_name = 'post_list' + template_name = 'blog/post_list.html' + date_field = 'date_published' + allow_empty = True + allow_future = True + paginate_by = get_setting('PAGINATION') + view_url_name = 'blog:posts-archive' + + def get_queryset(self): + qs = super(PostArchiveView, self).get_queryset() + if 'month' in self.kwargs: + qs = qs.filter(**{'%s__month' % self.date_field: self.kwargs['month']}) + if 'year' in self.kwargs: + qs = qs.filter(**{'%s__year' % self.date_field: self.kwargs['year']}) + return qs + + def get_context_data(self, **kwargs): + kwargs['month'] = int(self.kwargs.get('month')) if 'month' in self.kwargs else None + kwargs['year'] = int(self.kwargs.get('year')) if 'year' in self.kwargs else None + if kwargs['year']: + kwargs['archive_date'] = now().replace(kwargs['year'], kwargs['month'] or 1, 1) + context = super(PostArchiveView, self).get_context_data(**kwargs) + context['TRUNCWORDS_COUNT'] = get_setting('POSTS_LIST_TRUNCWORDS_COUNT') + return context + + +class TaggedListView(BaseBlogView, ListView): + model = Post + context_object_name = 'post_list' + template_name = 'blog/post_list.html' + paginate_by = get_setting('PAGINATION') + view_url_name = 'blog:posts-tagged' + + def get_queryset(self): + qs = super(TaggedListView, self).get_queryset() + return qs.filter(tags__slug=self.kwargs['tag']) + + def get_context_data(self, **kwargs): + kwargs['tagged_entries'] = (self.kwargs.get('tag') + if 'tag' in self.kwargs else None) + context = super(TaggedListView, self).get_context_data(**kwargs) + context['TRUNCWORDS_COUNT'] = get_setting('POSTS_LIST_TRUNCWORDS_COUNT') + return context + + +class AuthorEntriesView(BaseBlogView, ListView): + model = Post + context_object_name = 'post_list' + template_name = 'blog/post_list.html' + paginate_by = get_setting('PAGINATION') + view_url_name = 'blog:posts-authors' + + def get_queryset(self): + qs = super(AuthorEntriesView, self).get_queryset() + if 'username' in self.kwargs: + qs = qs.filter(**{'author__%s' % User.USERNAME_FIELD: self.kwargs['username']}) + return qs + + def get_context_data(self, **kwargs): + kwargs['author'] = User.objects.get(**{User.USERNAME_FIELD: self.kwargs.get('username')}) + context = super(AuthorEntriesView, self).get_context_data(**kwargs) + context['TRUNCWORDS_COUNT'] = get_setting('POSTS_LIST_TRUNCWORDS_COUNT') + return context + + +class CategoryEntriesView(BaseBlogView, ListView): + model = Post + context_object_name = 'post_list' + template_name = 'blog/post_list.html' + _category = None + paginate_by = get_setting('PAGINATION') + view_url_name = 'blog:posts-category' + + @property + def category(self): + if not self._category: + self._category = BlogCategory.objects.active_translations(get_language(), slug=self.kwargs['category']).latest('pk') + return self._category + + def get_queryset(self): + qs = super(CategoryEntriesView, self).get_queryset() + if 'category' in self.kwargs: + qs = qs.filter(categories=self.category.pk) + return qs + + def get_context_data(self, **kwargs): + kwargs['category'] = self.category + context = super(CategoryEntriesView, self).get_context_data(**kwargs) + context['TRUNCWORDS_COUNT'] = get_setting('POSTS_LIST_TRUNCWORDS_COUNT') + return context diff --git a/requirements/blog/requirements-test.txt b/requirements/blog/requirements-test.txt new file mode 100644 index 0000000..ef1af62 --- /dev/null +++ b/requirements/blog/requirements-test.txt @@ -0,0 +1,9 @@ +-r requirements.txt +coverage +coveralls +mock>=1.0.1 +nose>=1.3.0 +django-nose>=1.2 +flake8 +djangocms-helper>=0.7 +tox>=2.0 diff --git a/requirements/blog/requirements.txt b/requirements/blog/requirements.txt new file mode 100644 index 0000000..72a189b --- /dev/null +++ b/requirements/blog/requirements.txt @@ -0,0 +1,2 @@ +-e . +wheel \ No newline at end of file diff --git a/zsite/settings.py b/zsite/settings.py index 754d905..98159be 100644 --- a/zsite/settings.py +++ b/zsite/settings.py @@ -196,7 +196,7 @@ INSTALLED_APPS = ( 'meta', 'meta_mixin', 'admin_enhancer', - 'djangocms_blog', + 'blog', 'aldryn_bootstrap3', diff --git a/zsite/static/less/about.less b/zsite/static/less/about.less deleted file mode 100644 index 77f913d..0000000 --- a/zsite/static/less/about.less +++ /dev/null @@ -1,25 +0,0 @@ -.about-map { - position: absolute; - z-index: 0; - width: 65%; - margin-left: 35%; - margin-top: -10%; - - img { - width: 100%; - } -} - -.about-videos { - li { - width: 165px; - margin-right: 2%; - vertical-align: top; - - font-size: 12px; - - .plugin_video { - margin-bottom: 8px; - } - } -} \ No newline at end of file diff --git a/zsite/static/less/blog.less b/zsite/static/less/blog.less new file mode 100644 index 0000000..e14cbd3 --- /dev/null +++ b/zsite/static/less/blog.less @@ -0,0 +1,17 @@ +.blog-content { + img { + margin-left: 20px; + } +} + +.plugin-blog-category-our-cases { + li { + display: inline-block; + + font-size: 12px; + + width: 220px; + margin-right: 2%; + vertical-align: top; + } +} \ No newline at end of file diff --git a/zsite/static/less/clients.less b/zsite/static/less/clients.less new file mode 100644 index 0000000..4c0549e --- /dev/null +++ b/zsite/static/less/clients.less @@ -0,0 +1,12 @@ +.clients { + .clients-logo { + background-color: #f5f5f5; + + border-radius: 10px; + + margin-bottom: 50px; + margin-left: -15px; + + padding: 15px; + } +} \ No newline at end of file diff --git a/zsite/static/less/main.less b/zsite/static/less/main.less index 0060915..d613cf8 100644 --- a/zsite/static/less/main.less +++ b/zsite/static/less/main.less @@ -12,10 +12,21 @@ @import 'about.less'; +@import 'clients.less'; + @import url(http://fonts.googleapis.com/css?family=PT+Sans:400,700,400italic,700italic|Roboto+Slab:700,400&subset=cyrillic-ext,latin); +.breadcrumb { + padding: 0; + + background-color: #fff; + border-radius: 0; + + margin-top: 18px; + margin-bottom: 18px; +} .background-line-pattern { diff --git a/zsite/static/less/sub_content.less b/zsite/static/less/sub_content.less index f536571..0e1a39f 100644 --- a/zsite/static/less/sub_content.less +++ b/zsite/static/less/sub_content.less @@ -9,6 +9,10 @@ position: relative; z-index: 100; + :first-child { + margin-top: 0; + } + li { @media (min-width: 320px) { display: inline-block; @@ -46,6 +50,9 @@ } .content { + :first-child { + margin-top: 0; + } .make-lg-column(8); .make-md-column(10); .breadcrumb { diff --git a/zsite/templates/aldryn_newsblog/article_list.html b/zsite/templates/aldryn_newsblog/article_list.html deleted file mode 100644 index 771881d..0000000 --- a/zsite/templates/aldryn_newsblog/article_list.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "aldryn_newsblog/two_column.html" %} -{% load i18n cms_tags %} - -{% block newsblog_content %} - {% render_placeholder view.config.list_view_placeholder language placeholder_language %} -
- {% for article in article_list %} - {% include "aldryn_newsblog/includes/article.html" %} - {% empty %} -

{% trans "No items available" %}

- {% endfor %} -
-{% endblock %} - -{% block newsblog_footer %} -
- {% include "aldryn_newsblog/includes/pagination.html" %} -
-{% endblock %} \ No newline at end of file diff --git a/zsite/templates/aldryn_newsblog/base.html b/zsite/templates/aldryn_newsblog/base.html deleted file mode 100644 index a96c81e..0000000 --- a/zsite/templates/aldryn_newsblog/base.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends CMS_TEMPLATE %} - -{% block extend_breadcrumb %} - {{ block.super }} - {% block newsblog_breadcrumb %}{% endblock newsblog_breadcrumb %} -{% endblock extend_breadcrumb %} - -{% block content_safe %}{% endblock content_safe %} \ No newline at end of file diff --git a/zsite/templates/aldryn_newsblog/includes/article.html b/zsite/templates/aldryn_newsblog/includes/article.html deleted file mode 100644 index 322ffc3..0000000 --- a/zsite/templates/aldryn_newsblog/includes/article.html +++ /dev/null @@ -1,72 +0,0 @@ -{% load i18n apphooks_config_tags cms_tags sekizai_tags staticfiles thumbnail %} -{% load url from future %} - - - -{% addtoblock "css" %}{% endaddtoblock %} \ No newline at end of file diff --git a/zsite/templates/aldryn_newsblog/two_column.html b/zsite/templates/aldryn_newsblog/two_column.html deleted file mode 100644 index 855802a..0000000 --- a/zsite/templates/aldryn_newsblog/two_column.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "aldryn_newsblog/base.html" %} -{% load i18n cms_tags %} - -{% block content_safe %} - - {% if view.show_header %} - {% render_placeholder view.config.placeholder_base_top %} - {% endif %} -
- {% block newsblog_title %}{% endblock %} - {% block newsblog_content %}{% endblock %} - {% block newsblog_footer %}{% endblock %} -
- - -{% endblock content_safe %} \ No newline at end of file diff --git a/zsite/templates/sub_section.html b/zsite/templates/sub_section.html index 5ef7dd2..4a8a5d5 100644 --- a/zsite/templates/sub_section.html +++ b/zsite/templates/sub_section.html @@ -4,6 +4,12 @@ {% block title %}{% page_attribute "page_title" %}{% endblock title %} {% block content %} +{% block breadcrumb %} + +{% endblock breadcrumb %} +
- {% block breadcrumb %} - - {% endblock breadcrumb %} - {% block content_safe %} {% placeholder "content" %} {% endblock content_safe %}