95 lines
2.8 KiB
Python
95 lines
2.8 KiB
Python
from datetime import datetime
|
|
from functools import cached_property
|
|
|
|
from django.db import models
|
|
from django.utils import timezone
|
|
|
|
from catalog.models import Item
|
|
from users.models import APIdentity
|
|
|
|
from .common import Content
|
|
from .rating import Rating
|
|
from .renderers import render_text
|
|
|
|
|
|
class Comment(Content):
|
|
text = models.TextField(blank=False, null=False)
|
|
|
|
@property
|
|
def ap_object(self):
|
|
return {
|
|
"id": self.absolute_url,
|
|
"type": "Comment",
|
|
"content": self.text,
|
|
"published": self.created_time.isoformat(),
|
|
"updated": self.edited_time.isoformat(),
|
|
"attributedTo": self.owner.actor_uri,
|
|
"relatedWith": self.item.absolute_url,
|
|
"url": self.absolute_url,
|
|
}
|
|
|
|
@classmethod
|
|
def update_by_ap_object(cls, owner, item, obj, post_id, visibility):
|
|
content = obj.get("content", "").strip() if obj else ""
|
|
if not content:
|
|
cls.objects.filter(owner=owner, item=item).delete()
|
|
return
|
|
d = {
|
|
"text": content,
|
|
"local": False,
|
|
"remote_id": obj["id"],
|
|
"post_id": post_id,
|
|
"visibility": visibility,
|
|
"created_time": datetime.fromisoformat(obj["published"]),
|
|
"edited_time": datetime.fromisoformat(obj["updated"]),
|
|
}
|
|
p, _ = cls.objects.update_or_create(owner=owner, item=item, defaults=d)
|
|
return p
|
|
|
|
@property
|
|
def html(self):
|
|
return render_text(self.text)
|
|
|
|
@cached_property
|
|
def rating_grade(self):
|
|
return Rating.get_item_rating(self.item, self.owner)
|
|
|
|
@cached_property
|
|
def mark(self):
|
|
from .mark import Mark
|
|
|
|
m = Mark(self.owner, self.item)
|
|
m.comment = self
|
|
return m
|
|
|
|
@property
|
|
def item_url(self):
|
|
if self.metadata.get("position"):
|
|
return self.item.get_absolute_url_with_position(self.metadata["position"])
|
|
else:
|
|
return self.item.url
|
|
|
|
@staticmethod
|
|
def comment_item(
|
|
item: Item, owner: APIdentity, text: str | None, visibility=0, created_time=None
|
|
):
|
|
comment = Comment.objects.filter(owner=owner, item=item).first()
|
|
if not text:
|
|
if comment is not None:
|
|
comment.delete()
|
|
comment = None
|
|
elif comment is None:
|
|
comment = Comment.objects.create(
|
|
owner=owner,
|
|
item=item,
|
|
text=text,
|
|
visibility=visibility,
|
|
created_time=created_time or timezone.now(),
|
|
)
|
|
elif comment.text != text or comment.visibility != visibility:
|
|
comment.text = text
|
|
comment.visibility = visibility
|
|
if created_time:
|
|
comment.created_time = created_time
|
|
comment.save()
|
|
return comment
|