Coverage for src / tarefas / models / tarefa_model.py: 100%

35 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-18 14:29 -0300

1"""Modelo SQLModel e enums do modulo tarefas.""" 

2 

3from datetime import datetime, timezone 

4from enum import Enum 

5 

6from sqlalchemy import CheckConstraint, Column, DateTime, String 

7from sqlalchemy import Enum as SAEnum 

8 

9from src.database.base import Base 

10from sqlmodel import Field 

11 

12 

13class TipoTarefa(str, Enum): 

14 """Classificacao da tarefa.""" 

15 

16 PESSOAL = "pessoal" 

17 EQUIPE = "equipe" 

18 

19 

20class PrioridadeTarefa(str, Enum): 

21 """Niveis de prioridade permitidos.""" 

22 

23 BAIXA = "baixa" 

24 MEDIA = "media" 

25 ALTA = "alta" 

26 CRITICA = "critica" 

27 

28 

29class VisibilidadeTarefa(str, Enum): 

30 """Visibilidade da tarefa.""" 

31 

32 PUBLICA = "publica" 

33 PRIVADA = "privada" 

34 

35 

36class EscopoPrivacidadeTarefa(str, Enum): 

37 """Regras de acesso para tarefas privadas.""" 

38 

39 CRIADOR = "criador" 

40 GRUPO = "grupo" 

41 

42 

43class Tarefa(Base, table=True): 

44 """Tabela de tarefas da aplicacao.""" 

45 

46 __tablename__ = "tarefas" 

47 __table_args__ = ( 

48 CheckConstraint( 

49 "(" 

50 "visibilidade = 'publica' AND " 

51 "escopo_privacidade IS NULL AND " 

52 "grupo_nome IS NULL" 

53 ") OR (" 

54 "visibilidade = 'privada' AND " 

55 "escopo_privacidade IS NOT NULL" 

56 ")", 

57 name="ck_tarefas_regras_visibilidade", 

58 ), 

59 CheckConstraint( 

60 "escopo_privacidade IS NULL OR " 

61 "escopo_privacidade = 'criador' OR " 

62 "(escopo_privacidade = 'grupo' AND grupo_nome IS NOT NULL)", 

63 name="ck_tarefas_grupo_privado", 

64 ), 

65 ) 

66 

67 id: int | None = Field(default=None, primary_key=True, index=True) 

68 titulo: str = Field( 

69 sa_column=Column(String(140), nullable=False), 

70 ) 

71 descricao: str | None = Field( 

72 default=None, 

73 sa_column=Column(String(500), nullable=True), 

74 ) 

75 concluida: bool = Field(default=False) 

76 tipo: TipoTarefa = Field( 

77 default=TipoTarefa.PESSOAL, 

78 sa_column=Column( 

79 SAEnum( 

80 TipoTarefa, 

81 native_enum=False, 

82 length=20, 

83 values_callable=lambda enum_cls: [ 

84 item.value for item in enum_cls 

85 ], 

86 ), 

87 nullable=False, 

88 default=TipoTarefa.PESSOAL.value, 

89 server_default=TipoTarefa.PESSOAL.value, 

90 ), 

91 ) 

92 prioridade: PrioridadeTarefa = Field( 

93 default=PrioridadeTarefa.MEDIA, 

94 sa_column=Column( 

95 SAEnum( 

96 PrioridadeTarefa, 

97 native_enum=False, 

98 length=20, 

99 values_callable=lambda enum_cls: [ 

100 item.value for item in enum_cls 

101 ], 

102 ), 

103 nullable=False, 

104 default=PrioridadeTarefa.MEDIA.value, 

105 server_default=PrioridadeTarefa.MEDIA.value, 

106 ), 

107 ) 

108 visibilidade: VisibilidadeTarefa = Field( 

109 default=VisibilidadeTarefa.PUBLICA, 

110 sa_column=Column( 

111 SAEnum( 

112 VisibilidadeTarefa, 

113 native_enum=False, 

114 length=20, 

115 values_callable=lambda enum_cls: [ 

116 item.value for item in enum_cls 

117 ], 

118 ), 

119 nullable=False, 

120 default=VisibilidadeTarefa.PUBLICA.value, 

121 server_default=VisibilidadeTarefa.PUBLICA.value, 

122 ), 

123 ) 

124 escopo_privacidade: EscopoPrivacidadeTarefa | None = Field( 

125 default=None, 

126 sa_column=Column( 

127 SAEnum( 

128 EscopoPrivacidadeTarefa, 

129 native_enum=False, 

130 length=20, 

131 values_callable=lambda enum_cls: [ 

132 item.value for item in enum_cls 

133 ], 

134 ), 

135 nullable=True, 

136 ), 

137 ) 

138 criador_id: str = Field( 

139 sa_column=Column(String(64), nullable=False), 

140 ) 

141 grupo_nome: str | None = Field( 

142 default=None, 

143 sa_column=Column(String(64), nullable=True), 

144 ) 

145 criado_em: datetime = Field( 

146 default_factory=lambda: datetime.now(timezone.utc), 

147 sa_column=Column(DateTime(timezone=True), nullable=False), 

148 ) 

149 atualizado_em: datetime = Field( 

150 default_factory=lambda: datetime.now(timezone.utc), 

151 sa_column=Column(DateTime(timezone=True), nullable=False), 

152 )