"""]
for okr_idx, okr_data in enumerate(okrs_list):
if not isinstance(okr_data, dict):
logger.warning(f"OKR item at index {okr_idx} is not a dictionary, skipping.")
continue
objective = okr_data.get('description', f"Unnamed Objective {okr_idx + 1}")
timeline = okr_data.get('timeline', 'Not specified')
owner = okr_data.get('owner', 'Not assigned')
html_parts.append(f"""
""")
key_results = okr_data.get('key_results', [])
if not isinstance(key_results, list) or not key_results:
html_parts.append('
No key results defined for this objective.
')
else:
for kr_idx, kr_data in enumerate(key_results):
if not isinstance(kr_data, dict):
logger.warning(f"Key Result item for Objective {okr_idx+1} at index {kr_idx} is not a dictionary, skipping.")
continue
kr_desc = kr_data.get('description', f"Unnamed Key Result {kr_idx + 1}")
target_metric = kr_data.get('target_metric', '')
target_value = kr_data.get('target_value', '')
kr_type = kr_data.get('key_result_type', '')
data_subject = kr_data.get('data_subject', '')
html_parts.append(f"""
')
# Add tasks
tasks = kr_data.get('tasks', [])
if tasks and isinstance(tasks, list):
html_parts.append("""
📋
Associated Tasks
""")
for task_idx, task_data in enumerate(tasks):
if not isinstance(task_data, dict):
logger.warning(f"Task item for Key Result {kr_idx+1} at index {task_idx} is not a dictionary, skipping.")
continue
task_desc = task_data.get('description', f"Unnamed Task {task_idx + 1}")
task_category = task_data.get('category', 'General')
priority = task_data.get('priority', 'Medium').lower()
effort = task_data.get('effort', 'Not specified')
timeline = task_data.get('timeline', 'Not specified')
responsible = task_data.get('responsible_party', 'Not assigned')
priority_class = f"priority-{priority}" if priority in ['high', 'medium', 'low'] else 'priority-medium'
html_parts.append(f"""
Category:
{task_category}
Effort:
{effort}
Timeline:
{timeline}
Responsible:
{responsible}
""")
# Add additional details if available
obj_deliverable = task_data.get('deliverable')
success_criteria = task_data.get('success_criteria_metrics')
why_proposed = task_data.get('why')
priority_just = task_data.get('priority_justification')
dependencies = task_data.get('dependencies')
detail_lines = []
if obj_deliverable:
detail_lines.append(f'
Objective/Deliverable: {obj_deliverable}')
if success_criteria:
detail_lines.append(f'
Success Metrics: {success_criteria}')
if why_proposed:
detail_lines.append(f'
Rationale: {why_proposed}')
if priority_just:
detail_lines.append(f'
Priority Justification: {priority_just}')
if dependencies:
detail_lines.append(f'
Dependencies: {dependencies}')
if detail_lines:
html_parts.append('
')
html_parts.append('
'.join(detail_lines))
html_parts.append('
')
html_parts.append('
') # Close task-item
html_parts.append('
') # Close tasks-section
else:
html_parts.append("""
📄
No tasks defined for this Key Result.
""")
html_parts.append('
') # Close key-result
html_parts.append('
') # Close key-results-container and okr-objective
html_parts.append('