|
11 | 11 |
|
12 | 12 | import json
|
13 | 13 | import logging
|
14 |
| -from typing import Annotated, Any, Dict, List, Optional |
| 14 | +from typing import Any, Dict, List, Optional |
15 | 15 | from typing import List
|
16 | 16 |
|
17 | 17 | from eve.methods.common import serialize_value
|
18 |
| -from pydantic import BaseModel, ConfigDict, Field |
19 | 18 | from quart_babel import gettext as _, lazy_gettext
|
20 | 19 |
|
21 | 20 | from superdesk import privilege
|
22 | 21 | from superdesk.cache import cache
|
23 |
| -from superdesk.core.resources import ResourceModel, dataclass |
| 22 | +from superdesk.core.resources import ResourceModel |
24 | 23 | from superdesk.core.resources.model import ResourceModel
|
25 | 24 | from superdesk.core.resources.service import AsyncResourceService
|
26 |
| -from superdesk.core.resources.validators import validate_maxlength |
27 | 25 | from superdesk.core.types import SearchRequest
|
28 | 26 | from superdesk.default_schema import DEFAULT_EDITOR, DEFAULT_SCHEMA
|
29 | 27 | from superdesk.errors import SuperdeskApiError
|
30 | 28 | from superdesk.flask import request
|
31 | 29 | from superdesk.notification import push_notification
|
32 | 30 | from superdesk.resource_fields import ID_FIELD
|
| 31 | +from superdesk.types.vocabularies import VocabulariesResourceModel |
33 | 32 | from superdesk.users import get_user_from_request
|
34 | 33 | from superdesk.utc import utcnow
|
35 | 34 |
|
|
54 | 53 | }
|
55 | 54 |
|
56 | 55 |
|
57 |
| -@dataclass |
58 |
| -class Tag: |
59 |
| - text: str |
60 |
| - |
61 |
| - |
62 |
| -class Item(BaseModel): |
63 |
| - model_config = ConfigDict(extra="allow") |
64 |
| - name: str |
65 |
| - qcode: str |
66 |
| - is_active: bool = True |
67 |
| - |
68 |
| - |
69 |
| -@dataclass |
70 |
| -class DateShortcut: |
71 |
| - value: int |
72 |
| - term: str |
73 |
| - label: str |
74 |
| - |
75 |
| - |
76 |
| -@dataclass |
77 |
| -class CustomFieldConfig: |
78 |
| - increment_steps: list[int] |
79 |
| - initial_offset_minutes: int |
80 |
| - |
81 |
| - |
82 |
| -class VocabulariesResourceModel(ResourceModel): |
83 |
| - display_name: str |
84 |
| - description: str | None = None |
85 |
| - helper_text: Annotated[str | None, validate_maxlength(120)] = None |
86 |
| - tags: list[Tag] | None = None |
87 |
| - popup_width: int | None = None |
88 |
| - type_: str # Use type_ instead of type due to reserved keyword conflict |
89 |
| - items: list[Item] |
90 |
| - selection_type: str | None = None |
91 |
| - read_only: bool | None = None |
92 |
| - schema_field: str | None = None |
93 |
| - dependent: bool = False |
94 |
| - service: dict[str, int] = Field(default_factory=dict) |
95 |
| - priority: int = 0 |
96 |
| - unique_field: str | None = None |
97 |
| - schema_: dict[str, dict] |
98 |
| - field_type_: str | None = None |
99 |
| - field_options_: dict[str, Any] = Field(default_factory=dict) |
100 |
| - init_version: int = 0 |
101 |
| - preffered_items: bool = False |
102 |
| - disable_entire_category_selection: bool = False |
103 |
| - date_shortcuts: list[DateShortcut] | None = None |
104 |
| - custom_field_type: str | None = None |
105 |
| - custom_field_config: CustomFieldConfig | None = None |
106 |
| - translations: dict[str, dict[str, Any]] = Field(default_factory=dict) |
107 |
| - |
108 |
| - |
109 | 56 | class VocabulariesService(AsyncResourceService[VocabulariesResourceModel]):
|
110 | 57 | system_keys = set(DEFAULT_SCHEMA.keys()).union(set(DEFAULT_EDITOR.keys()))
|
111 | 58 |
|
@@ -184,7 +131,6 @@ async def on_fetched_item(self, doc: VocabulariesResourceModel):
|
184 | 131 | async def on_update(self, updates: dict[str, Any], original: VocabulariesResourceModel) -> None:
|
185 | 132 | """Checks the duplicates if a unique field is defined"""
|
186 | 133 | if "items" in updates:
|
187 |
| - # FIXME: `model_copy` doesn't validate updates, is it fine here? |
188 | 134 | updated = original.model_copy(deep=True, update=updates)
|
189 | 135 | await self._validate_items(updated)
|
190 | 136 | if original.unique_field:
|
@@ -249,7 +195,6 @@ def _cast_items(self, vocab: VocabulariesResourceModel) -> None:
|
249 | 195 | for item in vocab.items:
|
250 | 196 | for field, field_schema in schema.items():
|
251 | 197 | if hasattr(item, field):
|
252 |
| - # FIXME: not sure about this one either. |
253 | 198 | setattr(item, field, serialize_value(field_schema["type"], getattr(item, field)))
|
254 | 199 |
|
255 | 200 | def _send_notification(self, updated_vocabulary: VocabulariesResourceModel, event="vocabularies:updated") -> None:
|
|
0 commit comments