1 """GNUmed <-> arriba coupling.
2
3 The API definition was provided by Thomas Scheithauer
4 <thomas.scheithauer@gmx.net>.
5
6 The GNUmed project is NOT authorized to share the actual
7 interface specs so you need to get in contact with Thomas in
8 order to re-implement the interface.
9
10 http://www.arriba-hausarzt.de
11
12 Note that that official casing is "arriba" rather
13 than "ARRIBA" or "Arriba".
14 """
15
16 __license__ = "GPL"
17 __author__ = "K.Hilbert <Karsten.Hilbert@gmx.net>"
18
19
20
21 import os
22 import sys
23 import codecs
24 import subprocess
25 import logging
26
27
28
29 if __name__ == '__main__':
30 sys.path.insert(0, '../../')
31
32 from Gnumed.pycommon import gmTools
33 from Gnumed.pycommon import gmShellAPI
34 from Gnumed.pycommon import gmDispatcher
35
36 from Gnumed.business import gmXdtMappings
37
38
39 _log = logging.getLogger('gm.arriba')
40
42
43 _date_format = '%d%m%Y'
44
46 self.path_to_binary = None
47 self.pdf_result = None
48 self.xml_result = None
49
50
51
53
54 if self.path_to_binary is not None:
55 return True
56
57 found, cmd = gmShellAPI.find_first_binary(binaries = [
58 r'/usr/local/bin/arriba',
59 r'/usr/bin/arriba',
60 r'arriba',
61 r'arriba.exe'
62
63
64 ])
65
66 if found:
67 self.path_to_binary = cmd
68 return True
69
70
71
72
73
74
75
76
77
78
79
80
81 _log.error('cannot find arriba binary')
82 return False
83
85 xml = """<?xml version="1.0" encoding="UTF-8"?>
86
87 <konsultation version="1.1" xmlns="http://gpzk.de/ns/arriba/start-konfiguration">
88 <parameter>
89 %s
90 <idle-timeout>0</idle-timeout>
91 </parameter>
92 <speicherorte>
93 <status>%s</status>
94 <ergebnis-xml>%s</ergebnis-xml>
95 <ergebnis-pdf>%s</ergebnis-pdf>
96 </speicherorte>
97 </konsultation>
98 """
99 if patient is None:
100 pat_xml = u''
101 else:
102 active_name = patient.get_active_name()
103 pat_xml = """<vorname>%s%s</vorname>
104 <nachname>%s</nachname>
105 <geschlecht>%s</geschlecht>
106 <geburtsdatum>%s</geburtsdatum>""" % (
107 active_name['firstnames'],
108 gmTools.coalesce(active_name['preferred'], u'', u' (%s)'),
109 active_name['lastnames'],
110 gmXdtMappings.map_gender_gm2xdt[patient['gender']],
111 patient.get_formatted_dob(format = cArriba._date_format, encoding = u'utf8', none_string = u'00009999')
112 )
113
114 fname_cfg = gmTools.get_unique_filename(prefix = 'gm2arriba-', suffix = '.xml')
115 fname_status = gmTools.get_unique_filename(prefix = 'arriba2gm_status-', suffix = '.xml')
116 self.xml_result = gmTools.get_unique_filename(prefix = 'arriba2gm_result-', suffix = '.xml')
117 self.pdf_result = gmTools.get_unique_filename(prefix = 'arriba2gm_result-', suffix = '.pdf')
118 xml_file = codecs.open(fname_cfg, 'wb', 'utf8', 'replace')
119 xml_file.write (xml % (
120 pat_xml,
121 fname_status,
122 self.xml_result,
123 self.pdf_result
124 ))
125 xml_file.close()
126
127 return fname_cfg
128
129
130
131 - def run(self, patient=None, debug=False):
132 self.pdf_result = None
133
134 cfg_file = self.__write_config_file(patient = patient)
135
136
137 if not self.__detect_binary():
138 return False
139
140 args = (
141 self.path_to_binary,
142 '--file=%s' % cfg_file,
143 '--show-cli-pane=%s' % gmTools.bool2subst(debug, 'true', 'false')
144 )
145
146 try:
147 subprocess.check_call(args = args, close_fds = True)
148 except (OSError, ValueError, subprocess.CalledProcessError):
149 _log.exception('there was a problem executing [%s]', self.path_to_binary)
150 gmDispatcher.send(signal = u'statustext', msg = _('Cannot run [arriba] !'), beep = True)
151 return False
152
153 try:
154 open(self.pdf_result).close()
155 except:
156 _log.exception('error accessing [%s]', self.pdf_result)
157 gmDispatcher.send(signal = u'statustext', msg = _('No [arriba] result found in [%s].') % self.pdf_result, beep = False)
158 return False
159
160 return True
161
162
163
164 if __name__ == "__main__":
165
166 if len(sys.argv) < 2:
167 sys.exit()
168
169 if sys.argv[1] != 'test':
170 sys.exit()
171
172 from Gnumed.pycommon import gmI18N
173 from Gnumed.pycommon import gmDateTime
174 gmI18N.activate_locale()
175 gmI18N.install_domain()
176 gmDateTime.init()
177
178 from Gnumed.business import gmPerson
179
180 gmPerson.set_active_patient(patient = gmPerson.cIdentity(aPK_obj = 12))
181
182 arriba = cArriba()
183 print arriba
184 arriba.run(patient = gmPerson.gmCurrentPatient(), debug = True)
185