website/hub/services/odoo.py

148 lines
5.7 KiB
Python

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 with detailed error logging"""
try:
# Parse URL to get host
url = settings.ODOO_CONFIG["url"]
parsed_url = urlparse(url)
host = parsed_url.netloc or parsed_url.path # If no netloc, use 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']}"
)
# Try to establish connection
self.odoo = odoorpc.ODOO(host, port=443, protocol="jsonrpc+ssl")
# Try to login
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")
# Test the connection by making a simple API call
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):
"""Create a lead in Odoo with detailed logging"""
try:
logger.info(
f"Attempting to create lead for {lead.name} from {lead.company}"
)
# Prepare lead data
lead_data = {
"name": f"Interest in {lead.service.name}",
"contact_name": lead.name,
"partner_name": lead.company,
"email_from": lead.email,
"phone": lead.phone,
"description": f"""
Service: {lead.service.name}
Provider: {lead.service.cloud_provider.name}
Categories: {', '.join(cat.name for cat in lead.service.categories.all())}
""",
"type": "lead",
}
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()
# Get the CRM lead model
Lead = self.odoo.env["crm.lead"]
logger.debug("Successfully got CRM lead model")
# Create the 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"""
<p>Thank you for your interest in the service <strong>{lead.service.name}</strong>. We recorded the following information and will get back to you soon.</p>
<h3>Contact Details:</h3>
<ul>
<li><strong>Name:</strong> {lead.name}</li>
<li><strong>Company:</strong> {lead.company}</li>
<li><strong>Email:</strong> {lead.email}</li>
<li><strong>Phone:</strong> {lead.phone}</li>
</ul>
<h3>Service Details:</h3>
<ul>
<li><strong>Service:</strong> {lead.service.name}</li>
<li><strong>Provider:</strong> {lead.service.cloud_provider.name}</li>
<li><strong>Plan:</strong> {lead.plan.name if lead.plan else 'Not specified'}</li>
<li><strong>Categories:</strong> {', '.join(cat.name for cat in lead.service.categories.all())}</li>
</ul>
""",
"message_type": "comment",
"subtype_xmlid": "mail.mt_comment",
}
# Get context for message posting
context = {
"mail_post_autofollow": True,
"lang": "en_US",
"tz": "UTC",
"uid": self.odoo.env.uid,
"allowed_company_ids": [1], # Default company ID
}
# Post the message using the message_post method
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