You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.2 KiB
Python

from __future__ import unicode_literals
from django.utils.encoding import force_text
from django.utils.encoding import python_2_unicode_compatible
from django.utils.timezone import now as tznow
from django.conf import settings
from django.db import models
from nano.tools.models import GenericForeignKeyAbstractModel
from nano.tools.models import UnorderedTreeManager
from nano.tools.models import UnorderedTreeMixin
COMMENT_MAX_LENGTH = getattr(settings,'COMMENT_MAX_LENGTH',3000)
@python_2_unicode_compatible
class Comment(GenericForeignKeyAbstractModel, UnorderedTreeMixin):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
blank=True,
null=True,
related_name="%(class)s_comments",
)
comment = models.TextField(max_length=COMMENT_MAX_LENGTH)
comment_xhtml = models.TextField(editable=False)
added = models.DateTimeField(default=tznow)
is_visible = models.BooleanField(default=True)
is_scrambled = models.BooleanField(default=False)
objects = models.Manager()
tree = UnorderedTreeManager()
class Meta:
db_table = "nano_comments_comment"
ordering = ('added',)
get_latest_by = 'added'
def __str__(self):
return "%s: %s..." % (self.user, self.comment[:49]+'...' if len(self.comment) > 50 else self.comment)
def get_content_object_url(self):
return self.content_object.get_absolute_url() or ''
def get_absolute_url(self, anchor_pattern="#c%(id)s"):
content_url = self.get_content_object_url()
anchor = anchor_pattern % self.__dict__
if content_url:
return content_url + anchor
return anchor
def roots(self):
tree = self._default_manager.filter(part_of__isnull=True)
return tree.filter(content_type=self.content_type, object_pk=self.object_pk)
def get_path(self):
return [self._default_manager.get(id=p).filter(content_type=self.content_type, object_pk=self.object_pk)
for p in force_text(self.path).split(self._sep) if p]
def descendants(self):
tree = self._default_manager.filter(path__startswith=self.path).exclude(id=self.id)
return tree.filter(content_type=self.content_type, object_pk=self.object_pk)