import odoorpc import logging from django.conf import settings from urllib.parse import urlparse # Set up logging logger = logging.getLogger(__name__) class OdooAPI: def __init__(self): self.odoo = None self._connect() def _connect(self): """Establish connection to Odoo""" try: # Parse URL to get host url = settings.ODOO_CONFIG["url"] parsed_url = urlparse(url) host = parsed_url.netloc or parsed_url.path # Log connection attempt logger.info(f"Attempting to connect to Odoo at {host}") logger.debug( f"Connection parameters: HOST={host}, DB={settings.ODOO_CONFIG['db']}, " f"USER={settings.ODOO_CONFIG['username']}" ) self.odoo = odoorpc.ODOO(host, port=443, protocol="jsonrpc+ssl") logger.info("Connection established, attempting login...") self.odoo.login( settings.ODOO_CONFIG["db"], settings.ODOO_CONFIG["username"], settings.ODOO_CONFIG["password"], ) logger.info("Successfully logged into Odoo") version_info = self.odoo.version logger.info(f"Connected to Odoo version: {version_info}") except odoorpc.error.RPCError as e: logger.error(f"RPC Error connecting to Odoo: {str(e)}") logger.debug("Full RPC error details:", exc_info=True) raise except odoorpc.error.InternalError as e: logger.error(f"Internal Odoo error: {str(e)}") logger.debug("Full internal error details:", exc_info=True) raise except Exception as e: logger.error(f"Unexpected error connecting to Odoo: {str(e)}") logger.debug("Full error details:", exc_info=True) raise def create_lead(self, lead, source="form"): """Create a lead in Odoo""" try: logger.info( f"Attempting to create lead for {lead.name} from {lead.company}" ) # Get provider name from offering if it exists provider_name = "" if hasattr(lead, "offering") and lead.offering: provider_name = lead.offering.cloud_provider.name # Prepare service description service_details = [] if lead.service: service_details.append(f"Service: {lead.service.name}") if provider_name: service_details.append(f"Provider: {provider_name}") if lead.plan: service_details.append(f"Plan: {lead.plan.name}") if source == "form": service_details.append(f"Source: Servala Website") elif source == "osbapi": service_details.append(f"Source: OSB API") # Prepare lead data lead_data = { "name": f"Servala - Interest in {lead.service.name}", "contact_name": lead.name, "partner_name": lead.company, "email_from": lead.email, "phone": lead.phone, "description": ( f"{lead.message}

" + "
".join(service_details) if lead.message else "
".join(service_details) ), "type": "lead", "campaign_id": settings.ODOO_CONFIG["campaign_id"], "source_id": settings.ODOO_CONFIG["source_id"], "medium_id": settings.ODOO_CONFIG["medium_id"], "tag_ids": [(4, settings.ODOO_CONFIG["tag_id"])], } logger.debug(f"Prepared lead data: {lead_data}") # Ensure we have a valid connection if not self.odoo: logger.warning("No active Odoo connection, attempting to reconnect") self._connect() # Create the lead Lead = self.odoo.env["crm.lead"] odoo_lead_id = Lead.create(lead_data) logger.info(f"Successfully created lead in Odoo with ID: {odoo_lead_id}") # Post message in chatter message_data = { "body": f"""

Thank you for your interest in the service {lead.service.name}. We recorded the following information and will get back to you soon.


Contact Details:

Service Details:

""", "message_type": "comment", "subtype_xmlid": "mail.mt_comment", } # Post the message self.odoo.env["crm.lead"].browse(odoo_lead_id).message_post( body=message_data["body"], message_type=message_data["message_type"], subtype_xmlid=message_data["subtype_xmlid"], ) logger.info(f"Successfully posted message to lead {odoo_lead_id}") return odoo_lead_id except odoorpc.error.RPCError as e: logger.error(f"RPC Error creating lead: {str(e)}") logger.debug("Full RPC error details:", exc_info=True) raise except Exception as e: logger.error(f"Unexpected error creating lead: {str(e)}") logger.debug("Full error details:", exc_info=True) raise