diff --git a/articles/models.py b/articles/models.py index 6b20219..816ea8b 100644 --- a/articles/models.py +++ b/articles/models.py @@ -1 +1,65 @@ -# Create your models here. +from datetime import datetime + +from django.db import models +from django.urls import reverse_lazy +from django.utils.text import slugify +from markdownx.models import MarkdownxField +from markdownx.utils import markdownify +from tagulous.models import TagField + + +class Category(models.Model): + title = models.CharField(max_length=40, unique=True) + slug = models.SlugField(max_length=40, unique=True) + introduction = models.TextField(blank=True, null=True) + + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): + if not self.slug: + self.slug = slugify(self.title) + return super(Category, self).save() + + def get_absolute_url(self): + return reverse_lazy('articles:list_category', args=[self.slug]) + + def __str__(self): + return self.title + + class Meta: + ordering = ['title'] + + +class Article(models.Model): + title = models.CharField(max_length=200) + subtitle = models.CharField(max_length=200, blank=True, null=True) + slug = models.SlugField(max_length=200, unique=True) + category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name='articles') + introduction = models.TextField(blank=True, null=True) + body = MarkdownxField() + summary = MarkdownxField(blank=True, null=True) + tags = TagField(force_lowercase=True, + get_absolute_url=lambda tag: reverse_lazy('articles:list_tag', kwargs={'tag': tag.slug})) + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now_add=True) + is_published = models.BooleanField(default=False) + is_updated = models.BooleanField(default=False) + is_featured = models.BooleanField(default=False) + + def save(self, force_insert=False, force_update=False, using=None, update_fields=None): + if not self.slug: + self.slug = slugify(self.title) + if self.is_updated: + self.updated = datetime.now() + self.is_updated = False + return super(Article, self).save() + + def get_absolute_url(self): + return reverse_lazy('articles:detail', args=[self.category.slug, self.slug]) + + def body_as_markdown(self): + return markdownify(self.body) + + def __str__(self): + return self.title + + class Meta: + ordering = ['-created']