lib.itmens/journal/models/mixins.py

57 lines
1.8 KiB
Python
Raw Normal View History

2023-08-11 01:43:19 -04:00
from typing import TYPE_CHECKING, Type
if TYPE_CHECKING:
from .common import Piece
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)
"""
2023-08-11 01:43:19 -04:00
def is_visible_to(self: "Piece", viewer): # type: ignore
2022-12-13 18:12:43 +00:00
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
2023-08-11 01:43:19 -04:00
def is_editable_by(self: "Piece", viewer): # type: ignore
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
2023-08-11 01:43:19 -04:00
def get_available(cls: "Type[Piece]", entity, request_user, following_only=False): # type: ignore
2022-12-13 18:12:43 +00:00
# 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