fix: se limpia código para migración 6.8

This commit is contained in:
sinergia 2023-11-07 16:42:00 -05:00
parent 84cf02962a
commit cc8f90a9d7
6 changed files with 200 additions and 193 deletions

View File

@ -1,30 +1,31 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of # This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms. # this repository contains the full copyright notices and license terms.
from trytond.model import ( from trytond.model import (
Workflow, ModelSQL, ModelView,fields, sequence_ordered) Workflow, ModelSQL, ModelView, fields, sequence_ordered)
from trytond.pyson import Bool, Eval, If, Id, Equal from trytond.pyson import Bool, Eval, If, Id, Equal
from trytond.pool import Pool from trytond.pool import Pool
from trytond.modules.company import CompanyReport from trytond.modules.company import CompanyReport
from trytond.transaction import Transaction from trytond.transaction import Transaction
_digits = (16, 2) _digits = (16, 2)
_states = {'readonly': If(Eval('state') != 'draft', True)} _states = {'readonly': If(Eval('state') != 'draft', True)}
class Calibration(ModelSQL, ModelView): class Calibration(ModelSQL, ModelView):
'Calibration of Maintenance' 'Calibration of Maintenance'
__name__ = 'optical_equipment.maintenance.calibration' __name__ = 'optical_equipment.maintenance.calibration'
_states={'readonly': True} _states = {'readonly': True}
maintenance = fields.Many2One('optical_equipment.maintenance', "Maintenance", ondelete="CASCADE", maintenance = fields.Many2One('optical_equipment.maintenance', "Maintenance", ondelete="CASCADE",
select=True, required=True) required=True)
graph_dates = fields.Char("Graph Dates", readonly=True) graph_dates = fields.Char("Graph Dates", readonly=True)
diopter = fields.Float("Diopter", states=_states) diopter = fields.Float("Diopter", states=_states)
mean = fields.Float("Mean", states=_states) mean = fields.Float("Mean", states=_states)
dev_std = fields.Float("Standart Desviation", states=_states) dev_std = fields.Float("Standart Desviation", states=_states)
uncertain_type_A = fields.Float("Uncertain Type A", states=_states) uncertain_type_A = fields.Float("Uncertain Type A", states=_states)
uncertain_pattern = fields.Float("Uncertain Pattern", states=_states) uncertain_pattern = fields.Float("Uncertain Pattern", states=_states)
k_c_calibration = fields.Float("K Crt Calibration",states=_states) k_c_calibration = fields.Float("K Crt Calibration", states=_states)
uncertain_U_b1 = fields.Float("U_b1", states=_states) uncertain_U_b1 = fields.Float("U_b1", states=_states)
d_resolution = fields.Float("d_resolution", states=_states) d_resolution = fields.Float("d_resolution", states=_states)
uncertain_U_b2_dig = fields.Float("U_b2", states=_states) uncertain_U_b2_dig = fields.Float("U_b2", states=_states)
@ -32,25 +33,26 @@ class Calibration(ModelSQL, ModelView):
uncertain_combinated = fields.Float("U_combinated", states=_states) uncertain_combinated = fields.Float("U_combinated", states=_states)
uncertain_eff = fields.Float("U eff", states=_states) uncertain_eff = fields.Float("U eff", states=_states)
t_student = fields.Float("T Student", states=_states) t_student = fields.Float("T Student", states=_states)
uncertain_expanded = fields.Float("Uexpand", _digits, states=_states) uncertain_expanded = fields.Float("Uexpand", _digits, states=_states)
state = fields.Char('State') state = fields.Char('State')
class CalibrationSample(sequence_ordered(), ModelView, ModelSQL): class CalibrationSample(sequence_ordered(), ModelView, ModelSQL):
'Samples of Calibration' 'Samples of Calibration'
__name__ = 'optical_equipment.maintenance.calibration_sample' __name__ = 'optical_equipment.maintenance.calibration_sample'
maintenance = fields.Many2One('optical_equipment.maintenance', 'Maintenance') maintenance = fields.Many2One('optical_equipment.maintenance', 'Maintenance')
product = fields.Function(fields.Integer("Product ID"), 'on_change_with_product') product = fields.Function(fields.Integer("Product ID"), 'on_change_with_product')
number_sample = fields.Float("Sample #", _digits) number_sample = fields.Float("Sample #", _digits)
value_patterns = fields.Many2One('optical_equipment.product_pattern', "Value Pattern", ondelete='RESTRICT', required=True, value_patterns = fields.Many2One('optical_equipment.product_pattern', "Value Pattern", ondelete='RESTRICT', required=True,
domain=[('product', '=', Eval('product'))], domain=[('product', '=', Eval('product'))],
depends=['product']) depends=['product'])
value_equipment = fields.Float("Value in Equipment", _digits, required=True, value_equipment = fields.Float("Value in Equipment", _digits, required=True,
states={'readonly': Eval('value_patterns') == None}) states={'readonly': Eval('value_patterns') is None})
mistake = fields.Float("Mistake", _digits) mistake = fields.Float("Mistake", _digits)
mistake_rate = fields.Float("% Mistake", _digits, mistake_rate = fields.Float("% Mistake", _digits,
states={'readonly': True}, states={'readonly': True},
depends=['mistake']) depends=['mistake'])
@ -58,7 +60,7 @@ class CalibrationSample(sequence_ordered(), ModelView, ModelSQL):
def on_change_with_product(self, name=None): def on_change_with_product(self, name=None):
if self.maintenance: if self.maintenance:
return self.maintenance.equipment.product.template.id return self.maintenance.equipment.product.template.id
@fields.depends('value_patterns', 'value_equipment', @fields.depends('value_patterns', 'value_equipment',
'mistake', 'mistake_rate') 'mistake', 'mistake_rate')
def on_change_value_equipment(self): def on_change_value_equipment(self):
@ -75,7 +77,7 @@ class CalibrationSample(sequence_ordered(), ModelView, ModelSQL):
else: else:
self.mistake_rate = abs(self.mistake / self.value_patterns.pattern) * 100 self.mistake_rate = abs(self.mistake / self.value_patterns.pattern) * 100
class CalibrationReport(CompanyReport): class CalibrationReport(CompanyReport):
__name__ = 'optical_equipment.maintenance' __name__ = 'optical_equipment.maintenance'

View File

