75 lines
2.9 KiB
Python
Executable File
75 lines
2.9 KiB
Python
Executable File
from odoo import models, fields, api
|
|
import requests
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
class ResPartner(models.Model):
|
|
_inherit = 'res.partner'
|
|
|
|
image_face_1 = fields.Binary("Face Image 1", attachment=True)
|
|
image_face_2 = fields.Binary("Face Image 2", attachment=True)
|
|
image_face_3 = fields.Binary("Face Image 3", attachment=True)
|
|
|
|
def _sync_face_images(self):
|
|
# Get the server URL from any POS config that has it configured
|
|
pos_config = self.env['pos.config'].search([('pos_face_rec_server_url', '!=', False)], limit=1)
|
|
if not pos_config or not pos_config.pos_face_rec_server_url:
|
|
_logger.warning("Face Recognition Server URL is not configured in any POS configuration")
|
|
return
|
|
|
|
server_url = pos_config.pos_face_rec_server_url
|
|
|
|
for partner in self:
|
|
# Only sync if at least one image is present
|
|
if not any([partner.image_face_1, partner.image_face_2, partner.image_face_3]):
|
|
continue
|
|
|
|
images = [
|
|
partner.image_face_1.decode('utf-8') if isinstance(partner.image_face_1, bytes) else partner.image_face_1,
|
|
partner.image_face_2.decode('utf-8') if isinstance(partner.image_face_2, bytes) else partner.image_face_2,
|
|
partner.image_face_3.decode('utf-8') if isinstance(partner.image_face_3, bytes) else partner.image_face_3
|
|
]
|
|
|
|
payload = {
|
|
'partner_id': partner.id,
|
|
'name': partner.name,
|
|
'images': images
|
|
}
|
|
|
|
try:
|
|
# Remove trailing slash if present
|
|
base_url = server_url.rstrip('/')
|
|
requests.post(f"{base_url}/train", json=payload, timeout=5)
|
|
except Exception as e:
|
|
_logger.error(f"Failed to sync face images for partner {partner.id}: {e}")
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
partners = super().create(vals_list)
|
|
partners._sync_face_images()
|
|
return partners
|
|
|
|
def write(self, vals):
|
|
res = super().write(vals)
|
|
if any(f in vals for f in ['image_face_1', 'image_face_2', 'image_face_3', 'name']):
|
|
self._sync_face_images()
|
|
return res
|
|
|
|
def get_top_products(self):
|
|
self.ensure_one()
|
|
# Simple implementation: get top 3 products by quantity from past orders
|
|
query = """
|
|
SELECT pt.name, sum(pol.qty) as qty
|
|
FROM pos_order_line pol
|
|
JOIN pos_order po ON pol.order_id = po.id
|
|
JOIN product_product pp ON pol.product_id = pp.id
|
|
JOIN product_template pt ON pp.product_tmpl_id = pt.id
|
|
WHERE po.partner_id = %s
|
|
GROUP BY pt.name
|
|
ORDER BY qty DESC
|
|
LIMIT 3
|
|
"""
|
|
self.env.cr.execute(query, (self.id,))
|
|
return [{'name': row[0], 'qty': row[1]} for row in self.env.cr.fetchall()]
|