diff --git a/backend/accounts/tasks.py b/backend/accounts/tasks.py index a75c1cb..7ed1aa0 100644 --- a/backend/accounts/tasks.py +++ b/backend/accounts/tasks.py @@ -1,52 +1,63 @@ from celery import shared_task from backend.core.models import Organization, Document, Risk, Control, DocumentRiskControl from backend.core.utils import get_top_risk, get_controls_for_risk -from django.shortcuts import get_object_or_404, render - +from django.shortcuts import get_object_or_404 +from django.template import Template, Context +import yaml +from backend.core.models import DocumentTemplate +from .utils import send_payment_email @shared_task def create_document_for_organization(confirmation_email): - organization = get_object_or_404(Organization, email=confirmation_email) top_risk_ids = get_top_risk(organization) top_risks = Risk.objects.filter(risk_id__in=top_risk_ids) - organization.risks.set(top_risks) - document = Document.objects.create(organization=organization) - document.add_segment('h1', "Top 10 Risks Identified") + template = DocumentTemplate.objects.first() + template_content = template.content - risk_content = "\n\n".join([ - f"Risk: {risk.risk_id} - {risk.risk_name} \n" - f"Category: {risk.category}\n" - f"Primary Impact: {risk.primary_impact} \n" - f"Secondary Impact: {risk.secondary_impact}\n" - f"Tertiary Impact: {risk.tretiary_impact} \n" - f"Detection Difficulty: {risk.detection_difficulty} \n" - f"Recovery Complexity: {risk.recovery_complexity} \n" - f"Business Impact Severity: {risk.businnes_impact_severity}\n" - for risk in top_risks - ]) - document.add_segment('body', f"Identified Risks: \n\n{risk_content}") - - controls_content = "Mitigation Controls:\n\n" - + risks_data = [] for risk in top_risks: - controls_content += f"Risk: {risk.risk_id} - {risk.risk_name}\n" + controls_data = [] + selected_controls = get_controls_for_risk(risk, organization) - selected_controls = get_controls_for_risk(risk) - for control_id, weight in selected_controls: - control = Control.objects.filter(id=control_id).first() + control = Control.objects.filter(id=control_id).first() if control: + document = Document.objects.create(organization=organization) DocumentRiskControl.objects.create( document=document, risk=risk, control=control, - weight=weight + weight=weight, ) - controls_content += f" - Control: {control.name} (Impact Weight: {weight}/10)\n" - - controls_content += "\n" - - document.add_segment('body', controls_content) \ No newline at end of file + + controls_data.append({ + 'name': control.name, + 'weight': weight, + }) + + risks_data.append({ + 'name': risk.risk_name, + 'description': risk.description, + 'controls': controls_data, + }) + + context = { + 'organization': organization, + 'risks': risks_data, + } + + django_template = Template(template_content) + rendered_content = django_template.render(Context(context)) + + document = Document.objects.create(organization=organization, content=rendered_content) + + document.add_segment('title', f"{organization.name} Risk Assessment Report", 1) + document.add_segment('introduction', f"This document outlines the risks and controls for {organization.name}.", 2) + document.add_segment('body', rendered_content, 3) + + send_payment_email(confirmation_email) + + return document diff --git a/backend/accounts/templates/accounts/confirmation_expired.html b/backend/accounts/templates/accounts/confirmation_expired.html index 7624b9a..8ca56b0 100644 --- a/backend/accounts/templates/accounts/confirmation_expired.html +++ b/backend/accounts/templates/accounts/confirmation_expired.html @@ -1,8 +1,10 @@ {% extends "base_login.html" %} - +{%block content%}
Your email {{ email }} has been successfully verified.
+Your email {{ email }} has been successfully verified.
+{%endblock%} diff --git a/backend/accounts/utils.py b/backend/accounts/utils.py index a6bbefd..c9a6ba8 100644 --- a/backend/accounts/utils.py +++ b/backend/accounts/utils.py @@ -6,8 +6,6 @@ from django.conf import settings from django.utils.timezone import now from backend.core.models import Document, Organization - - def send_confirmation_email(email): confirmation, created = EmailConfirmation.objects.get_or_create(email=email) diff --git a/backend/accounts/views.py b/backend/accounts/views.py index 1757f37..45500d9 100644 --- a/backend/accounts/views.py +++ b/backend/accounts/views.py @@ -4,7 +4,7 @@ from backend.accounts.forms import SignupForm from .models import EmailConfirmation from django.shortcuts import get_object_or_404, render from django.http import HttpResponse -from backend.accounts.utils import send_confirmation_email, send_payment_email +from backend.accounts.utils import send_confirmation_email from .tasks import create_document_for_organization class SignUpView(CreateView): @@ -17,13 +17,10 @@ def confirm_email(request, uuid): confirmation = get_object_or_404(EmailConfirmation, uuid=uuid) if confirmation.is_expired(): - return render(request, 'confirmation_expired.html', {'email': confirmation.email}) + return render(request, 'accounts/confirmation_expired.html', {'email': confirmation.email}) task = create_document_for_organization.delay(confirmation.email) - send_payment_email(confirmation.email) - - - return HttpResponse("Email is confirmed") + return render(request, 'accounts/confirmation_success.html',{'email':confirmation.email}) def resend_confirmation(request,email): if request.method == 'POST': diff --git a/backend/core/templates/document_detail.html b/backend/core/templates/document_detail.html new file mode 100644 index 0000000..0c94d53 --- /dev/null +++ b/backend/core/templates/document_detail.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} + +{% block content %} +{{ created_at }}
+ +{{ controls }}
+Click the button below to pay and access your document.
- - +Click the button below to pay and access your document.
+ +Página simples.
') @@ -26,7 +26,6 @@ def signup(request): if form.is_valid(): form.save() send_confirmation_email(form.data['email']) - return render(request, 'thankyou.html', { 'email': form.data['email'], }) @@ -69,3 +68,28 @@ def payment_page(request): return redirect(document_link) return render(request, "payment.html", {"email": email}) + + +def docprew(request, document_id): + doc = get_object_or_404(Document, id=document_id) + org = doc.organization + + document_risk_controls = DocumentRiskControl.objects.filter(document=doc) + + unique_risks = Risk.objects.filter(id__in=document_risk_controls.values('risk_id')).distinct() + + risks_with_controls = {} + + for risk in unique_risks: + related_controls = DocumentRiskControl.objects.filter(risk=risk) + + risk_controls = [control.control.name for control in related_controls] + + risks_with_controls[risk] = ", ".join(risk_controls) + + return render(request, 'document_detail.html', { + 'document': doc, + 'organization': org, + 'created_at': doc.created_at, + 'risks_with_controls': risks_with_controls, + }) \ No newline at end of file diff --git a/start_services.sh b/start_services.sh new file mode 100755 index 0000000..84d747e --- /dev/null +++ b/start_services.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +echo "Starting Django server..." +python3 manage.py runserver & + +echo "Starting Celery worker..." +celery -A backend worker --loglevel=info & + +echo "Starting Redis server on port 6380..." +redis-server --port 6380 & + +wait