healthdatalayer 1.0.1__py3-none-any.whl → 1.1.0__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.

Potentially problematic release.


This version of healthdatalayer might be problematic. Click here for more details.

Files changed (88) hide show
  1. {healthdatalayer-1.0.1.dist-info → healthdatalayer-1.1.0.dist-info}/METADATA +2 -2
  2. healthdatalayer-1.1.0.dist-info/RECORD +93 -0
  3. models/bridge_area_floor_branch/__init__.py +0 -0
  4. models/bridge_area_floor_branch/area.py +8 -0
  5. models/bridge_area_floor_branch/branch.py +16 -0
  6. models/bridge_area_floor_branch/bridge_area_floor_branch.py +27 -0
  7. models/bridge_area_floor_branch/floor.py +8 -0
  8. models/bridge_area_floor_branch/room.py +8 -0
  9. models/bridge_area_floor_branch/system.py +8 -0
  10. models/client/__init__.py +0 -0
  11. models/client/address.py +13 -0
  12. models/client/client.py +25 -0
  13. models/client/client_type.py +9 -0
  14. models/client/education.py +9 -0
  15. models/client/emergency_contact.py +17 -0
  16. models/client/gender.py +9 -0
  17. models/client/marriage_status.py +9 -0
  18. models/client/nationality.py +10 -0
  19. models/client/pathological_history.py +29 -0
  20. models/client/pet.py +16 -0
  21. models/client/profession.py +9 -0
  22. models/client/px.py +28 -0
  23. models/collaborator/__init__.py +0 -0
  24. models/collaborator/collaborator.py +33 -0
  25. models/collaborator/collaborator_speciality.py +8 -0
  26. models/collaborator/collaborator_type.py +9 -0
  27. models/collaborator/speciality.py +23 -0
  28. models/lab/__init__.py +0 -0
  29. models/lab/client_lab.py +13 -0
  30. models/lab/measure_lab.py +11 -0
  31. models/lab/medical_lab.py +17 -0
  32. models/medical_visit/__init__.py +0 -0
  33. models/medical_visit/medical_diagnosis.py +12 -0
  34. models/medical_visit/medical_diagnosis_visit.py +25 -0
  35. models/medical_visit/medical_drug.py +27 -0
  36. models/medical_visit/medical_drug_recipe.py +18 -0
  37. models/medical_visit/medical_recipe_visit.py +28 -0
  38. models/medical_visit/medical_visit.py +51 -0
  39. models/medical_visit/organ_system_review.py +28 -0
  40. models/medical_visit/physical_exam.py +45 -0
  41. models/medical_visit/visit_triage.py +28 -0
  42. models/user/__init__.py +0 -0
  43. models/user/permission.py +27 -0
  44. models/user/permission_user.py +8 -0
  45. models/user/role.py +27 -0
  46. models/user/role_permission.py +8 -0
  47. models/user/role_user.py +8 -0
  48. models/user/user.py +30 -0
  49. repositories/client_repositories/__init__.py +0 -0
  50. repositories/client_repositories/address_repository.py +64 -0
  51. repositories/client_repositories/client_type_repository.py +69 -0
  52. repositories/client_repositories/education_repository.py +70 -0
  53. repositories/client_repositories/gender_repository.py +70 -0
  54. repositories/client_repositories/marriage_status_repository.py +70 -0
  55. repositories/client_repositories/pet_repository.py +126 -0
  56. repositories/client_repositories/profession_repository.py +70 -0
  57. repositories/client_repositories/px_repository.py +210 -0
  58. repositories/collaborator_repositories/__init__.py +0 -0
  59. repositories/collaborator_repositories/collaborator_repository.py +150 -0
  60. repositories/collaborator_repositories/collaborator_type_repository.py +69 -0
  61. repositories/collaborator_repositories/speciality_repository.py +75 -0
  62. repositories/infraestructure_repositories/__init__.py +0 -0
  63. repositories/infraestructure_repositories/area_repository.py +69 -0
  64. repositories/infraestructure_repositories/branch_repository.py +69 -0
  65. repositories/infraestructure_repositories/bridge_repository.py +80 -0
  66. repositories/infraestructure_repositories/floor_repository.py +69 -0
  67. repositories/infraestructure_repositories/room_repository.py +69 -0
  68. repositories/infraestructure_repositories/system_repository.py +69 -0
  69. repositories/lab_repositories/__init__.py +0 -0
  70. repositories/lab_repositories/measure_lab_repository.py +80 -0
  71. repositories/lab_repositories/medical_lab_repository.py +254 -0
  72. repositories/medical_visit_repositories/__init__.py +0 -0
  73. repositories/medical_visit_repositories/medical_diagnosis_repository.py +63 -0
  74. repositories/medical_visit_repositories/medical_diagnosis_visit_repository.py +92 -0
  75. repositories/medical_visit_repositories/medical_drug_recipe_repository.py +70 -0
  76. repositories/medical_visit_repositories/medical_drug_repository.py +63 -0
  77. repositories/medical_visit_repositories/medical_recipe_visit_repository.py +93 -0
  78. repositories/medical_visit_repositories/medical_visit_repository.py +110 -0
  79. repositories/medical_visit_repositories/organ_system_review_repository.py +89 -0
  80. repositories/medical_visit_repositories/physical_exam_repository.py +89 -0
  81. repositories/medical_visit_repositories/visit_triage_repository.py +89 -0
  82. repositories/user_repositories/__init__.py +0 -0
  83. repositories/user_repositories/permission_repository.py +238 -0
  84. repositories/user_repositories/role_repository.py +174 -0
  85. repositories/user_repositories/user_repository.py +251 -0
  86. healthdatalayer-1.0.1.dist-info/RECORD +0 -10
  87. {healthdatalayer-1.0.1.dist-info → healthdatalayer-1.1.0.dist-info}/WHEEL +0 -0
  88. {healthdatalayer-1.0.1.dist-info → healthdatalayer-1.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,174 @@
1
+ from typing import Optional, List
2
+ from uuid import UUID
3
+ from sqlmodel import select
4
+ from sqlalchemy.orm import selectinload
5
+
6
+ from models import Role
7
+ from models import Permission
8
+ from models import User
9
+ from config.db import engines, get_session
10
+
11
+ class RoleRepository:
12
+ def __init__(self, tenant: str):
13
+ self.tenant = tenant
14
+ if tenant not in engines:
15
+ raise ValueError(f"Tenant {tenant} is not configured")
16
+
17
+ def create_command(self, role: Role) -> Role:
18
+ with get_session(self.tenant) as session:
19
+ session.add(role)
20
+ session.commit()
21
+ session.refresh(role)
22
+ return role
23
+
24
+ def get_by_id_command(self, role_id: UUID, load_relations: bool = False) -> Optional[Role]:
25
+ with get_session(self.tenant) as session:
26
+ if load_relations:
27
+ statement = select(Role).where(Role.role_id == role_id).options(
28
+ selectinload(Role.permissions),
29
+ selectinload(Role.users)
30
+ )
31
+ return session.exec(statement).first()
32
+ else:
33
+ return session.get(Role, role_id)
34
+
35
+ def get_by_name_command(self, name: str, load_relations: bool = False) -> Optional[Role]:
36
+ with get_session(self.tenant) as session:
37
+ statement = select(Role).where(Role.name == name)
38
+
39
+ if load_relations:
40
+ statement = statement.options(
41
+ selectinload(Role.permissions),
42
+ selectinload(Role.users)
43
+ )
44
+
45
+ return session.exec(statement).first()
46
+
47
+ def search_by_name_command(self, name: str, load_relations: bool = False) -> List[Role]:
48
+ with get_session(self.tenant) as session:
49
+ statement = select(Role).where(Role.name.ilike(f"%{name}%"))
50
+
51
+ if load_relations:
52
+ statement = statement.options(
53
+ selectinload(Role.permissions),
54
+ selectinload(Role.users)
55
+ )
56
+
57
+ results = session.exec(statement)
58
+ return results.all()
59
+
60
+ def list_all_command(self, active_only: bool = True, load_relations: bool = False) -> List[Role]:
61
+ with get_session(self.tenant) as session:
62
+ statement = select(Role)
63
+
64
+ if active_only:
65
+ statement = statement.where(Role.is_active == True)
66
+
67
+ if load_relations:
68
+ statement = statement.options(
69
+ selectinload(Role.permissions),
70
+ selectinload(Role.users)
71
+ )
72
+
73
+ results = session.exec(statement)
74
+ return results.all()
75
+
76
+ def update_command(self, role: Role) -> Role:
77
+ with get_session(self.tenant) as session:
78
+ db_role = session.merge(role)
79
+ session.commit()
80
+ session.refresh(db_role)
81
+ return db_role
82
+
83
+ def delete_command(self, role_id: UUID, soft_delete: bool = True) -> bool:
84
+ with get_session(self.tenant) as session:
85
+ db_role = session.get(Role, role_id)
86
+ if not db_role:
87
+ return False
88
+
89
+ if soft_delete:
90
+ db_role.is_active = False
91
+ session.add(db_role)
92
+ else:
93
+ session.delete(db_role)
94
+
95
+ session.commit()
96
+ return True
97
+
98
+ def count_command(self, active_only: bool = True) -> int:
99
+ with get_session(self.tenant) as session:
100
+ statement = select(Role)
101
+ if active_only:
102
+ statement = statement.where(Role.is_active == True)
103
+ results = session.exec(statement)
104
+ return len(results.all())
105
+
106
+ def exists_by_name_command(self, name: str) -> bool:
107
+ with get_session(self.tenant) as session:
108
+ statement = select(Role).where(Role.name == name)
109
+ result = session.exec(statement).first()
110
+ return result is not None
111
+
112
+ # RELATIONS COMMANDS
113
+
114
+ def get_role_permissions_command(self, role_id: UUID) -> List[Permission]:
115
+ with get_session(self.tenant) as session:
116
+ statement = select(Role).options(selectinload(Role.permissions)).where(Role.role_id == role_id)
117
+ role = session.exec(statement).first()
118
+ if not role:
119
+ return []
120
+ return role.permissions
121
+
122
+ def get_role_users_command(self, role_id: UUID) -> List[User]:
123
+ with get_session(self.tenant) as session:
124
+ statement = select(Role).options(selectinload(Role.users)).where(Role.role_id == role_id)
125
+ role = session.exec(statement).first()
126
+ if not role:
127
+ return []
128
+ return role.users
129
+
130
+ def assign_permission_command(self, role_id: UUID, permission_id: UUID) -> Optional[Role]:
131
+ with get_session(self.tenant) as session:
132
+ role_statement = select(Role).options(selectinload(Role.permissions)).where(Role.role_id == role_id)
133
+ role = session.exec(role_statement).first()
134
+ if not role:
135
+ return None
136
+
137
+ permission = session.get(Permission, permission_id)
138
+ if not permission:
139
+ return None
140
+
141
+ if permission not in role.permissions:
142
+ role.permissions.append(permission)
143
+ session.add(role)
144
+ session.commit()
145
+ session.refresh(role)
146
+
147
+ return role
148
+
149
+ def remove_permission_command(self, role_id: UUID, permission_id: UUID) -> Optional[Role]:
150
+ with get_session(self.tenant) as session:
151
+ role_statement = select(Role).options(selectinload(Role.permissions)).where(Role.role_id == role_id)
152
+ role = session.exec(role_statement).first()
153
+ if not role:
154
+ return None
155
+
156
+ permission = session.get(Permission, permission_id)
157
+ if not permission:
158
+ return None
159
+
160
+ if permission in role.permissions:
161
+ role.permissions.remove(permission)
162
+ session.add(role)
163
+ session.commit()
164
+ session.refresh(role)
165
+
166
+ return role
167
+
168
+ def has_permission_command(self, role_id: UUID, permission_name: str) -> bool:
169
+ with get_session(self.tenant) as session:
170
+ statement = select(Role).options(selectinload(Role.permissions)).where(Role.role_id == role_id)
171
+ role = session.exec(statement).first()
172
+ if not role:
173
+ return False
174
+ return any(perm.name == permission_name for perm in role.permissions)
@@ -0,0 +1,251 @@
1
+ from typing import Optional, List
2
+ from uuid import UUID
3
+ from sqlmodel import select
4
+ from sqlalchemy.orm import selectinload
5
+
6
+ from models import User
7
+ from models import Role
8
+ from models import Permission
9
+ from config.db import engines, get_session
10
+
11
+ class UserRepository:
12
+ def __init__(self, tenant: str):
13
+ self.tenant = tenant
14
+ if tenant not in engines:
15
+ raise ValueError(f"Tenant {tenant} is not configured")
16
+
17
+ def create_command(self, user: User) -> User:
18
+ with get_session(self.tenant) as session:
19
+ session.add(user)
20
+ session.commit()
21
+ session.refresh(user)
22
+ return user
23
+
24
+ def get_by_id_command(self, user_id: UUID, load_relations: bool = False) -> Optional[User]:
25
+ with get_session(self.tenant) as session:
26
+ if load_relations:
27
+ statement = select(User).where(User.user_id == user_id).options(
28
+ selectinload(User.roles),
29
+ selectinload(User.permissions)
30
+ )
31
+ return session.exec(statement).first()
32
+ else:
33
+ return session.get(User, user_id)
34
+
35
+ def get_by_username_command(self, username: str, load_relations: bool = False) -> Optional[User]:
36
+ with get_session(self.tenant) as session:
37
+ statement = select(User).where(User.username == username)
38
+
39
+ if load_relations:
40
+ statement = statement.options(
41
+ selectinload(User.roles),
42
+ selectinload(User.permissions)
43
+ )
44
+
45
+ return session.exec(statement).first()
46
+
47
+ def get_by_email_command(self, email: str, load_relations: bool = False) -> Optional[User]:
48
+ with get_session(self.tenant) as session:
49
+ statement = select(User).where(User.email == email)
50
+
51
+ if load_relations:
52
+ statement = statement.options(
53
+ selectinload(User.roles),
54
+ selectinload(User.permissions)
55
+ )
56
+
57
+ return session.exec(statement).first()
58
+
59
+ def search_by_username_command(self, username: str, load_relations: bool = False) -> List[User]:
60
+ with get_session(self.tenant) as session:
61
+ statement = select(User).where(User.username.ilike(f"%{username}%"))
62
+
63
+ if load_relations:
64
+ statement = statement.options(
65
+ selectinload(User.roles),
66
+ selectinload(User.permissions)
67
+ )
68
+
69
+ results = session.exec(statement)
70
+ return results.all()
71
+
72
+ def list_all_command(self, active_only: bool = True, load_relations: bool = False) -> List[User]:
73
+ with get_session(self.tenant) as session:
74
+ statement = select(User)
75
+
76
+ if active_only:
77
+ statement = statement.where(User.is_active == True)
78
+
79
+ if load_relations:
80
+ statement = statement.options(
81
+ selectinload(User.roles),
82
+ selectinload(User.permissions)
83
+ )
84
+
85
+ results = session.exec(statement)
86
+ return results.all()
87
+
88
+ def update_command(self, user: User) -> User:
89
+ with get_session(self.tenant) as session:
90
+ db_user = session.merge(user)
91
+ session.commit()
92
+ session.refresh(db_user)
93
+ return db_user
94
+
95
+ def delete_command(self, user_id: UUID, soft_delete: bool = True) -> bool:
96
+ with get_session(self.tenant) as session:
97
+ db_user = session.get(User, user_id)
98
+ if not db_user:
99
+ return False
100
+
101
+ if soft_delete:
102
+ db_user.is_active = False
103
+ session.add(db_user)
104
+ else:
105
+ session.delete(db_user)
106
+
107
+ session.commit()
108
+ return True
109
+
110
+ def count_command(self, active_only: bool = True) -> int:
111
+ with get_session(self.tenant) as session:
112
+ statement = select(User)
113
+ if active_only:
114
+ statement = statement.where(User.is_active == True)
115
+ results = session.exec(statement)
116
+ return len(results.all())
117
+
118
+ def exists_by_username_command(self, username: str) -> bool:
119
+ with get_session(self.tenant) as session:
120
+ statement = select(User).where(User.username == username)
121
+ result = session.exec(statement).first()
122
+ return result is not None
123
+
124
+ def exists_by_email_command(self, email: str) -> bool:
125
+ with get_session(self.tenant) as session:
126
+ statement = select(User).where(User.email == email)
127
+ result = session.exec(statement).first()
128
+ return result is not None
129
+
130
+ def change_password_command(self, user_id: UUID, new_password: str) -> Optional[User]:
131
+ with get_session(self.tenant) as session:
132
+ user = session.get(User, user_id)
133
+ if not user:
134
+ return None
135
+ user.password = new_password
136
+ session.add(user)
137
+ session.commit()
138
+ session.refresh(user)
139
+ return user
140
+
141
+ # ROLES COMANDS
142
+
143
+ def get_user_roles_command(self, user_id: UUID) -> List[Role]:
144
+ with get_session(self.tenant) as session:
145
+ statement = select(User).options(selectinload(User.roles)).where(User.user_id == user_id)
146
+ user = session.exec(statement).first()
147
+ if not user:
148
+ return []
149
+ return user.roles
150
+
151
+ def has_role_command(self, user_id: UUID, role_name: str) -> bool:
152
+ with get_session(self.tenant) as session:
153
+ statement = select(User).options(selectinload(User.roles)).where(User.user_id == user_id)
154
+ user = session.exec(statement).first()
155
+ if not user:
156
+ return False
157
+ return any(role.name == role_name for role in user.roles)
158
+
159
+ def assign_role_command(self, user_id: UUID, role_id: UUID) -> Optional[User]:
160
+ with get_session(self.tenant) as session:
161
+ user_statement = select(User).options(selectinload(User.roles)).where(User.user_id == user_id)
162
+ user = session.exec(user_statement).first()
163
+ if not user:
164
+ return None
165
+
166
+ role = session.get(Role, role_id)
167
+ if not role:
168
+ return None
169
+
170
+ if role not in user.roles:
171
+ user.roles.append(role)
172
+ session.add(user)
173
+ session.commit()
174
+ session.refresh(user)
175
+
176
+ return user
177
+
178
+ def remove_role_command(self, user_id: UUID, role_id: UUID) -> Optional[User]:
179
+ with get_session(self.tenant) as session:
180
+ user_statement = select(User).options(selectinload(User.roles)).where(User.user_id == user_id)
181
+ user = session.exec(user_statement).first()
182
+ if not user:
183
+ return None
184
+
185
+ role = session.get(Role, role_id)
186
+ if not role:
187
+ return None
188
+
189
+ if role in user.roles:
190
+ user.roles.remove(role)
191
+ session.add(user)
192
+ session.commit()
193
+ session.refresh(user)
194
+
195
+ return user
196
+
197
+ # PERMISSIONS COMANDS
198
+
199
+ def get_user_permissions_command(self, user_id: UUID) -> List[Permission]:
200
+ with get_session(self.tenant) as session:
201
+ statement = select(User).options(selectinload(User.permissions)).where(User.user_id == user_id)
202
+ user = session.exec(statement).first()
203
+ if not user:
204
+ return []
205
+ return user.permissions
206
+
207
+ def has_permission_command(self, user_id: UUID, permission_name: str) -> bool:
208
+ with get_session(self.tenant) as session:
209
+ statement = select(User).options(selectinload(User.permissions)).where(User.user_id == user_id)
210
+ user = session.exec(statement).first()
211
+ if not user:
212
+ return False
213
+ return any(perm.name == permission_name for perm in user.permissions)
214
+
215
+ def assign_permission_command(self, user_id: UUID, permission_id: UUID) -> Optional[User]:
216
+ with get_session(self.tenant) as session:
217
+ user_statement = select(User).options(selectinload(User.permissions)).where(User.user_id == user_id)
218
+ user = session.exec(user_statement).first()
219
+ if not user:
220
+ return None
221
+
222
+ permission = session.get(Permission, permission_id)
223
+ if not permission:
224
+ return None
225
+
226
+ if permission not in user.permissions:
227
+ user.permissions.append(permission)
228
+ session.add(user)
229
+ session.commit()
230
+ session.refresh(user)
231
+
232
+ return user
233
+
234
+ def remove_permission_command(self, user_id: UUID, permission_id: UUID) -> Optional[User]:
235
+ with get_session(self.tenant) as session:
236
+ user_statement = select(User).options(selectinload(User.permissions)).where(User.user_id == user_id)
237
+ user = session.exec(user_statement).first()
238
+ if not user:
239
+ return None
240
+
241
+ permission = session.get(Permission, permission_id)
242
+ if not permission:
243
+ return None
244
+
245
+ if permission in user.permissions:
246
+ user.permissions.remove(permission)
247
+ session.add(user)
248
+ session.commit()
249
+ session.refresh(user)
250
+
251
+ return user
@@ -1,10 +0,0 @@
1
- config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- config/config.py,sha256=vyqrlHDgCGpYX7V9fDn4g671lUU1RuWlSYCIazI-SqQ,689
3
- config/db.py,sha256=b_SWTINJSVUhR0uyD4h93jPLKUzRm6Ky0tmALWbjM18,342
4
- config/vault.py,sha256=9yUMXjaTYSnqr0npcQXDsg6Z7G3DityqpmHl1x42zS0,748
5
- models/__init__.py,sha256=aHts_4fmmSgAGlKe-qZ9aCXjeYPBVaB-VM4LqH-y4_4,1994
6
- repositories/__init__.py,sha256=b8ya7gJkFq0yzF3h8G0vIiakv_uOB9u859sdBLhEZHI,2504
7
- healthdatalayer-1.0.1.dist-info/METADATA,sha256=Y2pz-zYnb_EGOLcA3_QBb0Jo03RCKu_ZC9XyJZgci-c,827
8
- healthdatalayer-1.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
- healthdatalayer-1.0.1.dist-info/top_level.txt,sha256=S84RTy7EJk7BqzfUpsghy7n19iFi9FVqXgHKlv68GPI,27
10
- healthdatalayer-1.0.1.dist-info/RECORD,,