Axiacore/knowledge-base

View on GitHub
app/models.py

Summary

Maintainability
A
0 mins
Test Coverage
from django.conf import settings
from django.core.urlresolvers import reverse
from django.db import models
from django.utils.module_loading import import_string


class Category(models.Model):
    name = models.CharField(
        max_length=40,
        unique=True,
    )

    slug = models.SlugField(
        unique=True,
    )

    def active_articles_list(self):
        return self.article_set.filter(
            is_active=True,
        )

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

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['name']
        verbose_name = 'Category'
        verbose_name_plural = 'Categories'


class ActiveArticlesManager(models.Manager):
    def get_queryset(self):
        return super(ActiveArticlesManager, self).get_queryset().filter(
            is_active=True,
        )


class PublicArticlesManager(ActiveArticlesManager):
    def get_queryset(self):
        return super(PublicArticlesManager, self).get_queryset().filter(
            is_private=False,
        )


class Article(models.Model):
    category = models.ForeignKey(Category)

    name = models.CharField(
        max_length=50,
        unique=True,
    )

    slug = models.SlugField()

    is_active = models.BooleanField(
        default=True,
    )

    is_private = models.BooleanField()

    content = models.TextField()

    upvotes = models.PositiveIntegerField(
        default=0,
        editable=False,
    )

    downvotes = models.PositiveIntegerField(
        default=0,
        editable=False,
    )

    updated_at = models.DateTimeField(
        auto_now=True,
    )

    objects = models.Manager()

    actives = ActiveArticlesManager()

    publics = PublicArticlesManager()

    @property
    def content_markdown(self):
        markdownify = import_string(settings.MARKDOWNX_MARKDOWNIFY_FUNCTION)
        return markdownify(self.content)

    def get_absolute_url(self):
        return reverse(
            'article_detail',
            args=[self.category.slug, self.slug]
        )

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['name']
        unique_together = ('category', 'slug')