@ -15,6 +15,7 @@ from trytond.modules.product import price_digits
import datetime import datetime
from datetime import timedelta, date from datetime import timedelta, date
class Cron(metaclass=PoolMeta): class Cron(metaclass=PoolMeta):
__name__ = 'ir.cron' __name__ = 'ir.cron'
@ -25,34 +26,33 @@ class Cron(metaclass=PoolMeta):
('optical_equipment.contract|contract_expiration', 'Contract Expiration'), ('optical_equipment.contract|contract_expiration', 'Contract Expiration'),
) )
class Contract(Workflow, ModelSQL, ModelView): class Contract(Workflow, ModelSQL, ModelView):
'Contracts' 'Contracts'
__name__ = 'optical_equipment.contract' __name__ = 'optical_equipment.contract'
_rec_name = 'number' _rec_name = 'number'
_order_name = 'number' _order_name = 'number'
company = fields.Many2One( company = fields.Many2One(
'company.company', "Company", required=True, select=True, 'company.company', "Company", required=True,
states={ states={
'readonly': (Eval('state') != 'draft') | Eval('party', True), 'readonly': (Eval('state') != 'draft') | Eval('party', True),
},help="Make the subscription belong to the company.") }, help="Make the subscription belong to the company.")
number = fields.Char( number = fields.Char(
"Number", readonly=True, select=True, "Number", readonly=True,
help="The main identification of the subscription.") help="The main identification of the subscription.")
reference = fields.Char( reference = fields.Char(
"Reference", select=True, "Reference",
help="The identification of an external origin.") help="The identification of an external origin.")
description = fields.Char("Description", description = fields.Char("Description",
states={ states={
'readonly': Eval('state') != 'draft', 'readonly': Eval('state') != 'draft',
}) })
party = fields.Many2One( party = fields.Many2One(
'party.party', "Party", required=True, 'party.party', "Party", required=True,
states={ states={
'readonly': (Eval('state') != 'draft') | Eval('party', True), 'readonly': (Eval('state') != 'draft') | Eval('party', True),
},help="The party who subscribes.") }, help="The party who subscribes.")
equipment = fields.Many2One('optical_equipment.equipment', "Equipment") equipment = fields.Many2One('optical_equipment.equipment', "Equipment")
contact = fields.Many2One('party.contact_mechanism', "Contact", required=True) contact = fields.Many2One('party.contact_mechanism', "Contact", required=True)
invoice_address = fields.Many2One('party.address', 'Invoice Address', invoice_address = fields.Many2One('party.address', 'Invoice Address',
@ -73,26 +73,24 @@ class Contract(Workflow, ModelSQL, ModelView):
'readonly': Eval('state') != 'draft', 'readonly': Eval('state') != 'draft',
}) })
maintenance_services = fields.Many2Many('optical_equipment_maintenance.service-equipment.contract', maintenance_services = fields.Many2Many('optical_equipment_maintenance.service-equipment.contract',
'contract', 'maintenance_services', "Prorogues", 'contract', 'maintenance_services', "Prorogues",
states={'readonly': Eval('state') != 'draft'}) states={'readonly': Eval('state') != 'draft'})
current_equipments = fields.Many2Many('optical_equipment.contract-optical_equipment.equipment', current_equipments = fields.Many2Many('optical_equipment.contract-optical_equipment.equipment',
'contract', 'equipment', "Current Equipments", 'contract', 'equipment', "Current Equipments",
states={'readonly': Eval('state') != 'draft'}) states={'readonly': Eval('state') != 'draft'})
history_equipments = fields.One2Many('optical_equipment.equipment', 'contract', "Equipments", history_equipments = fields.One2Many('optical_equipment.equipment', 'contract', "Equipments",
states={'readonly': Eval('state') != 'draft'}) states={'readonly': Eval('state') != 'draft'})
price_contract = Monetary("Price Contract", digits=price_digits, currency='currency', required=True, price_contract = Monetary("Price Contract", digits=price_digits, currency='currency', required=True,
states={'readonly': Eval('state') != 'draft'}) states={'readonly': Eval('state') != 'draft'})
state = fields.Selection([ state = fields.Selection([
('draft', "Draft"), ('draft', "Draft"),
('running', "Running"), ('running', "Running"),
('closed', "Closed"), ('closed', "Closed"),
('cancelled', "Cancelled"), ('cancelled', "Cancelled"),
], "State", readonly=True, required=False, sort=False, ], "State", readonly=True, required=False, sort=False,
help="The current state of the subscription.") help="The current state of the subscription.")
@classmethod @classmethod
def __setup__(cls): def __setup__(cls):
@ -100,7 +98,7 @@ class Contract(Workflow, ModelSQL, ModelView):
cls._order = [ cls._order = [
('number', 'DESC NULLS FIRST'), ('number', 'DESC NULLS FIRST'),
('id', 'DESC'), ('id', 'DESC'),
] ]
cls._transitions = ({ cls._transitions = ({
('draft', 'running'), ('draft', 'running'),
('running', 'draft'), ('running', 'draft'),
@ -109,13 +107,12 @@ class Contract(Workflow, ModelSQL, ModelView):
('cancelled', 'draft') ('cancelled', 'draft')
}) })
cls._buttons.update({ cls._buttons.update({
'draft': {'invisible': Eval('state').in_(['draft','closed'])}, 'draft': {'invisible': Eval('state').in_(['draft', 'closed'])},
'running': {'invisible': Eval('state').in_(['cancelled', 'running'])}, 'running': {'invisible': Eval('state').in_(['cancelled', 'running'])},
'closed': {'invisible': Eval('state').in_(['draft','cancelled'])}, 'closed': {'invisible': Eval('state').in_(['draft', 'cancelled'])},
'cancelled': {'invisible': Eval('state').in_(['draft', 'cancelled'])} 'cancelled': {'invisible': Eval('state').in_(['draft', 'cancelled'])}
}) })
@staticmethod @staticmethod
def default_company(): def default_company():
return Transaction().context.get('company') return Transaction().context.get('company')
@ -129,8 +126,8 @@ class Contract(Workflow, ModelSQL, ModelView):
pool = Pool() pool = Pool()
Config = pool.get('optical_equipment.configuration') Config = pool.get('optical_equipment.configuration')
config = Config(4) config = Config(4)
if config.contract_sequence != None: if config.contract_sequence is not None:
if not contracts[0].number: if not contracts[0].number:
try: try:
contracts[0].number = config.contract_sequence.get() contracts[0].number = config.contract_sequence.get()
@ -151,7 +148,7 @@ class Contract(Workflow, ModelSQL, ModelView):
if contracts_to_expire != []: if contracts_to_expire != []:
for contract in contracts_to_expire: for contract in contracts_to_expire:
cls.closed([contract]) cls.closed([contract])
@classmethod @classmethod
@ModelView.button @ModelView.button
@Workflow.transition('draft') @Workflow.transition('draft')
@ -172,7 +169,6 @@ class Contract(Workflow, ModelSQL, ModelView):
equipment.state = "uncontrated" equipment.state = "uncontrated"
equipment.save() equipment.save()
@classmethod @classmethod
@ModelView.button @ModelView.button
@Workflow.transition('running') @Workflow.transition('running')
@ -184,7 +180,7 @@ class Contract(Workflow, ModelSQL, ModelView):
equipment.save() equipment.save()
cls.set_number(contracts) cls.set_number(contracts)
contract.state='running' contract.state = 'running'
contract.save() contract.save()
@classmethod @classmethod
@ -196,23 +192,24 @@ class Contract(Workflow, ModelSQL, ModelView):
equipment.state = "uncontrated" equipment.state = "uncontrated"
equipment.save() equipment.save()
class ContractMaintenanceServices(ModelSQL): class ContractMaintenanceServices(ModelSQL):
'Contract - Maintenance Services' 'Contract - Maintenance Services'
__name__ = 'optical_equipment_maintenance.service-equipment.contract' __name__ = 'optical_equipment_maintenance.service-equipment.contract'
maintenance_services = fields.Many2One('optical_equipment_maintenance.service', "Maintenance Service", select=True) maintenance_services = fields.Many2One(
'optical_equipment_maintenance.service', "Maintenance Service", )
contract = fields.Many2One('optical_equipment.contract', "Contract") contract = fields.Many2One('optical_equipment.contract', "Contract")
class ContractEquipment(ModelSQL): class ContractEquipment(ModelSQL):
'Optical Equipment - Contract' 'Optical Equipment - Contract'
__name__ = 'optical_equipment.contract-optical_equipment.equipment' __name__ = 'optical_equipment.contract-optical_equipment.equipment'
equipment = fields.Many2One('optical_equipment.equipment', 'Equipment', select=True)
contract = fields.Many2One('optical_equipment.contract', 'Contract', select=True)
equipment = fields.Many2One('optical_equipment.equipment', 'Equipment', )
contract = fields.Many2One('optical_equipment.contract', 'Contract', )
class ContractReport(CompanyReport): class ContractReport(CompanyReport):
__name__ = 'optical_equipment.contract' __name__ = 'optical_equipment.contract'
@ -230,30 +227,30 @@ class ContractReport(CompanyReport):
return context return context
class CreateContractInitial(ModelView, ModelSQL): class CreateContractInitial(ModelView, ModelSQL):
'Create Contract Inicial' 'Create Contract Inicial'
__name__ = 'optical_equipment_create.contract' __name__ = 'optical_equipment_create.contract'
currency = fields.Many2One('currency.currency', 'Currency', required=True) currency = fields.Many2One('currency.currency', 'Currency', required=True)
company = fields.Many2One( company = fields.Many2One(
'company.company', "Company", readonly=True, required=True, select=True, 'company.company', "Company", readonly=True, required=True,
states={ states={
'readonly': (Eval('state') != 'draft') | Eval('party', True), 'readonly': (Eval('state') != 'draft') | Eval('party', True),
},help="Make the subscription belong to the company.") }, help="Make the subscription belong to the company.")
party = fields.Many2One( party = fields.Many2One(
'party.party', "Party", required=True, 'party.party', "Party", required=True,
help="The party who subscribes.") help="The party who subscribes.")
invoice_address = fields.Many2One('party.address', 'Invoice Address', invoice_address = fields.Many2One('party.address', 'Invoice Address',
required=True, domain=[('party', '=', Eval('party'))]) required=True, domain=[('party', '=', Eval('party'))])
payment_term = fields.Many2One('account.invoice.payment_term', payment_term = fields.Many2One('account.invoice.payment_term',
'Payment Term') 'Payment Term')
contact = fields.Many2One( contact = fields.Many2One(
'party.contact_mechanism', "Contact", required=True, 'party.contact_mechanism', "Contact", required=True,
domain=[('party', '=', Eval('party'))], domain=[('party', '=', Eval('party'))],
context={ context={
'company': Eval('company', -1), 'company': Eval('company', -1),
}) })
start_date = fields.Date("Start Date", required=True) start_date = fields.Date("Start Date", required=True)
end_date = fields.Date("End Date", end_date = fields.Date("End Date",
domain=['OR', domain=['OR',
@ -264,7 +261,7 @@ class CreateContractInitial(ModelView, ModelSQL):
('end_date', '=', None), ('end_date', '=', None),
]) ])
unit_price = Monetary("Unit Price", digits=price_digits, currency='currency', required=True) unit_price = Monetary("Unit Price", digits=price_digits, currency='currency', required=True)
@staticmethod @staticmethod
def default_company(): def default_company():
return Transaction().context.get('company') return Transaction().context.get('company')
@ -275,37 +272,35 @@ class CreateContractInitial(ModelView, ModelSQL):
if Transaction().context.get('company'): if Transaction().context.get('company'):
company = Company(Transaction().context['company']) company = Company(Transaction().context['company'])
return company.currency.id return company.currency.id
@classmethod @classmethod
def default_start_date(cls): def default_start_date(cls):
pool = Pool() pool = Pool()
Date = pool.get('ir.date') Date = pool.get('ir.date')
return Date.today() return Date.today()
@fields.depends('party') @fields.depends('party')
def on_change_party(self): def on_change_party(self):
pool = Pool() pool = Pool()
Date = pool.get('ir.date') Date = pool.get('ir.date')
if self.party: if self.party:
self.invoice_address = self.party.address_get(type='invoice') self.invoice_address = self.party.address_get(type='invoice')
if self.party.customer_type == "ips": if self.party.customer_type == "ips":
self.end_date = Date.today() + timedelta(days=182) self.end_date = Date.today() + timedelta(days=182)
else: else:
self.end_date = Date.today() + timedelta(days=365) self.end_date = Date.today() + timedelta(days=365)
class CreateContract(Wizard): class CreateContract(Wizard):
__name__ = 'optical_equipment.maintenance.contract' __name__ = 'optical_equipment.maintenance.contract'
start = StateView('optical_equipment_create.contract', start = StateView('optical_equipment_create.contract',
'optical_equipment.create_contract_view_form',[ 'optical_equipment.create_contract_view_form', [
Button('Cancel', 'end', 'tryton-cancel'), Button('Cancel', 'end', 'tryton-cancel'),
Button('Create', 'create_contract', 'tryton-ok', default=True), Button('Create', 'create_contract', 'tryton-ok', default=True),
]) ])
create_contract = StateAction('optical_equipment.act_contract_form') create_contract = StateAction('optical_equipment.act_contract_form')
def default_start(self, fields): def default_start(self, fields):
if self.record: if self.record:
default = {'party': self.record.propietary.id, default = {'party': self.record.propietary.id,
@ -315,7 +310,7 @@ class CreateContract(Wizard):
else self.record.sale_origin.total_amount), else self.record.sale_origin.total_amount),
} }
return default return default
@property @property
def _subscription_start(self): def _subscription_start(self):
return dict( return dict(
@ -326,7 +321,7 @@ class CreateContract(Wizard):
invoice_address=self.start.invoice_address, invoice_address=self.start.invoice_address,
unit_price=self.start.unit_price unit_price=self.start.unit_price
) )
def do_create_contract(self, action): def do_create_contract(self, action):
maintenance_service = self.records[0] maintenance_service = self.records[0]
pool = Pool() pool = Pool()
@ -340,26 +335,26 @@ class CreateContract(Wizard):
equipments.append(line.equipment.id) equipments.append(line.equipment.id)
if maintenance_service.contract_origin: if maintenance_service.contract_origin:
contract=maintenance_service.contract_origin contract = maintenance_service.contract_origin
contract.history_equipments+=tuple(equipments) contract.history_equipments += tuple(equipments)
contract.current_equipments=equipments contract.current_equipments = equipments
contract.invoice_address=dates['invoice_address'] contract.invoice_address = dates['invoice_address']
contract.contact=dates['contact'] contract.contact = dates['contact']
contract.start_date=dates['start_date'] contract.start_date = dates['start_date']
contract.end_date=dates['end_date'] contract.end_date = dates['end_date']
contract.maintenance_services+=prorogues contract.maintenance_services += prorogues
contract.state='draft' contract.state = 'draft'
contract.price_contract=dates['unit_price'] contract.price_contract = dates['unit_price']
else: else:
contract = Contract(party=dates['party'], contract = Contract(party=dates['party'],
invoice_address=dates['invoice_address'], invoice_address=dates['invoice_address'],
contact=dates['contact'], contact=dates['contact'],
start_date=dates['start_date'], start_date=dates['start_date'],
end_date=dates['end_date'], end_date=dates['end_date'],
maintenance_services=prorogues, maintenance_services=prorogues,
current_equipments=equipments, current_equipments=equipments,
state='draft', state='draft',
price_contract=dates['unit_price'] price_contract=dates['unit_price']
) )
contract.save() contract.save()

