Statistics
| Branch: | Tag: | Revision:

root / cloudcmsblog / models.py @ c1468bcc

History | View | Annotate | Download (4.7 kB)

1 c1468bcc Kostas Papadimitriou
from datetime import datetime
2 c1468bcc Kostas Papadimitriou
3 c1468bcc Kostas Papadimitriou
from django.db import models
4 c1468bcc Kostas Papadimitriou
from django.conf import settings
5 c1468bcc Kostas Papadimitriou
from django.contrib.auth.models import User
6 c1468bcc Kostas Papadimitriou
from django.utils.translation import ugettext_lazy as _, ugettext, ungettext
7 c1468bcc Kostas Papadimitriou
8 c1468bcc Kostas Papadimitriou
from feincms import translations
9 c1468bcc Kostas Papadimitriou
from feincms.models import Base
10 c1468bcc Kostas Papadimitriou
from feincms.content.richtext.models import RichTextContent
11 c1468bcc Kostas Papadimitriou
from feincms.content.section.models import SectionContent
12 c1468bcc Kostas Papadimitriou
from feincms.module.medialibrary.fields import MediaFileForeignKey
13 c1468bcc Kostas Papadimitriou
from feincms.module.medialibrary.models import MediaFile
14 c1468bcc Kostas Papadimitriou
from feincms.module.page.extensions.navigation import NavigationExtension
15 c1468bcc Kostas Papadimitriou
from feincms.module.page.extensions.navigation import PagePretender
16 c1468bcc Kostas Papadimitriou
17 c1468bcc Kostas Papadimitriou
from cloudcms.models import Application
18 c1468bcc Kostas Papadimitriou
19 c1468bcc Kostas Papadimitriou
20 c1468bcc Kostas Papadimitriou
class Category(models.Model, translations.TranslatedObjectMixin):
21 c1468bcc Kostas Papadimitriou
    """
22 c1468bcc Kostas Papadimitriou
    Blog entry category. Each blog post may belong to multiple categories.
23 c1468bcc Kostas Papadimitriou
    """
24 c1468bcc Kostas Papadimitriou
25 c1468bcc Kostas Papadimitriou
    ordering = models.SmallIntegerField(_('ordering'), default=0)
26 c1468bcc Kostas Papadimitriou
    display_on_menu = models.BooleanField(default=False)
27 c1468bcc Kostas Papadimitriou
28 c1468bcc Kostas Papadimitriou
    class Meta:
29 c1468bcc Kostas Papadimitriou
        verbose_name = _('category')
30 c1468bcc Kostas Papadimitriou
        verbose_name_plural = _('categories')
31 c1468bcc Kostas Papadimitriou
        ordering = ['-ordering',]
32 c1468bcc Kostas Papadimitriou
33 c1468bcc Kostas Papadimitriou
    objects = translations.TranslatedObjectManager()
34 c1468bcc Kostas Papadimitriou
35 c1468bcc Kostas Papadimitriou
    def __unicode__(self):
36 c1468bcc Kostas Papadimitriou
        trans = translations.TranslatedObjectMixin.__unicode__(self)
37 c1468bcc Kostas Papadimitriou
        return trans or _('Unnamed category')
38 c1468bcc Kostas Papadimitriou
39 c1468bcc Kostas Papadimitriou
40 c1468bcc Kostas Papadimitriou
class CategoryTranslation(translations.Translation(Category)):
41 c1468bcc Kostas Papadimitriou
    """
42 c1468bcc Kostas Papadimitriou
    Category translation
43 c1468bcc Kostas Papadimitriou
    """
44 c1468bcc Kostas Papadimitriou
    title = models.CharField(_('category title'), max_length=100)
45 c1468bcc Kostas Papadimitriou
    slug = models.SlugField(_('slug'), unique=True)
46 c1468bcc Kostas Papadimitriou
    description = models.CharField(_('description'), max_length=250, blank=True)
47 c1468bcc Kostas Papadimitriou
48 c1468bcc Kostas Papadimitriou
    class Meta:
49 c1468bcc Kostas Papadimitriou
        verbose_name = _('category translation')
50 c1468bcc Kostas Papadimitriou
        verbose_name_plural = _('category translations')
51 c1468bcc Kostas Papadimitriou
        ordering = ['title']
52 c1468bcc Kostas Papadimitriou
53 c1468bcc Kostas Papadimitriou
    def __unicode__(self):
54 c1468bcc Kostas Papadimitriou
        return self.title
55 c1468bcc Kostas Papadimitriou
56 c1468bcc Kostas Papadimitriou
    @models.permalink
57 c1468bcc Kostas Papadimitriou
    def get_absolute_url(self):
58 c1468bcc Kostas Papadimitriou
        return ('cloudcmsblog_entries_archive', (), {
59 c1468bcc Kostas Papadimitriou
            'category': self.slug,
60 c1468bcc Kostas Papadimitriou
            })
61 c1468bcc Kostas Papadimitriou
62 c1468bcc Kostas Papadimitriou
    def save(self, *args, **kwargs):
63 c1468bcc Kostas Papadimitriou
        if not self.slug:
64 c1468bcc Kostas Papadimitriou
            self.slug = slugify(self.title)
65 c1468bcc Kostas Papadimitriou
66 c1468bcc Kostas Papadimitriou
        super(CategoryTranslation, self).save(*args, **kwargs)
67 c1468bcc Kostas Papadimitriou
68 c1468bcc Kostas Papadimitriou
69 c1468bcc Kostas Papadimitriou
class EntryManager(models.Manager):
70 c1468bcc Kostas Papadimitriou
71 c1468bcc Kostas Papadimitriou
    def active(self):
