kalenislims/lims_project_water/project.py

287 lines
11 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of lims_project_water module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.model import fields
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval, Equal, Bool, Not
from trytond.transaction import Transaction
from trytond.report import Report
from trytond.exceptions import UserError
from trytond.i18n import gettext
class Project(metaclass=PoolMeta):
__name__ = 'lims.project'
wtr_comments = fields.Text('Climatic conditions of the sampling')
@classmethod
def __setup__(cls):
super().__setup__()
project_type = ('water', 'Water sampling')
if project_type not in cls.type.selection:
cls.type.selection.append(project_type)
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('//group[@id="water"]', 'states', {
'invisible': Not(Bool(Equal(Eval('type'), 'water'))),
}),
]
class Entry(metaclass=PoolMeta):
__name__ = 'lims.entry'
@classmethod
def __setup__(cls):
super().__setup__()
project_type = ('water', 'Water sampling')
if project_type not in cls.project_type.selection:
cls.project_type.selection.append(project_type)
class Sample(metaclass=PoolMeta):
__name__ = 'lims.sample'
sampling_point = fields.Char('Sampling point', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
gps_coordinates = fields.Char('GPS coordinates', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
sampling_datetime = fields.DateTime('Sampling date and time', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
sampling_responsible = fields.Many2One('party.party',
'Sampling responsible', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('//page[@id="water_sampling"]', 'states', {
'invisible': Not(Bool(
Equal(Eval('project_type'), 'water'))),
}),
]
class CreateSampleStart(metaclass=PoolMeta):
__name__ = 'lims.create_sample.start'
sampling_point = fields.Char('Sampling point', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
gps_coordinates = fields.Char('GPS coordinates', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
sampling_datetime = fields.DateTime('Sampling date and time', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
sampling_responsible = fields.Many2One('party.party',
'Sampling responsible', states={
'invisible': Not(Bool(Equal(Eval('project_type'), 'water'))),
}, depends=['project_type'])
@classmethod
def view_attributes(cls):
return super().view_attributes() + [
('//page[@id="water_sampling"]', 'states', {
'invisible': Not(Bool(
Equal(Eval('project_type'), 'water'))),
}),
]
class CreateSample(metaclass=PoolMeta):
__name__ = 'lims.create_sample'
def _get_samples_defaults(self, entry_id):
samples_defaults = super()._get_samples_defaults(entry_id)
sampling_point = (hasattr(self.start, 'sampling_point') and
getattr(self.start, 'sampling_point') or None)
gps_coordinates = (hasattr(self.start, 'gps_coordinates') and
getattr(self.start, 'gps_coordinates') or None)
sampling_responsible_id = None
if (hasattr(self.start, 'sampling_responsible') and
getattr(self.start, 'sampling_responsible')):
sampling_responsible_id = getattr(self.start,
'sampling_responsible').id
for sample_defaults in samples_defaults:
sample_defaults['sampling_point'] = sampling_point
sample_defaults['gps_coordinates'] = gps_coordinates
sample_defaults['sampling_responsible'] = sampling_responsible_id
return samples_defaults
class ProjectWaterSampling(Report):
'Project Water Sampling report'
__name__ = 'lims.project.water_sampling_report'
@classmethod
def execute(cls, ids, data):
Project = Pool().get('lims.project')
project = Project(data['id'])
if project.type != 'water':
raise UserError(gettext('lims_project_water.msg_not_water'))
return super().execute(ids, data)
@classmethod
def get_context(cls, records, header, data):
pool = Pool()
Project = pool.get('lims.project')
Fraction = pool.get('lims.fraction')
Entry = pool.get('lims.entry')
report_context = super().get_context(records, header, data)
project = Project(data['id'])
entry = Entry.search([
('project', '=', project.id),
], order=[('number', 'ASC')])
report_context['company'] = report_context['user'].company
report_context['date'] = project.end_date
report_context['description'] = project.description
report_context['client'] = project.client
report_context['project_comments'] = project.comments
report_context['wtr_comments'] = project.wtr_comments
report_context['code'] = project.code
report_context['invoice_party'] = ''
report_context['technical_team'] = ''
report_context['contact_results'] = ''
report_context['contact_invoice'] = ''
if entry:
report_context['invoice_party'] = entry[0].invoice_party
report_context['technical_team'] = entry[0].comments
report_context['contact_results'] = ', '.join([
r.name for r in cls.get_contact_results(project.id)])
report_context['contact_invoice'] = ', '.join([
r.name for r in cls.get_contact_invoice(project.id)])
fractions = Fraction.search([
('sample.entry.project', '=', project.id),
('confirmed', '=', True),
], order=[('number', 'ASC')])
objects = []
for fraction in fractions:
objects.append({
'number': fraction.get_formated_number('pt-m-sy-sn-fn'),
'type': fraction.type.code,
'packages': '%s %s' % (fraction.packages_quantity or '',
fraction.package_type.description if fraction.package_type
else ''),
'sampling_point': (fraction.sample.sampling_point
if fraction.sample.sampling_point else ''),
'gps_coordinates': (fraction.sample.gps_coordinates
if fraction.sample.gps_coordinates else ''),
'sampling_responsible': (fraction.sample.sampling_responsible
if fraction.sample.sampling_responsible else ''),
'entry_date': fraction.sample.date2,
'countersample_location': (fraction.countersample_location.code
if fraction.countersample_location else ''),
'countersample_date': fraction.countersample_date or '',
'discharge_date': fraction.discharge_date or '',
'sample_comments': str(fraction.sample.comments or ''),
'label': fraction.sample.label,
'results': (cls.get_results_insitu(fraction.id)),
})
report_context['records'] = objects
return report_context
@classmethod
def get_results_insitu(cls, fraction_id):
cursor = Transaction().connection.cursor()
pool = Pool()
Service = pool.get('lims.service')
NotebookLine = pool.get('lims.notebook.line')
Analysis = pool.get('lims.analysis')
ProductUom = pool.get('product.uom')
slike = '%in situ%'
cursor.execute('SELECT DISTINCT(a.description) , '
' nl.result, p.symbol AS initial_unit '
'FROM "' + NotebookLine._table + '" nl '
'INNER JOIN "' + Service._table + '" s '
'ON nl.service = s.id '
'INNER JOIN "' + Analysis._table + '" a '
'ON a.id = nl.analysis '
'INNER JOIN "' + ProductUom._table + '" p '
'ON nl.initial_unit = p.id '
'WHERE s.fraction = %s '
'AND a.description LIKE %s '
'ORDER BY a.description ASC ',
(fraction_id, slike,))
res = {}
res = cursor.fetchall()
line_result = []
if res:
for line in res:
r0 = line[0].encode('utf-8')
r2 = line[2].encode('utf-8')
if line[1] is None:
r1 = ' '
else:
r1 = line[1].encode('utf-8')
line_p = ['%s: %s %s \n' % (r0, r1, r2)]
line_result.extend(line_p)
return line_result
@staticmethod
def get_contact_results(project_id):
cursor = Transaction().connection.cursor()
pool = Pool()
Entry = pool.get('lims.entry')
Party = pool.get('party.party')
PartyAddress = pool.get('party.address')
EntryReportContact = pool.get('lims.entry.report_contacts')
cursor.execute('SELECT rc.contact '
'FROM "' + Entry._table + '" e '
'INNER JOIN "' + Party._table + '" p '
'ON e.party = p.id '
'INNER JOIN "' + EntryReportContact._table + '" rc '
'ON e.id = rc.entry '
'WHERE e.project = %s ',
(project_id,))
return PartyAddress.search([
('id', 'in', [x[0] for x in cursor.fetchall()]),
])
@staticmethod
def get_contact_invoice(project_id):
cursor = Transaction().connection.cursor()
pool = Pool()
Entry = pool.get('lims.entry')
Party = pool.get('party.party')
PartyAddress = pool.get('party.address')
EntryInvoiceContact = pool.get('lims.entry.invoice_contacts')
cursor.execute('SELECT ic.contact '
'FROM "' + Entry._table + '" e '
'INNER JOIN "' + Party._table + '" p '
'ON e.party = p.id '
'INNER JOIN "' + EntryInvoiceContact._table + '" ic '
'ON e.id = ic.entry '
'WHERE e.project = %s ',
(project_id,))
return PartyAddress.search([
('id', 'in', [x[0] for x in cursor.fetchall()]),
])