from django.db import models from django.contrib import auth from django.urls import reverse from django.conf import settings class CategoryManager(models.Manager): # create category def create_category(self, title, slug=''): if slug == '': slug = title.lower().replace(' ', '-') category = self.create(title=title, slug=slug) return category # get or create def get_or_create(self, title): try: category = Category.objects.get(title=title) except Category.DoesNotExist: return (self.create_category(title), True) return (category, False) class Category(models.Model): title = models.CharField(max_length=120) slug = models.SlugField() date_created = models.DateTimeField(auto_now=False, auto_now_add=True) date_updated = models.DateTimeField(auto_now=True, auto_now_add=False) topic_count = models.PositiveIntegerField(default=0) topics_year = models.PositiveIntegerField(default=0) topics_month = models.PositiveIntegerField(default=0) topics_week = models.PositiveIntegerField(default=0) class Meta: verbose_name_plural = "Categories" objects = CategoryManager() def __unicode__(self): return self.title class TopicManager(models.Manager): # create category def create_topic(self, title, category, user, slug=''): if slug == '': slug = title.lower().replace(' ', '-') topic = self.create(title=title, slug=slug, category=category, user=user) return topic class Topic(models.Model): category = models.ForeignKey(Category, on_delete=models.CASCADE) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='topic_user') last_post_userj= models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='topic_last_post_user', blank=True, null=True) highest_post = models.ForeignKey('Post', on_delete=models.CASCADE, related_name='topic_highest_post', blank=True, null=True) title = models.CharField(max_length=255) slug = models.SlugField() date_last_posted = models.DateTimeField(auto_now=True, auto_now_add=False, blank=True) date_created = models.DateTimeField(auto_now=False, auto_now_add=True, blank=True) date_updated = models.DateTimeField(auto_now=True, auto_now_add=False, blank=True) date_deleted = models.DateTimeField(blank=True, null=True) date_bumped = models.DateTimeField(blank=True, null=True) views = models.PositiveIntegerField(default=0) posts_count = models.PositiveIntegerField(default=0) reply_count = models.PositiveIntegerField(default=0) like_count = models.PositiveIntegerField(default=0) bookmark_count = models.PositiveIntegerField(default=0) star_count = models.PositiveIntegerField(default=0) moderator_posts_count = models.PositiveIntegerField(default=0) vote_count = models.PositiveIntegerField(default=0) spam_count = models.PositiveIntegerField(default=0) illegal_count = models.PositiveIntegerField(default=0) inappropriate_count = models.PositiveIntegerField(default=0) visible = models.BooleanField(default=True) closed = models.BooleanField(default=False) pinned = models.BooleanField(default=False) archived = models.BooleanField(default=False) has_best_of = models.BooleanField(default=False) objects = TopicManager() class Meta: verbose_name_plural = "Topics" def __str__(self): return self.title def get_absolute_url(self): return reverse('forum:topic-detail', kwargs={"slug": self.slug, "pk": self.pk}) class Post(models.Model): topic = models.ForeignKey(Topic, on_delete=models.CASCADE) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='post_user') reply_to_post = models.ForeignKey('self', on_delete=models.CASCADE, related_name='post_reply_to', blank=True, null=True) reply_to_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='post_reply_to_user', blank=True, null=True) reply_below_post = models.ForeignKey('self', on_delete=models.CASCADE, related_name='post_reply_below', blank=True, null=True) last_editor = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='post_last_editor', blank=True, null=True) POST_TYPE_CHOICES = ( ('post', 'post'), ('reply', 'reply'), ) post_type = models.CharField(max_length=60, choices=POST_TYPE_CHOICES) post_body_text = models.TextField(blank=True, null=False) post_body_html = models.TextField(blank=True, null=True) post_body_json = models.TextField(blank=True, null=True) date_created = models.DateTimeField(auto_now=False, auto_now_add=True, blank=True) date_updated = models.DateTimeField(auto_now=True, auto_now_add=False, blank=True) date_delete = models.DateTimeField(blank=True, null=True) reply_count = models.PositiveIntegerField(default=0) quote_count = models.PositiveIntegerField(default=0) like_count = models.PositiveIntegerField(default=0) bookmark_count = models.PositiveIntegerField(default=0) spam_count = models.PositiveIntegerField(default=0) reads = models.PositiveIntegerField(default=0) inappropriate_count = models.PositiveIntegerField(default=0) score = models.IntegerField(default=0) vote_count = models.IntegerField(default=0) class Meta: verbose_name_plural = "Posts" def __str__(self): return '%s - %s' % (self.raw, self.topic.title)