72 c1468bcc Kostas Papadimitriou
        return self.filter(is_active=True)
73 c1468bcc Kostas Papadimitriou
74 c1468bcc Kostas Papadimitriou
class Entry(Base):
75 c1468bcc Kostas Papadimitriou
    """
76 c1468bcc Kostas Papadimitriou
    Blog post entry
77 c1468bcc Kostas Papadimitriou
    """
78 c1468bcc Kostas Papadimitriou
    is_active = models.BooleanField(_('is active'), default=True)
79 c1468bcc Kostas Papadimitriou
    is_featured = models.BooleanField(_('is featured'), default=False)
80 c1468bcc Kostas Papadimitriou
81 c1468bcc Kostas Papadimitriou
    title = models.CharField(_('title'), max_length=100)
82 c1468bcc Kostas Papadimitriou
    slug = models.SlugField(_('slug'), max_length=100, unique_for_date='published_on')
83 c1468bcc Kostas Papadimitriou
    author = models.ForeignKey(User, related_name='blogentries', verbose_name=_('author'))
84 c1468bcc Kostas Papadimitriou
    language = models.CharField(max_length=255, choices=settings.LANGUAGES)
85 c1468bcc Kostas Papadimitriou
86 c1468bcc Kostas Papadimitriou
    intro_text = models.TextField(max_length=255,
87 c1468bcc Kostas Papadimitriou
            help_text="Displayed in list views", blank=True)
88 c1468bcc Kostas Papadimitriou
    image = MediaFileForeignKey(MediaFile, null=True, blank=True)
89 c1468bcc Kostas Papadimitriou
    application = models.ManyToManyField(Application,
90 c1468bcc Kostas Papadimitriou
            related_name="blogentries",
91 c1468bcc Kostas Papadimitriou
            verbose_name=_('application'))
92 c1468bcc Kostas Papadimitriou
93 c1468bcc Kostas Papadimitriou
    published_on = models.DateTimeField(_('published on'), blank=True, null=True, default=datetime.now,
94 c1468bcc Kostas Papadimitriou
        help_text=_('Will be filled in automatically when entry gets published.'))
95 c1468bcc Kostas Papadimitriou
    last_changed = models.DateTimeField(_('last change'), auto_now=True, editable=False)
96 c1468bcc Kostas Papadimitriou
97 c1468bcc Kostas Papadimitriou
    categories = models.ManyToManyField(Category, verbose_name=_('categories'),
98 c1468bcc Kostas Papadimitriou
        related_name='blogentries', null=True, blank=True)
99 c1468bcc Kostas Papadimitriou
100 c1468bcc Kostas Papadimitriou
    objects = EntryManager()
101 c1468bcc Kostas Papadimitriou
102 c1468bcc Kostas Papadimitriou
    class Meta:
103 c1468bcc Kostas Papadimitriou
        get_latest_by = 'published_on'
104 c1468bcc Kostas Papadimitriou
        ordering = ['-published_on']
105 c1468bcc Kostas Papadimitriou
        verbose_name = _('entry')
106 c1468bcc Kostas Papadimitriou
        verbose_name_plural = _('entries')
107 c1468bcc Kostas Papadimitriou
108 c1468bcc Kostas Papadimitriou
    def __unicode__(self):
109 c1468bcc Kostas Papadimitriou
        return self.title
110 c1468bcc Kostas Papadimitriou
111 c1468bcc Kostas Papadimitriou
    @models.permalink
112 c1468bcc Kostas Papadimitriou
    def get_absolute_url(self):
113 c1468bcc Kostas Papadimitriou
        return ('cloudcmsblog_entry_detail', (), {
114 c1468bcc Kostas Papadimitriou
            'year': self.published_on.strftime('%Y'),
115 c1468bcc Kostas Papadimitriou
            'month': self.published_on.strftime('%m'),
116 c1468bcc Kostas Papadimitriou
            'day': self.published_on.strftime('%d'),
117 c1468bcc Kostas Papadimitriou
            'slug': self.slug,
118 c1468bcc Kostas Papadimitriou
            })
119 c1468bcc Kostas Papadimitriou
120 c1468bcc Kostas Papadimitriou
121 c1468bcc Kostas Papadimitriou
# Feincms navigation extension
122 c1468bcc Kostas Papadimitriou
class BlogCategoriesNavigationExtension(NavigationExtension):
123 c1468bcc Kostas Papadimitriou
    """
124 c1468bcc Kostas Papadimitriou
    Navigation extension for FeinCMS which lists all categories that user
125 c1468bcc Kostas Papadimitriou
    wants to include in global site navigation.
126 c1468bcc Kostas Papadimitriou
    """
127 c1468bcc Kostas Papadimitriou
128 c1468bcc Kostas Papadimitriou
    name = _('blog categories')
129 c1468bcc Kostas Papadimitriou
130 c1468bcc Kostas Papadimitriou
    def children(self, page, **kwargs):
131 c1468bcc Kostas Papadimitriou
        for category in Category.objects.filter(display_on_menu=True):
132 c1468bcc Kostas Papadimitriou
            url='%scategory/%s/' % (page.get_absolute_url(), category.translation.slug)
133 c1468bcc Kostas Papadimitriou
            yield PagePretender(
134 c1468bcc Kostas Papadimitriou
                title=category.translation.title,
135 c1468bcc Kostas Papadimitriou
                tree_id=page.tree_id,
136 c1468bcc Kostas Papadimitriou
                url=url,
137 c1468bcc Kostas Papadimitriou
                lft=0,
138 c1468bcc Kostas Papadimitriou
                rght=0,
139 c1468bcc Kostas Papadimitriou
                slug=category.translation.slug,
140 c1468bcc Kostas Papadimitriou
            )