lib.itmens/journal/models/mixins.py

50 lines
1.6 KiB
Python

class UserOwnedObjectMixin:
"""
UserOwnedObjectMixin
Models must add these:
owner = models.ForeignKey(User, on_delete=models.PROTECT)
visibility = models.PositiveSmallIntegerField(default=0)
"""
def is_visible_to(self, viewer):
owner = self.owner
if owner == viewer:
return True
if not owner.is_active:
return False
if not viewer.is_authenticated:
return self.visibility == 0
if self.visibility == 2:
return False
if viewer.is_blocking(owner) or owner.is_blocking(viewer):
return False
if self.visibility == 1:
return viewer.is_following(owner)
else:
return True
def is_editable_by(self, viewer):
return viewer.is_authenticated and (
viewer.is_staff or viewer.is_superuser or viewer == self.owner
)
@classmethod
def get_available(cls, entity, request_user, following_only=False):
# e.g. SongMark.get_available(song, request.user)
query_kwargs = {entity.__class__.__name__.lower(): entity}
all_entities = cls.objects.filter(**query_kwargs).order_by(
"-created_time"
) # get all marks for song
visible_entities = list(
filter(
lambda _entity: _entity.is_visible_to(request_user)
and (
_entity.owner.mastodon_acct in request_user.mastodon_following
if following_only
else True
),
all_entities,
)
)
return visible_entities