add new model quality sample
This commit is contained in:
parent
ae01d2813b
commit
f2f3f29768
|
@ -34,6 +34,9 @@ def register():
|
|||
weighing.Weighing,
|
||||
weighing.WeighingPlantation,
|
||||
weighing.WeighingDo,
|
||||
quality.Configuration,
|
||||
quality.ConfigurationCompany,
|
||||
quality.ProductQualitySample,
|
||||
quality.QualitySample,
|
||||
quality.QualityTest,
|
||||
quality.QuantitativeTestLine,
|
||||
|
|
19
product.py
19
product.py
|
@ -32,6 +32,7 @@ class Container(ModelSQL, ModelView):
|
|||
class Template(metaclass=PoolMeta):
|
||||
__name__ = 'product.template'
|
||||
|
||||
needs_sample = fields.Boolean('Needs Samples')
|
||||
agronomic_type = fields.Selection([
|
||||
(None, ''),
|
||||
('grape', "Grape"),
|
||||
|
@ -89,13 +90,13 @@ class Product(WineMixin, metaclass=PoolMeta):
|
|||
}, depends=['agronomic_type'])
|
||||
ecologicals = fields.Many2Many('product.product-agronomics.ecological',
|
||||
'product', 'ecological', 'Ecologicals')
|
||||
quality_sample = fields.Many2One('quality.sample', 'Quality Sample',
|
||||
states={
|
||||
'invisible': ~ Eval('agronomic_type').in_(
|
||||
['wine', 'unfiltered-wine', 'filtered-wine', 'clarified-wine',
|
||||
'bottled-wine']
|
||||
)
|
||||
}, depends=['agronomic_type'])
|
||||
# quality_sample = fields.Many2One('quality.sample', 'Quality Sample',
|
||||
# states={
|
||||
# 'invisible': ~ Eval('agronomic_type').in_(
|
||||
# ['wine', 'unfiltered-wine', 'filtered-wine', 'clarified-wine',
|
||||
# 'bottled-wine']
|
||||
# )
|
||||
# }, depends=['agronomic_type'])
|
||||
certification = fields.Many2One('agronomics.certification',
|
||||
'Certification', states={
|
||||
'invisible': ~ Eval('agronomic_type').in_(
|
||||
|
@ -109,8 +110,8 @@ class Product(WineMixin, metaclass=PoolMeta):
|
|||
'bottled-wine']
|
||||
)}, depends=['agronomic_type']), 'get_alcohol_volume')
|
||||
quality_tests = fields.One2Many('quality.test', 'document', 'Quality Tests')
|
||||
quality_samples = fields.One2Many('quality.sample', 'product',
|
||||
'Quality Samples')
|
||||
quality_samples = fields.Many2Many('product.product-quality.sample',
|
||||
'product', 'sample', 'Quality Samples')
|
||||
|
||||
@classmethod
|
||||
def validate(cls, products):
|
||||
|
|
|
@ -366,18 +366,18 @@ class Production(metaclass=PoolMeta):
|
|||
return new_product
|
||||
|
||||
def copy_quality_samples(self, new_product):
|
||||
QualitySample = Pool().get('quality.sample')
|
||||
ProductSample = Pool().get('product.product-quality.sample')
|
||||
products = [x.product for x in self.inputs if x.product.quality_samples]
|
||||
if not self.pass_quality_sample or len(products) != 1:
|
||||
return new_product
|
||||
samples = products[0].quality_samples
|
||||
new_samples =[]
|
||||
for sample in samples:
|
||||
new_sample, = QualitySample.copy([sample], {'product':new_product})
|
||||
new_sample.origin = sample
|
||||
new_samples.append(new_sample)
|
||||
QualitySample.save(new_samples)
|
||||
QualitySample.done(new_samples)
|
||||
product_sample = ProductSample()
|
||||
product_sample.product = new_product
|
||||
product_sample.sample = sample
|
||||
new_samples.append(product_sample)
|
||||
ProductSample.save(new_samples)
|
||||
return new_product
|
||||
|
||||
def copy_quality(self, new_product):
|
||||
|
|
148
quality.py
148
quality.py
|
@ -1,31 +1,149 @@
|
|||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||
# this repository contains the full copyright notices and license terms.
|
||||
import datetime
|
||||
from trytond.pool import PoolMeta, Pool
|
||||
from trytond.model import fields, Model
|
||||
from trytond.pyson import Eval
|
||||
from trytond.model import fields, Model, ModelSQL, ModelView, Workflow
|
||||
from trytond.pyson import Eval, Id
|
||||
from trytond.modules.agronomics.wine import _WINE_DIGITS
|
||||
from trytond.transaction import Transaction
|
||||
|
||||
class QualitySample(metaclass=PoolMeta):
|
||||
STATES = {
|
||||
'readonly': Eval('state') == 'done',
|
||||
}
|
||||
DEPENDS = ['state']
|
||||
|
||||
class ConfigurationCompany(ModelSQL):
|
||||
'Company Quality configuration'
|
||||
__name__ = 'quality.configuration.company'
|
||||
|
||||
company = fields.Many2One('company.company', 'Company')
|
||||
sample_sequence = fields.Many2One('ir.sequence',
|
||||
'Sample Sequence', domain=[
|
||||
('company', 'in',
|
||||
[Eval('context', {}).get('company', -1), None]),
|
||||
('sequence_type', '=', Id('agronomics',
|
||||
'sequence_type_sample')),
|
||||
])
|
||||
|
||||
@staticmethod
|
||||
def default_company():
|
||||
return Transaction().context.get('company')
|
||||
|
||||
|
||||
class Configuration(metaclass=PoolMeta):
|
||||
__name__ = 'quality.configuration'
|
||||
|
||||
sample_sequence = fields.Function(fields.Many2One('ir.sequence',
|
||||
'Sample Sequence', domain=[
|
||||
('company', 'in',
|
||||
[Eval('context', {}).get('company', -1), None]),
|
||||
('sequence_type', '=', Id('agronomics',
|
||||
'sequence_type_sample')),
|
||||
]),
|
||||
'get_company_config', setter='set_company_config')
|
||||
|
||||
@classmethod
|
||||
def get_company_config(cls, configs, names):
|
||||
pool = Pool()
|
||||
CompanyConfig = pool.get('quality.configuration.company')
|
||||
res = dict.fromkeys(names, {configs[0].id: None})
|
||||
company_configs = CompanyConfig.search([], limit=1)
|
||||
if len(company_configs) == 1:
|
||||
company_config, = company_configs
|
||||
for field_name in set(names):
|
||||
value = getattr(company_config, field_name, None)
|
||||
if value:
|
||||
res[field_name] = {configs[0].id: value.id}
|
||||
return res
|
||||
|
||||
@classmethod
|
||||
def set_company_config(cls, configs, name, value):
|
||||
pool = Pool()
|
||||
CompanyConfig = pool.get('quality.configuration.company')
|
||||
company_configs = CompanyConfig.search([], limit=1)
|
||||
if len(company_configs) == 1:
|
||||
company_config, = company_configs
|
||||
else:
|
||||
company_config = CompanyConfig()
|
||||
setattr(company_config, name, value)
|
||||
company_config.save()
|
||||
|
||||
|
||||
class QualitySample(Workflow, ModelSQL, ModelView):
|
||||
'Quality Sample'
|
||||
__name__ = 'quality.sample'
|
||||
|
||||
code = fields.Char('Code', select=True, readonly=True)
|
||||
state = fields.Selection([
|
||||
('draft', 'Draft'),
|
||||
('done', 'Done')],
|
||||
'State', required=True, readonly=True)
|
||||
reference = fields.Char('Reference')
|
||||
origin = fields.Reference('Origin', selection='get_origin', select=True,
|
||||
states={
|
||||
'readonly': Eval('state') != 'draft',
|
||||
products = fields.Many2Many('product.product-quality.sample', 'sample',
|
||||
'product', 'Products')
|
||||
collection_date = fields.DateTime('Collection Date', required=True,
|
||||
states=STATES, depends=DEPENDS)
|
||||
company = fields.Many2One('company.company', 'Company', required=True,
|
||||
select=True, states=STATES, depends=DEPENDS)
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super(QualitySample, cls).__setup__()
|
||||
cls._transitions |= set((('draft', 'done'),))
|
||||
cls._buttons.update({
|
||||
'done': {
|
||||
'invisible': Eval('state') != 'draft',
|
||||
'icon': 'tryton-forward',
|
||||
},
|
||||
depends=['state'])
|
||||
})
|
||||
|
||||
@classmethod
|
||||
def _get_origin(cls):
|
||||
'Return list of Model names for origin Reference'
|
||||
return [cls.__name__, 'quality.sample']
|
||||
@ModelView.button
|
||||
@Workflow.transition('done')
|
||||
def done(cls, samples):
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def default_state():
|
||||
return 'draft'
|
||||
|
||||
@staticmethod
|
||||
def default_company():
|
||||
return Transaction().context.get('company')
|
||||
|
||||
@staticmethod
|
||||
def default_collection_date():
|
||||
return datetime.datetime.now()
|
||||
|
||||
@classmethod
|
||||
def get_origin(cls):
|
||||
IrModel = Pool().get('ir.model')
|
||||
get_name = IrModel.get_name
|
||||
models = cls._get_origin()
|
||||
return [(None, '')] + [(m, get_name(m)) for m in models]
|
||||
def create(cls, vlist):
|
||||
pool = Pool()
|
||||
Config = pool.get('quality.configuration')
|
||||
|
||||
sequence = Config(1).sample_sequence
|
||||
for value in vlist:
|
||||
if not value.get('code'):
|
||||
value['code'] = sequence.get()
|
||||
return super(QualitySample, cls).create(vlist)
|
||||
|
||||
@classmethod
|
||||
def copy(cls, samples, default=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
else:
|
||||
default = default.copy()
|
||||
default['code'] = None
|
||||
return super(QualitySample, cls).copy(samples, default=default)
|
||||
|
||||
class ProductQualitySample(ModelSQL):
|
||||
'Product - Quality Sample'
|
||||
__name__ = 'product.product-quality.sample'
|
||||
|
||||
product = fields.Many2One('product.product', 'Product', required=True,
|
||||
ondelete='CASCADE', select=True)
|
||||
sample = fields.Many2One('quality.sample', 'Sample', ondelete='CASCADE',
|
||||
required=True, select=True)
|
||||
|
||||
|
||||
class QualityTest(metaclass=PoolMeta):
|
||||
__name__ = 'quality.test'
|
||||
|
|
116
quality.xml
116
quality.xml
|
@ -1,10 +1,122 @@
|
|||
<tryton>
|
||||
<data>
|
||||
<!-- Quality Sample-->
|
||||
<record model="ir.ui.view" id="quality_configuration_view_form">
|
||||
<field name="model">quality.configuration</field>
|
||||
<field name="inherit" ref="quality_control.quality_configuration_form_view"/>
|
||||
<field name="name">quality_configuration_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule.group" id="rule_group_quality_configuration_company">
|
||||
<field name="name">Quality Configuration Company</field>
|
||||
<field name="model" search="[('model', '=', 'quality.configuration.company')]"/>
|
||||
<field name="global_p" eval="True"/>
|
||||
</record>
|
||||
<record model="ir.rule" id="rule_quality_configuration_company1">
|
||||
<field name="rule_group" ref="rule_group_quality_configuration_company"/>
|
||||
<field name="domain" eval="[('company', '=', Eval('user', {}).get('company', None))]" pyson="1"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.sequence.type" id="sequence_type_sample">
|
||||
<field name="name">Quality Sample</field>
|
||||
</record>
|
||||
<record model="ir.sequence.type-res.group" id="sequence_type_sample_group_admin">
|
||||
<field name="sequence_type" ref="sequence_type_sample"/>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
</record>
|
||||
<record model="ir.sequence.type-res.group" id="sequence_type_sample_group_sale_admin">
|
||||
<field name="sequence_type" ref="sequence_type_sample"/>
|
||||
<field name="group" ref="quality_control.group_quality_control_admin"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.sequence" id="sequence_sample">
|
||||
<field name="name">Sample</field>
|
||||
<field name="sequence_type" ref="sequence_type_sample"/>
|
||||
</record>
|
||||
|
||||
<record model="res.group" id="group_quality_control_sample">
|
||||
<field name="name">Quality Samples</field>
|
||||
</record>
|
||||
<record model="res.user-res.group"
|
||||
id="user_admin_group_quality_control_sample">
|
||||
<field name="user" ref="res.user_admin"/>
|
||||
<field name="group" ref="group_quality_control_sample"/>
|
||||
</record>
|
||||
|
||||
<!-- quality.sample -->
|
||||
<record model="ir.ui.view" id="quality_sample_view_form">
|
||||
<field name="model">quality.sample</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">quality_sample_form</field>
|
||||
<field name="inherit" ref="quality_control_sample.quality_sample_view_form"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="quality_sample_view_list">
|
||||
<field name="model">quality.sample</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">quality_sample_list</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_quality_sample">
|
||||
<field name="name">Samples</field>
|
||||
<field name="res_model">quality.sample</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_quality_sample_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="quality_sample_view_list"/>
|
||||
<field name="act_window" ref="act_quality_sample"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_quality_sample_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="quality_sample_view_form"/>
|
||||
<field name="act_window" ref="act_quality_sample"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.access" id="access_quality_sample">
|
||||
<field name="model" search="[('model', '=', 'quality.sample')]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
<record model="ir.model.access" id="access_quality_sample_group_sample">
|
||||
<field name="model" search="[('model', '=', 'quality.sample')]"/>
|
||||
<field name="group" ref="group_quality_control_sample"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.rule.group" id="rule_group_quality_sample">
|
||||
<field name="name">Quality Sample</field>
|
||||
<field name="model" search="[('model', '=', 'quality.sample')]"/>
|
||||
<field name="global_p" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule" id="rule_quality_sample1">
|
||||
<field name="domain" eval="[('company', '=', Eval('user', {}).get('company', None))]" pyson="1"/>
|
||||
<field name="rule_group" ref="rule_group_quality_sample"/>
|
||||
</record>
|
||||
|
||||
<!-- ir.model.button -->
|
||||
<record model="ir.model.button" id="sample_done_button">
|
||||
<field name="name">done</field>
|
||||
<field name="string">Done</field>
|
||||
<field name="model" search="[('model', '=', 'quality.sample')]"/>
|
||||
</record>
|
||||
<record model="ir.model.button-res.group" id="sample_done_button_group_sample">
|
||||
<field name="button" ref="sample_done_button"/>
|
||||
<field name="group" ref="group_quality_control_sample"/>
|
||||
</record>
|
||||
|
||||
<!-- menus -->
|
||||
<menuitem action="act_quality_sample" id="menu_quality_sample"
|
||||
parent="quality_control.menu_quality_control" sequence="30"/>
|
||||
<record model="ir.ui.menu-res.group"
|
||||
id="menu_quality_control_sample_group_quality_control_sample">
|
||||
<field name="menu" ref="menu_quality_sample"/>
|
||||
<field name="group" ref="group_quality_control_sample"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</tryton>
|
|
@ -7,7 +7,7 @@ depends:
|
|||
product_classification
|
||||
product_classification_taxonomic
|
||||
product_template_form_quantity
|
||||
quality_control_sample
|
||||
quality_control
|
||||
purchase_contract
|
||||
production
|
||||
xml:
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
<field name="varieties" colspan="2"/>
|
||||
<field name="denominations_of_origin" colspan="2"/>
|
||||
<field name="ecologicals" colspan="2"/>
|
||||
<label name="quality_sample"/>
|
||||
<field name="quality_sample"/>
|
||||
<label name="certification"/>
|
||||
<field name="certification"/>
|
||||
<label name="alcohol_volume"/>
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
<field name="varieties" tree_invisible="1"/>
|
||||
<field name="denominations_of_origin" tree_invisible="1"/>
|
||||
<field name="ecologicals" tree_invisible="1"/>
|
||||
<field name="quality_sample" tree_invisible="1"/>
|
||||
<field name="certification" tree_invisible="1"/>
|
||||
<field name="alcohol_volume" tree_invisible="1"/>
|
||||
<field name="container" tree_invisible="1"/>
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- The COPYRIGHT file at the top level of this repository contains the full
|
||||
copyright notices and license terms. -->
|
||||
<data>
|
||||
<xpath expr="/form/field[@name='allowed_documents']" position="before">
|
||||
<label name="sample_sequence"/>
|
||||
<field name="sample_sequence"/>
|
||||
</xpath>
|
||||
</data>
|
|
@ -1,9 +1,15 @@
|
|||
<data>
|
||||
<xpath expr="/form/field[@name='lot']" position="after">
|
||||
<label name="reference"/>
|
||||
<field name="reference"/>
|
||||
<newline/>
|
||||
<label name="origin"/>
|
||||
<field name="origin" colspan="3"/>
|
||||
</xpath>
|
||||
</data>
|
||||
<?xml version="1.0"?>
|
||||
<!-- The COPYRIGHT file at the top level of this repository contains the full
|
||||
copyright notices and license terms. -->
|
||||
<form>
|
||||
<label name="collection_date"/>
|
||||
<field name="collection_date"/>
|
||||
<label name="code"/>
|
||||
<field name="code"/>
|
||||
<field name="products" colspan="4"/>
|
||||
<group colspan="4" id="buttons">
|
||||
<label name="state"/>
|
||||
<field name="state"/>
|
||||
<button name="done"/>
|
||||
</group>
|
||||
</form>
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- The COPYRIGHT file at the top level of this repository contains the full
|
||||
copyright notices and license terms. -->
|
||||
<tree>
|
||||
<field name="code"/>
|
||||
<field name="collection_date" widget="date"/>
|
||||
<field name="collection_date" widget="time"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
Loading…
Reference in New Issue