kalenislims/lims_digital_sign/digital_sign.py
2018-12-11 00:50:25 -03:00

148 lines
6 KiB
Python

# -*- coding: utf-8 -*-
# This file is part of lims_digital_sign module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
import logging
from datetime import datetime
from trytond.model import ModelView, fields
from trytond.wizard import Wizard, StateView, StateTransition, Button
from trytond.pool import Pool
from trytond.transaction import Transaction
__all__ = ['DigitalSignStart', 'DigitalSignSucceed', 'DigitalSignFailed',
'DigitalSign']
class DigitalSignStart(ModelView):
"Digital Sign Start"
__name__ = 'lims_digital_sign.digital_sign.start'
class DigitalSignSucceed(ModelView):
"Digital Sign Succeed"
__name__ = 'lims_digital_sign.digital_sign.succeed'
class DigitalSignFailed(ModelView):
"Digital Sign Failed"
__name__ = 'lims_digital_sign.digital_sign.failed'
unsigned_reports = fields.One2Many('lims.results_report', None,
'Unsigned reports', readonly=True)
unsent_reports = fields.One2Many('lims.results_report', None,
'Unsent reports', readonly=True)
class DigitalSign(Wizard):
'Digital Sign'
__name__ = 'lims_digital_sign.digital_sign'
start = StateView('lims_digital_sign.digital_sign.start',
'lims_digital_sign.view_digital_sign_start', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Sign', 'sign', 'tryton-ok', default=True),
])
sign = StateTransition()
succeed = StateView('lims_digital_sign.digital_sign.succeed',
'lims_digital_sign.view_digital_sign_succeed', [
Button('Ok', 'end', 'tryton-ok', default=True),
])
failed = StateView('lims_digital_sign.digital_sign.failed',
'lims_digital_sign.view_digital_sign_failed', [
Button('Ok', 'end', 'tryton-ok', default=True),
])
def transition_sign(self):
'''
Digital Sign reports
'''
logger = logging.getLogger('lims_digital_sign')
logger.info('Wizard - Digital Sign:INIT')
ResultsReport = Pool().get('lims.results_report')
context = Transaction().context
model = context.get('active_model', None)
if model and model == 'ir.ui.menu':
# If it was executed from `menu item`, then get ids
# TODO: Include signed but not sent?
active_ids = [r.id for r in ResultsReport.search([
('signed', '=', False)])]
logger.info('Wizard - Digital Sign:Processing all Results '
'Reports')
else:
# If it was executed from `actions` or `cron`, then use context ids
active_ids = context['active_ids']
logger.info('Wizard - Digital Sign:Processing context Results '
'Reports')
unsigned_reports = []
unsent_reports = []
for active_id in active_ids:
results_report = ResultsReport(active_id)
logger.info('Wizard - Digital Sign:results_report.number:%s',
results_report.number)
if (results_report.single_sending_report and not
results_report.single_sending_report_ready):
logger.warn('Wizard - Digital Sign:results_report.number:%s:'
'IGNORED:REPORT NOT READY TO SINGLE SENDING',
results_report.number)
continue
spanish_report = results_report.has_report_cached(
english_report=False)
english_report = results_report.has_report_cached(
english_report=True)
if not spanish_report and not english_report:
logger.warn('Wizard - Digital Sign:results_report.number:%s:'
'IGNORED:NO HAS CACHED REPORTS', results_report.number)
continue
signed = True
if spanish_report:
signed = signed and results_report.build_report(
english_report=False)
if english_report:
signed = signed and results_report.build_report(
english_report=True)
if not signed:
unsigned_reports.append(results_report)
continue
else:
logger.info('Wizard - Digital Sign:results_report.number:'
'%s:Signed.', results_report.number)
if spanish_report:
results_report.attach_report(english_report=False)
if english_report:
results_report.attach_report(english_report=True)
logger.info('Wizard - Digital Sign:results_report.number:'
'%s:Attached.', results_report.number)
results_report.signed = True
results_report.signed_date = datetime.now()
results_report.save()
sent = results_report.mail_acknowledgment_of_results_report(
spanish_report=spanish_report,
english_report=english_report)
if not sent:
unsent_reports.append(results_report)
continue
else:
logger.info('Wizard - Digital Sign:results_report.number:'
'%s:Sent.', results_report.number)
results_report.sent = True
results_report.sent_date = datetime.now()
results_report.save()
if not unsigned_reports and not unsent_reports:
logger.info('Wizard - Digital Sign:SUCCEED')
return 'succeed'
else:
logger.info('Wizard - Digital Sign:FAILED')
self.failed.unsigned_reports = unsigned_reports
self.failed.unsent_reports = unsent_reports
return 'failed'
def default_failed(self, fields):
default = {
'unsigned_reports': [f.id for f in self.failed.unsigned_reports],
'unsent_reports': [f.id for f in self.failed.unsent_reports],
}
return default