50 lines
1.6 KiB
Python
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
|