import logging import yaml from django.shortcuts import render, redirect , get_object_or_404 from .forms import OrganizationForm from .models import Organization,Document, DocumentTemplate,DocumentRiskControl,Risk from backend.accounts.utils import send_confirmation_email, send_document_email from django.contrib.admin.views.decorators import staff_member_required from django.template import Template, Context from .utils import generate_pdf, map_weight_to_impact_likelihood, calculate_aggregate_weight, calculate_aggregate_likelihood, generate_risk_graph from django.conf import settings site_domain = settings.SITE_DOMAIN # @login_required # def index(request): # return HttpResponse('

Django

Página simples.

') logger = logging.getLogger(__name__) # @login_required def index(request): template_name = 'index.html' return render(request, template_name) def signup(request): if request.method == 'POST': form = OrganizationForm(request.POST) if form.is_valid(): form.save() send_confirmation_email(form.data['email']) return render(request, 'thankyou.html', { 'email': form.data['email'], }) else: logging.error(form.errors) return render(request, 'signup.html', {'form': form}) else: form = OrganizationForm() return render(request, 'signup.html', {'form': form}) def thankyou(request): return render(request, 'thankyou.html') def document(request, document_id): document = get_object_or_404(Document, id=document_id) risks = ( DocumentRiskControl.objects .filter(document=document) .values('risk', 'risk__risk_name') .distinct() ) risks_with_controls = [] for risk_entry in risks: risk = { 'id': risk_entry['risk'], 'name': risk_entry['risk__risk_name'] } controls = ( DocumentRiskControl.objects .filter(document=document, risk_id=risk['id']) .values('control', 'control__name', 'weight', 'likelihood') .distinct() ) max_weight = 10*10 total_weight = calculate_aggregate_weight(controls) total_likelihood = calculate_aggregate_likelihood(controls) impact, likelihood = map_weight_to_impact_likelihood(total_weight, total_likelihood, max_weight) risks_with_controls.append({ 'risk': risk, 'controls': list(controls), 'total_weight': total_weight, 'impact': impact, 'likelihood': likelihood, 'risk_score': (round(impact) * round(likelihood)) }) graph_base64 = generate_risk_graph(risks_with_controls) template_obj = get_object_or_404(DocumentTemplate, name="Default Template") template_content = template_obj.content try: template_segments = yaml.safe_load(template_content) except yaml.YAMLError as e: return render(request, 'error.html', {'error_message': 'Error parsing template.'}) context = { 'document': document, 'risks_with_controls': risks_with_controls, 'graph': graph_base64, } rendered_content = "" for segment in template_segments: content = segment.get('content', '') segment_type = segment.get('segment_type', '') django_template = Template(content) processed_content = django_template.render(Context(context)) if segment_type == "h1": rendered_content += f"

{processed_content}

\n" elif segment_type == "h2": rendered_content += f"

{processed_content}

\n" elif segment_type == "h3": rendered_content += f"

{processed_content}

\n" elif segment_type == "p": rendered_content += f"

{processed_content}

\n" elif segment_type == "image": rendered_content += f'Risk Graph\n' else: rendered_content += processed_content return render(request, 'document.html', {'rendered_html': rendered_content}) @staff_member_required def template_preview(request, name): template = get_object_or_404(DocumentTemplate, name=name) parsed_template = template.to_dict() return render(request, 'template_preview.html', {'template': parsed_template}) def pdf_view(request, document_id): document = get_object_or_404(Document, id=document_id) return generate_pdf(document) def payment_page(request): email = request.GET.get("email") organization = get_object_or_404(Organization, email=email) document = get_object_or_404(Document, organization=organization) if request.method == "POST": pdf_url = f"{site_domain}/document/{document.id}/" send_document_email(email, pdf_url, document) return redirect(pdf_url) return render(request, "payment.html", {"email": email})