lib.itmens/journal/models/mixins.py

51 lines
1.6 KiB
Python
Raw Normal View History

2022-12-13 18:12:43 +00:00
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
2023-05-23 07:53:38 -04:00
if not viewer.is_authenticated:
return self.visibility == 0
2022-12-13 18:12:43 +00:00
if self.visibility == 2:
return False
2023-07-07 16:54:15 -04:00
if viewer.is_blocking(owner) or owner.is_blocking(viewer):
2022-12-13 18:12:43 +00:00
return False
if self.visibility == 1:
return viewer.is_following(owner)
else:
return True
def is_editable_by(self, viewer):
2022-12-29 23:57:02 -05:00
return viewer.is_authenticated and (
viewer.is_staff or viewer.is_superuser or viewer == self.owner
)
2022-12-13 18:12:43 +00:00
@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}
2022-12-29 23:57:02 -05:00
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
2022-12-29 23:57:02 -05:00
if following_only
else True
),
all_entities,
)
)
2022-12-13 18:12:43 +00:00
return visible_entities