Advertisement
BondokBE

posts/models.py

Feb 10th, 2019
418
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.69 KB | None | 0 0
  1. from datetime import datetime, timedelta
  2. from markdown_deux import markdown
  3.  
  4. from django.conf import settings
  5. from django.urls import reverse
  6. from django.db import models
  7. from django.db.models.signals import pre_save
  8. from django.utils.text import slugify
  9. from django.utils import timezone
  10. from django.utils.safestring import mark_safe
  11. from django.contrib.contenttypes.models import ContentType
  12.  
  13. from comments.models import Comment
  14. from .utils import get_read_time, unique_slug_generator
  15.  
  16. class PostManager(models.Manager):
  17.     def active(self, *args, **kwargs):
  18.         # Note! : Post.objects.all() = super(PostManager, self).all()
  19.         return super(PostManager, self).filter(draft=False).filter(publish__lte=timezone.now())
  20.  
  21.  
  22. def upload_location(post, file_name):
  23.     return "{}/{}".format(post.id, file_name)
  24.  
  25.  
  26. class Post(models.Model):
  27.     user            = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, default=1)
  28.     title           = models.CharField(max_length=128)
  29.     slug            = models.SlugField(unique=True)
  30.     width_field     = models.IntegerField(default=0)
  31.     height_field    = models.IntegerField(default=0)
  32.     content         = models.TextField()
  33.     draft           = models.BooleanField(default=False)
  34.     publish         = models.DateField(auto_now=False, auto_now_add=False, default=timezone.now())
  35.     updated         = models.DateTimeField(auto_now=True, auto_now_add=False)
  36.     time_stamp      = models.DateTimeField(auto_now=False, auto_now_add=True)
  37.     time_now        = datetime.now()
  38.     image           = models.ImageField(
  39.                 upload_to=upload_location,
  40.                 null=True,
  41.                 blank=True,
  42.                 width_field="width_field",
  43.                 height_field="height_field",
  44.     )
  45.  
  46.     read_time = models.IntegerField()
  47.     read_time = get_read_time(content)
  48.  
  49.     objects = PostManager()
  50.  
  51.     def __str__(self):
  52.         return self.title
  53.        
  54.     def get_markdown(self):
  55.         content = self.content
  56.         return mark_safe(markdown(content))
  57.  
  58.     @property
  59.     def comments(self):
  60.         instance = self
  61.         qs = Comment.objects.filter_by_instance(instance)
  62.         return qs
  63.  
  64.     @property
  65.     def get_content_type(self):
  66.         instance = self
  67.         content_type = ContentType.objects.get_for_model(instance.__class__)
  68.         return content_type
  69.  
  70.     def get_absolute_url(self):
  71.         # return "/posts/%s/" %(self.slug)
  72.         # ^ it's not fully dynamic, it works with {{ post.get_absolute_url }} inside the post.html
  73.         return reverse("posts:post", args=(self.slug))  # to reverse and make even more dynamic
  74.  
  75.     def edit_url(self):
  76.         return reverse("posts:edit", kwargs={'slug': self.slug})
  77.    
  78.     def delete_url(self):
  79.         return reverse("posts:delete", kwargs={'slug': self.slug})
  80.  
  81.     class Meta:
  82.         ordering = ['-time_stamp', '-updated']
  83.  
  84.     def save(self, *args, **kwargs):
  85.         self.slug = slugify(self.title)
  86.         super(Post, self).save(*args, **kwargs)
  87.  
  88.  
  89. # another slug generator
  90.  
  91. # def create_slug(obj, new_slug=None):
  92. #     slug = slugify(obj.title)
  93. #     if new_slug is not None:
  94. #         slug = new_slug
  95. #     qs = Post.objects.filter(slug=slug).order_by('-id')
  96. #     exists = qs.exists()
  97. #     if exists:
  98. #         new_slug = "%s-%s" %(slug, qs.first().id)
  99. #         return create_slug(obj, new_slug=new_slug)
  100. #     return slug
  101.  
  102.  
  103. # def pre_save_post_receiver(sender, instance, *args, **kwargs):
  104. #     if not instance:
  105. #         instance.slug = create_slug(instance)
  106. #         # instance.slug = unique_slug_generator(instance)
  107.  
  108.  
  109.  
  110. # pre_save.connect(pre_save_post_receiver, sender=Post)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement