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

1import enum 

2import functools 

3import uuid 

4 

5from sqlmodel import Field, Relationship, SQLModel 

6 

7from cstlcore.constellations.models import Constellation, ConstellationPublic 

8from cstlcore.users.models import User, UserPublic 

9 

10 

11@functools.total_ordering 

12class AccessEnum(enum.Enum): 

13 READ = "READ" 

14 COMMENT = "COMMENT" 

15 WRITE = "WRITE" 

16 ADMIN = "ADMIN" 

17 OWNER = "OWNER" 

18 

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] 

30 

31 def __eq__(self, other): 

32 if not isinstance(other, AccessEnum): 

33 return NotImplemented 

34 return self.value == other.value 

35 

36 def __hash__(self): 

37 return hash(self.value) 

38 

39 

40class ConstellationMembershipBase(SQLModel): 

41 access: AccessEnum = Field() 

42 

43 

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 ) 

54 

55 constellation: Constellation = Relationship(back_populates="memberships") 

56 user: User = Relationship(back_populates="memberships") 

57 

58 

59class ConstellationMembershipPublic(ConstellationMembershipBase): 

60 constellation: ConstellationPublic 

61 user: UserPublic 

62 

63 

64class ConstellationMembershipCreate(ConstellationMembershipBase): 

65 constellation_id: uuid.UUID 

66 user_id: uuid.UUID | None = None 

67 user_email: str | None = None 

68 

69 

70class ConstellationMembershipUpdate(SQLModel): 

71 access: AccessEnum | None = None 

72 

73 

74class MemberPublic(SQLModel): 

75 user: UserPublic 

76 access: AccessEnum