diff --git a/modules/datamodels/__init__.py b/modules/datamodels/__init__.py index 7c45ab08..4bc577ee 100644 --- a/modules/datamodels/__init__.py +++ b/modules/datamodels/__init__.py @@ -10,7 +10,6 @@ Usage examples: from . import datamodelAi as ai from . import datamodelUam as uam from . import datamodelSecurity as security -from . import datamodelNeutralizer as neutralizer from . import datamodelChat as chat from . import datamodelFiles as files from . import datamodelVoice as voice diff --git a/modules/features/trustee/routeFeatureTrustee.py b/modules/features/trustee/routeFeatureTrustee.py index 196c8b18..e05f6dc0 100644 --- a/modules/features/trustee/routeFeatureTrustee.py +++ b/modules/features/trustee/routeFeatureTrustee.py @@ -154,13 +154,28 @@ async def getRoleOptions( async def getContractOptions( request: Request, instanceId: str = Path(..., description="Feature Instance ID"), + organisationId: Optional[str] = Query(None, description="Optional: Filter by organisation ID"), context: RequestContext = Depends(getRequestContext) ) -> List[Dict[str, Any]]: - """Get contract options for select dropdowns. Returns: [{ value, label }]""" + """ + Get contract options for select dropdowns. + + Optionally filter by organisationId to get only contracts for a specific organisation. + This is useful for dependent dropdowns in forms. + + Returns: [{ value, label }] + """ mandateId = await _validateInstanceAccess(instanceId, context) interface = getInterface(context.user, mandateId=mandateId, featureInstanceId=instanceId) - result = interface.getAllContracts(None) - items = result.items if hasattr(result, 'items') else result + + if organisationId: + # Gefiltert nach Organisation + items = interface.getContractsByOrganisation(organisationId) + else: + # Alle Contracts + result = interface.getAllContracts(None) + items = result.items if hasattr(result, 'items') else result + return [{"value": c.id, "label": c.label or c.name or c.id} for c in items] @@ -176,7 +191,7 @@ async def getDocumentOptions( interface = getInterface(context.user, mandateId=mandateId, featureInstanceId=instanceId) result = interface.getAllDocuments(None) items = result.items if hasattr(result, 'items') else result - return [{"value": d.id, "label": d.name or d.id} for d in items] + return [{"value": d.id, "label": d.documentName or d.id} for d in items] @router.get("/{instanceId}/positions/options", response_model=List[Dict[str, Any]]) @@ -191,7 +206,17 @@ async def getPositionOptions( interface = getInterface(context.user, mandateId=mandateId, featureInstanceId=instanceId) result = interface.getAllPositions(None) items = result.items if hasattr(result, 'items') else result - return [{"value": p.id, "label": p.title or p.id} for p in items] + # Erstelle Label aus Datum, Firma und Beschreibung + def _makePositionLabel(p): + parts = [] + if p.valuta: + parts.append(str(p.valuta)[:10]) # Datum ohne Zeit + if p.company: + parts.append(p.company[:30]) + if p.desc: + parts.append(p.desc[:30]) + return " - ".join(parts) if parts else p.id + return [{"value": p.id, "label": _makePositionLabel(p)} for p in items] # ============================================================================ diff --git a/modules/routes/routeAdminFeatures.py b/modules/routes/routeAdminFeatures.py index d5f1a8f5..575af01e 100644 --- a/modules/routes/routeAdminFeatures.py +++ b/modules/routes/routeAdminFeatures.py @@ -17,7 +17,7 @@ import logging from pydantic import BaseModel, Field from modules.auth import limiter, getRequestContext, RequestContext, requireSysAdmin -from modules.datamodels.datamodelUam import User +from modules.datamodels.datamodelUam import User, UserInDB from modules.datamodels.datamodelFeatures import Feature, FeatureInstance from modules.interfaces.interfaceDbApp import getRootInterface from modules.interfaces.interfaceFeatures import getFeatureInterface diff --git a/modules/routes/routeChat.py b/modules/routes/routeChat.py index 88d4a4b1..22aa764e 100644 --- a/modules/routes/routeChat.py +++ b/modules/routes/routeChat.py @@ -13,7 +13,7 @@ from fastapi import APIRouter, HTTPException, Depends, Body, Path, Query, Reques from modules.auth import limiter, getRequestContext, RequestContext # Import interfaces -from . import interfaceFeatureAiChat as interfaceDbChat +from modules.interfaces import interfaceDbChat # Import models from modules.datamodels.datamodelChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum diff --git a/modules/routes/routeSecurityLocal.py b/modules/routes/routeSecurityLocal.py index 41fe2cab..4c61cbc1 100644 --- a/modules/routes/routeSecurityLocal.py +++ b/modules/routes/routeSecurityLocal.py @@ -17,7 +17,7 @@ from jose import jwt from modules.auth import getCurrentUser, limiter, SECRET_KEY, ALGORITHM from modules.auth import createAccessToken, createRefreshToken, setAccessTokenCookie, setRefreshTokenCookie, clearAccessTokenCookie, clearRefreshTokenCookie from modules.interfaces.interfaceDbApp import getInterface, getRootInterface -from modules.datamodels.datamodelUam import User, UserInDB, AuthAuthority +from modules.datamodels.datamodelUam import User, UserInDB, AuthAuthority, Mandate from modules.datamodels.datamodelSecurity import Token from modules.shared.configuration import APP_CONFIG diff --git a/modules/shared/jsonUtils.py b/modules/shared/jsonUtils.py index 1fa5d30d..37c1ae36 100644 --- a/modules/shared/jsonUtils.py +++ b/modules/shared/jsonUtils.py @@ -5,7 +5,6 @@ import logging import re from typing import Any, Dict, List, Optional, Tuple, Union, Type, TypeVar from pydantic import BaseModel, ValidationError -from modules.datamodels.datamodelAi import ContinuationContext logger = logging.getLogger(__name__) @@ -867,7 +866,7 @@ def buildContinuationContext( lastRawResponse: Optional[str] = None, useCaseId: Optional[str] = None, templateStructure: Optional[str] = None -) -> ContinuationContext: +) -> "ContinuationContext": """ Build context information from accumulated sections for continuation prompt. @@ -882,6 +881,8 @@ def buildContinuationContext( Returns: ContinuationContext: Pydantic model with all continuation context information """ + # Lazy import to avoid circular dependency + from modules.datamodels.datamodelAi import ContinuationContext section_count = len(allSections) # Build summary of delivered data (per-section counts) diff --git a/scripts/function_imports_analysis.txt b/scripts/function_imports_analysis.txt index 23f26c9f..a3909ed4 100644 --- a/scripts/function_imports_analysis.txt +++ b/scripts/function_imports_analysis.txt @@ -2,10 +2,10 @@ FUNCTION IMPORTS ANALYSIS ================================================================================ -Total function imports (internal modules): 226 +Total function imports (internal modules): 229 - CIRCULAR (must stay): 4 - REDUNDANT (can remove): 0 - - MOVABLE (can move): 222 + - MOVABLE (can move): 225 ================================================================================ @@ -17,121 +17,6 @@ gateway.app ----------- [lifespan] modules.shared.auditLogger -gateway.modules.aichat.datamodelFeatureAiChat ---------------------------------------------- - [updateFromSelection] modules.datamodels.datamodelWorkflow - -gateway.modules.aichat.interfaceFeatureAiChat ---------------------------------------------- - [_enrichAutomationsWithUserAndMandate] modules.interfaces.interfaceDbApp - [storeDebugMessageAndDocuments] modules.interfaces.interfaceDbManagement - [setUserContext] modules.security.rootAccess - [_notifyAutomationChanged] modules.shared.callbackRegistry - [storeDebugMessageAndDocuments] modules.shared.debugLogger - -gateway.modules.aichat.serviceAi.mainServiceAi ----------------------------------------------- - [renderResult] modules.aichat.serviceGeneration.mainServiceGeneration - [_handleCodeGeneration] modules.aichat.serviceGeneration.paths.codePath - [_handleDocumentGeneration] modules.aichat.serviceGeneration.paths.documentPath - [_handleImageGeneration] modules.aichat.serviceGeneration.paths.imagePath - -gateway.modules.aichat.serviceAi.subContentExtraction ------------------------------------------------------ - [extractTextFromImage] modules.datamodels.datamodelAi - [processTextContentWithAi] modules.datamodels.datamodelAi - -gateway.modules.aichat.serviceAi.subJsonResponseHandling --------------------------------------------------------- - [mergeFragmentIntoSection] modules.shared.debugLogger - -gateway.modules.aichat.serviceAi.subStructureFilling ----------------------------------------------------- - [_getAcceptedSectionTypesForFormat] modules.aichat.serviceGeneration.renderers.registry - [_getAcceptedSectionTypesForFormat] modules.datamodels.datamodelJson - [buildSectionPromptWithContinuation] modules.shared.jsonContinuation - [_extractAndMergeMultipleJsonBlocks] modules.shared.jsonUtils - [_processAiResponseForSection] modules.shared.jsonUtils - [_processSingleSection] modules.shared.jsonUtils - -gateway.modules.aichat.serviceAi.subStructureGeneration -------------------------------------------------------- - [generateStructure] modules.aichat.serviceGeneration.renderers.registry - [generateStructure] modules.shared - [generateStructure] modules.shared.jsonContinuation - -gateway.modules.aichat.serviceExtraction.mainServiceExtraction --------------------------------------------------------------- - [extractContent] modules.interfaces.interfaceDbManagement - [extractContent] modules.shared.debugLogger - -gateway.modules.aichat.serviceExtraction.subPromptBuilderExtraction -------------------------------------------------------------------- - [buildExtractionPrompt] modules.shared.debugLogger - -gateway.modules.aichat.serviceGeneration.mainServiceGeneration --------------------------------------------------------------- - [getAdaptiveExtractionPrompt] modules.aichat.serviceExtraction.subPromptBuilderExtraction - [renderReport] modules.aichat.serviceGeneration.renderers.registry - [generateDocumentWithTwoPhases] modules.aichat.serviceGeneration.subContentGenerator - [generateDocumentWithTwoPhases] modules.aichat.serviceGeneration.subStructureGenerator - -gateway.modules.aichat.serviceGeneration.paths.codePath -------------------------------------------------------- - [_getCodeRenderer] modules.aichat.serviceGeneration.renderers.registry - [generateCode] modules.datamodels.datamodelDocument - [_generateCodeStructure] modules.shared.jsonContinuation - [_generateSingleFileContent] modules.shared.jsonContinuation - -gateway.modules.aichat.serviceGeneration.renderers.rendererDocx ---------------------------------------------------------------- - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.renderers.rendererHtml ---------------------------------------------------------------- - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.renderers.rendererImage ----------------------------------------------------------------- - [_compressPromptWithAi] modules.datamodels.datamodelAi - [_generateAiImage] modules.datamodels.datamodelAi - -gateway.modules.aichat.serviceGeneration.renderers.rendererJson ---------------------------------------------------------------- - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.renderers.rendererMarkdown -------------------------------------------------------------------- - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.renderers.rendererPdf --------------------------------------------------------------- - [_getAiStylesWithPdfColors] modules.datamodels.datamodelAi - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.renderers.rendererPptx ---------------------------------------------------------------- - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.renderers.rendererText ---------------------------------------------------------------- - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.renderers.rendererXlsx ---------------------------------------------------------------- - [_getAiStylesWithExcelColors] modules.datamodels.datamodelAi - [getAcceptedSectionTypes] modules.datamodels.datamodelJson - -gateway.modules.aichat.serviceGeneration.subContentGenerator ------------------------------------------------------------- - [_generateImageSection] modules.datamodels.datamodelAi - [_generateSimpleSection] modules.datamodels.datamodelAi - [_generateSimpleSection] modules.shared.jsonUtils - -gateway.modules.aichat.serviceGeneration.subStructureGenerator --------------------------------------------------------------- - [generateStructure] modules.datamodels.datamodelAi - gateway.modules.auth.authentication ----------------------------------- [requireSysAdmin] modules.shared.auditLogger @@ -150,6 +35,14 @@ gateway.modules.auth.tokenRefreshService [proactive_refresh] modules.security.rootAccess [refresh_expired_tokens] modules.security.rootAccess +gateway.modules.datamodels.datamodelChat +---------------------------------------- + [updateFromSelection] modules.datamodels.datamodelWorkflow + +gateway.modules.features.aichat.mainAiChat +------------------------------------------ + [onStart] modules.aicore.aicoreModelRegistry + gateway.modules.features.automation.routeFeatureAutomation ---------------------------------------------------------- [execute_automation] modules.services @@ -197,6 +90,14 @@ gateway.modules.interfaces.interfaceDbApp ----------------------------------------- [getRootInterface] modules.security.rootAccess +gateway.modules.interfaces.interfaceDbChat +------------------------------------------ + [_enrichAutomationsWithUserAndMandate] modules.interfaces.interfaceDbApp + [storeDebugMessageAndDocuments] modules.interfaces.interfaceDbManagement + [setUserContext] modules.security.rootAccess + [_notifyAutomationChanged] modules.shared.callbackRegistry + [storeDebugMessageAndDocuments] modules.shared.debugLogger + gateway.modules.interfaces.interfaceDbManagement ------------------------------------------------ [_initializeStandardPrompts] modules.interfaces.interfaceDbApp @@ -313,15 +214,123 @@ gateway.modules.security.rootAccess gateway.modules.services.__init__ --------------------------------- [__init__] modules.interfaces.interfaceDbApp + [__init__] modules.interfaces.interfaceDbChat [__init__] modules.interfaces.interfaceDbManagement +gateway.modules.services.serviceAi.mainAiChat +--------------------------------------------- + [onStart] modules.aicore.aicoreModelRegistry + +gateway.modules.services.serviceAi.mainServiceAi +------------------------------------------------ + [renderResult] modules.services.serviceGeneration.mainServiceGeneration + [_handleCodeGeneration] modules.services.serviceGeneration.paths.codePath + [_handleDocumentGeneration] modules.services.serviceGeneration.paths.documentPath + [_handleImageGeneration] modules.services.serviceGeneration.paths.imagePath + +gateway.modules.services.serviceAi.subContentExtraction +------------------------------------------------------- + [extractTextFromImage] modules.datamodels.datamodelAi + [processTextContentWithAi] modules.datamodels.datamodelAi + +gateway.modules.services.serviceAi.subJsonResponseHandling +---------------------------------------------------------- + [mergeFragmentIntoSection] modules.shared.debugLogger + +gateway.modules.services.serviceAi.subStructureFilling +------------------------------------------------------ + [_getAcceptedSectionTypesForFormat] modules.datamodels.datamodelJson + [_getAcceptedSectionTypesForFormat] modules.services.serviceGeneration.renderers.registry + [buildSectionPromptWithContinuation] modules.shared.jsonContinuation + [_extractAndMergeMultipleJsonBlocks] modules.shared.jsonUtils + [_processAiResponseForSection] modules.shared.jsonUtils + [_processSingleSection] modules.shared.jsonUtils + +gateway.modules.services.serviceAi.subStructureGeneration +--------------------------------------------------------- + [generateStructure] modules.services.serviceGeneration.renderers.registry + [generateStructure] modules.shared + [generateStructure] modules.shared.jsonContinuation + gateway.modules.services.serviceChat.mainServiceChat ---------------------------------------------------- [getChatDocumentsFromDocumentList] modules.datamodels.datamodelDocref +gateway.modules.services.serviceExtraction.mainServiceExtraction +---------------------------------------------------------------- + [extractContent] modules.interfaces.interfaceDbManagement + [extractContent] modules.shared.debugLogger + +gateway.modules.services.serviceExtraction.subPromptBuilderExtraction +--------------------------------------------------------------------- + [buildExtractionPrompt] modules.shared.debugLogger + +gateway.modules.services.serviceGeneration.mainServiceGeneration +---------------------------------------------------------------- + [getAdaptiveExtractionPrompt] modules.services.serviceExtraction.subPromptBuilderExtraction + [renderReport] modules.services.serviceGeneration.renderers.registry + [generateDocumentWithTwoPhases] modules.services.serviceGeneration.subContentGenerator + [generateDocumentWithTwoPhases] modules.services.serviceGeneration.subStructureGenerator + +gateway.modules.services.serviceGeneration.paths.codePath +--------------------------------------------------------- + [generateCode] modules.datamodels.datamodelDocument + [_getCodeRenderer] modules.services.serviceGeneration.renderers.registry + [_generateCodeStructure] modules.shared.jsonContinuation + [_generateSingleFileContent] modules.shared.jsonContinuation + +gateway.modules.services.serviceGeneration.renderers.rendererDocx +----------------------------------------------------------------- + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.renderers.rendererHtml +----------------------------------------------------------------- + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.renderers.rendererImage +------------------------------------------------------------------ + [_compressPromptWithAi] modules.datamodels.datamodelAi + [_generateAiImage] modules.datamodels.datamodelAi + +gateway.modules.services.serviceGeneration.renderers.rendererJson +----------------------------------------------------------------- + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.renderers.rendererMarkdown +--------------------------------------------------------------------- + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.renderers.rendererPdf +---------------------------------------------------------------- + [_getAiStylesWithPdfColors] modules.datamodels.datamodelAi + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.renderers.rendererPptx +----------------------------------------------------------------- + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.renderers.rendererText +----------------------------------------------------------------- + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.renderers.rendererXlsx +----------------------------------------------------------------- + [_getAiStylesWithExcelColors] modules.datamodels.datamodelAi + [getAcceptedSectionTypes] modules.datamodels.datamodelJson + +gateway.modules.services.serviceGeneration.subContentGenerator +-------------------------------------------------------------- + [_generateImageSection] modules.datamodels.datamodelAi + [_generateSimpleSection] modules.datamodels.datamodelAi + [_generateSimpleSection] modules.shared.jsonUtils + +gateway.modules.services.serviceGeneration.subStructureGenerator +---------------------------------------------------------------- + [generateStructure] modules.datamodels.datamodelAi + gateway.modules.services.serviceUtils.mainServiceUtils ------------------------------------------------------ - [storeDebugMessageAndDocuments] modules.aichat.interfaceFeatureAiChat + [storeDebugMessageAndDocuments] modules.interfaces.interfaceDbChat [debugLogToFile] modules.shared.debugLogger [writeDebugArtifact] modules.shared.debugLogger [writeDebugFile] modules.shared.debugLogger @@ -409,9 +418,9 @@ gateway.modules.workflows.processing.modes.modeDynamic gateway.modules.workflows.processing.shared.placeholderFactory -------------------------------------------------------------- - [extractReviewContent] modules.aichat.datamodelFeatureAiChat - [extractLatestRefinementFeedback] modules.aichat.interfaceFeatureAiChat + [extractReviewContent] modules.datamodels.datamodelChat [extractLatestRefinementFeedback] modules.interfaces.interfaceDbApp + [extractLatestRefinementFeedback] modules.interfaces.interfaceDbChat gateway.modules.workflows.workflowManager ----------------------------------------- diff --git a/scripts/import_analysis.csv b/scripts/import_analysis.csv index 03015969..5fbe59c0 100644 --- a/scripts/import_analysis.csv +++ b/scripts/import_analysis.csv @@ -327,6 +327,9 @@ gateway.modules.datamodels.datamodelWorkflowActions,modules.shared.attributeUtil gateway.modules.datamodels.datamodelWorkflowActions,modules.shared.frontendTypes,header,Yes gateway.modules.datamodels.datamodelWorkflowActions,pydantic,header,Yes gateway.modules.datamodels.datamodelWorkflowActions,typing,header,Yes +gateway.modules.features.aichat.mainAiChat,logging,header,Yes +gateway.modules.features.aichat.mainAiChat,modules.aicore.aicoreModelRegistry,function onStart,Yes +gateway.modules.features.aichat.mainAiChat,typing,header,Yes gateway.modules.features.automation.datamodelFeatureAutomation,modules.shared.attributeUtils,header,Yes gateway.modules.features.automation.datamodelFeatureAutomation,pydantic,header,Yes gateway.modules.features.automation.datamodelFeatureAutomation,typing,header,Yes