|
1 | | -from flask_restx import Api, Namespace, fields |
2 | | - |
3 | | -from libs.helper import AppIconUrlField |
4 | | - |
5 | | -parameters__system_parameters = { |
6 | | - "image_file_size_limit": fields.Integer, |
7 | | - "video_file_size_limit": fields.Integer, |
8 | | - "audio_file_size_limit": fields.Integer, |
9 | | - "file_size_limit": fields.Integer, |
10 | | - "workflow_file_upload_limit": fields.Integer, |
11 | | -} |
12 | | - |
13 | | - |
14 | | -def build_system_parameters_model(api_or_ns: Api | Namespace): |
15 | | - """Build the system parameters model for the API or Namespace.""" |
16 | | - return api_or_ns.model("SystemParameters", parameters__system_parameters) |
17 | | - |
18 | | - |
19 | | -parameters_fields = { |
20 | | - "opening_statement": fields.String, |
21 | | - "suggested_questions": fields.Raw, |
22 | | - "suggested_questions_after_answer": fields.Raw, |
23 | | - "speech_to_text": fields.Raw, |
24 | | - "text_to_speech": fields.Raw, |
25 | | - "retriever_resource": fields.Raw, |
26 | | - "annotation_reply": fields.Raw, |
27 | | - "more_like_this": fields.Raw, |
28 | | - "user_input_form": fields.Raw, |
29 | | - "sensitive_word_avoidance": fields.Raw, |
30 | | - "file_upload": fields.Raw, |
31 | | - "system_parameters": fields.Nested(parameters__system_parameters), |
32 | | -} |
33 | | - |
34 | | - |
35 | | -def build_parameters_model(api_or_ns: Api | Namespace): |
36 | | - """Build the parameters model for the API or Namespace.""" |
37 | | - copied_fields = parameters_fields.copy() |
38 | | - copied_fields["system_parameters"] = fields.Nested(build_system_parameters_model(api_or_ns)) |
39 | | - return api_or_ns.model("Parameters", copied_fields) |
40 | | - |
41 | | - |
42 | | -site_fields = { |
43 | | - "title": fields.String, |
44 | | - "chat_color_theme": fields.String, |
45 | | - "chat_color_theme_inverted": fields.Boolean, |
46 | | - "icon_type": fields.String, |
47 | | - "icon": fields.String, |
48 | | - "icon_background": fields.String, |
49 | | - "icon_url": AppIconUrlField, |
50 | | - "description": fields.String, |
51 | | - "copyright": fields.String, |
52 | | - "privacy_policy": fields.String, |
53 | | - "custom_disclaimer": fields.String, |
54 | | - "default_language": fields.String, |
55 | | - "show_workflow_steps": fields.Boolean, |
56 | | - "use_icon_as_answer_icon": fields.Boolean, |
57 | | -} |
58 | | - |
59 | | - |
60 | | -def build_site_model(api_or_ns: Api | Namespace): |
61 | | - """Build the site model for the API or Namespace.""" |
62 | | - return api_or_ns.model("Site", site_fields) |
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +from typing import Any, TypeAlias |
| 4 | + |
| 5 | +from pydantic import BaseModel, ConfigDict, computed_field |
| 6 | + |
| 7 | +from core.file import helpers as file_helpers |
| 8 | +from models.model import IconType |
| 9 | + |
| 10 | +JSONValue: TypeAlias = str | int | float | bool | None | dict[str, Any] | list[Any] |
| 11 | +JSONObject: TypeAlias = dict[str, Any] |
| 12 | + |
| 13 | + |
| 14 | +class SystemParameters(BaseModel): |
| 15 | + image_file_size_limit: int |
| 16 | + video_file_size_limit: int |
| 17 | + audio_file_size_limit: int |
| 18 | + file_size_limit: int |
| 19 | + workflow_file_upload_limit: int |
| 20 | + |
| 21 | + |
| 22 | +class Parameters(BaseModel): |
| 23 | + opening_statement: str | None = None |
| 24 | + suggested_questions: list[str] |
| 25 | + suggested_questions_after_answer: JSONObject |
| 26 | + speech_to_text: JSONObject |
| 27 | + text_to_speech: JSONObject |
| 28 | + retriever_resource: JSONObject |
| 29 | + annotation_reply: JSONObject |
| 30 | + more_like_this: JSONObject |
| 31 | + user_input_form: list[JSONObject] |
| 32 | + sensitive_word_avoidance: JSONObject |
| 33 | + file_upload: JSONObject |
| 34 | + system_parameters: SystemParameters |
| 35 | + |
| 36 | + |
| 37 | +class Site(BaseModel): |
| 38 | + model_config = ConfigDict(from_attributes=True) |
| 39 | + |
| 40 | + title: str |
| 41 | + chat_color_theme: str | None = None |
| 42 | + chat_color_theme_inverted: bool |
| 43 | + icon_type: str | None = None |
| 44 | + icon: str | None = None |
| 45 | + icon_background: str | None = None |
| 46 | + description: str | None = None |
| 47 | + copyright: str | None = None |
| 48 | + privacy_policy: str | None = None |
| 49 | + custom_disclaimer: str | None = None |
| 50 | + default_language: str |
| 51 | + show_workflow_steps: bool |
| 52 | + use_icon_as_answer_icon: bool |
| 53 | + |
| 54 | + @computed_field(return_type=str | None) # type: ignore |
| 55 | + @property |
| 56 | + def icon_url(self) -> str | None: |
| 57 | + if self.icon and self.icon_type == IconType.IMAGE: |
| 58 | + return file_helpers.get_signed_file_url(self.icon) |
| 59 | + return None |
0 commit comments