2021-09-22 18:29:59 +02:00
|
|
|
from typing import TYPE_CHECKING
|
|
|
|
|
|
|
|
from django.db import models
|
|
|
|
|
|
|
|
from posthog.models.utils import UUIDModel, sane_repr
|
|
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
from posthog.models.organization import OrganizationMembership
|
|
|
|
|
|
|
|
|
2022-02-02 17:16:35 +01:00
|
|
|
# We call models that grant a user access to some grouping of users a "membership"
|
2021-09-22 18:29:59 +02:00
|
|
|
class ExplicitTeamMembership(UUIDModel):
|
|
|
|
class Level(models.IntegerChoices):
|
|
|
|
"""Keep in sync with OrganizationMembership.Level (only difference being organizations having an Owner)."""
|
|
|
|
|
|
|
|
MEMBER = 1, "member"
|
|
|
|
ADMIN = 8, "administrator"
|
|
|
|
|
|
|
|
team: models.ForeignKey = models.ForeignKey(
|
|
|
|
"posthog.Team",
|
|
|
|
on_delete=models.CASCADE,
|
|
|
|
related_name="explicit_memberships",
|
|
|
|
related_query_name="explicit_membership",
|
|
|
|
)
|
|
|
|
parent_membership: models.ForeignKey = models.ForeignKey(
|
|
|
|
"posthog.OrganizationMembership",
|
|
|
|
on_delete=models.CASCADE,
|
|
|
|
related_name="explicit_team_memberships",
|
|
|
|
related_query_name="explicit_team_membership",
|
|
|
|
)
|
|
|
|
level: models.PositiveSmallIntegerField = models.PositiveSmallIntegerField(
|
|
|
|
default=Level.MEMBER, choices=Level.choices
|
|
|
|
)
|
|
|
|
joined_at: models.DateTimeField = models.DateTimeField(auto_now_add=True)
|
|
|
|
updated_at: models.DateTimeField = models.DateTimeField(auto_now=True)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
constraints = [
|
2022-09-05 14:38:54 +02:00
|
|
|
models.UniqueConstraint(fields=["team", "parent_membership"], name="unique_explicit_team_membership")
|
2021-09-22 18:29:59 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return str(self.Level(self.level))
|
|
|
|
|
|
|
|
@property
|
|
|
|
def effective_level(self) -> "OrganizationMembership.Level":
|
2022-09-05 14:38:54 +02:00
|
|
|
"""If organization level is higher than project level, then that takes precedence over explicit project level."""
|
2021-09-22 18:29:59 +02:00
|
|
|
return max(self.level, self.parent_membership.level)
|
|
|
|
|
|
|
|
__repr__ = sane_repr("team", "parent_membership", "level")
|