odoo/ext/custom-addons/dp_custom/models/product.py

156 lines
6.2 KiB
Python

# -*- coding: utf-8 -*-
##############################################################################
#
# datenpol gmbh
# Copyright (C) 2013-TODAY datenpol gmbh (<http://www.datenpol.at/>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from odoo import fields, models, api, _
from odoo.exceptions import ValidationError
from odoo.addons.component.core import Component
class ProductXCategory(models.Model):
_name = 'product.xcategory'
_description = 'X-Kategorie'
_order = 'name'
name = fields.Char(string='Bezaichnung', required=True)
_sql_constraints = [
('name_uniq', 'unique(name)', 'Die Bezeichnung muss eindeutig sein')
]
class ProductTemplate(models.Model):
_name = 'product.template'
_inherit = ['product.template', 'dp_custom.helper']
SURFACE_OPTIONS = [
('m', 'Maserrichtung'),
('u', 'Einfärbig')
]
length = fields.Float(string='Länge in mm')
width = fields.Float(string='Breite in mm')
thickness = fields.Float(string='Dicke in mm', help='Echte Dicke in mm')
height = fields.Float(string='Höhe in mm')
surface = fields.Selection(SURFACE_OPTIONS, string='Oberfläche')
is_internal = fields.Boolean()
xcat_id = fields.Many2one(comodel_name='product.xcategory', string='X-Kategorie')
material_type_id = fields.Many2one(comodel_name='material.type', string='Materialtyp')
assembly_line_ids = fields.Many2many(comodel_name='res.line', string='Produktionslinien')
notes = fields.Text(string='Notizen')
can_be_sold_unconfigured = fields.Boolean(string='Darf unkonfiguriert verkauft werden')
@api.model
def create_product(self, vals):
vals = self.remove_not_specified_fields(vals)
vals = self.correct_values(vals)
product_template = self.with_context(active_test=False).search([('default_code', '=', vals['default_code'])])
if product_template:
product_template.write(vals)
else:
self.create(vals)
return True
@api.model
def correct_values(self, vals):
if vals.get('xcat_id', False):
xcat = self.env['product.xcategory'].search([('name', '=', vals['xcat_id'])])
if xcat:
vals['xcat_id'] = xcat.id
else:
raise ValidationError(
_("X-Kategorie \'%s\' kann nicht zugeordnet werden" % vals['xcat_id']))
if vals.get('categ_id', False):
categ_id = self.env['product.category'].search([('code', '=', vals['categ_id'])])
if categ_id:
vals['categ_id'] = categ_id.id
else:
raise ValidationError(
_("Kategorie \'%s\' kann nicht zugeordnet werden" % vals['categ_id']))
if vals.get('material_type_id', False):
material_type = self.env['material.type'].search([('name', '=', vals['material_type_id'])])
if material_type:
vals['material_type_id'] = material_type.id
else:
raise ValidationError(
_("Materialtyp \'%s\' kann nicht zugeordnet werden" % vals['material_type_id']))
if vals.get('intrastat_id', False):
intrastat = self.env['report.intrastat.code'].search([('name', '=', vals['intrastat_id'])])
if intrastat:
vals['intrastat_id'] = intrastat.id
else:
raise ValidationError(
_("Intrastat-Code \'%s\' kann nicht zugeordnet werden" % vals['intrastat_id']))
if vals.get('assembly_line_ids', False):
assembly_line_ids = []
for assembly_line_code in vals['assembly_line_ids']:
assembly_line = self.env['res.line'].search([('name', '=', assembly_line_code)])
if assembly_line:
assembly_line_ids.append(assembly_line.id)
else:
raise ValidationError(
_("Produktionslinie \'%s\' kann nicht zugeordnet werden" % assembly_line_code))
vals['assembly_line_ids'] = [(6, 0, assembly_line_ids)]
return vals
@api.model
def _get_specified_fields(self):
return ['default_code', 'name', 'length', 'width', 'thickness', 'surface', 'active', 'weight', 'is_internal',
'xcat_id', 'notes', 'material_type_id', 'intrastat_id', 'sale_ok', 'assembly_line_ids', 'list_price',
'height', 'categ_id']
class ProductCategory(models.Model):
_inherit = 'product.category'
code = fields.Char(string='Code')
class ProductPricelistItemEventListener(Component):
_name = 'product.pricelist.item.listener'
_inherit = 'base.event.listener'
_apply_on = ['product.pricelist.item']
@api.model
def on_record_write(self, record, fields=None):
partners = self.env['res.partner'].search([('property_product_pricelist', '=', record.id)])
for partner in partners:
if partner.portal_id and partner.active:
partner.portal_export_pending = True
@api.model
def on_record_create(self, record, fields=None):
partners = self.env['res.partner'].search([('property_product_pricelist', '=', record.id)])
for partner in partners:
if partner.portal_id:
partner.portal_export_pending = True
@api.model
def on_record_unlink(self, record):
partners = self.env['res.partner'].search([('property_product_pricelist', '=', record.id)])
for partner in partners:
if partner.portal_id:
partner.portal_export_pending = True