audex 1.0.7a3__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.
Files changed (192) hide show
  1. audex/__init__.py +9 -0
  2. audex/__main__.py +7 -0
  3. audex/cli/__init__.py +189 -0
  4. audex/cli/apis/__init__.py +12 -0
  5. audex/cli/apis/init/__init__.py +34 -0
  6. audex/cli/apis/init/gencfg.py +130 -0
  7. audex/cli/apis/init/setup.py +330 -0
  8. audex/cli/apis/init/vprgroup.py +125 -0
  9. audex/cli/apis/serve.py +141 -0
  10. audex/cli/args.py +356 -0
  11. audex/cli/exceptions.py +44 -0
  12. audex/cli/helper/__init__.py +0 -0
  13. audex/cli/helper/ansi.py +193 -0
  14. audex/cli/helper/display.py +288 -0
  15. audex/config/__init__.py +64 -0
  16. audex/config/core/__init__.py +30 -0
  17. audex/config/core/app.py +29 -0
  18. audex/config/core/audio.py +45 -0
  19. audex/config/core/logging.py +163 -0
  20. audex/config/core/session.py +11 -0
  21. audex/config/helper/__init__.py +1 -0
  22. audex/config/helper/client/__init__.py +1 -0
  23. audex/config/helper/client/http.py +28 -0
  24. audex/config/helper/client/websocket.py +21 -0
  25. audex/config/helper/provider/__init__.py +1 -0
  26. audex/config/helper/provider/dashscope.py +13 -0
  27. audex/config/helper/provider/unisound.py +18 -0
  28. audex/config/helper/provider/xfyun.py +23 -0
  29. audex/config/infrastructure/__init__.py +31 -0
  30. audex/config/infrastructure/cache.py +51 -0
  31. audex/config/infrastructure/database.py +48 -0
  32. audex/config/infrastructure/recorder.py +32 -0
  33. audex/config/infrastructure/store.py +19 -0
  34. audex/config/provider/__init__.py +18 -0
  35. audex/config/provider/transcription.py +109 -0
  36. audex/config/provider/vpr.py +99 -0
  37. audex/container.py +40 -0
  38. audex/entity/__init__.py +468 -0
  39. audex/entity/doctor.py +109 -0
  40. audex/entity/doctor.pyi +51 -0
  41. audex/entity/fields.py +401 -0
  42. audex/entity/segment.py +115 -0
  43. audex/entity/segment.pyi +38 -0
  44. audex/entity/session.py +133 -0
  45. audex/entity/session.pyi +47 -0
  46. audex/entity/utterance.py +142 -0
  47. audex/entity/utterance.pyi +48 -0
  48. audex/entity/vp.py +68 -0
  49. audex/entity/vp.pyi +35 -0
  50. audex/exceptions.py +157 -0
  51. audex/filters/__init__.py +692 -0
  52. audex/filters/generated/__init__.py +21 -0
  53. audex/filters/generated/doctor.py +987 -0
  54. audex/filters/generated/segment.py +723 -0
  55. audex/filters/generated/session.py +978 -0
  56. audex/filters/generated/utterance.py +939 -0
  57. audex/filters/generated/vp.py +815 -0
  58. audex/helper/__init__.py +1 -0
  59. audex/helper/hash.py +33 -0
  60. audex/helper/mixin.py +65 -0
  61. audex/helper/net.py +19 -0
  62. audex/helper/settings/__init__.py +830 -0
  63. audex/helper/settings/fields.py +317 -0
  64. audex/helper/stream.py +153 -0
  65. audex/injectors/__init__.py +1 -0
  66. audex/injectors/config.py +12 -0
  67. audex/injectors/lifespan.py +7 -0
  68. audex/lib/__init__.py +1 -0
  69. audex/lib/cache/__init__.py +383 -0
  70. audex/lib/cache/inmemory.py +513 -0
  71. audex/lib/database/__init__.py +83 -0
  72. audex/lib/database/sqlite.py +406 -0
  73. audex/lib/exporter.py +189 -0
  74. audex/lib/injectors/__init__.py +1 -0
  75. audex/lib/injectors/cache.py +25 -0
  76. audex/lib/injectors/container.py +47 -0
  77. audex/lib/injectors/exporter.py +26 -0
  78. audex/lib/injectors/recorder.py +33 -0
  79. audex/lib/injectors/server.py +17 -0
  80. audex/lib/injectors/session.py +18 -0
  81. audex/lib/injectors/sqlite.py +24 -0
  82. audex/lib/injectors/store.py +13 -0
  83. audex/lib/injectors/transcription.py +42 -0
  84. audex/lib/injectors/usb.py +12 -0
  85. audex/lib/injectors/vpr.py +65 -0
  86. audex/lib/injectors/wifi.py +7 -0
  87. audex/lib/recorder.py +844 -0
  88. audex/lib/repos/__init__.py +149 -0
  89. audex/lib/repos/container.py +23 -0
  90. audex/lib/repos/database/__init__.py +1 -0
  91. audex/lib/repos/database/sqlite.py +672 -0
  92. audex/lib/repos/decorators.py +74 -0
  93. audex/lib/repos/doctor.py +286 -0
  94. audex/lib/repos/segment.py +302 -0
  95. audex/lib/repos/session.py +285 -0
  96. audex/lib/repos/tables/__init__.py +70 -0
  97. audex/lib/repos/tables/doctor.py +137 -0
  98. audex/lib/repos/tables/segment.py +113 -0
  99. audex/lib/repos/tables/session.py +140 -0
  100. audex/lib/repos/tables/utterance.py +131 -0
  101. audex/lib/repos/tables/vp.py +102 -0
  102. audex/lib/repos/utterance.py +288 -0
  103. audex/lib/repos/vp.py +286 -0
  104. audex/lib/restful.py +251 -0
  105. audex/lib/server/__init__.py +97 -0
  106. audex/lib/server/auth.py +98 -0
  107. audex/lib/server/handlers.py +248 -0
  108. audex/lib/server/templates/index.html.j2 +226 -0
  109. audex/lib/server/templates/login.html.j2 +111 -0
  110. audex/lib/server/templates/static/script.js +68 -0
  111. audex/lib/server/templates/static/style.css +579 -0
  112. audex/lib/server/types.py +123 -0
  113. audex/lib/session.py +503 -0
  114. audex/lib/store/__init__.py +238 -0
  115. audex/lib/store/localfile.py +411 -0
  116. audex/lib/transcription/__init__.py +33 -0
  117. audex/lib/transcription/dashscope.py +525 -0
  118. audex/lib/transcription/events.py +62 -0
  119. audex/lib/usb.py +554 -0
  120. audex/lib/vpr/__init__.py +38 -0
  121. audex/lib/vpr/unisound/__init__.py +185 -0
  122. audex/lib/vpr/unisound/types.py +469 -0
  123. audex/lib/vpr/xfyun/__init__.py +483 -0
  124. audex/lib/vpr/xfyun/types.py +679 -0
  125. audex/lib/websocket/__init__.py +8 -0
  126. audex/lib/websocket/connection.py +485 -0
  127. audex/lib/websocket/pool.py +991 -0
  128. audex/lib/wifi.py +1146 -0
  129. audex/lifespan.py +75 -0
  130. audex/service/__init__.py +27 -0
  131. audex/service/decorators.py +73 -0
  132. audex/service/doctor/__init__.py +652 -0
  133. audex/service/doctor/const.py +36 -0
  134. audex/service/doctor/exceptions.py +96 -0
  135. audex/service/doctor/types.py +54 -0
  136. audex/service/export/__init__.py +236 -0
  137. audex/service/export/const.py +17 -0
  138. audex/service/export/exceptions.py +34 -0
  139. audex/service/export/types.py +21 -0
  140. audex/service/injectors/__init__.py +1 -0
  141. audex/service/injectors/container.py +53 -0
  142. audex/service/injectors/doctor.py +34 -0
  143. audex/service/injectors/export.py +27 -0
  144. audex/service/injectors/session.py +49 -0
  145. audex/service/session/__init__.py +754 -0
  146. audex/service/session/const.py +34 -0
  147. audex/service/session/exceptions.py +67 -0
  148. audex/service/session/types.py +91 -0
  149. audex/types.py +39 -0
  150. audex/utils.py +287 -0
  151. audex/valueobj/__init__.py +81 -0
  152. audex/valueobj/common/__init__.py +1 -0
  153. audex/valueobj/common/auth.py +84 -0
  154. audex/valueobj/common/email.py +16 -0
  155. audex/valueobj/common/ops.py +22 -0
  156. audex/valueobj/common/phone.py +84 -0
  157. audex/valueobj/common/version.py +72 -0
  158. audex/valueobj/session.py +19 -0
  159. audex/valueobj/utterance.py +15 -0
  160. audex/view/__init__.py +51 -0
  161. audex/view/container.py +17 -0
  162. audex/view/decorators.py +303 -0
  163. audex/view/pages/__init__.py +1 -0
  164. audex/view/pages/dashboard/__init__.py +286 -0
  165. audex/view/pages/dashboard/wifi.py +407 -0
  166. audex/view/pages/login.py +110 -0
  167. audex/view/pages/recording.py +348 -0
  168. audex/view/pages/register.py +202 -0
  169. audex/view/pages/sessions/__init__.py +196 -0
  170. audex/view/pages/sessions/details.py +224 -0
  171. audex/view/pages/sessions/export.py +443 -0
  172. audex/view/pages/settings.py +374 -0
  173. audex/view/pages/voiceprint/__init__.py +1 -0
  174. audex/view/pages/voiceprint/enroll.py +195 -0
  175. audex/view/pages/voiceprint/update.py +195 -0
  176. audex/view/static/css/dashboard.css +452 -0
  177. audex/view/static/css/glass.css +22 -0
  178. audex/view/static/css/global.css +541 -0
  179. audex/view/static/css/login.css +386 -0
  180. audex/view/static/css/recording.css +439 -0
  181. audex/view/static/css/register.css +293 -0
  182. audex/view/static/css/sessions/styles.css +501 -0
  183. audex/view/static/css/settings.css +186 -0
  184. audex/view/static/css/voiceprint/enroll.css +43 -0
  185. audex/view/static/css/voiceprint/styles.css +209 -0
  186. audex/view/static/css/voiceprint/update.css +44 -0
  187. audex/view/static/images/logo.svg +95 -0
  188. audex/view/static/js/recording.js +42 -0
  189. audex-1.0.7a3.dist-info/METADATA +361 -0
  190. audex-1.0.7a3.dist-info/RECORD +192 -0
  191. audex-1.0.7a3.dist-info/WHEEL +4 -0
  192. audex-1.0.7a3.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,978 @@
