Skip to content

Commit

Permalink
Complete Vocabularies async port.
Browse files Browse the repository at this point in the history
- Moved to `vocabularies_async` and `types` to be consistent with `dev_async`.
- Set `internal_resource` to the old resource.
- Added `ResourceConfig`.
- Added module to `default_settings`.
- Addressed feedbacks.
  • Loading branch information
jerome-poisson committed Jan 21, 2025
1 parent 27e72bf commit 72e3733
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 59 deletions.
2 changes: 1 addition & 1 deletion superdesk/default_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ def local_to_utc_hour(hour):
#:
#: ..versionadded: 3.0.0
#:
MODULES = ["superdesk.users", "apps.desks_async"]
MODULES = ["superdesk.users", "apps.desks_async", "superdesk.vocabularies_async"]

ASYNC_AUTH_CLASS = "superdesk.core.auth.token_auth:TokenAuthorization"

Expand Down
6 changes: 4 additions & 2 deletions superdesk/types/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from typing import TypedDict, Dict, Any, List
from typing import Any, Dict, List, TypedDict

from .desks import DesksResourceModel
from .users import UsersResourceModel
from .vocabularies import VocabulariesResourceModel

__all__ = ["UsersResourceModel", "DesksResourceModel"]
__all__ = ["UsersResourceModel", "DesksResourceModel", "VocabulariesResourceModel"]


class WebsocketMessageFilterConditions(TypedDict, total=False):
Expand Down
84 changes: 84 additions & 0 deletions superdesk/types/vocabularies.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# -*- coding: utf-8; -*-
#
# This file is part of Superdesk.
#
# Copyright 2013, 2025 Sourcefabric z.u. and contributors.
#
# For the full copyright and license information, please see the
# AUTHORS and LICENSE files distributed with this source code, or
# at https://www.sourcefabric.org/superdesk/license


from enum import Enum, unique
import logging
from typing import Annotated, Any

from pydantic import BaseModel, ConfigDict, Field
from quart_babel import gettext as _

from superdesk.core.resources import ResourceModel
from superdesk.core.resources.model import Dataclass, ResourceModel
from superdesk.core.resources.validators import validate_maxlength

logger = logging.getLogger(__name__)


class Tag(Dataclass):
text: str


class Item(BaseModel):
name: str
qcode: str
is_active: bool = True


class DateShortcut(Dataclass):
value: int
term: str
label: str


class CustomFieldConfig(Dataclass):
increment_steps: list[int]
initial_offset_minutes: int


@unique
class CVAccessType(str, Enum):
MANAGEABLE = "manageable"
UNMANAGEABLE = "unmanageable"


@unique
class SelectionType(str, Enum):
SINGLE_SELECTION = "single selection"
MULTI_SELECTION = "multi selection"
DO_NOT_SHOW = "do not show"


class VocabulariesResourceModel(ResourceModel):
display_name: str
description: str | None = None
helper_text: Annotated[str | None, validate_maxlength(120)] = None
tags: list[Tag] | None = None
popup_width: int | None = None
management_type: Annotated[CVAccessType, Field(alias="type")]
items: list[Item]
selection_type: SelectionType | None = None
read_only: bool | None = None
schema_field: str | None = None
dependent: bool = False
service: dict[str, int] = Field(default_factory=dict)
priority: int = 0
unique_field: str | None = None
schema_: dict[str, dict]
field_type_: str | None = None
field_options_: dict[str, Any] = Field(default_factory=dict)
init_version: int = 0
preffered_items: bool = False
disable_entire_category_selection: bool = False
date_shortcuts: list[DateShortcut] | None = None
custom_field_type: str | None = None
custom_field_config: CustomFieldConfig | None = None
translations: dict[str, dict[str, Any]] = Field(default_factory=dict)
1 change: 1 addition & 0 deletions superdesk/vocabularies/vocabularies.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@


