mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
113 lines
3.6 KiB
Python
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"
|