84 lines
No EOL
3.6 KiB
Python
84 lines
No EOL
3.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import models, fields, api
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class StockQuantPackage(models.Model):
|
|
|
|
_inherit = 'stock.quant.package'
|
|
|
|
length = fields.Float('Length')
|
|
width = fields.Float('Width')
|
|
height = fields.Float('Height')
|
|
|
|
carrier_id = fields.Many2one( comodel_name='delivery.carrier',
|
|
string='Carrier',
|
|
help="Carrier use to create package.",
|
|
compute='_compute_package_carrier' )
|
|
|
|
provider = fields.Selection( selection=lambda self: self._get_provider(),
|
|
string='Provider',
|
|
help="Provider to create package.",
|
|
compute='_compute_package_carrier' )
|
|
|
|
auto_create_package = fields.Boolean( string='Auto Create Package',
|
|
compute='_compute_auto_create_package' )
|
|
|
|
|
|
@api.depends('carrier_id')
|
|
def _compute_auto_create_package(self):
|
|
# Look so much like a related field
|
|
for record in self:
|
|
record.auto_create_package = record.carrier_id.auto_create_package if record.carrier_id else False
|
|
|
|
|
|
def _compute_package_carrier(self):
|
|
move_line = self.env['stock.move.line'].search([('result_package_id', '=', self.id)])
|
|
# This also look like a related field and might not even be needed as we only need it to get the provider
|
|
self.carrier_id = move_line.carrier_id
|
|
delivery_types_available = [item[0] for item in self.env['stock.package.type']._fields['package_carrier_type'].selection]
|
|
# This is a bit of a hack to get the provider from the carrier_id, depending if carrier is integrated or not
|
|
if self.carrier_id.delivery_type not in delivery_types_available:
|
|
self.provider = False
|
|
else:
|
|
self.provider = move_line.carrier_id.delivery_type
|
|
|
|
|
|
|
|
def _get_provider(self):
|
|
# just cloning the selection from stock.package.type tru a lambda function
|
|
return self.env['stock.package.type']._fields['package_carrier_type'].selection
|
|
|
|
|
|
def write(self, vals):
|
|
if 'length' in vals and 'width' in vals and 'height' in vals:
|
|
# check if length, width, height are greater than 0
|
|
if vals['length'] <= 0 or vals['width'] <= 0 or vals['height'] <= 0:
|
|
raise ValidationError('Length, width, and height must be greater than 0.')
|
|
# Make sure length is always greater than width, otherwise swap them
|
|
if vals['length'] < vals['width']:
|
|
vals['length'], vals['width'] = vals['width'], vals['length']
|
|
# check if existing package_type exists
|
|
package_type = self.env['stock.package.type'].search([
|
|
('width', '=', vals['width']),
|
|
('height', '=', vals['height']),
|
|
('packaging_length', '=', vals['length']),
|
|
('package_carrier_type', '=', self.provider)
|
|
], limit=1)
|
|
|
|
# if not, create new package_type
|
|
if not package_type:
|
|
package_type = self.env['stock.package.type'].create({
|
|
'name': f'Box {vals["length"]}x{vals["width"]}x{vals["height"]}',
|
|
'width': vals['width'],
|
|
'height': vals['height'],
|
|
'packaging_length': vals['length'],
|
|
'package_carrier_type': self.provider
|
|
})
|
|
|
|
# update package_type_id
|
|
vals['package_type_id'] = package_type.id
|
|
|
|
res = super(StockQuantPackage, self).write(vals)
|
|
return res |