pos_face_recognition/models/res_partner.py
2025-12-02 23:14:27 +07:00

75 lines
2.9 KiB
Python

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()]