moviewyrm/bookwyrm/models/favorite.py

59 lines
2.1 KiB
Python
Raw Normal View History

''' like/fav/star a status '''
2021-02-10 22:31:39 +00:00
from django.apps import apps
from django.db import models
from django.utils import timezone
from bookwyrm import activitypub
2021-02-04 22:36:57 +00:00
from .activitypub_mixin import ActivityMixin
from .base_model import BookWyrmModel
from . import fields
2021-03-07 21:13:16 +00:00
from .status import Status
2021-02-04 22:36:57 +00:00
class Favorite(ActivityMixin, BookWyrmModel):
''' fav'ing a post '''
user = fields.ForeignKey(
'User', on_delete=models.PROTECT, activitypub_field='actor')
status = fields.ForeignKey(
'Status', on_delete=models.PROTECT, activitypub_field='object')
activity_serializer = activitypub.Like
2021-03-07 17:42:31 +00:00
@classmethod
def ignore_activity(cls, activity):
''' don't bother with incoming favs of unknown statuses '''
2021-03-07 21:13:16 +00:00
return not Status.objects.filter(remote_id=activity.object).exists()
2021-03-07 17:42:31 +00:00
def save(self, *args, **kwargs):
''' update user active time '''
self.user.last_active_date = timezone.now()
self.user.save(broadcast=False)
super().save(*args, **kwargs)
2021-02-10 22:31:39 +00:00
if self.status.user.local and self.status.user != self.user:
notification_model = apps.get_model(
'bookwyrm.Notification', require_ready=True)
notification_model.objects.create(
user=self.status.user,
notification_type='FAVORITE',
related_user=self.user,
related_status=self.status
)
def delete(self, *args, **kwargs):
''' delete and delete notifications '''
# check for notification
if self.status.user.local:
notification_model = apps.get_model(
'bookwyrm.Notification', require_ready=True)
notification = notification_model.objects.filter(
user=self.status.user, related_user=self.user,
related_status=self.status, notification_type='FAVORITE'
).first()
if notification:
notification.delete()
super().delete(*args, **kwargs)
class Meta:
''' can't fav things twice '''
unique_together = ('user', 'status')