Module Gnumed.business.gmArriba

GNUmed <-> arriba coupling.

The API definition was provided by Thomas Scheithauer thomas.scheithauer@gmx.net.

The GNUmed project is NOT authorized to share the actual interface specs so you need to get in contact with Thomas in order to re-implement the interface.

http://www.arriba-hausarzt.de

Note that that official casing is "arriba" rather than "ARRIBA" or "Arriba".

Expand source code
"""GNUmed <-> arriba coupling.

The API definition was provided by Thomas Scheithauer
<thomas.scheithauer@gmx.net>.

The GNUmed project is NOT authorized to share the actual
interface specs so you need to get in contact with Thomas in
order to re-implement the interface.

http://www.arriba-hausarzt.de

Note that that official casing is "arriba" rather
than "ARRIBA" or "Arriba".
"""
#============================================================
__license__ = "GPL"
__author__ = "K.Hilbert <Karsten.Hilbert@gmx.net>"


# std lib
import sys
import io
import subprocess
import logging


# GNUmed libraries
if __name__ == '__main__':
        sys.path.insert(0, '../../')
        _ = lambda x:x

from Gnumed.pycommon import gmTools
from Gnumed.pycommon import gmShellAPI
from Gnumed.pycommon import gmDispatcher

from Gnumed.business import gmXdtMappings


_log = logging.getLogger('gm.arriba')
#============================================================
class cArriba(object):

        _date_format = '%d%m%Y'

        def __init__(self):
                self.path_to_binary = None
                self.pdf_result = None
                self.xml_result = None
        #--------------------------------------------------------
        # internal helpers
        #--------------------------------------------------------
        def __detect_binary(self):

                if self.path_to_binary is not None:
                        return True

                found, cmd = gmShellAPI.find_first_binary(binaries = [
                        r'/usr/local/bin/arriba',
                        r'/usr/bin/arriba',
                        r'arriba',
                        r'arriba.exe'
#                       r'c:\programs\freediams\freediams.exe',
#                       r'freediams.exe'
                ])

                if found:
                        self.path_to_binary = cmd
                        return True

#               try:
#                       self.custom_path_to_binary
#               except AttributeError:
#                       _log.error('cannot find FreeDiams binary, no custom path set')
#                       return False

#               found, cmd = gmShellAPI.detect_external_binary(binary = self.custom_path_to_binary)
#               if found:
#                       self.path_to_binary = cmd
#                       return True

                _log.error('cannot find arriba binary')
                return False
        #--------------------------------------------------------
        def __write_config_file(self, patient=None):
                xml = """<?xml version="1.0" encoding="UTF-8"?>

<konsultation version="1.1" xmlns="https://gpzk.de/ns/arriba/start-konfiguration">
        <parameter>
                %s
                <idle-timeout>0</idle-timeout>
        </parameter>
        <speicherorte>
                <status>%s</status>
                <ergebnis-xml>%s</ergebnis-xml>
                <ergebnis-pdf>%s</ergebnis-pdf>
        </speicherorte>
</konsultation>
"""
                if patient is None:
                        pat_xml = ''
                else:
                        active_name = patient.get_active_name()
                        pat_xml = """<vorname>%s%s</vorname>
                <nachname>%s</nachname>
                <geschlecht>%s</geschlecht>
                <geburtsdatum>%s</geburtsdatum>""" % (
                        active_name['firstnames'],
                        gmTools.coalesce(active_name['preferred'], '', ' (%s)'),
                        active_name['lastnames'],
                        gmXdtMappings.map_gender_gm2xdt[patient['gender']],
                        patient.get_formatted_dob(format = cArriba._date_format, none_string = '00009999')
                )

                fname_cfg = gmTools.get_unique_filename(prefix = 'gm2arriba-', suffix = '.xml')
                fname_status = gmTools.get_unique_filename(prefix = 'arriba2gm_status-', suffix = '.xml')
                self.xml_result = gmTools.get_unique_filename(prefix = 'arriba2gm_result-', suffix = '.xml')
                self.pdf_result = gmTools.get_unique_filename(prefix = 'arriba2gm_result-', suffix = '.pdf')
                xml_file = io.open(fname_cfg, mode = 'wt', encoding = 'utf8', errors = 'replace')
                xml_file.write (xml % (
                        pat_xml,
                        fname_status,
                        self.xml_result,
                        self.pdf_result
                ))
                xml_file.close()

                return fname_cfg
        #--------------------------------------------------------
        # external API
        #--------------------------------------------------------
        def run(self, patient=None, debug=False):
                self.pdf_result = None

                cfg_file = self.__write_config_file(patient = patient)

                # FIXME: add user-configured path
                if not self.__detect_binary():
                        return False

                args = (
                        self.path_to_binary,
                        '--file=%s' % cfg_file,
                        '--show-cli-pane=%s' % gmTools.bool2subst(debug, 'true', 'false')
                )

                try:
                        subprocess.check_call(args = args, close_fds = True)
                except (OSError, ValueError, subprocess.CalledProcessError):
                        _log.exception('there was a problem executing [%s]', self.path_to_binary)
                        gmDispatcher.send(signal = 'statustext', msg = _('Cannot run [arriba] !'), beep = True)
                        return False

                try:
                        open(self.pdf_result).close()
                except Exception:
                        _log.exception('error accessing [%s]', self.pdf_result)
                        gmDispatcher.send(signal = 'statustext', msg = _('No [arriba] result found in [%s].') % self.pdf_result, beep = False)
                        return False

                return True
