feat: all models

This commit is contained in:
TheNoxium
2025-09-26 14:59:59 +05:00
parent 5bae8b41b2
commit 8e01072ff6
26 changed files with 1464 additions and 119 deletions

460
core/form_descriptors.py Normal file
View File

@@ -0,0 +1,460 @@
from typing import Dict, Any
# Дескриптор формы для узла IF
IF_FORM_DESCRIPTOR = {
"elements": [
{
"name": "condition_row",
"type": "row",
"label": "Условие проверки",
"link_port": {
"id": "then_output",
"label": "Then"
},
"elements": [
{
"name": "condition",
"type": "area",
"label": "Условие",
"placeholder": "Введите условие"
}
]
},
{
"name": "else_row",
"type": "row",
"label": "Альтернативный путь",
"link_port": {
"id": "else_output",
"label": "Else"
}
}
]
}
# Дескриптор формы для узла Listen
LISTEN_FORM_DESCRIPTOR = {
"elements": [
{
"name": "event_row",
"type": "row",
"label": "Событие",
"elements": [
{
"name": "event_name",
"type": "line",
"label": "Событие",
"placeholder": "Идентификатор события"
}
]
},
{
"name": "condition_row",
"type": "row",
"label": "Условие",
"elements": [
{
"name": "condition",
"type": "area",
"label": "Условие",
"placeholder": "Если P([condition(i), [AND, OR]]) == true"
}
]
},
{
"name": "then_row",
"type": "row",
"label": "Then",
"link_port": {
"id": "then_output",
"label": "Then"
}
}
]
}
# Дескриптор формы для узла Trigger
TRIGGER_FORM_DESCRIPTOR = {
"elements": [
{
"name": "event_row",
"type": "row",
"label": "Событие",
"elements": [
{
"name": "event_name",
"type": "line",
"label": "Событие",
"placeholder": "Идентификатор события"
}
]
},
{
"name": "context_row",
"type": "row",
"label": "Контекст",
"elements": [
{
"name": "context",
"type": "area",
"label": "Данные",
"placeholder": "Подготовка указанных переменных окружения в формат запроса JSON"
}
]
},
{
"name": "then_row",
"type": "row",
"label": "Then",
"link_port": {
"id": "then_output",
"label": "Then"
}
}
]
}
# Дескриптор формы для узла Run
RUN_FORM_DESCRIPTOR = {
"elements": [
{
"name": "task_row",
"type": "row",
"label": "Задача",
"elements": [
{
"name": "task",
"type": "select",
"label": "Задача",
"data": ["send_email", "process_data", "generate_report", "validate_input", "transform_data"],
"default": "send_email"
}
]
},
{
"name": "context_row",
"type": "row",
"label": "Аргументы",
"elements": [
{
"name": "context",
"type": "area",
"label": "Аргументы",
"placeholder": "Подготовка указанных переменных окружения в формат запроса JSON"
}
]
},
{
"name": "then_row",
"type": "row",
"label": "Then",
"link_port": {
"id": "then_output",
"label": "Then"
}
}
]
}
# Дескриптор формы для узла Callback
CALLBACK_FORM_DESCRIPTOR = {
"elements": [
{
"name": "uri_row",
"type": "row",
"label": "URI",
"elements": [
{
"name": "uri",
"type": "line",
"label": "Событие",
"placeholder": "URI хука"
}
]
},
{
"name": "method_row",
"type": "row",
"label": "Метод",
"elements": [
{
"name": "method",
"type": "select",
"label": "Метод",
"data": ["POST", "GET", "PUT", "PATCH", "DELETE"],
"default": "POST"
}
]
},
{
"name": "headers_row",
"type": "row",
"label": "Заголовки",
"elements": [
{
"name": "headers",
"type": "area",
"label": "Заголовки",
"placeholder": "Приведение и валидация заголовков"
}
]
},
{
"name": "body_row",
"type": "row",
"label": "Данные",
"elements": [
{
"name": "body",
"type": "area",
"label": "Данные",
"placeholder": "Приведение значений и валидация JSON"
}
]
},
{
"name": "sync_row",
"type": "row",
"label": "Ожидать выполнение запроса",
"elements": [
{
"name": "sync",
"type": "select",
"label": "Ожидать выполнение запроса",
"data": ["Да", "Нет"],
"default": "Да"
}
]
},
{
"name": "then_row",
"type": "row",
"label": "Then",
"link_port": {
"id": "then_output",
"label": "Then"
}
}
]
}
# Дескриптор формы для узла Switch
SWITCH_FORM_DESCRIPTOR = {
"elements": [
{
"name": "switch_row",
"type": "row",
"label": "Условие проверки",
"link_port": {
"id": "case_1_output",
"label": "case_1",
"is_addable": True
},
"elements": [
{
"name": "switch_value",
"type": "area",
"label": "Условие проверки",
"placeholder": "Введите условие"
}
]
},
{
"name": "default_row",
"type": "row",
"label": "По умолчанию",
"link_port": {
"id": "default_output",
"label": "default"
}
}
]
}
# Дескриптор формы для узла Set
SET_FORM_DESCRIPTOR = {
"elements": [
{
"name": "variable_row",
"type": "row",
"label": "Имя параметра",
"elements": [
{
"name": "variable",
"type": "line",
"label": "Имя параметра",
"placeholder": "Введите имя параметра"
}
]
},
{
"name": "value_row",
"type": "row",
"label": "Параметр",
"elements": [
{
"name": "value",
"type": "area",
"label": "Параметр",
"placeholder": "Введите значение"
}
]
},
{
"name": "link_row",
"type": "row",
"label": "Связь",
"link_port": {
"id": "then_output",
"label": "then"
},
"elements": []
}
]
}
# Дескриптор формы для узла Wait
WAIT_FORM_DESCRIPTOR = {
"elements": [
{
"name": "type_row",
"type": "row",
"label": "Параметр",
"elements": [
{
"name": "type",
"type": "select",
"label": "Параметр",
"data": ["seconds", "datetime"],
"placeholder": "Выбранный вариант"
}
]
},
{
"name": "wait_for_row",
"type": "row",
"label": "Время",
"elements": [
{
"name": "wait_for",
"type": "number",
"label": "Время",
"placeholder": "Вычислить значение ожидания в секундах"
}
]
},
{
"name": "wait_datetime_row",
"type": "row",
"label": "Подождать",
"elements": [
{
"name": "wait_datetime",
"type": "date",
"label": "Подождать",
"placeholder": "Вычислить значение до определённого времени"
}
]
},
{
"name": "then_row",
"type": "row",
"label": "Переход",
"link_port": {
"id": "then_output",
"label": "then"
}
}
]
}
# Дескриптор формы для узла While
WHILE_FORM_DESCRIPTOR = {
"elements": [
{
"name": "condition_row",
"type": "row",
"label": "Параметр",
"link_port": {
"id": "then_output",
"label": "Then"
},
"elements": [
{
"name": "condition",
"type": "area",
"label": "Параметр",
"placeholder": "P(condition) == true"
}
]
},
{
"name": "else_row",
"type": "row",
"label": "Альтернативный путь",
"link_port": {
"id": "else_output",
"label": "Else"
}
}
]
}
# Дескриптор формы для узла Each
EACH_FORM_DESCRIPTOR = {
"elements": [
{
"name": "list_row",
"type": "row",
"label": "Список",
"link_port": {
"id": "then_output",
"label": "Then"
},
"elements": [
{
"name": "list",
"type": "line",
"label": "Список",
"placeholder": "Валидация списка и получение очередного value из списка"
}
]
},
{
"name": "else_row",
"type": "row",
"label": "Альтернативный путь",
"link_port": {
"id": "else_output",
"label": "Else"
}
}
]
}
# Маппинг типов узлов на дескрипторы форм
FORM_DESCRIPTORS = {
"IF": IF_FORM_DESCRIPTOR,
"LISTEN": LISTEN_FORM_DESCRIPTOR,
"TRIGGER": TRIGGER_FORM_DESCRIPTOR,
"RUN": RUN_FORM_DESCRIPTOR,
"CALLBACK": CALLBACK_FORM_DESCRIPTOR,
"SWITCH": SWITCH_FORM_DESCRIPTOR,
"SET": SET_FORM_DESCRIPTOR,
"WAIT": WAIT_FORM_DESCRIPTOR,
"WHILE": WHILE_FORM_DESCRIPTOR,
"EACH": EACH_FORM_DESCRIPTOR,
}
def get_form_descriptor(node_type: str) -> Dict[str, Any]:
"""
Получить дескриптор формы для указанного типа узла
Args:
node_type: Тип узла (например, "node_if")
Returns:
Dict с дескриптором формы или пустой dict если тип не найден
"""
return FORM_DESCRIPTORS.get(node_type, {})

