Mercurial > public > sg101
diff comments/models.py @ 581:ee87ea74d46b
For Django 1.4, rearranged project structure for new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 05 May 2012 17:10:48 -0500 |
parents | gpp/comments/models.py@24f1230f3ee3 |
children | 66d46d31d543 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/comments/models.py Sat May 05 17:10:48 2012 -0500 @@ -0,0 +1,99 @@ +""" +Models for the comments application. +""" +import datetime + +from django.db import models +from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes import generic +from django.contrib.auth.models import User +from django.core import urlresolvers + +from core.markup import site_markup + + +COMMENT_MAX_LENGTH = getattr(settings, 'COMMENT_MAX_LENGTH', 3000) + +class CommentManager(models.Manager): + """Manager for the Comment model class.""" + + def for_object(self, obj, filter_public=True): + """QuerySet for all comments for a particular model instance.""" + ct = ContentType.objects.get_for_model(obj) + qs = self.get_query_set().filter(content_type__pk=ct.id, + object_id=obj.id) + if filter_public: + qs = qs.filter(is_public=True) + return qs + + +class Comment(models.Model): + """My own version of a Comment class that can attach comments to any other model.""" + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField(db_index=True) + content_object = generic.GenericForeignKey('content_type', 'object_id') + user = models.ForeignKey(User) + comment = models.TextField(max_length=COMMENT_MAX_LENGTH) + html = models.TextField(blank=True) + creation_date = models.DateTimeField() + ip_address = models.IPAddressField('IP Address') + is_public = models.BooleanField(default=True, + help_text='Uncheck this field to make the comment invisible.') + is_removed = models.BooleanField(default=False, + help_text='Check this field to replace the comment with a ' \ + '"This comment has been removed" message') + + # Attach manager + objects = CommentManager() + + class Meta: + ordering = ('creation_date', ) + + def __unicode__(self): + return u'%s: %s...' % (self.user.username, self.comment[:50]) + + def save(self, *args, **kwargs): + if not self.id: + self.creation_date = datetime.datetime.now() + + self.html = site_markup(self.comment) + super(Comment, self).save(*args, **kwargs) + + def get_absolute_url(self): + return self.get_content_object_url() + ('#c%s' % self.id) + + def get_content_object_url(self): + """ + Get a URL suitable for redirecting to the content object. + """ + return urlresolvers.reverse( + "comments-url-redirect", + args=(self.content_type_id, self.object_id) + ) + + def not_removed(self): + """ + Returns not self.is_removed. Used on the admin display for + "green board" display purposes. + """ + return not self.is_removed + not_removed.boolean = True + + +class CommentFlag(models.Model): + """This model represents a user flagging a comment as inappropriate.""" + user = models.ForeignKey(User) + comment = models.ForeignKey(Comment) + flag_date = models.DateTimeField(auto_now_add=True) + + def __unicode__(self): + return u'Comment ID %s flagged by %s' % (self.comment.id, self.user.username) + + class Meta: + ordering = ('flag_date', ) + + def get_comment_url(self): + return '<a href="/admin/comments/comment/%s">Comment</a>' % self.comment.id + get_comment_url.allow_tags = True +