46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
from typing import TYPE_CHECKING
|
|
|
|
from users.models import APIdentity, User
|
|
|
|
if TYPE_CHECKING:
|
|
from .common import Piece
|
|
|
|
|
|
class UserOwnedObjectMixin:
|
|
"""
|
|
UserOwnedObjectMixin
|
|
|
|
Models must add these:
|
|
owner = models.ForeignKey(APIdentity, on_delete=models.PROTECT)
|
|
visibility = models.PositiveSmallIntegerField(default=0)
|
|
"""
|
|
|
|
owner: APIdentity
|
|
visibility: int
|
|
|
|
def is_visible_to(self: "Piece | Self", viewing_user: User) -> bool: # type: ignore
|
|
owner = self.owner
|
|
if not owner or not owner.is_active:
|
|
return False
|
|
if owner.user == viewing_user:
|
|
return True
|
|
if not viewing_user.is_authenticated:
|
|
return self.visibility == 0
|
|
viewer = viewing_user.identity # type: ignore[assignment]
|
|
if not viewer:
|
|
return False
|
|
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: "Piece", viewing_user: User): # type: ignore
|
|
return viewing_user.is_authenticated and (
|
|
viewing_user.is_staff
|
|
or viewing_user.is_superuser
|
|
or viewing_user == self.owner.user
|
|
)
|