summaryrefslogtreecommitdiff
path: root/app/lib/django_comments/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/lib/django_comments/models.py')
-rw-r--r--app/lib/django_comments/models.py178
1 files changed, 18 insertions, 160 deletions
diff --git a/app/lib/django_comments/models.py b/app/lib/django_comments/models.py
index 6ba1f30..ebf1bc5 100644
--- a/app/lib/django_comments/models.py
+++ b/app/lib/django_comments/models.py
@@ -1,167 +1,17 @@
from django.conf import settings
-try:
- from django.contrib.contenttypes.fields import GenericForeignKey
-except ImportError:
- from django.contrib.contenttypes.generic import GenericForeignKey
-from django.contrib.contenttypes.models import ContentType
-from django.contrib.sites.models import Site
-from django.core import urlresolvers
from django.db import models
-from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible
+from django.utils.translation import ugettext_lazy as _
-from django_comments.managers import CommentManager
-
-COMMENT_MAX_LENGTH = getattr(settings, 'COMMENT_MAX_LENGTH', 3000)
-
-
-class BaseCommentAbstractModel(models.Model):
- """
- An abstract base class that any custom comment models probably should
- subclass.
- """
-
- # Content-object field
- content_type = models.ForeignKey(ContentType,
- verbose_name=_('content type'),
- related_name="content_type_set_for_%(class)s")
- object_pk = models.TextField(_('object ID'))
- content_object = GenericForeignKey(ct_field="content_type", fk_field="object_pk")
-
- # Metadata about the comment
- site = models.ForeignKey(Site)
-
- class Meta:
- abstract = True
-
- 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_pk)
- )
-
-
-@python_2_unicode_compatible
-class Comment(BaseCommentAbstractModel):
- """
- A user comment about some object.
- """
-
- # Who posted this comment? If ``user`` is set then it was an authenticated
- # user; otherwise at least user_name should have been set and the comment
- # was posted by a non-authenticated user.
- user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'),
- blank=True, null=True, related_name="%(class)s_comments")
- user_name = models.CharField(_("user's name"), max_length=50, blank=True)
- user_email = models.EmailField(_("user's email address"), blank=True)
- user_url = models.URLField(_("user's URL"), blank=True)
-
- comment = models.TextField(_('comment'), max_length=COMMENT_MAX_LENGTH)
-
- # Metadata about the comment
- submit_date = models.DateTimeField(_('date/time submitted'), default=None)
- ip_address = models.GenericIPAddressField(_('IP address'), unpack_ipv4=True, blank=True, null=True)
- is_public = models.BooleanField(_('is public'), default=True,
- help_text=_('Uncheck this box to make the comment effectively ' \
- 'disappear from the site.'))
- is_removed = models.BooleanField(_('is removed'), default=False,
- help_text=_('Check this box if the comment is inappropriate. ' \
- 'A "This comment has been removed" message will ' \
- 'be displayed instead.'))
+from .abstracts import (
+ COMMENT_MAX_LENGTH, BaseCommentAbstractModel, CommentAbstractModel,
+)
- # Manager
- objects = CommentManager()
- class Meta:
+class Comment(CommentAbstractModel):
+ class Meta(CommentAbstractModel.Meta):
db_table = "django_comments"
- ordering = ('submit_date',)
- permissions = [("can_moderate", "Can moderate comments")]
- verbose_name = _('comment')
- verbose_name_plural = _('comments')
-
- def __str__(self):
- return "%s: %s..." % (self.name, self.comment[:50])
-
- def save(self, *args, **kwargs):
- if self.submit_date is None:
- self.submit_date = timezone.now()
- super(Comment, self).save(*args, **kwargs)
-
- def _get_userinfo(self):
- """
- Get a dictionary that pulls together information about the poster
- safely for both authenticated and non-authenticated comments.
-
- This dict will have ``name``, ``email``, and ``url`` fields.
- """
- if not hasattr(self, "_userinfo"):
- userinfo = {
- "name": self.user_name,
- "email": self.user_email,
- "url": self.user_url
- }
- if self.user_id:
- u = self.user
- if u.email:
- userinfo["email"] = u.email
-
- # If the user has a full name, use that for the user name.
- # However, a given user_name overrides the raw user.username,
- # so only use that if this comment has no associated name.
- if u.get_full_name():
- userinfo["name"] = self.user.get_full_name()
- elif not self.user_name:
- userinfo["name"] = u.get_username()
- self._userinfo = userinfo
- return self._userinfo
- userinfo = property(_get_userinfo, doc=_get_userinfo.__doc__)
-
- def _get_name(self):
- return self.userinfo["name"]
-
- def _set_name(self, val):
- if self.user_id:
- raise AttributeError(_("This comment was posted by an authenticated "\
- "user and thus the name is read-only."))
- self.user_name = val
- name = property(_get_name, _set_name, doc="The name of the user who posted this comment")
-
- def _get_email(self):
- return self.userinfo["email"]
-
- def _set_email(self, val):
- if self.user_id:
- raise AttributeError(_("This comment was posted by an authenticated "\
- "user and thus the email is read-only."))
- self.user_email = val
- email = property(_get_email, _set_email, doc="The email of the user who posted this comment")
-
- def _get_url(self):
- return self.userinfo["url"]
-
- def _set_url(self, val):
- self.user_url = val
- url = property(_get_url, _set_url, doc="The URL given by the user who posted this comment")
-
- def get_absolute_url(self, anchor_pattern="#c%(id)s"):
- return self.get_content_object_url() + (anchor_pattern % self.__dict__)
-
- def get_as_text(self):
- """
- Return this comment as plain text. Useful for emails.
- """
- d = {
- 'user': self.user or self.name,
- 'date': self.submit_date,
- 'comment': self.comment,
- 'domain': self.site.domain,
- 'url': self.get_absolute_url()
- }
- return _('Posted by %(user)s at %(date)s\n\n%(comment)s\n\nhttp://%(domain)s%(url)s') % d
@python_2_unicode_compatible
@@ -178,8 +28,15 @@ class CommentFlag(models.Model):
design users are only allowed to flag a comment with a given flag once;
if you want rating look elsewhere.
"""
- user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'), related_name="comment_flags")
- comment = models.ForeignKey(Comment, verbose_name=_('comment'), related_name="flags")
+ user = models.ForeignKey(
+ settings.AUTH_USER_MODEL, verbose_name=_('user'), related_name="comment_flags",
+ on_delete=models.CASCADE,
+ )
+ comment = models.ForeignKey(
+ # Translators: 'comment' is a noun here.
+ Comment, verbose_name=_('comment'), related_name="flags", on_delete=models.CASCADE,
+ )
+ # Translators: 'flag' is a noun here.
flag = models.CharField(_('flag'), max_length=30, db_index=True)
flag_date = models.DateTimeField(_('date'), default=None)
@@ -195,8 +52,9 @@ class CommentFlag(models.Model):
verbose_name_plural = _('comment flags')
def __str__(self):
- return "%s flag of comment ID %s by %s" % \
- (self.flag, self.comment_id, self.user.get_username())
+ return "%s flag of comment ID %s by %s" % (
+ self.flag, self.comment_id, self.user.get_username()
+ )
def save(self, *args, **kwargs):
if self.flag_date is None: