from django.db import models from django.contrib.auth.models import User from markdownx.models import MarkdownxField from markdownx.utils import markdown import os class Tag(models.Model): name = models.CharField(max_length=50) slug = models.SlugField(max_length=200, unique=True, allow_unicode=True) def __str__(self): return self.name def get_absolute_url(self): return f'/blog/tag/{self.slug}/' class Category(models.Model): name = models.CharField(max_length=50, unique=True) slug = models.SlugField(max_length=200, unique=True, allow_unicode=True) def __str__(self): return self.name def get_absolute_url(self): return f'/blog/category/{self.slug}/' class Meta: verbose_name_plural = 'categories' class Post(models.Model): title = models.CharField(max_length=30) hook_text = models.CharField(max_length=100, blank=True) content = MarkdownxField() head_image = models.ImageField(upload_to='blog/images/%Y/%m/%d/', blank=True) file_upload = models.FileField(upload_to='blog/files/%Y/%m/%d/', blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) author = models.ForeignKey(User, null=True, on_delete=models.SET_NULL) category = models.ForeignKey(Category, null=True, blank=True, on_delete=models.SET_NULL) tags = models.ManyToManyField(Tag, blank=True) def __str__(self): return f'[{self.pk}]{self.title} :: {self.author}' def get_absolute_url(self): return f'/blog/{self.pk}/' def get_file_name(self): return os.path.basename(self.file_upload.name) def get_file_ext(self): return self.get_file_name().split('.')[-1] def get_content_markdown(self): return markdown(self.content) def get_avatar_url(self): if self.author.socialaccount_set.exists(): return self.author.socialaccount_set.first().get_avatar_url() else: return f'https://api.adorable.io/avatars/60/{self.author.username}.png' class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE) author = models.ForeignKey(User, on_delete=models.CASCADE) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) modified_at = models.DateTimeField(auto_now=True) def __str__(self): return f'{self.author}::{self.content}' def get_absolute_url(self): return f'{self.post.get_absolute_url()}#comment-{self.pk}' def get_avatar_url(self): if self.author.socialaccount_set.exists(): return self.author.socialaccount_set.first().get_avatar_url() else: return f'https://api.adorable.io/avatars/60/{ self.author.username }.png'