Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
fun-apps / newsfeed / models.py
Size: Mime:
# -*- coding: utf-8 -*-

import ckeditor.fields
import logging

from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.validators import validate_slug
from django.db import models
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import get_language

from easy_thumbnails.exceptions import InvalidImageFormatError
from easy_thumbnails.files import get_thumbnailer

logger = logging.getLogger(__name__)


class ArticleManager(models.Manager):

    FEATURED_ARTICLES_COUNT = 14

    def published(self):
        """
        Return the queryset that corresponds to all published articles.
        """
        return self.filter(published=True)

    def published_or(self, **kwargs):
        """
        Return a queryset that corresponds to all published articles or a set
        of constraints.
        """
        return self.filter(models.Q(published=True) | models.Q(**kwargs))

    def viewable(self, language=None):
        """
        Return a queryset of all published articles in the specified language.
        """
        results = self.published()
        if language is not None:
            results = results.filter(language=language)
        return results

    def featured(self):
        """
        Return the first FEATURED_ARTICLES_COUNT articles in the current user's
        language.
        """
        return self.viewable(get_language())[:ArticleManager.FEATURED_ARTICLES_COUNT]


class ArticleCategory(models.Model):
    name = models.CharField(_('name'), max_length=255)
    slug = models.SlugField(_('slug'), max_length=255, unique=True)
    order = models.PositiveIntegerField(_('order'), default=0)

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ('order', 'id')
        verbose_name = _('Article Category')
        verbose_name_plural = _('Article Categories')


class ArticleLink(models.Model):
    name = models.CharField(_('name'), max_length=255)
    url = models.CharField(_('url'), max_length=255)
    article = models.ForeignKey('Article', verbose_name=_('article'),
        related_name='links')

    def __unicode__(self):
        return self.name

    class Meta:
        verbose_name = _('Article Link')
        verbose_name_plural = _('Article Links')


class Article(models.Model):
    title = models.CharField(verbose_name=_("title"),
            max_length=256, blank=False)
    slug = models.SlugField(verbose_name=_("slug"),
            max_length=50, unique=True, blank=False, validators=[validate_slug])
    category = models.ForeignKey('ArticleCategory', verbose_name=_('category'),
        null=True, blank=True, related_name='articles')
    courses = models.ManyToManyField('courses.Course', verbose_name=_('courses'),
        related_name='articles', limit_choices_to={'is_active': True}, blank=True)
    thumbnail = models.ImageField(_('thumbnail'),
        upload_to='newsfeed', null=True, blank=True,
        help_text=_('Displayed on the news list page.'))
    lead_paragraph = models.CharField(verbose_name=_("Lead paragraph"),
            max_length=256, blank=True)
    text = ckeditor.fields.RichTextField(verbose_name=_("text"),
            config_name='default', blank=True)
    event_date = models.DateTimeField(verbose_name=_("event date"),
        null=True, blank=True)
    language = models.CharField(verbose_name=_("language"),
            max_length=8, choices=settings.LANGUAGES, default='fr')
    created_at = models.DateTimeField(verbose_name=_("created at"),
            db_index=True, default=timezone.now)
    edited_at = models.DateTimeField(verbose_name=_("edited at"),
            auto_now=True)
    published = models.BooleanField(verbose_name=_("published"),
            default=False)

    microsite = models.CharField(max_length=128, blank=True, db_index=True)

    objects = ArticleManager()

    class Meta:
        ordering = ["-created_at"]

    def related(self):
        """
        Return article that share the same category.
        """
        queryset = Article.objects.published()
        queryset = queryset.filter(category=self.category)
        return queryset

    def __unicode__(self):
        return self.title

    def get_lead_paragraph(self):
        return self.lead_paragraph if self.lead_paragraph else ''

    def get_thumbnail(self, size):
        try:
            thumbnailer = get_thumbnailer(self.thumbnail)
            # The thumbnail sizes were defined to have the same ratio in
            # all formats: width/height = 1.648
            sizes = {
                'very-big': (1030, 625),
                'big': (570, 346),
                'primary': (570, 346),
                'secondary': (275, 167),
                'facebook': (600, 364)
            }
            thumbnail_options = {'crop': 'smart', 'size': sizes[size], 'upscale': True}
            return thumbnailer.get_thumbnail(thumbnail_options)
        except (InvalidImageFormatError, OSError) as err:
            logger.error(err)
            return ''  ## todo: generic image

    def get_absolute_url(self):
        return reverse('newsfeed-article', args=[self.slug])