Coverage for src/cstlcore/constellations/models.py: 85%

26 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2026-02-19 12:46 +0000

1import uuid 

2from datetime import datetime 

3from typing import TYPE_CHECKING 

4 

5from sqlmodel import TIMESTAMP, Column, Field, Relationship, SQLModel, text 

6 

7if TYPE_CHECKING: 

8 from cstlcore.assets.models import Asset 

9 from cstlcore.collections.models import Collection 

10 from cstlcore.glossary.models import GlossaryTerm 

11 from cstlcore.memberships.models import ConstellationMembership 

12 

13 

14class ConstellationBase(SQLModel): 

15 name: str = Field(index=True, nullable=False) 

16 description: str | None = Field(default=None, nullable=True) 

17 

18 

19class Constellation(ConstellationBase, table=True): 

20 id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True) 

21 created_at: datetime | None = Field( 

22 default=None, 

23 sa_column=Column( 

24 TIMESTAMP(timezone=True), 

25 nullable=False, 

26 server_default=text("CURRENT_TIMESTAMP"), 

27 ), 

28 ) 

29 

30 memberships: list["ConstellationMembership"] = Relationship( 

31 back_populates="constellation", cascade_delete=True 

32 ) 

33 collections: list["Collection"] = Relationship( 

34 back_populates="constellation", cascade_delete=True 

35 ) 

36 assets: list["Asset"] = Relationship( 

37 back_populates="constellation", cascade_delete=True 

38 ) 

39 glossary_terms: list["GlossaryTerm"] = Relationship( 

40 back_populates="constellation", cascade_delete=True 

41 ) 

42 

43 

44class ConstellationPublic(ConstellationBase): 

45 id: uuid.UUID 

46 

47 

48class ConstellationCreate(ConstellationBase): 

49 pass 

50 

51 

52class ConstellationUpdate(SQLModel): 

53 name: str | None = None 

54 description: str | None = None