import logging from django.conf import settings from django.shortcuts import render, get_object_or_404, redirect from django.contrib import messages from django.db.models import Q from .models import Service, CloudProvider, Country, ServiceLevel, Category from .forms import LeadForm from .odoo import OdooAPI logger = logging.getLogger(__name__) def service_list(request): services = Service.objects.all() cloud_providers = CloudProvider.objects.all() countries = Country.objects.all() service_levels = ServiceLevel.objects.all() categories = Category.objects.filter(parent=None) # Top-level categories # Filter handling if request.GET.get("cloud_provider"): services = services.filter(cloud_provider_id=request.GET.get("cloud_provider")) if request.GET.get("country"): services = services.filter(countries__id=request.GET.get("country")) if request.GET.get("service_level"): services = services.filter(service_level_id=request.GET.get("service_level")) if request.GET.get("category"): category_id = request.GET.get("category") category = Category.objects.get(id=category_id) # Get all subcategories subcategories = Category.objects.filter(parent=category) # Filter services in this category or its subcategories services = services.filter( Q(categories=category) | Q(categories__in=subcategories) ).distinct() if request.GET.get("search"): query = request.GET.get("search") services = services.filter( Q(name__icontains=query) | Q(description__icontains=query) ) context = { "services": services, "cloud_providers": cloud_providers, "countries": countries, "service_levels": service_levels, "categories": categories, } return render(request, "services/service_list.html", context) def service_detail(request, slug): service = get_object_or_404(Service, slug=slug) return render(request, "services/service_detail.html", {"service": service}) def provider_detail(request, slug): provider = get_object_or_404(CloudProvider, slug=slug) services = Service.objects.filter(cloud_provider=provider) context = { "provider": provider, "services": services, } return render(request, "services/provider_detail.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 create_lead(request, slug): service = get_object_or_404(Service, slug=slug) if request.method == "POST": form = LeadForm(request.POST) if form.is_valid(): lead = form.save(commit=False) lead.service = service 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() return render( request, "services/lead_form.html", {"form": form, "service": service} )