import logging import time from django.shortcuts import render, redirect from django.contrib import messages from hub.services.forms import LeadForm from hub.services.odoo import OdooAPI logger = logging.getLogger(__name__) def contact(request): return render(request, "services/contact_form.html") def thank_you(request): return render(request, "services/thank_you.html") def contact_form(request): if request.method == "POST": # Spam protection checks honeypot_value = request.POST.get("website", "") timestamp_value = request.POST.get("form_timestamp", "0") current_time = int(time.time()) # Check 1: Honeypot field should be empty if honeypot_value: # Bot detected - silently redirect return redirect("services:homepage") # Check 2: Form shouldn't be submitted too quickly (< 3 seconds) try: form_time = int(timestamp_value) if current_time - form_time < 3: # Too quick submission - likely a bot return redirect("services:homepage") except ValueError: # Invalid timestamp - likely a bot return redirect("services:homepage") # Continue with normal form processing form = LeadForm(request.POST) if form.is_valid(): from hub.services.models import Lead, Service, ServiceOffering, Plan # Create a lead with context information lead = Lead( name=form.cleaned_data["name"], email=form.cleaned_data["email"], message=form.cleaned_data["message"] or "", company=form.cleaned_data["company"], phone=form.cleaned_data["phone"], ) # Store the source/context information source = request.POST.get("source", "Contact Form") details = request.POST.get("details", "") next_url = request.POST.get("next", "/") # Handle service/offering/plan data service_id = request.POST.get("service_id") service_name = request.POST.get("service_name", "") offering_id = request.POST.get("offering_id") offering_name = request.POST.get("offering_name", "") plan_id = request.POST.get("plan_id") plan_name = request.POST.get("plan_name", "") # Link to related objects if they exist if service_id: try: lead.service = Service.objects.get(id=service_id) except Service.DoesNotExist: pass if offering_id: try: lead.offering = ServiceOffering.objects.get(id=offering_id) except ServiceOffering.DoesNotExist: pass if plan_id: try: lead.plan = Plan.objects.get(id=plan_id) except Plan.DoesNotExist: pass # Add context to the message and lead_title lead_title = "" context_info = [] if source: context_info.append(f"Source Page: {source}") lead_title += f" - {source}" if details: context_info.append(f"Details: {details}") lead_title += f" - {details}" # Add service information to lead title and message service_info = [] if service_name: service_info.append(f"Service: {service_name}") lead_title += f" - {service_name}" if offering_name: service_info.append(f"Provider: {offering_name}") if plan_name: service_info.append(f"Plan: {plan_name}") # Handle selected choice if present selected_choice = request.POST.get("selected_choice", "") if selected_choice: try: choice_id, choice_name = selected_choice.split("|", 1) # Add selected choice to message service_info.append(f"Selected Plan: {choice_name}") # Try to set the plan based on the choice_id try: lead.plan = Plan.objects.get(id=choice_id) except Plan.DoesNotExist: pass except ValueError: pass if service_info: context_info.append("Service Information: " + ", ".join(service_info)) # Format the final message with all context formatted_context = "
".join(context_info) lead.message = ( lead.message + "

" + formatted_context if lead.message else formatted_context ) try: logger.info( f"Contact form submission for {service_name or 'general inquiry'}" ) odoo = OdooAPI() odoo_lead_id = odoo.create_lead(lead, lead_title) lead.odoo_lead_id = odoo_lead_id lead.save() logger.info(f"Successfully created lead with Odoo ID: {odoo_lead_id}") # Redirect to thank you page return redirect("services:thank_you") except Exception as e: logger.error(f"Failed to create lead: {str(e)}", exc_info=True) messages.error( request, "Sorry, there was an error processing your request. Please try again later.", ) return redirect(next_url) else: # Return form with errors return render( request, "services/contact_form.html", { "form": form, "source": request.POST.get("source", ""), "details": request.POST.get("details", ""), }, ) return redirect( "services:homepage" ) # Redirect if someone tries to access the URL directly