View File

@@ -57,9 +57,10 @@ class VorkNodeLink:
# Перевалидируем данные # Перевалидируем данные
validated_data = self.validate_data() validated_data = self.validate_data()
else: else:
# Если имя уже указано, оставляем его как есть old_link_name = edge_title_to_number(validated_data.last_link_name)
# (не пытаемся преобразовать произвольные имена в номера) new_link_name = self.generate_link_name(old_link_name + 1)
pass self.data['last_link_name'] = new_link_name
validated_data = self.validate_data()
# Создаем схему с валидированными данными # Создаем схему с валидированными данными
return VorkNodeLinkSchema( return VorkNodeLinkSchema(

View File

@@ -1,10 +1,8 @@
from typing import Dict, Any, Optional from typing import Dict, Any
from .vork_node import VorkNode from .vork_node import VorkNode
from model_nodes.node_start_models import ( from model_nodes.node_start_models import (
StartNodeData, StartNodeData,
StartNodeLinks,
StartNodeCoreSchema, StartNodeCoreSchema,
StartNodeDescriptor,
StartNodeCoreSchemaData StartNodeCoreSchemaData
) )

View File

@@ -1,18 +1,41 @@
# Экспорты для моделей узла listen # Экспорты для моделей узла listen
# from .node_listen_models import ( from .node_listen_models import (
# ListenNodeData, ListenNodeData,
# ListenNodeLinks, ListenNodeLinks,
# ListenNodePSNodeCore, ListenNodeCoreSchema,
# ListenNodeSettingsDataCore ListenNodeCoreSchemaData
# ) )
# Экспорты для моделей узла trigger
from .node_trigger_models import (
TriggerNodeData,
TriggerNodeLinks,
TriggerNodeCoreSchema,
TriggerNodeCoreSchemaData
)
# Экспорты для моделей узла run
from .node_run_models import (
RunNodeData,
RunNodeLinks,
RunNodeCoreSchema,
RunNodeCoreSchemaData
)
# Экспорты для моделей узла callback
from .node_callback_models import (
CallbackNodeData,
CallbackNodeLinks,
CallbackNodeCoreSchema,
CallbackNodeCoreSchemaData
)
# Экспорты для моделей узла if # Экспорты для моделей узла if
from .node_if_models import ( from .node_if_models import (
IfNodeData, IfNodeData,
IfNodeLinks, IfNodeLinks,
IfNodeCoreSchema, IfNodeCoreSchema,
IfNodeCoreSchemaData, IfNodeCoreSchemaData
IfNodeDescriptor
) )
# Экспорты для моделей узла start # Экспорты для моделей узла start
@@ -20,8 +43,47 @@ from .node_start_models import (
StartNodeData, StartNodeData,
StartNodeLinks, StartNodeLinks,
StartNodeCoreSchema, StartNodeCoreSchema,
StartNodeCoreSchemaData, StartNodeCoreSchemaData
StartNodeDescriptor )
# Экспорты для моделей узла switch
from .node_switch_models import (
SwitchNodeData,
SwitchNodeLinks,
SwitchNodeCoreSchema,
SwitchNodeCoreSchemaData
)
# Экспорты для моделей узла set
from .node_set_models import (
SetNodeData,
SetNodeLinks,
SetNodeCoreSchema,
SetNodeCoreSchemaData
)
# Экспорты для моделей узла wait
from .node_wait_models import (
WaitNodeData,
WaitNodeLinks,
WaitNodeCoreSchema,
WaitNodeCoreSchemaData
)
# Экспорты для моделей узла while
from .node_while_models import (
WhileNodeData,
WhileNodeLinks,
WhileNodeCoreSchema,
WhileNodeCoreSchemaData
)
# Экспорты для моделей узла each
from .node_each_models import (
EachNodeData,
EachNodeLinks,
EachNodeCoreSchema,
EachNodeCoreSchemaData
) )
# Экспорты для моделей связей между узлами # Экспорты для моделей связей между узлами
@@ -32,24 +94,70 @@ from .node_link_models import (
__all__ = [ __all__ = [
# Listen node models # Listen node models
# "ListenNodeData", "ListenNodeData",
# "ListenNodeLinks", "ListenNodeLinks",
# "ListenNodePSNodeCore", "ListenNodeCoreSchema",
# "ListenNodeSettingsDataCore", "ListenNodeCoreSchemaData",
# Trigger node models
"TriggerNodeData",
"TriggerNodeLinks",
"TriggerNodeCoreSchema",
"TriggerNodeCoreSchemaData",
# Run node models
"RunNodeData",
"RunNodeLinks",
"RunNodeCoreSchema",
"RunNodeCoreSchemaData",
# Callback node models
"CallbackNodeData",
"CallbackNodeLinks",
"CallbackNodeCoreSchema",
"CallbackNodeCoreSchemaData",
# If node models # If node models
"IfNodeData", "IfNodeData",
"IfNodeLinks", "IfNodeLinks",
"IfNodeCoreSchema", "IfNodeCoreSchema",
"IfNodeCoreSchemaData", "IfNodeCoreSchemaData",
"IfNodeDescriptor",
# Start node models # Start node models
"StartNodeData", "StartNodeData",
"StartNodeLinks", "StartNodeLinks",
"StartNodeCoreSchema", "StartNodeCoreSchema",
"StartNodeCoreSchemaData", "StartNodeCoreSchemaData",
"StartNodeDescriptor",
# Switch node models
"SwitchNodeData",
"SwitchNodeLinks",
"SwitchNodeCoreSchema",
"SwitchNodeCoreSchemaData",
# Set node models
"SetNodeData",
"SetNodeLinks",
"SetNodeCoreSchema",
"SetNodeCoreSchemaData",
# Wait node models
"WaitNodeData",
"WaitNodeLinks",
"WaitNodeCoreSchema",
"WaitNodeCoreSchemaData",
# While node models
"WhileNodeData",
"WhileNodeLinks",
"WhileNodeCoreSchema",
"WhileNodeCoreSchemaData",
# Each node models
"EachNodeData",
"EachNodeLinks",
"EachNodeCoreSchema",
"EachNodeCoreSchemaData",
# Node link models # Node link models
"VorkNodeLinkData", "VorkNodeLinkData",

View File

@@ -0,0 +1,36 @@
from typing import Optional
from pydantic import BaseModel, Field
class CallbackNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла callback
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class CallbackNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла callback
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class CallbackNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла callback
"""
then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи Then (LINK)")
class CallbackNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла callback
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[CallbackNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -0,0 +1,37 @@
from typing import Optional
from pydantic import BaseModel, Field
class EachNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла each
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class EachNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла each
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class EachNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла each
"""
then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи Then (LINK)")
else_port_number: Optional[int] = Field(default=1, description="Номер порта для перехода по Связи Else (LINK)")
class EachNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла each
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[EachNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -1,4 +1,4 @@
from typing import Optional, Dict, Any from typing import Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@@ -35,10 +35,3 @@ class IfNodeCoreSchema(BaseModel):
parent_id: Optional[int] = Field(default=None, description="ID родительского узла") parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла") parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[IfNodeCoreSchemaData] = Field(default=None, description="Данные узла") data: Optional[IfNodeCoreSchemaData] = Field(default=None, description="Данные узла")
class IfNodeDescriptor(BaseModel):
"""
Pydantic модель для дескриптора узла if
"""
condition: Optional[str] = Field(default=None, description="Условие для проверки (PREDICATE)")

View File

@@ -1,33 +1,38 @@
# from multiprocessing import process from typing import Optional
# from typing import Optional, Dict, Any from pydantic import BaseModel, Field
# from pydantic import BaseModel, Field
# from orm.schemas.base import Base
# class ListenNodeData(Base): class ListenNodeData(BaseModel):
# """ """
# Поле Data для Core Pydantic модель для валидации данных узла listen
# """ """
# process_schema_id: Optional[int] = Field(default=None, description="ID процесса") ps_id: Optional[int] = Field(default=None, description="ID процесса")
# node_type: str = Field(description="Тип узла") node_type: Optional[str] = Field(default=None, description="Тип узла")
is_start: bool = Field(default=False, description="Является ли узел стартовым")
# class ListenNodeLinks(Base): class ListenNodeLinks(BaseModel):
# """ """
# Поле Links для Core Pydantic модель для валидации связей узла listen
# """ """
# node_port_number: Optional[int] = Field(default=0, description="Источник данных") parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
# class ListenNodePSNodeCore(Base): class ListenNodeCoreSchemaData(BaseModel):
# """ """
# Данные для PS_Node которые уходят из Core Pydantic модель для данных портов узла listen
# """ """
# process_schema_id: Optional[int] = Field(default=None, description="ID процесса") then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи Then (LINK)")
# node_type: str = Field(description="Тип узла") is_start: bool = Field(default=False, description="Является ли узел стартовым")
# class ListenNodeSettingsDataCore(Base):
# """ class ListenNodeCoreSchema(BaseModel):
# Данные для process_schema Settings которые уходят из Core """
# """ Pydantic модель для схемы узла listen
# node_port_number: Optional[int] = Field(default=0, description="Источник данных") """
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[ListenNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -0,0 +1,36 @@
from typing import Optional
from pydantic import BaseModel, Field
class RunNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла run
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class RunNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла run
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class RunNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла run
"""
then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи Then (LINK)")
class RunNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла run
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[RunNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -0,0 +1,36 @@
from typing import Optional
from pydantic import BaseModel, Field
class SetNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла set
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class SetNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла set
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class SetNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла set
"""
then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи then (LINK)")
class SetNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла set
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[SetNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -31,10 +31,3 @@ class StartNodeCoreSchema(BaseModel):
ps_id: Optional[int] = Field(default=None, description="ID процесса") ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла") node_type: Optional[str] = Field(default=None, description="Тип узла")
data: Optional[StartNodeCoreSchemaData] = Field(default=None, description="Данные узла") data: Optional[StartNodeCoreSchemaData] = Field(default=None, description="Данные узла")
class StartNodeDescriptor(BaseModel):
"""
Pydantic модель для дескриптора узла start
"""
# Start узел не имеет дополнительных параметров, это точка входа в процесс

View File

@@ -0,0 +1,37 @@
from typing import Optional
from pydantic import BaseModel, Field
class SwitchNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла switch
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class SwitchNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла switch
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class SwitchNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла switch
"""
default_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи default (LINK)")
case_1_port_number: Optional[int] = Field(default=1, description="Номер порта для перехода по Связи case_1 (LINK)")
class SwitchNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла switch
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[SwitchNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -0,0 +1,36 @@
from typing import Optional
from pydantic import BaseModel, Field
class TriggerNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла trigger
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class TriggerNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла trigger
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class TriggerNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла trigger
"""
then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи Then (LINK)")
class TriggerNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла trigger
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[TriggerNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -0,0 +1,36 @@
from typing import Optional
from pydantic import BaseModel, Field
class WaitNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла wait
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class WaitNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла wait
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class WaitNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла wait
"""
then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи then (LINK)")
class WaitNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла wait
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[WaitNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -0,0 +1,37 @@
from typing import Optional
from pydantic import BaseModel, Field
class WhileNodeData(BaseModel):
"""
Pydantic модель для валидации данных узла while
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
class WhileNodeLinks(BaseModel):
"""
Pydantic модель для валидации связей узла while
"""
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
class WhileNodeCoreSchemaData(BaseModel):
"""
Pydantic модель для данных портов узла while
"""
then_port_number: Optional[int] = Field(default=0, description="Номер порта для перехода по Связи Then (LINK)")
else_port_number: Optional[int] = Field(default=1, description="Номер порта для перехода по Связи Else (LINK)")
class WhileNodeCoreSchema(BaseModel):
"""
Pydantic модель для схемы узла while
"""
ps_id: Optional[int] = Field(default=None, description="ID процесса")
node_type: Optional[str] = Field(default=None, description="Тип узла")
parent_id: Optional[int] = Field(default=None, description="ID родительского узла")
parent_port_number: Optional[int] = Field(default=None, description="Номер порта родительского узла")
data: Optional[WhileNodeCoreSchemaData] = Field(default=None, description="Данные узла")

View File

@@ -1,18 +1,73 @@
from typing import Dict, Any
import requests
import json
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_callback_models import (
CallbackNodeData,
CallbackNodeLinks,
CallbackNodeCoreSchema,
CallbackNodeCoreSchemaData
)
class VorkNodeCallback(VorkNode): class VorkNodeCallback(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла callback
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_callback" return "CALLBACK"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла Callback
"""
return get_form_descriptor("CALLBACK")
def validate(self) -> bool: def validate(self) -> CallbackNodeCoreSchema:
return True """
Валидирует данные узла callback и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
node_data = CallbackNodeCoreSchemaData(
then_port_number=0
)
# Создаем схему с валидированными данными
return CallbackNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Callback node validation error: {e}")
raise
def validate_data(self) -> CallbackNodeData:
"""
Валидирует данные узла callback
"""
return CallbackNodeData(**self.data)
def validate_links(self) -> CallbackNodeLinks:
"""
Валидирует связи узла callback
"""
return CallbackNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -1,18 +1,73 @@
from typing import Dict, Any
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_each_models import (
EachNodeData,
EachNodeLinks,
EachNodeCoreSchema,
EachNodeCoreSchemaData
)
class VorkNodeEach(VorkNode): class VorkNodeEach(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла each
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_each" return "EACH"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла Each
"""
return get_form_descriptor("EACH")
def validate(self) -> bool: def validate(self) -> EachNodeCoreSchema:
return True """
Валидирует данные узла each и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
# Создаем данные портов (аналогично if)
node_data = EachNodeCoreSchemaData(
then_port_number=0,
else_port_number=1,
)
# Создаем схему с валидированными данными
return EachNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Each node validation error: {e}")
raise
def validate_data(self) -> EachNodeData:
"""
Валидирует данные узла each
"""
return EachNodeData(**self.data)
def validate_links(self) -> EachNodeLinks:
"""
Валидирует связи узла each
"""
return EachNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -1,11 +1,11 @@
from typing import Dict, Any from typing import Any, Dict
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_if_models import ( from model_nodes.node_if_models import (
IfNodeData, IfNodeData,
IfNodeLinks, IfNodeLinks,
IfNodeCoreSchema, IfNodeCoreSchema,
IfNodeCoreSchemaData, IfNodeCoreSchemaData
IfNodeDescriptor
) )
@@ -16,8 +16,11 @@ class VorkNodeIf(VorkNode):
return "IF" return "IF"
@classmethod @classmethod
def form(cls) -> IfNodeDescriptor: def form(cls) -> Dict[str, Any]:
return IfNodeDescriptor() """
Возвращает статический дескриптор формы для узла IF
"""
return get_form_descriptor("IF")
def validate(self) -> IfNodeCoreSchema: def validate(self) -> IfNodeCoreSchema:
""" """
@@ -58,5 +61,5 @@ class VorkNodeIf(VorkNode):
return IfNodeLinks(**self.links) return IfNodeLinks(**self.links)
def process(self, context: Any) -> bool: def process(self, context):
return True pass

View File

@@ -1,25 +1,72 @@
from typing import Dict, Any from typing import Dict, Any
from core import VorkNode from core import VorkNode
# from model_nodes.node_listen_models import ( from core.form_descriptors import get_form_descriptor
# ListenNodeData, from model_nodes.node_listen_models import (
# ListenNodeLinks, ListenNodeData,
# ListenNodePSNodeCore, ListenNodeLinks,
# ListenNodeSettingsDataCore ListenNodeCoreSchema,
# ) ListenNodeCoreSchemaData
)
class VorkNodeListen(VorkNode): class VorkNodeListen(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла listen
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "LISTEN" return "LISTEN"
@classmethod @classmethod
def form(cls) -> Dict[str, Any]: def form(cls) -> Dict[str, Any]:
return cls.get_schema() """
Возвращает статический дескриптор формы для узла Listen
"""
return get_form_descriptor("LISTEN")
def validate(self) -> bool: def validate(self) -> ListenNodeCoreSchema:
return True """
Валидирует данные узла listen и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
node_data = ListenNodeCoreSchemaData(
then_port_number=0,
is_start=validated_data.is_start
)
# Создаем схему с валидированными данными
return ListenNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Listen node validation error: {e}")
raise
def validate_data(self) -> ListenNodeData:
"""
Валидирует данные узла listen
"""
return ListenNodeData(**self.data)
def validate_links(self) -> ListenNodeLinks:
"""
Валидирует связи узла listen
"""
return ListenNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -1,18 +1,75 @@
from typing import Dict, Any
import json
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_run_models import (
RunNodeData,
RunNodeLinks,
RunNodeCoreSchema,
RunNodeCoreSchemaData
)
class VorkNodeRun(VorkNode): class VorkNodeRun(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла run
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_run" return "RUN"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла Run
"""
return get_form_descriptor("RUN")
def validate(self) -> bool: def validate(self) -> RunNodeCoreSchema:
return True """
Валидирует данные узла run и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
node_data = RunNodeCoreSchemaData(
then_port_number=0
)
# Создаем схему с валидированными данными
return RunNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Run node validation error: {e}")
raise
def validate_data(self) -> RunNodeData:
"""
Валидирует данные узла run
"""
return RunNodeData(**self.data)
def validate_links(self) -> RunNodeLinks:
"""
Валидирует связи узла run
"""
return RunNodeLinks(**self.links)
def process(self, context): def process(self, context):
"""
Обрабатывает логику узла run - выполнение встроенной задачи
"""
pass pass

View File

@@ -1,18 +1,72 @@
from typing import Dict, Any
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_set_models import (
SetNodeData,
SetNodeLinks,
SetNodeCoreSchema,
SetNodeCoreSchemaData
)
class VorkNodeSet(VorkNode): class VorkNodeSet(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла set
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_set" return "SET"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла Set
"""
return get_form_descriptor("SET")
def validate(self) -> bool: def validate(self) -> SetNodeCoreSchema:
return True """
Валидирует данные узла set и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
# Создаем данные портов
node_data = SetNodeCoreSchemaData(
then_port_number=0,
)
# Создаем схему с валидированными данными
return SetNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Set node validation error: {e}")
raise
def validate_data(self) -> SetNodeData:
"""
Валидирует данные узла set
"""
return SetNodeData(**self.data)
def validate_links(self) -> SetNodeLinks:
"""
Валидирует связи узла set
"""
return SetNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -1,18 +1,73 @@
from typing import Dict, Any
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_switch_models import (
SwitchNodeData,
SwitchNodeLinks,
SwitchNodeCoreSchema,
SwitchNodeCoreSchemaData
)
class VorkNodeSwitch(VorkNode): class VorkNodeSwitch(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла switch
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_switch" return "SWITCH"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла Switch
"""
return get_form_descriptor("SWITCH")
def validate(self) -> bool: def validate(self) -> SwitchNodeCoreSchema:
return True """
Валидирует данные узла switch и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
# Создаем данные портов (default=0, case_1=1)
node_data = SwitchNodeCoreSchemaData(
default_port_number=0,
case_1_port_number=1,
)
# Создаем схему с валидированными данными
return SwitchNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Switch node validation error: {e}")
raise
def validate_data(self) -> SwitchNodeData:
"""
Валидирует данные узла switch
"""
return SwitchNodeData(**self.data)
def validate_links(self) -> SwitchNodeLinks:
"""
Валидирует связи узла switch
"""
return SwitchNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -1,18 +1,71 @@
from typing import Dict, Any
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_trigger_models import (
TriggerNodeData,
TriggerNodeLinks,
TriggerNodeCoreSchema,
TriggerNodeCoreSchemaData
)
class VorkNodeTrigger(VorkNode): class VorkNodeTrigger(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла trigger
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_trigger" return "TRIGGER"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла Trigger
"""
return get_form_descriptor("TRIGGER")
def validate(self) -> bool: def validate(self) -> TriggerNodeCoreSchema:
return True """
Валидирует данные узла trigger и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
node_data = TriggerNodeCoreSchemaData(
then_port_number=0
)
# Создаем схему с валидированными данными
return TriggerNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Trigger node validation error: {e}")
raise
def validate_data(self) -> TriggerNodeData:
"""
Валидирует данные узла trigger
"""
return TriggerNodeData(**self.data)
def validate_links(self) -> TriggerNodeLinks:
"""
Валидирует связи узла trigger
"""
return TriggerNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -1,18 +1,72 @@
from typing import Dict, Any
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_wait_models import (
WaitNodeData,
WaitNodeLinks,
WaitNodeCoreSchema,
WaitNodeCoreSchemaData
)
class VorkNodeWait(VorkNode): class VorkNodeWait(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла wait
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_wait" return "WAIT"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла Wait
"""
return get_form_descriptor("WAIT")
def validate(self) -> bool: def validate(self) -> WaitNodeCoreSchema:
return True """
Валидирует данные узла wait и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
# Создаем данные портов
node_data = WaitNodeCoreSchemaData(
then_port_number=0,
)
# Создаем схему с валидированными данными
return WaitNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"Wait node validation error: {e}")
raise
def validate_data(self) -> WaitNodeData:
"""
Валидирует данные узла wait
"""
return WaitNodeData(**self.data)
def validate_links(self) -> WaitNodeLinks:
"""
Валидирует связи узла wait
"""
return WaitNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -1,18 +1,73 @@
from typing import Dict, Any
from core import VorkNode from core import VorkNode
from core.form_descriptors import get_form_descriptor
from model_nodes.node_while_models import (
WhileNodeData,
WhileNodeLinks,
WhileNodeCoreSchema,
WhileNodeCoreSchemaData
)
class VorkNodeWhile(VorkNode): class VorkNodeWhile(VorkNode):
def __init__(self, data: Dict[str, Any], links: Dict[str, Any] = None):
"""
Инициализация узла while
"""
super().__init__(data, links or {})
@property @property
def id(self) -> str: def id(self) -> str:
return "node_while" return "WHILE"
@classmethod @classmethod
def form(cls): def form(cls) -> Dict[str, Any]:
pass """
Возвращает статический дескриптор формы для узла While
"""
return get_form_descriptor("WHILE")
def validate(self) -> bool: def validate(self) -> WhileNodeCoreSchema:
return True """
Валидирует данные узла while и возвращает схему
"""
try:
# Валидируем данные узла
validated_data = self.validate_data()
# Валидируем связи узла
validated_links = self.validate_links()
# Создаем данные портов (аналогично if)
node_data = WhileNodeCoreSchemaData(
then_port_number=0,
else_port_number=1,
)
# Создаем схему с валидированными данными
return WhileNodeCoreSchema(
ps_id=validated_data.ps_id,
node_type=validated_data.node_type,
parent_id=validated_links.parent_id,
parent_port_number=validated_links.parent_port_number,
data=node_data
)
except Exception as e:
print(f"While node validation error: {e}")
raise
def validate_data(self) -> WhileNodeData:
"""
Валидирует данные узла while
"""
return WhileNodeData(**self.data)
def validate_links(self) -> WhileNodeLinks:
"""
Валидирует связи узла while
"""
return WhileNodeLinks(**self.links)
def process(self, context): def process(self, context):
pass pass

View File

@@ -69,6 +69,14 @@ class NodeType(Enum):
LISTEN = "LISTEN" LISTEN = "LISTEN"
IF = "IF" IF = "IF"
START = "START" START = "START"
CALLBACK = "CALLBACK"
EACH = "EACH"
RUN = "RUN"
SET = "SET"
SWITCH = "SWITCH"
TRIGGER = "TRIGGER"
WAIT = "WAIT"
WHILE = "WHILE"
ps_node_table = Table( ps_node_table = Table(