About Post

class Category(models.Model):
    """ 최상위 카테고리를 저장하는 모델입니다. """
    category = models.CharField(max_length=40)
    url = models.URLField(default="http://127.0.0.1:8000/base")
    has_sub = models.BooleanField(default=False)
    order = models.IntegerField()
    created_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.category

class SubCategory(models.Model):
    """
    하위 카테고리를 저장하는 모델입니다.
    이 모델은 추후 더 나은 알고리즘이 발견될 시에 삭제될 수 있습니다.
    """
    category = models.CharField(max_length=40)
    url = models.URLField(default="http://127.0.0.1:8000/base")
    parent = models.ForeignKey(Category, on_delete=models.CASCADE)
    has_sub = models.BooleanField(default=False)
    order = models.IntegerField()
    created_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.category

    def save(self, *args, **kwargs):
        super(SubCategory, self).save(*args, **kwargs)
        self.parent.has_sub = True
        self.parent.save()

class S_SubCategory(models.Model):
    """
    최하위 카테고리를 저장하는 모델입니다.
    이 모델은 추후 더 나은 알고리즘이 발견될 시에 삭제될 수 있습니다.
    """
    category = models.CharField(max_length=40)
    url = models.URLField(default="http://127.0.0.1:8000/base")
    parent = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
    order = models.IntegerField()
    created_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.category

    def save(self, *args, **kwargs):
        super(S_SubCategory, self).save(*args, **kwargs)
        self.parent.has_sub = True
        self.parent.save()

class Post(models.Model):
    """
    전체검색을 위한 Post를 저장하는 모델입니다.
    거의 대부분의 게시물 분류는 이 모델을 상속받으며, 추가적인 작업을 합니다.
    이 모델 역시 카테고리가 있으며, order도 위와 같은 역할을 담당합니다.
    """
    title = models.CharField(max_length=50)
    writer = models.ForeignKey(Profile, related_name='post', on_delete=models.CASCADE)
    write_date = models.DateTimeField(auto_now_add=True)
    modify_date = models.DateTimeField(null=True, default=None)
    hit = models.IntegerField(default=0)
    text = models.TextField()
    is_notice = models.BooleanField(default=False)
    report_count = models.IntegerField(default=0)
    post_user_like = models.ManyToManyField(Profile, related_name='post_like_set', through='PostLike')
    post_user_report = models.ManyToManyField(Profile, related_name='post_report_set', through='PostReport')

    objects = models.Manager()
    objects_in = InheritanceManager()

    def __str__(self):
        return self.title

    # count like or dislike
    def up_count(self):
        return Like.objects.filter(post_id=self.pk, likes=1).count()
    def down_count(self):
        return Like.objects.filter(post_id=self.pk, likes=-1).count()

    # count report
    def report_count(self):
        return Report.objects.filter(post_id=self.pk).count()

class Comment(models.Model):
    """
    모든 댓글을 저장하는 모델입니다.
    대댓글은 parent로 구분하며, 댓글과 대댓글을 묶기 위해 group을 사용합니다.
    group순으로 정렬하여 댓글을 출력합니다.
    """
    parent = models.IntegerField(null=True)
    group = models.IntegerField(default=1)
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    author = models.ForeignKey(Profile)
    text = models.TextField()
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(null=True, default=None)
    report_count = models.IntegerField(default=0)
    comment_user_like = models.ManyToManyField(Profile, related_name='comment_like_set', through='CommentLike')
    comment_user_report = models.ManyToManyField(Profile, related_name='comment_report_set', through='CommentReport')

    objects = models.Manager()
    objects_in = InheritanceManager()

    class Meta:
        ordering = ('group',)

    def __str__(self):
        return self.text

    # count like or dislike
    def up_count(self):
        return Like.objects.filter(comment_id=self.pk, likes=1).count()
    def down_count(self):
        return Like.objects.filter(comment_id=self.pk, likes=-1).count()

    # count report
    def report_count(self):
        return Report.objects.filter(comment_id=self.pk).count()

    def get_parent_pk(self):
        return self.parent

class CommentLike(models.Model):
    user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
    comment = models.ForeignKey(Comment, null=True, on_delete=models.CASCADE)
    likes = models.IntegerField()

class PostLike(models.Model):
    user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
    post = models.ForeignKey(Post, null=True, on_delete=models.CASCADE)
    likes = models.IntegerField()

class CommentReport(models.Model):
    user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
    comment = models.ForeignKey(Comment, null=True, on_delete=models.CASCADE)
    report_date = models.DateTimeField(auto_now_add=True)
    report_reason = models.CharField(max_length=100)

    def __str__(self):
        return self.user.nickname

class PostReport(models.Model):
    user = models.ForeignKey(Profile, null=True, on_delete=models.SET_NULL)
    post = models.ForeignKey(Post, null=True, on_delete=models.CASCADE)
    report_date = models.DateTimeField(auto_now_add=True)
    report_reason = models.CharField(max_length=100)

    def __str__(self):
        return self.user.nickname

results matching ""

    No results matching ""