import logging from django.conf import settings from django.shortcuts import render, get_object_or_404, redirect from django.contrib import messages from django.urls import reverse from hub.services.models import ( Service, ServiceOffering, Plan, ) from hub.services.forms import LeadForm from hub.services.odoo import OdooAPI logger = logging.getLogger(__name__) def create_lead(request, slug): service = get_object_or_404( Service.objects.prefetch_related("categories"), slug=slug ) selected_offering = None selected_plan = None # Get the offering if specified if request.GET.get("offering"): selected_offering = get_object_or_404( ServiceOffering.objects.select_related("cloud_provider").prefetch_related( "plans" ), id=request.GET.get("offering"), service=service, ) if selected_offering.plans.exists(): if not request.GET.get("plan"): # If there's only one plan, automatically select it if selected_offering.plans.count() == 1: return redirect( f"{reverse('services:create_lead', kwargs={'slug': service.slug})}?offering={selected_offering.id}&plan={selected_offering.plans.first().id}" ) # If there are multiple plans, redirect to offering detail return redirect("services:offering_detail", slug=selected_offering.slug) # Get the selected plan selected_plan = get_object_or_404( Plan.objects.prefetch_related( "prices", "prices__currency", "prices__term" ), id=request.GET.get("plan"), offering=selected_offering, ) if request.method == "POST": form = LeadForm(request.POST) if form.is_valid(): lead = form.save(commit=False) lead.service = service lead.offering = selected_offering lead.plan = selected_plan try: logger.info(f"Attempting to create lead for service: {service.name}") odoo = OdooAPI() odoo_lead_id = odoo.create_lead(lead) lead.odoo_lead_id = odoo_lead_id lead.save() logger.info(f"Successfully created lead with Odoo ID: {odoo_lead_id}") return redirect("services:thank_you", slug=service.slug) except Exception as e: logger.error(f"Failed to create lead: {str(e)}", exc_info=True) error_message = "Sorry, there was an error processing your request. Please try again later." if settings.DEBUG: error_message += f" Error: {str(e)}" messages.error(request, error_message) else: form = LeadForm() context = { "form": form, "service": service, "selected_offering": selected_offering, "selected_plan": selected_plan, } return render(request, "services/lead_form.html", context) def thank_you(request, slug): service = get_object_or_404(Service, slug=slug) return render(request, "services/thank_you.html", {"service": service}) def contact(request): if request.method == "POST": form = LeadForm(request.POST) if form.is_valid(): # Create a minimal Lead object from hub.services.models import Lead lead = Lead( name=form.cleaned_data["name"], email=form.cleaned_data["email"], message=form.cleaned_data["message"], company=form.cleaned_data["company"], phone=form.cleaned_data["phone"], ) try: logger.info(f"Attempting to create contact lead from {lead.name}") odoo = OdooAPI() odoo_lead_id = odoo.create_lead(lead, source="contact_form") lead.odoo_lead_id = odoo_lead_id lead.save() logger.info( f"Successfully created contact lead with Odoo ID: {odoo_lead_id}" ) messages.success( request, "Thank you for your message. We'll get back to you soon!" ) return redirect("services:contact_thank_you") except Exception as e: logger.error(f"Failed to create contact lead: {str(e)}", exc_info=True) error_message = "Sorry, there was an error processing your request. Please try again later." if settings.DEBUG: error_message += f" Error: {str(e)}" messages.error(request, error_message) else: form = LeadForm() context = { "form": form, } return render(request, "services/contact_form.html", context) def contact_thank_you(request): return render(request, "services/contact_thank_you.html")