View File

@ -7,7 +7,7 @@ class Diary(ModelSQL, ModelView):
__name__ = 'optical_equipment_maintenance.diary' __name__ = 'optical_equipment_maintenance.diary'
_rec_name = 'code' _rec_name = 'code'
code = fields.Char("Code", select=True, states={'readonly': True}) code = fields.Char("Code", states={'readonly': True})
date_expected = fields.DateTime("Expected Date", required=True) date_expected = fields.DateTime("Expected Date", required=True)
date_estimated = fields.DateTime("Estimated Date") date_estimated = fields.DateTime("Estimated Date")
date_end = fields.DateTime("Date End") date_end = fields.DateTime("Date End")

View File

@ -37,7 +37,7 @@ class OpticalEquipment(DeactivableMixin, Workflow, ModelSQL, ModelView):
} }
code = fields.Char( code = fields.Char(
"Code", select=True, states={'readonly': True}) "Code", states={'readonly': True})
state = fields.Selection([('draft', "Draft"), state = fields.Selection([('draft', "Draft"),
('registred', "Registred"), ('registred', "Registred"),
@ -119,11 +119,11 @@ class OpticalEquipment(DeactivableMixin, Workflow, ModelSQL, ModelView):
maintenance_frequency = fields.Selection(_MAINTENANCE_FREQUENCY, "Maintenance Frequency", maintenance_frequency = fields.Selection(_MAINTENANCE_FREQUENCY, "Maintenance Frequency",
depends=['propietary']) depends=['propietary'])
purchase_origin = fields.Reference("Purchase Origin", selection='get_origin', select=True, purchase_origin = fields.Reference("Purchase Origin", selection='get_origin',
states={'readonly': True}) states={'readonly': True})
sale_destination = fields.Reference("Sale Destination", selection='get_destination', select=True, sale_destination = fields.Reference("Sale Destination", selection='get_destination',
states={'readonly': True}) states={'readonly': True})
shipment_destination = fields.Reference("Stock Move", selection='get_shipment', select=True, shipment_destination = fields.Reference("Stock Move", selection='get_shipment',
states={'readonly': True}) states={'readonly': True})
rec_name = fields.Function(fields.Char("rec_name"), 'get_rec_name') rec_name = fields.Function(fields.Char("rec_name"), 'get_rec_name')
@ -354,24 +354,24 @@ class EquipmentMaintenance(ModelSQL, ModelView):
'Optical Equipment - Equipment - Maintenance' 'Optical Equipment - Equipment - Maintenance'
__name__ = 'optical_equipment.maintenance-optical_equipment.equipment' __name__ = 'optical_equipment.maintenance-optical_equipment.equipment'
equipment = fields.Many2One('optical_equipment.equipment', 'Equipment', select=True) equipment = fields.Many2One('optical_equipment.equipment', 'Equipment', )
maintenance = fields.Many2One('optical_equipment.maintenance', 'Maintenances', select=True) maintenance = fields.Many2One('optical_equipment.maintenance', 'Maintenances', )
class EquipmentContract(ModelSQL, ModelView): class EquipmentContract(ModelSQL, ModelView):
'Optical Equipment - Contracs Equipment' 'Optical Equipment - Contracs Equipment'
__name__ = 'optical_equipment.contract-optical_equipment.equipment' __name__ = 'optical_equipment.contract-optical_equipment.equipment'
equipment = fields.Many2One('optical_equipment.equipment', 'Equipment', select=True) equipment = fields.Many2One('optical_equipment.equipment', 'Equipment', )
contract = fields.Many2One('optical_equipment.contract', 'Contract', select=True) contract = fields.Many2One('optical_equipment.contract', 'Contract', )
class EquipmentParty(ModelSQL, ModelView): class EquipmentParty(ModelSQL, ModelView):
'Optical Equipment - Party' 'Optical Equipment - Party'
__name__ = 'optical_equipment.equipment-party.party' __name__ = 'optical_equipment.equipment-party.party'
equipment = fields.Many2One('optical_equipment.equipment', "Equipment", select=True) equipment = fields.Many2One('optical_equipment.equipment', "Equipment", )
party = fields.Many2One('party.party', "Party", select=True) party = fields.Many2One('party.party', "Party", )
class ChangePropietary(ModelView): class ChangePropietary(ModelView):

View File

@ -33,16 +33,16 @@ class MaintenanceService(Workflow, ModelSQL, ModelView):
_states = {'readonly': If(Eval('state') != 'draft', True)} _states = {'readonly': If(Eval('state') != 'draft', True)}
code = fields.Char("Code", readonly=True, select=True) code = fields.Char("Code", readonly=True, )
reference = fields.Char("Reference", select=True, reference = fields.Char("Reference",
help="The identification of an external origin.") help="The identification of an external origin.")
description = fields.Char("Description", states=_states) description = fields.Char("Description", states=_states)
sale_date = fields.Char("Sale Date") sale_date = fields.Char("Sale Date")
contract_origin = fields.Reference( contract_origin = fields.Reference(
"Contract Base", selection='get_origin_contract', select=True, "Contract Base", selection='get_origin_contract',
states={'readonly': If(Eval('state') == 'finished', True)}) states={'readonly': If(Eval('state') == 'finished', True)})
sale_origin = fields.Reference( sale_origin = fields.Reference(
"Sale Origin", selection='get_origin', select=True, "Sale Origin", selection='get_origin',
states={'readonly': True}) states={'readonly': True})
company = fields.Many2One('company.company', "Company", readonly=True) company = fields.Many2One('company.company', "Company", readonly=True)
maintenance_type = fields.Selection([('initial', 'Initial'), maintenance_type = fields.Selection([('initial', 'Initial'),
@ -285,12 +285,12 @@ class MaintenanceServiceLine(Workflow, ModelSQL, ModelView):
'readonly': Eval('state').in_(['finished'])} 'readonly': Eval('state').in_(['finished'])}
service_maintenance = fields.Many2One('optical_equipment_maintenance.service', "Maintenance Service", service_maintenance = fields.Many2One('optical_equipment_maintenance.service', "Maintenance Service",
ondelete='CASCADE', select=True, ondelete='CASCADE',
domain=[('state', 'in', ['draft', 'in_progress', 'finished']), domain=[('state', 'in', ['draft', 'in_progress', 'finished']),
('propietary', '=', Eval('propietary'))], ('propietary', '=', Eval('propietary'))],
states=_states) states=_states)
code = fields.Char( code = fields.Char(
"Code", select=True, states={'readonly': True}) "Code", states={'readonly': True})
maintenance_type = fields.Selection([('initial', 'Initial'), maintenance_type = fields.Selection([('initial', 'Initial'),
('preventive', 'Preventive'), ('preventive', 'Preventive'),
('corrective', 'Corrective')], "Maintenance Type", states=_states) ('corrective', 'Corrective')], "Maintenance Type", states=_states)
@ -782,7 +782,7 @@ class MaintenanceLine(ModelSQL, ModelView):
'optical_equipment.maintenance', 'optical_equipment.maintenance',
'Maintenance', 'Maintenance',
ondelete='CASCADE', ondelete='CASCADE',
select=True) )
replacement = fields.Many2One('product.product', 'Replacement', ondelete='RESTRICT', replacement = fields.Many2One('product.product', 'Replacement', ondelete='RESTRICT',
domain=[('replacement', '=', True)], domain=[('replacement', '=', True)],
states={'invisible': (If(Eval('line_maintenance_activity') == True, True)) | (If(Eval('line_replace') == False, True)), states={'invisible': (If(Eval('line_maintenance_activity') == True, True)) | (If(Eval('line_replace') == False, True)),

View File

@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of # This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms # this repository contains the full copyright notices and license terms
from trytond.pool import Pool, PoolMeta from trytond.pool import Pool, PoolMeta
from trytond.model import ( from trytond.model import (
ModelView, ModelSQL, fields, Exclude) ModelView, ModelSQL, fields, Exclude)
from trytond.pyson import Bool, If, Eval, Id from trytond.pyson import Bool, If, Eval, Id
@ -17,13 +17,13 @@ _USE = [('', ""),
('apoyo', 'Apoyo')] ('apoyo', 'Apoyo')]
_BIOMEDICAL_CLASS = [ _BIOMEDICAL_CLASS = [
('n/a', "No aplíca"), ('n/a', "No aplíca"),
('diagnostico', 'Diagnóstico'), ('diagnostico', 'Diagnóstico'),
('rehabilitación', 'Rehabilitación')] ('rehabilitación', 'Rehabilitación')]
_MAIN_TECNOLOGY = [ _MAIN_TECNOLOGY = [
('', ""), ('', ""),
('mecanico', 'Mecánico'), ('mecanico', 'Mecánico'),
('electrico', 'Electrico'), ('electrico', 'Electrico'),
('electronico', 'Electrónico'), ('electronico', 'Electrónico'),
('hidraulico', 'Hidraulico'), ('hidraulico', 'Hidraulico'),
@ -38,38 +38,39 @@ _EQUIPMENT_TYPE = [
NON_MEASURABLE = ['service'] NON_MEASURABLE = ['service']
class Template(metaclass=PoolMeta): class Template(metaclass=PoolMeta):
'Template' 'Template'
__name__ = 'product.template' __name__ = 'product.template'
product = fields.Many2One('optical_equipment.maintenance', "Maintenance Activity", product = fields.Many2One('optical_equipment.maintenance', "Maintenance Activity",
ondelete='CASCADE', select=True) ondelete='CASCADE',)
equipment = fields.Boolean('It is equipment', equipment = fields.Boolean('It is equipment',
states={'invisible': Eval('type', 'goods') != 'goods', states={'invisible': Eval('type', 'goods') != 'goods',
}) })
maintenance_activity = fields.Boolean('Maintenance Activity', maintenance_activity = fields.Boolean('Maintenance Activity',
states={'invisible': Eval('type', 'service') != 'service', states={'invisible': Eval('type', 'service') != 'service',
'readonly': If(Eval('equipment',True), True) 'readonly': If(Eval('equipment', True), True)
| If(Eval('replacement',True), True) | If(Eval('replacement', True), True)
}) })
replacement = fields.Boolean('Replacement', replacement = fields.Boolean('Replacement',
states={'invisible': Eval('type', 'goods') != 'goods', states={'invisible': Eval('type', 'goods') != 'goods',
'readonly': If(Eval('equipment',True), True) 'readonly': If(Eval('equipment', True), True)
| If(Eval('maintenance_activity',True), True) | If(Eval('maintenance_activity', True), True)
}) })
maintenance_required = fields.Boolean('Miantenance Required', maintenance_required = fields.Boolean('Miantenance Required',
states={'invisible': (Eval('type', 'goods') != 'goods')}) states={'invisible': (Eval('type', 'goods') != 'goods')})
equipment_type = fields.Selection(_EQUIPMENT_TYPE, 'Equipment type', equipment_type = fields.Selection(_EQUIPMENT_TYPE, 'Equipment type',
states={'required': Eval('equipment', False)}) states={'required': Eval('equipment', False)})
risk = fields.Selection(_RISK, 'Type risk') risk = fields.Selection(_RISK, 'Type risk')
use = fields.Selection(_USE, 'Use', use = fields.Selection(_USE, 'Use',
states={'required': Eval('equipment', False)}, states={'required': Eval('equipment', False)},
depends={'equipment'}) depends={'equipment'})
biomedical_class = fields.Selection(_BIOMEDICAL_CLASS,'Biomedical Class', biomedical_class = fields.Selection(_BIOMEDICAL_CLASS, 'Biomedical Class',
states={'required': Eval('equipment', False)}) states={'required': Eval('equipment', False)})
main_tecnology = fields.Selection(_MAIN_TECNOLOGY,'Main tecnology', main_tecnology = fields.Selection(_MAIN_TECNOLOGY, 'Main tecnology',
states={'required': Eval('equipment', False)}) states={'required': Eval('equipment', False)})
calibration = fields.Boolean("Apply calibration") calibration = fields.Boolean("Apply calibration")
observation = fields.Text('Observation') observation = fields.Text('Observation')
@ -78,91 +79,103 @@ class Template(metaclass=PoolMeta):
domain=[('parent', '=', None), domain=[('parent', '=', None),
('accounting', '=', False)], ('accounting', '=', False)],
states={'required': Eval('equipment', False)}) states={'required': Eval('equipment', False)})
model_category = fields.Many2One('product.category', "Model", model_category = fields.Many2One('product.category', "Model",
domain=[('parent', '=', Eval('mark_category')), domain=[('parent', '=', Eval('mark_category')),
('accounting', '=', False)], ('accounting', '=', False)],
states={'required': Eval('equipment', False)}) states={'required': Eval('equipment', False)})
reference_category = fields.Many2One('product.category', "Reference", reference_category = fields.Many2One('product.category', "Reference",
domain=[('parent', '=', Eval('model_category'))],) domain=[('parent', '=', Eval('model_category'))],)
# Iformation Equipment # Iformation Equipment
origin_country = fields.Many2One('country.country',"Origin Country") origin_country = fields.Many2One('country.country', "Origin Country")
refurbish = fields.Boolean('Refurbish') refurbish = fields.Boolean('Refurbish')
software_required = fields.Boolean("Software Required") software_required = fields.Boolean("Software Required")
software_version = fields.Char("Software version", software_version = fields.Char("Software version",
states={'invisible': If(~Eval('software_required'), True)}, states={'invisible': If(~Eval('software_required'), True)},
depends={'software_required'}) depends={'software_required'})
#These are measurements required for the equipments, are in this place # These are measurements required for the equipments, are in this place
# for manage of class 'product.template' # for manage of class 'product.template'
temperature_min = fields.Float("Temp Min") temperature_min = fields.Float("Temp Min")
temperature_max = fields.Float("Temp Max") temperature_max = fields.Float("Temp Max")
temperature_uom = fields.Many2One('product.uom', 'Temperature UOM', temperature_uom = fields.Many2One('product.uom', 'Temperature UOM',
domain=[('category', '=', Id('optical_equipment', "uom_cat_temperature"))], domain=[
states={'invisible' : If(Eval('temperature_min') == None, True)}) ('category', '=', Id(
'optical_equipment', "uom_cat_temperature"))],
states={'invisible': If(Eval('temperature_min') is None, True)})
frequency = fields.Float("Frequency") frequency = fields.Float("Frequency")
frequency_uom = fields.Many2One('product.uom', "Frequency UOM", frequency_uom = fields.Many2One('product.uom', "Frequency UOM",
domain=[('category', '=', Id('optical_equipment', 'uom_cat_frequency'))], domain=[
states={'invisible' : If(Eval('frequency') == None, True)} ('category', '=', Id(
'optical_equipment', 'uom_cat_frequency'))],
states={'invisible': If(Eval('frequency') is None, True)}
) )
moisture_min = fields.Float("Moisture Min") moisture_min = fields.Float("Moisture Min")
moisture_max = fields.Float("Moisture Max") moisture_max = fields.Float("Moisture Max")
moisture_uom = fields.Many2One('product.uom', "Moisture UOM", moisture_uom = fields.Many2One('product.uom', "Moisture UOM",
domain=[('category', '=', Id('optical_equipment', 'uom_cat_relative_humedity'))], domain=[
states={'invisible' : If(Eval('moisture_min') == None, True)}, ('category', '=', Id(
) 'optical_equipment', 'uom_cat_relative_humedity'))],
states={'invisible': If(Eval('moisture_min') is None, True)},
)
electrical_equipment = fields.Boolean("Electrical Equipment") electrical_equipment = fields.Boolean("Electrical Equipment")
frequency = fields.Float("Frequency", frequency = fields.Float("Frequency",
states={'invisible': ~Bool(Eval('electrical_equipment'))}) states={'invisible': ~Bool(Eval('electrical_equipment'))})
frequency_uom = fields.Many2One('product.uom', "Frequency UOM", frequency_uom = fields.Many2One('product.uom', "Frequency UOM",
domain=[('category', '=', Id('optical_equipment', 'uom_cat_frequency'))], domain=[
states={'invisible' : If(Eval('frequency') == None, True) | ('category', '=', Id(
~Eval('electrical_equipment', True)}, 'optical_equipment', 'uom_cat_frequency'))],
states={'invisible': If(Eval('frequency') is None, True) |
~Eval('electrical_equipment', True)},
) )
voltageAC = fields.Float("Voltage AC", voltageAC = fields.Float("Voltage AC",
states={'invisible': ~Bool(Eval('electrical_equipment'))}) states={'invisible': ~Bool(Eval('electrical_equipment'))})
voltageAC_uom = fields.Many2One('product.uom', "Voltage AC UOM", voltageAC_uom = fields.Many2One('product.uom', "Voltage AC UOM",
domain=[('category', '=', Id('optical_equipment', 'uom_cat_electrical_tension'))], domain=[
states={'invisible' : If(Eval('voltageAC') == None, True) | ('category', '=', Id(
~Eval('electrical_equipment', True)}, 'optical_equipment', 'uom_cat_electrical_tension'))],
states={'invisible': If(Eval('voltageAC') is None, True) |
~Eval('electrical_equipment', True)},
) )
voltageDC = fields.Float("Voltage DC", voltageDC = fields.Float("Voltage DC",
states={'invisible': ~Bool(Eval('electrical_equipment'))}) states={'invisible': ~Bool(Eval('electrical_equipment'))})
voltageDC_uom = fields.Many2One('product.uom', "Voltage DC UOM", voltageDC_uom = fields.Many2One('product.uom', "Voltage DC UOM",
domain=[('category', '=', Id('optical_equipment', 'uom_cat_electrical_tension'))], domain=[
states={'invisible' : If(Eval('voltageDC') == None, True) | ('category', '=', Id(
~Eval('electrical_equipment', True)},) 'optical_equipment', 'uom_cat_electrical_tension'))],
states={'invisible': If(Eval('voltageDC') is None, True) |
~Eval('electrical_equipment', True)},)
useful_life = fields.Integer("Useful life") useful_life = fields.Integer("Useful life")
warranty = fields.Integer("Warranty") warranty = fields.Integer("Warranty")
#### calibration parameters # calibration parameters
use_pattern = fields.Many2One('optical_equipment.use_pattern', "Use Pattern", ondelete='RESTRICT', use_pattern = fields.Many2One('optical_equipment.use_pattern', "Use Pattern", ondelete='RESTRICT',
states={'required': Eval('calibration', True)}) states={'required': Eval('calibration', True)})
measuring_range = fields.Selection([ measuring_range = fields.Selection([
('dioptria', "Dioptria"), ('dioptria', "Dioptria"),
('mmhg', "mmHg")], "Rango de Medición") ('mmhg', "mmHg")], "Rango de Medición")
MEP = fields.Float("MEP", states={'required': Eval('calibration', False)},) MEP = fields.Float("MEP", states={'required': Eval('calibration', False)},)
uncertainy_pattern = fields.Float("Uncertainy Pattern", states={'required': Eval('calibration', True)}, uncertainy_pattern = fields.Float("Uncertainy Pattern", states={'required': Eval('calibration', True)},
help="Agregar valores separados por ',' Ej:-5,+5,-10,+10") help="Agregar valores separados por ',' Ej:-5,+5,-10,+10")
k_pattern = fields.Char("K Pattern",states={'required': Eval('calibration', False)}, k_pattern = fields.Char("K Pattern", states={'required': Eval('calibration', False)},
help="Agregar valores separados por ',' Ej:-5,+5,-10,+10") help="Agregar valores separados por ',' Ej:-5,+5,-10,+10")
k_pattern_list = fields.One2Many('optical_equipment.product_pattern', 'product', "List of patterns K", k_pattern_list = fields.One2Many('optical_equipment.product_pattern', 'product', "List of patterns K",
states={'required': Eval('calibration', False)},) states={'required': Eval('calibration', False)},)
resolution_type = fields.Selection([('',""), resolution_type = fields.Selection([('', ""),
('analoga', "Analoga"), ('analoga', "Analoga"),
('digital', "Digital")], "Resolution Type", ('digital', "Digital")], "Resolution Type",
states={'required': Eval('calibration', False)},) states={'required': Eval('calibration', False)},)
d_resolution = fields.Float("Resolution d", d_resolution = fields.Float("Resolution d",
states={'invisible': If(Eval('resolution_type') != 'digital', True)},) states={'invisible': If(Eval('resolution_type') != 'digital', True)},)
analog_resolution = fields.Float("Analog resolution", analog_resolution = fields.Float("Analog resolution",
states={'invisible': If(Eval('resolution_type') != 'analoga', True),},) states={'invisible': If(Eval('resolution_type') != 'analoga', True), },)
a_factor_resolution = fields.Float("(a) Resolution", a_factor_resolution = fields.Float("(a) Resolution",
states={'invisible': If(Eval('resolution_type') != 'analoga', True)},) states={'invisible': If(Eval('resolution_type') != 'analoga', True)},)
Usubi = fields.Integer("Usub i",states={'required': Eval('calibration', False)},) Usubi = fields.Integer("Usub i", states={'required': Eval('calibration', False)},)
#maintenance activities # maintenance activities
initial_operation = fields.Boolean("Verificación inicial de funcionamiento") initial_operation = fields.Boolean("Verificación inicial de funcionamiento")
check_equipment = fields.Boolean("Revisión del Equipo") check_equipment = fields.Boolean("Revisión del Equipo")
check_electric_system = fields.Boolean("Revisión del sistema electríco") check_electric_system = fields.Boolean("Revisión del sistema electríco")
@ -170,18 +183,18 @@ class Template(metaclass=PoolMeta):
clean_eyes = fields.Boolean("Limpieza de lentes y espejos") clean_eyes = fields.Boolean("Limpieza de lentes y espejos")
optical = fields.Boolean("Optical") optical = fields.Boolean("Optical")
check_calibration = fields.Boolean("Verificar Calibración") check_calibration = fields.Boolean("Verificar Calibración")
@classmethod @classmethod
def view_attributes(cls): def view_attributes(cls):
return super(Template, cls).view_attributes() + [ return super(Template, cls).view_attributes() + [
('//page[@id="features"]', 'states', { ('//page[@id="features"]', 'states', {
'invisible': ~Eval('equipment'),}), 'invisible': ~Eval('equipment'), }),
('//page[@id="calibration"]', 'states', { ('//page[@id="calibration"]', 'states', {
'invisible': ~Eval('calibration')},), 'invisible': ~Eval('calibration')},),
('//page[@id="maintenance_activities"]', 'states', { ('//page[@id="maintenance_activities"]', 'states', {
'invisible': ~Eval('maintenance_required')},) 'invisible': ~Eval('maintenance_required')},)
] ]
@classmethod @classmethod
@fields.depends('measuring_range') @fields.depends('measuring_range')
@ -215,7 +228,7 @@ class Template(metaclass=PoolMeta):
return 0 return 0
@classmethod @classmethod
def default_voltageAC(cls): def default_voltageAC(cls):
return 0 return 0
def default_risk(): def default_risk():
@ -227,19 +240,15 @@ class Template(metaclass=PoolMeta):
def default_biomedical_class(): def default_biomedical_class():
return 'n/a' return 'n/a'
def default_main_tecnology(): def default_main_tecnology():
return None return None
def default_calibration(): def default_calibration():
return False return False
def default_refurbish(): def default_refurbish():
return False return False
def default_refurbish(): def default_refurbish():
return False return False
@ -257,7 +266,7 @@ class Template(metaclass=PoolMeta):
pool = Pool() pool = Pool()
Measurements = pool.get('product.uom') Measurements = pool.get('product.uom')
measurement = Measurements.search(['name', '=', 'Hertz'])[0].id measurement = Measurements.search(['name', '=', 'Hertz'])[0].id
return measurement return measurement
@classmethod @classmethod
@ -265,7 +274,7 @@ class Template(metaclass=PoolMeta):
pool = Pool() pool = Pool()
Measurements = pool.get('product.uom') Measurements = pool.get('product.uom')
measurement = Measurements.search(['name', '=', 'Relative Humedity'])[0].id measurement = Measurements.search(['name', '=', 'Relative Humedity'])[0].id
return measurement return measurement
@classmethod @classmethod
@ -273,7 +282,7 @@ class Template(metaclass=PoolMeta):
pool = Pool() pool = Pool()
Measurements = pool.get('product.uom') Measurements = pool.get('product.uom')
measurement = Measurements.search(['name', '=', 'Volt'])[0].id measurement = Measurements.search(['name', '=', 'Volt'])[0].id
return measurement return measurement
@classmethod @classmethod
@ -281,7 +290,7 @@ class Template(metaclass=PoolMeta):
pool = Pool() pool = Pool()
Measurements = pool.get('product.uom') Measurements = pool.get('product.uom')
measurement = Measurements.search(['name', '=', 'Volt'])[0].id measurement = Measurements.search(['name', '=', 'Volt'])[0].id
return measurement return measurement
@fields.depends('voltageDC', 'voltageDC_uom') @fields.depends('voltageDC', 'voltageDC_uom')
@ -294,19 +303,19 @@ class Template(metaclass=PoolMeta):
@fields.depends('software_required', 'software_version') @fields.depends('software_required', 'software_version')
def on_change_with_sotfware_required(self): def on_change_with_sotfware_required(self):
self.software_version = None self.software_version = None
@fields.depends('d_resolution', 'analog_resolution', 'a_factor_resolution') @fields.depends('d_resolution', 'analog_resolution', 'a_factor_resolution')
def on_change_resolution_type(self): def on_change_resolution_type(self):
self.d_resolution = None self.d_resolution = None
self.analog_resolution = None self.analog_resolution = None
self.a_factor_resolution = None self.a_factor_resolution = None
@fields.depends('equipment', 'replacement') @fields.depends('equipment', 'replacement')
def on_change_equipment(self): def on_change_equipment(self):
if self.equipment: if self.equipment:
self.replacement=False self.replacement = False
self.maintenance_activity=False self.maintenance_activity = False
self.calibration=False self.calibration = False
self.mark_category = None self.mark_category = None
self.model_category = None self.model_category = None
self.reference_category = None self.reference_category = None
@ -316,7 +325,7 @@ class Template(metaclass=PoolMeta):
self.use = '' self.use = ''
self.useful_life = 0 self.useful_life = 0
self.warranty = 0 self.warranty = 0
@fields.depends('mark_category', 'model_category', 'reference_category') @fields.depends('mark_category', 'model_category', 'reference_category')
def on_change_mark_category(self): def on_change_mark_category(self):
if not self.mark_category: if not self.mark_category:
@ -362,14 +371,14 @@ class Product(metaclass=PoolMeta):
default.setdefault('images', None) default.setdefault('images', None)
return super().copy(products, default=default) return super().copy(products, default=default)
class Image(metaclass=PoolMeta): class Image(metaclass=PoolMeta):
__name__ = 'product.image' __name__ = 'product.image'
@classmethod @classmethod
def __setup__(cls): def __setup__(cls):
super().__setup__() super().__setup__()
@classmethod @classmethod
def copy(cls, images, default=None): def copy(cls, images, default=None):
if default is None: if default is None:
@ -381,17 +390,18 @@ class Image(metaclass=PoolMeta):
return super().copy(images, default=default) return super().copy(images, default=default)
class UsePattern(ModelSQL,ModelView): class UsePattern(ModelSQL, ModelView):
"Use Pattern" "Use Pattern"
__name__ = 'optical_equipment.use_pattern' __name__ = 'optical_equipment.use_pattern'
_rec_name = 'name_pattern' _rec_name = 'name_pattern'
name_pattern = fields.Char('Name Pattern', required=True) name_pattern = fields.Char('Name Pattern', required=True)
class Pattern(ModelSQL, ModelView): class Pattern(ModelSQL, ModelView):
"Pattern K of equipment" "Pattern K of equipment"
__name__ = 'optical_equipment.product_pattern' __name__ = 'optical_equipment.product_pattern'
_rec_name = 'pattern' _rec_name = 'pattern'
product = fields.Many2One('product.template', "Template", ondelete='CASCADE') product = fields.Many2One('product.template', "Template", ondelete='CASCADE')
pattern = fields.Float("Value Pattern") pattern = fields.Float("Value Pattern")