diff --git a/backend/core/forms.py b/backend/core/forms.py
index 977d66c..833736b 100644
--- a/backend/core/forms.py
+++ b/backend/core/forms.py
@@ -51,3 +51,9 @@ class OrganizationForm(forms.ModelForm):
class GenerateCodesForm(forms.Form):
count = forms.IntegerField(label="How many codes to generate?", min_value=1, max_value=1000)
+
+
+class ContactForm(forms.Form):
+ name = forms.CharField(label="Name", max_length=100)
+ email = forms.EmailField(label="Email")
+ message = forms.CharField(label="Message", widget=forms.Textarea(attrs={"rows": 6}), max_length=5000)
diff --git a/backend/core/templates/components/footer.html b/backend/core/templates/components/footer.html
index 19a5d7d..73659ec 100644
--- a/backend/core/templates/components/footer.html
+++ b/backend/core/templates/components/footer.html
@@ -10,7 +10,7 @@
diff --git a/backend/core/templates/contact-success.html b/backend/core/templates/contact-success.html
new file mode 100644
index 0000000..33d4404
--- /dev/null
+++ b/backend/core/templates/contact-success.html
@@ -0,0 +1,19 @@
+{% extends "base.html" %}
+{% block content %}
+
+
+
+
+ We received your message and will reach you soon.
+
+
+ Go back to Homepage
+
+
+
+
+{% endblock content %}
+
+{% block bottom %}
+
+{% endblock bottom %}
diff --git a/backend/core/templates/contact.html b/backend/core/templates/contact.html
new file mode 100644
index 0000000..db31014
--- /dev/null
+++ b/backend/core/templates/contact.html
@@ -0,0 +1,48 @@
+{% extends "base.html" %}
+{% load static widget_tweaks %}
+
+{% block content %}
+
+
+
+
Have a question or need help? Send us a message and we'll get back to you.
+
+
+
+
+
+{% endblock %}
diff --git a/backend/core/urls.py b/backend/core/urls.py
index cbc9715..0928b57 100644
--- a/backend/core/urls.py
+++ b/backend/core/urls.py
@@ -19,6 +19,7 @@ urlpatterns = [
path('terms-and-conditions/', v.terms_and_conditions, name='terms_and_conditions'),
path('refund-policy/', v.refund_policy, name='refund_policy'),
path('privacy-policy/', v.privacy_policy, name='privacy_policy'),
+ path('contact/', v.contact, name='contact'),
#admin urls
path('admin/demo-codes-pdf/', v.demo_codes_pdf_view, name='demo_codes_pdf'),
diff --git a/backend/core/views.py b/backend/core/views.py
index 1d26a46..6527c08 100644
--- a/backend/core/views.py
+++ b/backend/core/views.py
@@ -5,7 +5,7 @@ import json
import time
from django.shortcuts import render, redirect , get_object_or_404
-from .forms import OrganizationForm
+from .forms import OrganizationForm, ContactForm
from .models import Organization,Document, DocumentTemplate, DemoCode, DocumentRiskControl, Risk, Control
from backend.accounts.utils import send_confirmation_email, send_document_email, send_documet_to_expert, send_document_to_reviewer
from django.contrib.admin.views.decorators import staff_member_required
@@ -21,6 +21,7 @@ from weasyprint import HTML
from django.template.loader import render_to_string
from django.views.decorators.csrf import csrf_exempt
from backend.accounts.models import ExpertAnalysisEmails
+from django.core.mail import send_mail
# @login_required
@@ -181,6 +182,26 @@ def privacy_policy(request):
def refund_policy(request):
return render(request, "refund_policy.html")
+def contact(request):
+ if request.method == 'POST':
+ form = ContactForm(request.POST)
+ if form.is_valid():
+ name = form.cleaned_data['name']
+ email = form.cleaned_data['email']
+ message = form.cleaned_data['message']
+ subject = f"New contact message from {name}"
+ body = f"From: {name} <{email}>\n\n{message}"
+ try:
+ recipients = [e for _, e in settings.ADMINS] if getattr(settings, 'ADMINS', None) else [settings.DEFAULT_FROM_EMAIL]
+ send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, recipients, fail_silently=False)
+ return render(request, 'contact-success.html', {"email": email})
+ except Exception:
+ logger.exception("Failed to send contact email")
+ form.add_error(None, "We couldn't send your message right now. Please try again later.")
+ else:
+ form = ContactForm()
+ return render(request, 'contact.html', {"form": form})
+
@staff_member_required
def demo_codes_pdf_view(request):
filter_by = request.GET.get('filter_by', 'all')