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
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 14:29 -0300
1"""Modelo SQLModel e enums do modulo tarefas."""
3from datetime import datetime, timezone
4from enum import Enum
6from sqlalchemy import CheckConstraint, Column, DateTime, String
7from sqlalchemy import Enum as SAEnum
9from src.database.base import Base
10from sqlmodel import Field
13class TipoTarefa(str, Enum):
14 """Classificacao da tarefa."""
16 PESSOAL = "pessoal"
17 EQUIPE = "equipe"
20class PrioridadeTarefa(str, Enum):
21 """Niveis de prioridade permitidos."""
23 BAIXA = "baixa"
24 MEDIA = "media"
25 ALTA = "alta"
26 CRITICA = "critica"
29class VisibilidadeTarefa(str, Enum):
30 """Visibilidade da tarefa."""
32 PUBLICA = "publica"
33 PRIVADA = "privada"
36class EscopoPrivacidadeTarefa(str, Enum):
37 """Regras de acesso para tarefas privadas."""
39 CRIADOR = "criador"
40 GRUPO = "grupo"
43class Tarefa(Base, table=True):
44 """Tabela de tarefas da aplicacao."""
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 )
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 )