gremmie@1: """ gremmie@1: Models for the comments application. gremmie@1: """ gremmie@1: from django.db import models gremmie@1: from django.conf import settings gremmie@1: from django.contrib.contenttypes.models import ContentType gremmie@1: from django.contrib.contenttypes import generic gremmie@1: from django.contrib.auth.models import User gremmie@1: from django.template.loader import render_to_string bgneal@14: from django.core import urlresolvers gremmie@1: gremmie@1: gremmie@1: COMMENT_MAX_LENGTH = getattr(settings, 'COMMENT_MAX_LENGTH', 3000) gremmie@1: gremmie@1: class CommentManager(models.Manager): gremmie@1: """Manager for the Comment model class.""" gremmie@1: gremmie@1: def for_object(self, obj, filter_public=True): gremmie@1: """QuerySet for all comments for a particular model instance.""" gremmie@1: ct = ContentType.objects.get_for_model(obj) gremmie@1: qs = self.get_query_set().filter(content_type__pk=ct.id, gremmie@1: object_id=obj.id) gremmie@1: if filter_public: gremmie@1: qs = qs.filter(is_public=True) gremmie@1: return qs gremmie@1: gremmie@1: gremmie@1: class Comment(models.Model): gremmie@1: """My own version of a Comment class that can attach comments to any other model.""" gremmie@1: content_type = models.ForeignKey(ContentType) gremmie@1: object_id = models.PositiveIntegerField() gremmie@1: content_object = generic.GenericForeignKey('content_type', 'object_id') gremmie@1: user = models.ForeignKey(User) gremmie@1: comment = models.TextField(max_length=COMMENT_MAX_LENGTH) gremmie@1: html = models.TextField(blank=True) gremmie@1: creation_date = models.DateTimeField(auto_now_add=True) gremmie@1: ip_address = models.IPAddressField('IP Address') gremmie@1: is_public = models.BooleanField(default=True, gremmie@1: help_text='Uncheck this field to make the comment invisible.') gremmie@1: is_removed = models.BooleanField(default=False, gremmie@1: help_text='Check this field to replace the comment with a ' \ gremmie@1: '"This comment has been removed" message') gremmie@1: gremmie@1: # Attach manager gremmie@1: objects = CommentManager() gremmie@1: bgneal@14: class Meta: bgneal@14: ordering = ('creation_date', ) bgneal@14: gremmie@1: def __unicode__(self): gremmie@1: return u'%s: %s...' % (self.user.username, self.comment[:50]) gremmie@1: gremmie@1: def save(self, force_insert=False, force_update=False): gremmie@1: html = render_to_string('comments/markdown.html', {'data': self.comment}) gremmie@1: self.html = html.strip() gremmie@1: super(Comment, self).save(force_insert, force_update) gremmie@1: bgneal@14: def get_absolute_url(self): bgneal@14: return self.get_content_object_url() + ('#c%s' % self.id) bgneal@14: bgneal@14: def get_content_object_url(self): bgneal@14: """ bgneal@14: Get a URL suitable for redirecting to the content object. bgneal@14: """ bgneal@14: return urlresolvers.reverse( bgneal@14: "comments-url-redirect", bgneal@14: args=(self.content_type_id, self.object_id) bgneal@14: ) bgneal@14: gremmie@1: gremmie@1: class CommentFlag(models.Model): gremmie@1: """This model represents a user flagging a comment as inappropriate.""" gremmie@1: user = models.ForeignKey(User) gremmie@1: comment = models.ForeignKey(Comment) gremmie@1: flag_date = models.DateTimeField(auto_now_add=True) gremmie@1: gremmie@1: def __unicode__(self): bgneal@98: return u'Comment ID %s flagged by %s' % (self.comment.id, self.user.username) gremmie@1: gremmie@1: class Meta: gremmie@1: ordering = ('flag_date', ) gremmie@1: gremmie@1: def get_comment_url(self): gremmie@1: return 'Comment' % self.comment.id gremmie@1: get_comment_url.allow_tags = True gremmie@1: