from django.contrib.auth import get_user_model 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) def save(self): if not self.slug: self.slug = slugify(self.title) return super(Category, self).save() def get_absolute_url(self): return reverse_lazy("news:list_category", args=[self.slug]) def __str__(self): return self.title class Meta: ordering = ["title"] class NewsItem(models.Model): title = models.CharField(max_length=200) slug = models.SlugField(max_length=200, unique=True) category = models.ForeignKey( Category, on_delete=models.PROTECT, related_name="news_items" ) body = MarkdownxField() origin_text = models.CharField(max_length=200, blank=True, null=True) origin_link = models.URLField(blank=True, null=True) origin_times_followed = models.PositiveIntegerField(default=0) header_img = models.ImageField(blank=True, null=True) tags = TagField( force_lowercase=True, get_absolute_url=lambda tag: reverse_lazy( "news:list_tag", kwargs={"tag": tag.slug} ), ) created_at = models.DateTimeField(auto_now_add=True) is_published = models.BooleanField(default=False) is_featured = models.BooleanField(default=False) owner = models.ForeignKey( get_user_model(), on_delete=models.CASCADE, related_name="news_items" ) def save(self): if not self.slug: self.slug = slugify(self.title) return super(NewsItem, self).save() def get_absolute_url(self): return reverse_lazy("news: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_at"]