added contact page
This commit is contained in:
@@ -51,3 +51,9 @@ class OrganizationForm(forms.ModelForm):
|
|||||||
|
|
||||||
class GenerateCodesForm(forms.Form):
|
class GenerateCodesForm(forms.Form):
|
||||||
count = forms.IntegerField(label="How many codes to generate?", min_value=1, max_value=1000)
|
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)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<h3 class="text-sm font-semibold text-gray-400 tracking-wider uppercase mb-4">Company</h3>
|
<h3 class="text-sm font-semibold text-gray-400 tracking-wider uppercase mb-4">Company</h3>
|
||||||
<ul class="space-y-3">
|
<ul class="space-y-3">
|
||||||
<li><a href="/#" class="text-sm text-blue-200 hover:text-accent transition-colors no-underline">Contact</a></li>
|
<li><a href="/contact/" class="text-sm text-blue-200 hover:text-accent transition-colors no-underline">Contact</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
19
backend/core/templates/contact-success.html
Normal file
19
backend/core/templates/contact-success.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<section class="py-16 bg-secondary sm:py-24 p-body-full">
|
||||||
|
<div class="max-w-lg w-full mx-auto text-center shadow-lg border border-success rounded-xl p-8 bg-white">
|
||||||
|
<h2 class="text-3xl font-extrabold mb-4 text-success">Thank you for contacting us.</h2>
|
||||||
|
<p class="mb-8 text-gray-700 text-lg">
|
||||||
|
We received your message and will reach you soon.
|
||||||
|
</p>
|
||||||
|
<a href="{% url 'core:index' %}" class="bg-transparent border-2 border-accent text-accent hover:bg-accent hover:text-primary font-semibold py-3 px-8 rounded-lg text-lg transition-all duration-300 ease-in-out">
|
||||||
|
Go back to Homepage
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{% endblock content %}
|
||||||
|
|
||||||
|
{% block bottom %}
|
||||||
|
<script src="/static/js/formHandling.js"></script>
|
||||||
|
{% endblock bottom %}
|
||||||
48
backend/core/templates/contact.html
Normal file
48
backend/core/templates/contact.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% load static widget_tweaks %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<section class="py-16 bg-secondary sm:py-24 p-body-full">
|
||||||
|
<div class="max-w-2xl w-full mx-auto shadow-2xl border-2 border-accent rounded-2xl p-8 bg-white">
|
||||||
|
<h1 class="text-3xl font-extrabold mb-3 text-primary">Contact Us</h1>
|
||||||
|
<p class="mb-8 text-gray-700">Have a question or need help? Send us a message and we'll get back to you.</p>
|
||||||
|
|
||||||
|
<form method="post" class="space-y-6">
|
||||||
|
{% csrf_token %}
|
||||||
|
|
||||||
|
{% if form.non_field_errors %}
|
||||||
|
<div class="bg-red-50 border border-red-400 text-red-700 px-4 py-3 rounded-lg">
|
||||||
|
{{ form.non_field_errors }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1" for="id_name">Name</label>
|
||||||
|
{% 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 %}
|
||||||
|
<p class="text-red-600 text-sm mt-1">{{ form.name.errors|striptags }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1" for="id_email">Email</label>
|
||||||
|
{% 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 %}
|
||||||
|
<p class="text-red-600 text-sm mt-1">{{ form.email.errors|striptags }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label class="block text-sm font-medium text-gray-700 mb-1" for="id_message">Message</label>
|
||||||
|
{% 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 %}
|
||||||
|
<p class="text-red-600 text-sm mt-1">{{ form.message.errors|striptags }}</p>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="submit" class="w-full nav-link-desktop bg-primary border-2 border-accent text-accent hover:bg-accent hover:text-primary font-semibold py-3 px-8 rounded-lg text-lg transition-all duration-300 ease-in-out">Send Message</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
||||||
@@ -19,6 +19,7 @@ urlpatterns = [
|
|||||||
path('terms-and-conditions/', v.terms_and_conditions, name='terms_and_conditions'),
|
path('terms-and-conditions/', v.terms_and_conditions, name='terms_and_conditions'),
|
||||||
path('refund-policy/', v.refund_policy, name='refund_policy'),
|
path('refund-policy/', v.refund_policy, name='refund_policy'),
|
||||||
path('privacy-policy/', v.privacy_policy, name='privacy_policy'),
|
path('privacy-policy/', v.privacy_policy, name='privacy_policy'),
|
||||||
|
path('contact/', v.contact, name='contact'),
|
||||||
#admin urls
|
#admin urls
|
||||||
path('admin/demo-codes-pdf/', v.demo_codes_pdf_view, name='demo_codes_pdf'),
|
path('admin/demo-codes-pdf/', v.demo_codes_pdf_view, name='demo_codes_pdf'),
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import json
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
from django.shortcuts import render, redirect , get_object_or_404
|
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 .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 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
|
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.template.loader import render_to_string
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from backend.accounts.models import ExpertAnalysisEmails
|
from backend.accounts.models import ExpertAnalysisEmails
|
||||||
|
from django.core.mail import send_mail
|
||||||
|
|
||||||
|
|
||||||
# @login_required
|
# @login_required
|
||||||
@@ -181,6 +182,26 @@ def privacy_policy(request):
|
|||||||
def refund_policy(request):
|
def refund_policy(request):
|
||||||
return render(request, "refund_policy.html")
|
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
|
@staff_member_required
|
||||||
def demo_codes_pdf_view(request):
|
def demo_codes_pdf_view(request):
|
||||||
filter_by = request.GET.get('filter_by', 'all')
|
filter_by = request.GET.get('filter_by', 'all')
|
||||||
|
|||||||
Reference in New Issue
Block a user