diff options
Diffstat (limited to 'app/lib/django_comments/models.py')
-rw-r--r-- | app/lib/django_comments/models.py | 178 |
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: |