from django.template import Template, Context import re def render_universal_segment(segment, context_data): segment_type = segment.get('segment_type', 'unknown') raw_content = segment.get('content') if raw_content is None: content = [] elif isinstance(raw_content, dict): content = [raw_content] elif isinstance(raw_content, list): content = raw_content else: content = [raw_content] rendered = [] context = Context(context_data) if segment_type == 'organization': rendered.append( f'
' f'' f'

Cyber Risk Assessment Report

' f'

Comprehensive Evaluation and Strategic Recommendations for Enhanced Cybersecurity Posture

' f'
' f'

Prepared for

') for item in content: name = Template(item.get('name', '')).render(context) date = Template(item.get('date', '')).render(context) if name: rendered.append(f'

{name}

') rendered.append(f'

Prepared by

' f'

Risklet

' f'
') if date: rendered.append(f'

{date}

') rendered.append(f'
') return '\n'.join(rendered) elif segment_type == 'disclaimer': rendered.append( f'
' f'' ) for item in content: subtitle = Template(item.get('subtitle', '')).render(context) description = Template(item.get('description', '')).render(context) if subtitle: rendered.append(f'

{subtitle}

') if description: processed_desc = [] for line in description.split('\n'): line = line.strip() if line: processed_desc.append(f'

{line}

') rendered.append('\n'.join(processed_desc)) rendered.append(f'
') return '\n'.join(rendered) else: rendered.append(f'
') for item in content: if not isinstance(item, dict): continue title = Template(item.get('title', '')).render(context) subtitle = Template(item.get('subtitle', '')).render(context) description = Template(item.get('description', '')).render(context) if title: rendered.append(f'

{title}

') if subtitle: rendered.append(f'

{subtitle}

') if description: processed_desc = [] in_list = False for line in description.split('\n'): line = line.strip() if re.match(r'^[-•*]\s', line): if not in_list: processed_desc.append('') in_list = False if line: processed_desc.append(f'

{line}

') if in_list: processed_desc.append('') rendered.append('\n'.join(processed_desc)) if 'headers' in item and 'rows' in item: table_html = [''] table_html.append('') for header in item['headers']: table_html.append(f'') table_html.append('') for row in item['rows']: table_html.append('') for cell in row: cell_content = Template(cell).render(context) if isinstance(cell, str) else ', '.join([Template(str(c)).render(context) for c in cell]) table_html.append(f'') table_html.append('') table_html.append('
{Template(header).render(context)}
{cell_content}
') rendered.append('\n'.join(table_html)) if 'html' in item: html_template = Template(item['html']) rendered_html = html_template.render(context) rendered.append(rendered_html) if 'image' in item: image_url = Template(item['image']).render(context) rendered.append(f'{title}') if 'warning' in item: warning_text = Template(item['warning']).render(context) rendered.append(f'

{warning_text}

') if 'note' in item: note_text = Template(item['note']).render(context) rendered.append(f'

{note_text}

') if 'html' in segment: html_template = Template(segment['html']) rendered_html = html_template.render(context) rendered.append(rendered_html) rendered.append('
') return '\n'.join(rendered) def render_template(template_segments, context_data): final_output = [] container_segments = [] disclaimer_segment = None for segment in template_segments: segment_type = segment.get('segment_type', 'unknown') if segment_type == 'organization': final_output.append(render_universal_segment(segment, context_data)) elif segment_type == 'disclaimer': disclaimer_segment = segment else: container_segments.append(segment) if container_segments: container_html = ['
'] for segment in container_segments: container_html.append(render_universal_segment(segment, context_data)) container_html.append('
') final_output.append('\n'.join(container_html)) if disclaimer_segment: final_output.append(render_universal_segment(disclaimer_segment, context_data)) return '\n'.join(final_output)