Coverage for src/cstlcore/memberships/models.py: 98%
43 statements
« prev ^ index » next coverage.py v7.9.1, created at 2026-02-19 12:46 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2026-02-19 12:46 +0000
1import enum
2import functools
3import uuid
5from sqlmodel import Field, Relationship, SQLModel
7from cstlcore.constellations.models import Constellation, ConstellationPublic
8from cstlcore.users.models import User, UserPublic
11@functools.total_ordering
12class AccessEnum(enum.Enum):
13 READ = "READ"
14 COMMENT = "COMMENT"
15 WRITE = "WRITE"
16 ADMIN = "ADMIN"
17 OWNER = "OWNER"
19 def __lt__(self, other):
20 if not isinstance(other, AccessEnum):
21 return NotImplemented
22 access_order = {
23 "READ": 0,
24 "COMMENT": 1,
25 "WRITE": 2,
26 "ADMIN": 3,
27 "OWNER": 4,
28 }
29 return access_order[self.value] < access_order[other.value]
31 def __eq__(self, other):
32 if not isinstance(other, AccessEnum):
33 return NotImplemented
34 return self.value == other.value
36 def __hash__(self):
37 return hash(self.value)
40class ConstellationMembershipBase(SQLModel):
41 access: AccessEnum = Field()
44class ConstellationMembership(ConstellationMembershipBase, table=True):
45 constellation_id: uuid.UUID = Field(
46 default_factory=uuid.uuid4,
47 foreign_key="constellation.id",
48 primary_key=True,
49 ondelete="CASCADE",
50 )
51 user_id: uuid.UUID = Field(
52 default_factory=uuid.uuid4, foreign_key="user.id", primary_key=True
53 )
55 constellation: Constellation = Relationship(back_populates="memberships")
56 user: User = Relationship(back_populates="memberships")
59class ConstellationMembershipPublic(ConstellationMembershipBase):
60 constellation: ConstellationPublic
61 user: UserPublic
64class ConstellationMembershipCreate(ConstellationMembershipBase):
65 constellation_id: uuid.UUID
66 user_id: uuid.UUID | None = None
67 user_email: str | None = None
70class ConstellationMembershipUpdate(SQLModel):
71 access: AccessEnum | None = None
74class MemberPublic(SQLModel):
75 user: UserPublic
76 access: AccessEnum