diff --git a/lims/analysis.py b/lims/analysis.py
index a44e8d9..f8f2631 100644
--- a/lims/analysis.py
+++ b/lims/analysis.py
@@ -862,10 +862,10 @@ class Analysis(Workflow, ModelSQL, ModelView):
'Laboratories', context={'type': Eval('type')},
states={
'invisible': Or(
- Eval('type').in_(['group']),
+ Eval('type') != 'analysis',
Bool(Equal(Eval('behavior'), 'additional'))),
'required': Not(Or(
- Eval('type').in_(['set', 'group']),
+ Eval('type') != 'analysis',
Bool(Equal(Eval('behavior'), 'additional')))),
'readonly': Bool(Equal(Eval('state'), 'disabled')),
}, depends=['type', 'behavior', 'state'])
@@ -892,13 +892,12 @@ class Analysis(Workflow, ModelSQL, ModelView):
start_date = fields.Date('Entry date', readonly=True)
end_date = fields.Date('Leaving date', readonly=True)
included_analysis = fields.One2Many('lims.analysis.included', 'analysis',
- 'Included analysis', context={
- 'analysis': Eval('id'), 'type': Eval('type'),
- 'laboratory_domain': Eval('laboratory_domain')},
+ 'Included analysis', depends=['type', 'state'],
+ context={'analysis': Eval('id'), 'type': Eval('type')},
states={
'invisible': Bool(Equal(Eval('type'), 'analysis')),
'readonly': Bool(Equal(Eval('state'), 'disabled')),
- }, depends=['type', 'laboratory_domain', 'state'])
+ })
all_included_analysis = fields.Function(fields.One2Many('lims.analysis',
None, 'All included analysis'),
'on_change_with_all_included_analysis',
@@ -1091,7 +1090,7 @@ class Analysis(Workflow, ModelSQL, ModelView):
('//page[@id="laboratories"]',
'states', {
'invisible': Or(
- Eval('type').in_(['group']),
+ Eval('type') != 'analysis',
Bool(Equal(Eval('behavior'), 'additional'))),
}),
]
@@ -1099,7 +1098,8 @@ class Analysis(Workflow, ModelSQL, ModelView):
@classmethod
def get_included_analysis(cls, analysis_id):
cursor = Transaction().connection.cursor()
- AnalysisIncluded = Pool().get('lims.analysis.included')
+ pool = Pool()
+ AnalysisIncluded = pool.get('lims.analysis.included')
childs = []
cursor.execute('SELECT included_analysis '
@@ -1135,7 +1135,8 @@ class Analysis(Workflow, ModelSQL, ModelView):
@classmethod
def get_included_analysis_method(cls, analysis_id):
cursor = Transaction().connection.cursor()
- AnalysisIncluded = Pool().get('lims.analysis.included')
+ pool = Pool()
+ AnalysisIncluded = pool.get('lims.analysis.included')
childs = []
cursor.execute('SELECT included_analysis, method '
@@ -1191,7 +1192,6 @@ class Analysis(Workflow, ModelSQL, ModelView):
super().validate(analysis)
for a in analysis:
cls.check_duplicate_description(a.type, a.description, a.id)
- a.check_set()
a.check_end_date()
@classmethod
@@ -1204,23 +1204,6 @@ class Analysis(Workflow, ModelSQL, ModelView):
]) > 0:
raise UserError(gettext('lims.msg_description_uniq'))
- def check_set(self):
- if self.type == 'set':
- if self.laboratories and len(self.laboratories) > 1:
- raise UserError(gettext('lims.msg_set_laboratories'))
- if self.included_analysis and not self.laboratories:
- raise UserError(gettext('lims.msg_not_laboratory'))
- if self.included_analysis:
- set_laboratory = self.laboratories[0].laboratory
- for ia in self.included_analysis:
- included_analysis_laboratories = [lab.laboratory
- for lab in ia.included_analysis.laboratories]
- if (set_laboratory not in included_analysis_laboratories):
- raise UserError(gettext('lims.msg_analysis_laboratory',
- analysis=ia.included_analysis.rec_name,
- laboratory=set_laboratory.rec_name,
- ))
-
def check_end_date(self):
if self.end_date:
if not self.start_date or self.end_date < self.start_date:
@@ -1232,31 +1215,12 @@ class Analysis(Workflow, ModelSQL, ModelView):
def write(cls, *args):
actions = iter(args)
for analysis, vals in zip(actions, actions):
- if vals.get('laboratories'):
- cls.check_laboratory_change(analysis, vals['laboratories'])
if vals.get('description'):
for a in analysis:
cls.check_duplicate_description(vals.get('type', a.type),
vals['description'], a.id)
super().write(*args)
- @classmethod
- def check_laboratory_change(cls, analysis, laboratories):
- AnalysisIncluded = Pool().get('lims.analysis.included')
-
- for a in analysis:
- if a.type == 'analysis':
- for operation in laboratories:
- if operation[0] == 'unlink':
- for laboratory in operation[1]:
- parent = AnalysisIncluded.search([
- ('included_analysis', '=', a.id),
- ('laboratory', '=', laboratory),
- ])
- if parent:
- raise UserError(
- gettext('lims.msg_not_laboratory_change'))
-
@classmethod
@ModelView.button_action('lims.wiz_lims_relate_analysis')
def relate_analysis(cls, analysis):
@@ -1444,7 +1408,6 @@ class Analysis(Workflow, ModelSQL, ModelView):
backup.append({
'analysis': ia.analysis.id,
'included_analysis': ia.included_analysis.id,
- 'laboratory': ia.laboratory and ia.laboratory.id or None,
'method': ia.method and ia.method.id or None,
})
a.included_analysis_backup = json.dumps(backup)
@@ -1705,22 +1668,6 @@ class AnalysisIncluded(ModelSQL, ModelView):
('group', 'Group'),
], 'Type', sort=False),
'on_change_with_analysis_type')
- laboratory = fields.Many2One('lims.laboratory', 'Laboratory',
- domain=[('id', 'in', Eval('laboratory_domain'))],
- states={
- 'required': Or(
- Bool(Equal(Eval('_parent_analysis', {}).get('type'), 'set')),
- And(Bool(Equal(Eval('_parent_analysis', {}).get('type'),
- 'group')),
- Bool(Equal(Eval('analysis_type'), 'analysis'))),
- Bool(Eval('laboratory_domain'))),
- 'readonly': Bool(
- Equal(Eval('_parent_analysis', {}).get('type'), 'set')),
- 'invisible': Eval('analysis_type').in_(['set', 'group']),
- },
- depends=['laboratory_domain', 'analysis_type'])
- laboratory_domain = fields.Function(fields.Many2Many('lims.laboratory',
- None, None, 'Laboratory domain'), 'on_change_with_laboratory_domain')
method = fields.Many2One('lims.lab.method', 'Method',
domain=[('id', 'in', Eval('method_domain'))],
states={
@@ -1762,16 +1709,6 @@ class AnalysisIncluded(ModelSQL, ModelView):
raise UserError(gettext('lims.msg_duplicated_analysis',
analysis=self.included_analysis.rec_name))
- @fields.depends('included_analysis', 'analysis', 'laboratory',
- '_parent_analysis.type', '_parent_analysis.laboratories')
- def on_change_included_analysis(self):
- laboratory = None
- if self.included_analysis:
- laboratories = self.on_change_with_laboratory_domain()
- if len(laboratories) == 1:
- laboratory = laboratories[0]
- self.laboratory = laboratory
-
@fields.depends('included_analysis', '_parent_included_analysis.type')
def on_change_with_analysis_type(self, name=None):
res = ''
@@ -1784,93 +1721,32 @@ class AnalysisIncluded(ModelSQL, ModelView):
AnalysisIncluded = Pool().get('lims.analysis.included')
context = Transaction().context
analysis_id = context.get('analysis', None)
- analysis_type = context.get('type', None)
- laboratories = context.get('laboratory_domain', [])
- return AnalysisIncluded.get_analysis_domain(analysis_id,
- analysis_type, laboratories)
+ return AnalysisIncluded.get_analysis_domain(analysis_id)
- @fields.depends('analysis', '_parent_analysis.type',
- '_parent_analysis.laboratories')
+ @fields.depends('analysis')
def on_change_with_analysis_domain(self, name=None):
analysis_id = self.analysis.id if self.analysis else None
- analysis_type = self.analysis.type if self.analysis else None
- laboratories = []
- if self.analysis and self.analysis.laboratories:
- laboratories = [l.laboratory.id
- for l in self.analysis.laboratories]
- return self.get_analysis_domain(analysis_id,
- analysis_type, laboratories)
+ return self.get_analysis_domain(analysis_id)
@staticmethod
- def get_analysis_domain(analysis_id=None, analysis_type=None,
- laboratories=[]):
+ def get_analysis_domain(analysis_id=None):
cursor = Transaction().connection.cursor()
pool = Pool()
Analysis = pool.get('lims.analysis')
- AnalysisLaboratory = pool.get('lims.analysis-laboratory')
- if not analysis_type:
+ not_parent_clause = ''
+ if analysis_id:
+ not_parent_clause = 'AND id != ' + str(analysis_id)
+ cursor.execute('SELECT id '
+ 'FROM "' + Analysis._table + '" '
+ 'WHERE state = \'active\' '
+ 'AND type != \'group\' '
+ 'AND end_date IS NULL ' +
+ not_parent_clause)
+ res = cursor.fetchall()
+ if not res:
return []
-
- if analysis_type == 'set':
- if len(laboratories) != 1:
- raise UserError(gettext('lims.msg_not_set_laboratory'))
- set_laboratory_id = laboratories[0]
- not_parent_clause = ''
- if analysis_id:
- not_parent_clause = 'AND al.analysis != ' + str(analysis_id)
-
- cursor.execute('SELECT DISTINCT(al.analysis) '
- 'FROM "' + AnalysisLaboratory._table + '" al '
- 'INNER JOIN "' + Analysis._table + '" a '
- 'ON a.id = al.analysis '
- 'WHERE al.laboratory = %s '
- 'AND a.state = \'active\' '
- 'AND a.type = \'analysis\' '
- 'AND a.end_date IS NULL ' +
- not_parent_clause,
- (set_laboratory_id,))
- res = cursor.fetchall()
- if not res:
- return []
- return [x[0] for x in res]
- else:
- not_parent_clause = ''
- if analysis_id:
- not_parent_clause = 'AND id != ' + str(analysis_id)
- cursor.execute('SELECT id '
- 'FROM "' + Analysis._table + '" '
- 'WHERE state = \'active\' '
- 'AND type != \'group\' '
- 'AND end_date IS NULL ' +
- not_parent_clause)
- res = cursor.fetchall()
- if not res:
- return []
- return [x[0] for x in res]
-
- @staticmethod
- def default_laboratory_domain():
- return Transaction().context.get('laboratory_domain', [])
-
- @fields.depends('included_analysis', 'analysis', '_parent_analysis.type',
- '_parent_analysis.laboratories', 'laboratory')
- def on_change_with_laboratory_domain(self, name=None):
- laboratories = []
- analysis_laboratories = []
- if self.included_analysis and self.included_analysis.laboratories:
- analysis_laboratories = [l.laboratory.id
- for l in self.included_analysis.laboratories]
- if self.analysis and self.analysis.type == 'set':
- if self.analysis.laboratories:
- set_laboratory = self.analysis.laboratories[0].laboratory.id
- if set_laboratory in analysis_laboratories:
- laboratories = [set_laboratory]
- else:
- laboratories = analysis_laboratories
- if not laboratories and self.laboratory:
- laboratories = [self.laboratory.id]
- return laboratories
+ return [x[0] for x in res]
@fields.depends('included_analysis', '_parent_included_analysis.methods')
def on_change_with_method_domain(self, name=None):
@@ -2812,38 +2688,28 @@ class RelateAnalysis(Wizard):
cursor = Transaction().connection.cursor()
pool = Pool()
Analysis = pool.get('lims.analysis')
- AnalysisLaboratory = pool.get('lims.analysis-laboratory')
- analysis = Analysis(Transaction().context['active_id'])
default = {
'analysis_domain': [],
}
- if len(analysis.laboratories) != 1:
- raise UserError(gettext('lims.msg_not_set_laboratory'))
-
- cursor.execute('SELECT DISTINCT(al.analysis) '
- 'FROM "' + AnalysisLaboratory._table + '" al '
- 'INNER JOIN "' + Analysis._table + '" a '
- 'ON a.id = al.analysis '
- 'WHERE al.laboratory = %s '
- 'AND a.state = \'active\' '
- 'AND a.type = \'analysis\' '
- 'AND a.end_date IS NULL '
- 'AND al.analysis != %s',
- (analysis.laboratories[0].laboratory.id, analysis.id,))
+ cursor.execute('SELECT id '
+ 'FROM "' + Analysis._table + '" '
+ 'WHERE state = \'active\' '
+ 'AND type = \'analysis\' '
+ 'AND end_date IS NULL')
res = cursor.fetchall()
if res:
default['analysis_domain'] = [x[0] for x in res]
return default
def transition_relate(self):
- Analysis = Pool().get('lims.analysis')
+ pool = Pool()
+ Analysis = pool.get('lims.analysis')
analysis = Analysis(Transaction().context['active_id'])
to_create = [{
'analysis': analysis.id,
'included_analysis': al.id,
- 'laboratory': analysis.laboratories[0].laboratory.id,
} for al in self.start.analysis]
Analysis.write([analysis], {
'included_analysis': [('create', to_create)],
diff --git a/lims/analysis.xml b/lims/analysis.xml
index c43657c..e0547c9 100644
--- a/lims/analysis.xml
+++ b/lims/analysis.xml
@@ -426,18 +426,6 @@
analysis_included_list
-
- User in laboratory
-
-
-
-
-
-
-
-
diff --git a/lims/locale/es.po b/lims/locale/es.po
index 1cc15d3..5fccdb9 100644
--- a/lims/locale/es.po
+++ b/lims/locale/es.po
@@ -238,14 +238,6 @@ msgctxt "field:lims.analysis.included,included_analysis:"
msgid "Included analysis"
msgstr "Análisis incluido"
-msgctxt "field:lims.analysis.included,laboratory:"
-msgid "Laboratory"
-msgstr "Laboratorio"
-
-msgctxt "field:lims.analysis.included,laboratory_domain:"
-msgid "Laboratory domain"
-msgstr "Dominio para Laboratorio"
-
msgctxt "field:lims.analysis.included,method:"
msgid "Method"
msgstr "Método"
@@ -7634,12 +7626,6 @@ msgctxt "model:ir.message,text:msg_analysis_family_code_unique_id"
msgid "Analysis family code must be unique"
msgstr "El código de la familia de análisis debe ser único"
-msgctxt "model:ir.message,text:msg_analysis_laboratory"
-msgid "The \"%(analysis)s\" analysis is not defined in laboratory \"%(laboratory)s\""
-msgstr ""
-"El análisis \"%(analysis)s\" no está definido para el laboratorio "
-"\"%(laboratory)s\""
-
msgctxt "model:ir.message,text:msg_annul_analysis"
msgid "The analysis \"%(analysis)s\" is already reported"
msgstr "El análisis \"%(analysis)s\" ya fue informado"
@@ -8121,27 +8107,11 @@ msgctxt "model:ir.message,text:msg_not_fraction"
msgid "You can not confirm entry \"%(entry)s\" because has not fractions"
msgstr "No puede confirmar el ingreso «%(entry)s» porque no posee fracciones"
-msgctxt "model:ir.message,text:msg_not_laboratory"
-msgid "Must define a Laboratory"
-msgstr "Debe definir un laboratorio"
-
-msgctxt "model:ir.message,text:msg_not_laboratory_change"
-msgid ""
-"You can not change the laboratory because the analysis is included in a "
-"set/group with this laboratory"
-msgstr ""
-"No puede cambiar el laboratorio porque el análisis está incluido en un "
-"set/grupo con este laboratorio"
-
msgctxt "model:ir.message,text:msg_not_services"
msgid "You can not confirm fraction \"%(fraction)s\" because has not services"
msgstr ""
"No puede confirmar la fracción «%(fraction)s» porque no posee servicios"
-msgctxt "model:ir.message,text:msg_not_set_laboratory"
-msgid "No Laboratory loaded for the Set"
-msgstr "Ningún laboratorio definido para el Set"
-
msgctxt "model:ir.message,text:msg_not_start_date"
msgid "The planification must have a start date"
msgstr "La planificación debe tener una fecha de inicio"
@@ -8294,10 +8264,6 @@ msgstr ""
"No puede copiar el servicio \"%(analysis)s\" porque el laboratorio asignado "
"(%(laboratory)s) no es el predeterminado."
-msgctxt "model:ir.message,text:msg_set_laboratories"
-msgid "A Set can be assigned to a single laboratory"
-msgstr "Un Set puede ser asignado a un único laboratorio"
-
msgctxt "model:ir.message,text:msg_suspension_reason_unique_id"
msgid "Suspension reason code must be unique"
msgstr "El código del motivo de suspensión debe ser único"
@@ -8434,10 +8400,6 @@ msgctxt "model:ir.rule.group,name:rule_group_analysis_device"
msgid "User in laboratory"
msgstr ""
-msgctxt "model:ir.rule.group,name:rule_group_analysis_included"
-msgid "User in laboratory"
-msgstr ""
-
msgctxt "model:ir.rule.group,name:rule_group_analysis_laboratory"
msgid "User in laboratory"
msgstr ""
diff --git a/lims/message.xml b/lims/message.xml
index 4124757..d686cd3 100644
--- a/lims/message.xml
+++ b/lims/message.xml
@@ -19,18 +19,6 @@
Analysis description must be unique
-
- Must define a Laboratory
-
-
- A Set can be assigned to a single laboratory
-
-
- The "%(analysis)s" analysis is not defined in laboratory "%(laboratory)s"
-
-
- You can not change the laboratory because the analysis is included in a set/group with this laboratory
-
The leaving date cannot be lower than entry date
@@ -40,9 +28,6 @@
The analysis "%(analysis)s" is already included
-
- No Laboratory loaded for the Set
-
You can not delete method "%(method)s" because is typificated
diff --git a/lims/planification.py b/lims/planification.py
index e0ae16b..e2da8a9 100644
--- a/lims/planification.py
+++ b/lims/planification.py
@@ -178,24 +178,25 @@ class Planification(Workflow, ModelSQL, ModelView):
'INNER JOIN "' + Analysis._table + '" a '
'ON a.id = al.analysis '
'WHERE al.laboratory = %s '
+ 'AND a.type = \'analysis\' '
'AND a.behavior != \'internal_relation\'',
(laboratory.id,))
- analysis_sets_list = [a[0] for a in cursor.fetchall()]
+ analyzes_list = [a[0] for a in cursor.fetchall()]
- groups_list = []
+ others_list = []
cursor.execute('SELECT id '
'FROM "' + Analysis._table + '" '
- 'WHERE type = \'group\'')
- groups_list_ids = [g[0] for g in cursor.fetchall()]
- for group_id in groups_list_ids:
- if Planification._get_group_available(group_id,
- analysis_sets_list):
- groups_list.append(group_id)
+ 'WHERE type != \'analysis\'')
+ others_list_ids = [x[0] for x in cursor.fetchall()]
+ for set_group_id in others_list_ids:
+ if Planification._get_set_group_available(set_group_id,
+ analyzes_list):
+ others_list.append(set_group_id)
- return analysis_sets_list + groups_list
+ return analyzes_list + others_list
@staticmethod
- def _get_group_available(group_id, analysis_sets_list):
+ def _get_set_group_available(set_group_id, analyzes_list):
cursor = Transaction().connection.cursor()
pool = Pool()
AnalysisIncluded = pool.get('lims.analysis.included')
@@ -207,17 +208,17 @@ class Planification(Workflow, ModelSQL, ModelView):
'ON a.id = ia.included_analysis '
'WHERE ia.analysis = %s '
'AND a.behavior != \'internal_relation\'',
- (group_id,))
+ (set_group_id,))
included_analysis = cursor.fetchall()
if not included_analysis:
return False
for analysis in included_analysis:
- if (analysis[1] != 'group' and analysis[0] not in
- analysis_sets_list):
+ if (analysis[1] == 'analysis' and analysis[0] not in
+ analyzes_list):
return False
- if (analysis[1] == 'group' and not
- Planification._get_group_available(analysis[0],
- analysis_sets_list)):
+ if (analysis[1] != 'analysis' and not
+ Planification._get_set_group_available(analysis[0],
+ analyzes_list)):
return False
return True
@@ -4508,41 +4509,41 @@ class CreateFractionControlStart(ModelView):
if not self.laboratory or not self.product_type or not self.matrix:
return []
- cursor.execute('SELECT DISTINCT(analysis) '
- 'FROM "' + AnalysisLaboratory._table + '" '
- 'WHERE laboratory = %s', (self.laboratory.id,))
- analysis_sets_list = [a[0] for a in cursor.fetchall()]
- if not analysis_sets_list:
+ cursor.execute('SELECT DISTINCT(al.analysis) '
+ 'FROM "' + AnalysisLaboratory._table + '" al '
+ 'INNER JOIN "' + Analysis._table + '" a '
+ 'ON a.id = al.analysis '
+ 'WHERE al.laboratory = %s '
+ 'AND a.type = \'analysis\'',
+ (self.laboratory.id,))
+ analyzes_list = [a[0] for a in cursor.fetchall()]
+ if not analyzes_list:
return []
- lab_analysis_ids = ', '.join(str(a) for a in
- analysis_sets_list)
+ lab_analysis_ids = ', '.join(str(a) for a in analyzes_list)
- groups_list = []
- groups = Analysis.search([
- ('type', '=', 'group'),
+ others_list = []
+ others = Analysis.search([
+ ('type', '!=', 'analysis'),
])
- if groups:
- for group in groups:
- available = True
+ for set_group in others:
+ available = True
- ia = Analysis.get_included_analysis_analysis(
- group.id)
- if not ia:
- continue
- included_ids = ', '.join(str(a) for a in ia)
+ ia = Analysis.get_included_analysis_analysis(set_group.id)
+ if not ia:
+ continue
+ included_ids = ', '.join(str(a) for a in ia)
- cursor.execute('SELECT id '
- 'FROM "' + Analysis._table + '" '
- 'WHERE id IN (' + included_ids + ') '
- 'AND id NOT IN (' + lab_analysis_ids +
- ')')
- if cursor.fetchone():
- available = False
+ cursor.execute('SELECT id '
+ 'FROM "' + Analysis._table + '" '
+ 'WHERE id IN (' + included_ids + ') '
+ 'AND id NOT IN (' + lab_analysis_ids + ')')
+ if cursor.fetchone():
+ available = False
- if available:
- groups_list.append(group.id)
+ if available:
+ others_list.append(set_group.id)
- analysis_domain = analysis_sets_list + groups_list
+ analysis_domain = analyzes_list + others_list
analysis_domain_ids = ', '.join(str(a) for a in analysis_domain)
cursor.execute('SELECT DISTINCT(typ.analysis) '
diff --git a/lims/sample.py b/lims/sample.py
index 5e0cf76..497c256 100644
--- a/lims/sample.py
+++ b/lims/sample.py
@@ -640,7 +640,9 @@ class Service(ModelSQL, ModelView):
@staticmethod
def _get_included_analysis(analysis, analysis_origin='',
service_context=None):
- Typification = Pool().get('lims.typification')
+ cursor = Transaction().connection.cursor()
+ pool = Pool()
+ Typification = pool.get('lims.typification')
childs = []
if analysis.included_analysis:
@@ -651,24 +653,45 @@ class Service(ModelSQL, ModelView):
else:
origin = (analysis_origin + ' > ' +
included.included_analysis.code)
+
if included.included_analysis.type == 'analysis':
- laboratory_id = included.laboratory.id
+ laboratory_id = None
+ cursor.execute('SELECT laboratory '
+ 'FROM "' + Typification._table + '" '
+ 'WHERE product_type = %s '
+ 'AND matrix = %s '
+ 'AND analysis = %s '
+ 'AND valid IS TRUE '
+ 'AND by_default IS TRUE '
+ 'AND laboratory IS NOT NULL',
+ (service_context['product_type'],
+ service_context['matrix'],
+ included.included_analysis.id))
+ res = cursor.fetchone()
+ if res:
+ laboratory_id = res[0]
+ if not laboratory_id:
+ for l in included.included_analysis.laboratories:
+ if l.by_default is True:
+ laboratory_id = l.laboratory.id
method_id = (included.method.id
if included.method else None)
-
if not method_id:
- typifications = Typification.search([
- ('product_type', '=',
- service_context['product_type']),
- ('matrix', '=', service_context['matrix']),
- ('analysis', '=', included.included_analysis),
- ('by_default', '=', True),
- ('valid', '=', True),
- ])
- method_id = (typifications[0].method.id
- if typifications else None)
+ cursor.execute('SELECT method '
+ 'FROM "' + Typification._table + '" '
+ 'WHERE product_type = %s '
+ 'AND matrix = %s '
+ 'AND analysis = %s '
+ 'AND valid IS TRUE '
+ 'AND by_default IS TRUE',
+ (service_context['product_type'],
+ service_context['matrix'],
+ included.included_analysis.id))
+ res = cursor.fetchone()
+ if res:
+ method_id = res[0]
device_id = None
if included.included_analysis.devices:
@@ -827,12 +850,13 @@ class Service(ModelSQL, ModelView):
@classmethod
def _get_analysis_included_labs(cls, analysis):
childs = []
- if analysis.included_analysis:
- for included in analysis.included_analysis:
- if included.included_analysis.type == 'analysis':
- childs.append(included.laboratory.id)
- childs.extend(cls._get_analysis_included_labs(
- included.included_analysis))
+ for included in analysis.included_analysis:
+ if included.included_analysis.type == 'analysis':
+ for l in included.included_analysis.laboratories:
+ if l.by_default is True:
+ childs.append(l.laboratory.id)
+ childs.extend(cls._get_analysis_included_labs(
+ included.included_analysis))
return childs
@classmethod
@@ -1085,7 +1109,7 @@ class Service(ModelSQL, ModelView):
AnalysisLaboratory = pool.get('lims.analysis-laboratory')
Typification = pool.get('lims.typification')
- if not self.analysis:
+ if not self.analysis or self.analysis.type != 'analysis':
return None
cursor.execute('SELECT laboratory '
@@ -1120,7 +1144,7 @@ class Service(ModelSQL, ModelView):
pool = Pool()
AnalysisLaboratory = pool.get('lims.analysis-laboratory')
- if not self.analysis:
+ if not self.analysis or self.analysis.type != 'analysis':
return []
cursor.execute('SELECT DISTINCT(laboratory) '
@@ -5967,9 +5991,13 @@ class CreateSampleService(ModelView):
def _get_default_laboratory(analysis_id, product_type_id, matrix_id):
cursor = Transaction().connection.cursor()
pool = Pool()
+ Analysis = pool.get('lims.analysis')
AnalysisLaboratory = pool.get('lims.analysis-laboratory')
Typification = pool.get('lims.typification')
+ if Analysis(analysis_id).type != 'analysis':
+ return None
+
cursor.execute('SELECT laboratory '
'FROM "' + Typification._table + '" '
'WHERE product_type = %s '
@@ -5998,8 +6026,12 @@ class CreateSampleService(ModelView):
def _get_laboratory_domain(analysis_id):
cursor = Transaction().connection.cursor()
pool = Pool()
+ Analysis = pool.get('lims.analysis')
AnalysisLaboratory = pool.get('lims.analysis-laboratory')
+ if Analysis(analysis_id).type != 'analysis':
+ return []
+
cursor.execute('SELECT DISTINCT(laboratory) '
'FROM "' + AnalysisLaboratory._table + '" '
'WHERE analysis = %s',
@@ -6307,6 +6339,7 @@ class CreateSample(Wizard):
return samples_defaults
def _get_included_analysis(self, analysis):
+ cursor = Transaction().connection.cursor()
pool = Pool()
Typification = pool.get('lims.typification')
@@ -6314,20 +6347,43 @@ class CreateSample(Wizard):
if analysis.included_analysis:
for included in analysis.included_analysis:
if included.included_analysis.type == 'analysis':
- laboratory_id = included.laboratory.id
+
+ laboratory_id = None
+ cursor.execute('SELECT laboratory '
+ 'FROM "' + Typification._table + '" '
+ 'WHERE product_type = %s '
+ 'AND matrix = %s '
+ 'AND analysis = %s '
+ 'AND valid IS TRUE '
+ 'AND by_default IS TRUE '
+ 'AND laboratory IS NOT NULL',
+ (self.start.product_type.id,
+ self.start.matrix.id,
+ included.included_analysis.id))
+ res = cursor.fetchone()
+ if res:
+ laboratory_id = res[0]
+ if not laboratory_id:
+ for l in included.included_analysis.laboratories:
+ if l.by_default is True:
+ laboratory_id = l.laboratory.id
method_id = (included.method.id
if included.method else None)
if not method_id:
- typifications = Typification.search([
- ('product_type', '=', self.start.product_type.id),
- ('matrix', '=', self.start.matrix.id),
- ('analysis', '=', included.included_analysis),
- ('by_default', '=', True),
- ('valid', '=', True),
- ])
- method_id = (typifications[0].method.id
- if typifications else None)
+ cursor.execute('SELECT method '
+ 'FROM "' + Typification._table + '" '
+ 'WHERE product_type = %s '
+ 'AND matrix = %s '
+ 'AND analysis = %s '
+ 'AND valid IS TRUE '
+ 'AND by_default IS TRUE',
+ (self.start.product_type.id,
+ self.start.matrix.id,
+ included.included_analysis.id))
+ res = cursor.fetchone()
+ if res:
+ method_id = res[0]
device_id = None
if included.included_analysis.devices:
diff --git a/lims/view/analysis_included_form.xml b/lims/view/analysis_included_form.xml
index 2f9c067..64136fd 100644
--- a/lims/view/analysis_included_form.xml
+++ b/lims/view/analysis_included_form.xml
@@ -4,8 +4,6 @@
-
-
diff --git a/lims/view/analysis_included_list.xml b/lims/view/analysis_included_list.xml
index adca024..b4fe402 100644
--- a/lims/view/analysis_included_list.xml
+++ b/lims/view/analysis_included_list.xml
@@ -2,6 +2,5 @@
-