101 lines
3.8 KiB
Python
101 lines
3.8 KiB
Python
# Copyright (c) 2025 Patrick Motsch
|
|
# All rights reserved.
|
|
|
|
"""
|
|
Import Tickets From JSON action for JIRA operations.
|
|
Imports ticket data from JSON back to JIRA.
|
|
"""
|
|
|
|
import logging
|
|
import json
|
|
from typing import Dict, Any
|
|
from modules.workflows.methods.methodBase import action
|
|
from modules.datamodels.datamodelChat import ActionResult, ActionDocument
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
@action
|
|
async def importTicketsFromJson(self, parameters: Dict[str, Any]) -> ActionResult:
|
|
"""
|
|
Import ticket data from JSON back to JIRA.
|
|
|
|
Parameters:
|
|
- connectionId (str, required): Connection ID from connectJira action result
|
|
- ticketData (str, required): Document reference containing ticket data as JSON
|
|
- taskSyncDefinition (str or dict, optional): Field mapping definition (if not provided, uses stored definition)
|
|
|
|
Returns:
|
|
- ActionResult with ActionDocument containing import result with counts
|
|
"""
|
|
try:
|
|
connectionIdParam = parameters.get("connectionId")
|
|
if not connectionIdParam:
|
|
return ActionResult.isFailure(error="connectionId parameter is required")
|
|
|
|
ticketDataParam = parameters.get("ticketData")
|
|
if not ticketDataParam:
|
|
return ActionResult.isFailure(error="ticketData parameter is required")
|
|
|
|
# Get connection ID from document if it's a reference
|
|
connectionId = None
|
|
if isinstance(connectionIdParam, str):
|
|
connectionInfo = self.documentParsing.parseJsonFromDocument(connectionIdParam)
|
|
if connectionInfo and "connectionId" in connectionInfo:
|
|
connectionId = connectionInfo["connectionId"]
|
|
else:
|
|
connectionId = connectionIdParam
|
|
|
|
if not connectionId or connectionId not in self._connections:
|
|
return ActionResult.isFailure(error=f"Connection ID {connectionIdParam} not found. Ensure connectJira was called first.")
|
|
|
|
connection = self._connections[connectionId]
|
|
syncInterface = connection["interface"]
|
|
|
|
# Get ticket data from document
|
|
ticketDataJson = self.documentParsing.parseJsonFromDocument(ticketDataParam)
|
|
if ticketDataJson is None:
|
|
return ActionResult.isFailure(error="Could not parse ticket data from document reference")
|
|
|
|
# Ensure it's a list
|
|
if not isinstance(ticketDataJson, list):
|
|
return ActionResult.isFailure(error="ticketData must be a JSON array")
|
|
|
|
# Import tickets
|
|
await syncInterface.importListToTickets(ticketDataJson)
|
|
|
|
logger.info(f"Imported {len(ticketDataJson)} tickets to JIRA")
|
|
|
|
# Generate filename
|
|
workflowContext = self.services.chat.getWorkflowContext() if hasattr(self.services, 'chat') else None
|
|
filename = self._generateMeaningfulFileName(
|
|
"jira_import_result",
|
|
"json",
|
|
workflowContext,
|
|
"importTicketsFromJson"
|
|
)
|
|
|
|
importResult = {
|
|
"imported": len(ticketDataJson),
|
|
"connectionId": connectionId,
|
|
}
|
|
|
|
validationMetadata = self._createValidationMetadata(
|
|
"importTicketsFromJson",
|
|
connectionId=connectionId,
|
|
importedCount=len(ticketDataJson)
|
|
)
|
|
|
|
document = ActionDocument(
|
|
documentName=filename,
|
|
documentData=json.dumps(importResult, indent=2),
|
|
mimeType="application/json",
|
|
validationMetadata=validationMetadata
|
|
)
|
|
|
|
return ActionResult.isSuccess(documents=[document])
|
|
|
|
except Exception as e:
|
|
errorMsg = f"Error importing tickets to JIRA: {str(e)}"
|
|
logger.error(errorMsg)
|
|
return ActionResult.isFailure(error=errorMsg)
|
|
|