143 lines
4.9 KiB
Python
143 lines
4.9 KiB
Python
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('<h1>Django</h1><p>Página simples.</p>')
|
|
|
|
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"<h1>{processed_content}</h1>\n"
|
|
elif segment_type == "h2":
|
|
rendered_content += f"<h2>{processed_content}</h2>\n"
|
|
elif segment_type == "h3":
|
|
rendered_content += f"<h3>{processed_content}</h3>\n"
|
|
elif segment_type == "p":
|
|
rendered_content += f"<p>{processed_content}</p>\n"
|
|
elif segment_type == "image":
|
|
rendered_content += f'<img src="{processed_content}" alt="Risk Graph" style="max-width:100%; height:auto;">\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}) |