diff --git a/runtime/datamate-python/app/module/annotation/interface/project.py b/runtime/datamate-python/app/module/annotation/interface/project.py index 1cd0ce5..efe6121 100644 --- a/runtime/datamate-python/app/module/annotation/interface/project.py +++ b/runtime/datamate-python/app/module/annotation/interface/project.py @@ -225,8 +225,9 @@ async def get_mapping( except HTTPException: raise except Exception as e: - logger.error(f"Error getting mapping: {e}") - raise HTTPException(status_code=500, detail="Internal server error") + import traceback + logger.error(f"Error getting mapping: {e}\n{traceback.format_exc()}") + raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}") @router.get("/by-source/{dataset_id}", response_model=StandardResponse[PaginatedData[DatasetMappingResponse]]) async def get_mappings_by_source( diff --git a/runtime/datamate-python/app/module/annotation/service/mapping.py b/runtime/datamate-python/app/module/annotation/service/mapping.py index 18b788a..7be5bee 100644 --- a/runtime/datamate-python/app/module/annotation/service/mapping.py +++ b/runtime/datamate-python/app/module/annotation/service/mapping.py @@ -49,13 +49,21 @@ class DatasetMappingService: mapping = row[0] # LabelingProject object dataset_name = row[1] # dataset_name from join + logger.debug(f"_to_response_from_row: mapping.id={mapping.id}") + # Get template_id from mapping template_id = getattr(mapping, 'template_id', None) # 从 configuration JSON 字段中提取 label_config 和 description configuration = getattr(mapping, 'configuration', None) or {} - label_config = configuration.get('label_config') if isinstance(configuration, dict) else None - description = configuration.get('description') if isinstance(configuration, dict) else None + logger.debug(f"_to_response_from_row: configuration type={type(configuration)}, value={configuration}") + + label_config = None + description = None + if isinstance(configuration, dict): + label_config = configuration.get('label_config') + description = configuration.get('description') + logger.debug(f"_to_response_from_row: label_config={label_config[:100] if label_config else None}...") # Optionally fetch full template details template_response = None @@ -94,6 +102,8 @@ class DatasetMappingService: mapping: LabelingProject ORM object include_template: If True, fetch and include full template details """ + logger.debug(f"_to_response: mapping.id={mapping.id}") + # Fetch dataset name dataset_name = None dataset_id = getattr(mapping, 'dataset_id', None) @@ -108,8 +118,14 @@ class DatasetMappingService: # 从 configuration JSON 字段中提取 label_config 和 description configuration = getattr(mapping, 'configuration', None) or {} - label_config = configuration.get('label_config') if isinstance(configuration, dict) else None - description = configuration.get('description') if isinstance(configuration, dict) else None + logger.debug(f"_to_response: configuration type={type(configuration)}, value={configuration}") + + label_config = None + description = None + if isinstance(configuration, dict): + label_config = configuration.get('label_config') + description = configuration.get('description') + logger.debug(f"_to_response: label_config={label_config[:100] if label_config else None}...") # Optionally fetch full template details template_response = None @@ -135,6 +151,7 @@ class DatasetMappingService: "deleted_at": mapping.deleted_at, } + logger.debug(f"_to_response: response_data keys={response_data.keys()}") return DatasetMappingResponse(**response_data) async def create_mapping(