class VocabulariesResource(Resource):
internal_resource = True
schema = {
"_id": {
"type": "string",
Expand Down
7 changes: 7 additions & 0 deletions superdesk/vocabularies_async/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from superdesk.core.module import Module
from .service import VocabulariesService
from .module import desks_resource_config

__all__ = ["VocabulariesService"]

module = Module(name="apps.desks_async", resources=[desks_resource_config])
28 changes: 28 additions & 0 deletions superdesk/vocabularies_async/module.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# -*- coding: utf-8; -*-
#
# This file is part of Superdesk.
#
# Copyright 2013, 2025 Sourcefabric z.u. and contributors.
#
# For the full copyright and license information, please see the
# AUTHORS and LICENSE files distributed with this source code, or
# at https://www.sourcefabric.org/superdesk/license

from superdesk.core.resources import ResourceConfig, MongoResourceConfig, MongoIndexOptions
from superdesk.types import VocabulariesResourceModel
from .service import VocabulariesService


desks_resource_config = ResourceConfig(
name="vocabularies",
data_class=VocabulariesResourceModel,
service=VocabulariesService,
mongo=MongoResourceConfig(
indexes=[
MongoIndexOptions(
name="field_type",
keys=[("field_type", 1)],
),
],
),
)
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,24 @@

import json
import logging
from typing import Annotated, Any, Dict, List, Optional
from typing import Any, Dict, List, Optional
from typing import List

from eve.methods.common import serialize_value
from pydantic import BaseModel, ConfigDict, Field
from quart_babel import gettext as _, lazy_gettext

from superdesk import privilege
from superdesk.cache import cache
from superdesk.core.resources import ResourceModel, dataclass
from superdesk.core.resources import ResourceModel
from superdesk.core.resources.model import ResourceModel
from superdesk.core.resources.service import AsyncResourceService
from superdesk.core.resources.validators import validate_maxlength
from superdesk.core.types import SearchRequest
from superdesk.default_schema import DEFAULT_EDITOR, DEFAULT_SCHEMA
from superdesk.errors import SuperdeskApiError
from superdesk.flask import request
from superdesk.notification import push_notification
from superdesk.resource_fields import ID_FIELD
from superdesk.types.vocabularies import VocabulariesResourceModel
from superdesk.users import get_user_from_request
from superdesk.utc import utcnow

Expand All @@ -54,58 +53,6 @@
}


@dataclass
class Tag:
text: str


class Item(BaseModel):
model_config = ConfigDict(extra="allow")
name: str
qcode: str
is_active: bool = True


@dataclass
class DateShortcut:
value: int
term: str
label: str


@dataclass
class CustomFieldConfig:
increment_steps: list[int]
initial_offset_minutes: int


class VocabulariesResourceModel(ResourceModel):
display_name: str
description: str | None = None
helper_text: Annotated[str | None, validate_maxlength(120)] = None
tags: list[Tag] | None = None
popup_width: int | None = None
type_: str # Use type_ instead of type due to reserved keyword conflict
items: list[Item]
selection_type: str | None = None
read_only: bool | None = None
schema_field: str | None = None
dependent: bool = False
service: dict[str, int] = Field(default_factory=dict)
priority: int = 0
unique_field: str | None = None
schema_: dict[str, dict]
field_type_: str | None = None
field_options_: dict[str, Any] = Field(default_factory=dict)
init_version: int = 0
preffered_items: bool = False
disable_entire_category_selection: bool = False
date_shortcuts: list[DateShortcut] | None = None
custom_field_type: str | None = None
custom_field_config: CustomFieldConfig | None = None
translations: dict[str, dict[str, Any]] = Field(default_factory=dict)


class VocabulariesService(AsyncResourceService[VocabulariesResourceModel]):
system_keys = set(DEFAULT_SCHEMA.keys()).union(set(DEFAULT_EDITOR.keys()))

Expand Down

0 comments on commit 72e3733

Please sign in to comment.