1
+ # This file is auto-generated by PrototypeX filter generator.
2
+ # Do not edit manually - changes will be overwritten.
3
+ # Regenerate using: python -m scripts.gen_filters gen
4
+
5
+ from __future__ import annotations
6
+
7
+ import datetime
8
+ import typing as t
9
+
10
+ from audex.entity.session import Session
11
+ from audex.filters import FieldFilter
12
+ from audex.filters import Filter
13
+ from audex.filters import FilterBuilder
14
+ from audex.filters import StringBackedFieldFilter
15
+ from audex.filters import StringFieldFilter
16
+ from audex.valueobj.session import SessionStatus
17
+
18
+
19
+ class SessionFilterBuilder(FilterBuilder[Session]):
20
+ """Session filter builder with full type hints and IDE support.
21
+
22
+ This class is auto-generated. Do not edit manually.
23
+ """
24
+
25
+ class _IdField(StringFieldFilter):
26
+ """Chainable id filter with type-safe operations."""
27
+
28
+ def __init__(self, builder: SessionFilterBuilder) -> None:
29
+ super().__init__("id", object.__getattribute__(builder, "_filter"))
30
+ self._parent_builder = builder
31
+
32
+ def eq(self, value: str) -> SessionFilterBuilder:
33
+ super().eq(value)
34
+ return self._parent_builder
35
+
36
+ def ne(self, value: str) -> SessionFilterBuilder:
37
+ super().ne(value)
38
+ return self._parent_builder
39
+
40
+ def gt(self, value: str) -> SessionFilterBuilder:
41
+ super().gt(value)
42
+ return self._parent_builder
43
+
44
+ def lt(self, value: str) -> SessionFilterBuilder:
45
+ super().lt(value)
46
+ return self._parent_builder
47
+
48
+ def gte(self, value: str) -> SessionFilterBuilder:
49
+ super().gte(value)
50
+ return self._parent_builder
51
+
52
+ def lte(self, value: str) -> SessionFilterBuilder:
53
+ super().lte(value)
54
+ return self._parent_builder
55
+
56
+ def in_(self, values: t.Sequence[str]) -> SessionFilterBuilder:
57
+ super().in_(values)
58
+ return self._parent_builder
59
+
60
+ def nin(self, values: t.Sequence[str]) -> SessionFilterBuilder:
61
+ super().nin(values)
62
+ return self._parent_builder
63
+
64
+ def between(self, value1: str, value2: str) -> SessionFilterBuilder:
65
+ super().between(value1, value2)
66
+ return self._parent_builder
67
+
68
+ def is_null(self) -> SessionFilterBuilder:
69
+ super().is_null()
70
+ return self._parent_builder
71
+
72
+ def is_not_null(self) -> SessionFilterBuilder:
73
+ super().is_not_null()
74
+ return self._parent_builder
75
+
76
+ def asc(self) -> SessionFilterBuilder:
77
+ super().asc()
78
+ return self._parent_builder
79
+
80
+ def desc(self) -> SessionFilterBuilder:
81
+ super().desc()
82
+ return self._parent_builder
83
+
84
+ def contains(self, value: str) -> SessionFilterBuilder:
85
+ super().contains(value)
86
+ return self._parent_builder
87
+
88
+ def startswith(self, value: str) -> SessionFilterBuilder:
89
+ super().startswith(value)
90
+ return self._parent_builder
91
+
92
+ def endswith(self, value: str) -> SessionFilterBuilder:
93
+ super().endswith(value)
94
+ return self._parent_builder
95
+
96
+ class _CreatedAtField(FieldFilter[datetime.datetime]):
97
+ """Chainable created_at filter with type-safe operations."""
98
+
99
+ def __init__(self, builder: SessionFilterBuilder) -> None:
100
+ super().__init__("created_at", object.__getattribute__(builder, "_filter"))
101
+ self._parent_builder = builder
102
+
103
+ def eq(self, value: datetime.datetime) -> SessionFilterBuilder:
104
+ super().eq(value)
105
+ return self._parent_builder
106
+
107
+ def ne(self, value: datetime.datetime) -> SessionFilterBuilder:
108
+ super().ne(value)
109
+ return self._parent_builder
110
+
111
+ def gt(self, value: datetime.datetime) -> SessionFilterBuilder:
112
+ super().gt(value)
113
+ return self._parent_builder
114
+
115
+ def lt(self, value: datetime.datetime) -> SessionFilterBuilder:
116
+ super().lt(value)
117
+ return self._parent_builder
118
+
119
+ def gte(self, value: datetime.datetime) -> SessionFilterBuilder:
120
+ super().gte(value)
121
+ return self._parent_builder
122
+
123
+ def lte(self, value: datetime.datetime) -> SessionFilterBuilder:
124
+ super().lte(value)
125
+ return self._parent_builder
126
+
127
+ def in_(self, values: t.Sequence[datetime.datetime]) -> SessionFilterBuilder:
128
+ super().in_(values)
129
+ return self._parent_builder
130
+
131
+ def nin(self, values: t.Sequence[datetime.datetime]) -> SessionFilterBuilder:
132
+ super().nin(values)
133
+ return self._parent_builder
134
+
135
+ def between(
136
+ self, value1: datetime.datetime, value2: datetime.datetime
137
+ ) -> SessionFilterBuilder:
138
+ super().between(value1, value2)
139
+ return self._parent_builder
140
+
141
+ def is_null(self) -> SessionFilterBuilder:
142
+ super().is_null()
143
+ return self._parent_builder
144
+
145
+ def is_not_null(self) -> SessionFilterBuilder:
146
+ super().is_not_null()
147
+ return self._parent_builder
148
+
149
+ def asc(self) -> SessionFilterBuilder:
150
+ super().asc()
151
+ return self._parent_builder
152
+
153
+ def desc(self) -> SessionFilterBuilder:
154
+ super().desc()
155
+ return self._parent_builder
156
+
157
+ class _UpdatedAtField(FieldFilter[datetime.datetime | None]):
158
+ """Chainable updated_at filter with type-safe operations."""
159
+
160
+ def __init__(self, builder: SessionFilterBuilder) -> None:
161
+ super().__init__("updated_at", object.__getattribute__(builder, "_filter"))
162
+ self._parent_builder = builder
163
+
164
+ def eq(self, value: datetime.datetime | None) -> SessionFilterBuilder:
165
+ super().eq(value)
166
+ return self._parent_builder
167
+
168
+ def ne(self, value: datetime.datetime | None) -> SessionFilterBuilder:
169
+ super().ne(value)
170
+ return self._parent_builder
171
+
172
+ def gt(self, value: datetime.datetime | None) -> SessionFilterBuilder:
173
+ super().gt(value)
174
+ return self._parent_builder
175
+
176
+ def lt(self, value: datetime.datetime | None) -> SessionFilterBuilder:
177
+ super().lt(value)
178
+ return self._parent_builder
179
+
180
+ def gte(self, value: datetime.datetime | None) -> SessionFilterBuilder:
181
+ super().gte(value)
182
+ return self._parent_builder
183
+
184
+ def lte(self, value: datetime.datetime | None) -> SessionFilterBuilder:
185
+ super().lte(value)
186
+ return self._parent_builder
187
+
188
+ def in_(self, values: t.Sequence[datetime.datetime | None]) -> SessionFilterBuilder:
189
+ super().in_(values)
190
+ return self._parent_builder
191
+
192
+ def nin(self, values: t.Sequence[datetime.datetime | None]) -> SessionFilterBuilder:
193
+ super().nin(values)
194
+ return self._parent_builder
195
+
196
+ def between(
197
+ self, value1: datetime.datetime | None, value2: datetime.datetime | None
198
+ ) -> SessionFilterBuilder:
199
+ super().between(value1, value2)
200
+ return self._parent_builder
201
+
202
+ def is_null(self) -> SessionFilterBuilder:
203
+ super().is_null()
204
+ return self._parent_builder
205
+
206
+ def is_not_null(self) -> SessionFilterBuilder:
207
+ super().is_not_null()
208
+ return self._parent_builder
209
+
210
+ def asc(self) -> SessionFilterBuilder:
211
+ super().asc()
212
+ return self._parent_builder
213
+
214
+ def desc(self) -> SessionFilterBuilder:
215
+ super().desc()
216
+ return self._parent_builder
217
+
218
+ class _DoctorIdField(StringFieldFilter):
219
+ """Chainable doctor_id filter with type-safe operations."""
220
+
221
+ def __init__(self, builder: SessionFilterBuilder) -> None:
222
+ super().__init__("doctor_id", object.__getattribute__(builder, "_filter"))
223
+ self._parent_builder = builder
224
+
225
+ def eq(self, value: str) -> SessionFilterBuilder:
226
+ super().eq(value)
227
+ return self._parent_builder
228
+
229
+ def ne(self, value: str) -> SessionFilterBuilder:
230
+ super().ne(value)
231
+ return self._parent_builder
232
+
233
+ def gt(self, value: str) -> SessionFilterBuilder:
234
+ super().gt(value)
235
+ return self._parent_builder
236
+
237
+ def lt(self, value: str) -> SessionFilterBuilder:
238
+ super().lt(value)
239
+ return self._parent_builder
240
+
241
+ def gte(self, value: str) -> SessionFilterBuilder:
242
+ super().gte(value)
243
+ return self._parent_builder
244
+
245
+ def lte(self, value: str) -> SessionFilterBuilder:
246
+ super().lte(value)
247
+ return self._parent_builder
248
+
249
+ def in_(self, values: t.Sequence[str]) -> SessionFilterBuilder:
250
+ super().in_(values)
251
+ return self._parent_builder
252
+
253
+ def nin(self, values: t.Sequence[str]) -> SessionFilterBuilder:
254
+ super().nin(values)
255
+ return self._parent_builder
256
+
257
+ def between(self, value1: str, value2: str) -> SessionFilterBuilder:
258
+ super().between(value1, value2)
259
+ return self._parent_builder
260
+
261
+ def is_null(self) -> SessionFilterBuilder:
262
+ super().is_null()
263
+ return self._parent_builder
264
+
265
+ def is_not_null(self) -> SessionFilterBuilder:
266
+ super().is_not_null()
267
+ return self._parent_builder
268
+
269
+ def asc(self) -> SessionFilterBuilder:
270
+ super().asc()
271
+ return self._parent_builder
272
+
273
+ def desc(self) -> SessionFilterBuilder:
274
+ super().desc()
275
+ return self._parent_builder
276
+
277
+ def contains(self, value: str) -> SessionFilterBuilder:
278
+ super().contains(value)
279
+ return self._parent_builder
280
+
281
+ def startswith(self, value: str) -> SessionFilterBuilder:
282
+ super().startswith(value)
283
+ return self._parent_builder
284
+
285
+ def endswith(self, value: str) -> SessionFilterBuilder:
286
+ super().endswith(value)
287
+ return self._parent_builder
288
+
289
+ class _PatientNameField(StringFieldFilter):
290
+ """Chainable patient_name filter with type-safe operations."""
291
+
292
+ def __init__(self, builder: SessionFilterBuilder) -> None:
293
+ super().__init__("patient_name", object.__getattribute__(builder, "_filter"))
294
+ self._parent_builder = builder
295
+
296
+ def eq(self, value: str | None) -> SessionFilterBuilder:
297
+ super().eq(value)
298
+ return self._parent_builder
299
+
300
+ def ne(self, value: str | None) -> SessionFilterBuilder:
301
+ super().ne(value)
302
+ return self._parent_builder
303
+
304
+ def gt(self, value: str | None) -> SessionFilterBuilder:
305
+ super().gt(value)
306
+ return self._parent_builder
307
+
308
+ def lt(self, value: str | None) -> SessionFilterBuilder:
309
+ super().lt(value)
310
+ return self._parent_builder
311
+
312
+ def gte(self, value: str | None) -> SessionFilterBuilder:
313
+ super().gte(value)
314
+ return self._parent_builder
315
+
316
+ def lte(self, value: str | None) -> SessionFilterBuilder:
317
+ super().lte(value)
318
+ return self._parent_builder
319
+
320
+ def in_(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
321
+ super().in_(values)
322
+ return self._parent_builder
323
+
324
+ def nin(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
325
+ super().nin(values)
326
+ return self._parent_builder
327
+
328
+ def between(self, value1: str | None, value2: str | None) -> SessionFilterBuilder:
329
+ super().between(value1, value2)
330
+ return self._parent_builder
331
+
332
+ def is_null(self) -> SessionFilterBuilder:
333
+ super().is_null()
334
+ return self._parent_builder
335
+
336
+ def is_not_null(self) -> SessionFilterBuilder:
337
+ super().is_not_null()
338
+ return self._parent_builder
339
+
340
+ def asc(self) -> SessionFilterBuilder:
341
+ super().asc()
342
+ return self._parent_builder
343
+
344
+ def desc(self) -> SessionFilterBuilder:
345
+ super().desc()
346
+ return self._parent_builder
347
+
348
+ def contains(self, value: str) -> SessionFilterBuilder:
349
+ super().contains(value)
350
+ return self._parent_builder
351
+
352
+ def startswith(self, value: str) -> SessionFilterBuilder:
353
+ super().startswith(value)
354
+ return self._parent_builder
355
+
356
+ def endswith(self, value: str) -> SessionFilterBuilder:
357
+ super().endswith(value)
358
+ return self._parent_builder
359
+
360
+ class _ClinicNumberField(StringFieldFilter):
361
+ """Chainable clinic_number filter with type-safe operations."""
362
+
363
+ def __init__(self, builder: SessionFilterBuilder) -> None:
364
+ super().__init__("clinic_number", object.__getattribute__(builder, "_filter"))
365
+ self._parent_builder = builder
366
+
367
+ def eq(self, value: str | None) -> SessionFilterBuilder:
368
+ super().eq(value)
369
+ return self._parent_builder
370
+
371
+ def ne(self, value: str | None) -> SessionFilterBuilder:
372
+ super().ne(value)
373
+ return self._parent_builder
374
+
375
+ def gt(self, value: str | None) -> SessionFilterBuilder:
376
+ super().gt(value)
377
+ return self._parent_builder
378
+
379
+ def lt(self, value: str | None) -> SessionFilterBuilder:
380
+ super().lt(value)
381
+ return self._parent_builder
382
+
383
+ def gte(self, value: str | None) -> SessionFilterBuilder:
384
+ super().gte(value)
385
+ return self._parent_builder
386
+
387
+ def lte(self, value: str | None) -> SessionFilterBuilder:
388
+ super().lte(value)
389
+ return self._parent_builder
390
+
391
+ def in_(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
392
+ super().in_(values)
393
+ return self._parent_builder
394
+
395
+ def nin(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
396
+ super().nin(values)
397
+ return self._parent_builder
398
+
399
+ def between(self, value1: str | None, value2: str | None) -> SessionFilterBuilder:
400
+ super().between(value1, value2)
401
+ return self._parent_builder
402
+
403
+ def is_null(self) -> SessionFilterBuilder:
404
+ super().is_null()
405
+ return self._parent_builder
406
+
407
+ def is_not_null(self) -> SessionFilterBuilder:
408
+ super().is_not_null()
409
+ return self._parent_builder
410
+
411
+ def asc(self) -> SessionFilterBuilder:
412
+ super().asc()
413
+ return self._parent_builder
414
+
415
+ def desc(self) -> SessionFilterBuilder:
416
+ super().desc()
417
+ return self._parent_builder
418
+
419
+ def contains(self, value: str) -> SessionFilterBuilder:
420
+ super().contains(value)
421
+ return self._parent_builder
422
+
423
+ def startswith(self, value: str) -> SessionFilterBuilder:
424
+ super().startswith(value)
425
+ return self._parent_builder
426
+
427
+ def endswith(self, value: str) -> SessionFilterBuilder:
428
+ super().endswith(value)
429
+ return self._parent_builder
430
+
431
+ class _MedicalRecordNumberField(StringFieldFilter):
432
+ """Chainable medical_record_number filter with type-safe
433
+ operations."""
434
+
435
+ def __init__(self, builder: SessionFilterBuilder) -> None:
436
+ super().__init__("medical_record_number", object.__getattribute__(builder, "_filter"))
437
+ self._parent_builder = builder
438
+
439
+ def eq(self, value: str | None) -> SessionFilterBuilder:
440
+ super().eq(value)
441
+ return self._parent_builder
442
+
443
+ def ne(self, value: str | None) -> SessionFilterBuilder:
444
+ super().ne(value)
445
+ return self._parent_builder
446
+
447
+ def gt(self, value: str | None) -> SessionFilterBuilder:
448
+ super().gt(value)
449
+ return self._parent_builder
450
+
451
+ def lt(self, value: str | None) -> SessionFilterBuilder:
452
+ super().lt(value)
453
+ return self._parent_builder
454
+
455
+ def gte(self, value: str | None) -> SessionFilterBuilder:
456
+ super().gte(value)
457
+ return self._parent_builder
458
+
459
+ def lte(self, value: str | None) -> SessionFilterBuilder:
460
+ super().lte(value)
461
+ return self._parent_builder
462
+
463
+ def in_(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
464
+ super().in_(values)
465
+ return self._parent_builder
466
+
467
+ def nin(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
468
+ super().nin(values)
469
+ return self._parent_builder
470
+
471
+ def between(self, value1: str | None, value2: str | None) -> SessionFilterBuilder:
472
+ super().between(value1, value2)
473
+ return self._parent_builder
474
+
475
+ def is_null(self) -> SessionFilterBuilder:
476
+ super().is_null()
477
+ return self._parent_builder
478
+
479
+ def is_not_null(self) -> SessionFilterBuilder:
480
+ super().is_not_null()
481
+ return self._parent_builder
482
+
483
+ def asc(self) -> SessionFilterBuilder:
484
+ super().asc()
485
+ return self._parent_builder
486
+
487
+ def desc(self) -> SessionFilterBuilder:
488
+ super().desc()
489
+ return self._parent_builder
490
+
491
+ def contains(self, value: str) -> SessionFilterBuilder:
492
+ super().contains(value)
493
+ return self._parent_builder
494
+
495
+ def startswith(self, value: str) -> SessionFilterBuilder:
496
+ super().startswith(value)
497
+ return self._parent_builder
498
+
499
+ def endswith(self, value: str) -> SessionFilterBuilder:
500
+ super().endswith(value)
501
+ return self._parent_builder
502
+
503
+ class _DiagnosisField(StringFieldFilter):
504
+ """Chainable diagnosis filter with type-safe operations."""
505
+
506
+ def __init__(self, builder: SessionFilterBuilder) -> None:
507
+ super().__init__("diagnosis", object.__getattribute__(builder, "_filter"))
508
+ self._parent_builder = builder
509
+
510
+ def eq(self, value: str | None) -> SessionFilterBuilder:
511
+ super().eq(value)
512
+ return self._parent_builder
513
+
514
+ def ne(self, value: str | None) -> SessionFilterBuilder:
515
+ super().ne(value)
516
+ return self._parent_builder
517
+
518
+ def gt(self, value: str | None) -> SessionFilterBuilder:
519
+ super().gt(value)
520
+ return self._parent_builder
521
+
522
+ def lt(self, value: str | None) -> SessionFilterBuilder:
523
+ super().lt(value)
524
+ return self._parent_builder
525
+
526
+ def gte(self, value: str | None) -> SessionFilterBuilder:
527
+ super().gte(value)
528
+ return self._parent_builder
529
+
530
+ def lte(self, value: str | None) -> SessionFilterBuilder:
531
+ super().lte(value)
532
+ return self._parent_builder
533
+
534
+ def in_(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
535
+ super().in_(values)
536
+ return self._parent_builder
537
+
538
+ def nin(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
539
+ super().nin(values)
540
+ return self._parent_builder
541
+
542
+ def between(self, value1: str | None, value2: str | None) -> SessionFilterBuilder:
543
+ super().between(value1, value2)
544
+ return self._parent_builder
545
+
546
+ def is_null(self) -> SessionFilterBuilder:
547
+ super().is_null()
548
+ return self._parent_builder
549
+
550
+ def is_not_null(self) -> SessionFilterBuilder:
551
+ super().is_not_null()
552
+ return self._parent_builder
553
+
554
+ def asc(self) -> SessionFilterBuilder:
555
+ super().asc()
556
+ return self._parent_builder
557
+
558
+ def desc(self) -> SessionFilterBuilder:
559
+ super().desc()
560
+ return self._parent_builder
561
+
562
+ def contains(self, value: str) -> SessionFilterBuilder:
563
+ super().contains(value)
564
+ return self._parent_builder
565
+
566
+ def startswith(self, value: str) -> SessionFilterBuilder:
567
+ super().startswith(value)
568
+ return self._parent_builder
569
+
570
+ def endswith(self, value: str) -> SessionFilterBuilder:
571
+ super().endswith(value)
572
+ return self._parent_builder
573
+
574
+ class _StatusField(StringBackedFieldFilter[SessionStatus]):
575
+ """Chainable status filter with type-safe operations."""
576
+
577
+ def __init__(self, builder: SessionFilterBuilder) -> None:
578
+ super().__init__("status", object.__getattribute__(builder, "_filter"))
579
+ self._parent_builder = builder
580
+
581
+ def eq(self, value: SessionStatus) -> SessionFilterBuilder:
582
+ super().eq(value)
583
+ return self._parent_builder
584
+
585
+ def ne(self, value: SessionStatus) -> SessionFilterBuilder:
586
+ super().ne(value)
587
+ return self._parent_builder
588
+
589
+ def gt(self, value: SessionStatus) -> SessionFilterBuilder:
590
+ super().gt(value)
591
+ return self._parent_builder
592
+
593
+ def lt(self, value: SessionStatus) -> SessionFilterBuilder:
594
+ super().lt(value)
595
+ return self._parent_builder
596
+
597
+ def gte(self, value: SessionStatus) -> SessionFilterBuilder:
598
+ super().gte(value)
599
+ return self._parent_builder
600
+
601
+ def lte(self, value: SessionStatus) -> SessionFilterBuilder:
602
+ super().lte(value)
603
+ return self._parent_builder
604
+
605
+ def in_(self, values: t.Sequence[SessionStatus]) -> SessionFilterBuilder:
606
+ super().in_(values)
607
+ return self._parent_builder
608
+
609
+ def nin(self, values: t.Sequence[SessionStatus]) -> SessionFilterBuilder:
610
+ super().nin(values)
611
+ return self._parent_builder
612
+
613
+ def between(self, value1: SessionStatus, value2: SessionStatus) -> SessionFilterBuilder:
614
+ super().between(value1, value2)
615
+ return self._parent_builder
616
+
617
+ def is_null(self) -> SessionFilterBuilder:
618
+ super().is_null()
619
+ return self._parent_builder
620
+
621
+ def is_not_null(self) -> SessionFilterBuilder:
622
+ super().is_not_null()
623
+ return self._parent_builder
624
+
625
+ def asc(self) -> SessionFilterBuilder:
626
+ super().asc()
627
+ return self._parent_builder
628
+
629
+ def desc(self) -> SessionFilterBuilder:
630
+ super().desc()
631
+ return self._parent_builder
632
+
633
+ def contains(self, value: str) -> SessionFilterBuilder:
634
+ super().contains(value)
635
+ return self._parent_builder
636
+
637
+ def startswith(self, value: str) -> SessionFilterBuilder:
638
+ super().startswith(value)
639
+ return self._parent_builder
640
+
641
+ def endswith(self, value: str) -> SessionFilterBuilder:
642
+ super().endswith(value)
643
+ return self._parent_builder
644
+
645
+ class _StartedAtField(FieldFilter[datetime.datetime | None]):
646
+ """Chainable started_at filter with type-safe operations."""
647
+
648
+ def __init__(self, builder: SessionFilterBuilder) -> None:
649
+ super().__init__("started_at", object.__getattribute__(builder, "_filter"))
650
+ self._parent_builder = builder
651
+
652
+ def eq(self, value: datetime.datetime | None) -> SessionFilterBuilder:
653
+ super().eq(value)
654
+ return self._parent_builder
655
+
656
+ def ne(self, value: datetime.datetime | None) -> SessionFilterBuilder:
657
+ super().ne(value)
658
+ return self._parent_builder
659
+
660
+ def gt(self, value: datetime.datetime | None) -> SessionFilterBuilder:
661
+ super().gt(value)
662
+ return self._parent_builder
663
+
664
+ def lt(self, value: datetime.datetime | None) -> SessionFilterBuilder:
665
+ super().lt(value)
666
+ return self._parent_builder
667
+
668
+ def gte(self, value: datetime.datetime | None) -> SessionFilterBuilder:
669
+ super().gte(value)
670
+ return self._parent_builder
671
+
672
+ def lte(self, value: datetime.datetime | None) -> SessionFilterBuilder:
673
+ super().lte(value)
674
+ return self._parent_builder
675
+
676
+ def in_(self, values: t.Sequence[datetime.datetime | None]) -> SessionFilterBuilder:
677
+ super().in_(values)
678
+ return self._parent_builder
679
+
680
+ def nin(self, values: t.Sequence[datetime.datetime | None]) -> SessionFilterBuilder:
681
+ super().nin(values)
682
+ return self._parent_builder
683
+
684
+ def between(
685
+ self, value1: datetime.datetime | None, value2: datetime.datetime | None
686
+ ) -> SessionFilterBuilder:
687
+ super().between(value1, value2)
688
+ return self._parent_builder
689
+
690
+ def is_null(self) -> SessionFilterBuilder:
691
+ super().is_null()
692
+ return self._parent_builder
693
+
694
+ def is_not_null(self) -> SessionFilterBuilder:
695
+ super().is_not_null()
696
+ return self._parent_builder
697
+
698
+ def asc(self) -> SessionFilterBuilder:
699
+ super().asc()
700
+ return self._parent_builder
701
+
702
+ def desc(self) -> SessionFilterBuilder:
703
+ super().desc()
704
+ return self._parent_builder
705
+
706
+ class _EndedAtField(FieldFilter[datetime.datetime | None]):
707
+ """Chainable ended_at filter with type-safe operations."""
708
+
709
+ def __init__(self, builder: SessionFilterBuilder) -> None:
710
+ super().__init__("ended_at", object.__getattribute__(builder, "_filter"))
711
+ self._parent_builder = builder
712
+
713
+ def eq(self, value: datetime.datetime | None) -> SessionFilterBuilder:
714
+ super().eq(value)
715
+ return self._parent_builder
716
+
717
+ def ne(self, value: datetime.datetime | None) -> SessionFilterBuilder:
718
+ super().ne(value)
719
+ return self._parent_builder
720
+
721
+ def gt(self, value: datetime.datetime | None) -> SessionFilterBuilder:
722
+ super().gt(value)
723
+ return self._parent_builder
724
+
725
+ def lt(self, value: datetime.datetime | None) -> SessionFilterBuilder:
726
+ super().lt(value)
727
+ return self._parent_builder
728
+
729
+ def gte(self, value: datetime.datetime | None) -> SessionFilterBuilder:
730
+ super().gte(value)
731
+ return self._parent_builder
732
+
733
+ def lte(self, value: datetime.datetime | None) -> SessionFilterBuilder:
734
+ super().lte(value)
735
+ return self._parent_builder
736
+
737
+ def in_(self, values: t.Sequence[datetime.datetime | None]) -> SessionFilterBuilder:
738
+ super().in_(values)
739
+ return self._parent_builder
740
+
741
+ def nin(self, values: t.Sequence[datetime.datetime | None]) -> SessionFilterBuilder:
742
+ super().nin(values)
743
+ return self._parent_builder
744
+
745
+ def between(
746
+ self, value1: datetime.datetime | None, value2: datetime.datetime | None
747
+ ) -> SessionFilterBuilder:
748
+ super().between(value1, value2)
749
+ return self._parent_builder
750
+
751
+ def is_null(self) -> SessionFilterBuilder:
752
+ super().is_null()
753
+ return self._parent_builder
754
+
755
+ def is_not_null(self) -> SessionFilterBuilder:
756
+ super().is_not_null()
757
+ return self._parent_builder
758
+
759
+ def asc(self) -> SessionFilterBuilder:
760
+ super().asc()
761
+ return self._parent_builder
762
+
763
+ def desc(self) -> SessionFilterBuilder:
764
+ super().desc()
765
+ return self._parent_builder
766
+
767
+ class _NotesField(StringFieldFilter):
768
+ """Chainable notes filter with type-safe operations."""
769
+
770
+ def __init__(self, builder: SessionFilterBuilder) -> None:
771
+ super().__init__("notes", object.__getattribute__(builder, "_filter"))
772
+ self._parent_builder = builder
773
+
774
+ def eq(self, value: str | None) -> SessionFilterBuilder:
775
+ super().eq(value)
776
+ return self._parent_builder
777
+
778
+ def ne(self, value: str | None) -> SessionFilterBuilder:
779
+ super().ne(value)
780
+ return self._parent_builder
781
+
782
+ def gt(self, value: str | None) -> SessionFilterBuilder:
783
+ super().gt(value)
784
+ return self._parent_builder
785
+
786
+ def lt(self, value: str | None) -> SessionFilterBuilder:
787
+ super().lt(value)
788
+ return self._parent_builder
789
+
790
+ def gte(self, value: str | None) -> SessionFilterBuilder:
791
+ super().gte(value)
792
+ return self._parent_builder
793
+
794
+ def lte(self, value: str | None) -> SessionFilterBuilder:
795
+ super().lte(value)
796
+ return self._parent_builder
797
+
798
+ def in_(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
799
+ super().in_(values)
800
+ return self._parent_builder
801
+
802
+ def nin(self, values: t.Sequence[str | None]) -> SessionFilterBuilder:
803
+ super().nin(values)
804
+ return self._parent_builder
805
+
806
+ def between(self, value1: str | None, value2: str | None) -> SessionFilterBuilder:
807
+ super().between(value1, value2)
808
+ return self._parent_builder
809
+
810
+ def is_null(self) -> SessionFilterBuilder:
811
+ super().is_null()
812
+ return self._parent_builder
813
+
814
+ def is_not_null(self) -> SessionFilterBuilder:
815
+ super().is_not_null()
816
+ return self._parent_builder
817
+
818
+ def asc(self) -> SessionFilterBuilder:
819
+ super().asc()
820
+ return self._parent_builder
821
+
822
+ def desc(self) -> SessionFilterBuilder:
823
+ super().desc()
824
+ return self._parent_builder
825
+
826
+ def contains(self, value: str) -> SessionFilterBuilder:
827
+ super().contains(value)
828
+ return self._parent_builder
829
+
830
+ def startswith(self, value: str) -> SessionFilterBuilder:
831
+ super().startswith(value)
832
+ return self._parent_builder
833
+
834
+ def endswith(self, value: str) -> SessionFilterBuilder:
835
+ super().endswith(value)
836
+ return self._parent_builder
837
+
838
+ def and_(self, *filters: Filter) -> Filter:
839
+ """Combine with other filters using AND logic.
840
+
841
+ Args:
842
+ *filters: Other filters to combine with AND.
843
+
844
+ Returns:
845
+ Combined filter with AND logic.
846
+
847
+ Example:
848
+ ```python
849
+ # username = 'john' AND email = 'john@ex.com'
850
+ filter = (
851
+ session_filter()
852
+ .username.eq("john")
853
+ .and_(session_filter().email.eq("john@ex.com"))
854
+ )
855
+ ```
856
+ """
857
+ return object.__getattribute__(self, "_filter").and_(*filters)
858
+
859
+ def or_(self, *filters: Filter) -> Filter:
860
+ """Combine with other filters using OR logic.
861
+
862
+ Args:
863
+ *filters: Other filters to combine with OR.
864
+
865
+ Returns:
866
+ Combined filter with OR logic.
867
+
868
+ Example:
869
+ ```python
870
+ # username = 'john' OR email = 'john@ex.com'
871
+ filter = (
872
+ session_filter()
873
+ .username.eq("john")
874
+ .or_(session_filter().email.eq("john@ex.com"))
875
+ )
876
+ ```
877
+ """
878
+ return object.__getattribute__(self, "_filter").or_(*filters)
879
+
880
+ def not_(self) -> Filter:
881
+ """Negate the current filter.
882
+
883
+ Returns:
884
+ Negated filter.
885
+
886
+ Example:
887
+ ```python
888
+ # NOT (username = 'john')
889
+ filter = session_filter().username.eq("john").not_()
890
+ ```
891
+ """
892
+ return object.__getattribute__(self, "_filter").not_()
893
+
894
+ # Field properties
895
+
896
+ @property
897
+ def id(self) -> _IdField:
898
+ """Filter by id field."""
899
+ return self._IdField(self)
900
+
901
+ @property
902
+ def created_at(self) -> _CreatedAtField:
903
+ """Filter by created_at field."""
904
+ return self._CreatedAtField(self)
905
+
906
+ @property
907
+ def updated_at(self) -> _UpdatedAtField:
908
+ """Filter by updated_at field."""
909
+ return self._UpdatedAtField(self)
910
+
911
+ @property
912
+ def doctor_id(self) -> _DoctorIdField:
913
+ """Filter by doctor_id field."""
914
+ return self._DoctorIdField(self)
915
+
916
+ @property
917
+ def patient_name(self) -> _PatientNameField:
918
+ """Filter by patient_name field."""
919
+ return self._PatientNameField(self)
920
+
921
+ @property
922
+ def clinic_number(self) -> _ClinicNumberField:
923
+ """Filter by clinic_number field."""
924
+ return self._ClinicNumberField(self)
925
+
926
+ @property
927
+ def medical_record_number(self) -> _MedicalRecordNumberField:
928
+ """Filter by medical_record_number field."""
929
+ return self._MedicalRecordNumberField(self)
930
+
931
+ @property
932
+ def diagnosis(self) -> _DiagnosisField:
933
+ """Filter by diagnosis field."""
934
+ return self._DiagnosisField(self)
935
+
936
+ @property
937
+ def status(self) -> _StatusField:
938
+ """Filter by status field."""
939
+ return self._StatusField(self)
940
+
941
+ @property
942
+ def started_at(self) -> _StartedAtField:
943
+ """Filter by started_at field."""
944
+ return self._StartedAtField(self)
945
+
946
+ @property
947
+ def ended_at(self) -> _EndedAtField:
948
+ """Filter by ended_at field."""
949
+ return self._EndedAtField(self)
950
+
951
+ @property
952
+ def notes(self) -> _NotesField:
953
+ """Filter by notes field."""
954
+ return self._NotesField(self)
955
+
956
+
957
+ def session_filter() -> SessionFilterBuilder:
958
+ """Create a Session filter builder with full type safety.
959
+
960
+ Returns:
961
+ A SessionFilterBuilder instance with full IDE support and chainable fields.
962
+
963
+ Example:
964
+ ```python
965
+ # AND conditions (chained)
966
+ filter = (
967
+ session_filter()
968
+ .field1.eq(value1)
969
+ .field2.contains(value2)
970
+ )
971
+
972
+ # OR conditions
973
+ filter = session_filter().field1.eq(
974
+ value1
975
+ ) | session_filter().field2.eq(value2)
976
+ ```
977
+ """
978
+ return SessionFilterBuilder(Session)