Coverage for posts/models.py: 100.00%
49 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-02 19:56 -0700
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-02 19:56 -0700
1from django.contrib.auth import get_user_model
2from django.db import models
3from django.template.defaultfilters import slugify
4from django.urls import reverse
5from django.utils import timezone
6from taggit.managers import TaggableManager
9class PublishedManager(models.Manager):
10 def get_queryset(self):
11 return super().get_queryset().filter(status=Post.Status.PUBLISHED) 1aibcdjekfg
14"""
15class DraftManager(models.Manager):
16 def get_queryset(self):
17 return super().get_queryset().filter(status=Post.Status.DRAFT)
18"""
21class Post(models.Model):
22 class Status(models.TextChoices):
23 DRAFT = "DF", "Draft"
24 PUBLISHED = "PB", "Published"
26 title = models.CharField(max_length=250)
27 slug = models.SlugField(
28 max_length=250,
29 null=False,
30 unique_for_date="publish",
31 )
32 author = models.ForeignKey(
33 get_user_model(),
34 on_delete=models.CASCADE,
35 related_name="blog_posts",
36 )
37 body = models.TextField()
38 publish = models.DateTimeField(default=timezone.now)
39 created = models.DateTimeField(auto_now_add=True)
40 updated = models.DateTimeField(auto_now=True)
41 status = models.CharField(
42 max_length=2, choices=Status.choices, default=Status.PUBLISHED
43 )
45 objects = models.Manager()
46 # draft = DraftManager()
47 published = PublishedManager()
48 tags = TaggableManager()
50 class Meta:
51 ordering = ["-publish"]
52 indexes = [
53 models.Index(fields=["-publish"]),
54 ]
56 def __str__(self):
57 return self.title 1hl
59 def save(self, *args, **kwargs):
60 if not self.slug:
61 self.slug = slugify(self.title)
62 return super().save(*args, **kwargs)
64 def get_absolute_url(self):
65 return reverse( 1mbcdefg
66 "post_detail",
67 args=[self.publish.year, self.publish.month, self.publish.day, self.slug],
68 )
71class Comment(models.Model):
72 post = models.ForeignKey(
73 Post,
74 on_delete=models.CASCADE,
75 related_name="comments",
76 )
77 name = models.CharField(max_length=80)
78 email = models.EmailField()
79 body = models.TextField()
80 created = models.DateTimeField(auto_now_add=True)
81 updated = models.DateTimeField(auto_now=True)
82 active = models.BooleanField(default=True)
84 class Meta:
85 ordering = ["created"]
86 indexes = [
87 models.Index(fields=["created"]),
88 ]
90 def __str__(self):
91 return f"Comment by {self.name} on {self.post}" 1h