diff --git a/backend/core/admin.py b/backend/core/admin.py index 365be69..50dc76d 100644 --- a/backend/core/admin.py +++ b/backend/core/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import Document, DocumentSegment, Organization +from .models import Document, DocumentSegment, Organization, Risk class DocumentSegmentInline(admin.StackedInline): model = DocumentSegment @@ -17,5 +17,11 @@ class OrganizationAdmin(admin.ModelAdmin): list_display = ('name', 'email', 'industry_sector') search_fields = ['name', 'email'] +class RiskAdmin(admin.ModelAdmin): + ordering = ['risk_id'] + list_display = ['risk_id','risk_name','category'] + + admin.site.register(Document, DocumentAdmin) admin.site.register(Organization, OrganizationAdmin) +admin.site.register(Risk ,RiskAdmin) diff --git a/backend/core/templates/thankyou.html b/backend/core/templates/thankyou.html index 0dbbd16..25d161f 100644 --- a/backend/core/templates/thankyou.html +++ b/backend/core/templates/thankyou.html @@ -7,6 +7,37 @@ We will send the document to {{ email }} when it is ready. +

Top 10 Identified Risks

+ + + + + + + + + + + + + + + + {% for risk in top_risks %} + + + + + + + + + + + + {% endfor %} + +
Risk IDRisk NameCategoryPrimary ImpactSecondary ImpactTertiary ImpactDetection DifficultyRecovery ComplexityBusiness Impact Severity
{{ risk.risk_id }}{{ risk.risk_name }}{{ risk.category }}{{ risk.primary_impact }}{{ risk.secondary_impact }}{{ risk.tretiary_impact }}{{ risk.detection_difficulty }}{{ risk.recovery_complexity }}{{ risk.businnes_impact_severity }}
{% endblock content %} diff --git a/backend/core/utils.py b/backend/core/utils.py new file mode 100644 index 0000000..ddc7039 --- /dev/null +++ b/backend/core/utils.py @@ -0,0 +1,56 @@ +from openai import OpenAI +from django.conf import settings +from .models import Risk + +def extract_risk_factors(organization): + excluded_fields={"name","email"} + risk_data = {} + + for field in organization._meta.get_fields(): + if field.name not in excluded_fields and hasattr(organization, field.name): + value = getattr(organization, field.name) + if value: + risk_data[field.name] = value + return risk_data + +from openai import OpenAI +from django.conf import settings +from .models import Risk + +def get_top_risk(organization): + client = OpenAI(api_key=settings.OPENAI_API_KEY) + + all_risks = Risk.objects.all() + + risk_list = [] + for risk in all_risks: + risk_list.append(f""" + Risk ID: {risk.risk_id} + Category: {risk.category} + Name: {risk.risk_name} + Primary Impact: {risk.primary_impact} + """) + + risk_factors = extract_risk_factors(organization) + + prompt = f""" + You are an AI risk assessor. Based on the following company details and list of known risks, + identify the 10 most critical risks for this company. Respond only with risk IDs. + + Company Details: + {risk_factors} + + List of Risks: + {risk_list} + + Provide only the 10 most critical risk IDs in a simple comma-separated format, e.g "1,3,7,12,..." + """ + + response = client.chat.completions.create( + model="gpt-4", + messages=[{"role": "system", "content": prompt}] + ) + + risk_ids = response.choices[0].message.content.strip().split(",") + + return [int(risk_id) for risk_id in risk_ids if risk_id.isdigit()] diff --git a/backend/core/views.py b/backend/core/views.py index dffb9c4..3940a79 100644 --- a/backend/core/views.py +++ b/backend/core/views.py @@ -2,7 +2,8 @@ import logging from django.shortcuts import render, redirect from .forms import OrganizationForm - +from .models import Organization,Document,Risk +from backend.core.utils import get_top_risk # @login_required # def index(request): # return HttpResponse('

Django

Página simples.

') @@ -19,8 +20,25 @@ def signup(request): if request.method == 'POST': form = OrganizationForm(request.POST) if form.is_valid(): - form.save() - return render(request, 'thankyou.html', {'email': form.data['email']}) + organization = form.save() + print(f"Organization :{organization}") + top_risk_ids = get_top_risk(organization) + print(f"Top risks: {top_risk_ids}") + top_risks = Risk.objects.filter(risk_id__in = top_risk_ids) + print(f"Final: {top_risks}") + + document = Document.objects.create(organization=organization) + document.add_segment('h1', "Top 10 Risk Identified") + + for risk in top_risks: + document.add_segment('h2',f"Risk: {risk.risk_id}:{risk.risk_name}") + document.add_segment('body',f"Category: {risk.category} \n Primary Impact: {risk.primary_impact} \n Secondary Impact: {risk.secondary_impact} \n Tertiary Impact: {risk.tretiary_impact} \n Detection Difficulty: {risk.detection_difficulty} \n Recovery Complexity: {risk.recovery_complexity} \n Business Impact Severity: {risk.businnes_impact_severity} ") + + return render(request, 'thankyou.html', { + 'email': form.data['email'], + 'top_risks':top_risks, + 'document':document + }) else: logging.error(form.errors) return render(request, 'signup.html', {'form': form}) diff --git a/backend/settings.py b/backend/settings.py index 33856be..885a7cd 100644 --- a/backend/settings.py +++ b/backend/settings.py @@ -14,6 +14,12 @@ from pathlib import Path from decouple import Csv, config from dj_database_url import parse as dburl +import os +from dotenv import load_dotenv +load_dotenv() + +#API key +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent