Skip to content

Commit f189589

Browse files
committed
fix: improve field formatting for array-type custom fields
- Add proper handling for schema-based field formatting - Fix array-type custom fields (multi-select, checkboxes) to use correct format - Handle option fields with {"value": "..."} format instead of {"name": "..."} - Add support for user field formatting based on schema type - Convert comma-separated strings to proper array format for multi-value fields - This should fix 'data was not an array' errors when creating issues with custom fields Resolves issues with custom field validation in Jira API calls.
1 parent 267330e commit f189589

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

src/mcp_atlassian/jira/issues.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,88 @@ def _format_field_value_for_write(
954954
)
955955
return value # Return original on error
956956

957+
# Handle schema-based formatting for custom fields
958+
elif schema_type == "array":
959+
# Handle array-type custom fields (multi-select, checkboxes, etc.)
960+
if isinstance(value, list):
961+
# Check if it's an array of options (common for multi-select fields)
962+
if (
963+
field_definition
964+
and field_definition.get("schema", {}).get("items") == "option"
965+
):
966+
# Multi-select option fields expect [{"value": "..."}, ...] format
967+
formatted_list = []
968+
for item in value:
969+
if isinstance(item, str):
970+
formatted_list.append({"value": item})
971+
elif isinstance(item, dict) and (
972+
"value" in item or "id" in item
973+
):
974+
formatted_list.append(item)
975+
else:
976+
logger.warning(
977+
f"Invalid item format in array field {field_id}: {item}"
978+
)
979+
return formatted_list
980+
else:
981+
# For other array types, try to format as standard objects
982+
formatted_list = []
983+
for item in value:
984+
if isinstance(item, str):
985+
formatted_list.append({"name": item})
986+
elif isinstance(item, dict):
987+
formatted_list.append(item)
988+
else:
989+
logger.warning(
990+
f"Invalid item format in array field {field_id}: {item}"
991+
)
992+
return formatted_list
993+
elif isinstance(value, str):
994+
# Convert comma-separated string to array
995+
items = [item.strip() for item in value.split(",") if item.strip()]
996+
if (
997+
field_definition
998+
and field_definition.get("schema", {}).get("items") == "option"
999+
):
1000+
return [{"value": item} for item in items]
1001+
else:
1002+
return [{"name": item} for item in items]
1003+
else:
1004+
logger.warning(
1005+
f"Invalid format for array field {field_id}: {value}. Expected list or comma-separated string."
1006+
)
1007+
return None
1008+
elif schema_type == "option":
1009+
# Handle single-select option fields
1010+
if isinstance(value, str):
1011+
return {"value": value}
1012+
elif isinstance(value, dict) and ("value" in value or "id" in value):
1013+
return value
1014+
else:
1015+
logger.warning(
1016+
f"Invalid format for option field {field_id}: {value}. Expected string or dict with value/id."
1017+
)
1018+
return None
1019+
elif schema_type == "user":
1020+
# Handle user fields (assignee, reporter, custom user fields)
1021+
if isinstance(value, str):
1022+
try:
1023+
user_identifier = self._get_account_id(value)
1024+
if self.config.is_cloud:
1025+
return {"accountId": user_identifier}
1026+
else:
1027+
return {"name": user_identifier}
1028+
except ValueError as e:
1029+
logger.warning(f"Could not format user field {field_id}: {str(e)}")
1030+
return None
1031+
elif isinstance(value, dict) and ("accountId" in value or "name" in value):
1032+
return value
1033+
else:
1034+
logger.warning(
1035+
f"Invalid format for user field {field_id}: {value}. Expected string username or dict."
1036+
)
1037+
return None
1038+
9571039
# Default: return value as is if no specific formatting needed/identified
9581040
return value
9591041

0 commit comments

Comments
 (0)