Files
stock-logistics-warehouse/stock_measuring_device/models/measuring_device.py

113 lines
3.6 KiB
Python

# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
import logging
from odoo import _, fields, models
_logger = logging.getLogger(__name__)
class MeasuringDevice(models.Model):
_name = "measuring.device"
_inherit = "collection.base"
_description = "Measuring and Weighing Device"
_order = "warehouse_id, name"
name = fields.Char("Name", required=True)
warehouse_id = fields.Many2one("stock.warehouse", "Warehouse", required=True)
device_type = fields.Selection(
selection=[],
help="The type of device (e.g. zippcube, cubiscan...) "
"depending on which module are installed.",
)
state = fields.Selection(
[("not_ready", "Not Ready"), ("ready", "Ready")],
default="not_ready",
readonly=True,
copy=False,
)
_sql_constraints = [
(
"name_uniq",
"unique (name)",
"The name of the measuring/weighing device must be unique.",
),
]
def _get_measuring_device(self):
with self.work_on(self._name) as work_ctx:
return work_ctx.component(usage=self.device_type)
def open_wizard(self):
res = {
"name": _("Measurement Wizard"),
"res_model": "measuring.wizard",
"type": "ir.actions.act_window",
"view_id": False,
"view_mode": "form",
"context": {"default_device_id": self.id},
"target": "fullscreen",
"flags": {
"withControlPanel": False,
"form_view_initial_mode": "edit",
"no_breadcrumbs": True,
},
}
if self._is_being_used():
pack = self.env["product.packaging"].search(
[("measuring_device_id", "=", self.id)], limit=1
)
res["context"]["default_product_id"] = pack.product_id.id
return res
def _is_being_used(self):
self.ensure_one()
return bool(
self.env["product.packaging"].search_count(
[("measuring_device_id", "=", self.id)]
)
)
def _update_packaging_measures(self, measures):
self.ensure_one()
measures = self._get_measuring_device().preprocess_measures(measures)
line_domain = [
("wizard_id.device_id", "=", self.id),
("scan_requested", "=", True),
]
packaging = self.env["product.packaging"]._measuring_device_find_assigned(self)
if packaging:
line_domain += [("packaging_id", "=", packaging.id)]
else:
line_domain += [
("packaging_id", "=", False),
("is_unit_line", "=", True),
]
wizard_line = self.env["measuring.wizard.line"].search(
line_domain,
order="write_date DESC",
limit=1,
)
if not wizard_line:
_logger.warning("No wizard line found for this measure.")
packaging.write(measures)
else:
measures.update({"scan_requested": False, "is_measured": True})
wizard_line.write(measures)
self._get_measuring_device().post_update_packaging_measures(
measures, packaging, wizard_line
)
return packaging
def test_device(self):
for rec in self:
success = rec._get_measuring_device().test_device()
if success and rec.state == "not_ready":
rec.state = "ready"
elif not success and rec.state == "ready":
rec.state = "not_ready"