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