#============================================================
# main
#------------------------------------------------------------
if __name__ == "__main__":

        if len(sys.argv) < 2:
                sys.exit()

        if sys.argv[1] != 'test':
                sys.exit()

        from Gnumed.pycommon import gmI18N
        from Gnumed.pycommon import gmDateTime
        gmI18N.activate_locale()
        gmI18N.install_domain()
        gmDateTime.init()

        from Gnumed.business import gmPerson

        gmPerson.set_active_patient(patient = gmPerson.cPerson(aPK_obj = 12))

        arriba = cArriba()
        print(arriba)
        arriba.run(patient = gmPerson.gmCurrentPatient(), debug = True)

Classes

class cArriba
Expand source code
class cArriba(object):

        _date_format = '%d%m%Y'

        def __init__(self):
                self.path_to_binary = None
                self.pdf_result = None
                self.xml_result = None
        #--------------------------------------------------------
        # internal helpers
        #--------------------------------------------------------
        def __detect_binary(self):

                if self.path_to_binary is not None:
                        return True

                found, cmd = gmShellAPI.find_first_binary(binaries = [
                        r'/usr/local/bin/arriba',
                        r'/usr/bin/arriba',
                        r'arriba',
                        r'arriba.exe'
#                       r'c:\programs\freediams\freediams.exe',
#                       r'freediams.exe'
                ])

                if found:
                        self.path_to_binary = cmd
                        return True

#               try:
#                       self.custom_path_to_binary
#               except AttributeError:
#                       _log.error('cannot find FreeDiams binary, no custom path set')
#                       return False

#               found, cmd = gmShellAPI.detect_external_binary(binary = self.custom_path_to_binary)
#               if found:
#                       self.path_to_binary = cmd
#                       return True

                _log.error('cannot find arriba binary')
                return False
        #--------------------------------------------------------
        def __write_config_file(self, patient=None):
                xml = """<?xml version="1.0" encoding="UTF-8"?>

<konsultation version="1.1" xmlns="https://gpzk.de/ns/arriba/start-konfiguration">
        <parameter>
                %s
                <idle-timeout>0</idle-timeout>
        </parameter>
        <speicherorte>
                <status>%s</status>
                <ergebnis-xml>%s</ergebnis-xml>
                <ergebnis-pdf>%s</ergebnis-pdf>
        </speicherorte>
</konsultation>
"""
                if patient is None:
                        pat_xml = ''
                else:
                        active_name = patient.get_active_name()
                        pat_xml = """<vorname>%s%s</vorname>
                <nachname>%s</nachname>
                <geschlecht>%s</geschlecht>
                <geburtsdatum>%s</geburtsdatum>""" % (
                        active_name['firstnames'],
                        gmTools.coalesce(active_name['preferred'], '', ' (%s)'),
                        active_name['lastnames'],
                        gmXdtMappings.map_gender_gm2xdt[patient['gender']],
                        patient.get_formatted_dob(format = cArriba._date_format, none_string = '00009999')
                )

                fname_cfg = gmTools.get_unique_filename(prefix = 'gm2arriba-', suffix = '.xml')
                fname_status = gmTools.get_unique_filename(prefix = 'arriba2gm_status-', suffix = '.xml')
                self.xml_result = gmTools.get_unique_filename(prefix = 'arriba2gm_result-', suffix = '.xml')
                self.pdf_result = gmTools.get_unique_filename(prefix = 'arriba2gm_result-', suffix = '.pdf')
                xml_file = io.open(fname_cfg, mode = 'wt', encoding = 'utf8', errors = 'replace')
                xml_file.write (xml % (
                        pat_xml,
                        fname_status,
                        self.xml_result,
                        self.pdf_result
                ))
                xml_file.close()

                return fname_cfg
        #--------------------------------------------------------
        # external API
        #--------------------------------------------------------
        def run(self, patient=None, debug=False):
                self.pdf_result = None

                cfg_file = self.__write_config_file(patient = patient)

                # FIXME: add user-configured path
                if not self.__detect_binary():
                        return False

                args = (
                        self.path_to_binary,
                        '--file=%s' % cfg_file,
                        '--show-cli-pane=%s' % gmTools.bool2subst(debug, 'true', 'false')
                )

                try:
                        subprocess.check_call(args = args, close_fds = True)
                except (OSError, ValueError, subprocess.CalledProcessError):
                        _log.exception('there was a problem executing [%s]', self.path_to_binary)
                        gmDispatcher.send(signal = 'statustext', msg = _('Cannot run [arriba] !'), beep = True)
                        return False

                try:
                        open(self.pdf_result).close()
                except Exception:
                        _log.exception('error accessing [%s]', self.pdf_result)
                        gmDispatcher.send(signal = 'statustext', msg = _('No [arriba] result found in [%s].') % self.pdf_result, beep = False)
                        return False

                return True

Methods

def run(self, patient=None, debug=False)
Expand source code
def run(self, patient=None, debug=False):
        self.pdf_result = None

        cfg_file = self.__write_config_file(patient = patient)

        # FIXME: add user-configured path
        if not self.__detect_binary():
                return False

        args = (
                self.path_to_binary,
                '--file=%s' % cfg_file,
                '--show-cli-pane=%s' % gmTools.bool2subst(debug, 'true', 'false')
        )

        try:
                subprocess.check_call(args = args, close_fds = True)
        except (OSError, ValueError, subprocess.CalledProcessError):
                _log.exception('there was a problem executing [%s]', self.path_to_binary)
                gmDispatcher.send(signal = 'statustext', msg = _('Cannot run [arriba] !'), beep = True)
                return False

        try:
                open(self.pdf_result).close()
        except Exception:
                _log.exception('error accessing [%s]', self.pdf_result)
                gmDispatcher.send(signal = 'statustext', msg = _('No [arriba] result found in [%s].') % self.pdf_result, beep = False)
                return False

        return True