from django.db import models from django.contrib.auth.models import User from django.conf import settings from django.db.models import Q from django.utils.text import slugify from enum import Enum import string # Create your models here. class PostState(Enum): DRAFT = 0 PUBLISHED = 1 WAITING_LIST = 2 USER_SUBMITTED = 3 class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True) title = models.CharField(max_length=500) body = models.CharField(max_length=10000, null=True, blank=True) url = models.CharField(max_length=200, null=True, blank=True) date = models.DateTimeField('date published') state = models.IntegerField(default=0) style = models.IntegerField(default=0) image_url = models.CharField(max_length=100, null=True, blank=True) slug = models.SlugField(default='', max_length=200) def save(self, *args, **kwargs): self.slug = slugify(self.title) super(Post, self).save(*args, **kwargs) def __str__(self): string = self.title if self.style == 2: string = "some image" elif self.style == 3: string = "Youtube: " + self.title return string def get_absolute_url(self): kwargs = { 'pk': self.id, 'slug': self.slug } return reverse('post_detail', kwargs=kwargs) def top_comments(self): return self.comment_set.filter(Q(parent_comment=None)).order_by('-voters').all()[:1] def flat_comments(self, user): flat = [] for comment in self.comment_set.filter(Q(parent_comment=None)).all(): children = comment.flat_children(0, user) flat.extend(children) return flat def formatted_tags(self): tag_names = map(lambda t: t.name, self.tag_set.all()) return ", ".join(tag_names) def html_title(self): if self.title: return self.title return 'Poker Rumble - Amazing content' def formatted_title(self): return string.capwords(self.title) class Comment(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True) post = models.ForeignKey(Post, on_delete=models.CASCADE) parent_comment = models.ForeignKey("self", on_delete=models.SET_NULL, null=True, blank=True) body = models.CharField(max_length=100) voters = models.ManyToManyField(User, related_name='voted_comments', blank=True) date = models.DateTimeField('date published') deleted = models.BooleanField(default=False) def __str__(self): return self.body def voters_count(self): return voters.count def upvoted_by(User): return user in self.voters def flat_children(self, level, user): self.level = range(level) self.upvoted = user in self.voters.all() self.score = len(self.voters.all()) self.is_deletable = (self.deleted == False and user == self.author) flat = [self] for comment in self.comment_set.all(): flat.extend(comment.flat_children(level + 1, user)) return flat class Player(models.Model): name = models.CharField(max_length=100) post = models.ForeignKey(Post, on_delete=models.SET_NULL, null=True) image_url = models.CharField(max_length=100) def __str__(self): return self.name # photo class Tag(models.Model): name = models.CharField(max_length=100) post = models.ManyToManyField(Post, blank=True) def __str__(self): return self.name