healthdatalayer 1.6.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- healthdatalayer/__init__.py +0 -0
- healthdatalayer/config/__init__.py +0 -0
- healthdatalayer/config/config.py +24 -0
- healthdatalayer/config/db.py +12 -0
- healthdatalayer/config/vault.py +20 -0
- healthdatalayer/dtos/__init__.py +2 -0
- healthdatalayer/dtos/collaborator/__init__.py +0 -0
- healthdatalayer/dtos/collaborator/schedule_collaborator.py +13 -0
- healthdatalayer/dtos/medical_visit/__init__.py +0 -0
- healthdatalayer/dtos/medical_visit/medical_certificate.py +62 -0
- healthdatalayer/models/__init__.py +75 -0
- healthdatalayer/models/bridge_area_floor_branch/__init__.py +0 -0
- healthdatalayer/models/bridge_area_floor_branch/area.py +8 -0
- healthdatalayer/models/bridge_area_floor_branch/branch.py +16 -0
- healthdatalayer/models/bridge_area_floor_branch/bridge_area_floor_branch.py +27 -0
- healthdatalayer/models/bridge_area_floor_branch/floor.py +8 -0
- healthdatalayer/models/bridge_area_floor_branch/room.py +8 -0
- healthdatalayer/models/bridge_area_floor_branch/system.py +8 -0
- healthdatalayer/models/client/__init__.py +0 -0
- healthdatalayer/models/client/address.py +13 -0
- healthdatalayer/models/client/city.py +11 -0
- healthdatalayer/models/client/client.py +25 -0
- healthdatalayer/models/client/client_type.py +9 -0
- healthdatalayer/models/client/education.py +9 -0
- healthdatalayer/models/client/emergency_contact.py +17 -0
- healthdatalayer/models/client/gender.py +9 -0
- healthdatalayer/models/client/marriage_status.py +9 -0
- healthdatalayer/models/client/nationality.py +10 -0
- healthdatalayer/models/client/pathological_history.py +29 -0
- healthdatalayer/models/client/pet.py +16 -0
- healthdatalayer/models/client/profession.py +9 -0
- healthdatalayer/models/client/px.py +35 -0
- healthdatalayer/models/client/state.py +9 -0
- healthdatalayer/models/collaborator/__init__.py +0 -0
- healthdatalayer/models/collaborator/collaborator.py +33 -0
- healthdatalayer/models/collaborator/collaborator_speciality.py +8 -0
- healthdatalayer/models/collaborator/collaborator_type.py +9 -0
- healthdatalayer/models/collaborator/speciality.py +23 -0
- healthdatalayer/models/lab/__init__.py +0 -0
- healthdatalayer/models/lab/client_lab.py +13 -0
- healthdatalayer/models/lab/measure_lab.py +11 -0
- healthdatalayer/models/lab/medical_lab.py +17 -0
- healthdatalayer/models/medical_visit/__init__.py +0 -0
- healthdatalayer/models/medical_visit/medical_diagnosis.py +12 -0
- healthdatalayer/models/medical_visit/medical_diagnosis_visit.py +25 -0
- healthdatalayer/models/medical_visit/medical_drug.py +27 -0
- healthdatalayer/models/medical_visit/medical_drug_recipe.py +19 -0
- healthdatalayer/models/medical_visit/medical_recipe_visit.py +28 -0
- healthdatalayer/models/medical_visit/medical_visit.py +53 -0
- healthdatalayer/models/medical_visit/organ_system_review.py +28 -0
- healthdatalayer/models/medical_visit/physical_exam.py +45 -0
- healthdatalayer/models/medical_visit/status_visit_enum.py +8 -0
- healthdatalayer/models/medical_visit/visit_triage.py +28 -0
- healthdatalayer/models/user/__init__.py +0 -0
- healthdatalayer/models/user/permission.py +27 -0
- healthdatalayer/models/user/permission_user.py +8 -0
- healthdatalayer/models/user/role.py +27 -0
- healthdatalayer/models/user/role_permission.py +8 -0
- healthdatalayer/models/user/role_user.py +8 -0
- healthdatalayer/models/user/user.py +30 -0
- healthdatalayer/repositories/__init__.py +40 -0
- healthdatalayer/repositories/client_repositories/__init__.py +0 -0
- healthdatalayer/repositories/client_repositories/address_repository.py +94 -0
- healthdatalayer/repositories/client_repositories/client_type_repository.py +69 -0
- healthdatalayer/repositories/client_repositories/education_repository.py +70 -0
- healthdatalayer/repositories/client_repositories/emergency_contact_repository.py +78 -0
- healthdatalayer/repositories/client_repositories/gender_repository.py +70 -0
- healthdatalayer/repositories/client_repositories/marriage_status_repository.py +70 -0
- healthdatalayer/repositories/client_repositories/nationality_repository.py +69 -0
- healthdatalayer/repositories/client_repositories/pathological_history_repository.py +73 -0
- healthdatalayer/repositories/client_repositories/pet_repository.py +126 -0
- healthdatalayer/repositories/client_repositories/profession_repository.py +70 -0
- healthdatalayer/repositories/client_repositories/px_repository.py +239 -0
- healthdatalayer/repositories/collaborator_repositories/__init__.py +0 -0
- healthdatalayer/repositories/collaborator_repositories/collaborator_repository.py +197 -0
- healthdatalayer/repositories/collaborator_repositories/collaborator_type_repository.py +69 -0
- healthdatalayer/repositories/collaborator_repositories/speciality_repository.py +75 -0
- healthdatalayer/repositories/infraestructure_repositories/__init__.py +0 -0
- healthdatalayer/repositories/infraestructure_repositories/area_repository.py +69 -0
- healthdatalayer/repositories/infraestructure_repositories/branch_repository.py +69 -0
- healthdatalayer/repositories/infraestructure_repositories/bridge_repository.py +82 -0
- healthdatalayer/repositories/infraestructure_repositories/floor_repository.py +69 -0
- healthdatalayer/repositories/infraestructure_repositories/room_repository.py +69 -0
- healthdatalayer/repositories/infraestructure_repositories/system_repository.py +69 -0
- healthdatalayer/repositories/lab_repositories/__init__.py +0 -0
- healthdatalayer/repositories/lab_repositories/measure_lab_repository.py +80 -0
- healthdatalayer/repositories/lab_repositories/medical_lab_repository.py +254 -0
- healthdatalayer/repositories/medical_visit_repositories/__init__.py +0 -0
- healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_repository.py +98 -0
- healthdatalayer/repositories/medical_visit_repositories/medical_diagnosis_visit_repository.py +109 -0
- healthdatalayer/repositories/medical_visit_repositories/medical_drug_recipe_repository.py +71 -0
- healthdatalayer/repositories/medical_visit_repositories/medical_drug_repository.py +78 -0
- healthdatalayer/repositories/medical_visit_repositories/medical_recipe_visit_repository.py +93 -0
- healthdatalayer/repositories/medical_visit_repositories/medical_visit_repository.py +509 -0
- healthdatalayer/repositories/medical_visit_repositories/organ_system_review_repository.py +89 -0
- healthdatalayer/repositories/medical_visit_repositories/physical_exam_repository.py +89 -0
- healthdatalayer/repositories/medical_visit_repositories/visit_triage_repository.py +95 -0
- healthdatalayer/repositories/user_repositories/__init__.py +0 -0
- healthdatalayer/repositories/user_repositories/permission_repository.py +238 -0
- healthdatalayer/repositories/user_repositories/role_repository.py +174 -0
- healthdatalayer/repositories/user_repositories/user_repository.py +251 -0
- healthdatalayer-1.6.6.dist-info/METADATA +30 -0
- healthdatalayer-1.6.6.dist-info/RECORD +105 -0
- healthdatalayer-1.6.6.dist-info/WHEEL +5 -0
- healthdatalayer-1.6.6.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from typing import Optional,List,TYPE_CHECKING
|
|
3
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
4
|
+
from .measure_lab import MeasureLab
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from .client_lab import ClientLab
|
|
7
|
+
|
|
8
|
+
class MedicalLab(SQLModel, table=True):
|
|
9
|
+
__tablename__ = "medical_lab"
|
|
10
|
+
|
|
11
|
+
medical_lab_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
|
12
|
+
parameter: str
|
|
13
|
+
measure_lab_id: Optional[uuid.UUID] = Field(default=None, foreign_key="measure_lab.measure_lab_id")
|
|
14
|
+
is_active: bool = Field(default=True)
|
|
15
|
+
|
|
16
|
+
MedicalLab.measure_lab = Relationship(back_populates="medical_labs")
|
|
17
|
+
MedicalLab.pxs = Relationship(back_populates="medical_labs", link_model="ClientLab")
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from sqlmodel import SQLModel, Field
|
|
3
|
+
|
|
4
|
+
class MedicalDiagnosis(SQLModel, table=True):
|
|
5
|
+
__tablename__ = "medical_diagnosis"
|
|
6
|
+
|
|
7
|
+
medical_diagnosis_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
8
|
+
|
|
9
|
+
name:str
|
|
10
|
+
cie_10_code: str = Field(index=True, max_length=10)
|
|
11
|
+
|
|
12
|
+
is_active: bool = Field(default=True)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Optional, TYPE_CHECKING
|
|
4
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
5
|
+
from healthdatalayer.models import MedicalDiagnosis
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from healthdatalayer.models import MedicalVisit
|
|
9
|
+
|
|
10
|
+
class MedicalDiagnosisVisit(SQLModel, table=True):
|
|
11
|
+
__tablename__ = "medical_diagnosis_visit"
|
|
12
|
+
|
|
13
|
+
medical_diagnosis_visit_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
|
14
|
+
diagnosis_date: Optional[datetime] = Field(default=None)
|
|
15
|
+
comments: str
|
|
16
|
+
|
|
17
|
+
medical_diagnosis_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_diagnosis.medical_diagnosis_id")
|
|
18
|
+
medical_diagnosis: Optional[MedicalDiagnosis] = Relationship()
|
|
19
|
+
|
|
20
|
+
medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
|
|
21
|
+
medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="medical_diagnosis_visits")
|
|
22
|
+
|
|
23
|
+
type_diagnosis: str
|
|
24
|
+
|
|
25
|
+
is_active: bool = Field(default=True)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Optional, List, TYPE_CHECKING
|
|
4
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
5
|
+
|
|
6
|
+
from healthdatalayer.models.medical_visit.medical_drug_recipe import MedicalDrugRecipe
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from healthdatalayer.models.medical_visit.medical_recipe_visit import MedicalRecipeVisit
|
|
10
|
+
|
|
11
|
+
class MedicalDrug(SQLModel, table=True):
|
|
12
|
+
__tablename__ = "medical_drug"
|
|
13
|
+
|
|
14
|
+
medical_drug_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
15
|
+
|
|
16
|
+
drug_name:str
|
|
17
|
+
stock:int
|
|
18
|
+
drug_code:str
|
|
19
|
+
supply_date: Optional[datetime] = Field(default=None)
|
|
20
|
+
public_price:float
|
|
21
|
+
|
|
22
|
+
is_active: bool = Field(default=True)
|
|
23
|
+
|
|
24
|
+
medical_recipe_visits: List["MedicalRecipeVisit"] = Relationship(
|
|
25
|
+
back_populates="medical_drugs",
|
|
26
|
+
link_model=MedicalDrugRecipe
|
|
27
|
+
)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Optional
|
|
4
|
+
from sqlmodel import SQLModel, Field
|
|
5
|
+
|
|
6
|
+
class MedicalDrugRecipe(SQLModel, table=True):
|
|
7
|
+
__tablename__ = "medical_drug_recipe"
|
|
8
|
+
|
|
9
|
+
medical_drug_recipe_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
10
|
+
|
|
11
|
+
medical_drug_id: uuid.UUID = Field(foreign_key="medical_drug.medical_drug_id", primary_key=True)
|
|
12
|
+
medical_recipe_visit_id: uuid.UUID = Field(foreign_key="medical_recipe_visit.medical_recipe_visit_id", primary_key=True)
|
|
13
|
+
|
|
14
|
+
quantity:int
|
|
15
|
+
suplied:bool
|
|
16
|
+
comment:Optional[str] = Field(default=None)
|
|
17
|
+
suplied_date: Optional[datetime] = Field(default=None)
|
|
18
|
+
|
|
19
|
+
is_active: bool = Field(default=True)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Optional, List, TYPE_CHECKING
|
|
4
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
from healthdatalayer.models import MedicalDrugRecipe
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from healthdatalayer.models.medical_visit.medical_drug import MedicalDrug
|
|
11
|
+
from healthdatalayer.models import MedicalVisit
|
|
12
|
+
|
|
13
|
+
class MedicalRecipeVisit(SQLModel, table=True):
|
|
14
|
+
__tablename__ = "medical_recipe_visit"
|
|
15
|
+
|
|
16
|
+
medical_recipe_visit_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
|
17
|
+
completed_supplied: bool
|
|
18
|
+
completed_supplied_date: Optional[datetime] = Field(default=None)
|
|
19
|
+
|
|
20
|
+
medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
|
|
21
|
+
medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="medical_recipe_visits")
|
|
22
|
+
|
|
23
|
+
is_active: bool = Field(default=True)
|
|
24
|
+
|
|
25
|
+
medical_drugs: List["MedicalDrug"] = Relationship(
|
|
26
|
+
back_populates="medical_recipe_visits",
|
|
27
|
+
link_model=MedicalDrugRecipe
|
|
28
|
+
)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from datetime import datetime
|
|
3
|
+
from typing import Optional, List, TYPE_CHECKING
|
|
4
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
5
|
+
from sqlalchemy import Column, Enum as SqlEnum
|
|
6
|
+
|
|
7
|
+
from healthdatalayer.models import Collaborator
|
|
8
|
+
from healthdatalayer.models.medical_visit.status_visit_enum import StatusVisitEnum
|
|
9
|
+
from healthdatalayer.models import Speciality
|
|
10
|
+
from healthdatalayer.models import BridgeAreaFloorBranch
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from healthdatalayer.models import Px
|
|
13
|
+
from healthdatalayer.models import MedicalDiagnosisVisit
|
|
14
|
+
from healthdatalayer.models import MedicalRecipeVisit
|
|
15
|
+
from healthdatalayer.models import OrganSystemReview
|
|
16
|
+
from healthdatalayer.models import PhysicalExam
|
|
17
|
+
class MedicalVisit(SQLModel, table=True):
|
|
18
|
+
__tablename__ = "medical_visit"
|
|
19
|
+
|
|
20
|
+
medical_visit_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
21
|
+
visit_date: Optional[datetime] = Field(default=None)
|
|
22
|
+
|
|
23
|
+
collaborator_id:Optional[uuid.UUID]=Field(default=None,foreign_key="collaborator.collaborator_id")
|
|
24
|
+
collaborator: Optional[Collaborator] = Relationship()
|
|
25
|
+
|
|
26
|
+
client_id:Optional[uuid.UUID]=Field(default=None,foreign_key="px.client_id")
|
|
27
|
+
client: Optional["Px"] = Relationship()
|
|
28
|
+
|
|
29
|
+
speciality_id:Optional[uuid.UUID]=Field(default=None,foreign_key="speciality.speciality_id")
|
|
30
|
+
speciality: Optional[Speciality] = Relationship()
|
|
31
|
+
|
|
32
|
+
status_visit: StatusVisitEnum = Field(sa_column=Column(SqlEnum(StatusVisitEnum, native_enum=False), nullable=False))
|
|
33
|
+
|
|
34
|
+
next_followup_visit_id:Optional[uuid.UUID]=Field(default=None,foreign_key="medical_visit.medical_visit_id")
|
|
35
|
+
|
|
36
|
+
overall_diagnosis:Optional[str]=Field(default=None)
|
|
37
|
+
|
|
38
|
+
bridge_area_floor_branch_id:Optional[uuid.UUID]=Field(default=None,foreign_key="bridge_area_floor_branch.bridge_area_floor_branch_id")
|
|
39
|
+
bridge_area_floor_branch: Optional[BridgeAreaFloorBranch] = Relationship()
|
|
40
|
+
|
|
41
|
+
reason_visit:Optional[str]=Field(default=None)
|
|
42
|
+
current_illness: Optional[str]=Field(default=None)
|
|
43
|
+
rest: Optional[bool] = Field(default=None)
|
|
44
|
+
rest_hours: Optional[int] = Field(default=None)
|
|
45
|
+
rest_date_start: Optional[datetime] = Field(default=None)
|
|
46
|
+
rest_date_end: Optional[datetime] = Field(default=None)
|
|
47
|
+
|
|
48
|
+
is_active: bool = Field(default=True)
|
|
49
|
+
|
|
50
|
+
medical_diagnosis_visits: List["MedicalDiagnosisVisit"] = Relationship(back_populates="medical_visit")
|
|
51
|
+
medical_recipe_visits: List["MedicalRecipeVisit"] = Relationship(back_populates="medical_visit")
|
|
52
|
+
organ_system_reviews: List["OrganSystemReview"] = Relationship(back_populates="medical_visit")
|
|
53
|
+
physical_exams: List["PhysicalExam"] = Relationship(back_populates="medical_visit")
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from typing import Optional,TYPE_CHECKING
|
|
3
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
4
|
+
if TYPE_CHECKING:
|
|
5
|
+
from healthdatalayer.models import MedicalVisit
|
|
6
|
+
|
|
7
|
+
class OrganSystemReview(SQLModel, table=True):
|
|
8
|
+
__tablename__ = "organ_system_review"
|
|
9
|
+
|
|
10
|
+
organ_system_review_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
11
|
+
|
|
12
|
+
medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
|
|
13
|
+
medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="organ_system_reviews")
|
|
14
|
+
|
|
15
|
+
comment:str
|
|
16
|
+
|
|
17
|
+
skin_attachment: Optional[bool] = Field(default=None)
|
|
18
|
+
sense_organs: Optional[bool] = Field(default=None)
|
|
19
|
+
breathing: Optional[bool] = Field(default=None)
|
|
20
|
+
cardiovascular: Optional[bool] = Field(default=None)
|
|
21
|
+
digestive: Optional[bool] = Field(default=None)
|
|
22
|
+
genitourinary: Optional[bool] = Field(default=None)
|
|
23
|
+
skeletal_muscle: Optional[bool] = Field(default=None)
|
|
24
|
+
endocrine: Optional[bool] = Field(default=None)
|
|
25
|
+
heme_lifatic: Optional[bool] = Field(default=None)
|
|
26
|
+
nervous: Optional[bool] = Field(default=None)
|
|
27
|
+
|
|
28
|
+
is_active: bool = Field(default=True)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from typing import Optional,TYPE_CHECKING
|
|
3
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from healthdatalayer.models import MedicalVisit
|
|
7
|
+
|
|
8
|
+
class PhysicalExam(SQLModel, table=True):
|
|
9
|
+
__tablename__ = "physical_exam"
|
|
10
|
+
|
|
11
|
+
physical_exam_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
12
|
+
|
|
13
|
+
medical_visit_id: Optional[uuid.UUID] = Field(default=None, foreign_key="medical_visit.medical_visit_id")
|
|
14
|
+
medical_visit: Optional["MedicalVisit"] = Relationship(back_populates="physical_exams")
|
|
15
|
+
|
|
16
|
+
comments: Optional[str] = Field(default=None)
|
|
17
|
+
|
|
18
|
+
r1: Optional[bool] = Field(default=None)
|
|
19
|
+
r2: Optional[bool] = Field(default=None)
|
|
20
|
+
r3: Optional[bool] = Field(default=None)
|
|
21
|
+
r4: Optional[bool] = Field(default=None)
|
|
22
|
+
r5: Optional[bool] = Field(default=None)
|
|
23
|
+
r6: Optional[bool] = Field(default=None)
|
|
24
|
+
r7: Optional[bool] = Field(default=None)
|
|
25
|
+
r8: Optional[bool] = Field(default=None)
|
|
26
|
+
r9: Optional[bool] = Field(default=None)
|
|
27
|
+
r10: Optional[bool] = Field(default=None)
|
|
28
|
+
r11: Optional[bool] = Field(default=None)
|
|
29
|
+
r12: Optional[bool] = Field(default=None)
|
|
30
|
+
r13: Optional[bool] = Field(default=None)
|
|
31
|
+
r14: Optional[bool] = Field(default=None)
|
|
32
|
+
r15: Optional[bool] = Field(default=None)
|
|
33
|
+
|
|
34
|
+
s1: Optional[bool] = Field(default=None)
|
|
35
|
+
s2: Optional[bool] = Field(default=None)
|
|
36
|
+
s3: Optional[bool] = Field(default=None)
|
|
37
|
+
s4: Optional[bool] = Field(default=None)
|
|
38
|
+
s5: Optional[bool] = Field(default=None)
|
|
39
|
+
s6: Optional[bool] = Field(default=None)
|
|
40
|
+
s7: Optional[bool] = Field(default=None)
|
|
41
|
+
s8: Optional[bool] = Field(default=None)
|
|
42
|
+
s9: Optional[bool] = Field(default=None)
|
|
43
|
+
s10: Optional[bool] = Field(default=None)
|
|
44
|
+
|
|
45
|
+
is_active: bool = Field(default=True)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from typing import Optional,TYPE_CHECKING
|
|
3
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
4
|
+
from decimal import Decimal
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from healthdatalayer.models.medical_visit.medical_visit import MedicalVisit
|
|
8
|
+
|
|
9
|
+
class VisitTriage(SQLModel, table=True):
|
|
10
|
+
__tablename__ = "visit_triage"
|
|
11
|
+
|
|
12
|
+
visit_triage_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
13
|
+
|
|
14
|
+
weight:Optional[Decimal]=Field(default=None)
|
|
15
|
+
height:Optional[Decimal]=Field(default=None)
|
|
16
|
+
heart_rate:Optional[int]=Field(default=None)
|
|
17
|
+
blood_pressure:Optional[str]=Field(default=None)
|
|
18
|
+
temperature:Optional[Decimal]=Field(default=None)
|
|
19
|
+
|
|
20
|
+
imc:Optional[Decimal]=Field(default=None)
|
|
21
|
+
abdominal_perimeter:Optional[Decimal]=Field(default=None)
|
|
22
|
+
capillary_hemoglobin:Optional[Decimal]=Field(default=None)
|
|
23
|
+
pulse_oximetry:Optional[Decimal]=Field(default=None)
|
|
24
|
+
|
|
25
|
+
medical_visit_id:Optional[uuid.UUID]=Field(default=None,foreign_key="medical_visit.medical_visit_id")
|
|
26
|
+
medical_visit: Optional["MedicalVisit"] = Relationship()
|
|
27
|
+
|
|
28
|
+
is_active: bool = Field(default=True)
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
3
|
+
from typing import List, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from healthdatalayer.models.user.role_permission import RolePermission
|
|
6
|
+
from healthdatalayer.models.user.permission_user import PermissionUser
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from healthdatalayer.models.user.user import User
|
|
10
|
+
from healthdatalayer.models.user.role import Role
|
|
11
|
+
|
|
12
|
+
class Permission(SQLModel, table=True):
|
|
13
|
+
__tablename__ = "permission"
|
|
14
|
+
|
|
15
|
+
permission_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
|
16
|
+
name: str
|
|
17
|
+
is_active: bool
|
|
18
|
+
|
|
19
|
+
roles: List["Role"] = Relationship(
|
|
20
|
+
back_populates="permissions",
|
|
21
|
+
link_model=RolePermission
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
users: List["User"] = Relationship(
|
|
25
|
+
back_populates="permissions",
|
|
26
|
+
link_model=PermissionUser
|
|
27
|
+
)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from sqlmodel import SQLModel,Field
|
|
3
|
+
|
|
4
|
+
class PermissionUser(SQLModel,table=True):
|
|
5
|
+
__tablename__ = "permission_user"
|
|
6
|
+
|
|
7
|
+
permission_id: uuid.UUID = Field(foreign_key="permission.permission_id", primary_key=True)
|
|
8
|
+
user_id: uuid.UUID = Field(foreign_key="user.user_id", primary_key=True)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from sqlmodel import SQLModel, Field, Relationship
|
|
3
|
+
from typing import List, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from healthdatalayer.models.user.role_user import RoleUser
|
|
6
|
+
from healthdatalayer.models.user.role_permission import RolePermission
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from healthdatalayer.models.user.user import User
|
|
10
|
+
from healthdatalayer.models.user.permission import Permission
|
|
11
|
+
|
|
12
|
+
class Role(SQLModel, table=True):
|
|
13
|
+
__tablename__ = "role"
|
|
14
|
+
|
|
15
|
+
role_id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
|
16
|
+
name: str
|
|
17
|
+
is_active: bool
|
|
18
|
+
|
|
19
|
+
users: List["User"] = Relationship(
|
|
20
|
+
back_populates="roles",
|
|
21
|
+
link_model=RoleUser
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
permissions: List["Permission"] = Relationship(
|
|
25
|
+
back_populates="roles",
|
|
26
|
+
link_model=RolePermission
|
|
27
|
+
)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from sqlmodel import SQLModel,Field
|
|
3
|
+
|
|
4
|
+
class RolePermission(SQLModel,table=True):
|
|
5
|
+
__tablename__ = "role_permission"
|
|
6
|
+
|
|
7
|
+
role_id: uuid.UUID = Field(foreign_key="role.role_id", primary_key=True)
|
|
8
|
+
permission_id: uuid.UUID = Field(foreign_key="permission.permission_id", primary_key=True)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from sqlmodel import SQLModel,Field
|
|
3
|
+
|
|
4
|
+
class RoleUser(SQLModel,table=True):
|
|
5
|
+
__tablename__ = "role_user"
|
|
6
|
+
|
|
7
|
+
role_id: uuid.UUID = Field(foreign_key="role.role_id", primary_key=True)
|
|
8
|
+
user_id: uuid.UUID = Field(foreign_key="user.user_id", primary_key=True)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import uuid
|
|
2
|
+
from sqlmodel import SQLModel,Field, Relationship
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import Optional, List, TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from healthdatalayer.models.user.role_user import RoleUser
|
|
7
|
+
from healthdatalayer.models.user.permission_user import PermissionUser
|
|
8
|
+
|
|
9
|
+
from healthdatalayer.models.user.role import Role
|
|
10
|
+
from healthdatalayer.models.user.permission import Permission
|
|
11
|
+
|
|
12
|
+
class User(SQLModel,table=True):
|
|
13
|
+
__tablename__ = "user"
|
|
14
|
+
|
|
15
|
+
user_id:uuid.UUID=Field(default_factory=uuid.uuid4,primary_key=True)
|
|
16
|
+
username: str = Field(index=True, nullable=False, unique=True)
|
|
17
|
+
password: str = Field(nullable=False)
|
|
18
|
+
last_access: Optional[datetime] = Field(default=None)
|
|
19
|
+
email: Optional[str] = None
|
|
20
|
+
is_active: bool
|
|
21
|
+
|
|
22
|
+
roles: List["Role"] = Relationship(
|
|
23
|
+
back_populates="users",
|
|
24
|
+
link_model=RoleUser
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
permissions: List["Permission"] = Relationship(
|
|
28
|
+
back_populates="users",
|
|
29
|
+
link_model=PermissionUser
|
|
30
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from .client_repositories.address_repository import AddressRepository
|
|
2
|
+
from .client_repositories.client_type_repository import ClientTypeRepository
|
|
3
|
+
from .client_repositories.education_repository import EducationRepository
|
|
4
|
+
from .client_repositories.gender_repository import GenderRepository
|
|
5
|
+
from .client_repositories.marriage_status_repository import MarriageStatusRepository
|
|
6
|
+
from .client_repositories.pet_repository import PetRepository
|
|
7
|
+
from .client_repositories.profession_repository import ProfessionRepository
|
|
8
|
+
from .client_repositories.px_repository import PxRepository
|
|
9
|
+
from .client_repositories.emergency_contact_repository import EmergencyContactRepository
|
|
10
|
+
from .client_repositories.nationality_repository import NationalityRepository
|
|
11
|
+
from .client_repositories.pathological_history_repository import PathologicalHistoryRepository
|
|
12
|
+
|
|
13
|
+
from .collaborator_repositories.collaborator_repository import CollaboratorRepository
|
|
14
|
+
from .collaborator_repositories.collaborator_type_repository import CollaboratorTypeRepository
|
|
15
|
+
from .collaborator_repositories.speciality_repository import SpecialityRepository
|
|
16
|
+
|
|
17
|
+
from .infraestructure_repositories.area_repository import AreaRepository
|
|
18
|
+
from .infraestructure_repositories.branch_repository import BranchRepository
|
|
19
|
+
from .infraestructure_repositories.bridge_repository import BridgeAreaFloorBranchRepository
|
|
20
|
+
from .infraestructure_repositories.floor_repository import FloorRepository
|
|
21
|
+
from .infraestructure_repositories.room_repository import RoomRepository
|
|
22
|
+
from .infraestructure_repositories.system_repository import SystemRepository
|
|
23
|
+
|
|
24
|
+
from .lab_repositories.measure_lab_repository import MeasureLabRepository
|
|
25
|
+
from .lab_repositories.medical_lab_repository import MedicalLabRepository
|
|
26
|
+
|
|
27
|
+
from .medical_visit_repositories.medical_diagnosis_repository import MedicalDiagnosisRepository
|
|
28
|
+
from .medical_visit_repositories.medical_diagnosis_visit_repository import MedicalDiagnosisVisitRepository
|
|
29
|
+
from .medical_visit_repositories.medical_drug_recipe_repository import MedicalDrugRecipeRepository
|
|
30
|
+
from .medical_visit_repositories.medical_drug_repository import MedicalDrugRepository
|
|
31
|
+
from .medical_visit_repositories.medical_recipe_visit_repository import MedicalRecipeVisitRepository
|
|
32
|
+
from .medical_visit_repositories.medical_visit_repository import MedicalVisitRepository
|
|
33
|
+
from .medical_visit_repositories.organ_system_review_repository import OrganSystemReviewRepository
|
|
34
|
+
from .medical_visit_repositories.physical_exam_repository import PhysicalExamRepository
|
|
35
|
+
from .medical_visit_repositories.visit_triage_repository import VisitTriageRepository
|
|
36
|
+
|
|
37
|
+
from .user_repositories.permission_repository import PermissionRepository
|
|
38
|
+
from .user_repositories.role_repository import RoleRepository
|
|
39
|
+
from .user_repositories.user_repository import UserRepository
|
|
40
|
+
|
|
File without changes
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
from uuid import UUID
|
|
3
|
+
from sqlmodel import select
|
|
4
|
+
|
|
5
|
+
from healthdatalayer.models import Address, City, State
|
|
6
|
+
from healthdatalayer.config.db import engines, get_session
|
|
7
|
+
|
|
8
|
+
class AddressRepository:
|
|
9
|
+
|
|
10
|
+
def __init__(self, tenant: str):
|
|
11
|
+
self.tenant = tenant
|
|
12
|
+
if tenant not in engines:
|
|
13
|
+
raise ValueError(f"Tenant {tenant} is not configured")
|
|
14
|
+
|
|
15
|
+
def create_command(self, address: Address) -> Address:
|
|
16
|
+
with get_session(self.tenant) as session:
|
|
17
|
+
session.add(address)
|
|
18
|
+
session.commit()
|
|
19
|
+
session.refresh(address)
|
|
20
|
+
return address
|
|
21
|
+
|
|
22
|
+
def get_by_id_command(self, address_id: UUID) -> Optional[Address]:
|
|
23
|
+
with get_session(self.tenant) as session:
|
|
24
|
+
return session.get(Address, address_id)
|
|
25
|
+
|
|
26
|
+
def list_all_command(self, active_only: bool = True) -> List[Address]:
|
|
27
|
+
with get_session(self.tenant) as session:
|
|
28
|
+
statement = select(Address)
|
|
29
|
+
|
|
30
|
+
if active_only:
|
|
31
|
+
statement = statement.where(Address.is_active == True)
|
|
32
|
+
|
|
33
|
+
results = session.exec(statement)
|
|
34
|
+
return results.all()
|
|
35
|
+
|
|
36
|
+
def update_command(self, address_id: UUID, **kwargs) -> Optional[Address]:
|
|
37
|
+
with get_session(self.tenant) as session:
|
|
38
|
+
db_address = session.get(Address, address_id)
|
|
39
|
+
if not db_address:
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
for key, value in kwargs.items():
|
|
43
|
+
if hasattr(db_address, key):
|
|
44
|
+
setattr(db_address, key, value)
|
|
45
|
+
|
|
46
|
+
session.add(db_address)
|
|
47
|
+
session.commit()
|
|
48
|
+
session.refresh(db_address)
|
|
49
|
+
return db_address
|
|
50
|
+
|
|
51
|
+
def delete_command(self, address_id: UUID, soft_delete: bool = True) -> bool:
|
|
52
|
+
with get_session(self.tenant) as session:
|
|
53
|
+
db_address = session.get(Address, address_id)
|
|
54
|
+
if not db_address:
|
|
55
|
+
return False
|
|
56
|
+
|
|
57
|
+
if soft_delete:
|
|
58
|
+
db_address.is_active = False
|
|
59
|
+
session.add(db_address)
|
|
60
|
+
else:
|
|
61
|
+
session.delete(db_address)
|
|
62
|
+
|
|
63
|
+
session.commit()
|
|
64
|
+
return True
|
|
65
|
+
|
|
66
|
+
def list_all_state_command(self, active_only: bool = True) -> List[Address]:
|
|
67
|
+
with get_session(self.tenant) as session:
|
|
68
|
+
statement = select(State)
|
|
69
|
+
|
|
70
|
+
if active_only:
|
|
71
|
+
statement = statement.where(State.is_active == True)
|
|
72
|
+
|
|
73
|
+
results = session.exec(statement)
|
|
74
|
+
return results.all()
|
|
75
|
+
|
|
76
|
+
def list_all_city_command(self, active_only: bool = True) -> List[Address]:
|
|
77
|
+
with get_session(self.tenant) as session:
|
|
78
|
+
statement = select(City)
|
|
79
|
+
|
|
80
|
+
if active_only:
|
|
81
|
+
statement = statement.where(City.is_active == True)
|
|
82
|
+
|
|
83
|
+
results = session.exec(statement)
|
|
84
|
+
return results.all()
|
|
85
|
+
|
|
86
|
+
def list_city_by_state_id_command(self,state_id: UUID, active_only: bool = True) -> List[Address]:
|
|
87
|
+
with get_session(self.tenant) as session:
|
|
88
|
+
statement = select(City).where(City.state_id == state_id)
|
|
89
|
+
|
|
90
|
+
if active_only:
|
|
91
|
+
statement = statement.where(State.is_active == True)
|
|
92
|
+
|
|
93
|
+
results = session.exec(statement)
|
|
94
|
+
return results.all()
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from typing import Optional, List
|
|
2
|
+
from uuid import UUID
|
|
3
|
+
from sqlmodel import select
|
|
4
|
+
|
|
5
|
+
from healthdatalayer.models import ClientType
|
|
6
|
+
from healthdatalayer.config.db import engines, get_session
|
|
7
|
+
|
|
8
|
+
class ClientTypeRepository:
|
|
9
|
+
def __init__(self, tenant: str):
|
|
10
|
+
self.tenant = tenant
|
|
11
|
+
if tenant not in engines:
|
|
12
|
+
raise ValueError(f"Tenant {tenant} is not configured")
|
|
13
|
+
|
|
14
|
+
def create_command(self, client_type: ClientType) -> ClientType:
|
|
15
|
+
with get_session(self.tenant) as session:
|
|
16
|
+
session.add(client_type)
|
|
17
|
+
session.commit()
|
|
18
|
+
session.refresh(client_type)
|
|
19
|
+
return client_type
|
|
20
|
+
|
|
21
|
+
def get_by_id_command(self, client_type_id: UUID) -> Optional[ClientType]:
|
|
22
|
+
with get_session(self.tenant) as session:
|
|
23
|
+
return session.get(ClientType, client_type_id)
|
|
24
|
+
|
|
25
|
+
def get_by_name_command(self, name: str) -> Optional[ClientType]:
|
|
26
|
+
with get_session(self.tenant) as session:
|
|
27
|
+
statement = select(ClientType).where(ClientType.name == name)
|
|
28
|
+
result = session.exec(statement).first()
|
|
29
|
+
return result
|
|
30
|
+
|
|
31
|
+
def list_all_command(self, active_only: bool = True) -> List[ClientType]:
|
|
32
|
+
with get_session(self.tenant) as session:
|
|
33
|
+
statement = select(ClientType)
|
|
34
|
+
|
|
35
|
+
if active_only:
|
|
36
|
+
statement = statement.where(ClientType.is_active == True)
|
|
37
|
+
|
|
38
|
+
results = session.exec(statement)
|
|
39
|
+
return results.all()
|
|
40
|
+
|
|
41
|
+
def update_command(self, client_type_id: UUID, **kwargs) -> Optional[ClientType]:
|
|
42
|
+
with get_session(self.tenant) as session:
|
|
43
|
+
db_client_type = session.get(ClientType, client_type_id)
|
|
44
|
+
if not db_client_type:
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
for key, value in kwargs.items():
|
|
48
|
+
if hasattr(db_client_type, key):
|
|
49
|
+
setattr(db_client_type, key, value)
|
|
50
|
+
|
|
51
|
+
session.add(db_client_type)
|
|
52
|
+
session.commit()
|
|
53
|
+
session.refresh(db_client_type)
|
|
54
|
+
return db_client_type
|
|
55
|
+
|
|
56
|
+
def delete_command(self, client_type_id: UUID, soft_delete: bool = True) -> bool:
|
|
57
|
+
with get_session(self.tenant) as session:
|
|
58
|
+
db_client_type = session.get(ClientType, client_type_id)
|
|
59
|
+
if not db_client_type:
|
|
60
|
+
return False
|
|
61
|
+
|
|
62
|
+
if soft_delete:
|
|
63
|
+
db_client_type.is_active = False
|
|
64
|
+
session.add(db_client_type)
|
|
65
|
+
else:
|
|
66
|
+
session.delete(db_client_type)
|
|
67
|
+
|
|
68
|
+
session.commit()
|
|
69
|
+
return True
|