lib.itmens/timeline/models.py
2022-05-30 18:30:06 -04:00

63 lines
2.7 KiB
Python

from django.db import models
from common.models import UserOwnedEntity
from books.models import BookMark, BookReview
from movies.models import MovieMark, MovieReview
from games.models import GameMark, GameReview
from music.models import AlbumMark, AlbumReview, SongMark, SongReview
from collection.models import Collection, CollectionMark
from django.db.models.signals import post_save, post_delete
class Activity(UserOwnedEntity):
bookmark = models.ForeignKey(BookMark, models.CASCADE, null=True)
bookreview = models.ForeignKey(BookReview, models.CASCADE, null=True)
moviemark = models.ForeignKey(MovieMark, models.CASCADE, null=True)
moviereview = models.ForeignKey(MovieReview, models.CASCADE, null=True)
gamemark = models.ForeignKey(GameMark, models.CASCADE, null=True)
gamereview = models.ForeignKey(GameReview, models.CASCADE, null=True)
albummark = models.ForeignKey(AlbumMark, models.CASCADE, null=True)
albumreview = models.ForeignKey(AlbumReview, models.CASCADE, null=True)
songmark = models.ForeignKey(SongMark, models.CASCADE, null=True)
songreview = models.ForeignKey(SongReview, models.CASCADE, null=True)
collection = models.ForeignKey(Collection, models.CASCADE, null=True)
collectionmark = models.ForeignKey(CollectionMark, models.CASCADE, null=True)
@property
def target(self):
items = [self.bookmark, self.bookreview, self.moviemark, self.moviereview, self.gamemark, self.gamereview,
self.songmark, self.songreview, self.albummark, self.albumreview, self.collection, self.collectionmark]
return next((x for x in items if x is not None), None)
@property
def mark(self):
items = [self.bookmark, self.moviemark, self.gamemark, self.songmark, self.albummark]
return next((x for x in items if x is not None), None)
@property
def review(self):
items = [self.bookreview, self.moviereview, self.gamereview, self.songreview, self.albumreview]
return next((x for x in items if x is not None), None)
@classmethod
def upsert_item(self, item):
attr = item.__class__.__name__.lower()
f = {'owner': item.owner, attr: item}
activity = Activity.objects.filter(**f).first()
if not activity:
activity = Activity.objects.create(**f)
activity.created_time = item.created_time
activity.visibility = item.visibility
activity.save()
def _post_save_handler(sender, instance, created, **kwargs):
Activity.upsert_item(instance)
# def activity_post_delete_handler(sender, instance, **kwargs):
# pass
def init_post_save_handler(model):
post_save.connect(_post_save_handler, sender=model)
# post_delete.connect(activity_post_delete_handler, sender=model) # delete handled by database