lib.itmens/journal/models/mixins.py

54 lines
1.5 KiB
Python
Raw Normal View History

2023-07-20 21:59:49 -04:00
from typing import TYPE_CHECKING
2023-08-11 01:43:19 -04:00
if TYPE_CHECKING:
2023-12-05 23:14:29 -05:00
from django.db.models import ForeignKey
2024-05-26 22:57:49 -04:00
from users.models import APIdentity, User
2023-08-11 01:43:19 -04:00
from .common import Piece
2022-12-13 18:12:43 +00:00
class UserOwnedObjectMixin:
"""
UserOwnedObjectMixin
Models must add these:
2023-07-20 21:59:49 -04:00
owner = models.ForeignKey(APIdentity, on_delete=models.PROTECT)
2022-12-13 18:12:43 +00:00
visibility = models.PositiveSmallIntegerField(default=0)
"""
2023-12-05 23:14:29 -05:00
if TYPE_CHECKING:
2024-05-27 15:44:12 -04:00
owner: ForeignKey[Piece, APIdentity]
# owner: ForeignKey[APIdentity, Piece]
owner_id: int
2023-12-05 23:14:29 -05:00
visibility: int
2023-07-20 21:59:49 -04:00
2024-05-26 22:57:49 -04:00
def is_visible_to(
self: "Piece", viewing_user: "User" # noqa # type: ignore
) -> bool:
2022-12-13 18:12:43 +00:00
owner = self.owner
2023-07-20 21:59:49 -04:00
if not owner or not owner.is_active:
2022-12-13 18:12:43 +00:00
return False
2023-07-20 21:59:49 -04:00
if owner.user == viewing_user:
return True
if not viewing_user.is_authenticated:
2023-05-23 07:53:38 -04:00
return self.visibility == 0
2023-12-05 23:14:29 -05:00
viewer = viewing_user.identity
2023-07-20 21:59:49 -04:00
if not viewer:
return False
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
2024-05-26 22:57:49 -04:00
def is_editable_by(self: "Piece", viewing_user: "User"): # type: ignore
2023-07-20 21:59:49 -04:00
return viewing_user.is_authenticated and (
viewing_user.is_staff
or viewing_user.is_superuser
or viewing_user == self.owner.user
2022-12-29 23:57:02 -05:00
)