From d0b3ee9923ed34133de2886bdcda6a576f4cb45d Mon Sep 17 00:00:00 2001 From: Amir Date: Wed, 10 Sep 2025 21:42:15 +0200 Subject: [PATCH] added contact page --- backend/core/forms.py | 6 +++ backend/core/templates/components/footer.html | 2 +- backend/core/templates/contact-success.html | 19 ++++++++ backend/core/templates/contact.html | 48 +++++++++++++++++++ backend/core/urls.py | 1 + backend/core/views.py | 23 ++++++++- 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 backend/core/templates/contact-success.html create mode 100644 backend/core/templates/contact.html 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 @@

Company

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 %} +
+
+

Thank you for contacting us.

+

+ 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 %} +
+
+

Contact Us

+

Have a question or need help? Send us a message and we'll get back to you.

+ +
+ {% csrf_token %} + + {% if form.non_field_errors %} +
+ {{ form.non_field_errors }} +
+ {% endif %} + +
+ + {% render_field form.name class+="w-full bg-white border-2 border-accent rounded-lg px-4 py-3 text-gray-900 focus:outline-none focus:ring-2 focus:ring-accent focus:border-accent" %} + {% if form.name.errors %} +

{{ form.name.errors|striptags }}

+ {% endif %} +
+ +
+ + {% render_field form.email class+="w-full bg-white border-2 border-accent rounded-lg px-4 py-3 text-gray-900 focus:outline-none focus:ring-2 focus:ring-accent focus:border-accent" %} + {% if form.email.errors %} +

{{ form.email.errors|striptags }}

+ {% endif %} +
+ +
+ + {% render_field form.message class+="w-full bg-white border-2 border-accent rounded-lg px-4 py-3 text-gray-900 focus:outline-none focus:ring-2 focus:ring-accent focus:border-accent" %} + {% if form.message.errors %} +

{{ form.message.errors|striptags }}

+ {% endif %} +
+ + +
+
+ +
+{% 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')