dsw-models 4.27.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.
@@ -0,0 +1,607 @@
1
+ # pylint: disable=too-many-arguments, too-many-locals, too-many-lines
2
+ import datetime
3
+ import typing
4
+ from uuid import UUID
5
+
6
+ import pydantic
7
+
8
+ from .common import (
9
+ BaseModel,
10
+ MetricMeasure,
11
+ QuestionValidation,
12
+ TAnnotations,
13
+ THeaders,
14
+ TQuestionValueType,
15
+ TypeHintExchange,
16
+ )
17
+
18
+
19
+ T = typing.TypeVar('T')
20
+
21
+
22
+ class EditEventField[T](BaseModel):
23
+ changed: bool
24
+ value: T | None
25
+
26
+ @pydantic.model_serializer(mode='wrap')
27
+ def _serialize(self, handler):
28
+ if not self.changed:
29
+ return {'changed': False}
30
+ # default serialization includes both fields; we only keep what we want
31
+ data = handler(self)
32
+ return {'changed': True, 'value': data.get('value')}
33
+
34
+ @classmethod
35
+ def no_change(cls) -> typing.Self:
36
+ return cls(changed=False, value=None)
37
+
38
+ @classmethod
39
+ def change(cls, value: T) -> typing.Self:
40
+ return cls(changed=True, value=value)
41
+
42
+
43
+ class BaseEventContent(BaseModel):
44
+ event_type: str
45
+
46
+
47
+ class BaseAddEventContent(BaseEventContent):
48
+ annotations: TAnnotations
49
+
50
+
51
+ class BaseEditEventContent(BaseEventContent):
52
+ annotations: EditEventField[TAnnotations]
53
+
54
+
55
+ # Knowledge Model
56
+ class AddKnowledgeModelEventContent(BaseAddEventContent):
57
+ event_type: typing.Literal['AddKnowledgeModelEvent'] = 'AddKnowledgeModelEvent'
58
+
59
+
60
+ class EditKnowledgeModelEventContent(BaseEditEventContent):
61
+ event_type: typing.Literal['EditKnowledgeModelEvent'] = 'EditKnowledgeModelEvent'
62
+ chapter_uuids: EditEventField[list[UUID]]
63
+ integration_uuids: EditEventField[list[UUID]]
64
+ metric_uuids: EditEventField[list[UUID]]
65
+ phase_uuids: EditEventField[list[UUID]]
66
+ resource_collection_uuids: EditEventField[list[UUID]]
67
+ tag_uuids: EditEventField[list[UUID]]
68
+
69
+
70
+ # Chapter
71
+ class AddChapterEventContent(BaseAddEventContent):
72
+ event_type: typing.Literal['AddChapterEvent'] = 'AddChapterEvent'
73
+ title: str
74
+ text: str | None
75
+
76
+
77
+ class EditChapterEventContent(BaseEditEventContent):
78
+ event_type: typing.Literal['EditChapterEvent'] = 'EditChapterEvent'
79
+ title: EditEventField[str]
80
+ text: EditEventField[str | None]
81
+ question_uuids: EditEventField[list[UUID]]
82
+
83
+
84
+ class DeleteChapterEventContent(BaseEventContent):
85
+ event_type: typing.Literal['DeleteChapterEvent'] = 'DeleteChapterEvent'
86
+
87
+
88
+ # Question
89
+ class _AddQuestionEventContent(BaseAddEventContent):
90
+ event_type: typing.Literal['AddQuestionEvent'] = 'AddQuestionEvent'
91
+ question_type: str
92
+ title: str
93
+ text: str | None
94
+ required_phase_uuid: UUID | None
95
+ tag_uuids: list[UUID]
96
+
97
+
98
+ class AddOptionsQuestionEventContent(_AddQuestionEventContent):
99
+ question_type: typing.Literal['OptionsQuestion'] = 'OptionsQuestion'
100
+
101
+
102
+ class AddMultiChoiceQuestionEventContent(_AddQuestionEventContent):
103
+ question_type: typing.Literal['MultiChoiceQuestion'] = 'MultiChoiceQuestion'
104
+
105
+
106
+ class AddListQuestionEventContent(_AddQuestionEventContent):
107
+ question_type: typing.Literal['ListQuestion'] = 'ListQuestion'
108
+
109
+
110
+ class AddValueQuestionEventContent(_AddQuestionEventContent):
111
+ question_type: typing.Literal['ValueQuestion'] = 'ValueQuestion'
112
+ value_type: TQuestionValueType
113
+ validations: list[QuestionValidation]
114
+
115
+
116
+ class AddIntegrationQuestionEventContent(_AddQuestionEventContent):
117
+ question_type: typing.Literal['IntegrationQuestion'] = 'IntegrationQuestion'
118
+ integration_uuid: UUID
119
+ variables: dict[str, str]
120
+
121
+
122
+ class AddItemSelectQuestionEventContent(_AddQuestionEventContent):
123
+ question_type: typing.Literal['ItemSelectQuestion'] = 'ItemSelectQuestion'
124
+ list_question_uuid: UUID
125
+
126
+
127
+ class AddFileQuestionEventContent(_AddQuestionEventContent):
128
+ question_type: typing.Literal['FileQuestion'] = 'FileQuestion'
129
+ max_size: int | None
130
+ file_types: str | None
131
+
132
+
133
+ AddQuestionEventContent = typing.Annotated[
134
+ AddOptionsQuestionEventContent |
135
+ AddMultiChoiceQuestionEventContent |
136
+ AddListQuestionEventContent |
137
+ AddValueQuestionEventContent |
138
+ AddIntegrationQuestionEventContent |
139
+ AddItemSelectQuestionEventContent |
140
+ AddFileQuestionEventContent,
141
+ pydantic.Field(discriminator='question_type'),
142
+ ]
143
+
144
+
145
+ class _EditQuestionEventContent(BaseEditEventContent):
146
+ event_type: typing.Literal['EditQuestionEvent'] = 'EditQuestionEvent'
147
+ question_type: str
148
+ title: EditEventField[str]
149
+ text: EditEventField[str | None]
150
+ required_phase_uuid: EditEventField[UUID | None]
151
+ tag_uuids: EditEventField[list[UUID]]
152
+ expert_uuids: EditEventField[list[UUID]]
153
+ reference_uuids: EditEventField[list[UUID]]
154
+
155
+
156
+ class EditOptionsQuestionEventContent(_EditQuestionEventContent):
157
+ question_type: typing.Literal['OptionsQuestion'] = 'OptionsQuestion'
158
+ answer_uuids: EditEventField[list[UUID]]
159
+
160
+
161
+ class EditMultiChoiceQuestionEventContent(_EditQuestionEventContent):
162
+ question_type: typing.Literal['MultiChoiceQuestion'] = 'MultiChoiceQuestion'
163
+ choice_uuids: EditEventField[list[UUID]]
164
+
165
+
166
+ class EditListQuestionEventContent(_EditQuestionEventContent):
167
+ question_type: typing.Literal['ListQuestion'] = 'ListQuestion'
168
+ item_template_question_uuids: EditEventField[list[UUID]]
169
+
170
+
171
+ class EditValueQuestionEventContent(_EditQuestionEventContent):
172
+ question_type: typing.Literal['ValueQuestion'] = 'ValueQuestion'
173
+ value_type: EditEventField[TQuestionValueType]
174
+ validations: EditEventField[list[QuestionValidation]]
175
+
176
+
177
+ class EditIntegrationQuestionEventContent(_EditQuestionEventContent):
178
+ question_type: typing.Literal['IntegrationQuestion'] = 'IntegrationQuestion'
179
+ integration_uuid: EditEventField[UUID]
180
+ variables: EditEventField[dict[str, str]]
181
+
182
+
183
+ class EditItemSelectQuestionEventContent(_EditQuestionEventContent):
184
+ question_type: typing.Literal['ItemSelectQuestion'] = 'ItemSelectQuestion'
185
+ list_question_uuid: EditEventField[UUID]
186
+
187
+
188
+ class EditFileQuestionEventContent(_EditQuestionEventContent):
189
+ question_type: typing.Literal['FileQuestion'] = 'FileQuestion'
190
+ max_size: EditEventField[int | None]
191
+ file_types: EditEventField[str | None]
192
+
193
+
194
+ EditQuestionEventContent = typing.Annotated[
195
+ EditOptionsQuestionEventContent |
196
+ EditMultiChoiceQuestionEventContent |
197
+ EditListQuestionEventContent |
198
+ EditValueQuestionEventContent |
199
+ EditIntegrationQuestionEventContent |
200
+ EditItemSelectQuestionEventContent |
201
+ EditFileQuestionEventContent,
202
+ pydantic.Field(discriminator='question_type'),
203
+ ]
204
+
205
+
206
+ class DeleteQuestionEventContent(BaseEventContent):
207
+ event_type: typing.Literal['DeleteQuestionEvent'] = 'DeleteQuestionEvent'
208
+
209
+
210
+ # Answer
211
+ class AddAnswerEventContent(BaseAddEventContent):
212
+ event_type: typing.Literal['AddAnswerEvent'] = 'AddAnswerEvent'
213
+ label: str
214
+ advice: str | None
215
+ metric_measures: list[MetricMeasure]
216
+
217
+
218
+ class EditAnswerEventContent(BaseEditEventContent):
219
+ event_type: typing.Literal['EditAnswerEvent'] = 'EditAnswerEvent'
220
+ label: EditEventField[str]
221
+ advice: EditEventField[str | None]
222
+ metric_measures: EditEventField[list[MetricMeasure]]
223
+ follow_up_uuids: EditEventField[list[UUID]]
224
+
225
+
226
+ class DeleteAnswerEventContent(BaseEventContent):
227
+ event_type: typing.Literal['DeleteAnswerEvent'] = 'DeleteAnswerEvent'
228
+
229
+
230
+ # Choice
231
+ class AddChoiceEventContent(BaseAddEventContent):
232
+ event_type: typing.Literal['AddChoiceEvent'] = 'AddChoiceEvent'
233
+ label: str
234
+
235
+
236
+ class EditChoiceEventContent(BaseEditEventContent):
237
+ event_type: typing.Literal['EditChoiceEvent'] = 'EditChoiceEvent'
238
+ label: EditEventField[str]
239
+
240
+
241
+ class DeleteChoiceEventContent(BaseEventContent):
242
+ event_type: typing.Literal['DeleteChoiceEvent'] = 'DeleteChoiceEvent'
243
+
244
+
245
+ # Reference
246
+ class _AddReferenceEventContent(BaseAddEventContent):
247
+ event_type: typing.Literal['AddReferenceEvent'] = 'AddReferenceEvent'
248
+ reference_type: str
249
+
250
+
251
+ class AddResourcePageReferenceEventContent(_AddReferenceEventContent):
252
+ reference_type: typing.Literal['ResourcePageReference'] = 'ResourcePageReference'
253
+ resource_page_uuid: UUID | None
254
+
255
+
256
+ class AddURLReferenceEventContent(_AddReferenceEventContent):
257
+ reference_type: typing.Literal['URLReference'] = 'URLReference'
258
+ url: str
259
+ label: str
260
+
261
+
262
+ class AddCrossReferenceEventContent(_AddReferenceEventContent):
263
+ reference_type: typing.Literal['CrossReference'] = 'CrossReference'
264
+ target_uuid: UUID | None
265
+ description: str
266
+
267
+
268
+ AddReferenceEventContent = typing.Annotated[
269
+ AddResourcePageReferenceEventContent |
270
+ AddURLReferenceEventContent |
271
+ AddCrossReferenceEventContent,
272
+ pydantic.Field(discriminator='reference_type'),
273
+ ]
274
+
275
+
276
+ class _EditReferenceEventContent(BaseEditEventContent):
277
+ event_type: typing.Literal['EditReferenceEvent'] = 'EditReferenceEvent'
278
+ reference_type: str
279
+
280
+
281
+ class EditResourcePageReferenceEventContent(_EditReferenceEventContent):
282
+ reference_type: typing.Literal['ResourcePageReference'] = 'ResourcePageReference'
283
+ resource_page_uuid: EditEventField[UUID]
284
+
285
+
286
+ class EditURLReferenceEventContent(_EditReferenceEventContent):
287
+ reference_type: typing.Literal['URLReference'] = 'URLReference'
288
+ url: EditEventField[str]
289
+ label: EditEventField[str]
290
+
291
+
292
+ class EditCrossReferenceEventContent(_EditReferenceEventContent):
293
+ reference_type: typing.Literal['CrossReference'] = 'CrossReference'
294
+ target_uuid: EditEventField[UUID]
295
+ description: EditEventField[str]
296
+
297
+
298
+ EditReferenceEventContent = typing.Annotated[
299
+ EditResourcePageReferenceEventContent |
300
+ EditURLReferenceEventContent |
301
+ EditCrossReferenceEventContent,
302
+ pydantic.Field(discriminator='reference_type'),
303
+ ]
304
+
305
+
306
+ class DeleteReferenceEventContent(BaseEventContent):
307
+ event_type: typing.Literal['DeleteReferenceEvent'] = 'DeleteReferenceEvent'
308
+
309
+
310
+ # Expert
311
+ class AddExpertEventContent(BaseAddEventContent):
312
+ event_type: typing.Literal['AddExpertEvent'] = 'AddExpertEvent'
313
+ name: str
314
+ email: str
315
+
316
+
317
+ class EditExpertEventContent(BaseEditEventContent):
318
+ event_type: typing.Literal['EditExpertEvent'] = 'EditExpertEvent'
319
+ name: EditEventField[str]
320
+ email: EditEventField[str]
321
+
322
+
323
+ class DeleteExpertEventContent(BaseEventContent):
324
+ event_type: typing.Literal['DeleteExpertEvent'] = 'DeleteExpertEvent'
325
+
326
+
327
+ # Integration
328
+ class _AddIntegrationEventContent(BaseAddEventContent):
329
+ event_type: typing.Literal['AddIntegrationEvent'] = 'AddIntegrationEvent'
330
+ integration_type: str
331
+ name: str
332
+ variables: list[str]
333
+
334
+
335
+ class AddApiIntegrationEventContent(_AddIntegrationEventContent):
336
+ integration_type: typing.Literal['ApiIntegration'] = 'ApiIntegration'
337
+ allow_custom_reply: bool
338
+ request_method: str
339
+ request_url: str
340
+ request_headers: THeaders
341
+ request_body: str | None
342
+ request_allow_empty_search: bool
343
+ response_list_field: str | None
344
+ response_item_template: str
345
+ response_item_template_for_selection: str | None
346
+ test_q: str
347
+ test_variables: dict[str, str]
348
+ test_response: TypeHintExchange | None
349
+
350
+
351
+ class AddApiLegacyIntegrationEventContent(_AddIntegrationEventContent):
352
+ integration_type: typing.Literal['ApiLegacyIntegration'] = 'ApiLegacyIntegration'
353
+ id: str
354
+ logo: str | None
355
+ item_url: str | None
356
+ request_body: str | None
357
+ request_empty_search: bool
358
+ request_headers: THeaders
359
+ request_method: str
360
+ request_url: str
361
+ response_item_id: str | None
362
+ response_item_template: str
363
+ response_list_field: str | None
364
+
365
+
366
+ class AddWidgetIntegrationEventContent(_AddIntegrationEventContent):
367
+ integration_type: typing.Literal['WidgetIntegration'] = 'WidgetIntegration'
368
+ id: str
369
+ logo: str | None
370
+ widget_url: str
371
+ item_url: str | None
372
+
373
+
374
+ AddIntegrationEventContent = typing.Annotated[
375
+ AddApiIntegrationEventContent |
376
+ AddApiLegacyIntegrationEventContent |
377
+ AddWidgetIntegrationEventContent,
378
+ pydantic.Field(discriminator='integration_type'),
379
+ ]
380
+
381
+
382
+ class _EditIntegrationEventContent(BaseEditEventContent):
383
+ event_type: typing.Literal['EditIntegrationEvent'] = 'EditIntegrationEvent'
384
+ integration_type: str
385
+ name: EditEventField[str]
386
+ variables: EditEventField[list[str]]
387
+
388
+
389
+ class EditApiIntegrationEventContent(_EditIntegrationEventContent):
390
+ integration_type: typing.Literal['ApiIntegration'] = 'ApiIntegration'
391
+ allow_custom_reply: EditEventField[bool]
392
+ request_method: EditEventField[str]
393
+ request_url: EditEventField[str]
394
+ request_headers: EditEventField[THeaders]
395
+ request_body: EditEventField[str | None]
396
+ request_allow_empty_search: EditEventField[bool]
397
+ response_list_field: EditEventField[str | None]
398
+ response_item_template: EditEventField[str]
399
+ response_item_template_for_selection: EditEventField[str | None]
400
+ test_q: EditEventField[str]
401
+ test_variables: EditEventField[dict[str, str]]
402
+ test_response: EditEventField[TypeHintExchange | None]
403
+
404
+
405
+ class EditApiLegacyIntegrationEventContent(_EditIntegrationEventContent):
406
+ integration_type: typing.Literal['ApiLegacyIntegration'] = 'ApiLegacyIntegration'
407
+ id: EditEventField[str]
408
+ logo: EditEventField[str | None]
409
+ item_url: EditEventField[str | None]
410
+ request_body: EditEventField[str | None]
411
+ request_empty_search: EditEventField[bool]
412
+ request_headers: EditEventField[THeaders]
413
+ request_method: EditEventField[str]
414
+ request_url: EditEventField[str]
415
+ response_item_id: EditEventField[str]
416
+ response_item_template: EditEventField[str]
417
+ response_list_field: EditEventField[str | None]
418
+
419
+
420
+ class EditWidgetIntegrationEventContent(_EditIntegrationEventContent):
421
+ integration_type: typing.Literal['WidgetIntegration'] = 'WidgetIntegration'
422
+ id: EditEventField[str]
423
+ logo: EditEventField[str | None]
424
+ widget_url: EditEventField[str]
425
+ item_url: EditEventField[str | None]
426
+
427
+
428
+ EditIntegrationEventContent = typing.Annotated[
429
+ EditApiIntegrationEventContent |
430
+ EditApiLegacyIntegrationEventContent |
431
+ EditWidgetIntegrationEventContent,
432
+ pydantic.Field(discriminator='integration_type'),
433
+ ]
434
+
435
+
436
+ class DeleteIntegrationEventContent(BaseEventContent):
437
+ event_type: typing.Literal['DeleteIntegrationEvent'] = 'DeleteIntegrationEvent'
438
+
439
+
440
+ # Tag
441
+ class AddTagEventContent(BaseAddEventContent):
442
+ event_type: typing.Literal['AddTagEvent'] = 'AddTagEvent'
443
+ name: str
444
+ description: str | None
445
+ color: str
446
+
447
+
448
+ class EditTagEventContent(BaseEditEventContent):
449
+ event_type: typing.Literal['EditTagEvent'] = 'EditTagEvent'
450
+ name: EditEventField[str]
451
+ description: EditEventField[str | None]
452
+ color: EditEventField[str]
453
+
454
+
455
+ class DeleteTagEventContent(BaseEventContent):
456
+ event_type: typing.Literal['DeleteTagEvent'] = 'DeleteTagEvent'
457
+
458
+
459
+ # Metric
460
+ class AddMetricEventContent(BaseAddEventContent):
461
+ event_type: typing.Literal['AddMetricEvent'] = 'AddMetricEvent'
462
+ title: str
463
+ abbreviation: str | None
464
+ description: str | None
465
+
466
+
467
+ class EditMetricEventContent(BaseEditEventContent):
468
+ event_type: typing.Literal['EditMetricEvent'] = 'EditMetricEvent'
469
+ title: EditEventField[str]
470
+ abbreviation: EditEventField[str | None]
471
+ description: EditEventField[str | None]
472
+
473
+
474
+ class DeleteMetricEventContent(BaseEventContent):
475
+ event_type: typing.Literal['DeleteMetricEvent'] = 'DeleteMetricEvent'
476
+
477
+
478
+ # Phase
479
+ class AddPhaseEventContent(BaseAddEventContent):
480
+ event_type: typing.Literal['AddPhaseEvent'] = 'AddPhaseEvent'
481
+ title: str
482
+ description: str | None
483
+
484
+
485
+ class EditPhaseEventContent(BaseEditEventContent):
486
+ event_type: typing.Literal['EditPhaseEvent'] = 'EditPhaseEvent'
487
+ title: EditEventField[str]
488
+ description: EditEventField[str | None]
489
+
490
+
491
+ class DeletePhaseEventContent(BaseEventContent):
492
+ event_type: typing.Literal['DeletePhaseEvent'] = 'DeletePhaseEvent'
493
+
494
+
495
+ # Resource Collection
496
+ class AddResourceCollectionEventContent(BaseAddEventContent):
497
+ event_type: typing.Literal['AddResourceCollectionEvent'] = 'AddResourceCollectionEvent'
498
+ title: str
499
+
500
+
501
+ class EditResourceCollectionEventContent(BaseEditEventContent):
502
+ event_type: typing.Literal['EditResourceCollectionEvent'] = 'EditResourceCollectionEvent'
503
+ title: EditEventField[str]
504
+ resource_page_uuids: EditEventField[list[UUID]]
505
+
506
+
507
+ class DeleteResourceCollectionEventContent(BaseEventContent):
508
+ event_type: typing.Literal['DeleteResourceCollectionEvent'] = 'DeleteResourceCollectionEvent'
509
+
510
+
511
+ # Resource Page
512
+ class AddResourcePageEventContent(BaseAddEventContent):
513
+ event_type: typing.Literal['AddResourcePageEvent'] = 'AddResourcePageEvent'
514
+ title: str
515
+ content: str
516
+
517
+
518
+ class EditResourcePageEventContent(BaseEditEventContent):
519
+ event_type: typing.Literal['EditResourcePageEvent'] = 'EditResourcePageEvent'
520
+ title: EditEventField[str]
521
+ content: EditEventField[str]
522
+
523
+
524
+ class DeleteResourcePageEventContent(BaseEventContent):
525
+ event_type: typing.Literal['DeleteResourcePageEvent'] = 'DeleteResourcePageEvent'
526
+
527
+
528
+ # Move events
529
+ class _MoveQuestionEventContent(BaseEventContent):
530
+ target_uuid: UUID
531
+
532
+
533
+ class MoveQuestionEventContent(_MoveQuestionEventContent):
534
+ event_type: typing.Literal['MoveQuestionEvent'] = 'MoveQuestionEvent'
535
+
536
+
537
+ class MoveAnswerEventContent(_MoveQuestionEventContent):
538
+ event_type: typing.Literal['MoveAnswerEvent'] = 'MoveAnswerEvent'
539
+
540
+
541
+ class MoveChoiceEventContent(_MoveQuestionEventContent):
542
+ event_type: typing.Literal['MoveChoiceEvent'] = 'MoveChoiceEvent'
543
+
544
+
545
+ class MoveReferenceEventContent(_MoveQuestionEventContent):
546
+ event_type: typing.Literal['MoveReferenceEvent'] = 'MoveReferenceEvent'
547
+
548
+
549
+ class MoveExpertEventContent(_MoveQuestionEventContent):
550
+ event_type: typing.Literal['MoveExpertEvent'] = 'MoveExpertEvent'
551
+
552
+
553
+ # Event
554
+ EventContent = typing.Annotated[
555
+ AddKnowledgeModelEventContent |
556
+ EditKnowledgeModelEventContent |
557
+ AddChapterEventContent |
558
+ EditChapterEventContent |
559
+ DeleteChapterEventContent |
560
+ AddQuestionEventContent |
561
+ EditQuestionEventContent |
562
+ DeleteQuestionEventContent |
563
+ AddAnswerEventContent |
564
+ EditAnswerEventContent |
565
+ DeleteAnswerEventContent |
566
+ AddChoiceEventContent |
567
+ EditChoiceEventContent |
568
+ DeleteChoiceEventContent |
569
+ AddReferenceEventContent |
570
+ EditReferenceEventContent |
571
+ DeleteReferenceEventContent |
572
+ AddExpertEventContent |
573
+ EditExpertEventContent |
574
+ DeleteExpertEventContent |
575
+ AddIntegrationEventContent |
576
+ EditIntegrationEventContent |
577
+ DeleteIntegrationEventContent |
578
+ AddTagEventContent |
579
+ EditTagEventContent |
580
+ DeleteTagEventContent |
581
+ AddMetricEventContent |
582
+ EditMetricEventContent |
583
+ DeleteMetricEventContent |
584
+ AddPhaseEventContent |
585
+ EditPhaseEventContent |
586
+ DeletePhaseEventContent |
587
+ AddResourceCollectionEventContent |
588
+ EditResourceCollectionEventContent |
589
+ DeleteResourceCollectionEventContent |
590
+ AddResourcePageEventContent |
591
+ EditResourcePageEventContent |
592
+ DeleteResourcePageEventContent |
593
+ MoveQuestionEventContent |
594
+ MoveAnswerEventContent |
595
+ MoveChoiceEventContent |
596
+ MoveReferenceEventContent |
597
+ MoveExpertEventContent,
598
+ pydantic.Field(discriminator='event_type'),
599
+ ]
600
+
601
+
602
+ class Event(BaseModel):
603
+ uuid: UUID
604
+ entity_uuid: UUID
605
+ parent_uuid: UUID
606
+ created_at: datetime.datetime
607
+ content: EventContent