170 lines
9.2 KiB
Python
170 lines
9.2 KiB
Python
# Copyright (c) 2026 Patrick Motsch
|
|
# All rights reserved.
|
|
"""Redmine node definitions - map to MethodRedmine actions."""
|
|
|
|
from modules.shared.i18nRegistry import t
|
|
|
|
REDMINE_NODES = [
|
|
{
|
|
"id": "redmine.readTicket",
|
|
"category": "redmine",
|
|
"label": t("Ticket lesen"),
|
|
"description": t("Einzelnes Redmine-Ticket aus dem Mirror laden."),
|
|
"parameters": [
|
|
{"name": "featureInstanceId", "type": "string", "required": True, "frontendType": "hidden",
|
|
"description": t("Redmine Feature-Instanz-ID")},
|
|
{"name": "ticketId", "type": "number", "required": True, "frontendType": "number",
|
|
"description": t("Redmine-Ticket-ID")},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-ticket-outline", "color": "#4A6FA5", "usesAi": False},
|
|
"_method": "redmine",
|
|
"_action": "readTicket",
|
|
},
|
|
{
|
|
"id": "redmine.listTickets",
|
|
"category": "redmine",
|
|
"label": t("Tickets auflisten"),
|
|
"description": t("Tickets aus dem lokalen Mirror mit Filtern (Tracker, Status, Zeitraum, Zuweisung)."),
|
|
"parameters": [
|
|
{"name": "featureInstanceId", "type": "string", "required": True, "frontendType": "hidden",
|
|
"description": t("Redmine Feature-Instanz-ID")},
|
|
{"name": "trackerIds", "type": "string", "required": False, "frontendType": "text",
|
|
"description": t("Tracker-IDs (Komma-separiert)"), "default": ""},
|
|
{"name": "status", "type": "string", "required": False, "frontendType": "text",
|
|
"description": t("Status-Filter: open | closed | *"), "default": "*"},
|
|
{"name": "dateFrom", "type": "string", "required": False, "frontendType": "date",
|
|
"description": t("Zeitraum ab (ISO-Datum)"), "default": ""},
|
|
{"name": "dateTo", "type": "string", "required": False, "frontendType": "date",
|
|
"description": t("Zeitraum bis (ISO-Datum)"), "default": ""},
|
|
{"name": "assignedToId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Nur Tickets dieses Benutzers (ID)")},
|
|
{"name": "limit", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Max. Anzahl Tickets (1-500)"), "default": 100},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-format-list-bulleted", "color": "#4A6FA5", "usesAi": False},
|
|
"_method": "redmine",
|
|
"_action": "listTickets",
|
|
},
|
|
{
|
|
"id": "redmine.createTicket",
|
|
"category": "redmine",
|
|
"label": t("Ticket erstellen"),
|
|
"description": t("Neues Ticket in Redmine anlegen. Mirror wird sofort aktualisiert."),
|
|
"parameters": [
|
|
{"name": "featureInstanceId", "type": "string", "required": True, "frontendType": "hidden",
|
|
"description": t("Redmine Feature-Instanz-ID")},
|
|
{"name": "subject", "type": "string", "required": True, "frontendType": "text",
|
|
"description": t("Ticket-Titel")},
|
|
{"name": "trackerId", "type": "number", "required": True, "frontendType": "number",
|
|
"description": t("Tracker-ID (Userstory, Feature, Task, ...)")},
|
|
{"name": "description", "type": "string", "required": False, "frontendType": "textarea",
|
|
"description": t("Ticket-Beschreibung"), "default": ""},
|
|
{"name": "statusId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Status-ID (optional)")},
|
|
{"name": "priorityId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Prioritaet-ID (optional)")},
|
|
{"name": "assignedToId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Zugewiesene Benutzer-ID (optional)")},
|
|
{"name": "parentIssueId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Uebergeordnetes Ticket (optional)")},
|
|
{"name": "customFields", "type": "string", "required": False, "frontendType": "textarea",
|
|
"description": t("Custom Fields als JSON {id: value}"), "default": ""},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-ticket-plus-outline", "color": "#4A6FA5", "usesAi": False},
|
|
"_method": "redmine",
|
|
"_action": "createTicket",
|
|
},
|
|
{
|
|
"id": "redmine.updateTicket",
|
|
"category": "redmine",
|
|
"label": t("Ticket bearbeiten"),
|
|
"description": t("Felder eines Redmine-Tickets aktualisieren. Nur gesetzte Felder werden uebertragen."),
|
|
"parameters": [
|
|
{"name": "featureInstanceId", "type": "string", "required": True, "frontendType": "hidden",
|
|
"description": t("Redmine Feature-Instanz-ID")},
|
|
{"name": "ticketId", "type": "number", "required": True, "frontendType": "number",
|
|
"description": t("Ticket-ID")},
|
|
{"name": "subject", "type": "string", "required": False, "frontendType": "text",
|
|
"description": t("Neuer Titel")},
|
|
{"name": "description", "type": "string", "required": False, "frontendType": "textarea",
|
|
"description": t("Neue Beschreibung")},
|
|
{"name": "trackerId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Neuer Tracker")},
|
|
{"name": "statusId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Neuer Status")},
|
|
{"name": "priorityId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Neue Prioritaet")},
|
|
{"name": "assignedToId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Neue Zuweisung")},
|
|
{"name": "parentIssueId", "type": "number", "required": False, "frontendType": "number",
|
|
"description": t("Neues Parent-Ticket")},
|
|
{"name": "notes", "type": "string", "required": False, "frontendType": "textarea",
|
|
"description": t("Kommentar (Journal-Eintrag)"), "default": ""},
|
|
{"name": "customFields", "type": "string", "required": False, "frontendType": "textarea",
|
|
"description": t("Custom Fields als JSON {id: value}"), "default": ""},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-ticket-confirmation-outline", "color": "#4A6FA5", "usesAi": False},
|
|
"_method": "redmine",
|
|
"_action": "updateTicket",
|
|
},
|
|
{
|
|
"id": "redmine.getStats",
|
|
"category": "redmine",
|
|
"label": t("Statistik laden"),
|
|
"description": t("Aggregierte Kennzahlen (KPIs, Durchsatz, Status-Verteilung, Backlog) aus dem Mirror."),
|
|
"parameters": [
|
|
{"name": "featureInstanceId", "type": "string", "required": True, "frontendType": "hidden",
|
|
"description": t("Redmine Feature-Instanz-ID")},
|
|
{"name": "dateFrom", "type": "string", "required": False, "frontendType": "date",
|
|
"description": t("Zeitraum ab")},
|
|
{"name": "dateTo", "type": "string", "required": False, "frontendType": "date",
|
|
"description": t("Zeitraum bis")},
|
|
{"name": "bucket", "type": "string", "required": False, "frontendType": "text",
|
|
"description": t("Bucket: day | week | month"), "default": "week"},
|
|
{"name": "trackerIds", "type": "string", "required": False, "frontendType": "text",
|
|
"description": t("Tracker-IDs (Komma-separiert)"), "default": ""},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-chart-bar", "color": "#4A6FA5", "usesAi": False},
|
|
"_method": "redmine",
|
|
"_action": "getStats",
|
|
},
|
|
{
|
|
"id": "redmine.runSync",
|
|
"category": "redmine",
|
|
"label": t("Mirror synchronisieren"),
|
|
"description": t("Tickets und Beziehungen aus Redmine in den lokalen Mirror uebernehmen."),
|
|
"parameters": [
|
|
{"name": "featureInstanceId", "type": "string", "required": True, "frontendType": "hidden",
|
|
"description": t("Redmine Feature-Instanz-ID")},
|
|
{"name": "force", "type": "boolean", "required": False, "frontendType": "checkbox",
|
|
"description": t("Vollsync erzwingen (ignoriert lastSyncAt)"), "default": False},
|
|
],
|
|
"inputs": 1,
|
|
"outputs": 1,
|
|
"inputPorts": {0: {"accepts": ["Transit"]}},
|
|
"outputPorts": {0: {"schema": "ActionResult"}},
|
|
"meta": {"icon": "mdi-database-sync", "color": "#4A6FA5", "usesAi": False},
|
|
"_method": "redmine",
|
|
"_action": "runSync",
|
|
},
|
|
]
|