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