[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Health-dev] Integration of Orthanc (module health_orthanc)
From: |
Luis Falcon |
Subject: |
Re: [Health-dev] Integration of Orthanc (module health_orthanc) |
Date: |
Fri, 19 May 2023 10:54:26 +0100 |
Dear Patryk
On Wed, 17 May 2023 16:53:01 +0200
p.rosik@stud.uni-hannover.de <p.rosik@stud.uni-hannover.de> wrote:
> Hello dear GNU Health community ,
>
> I am currently writing my master thesis and trying to implement a
> periodic synchronisation of the Orthanc and GNU Health DB.
> Unfortunately I run into some problems. I create a background thread
> in which the synchronisation should be done periodically. My idea was
> to initialise the variable "sync_thread = None" in the class
> "OrthancServerConfig" in order to be able to start and stop the
> synchronisation via a start and stop button. In addition, I use the
> already implemented method "sync" of the same class. I have already
> tried this:
>
> class SyncThread(threading.Thread):
> """A background thread that periodically synchronizes data with
> an Orthanc server.""" def __init__(self, servers=None, timeout=180):
> """
> Initialize the SyncThread object as a background service.
> :param servers: A list of Orthanc servers.
> :type servers: list
> :param timeout: The time interval (in seconds) between each
> synchronization. :type timeout: int
> """
> threading.Thread.__init__(self,
> name="OrthancPeriodicSyncronizationThread") self.daemon = True
> self.servers = servers
> self.timeout = timeout
> self.stop_event = threading.Event()
>
> def run(self):
> """Call loop with timeout to synchronize the Orthanc DB with
> the GNU Health DB.""" with Transaction().start(): <-- (line
> in which error 1 occurs) while not self.stop_event.is_set():
> OrthancServerConfig.sync(self.servers)
> self.stop_event.wait(self.timeout)
>
> def stop(self):
> """Stop the synchronization thread."""
> self.stop_event.set()
>
>
> Class OrthancServerConfig(ModelSQL, ModelView):
> sync_thread = None
> ...
> @classmethod
> @ModelView.button
> def start_periodic_sync(cls, servers):
> """
> Initializes the synchronization of data with Orthanc as a
> background service. :param servers: A list of Orthanc servers.
> :type servers: list
> """
> if cls.sync_thread is not None:
> raise UserWarning("Synchronization is already running!")
> else:
> cls.sync_thread = SyncThread(servers=servers)
> cls.sync_thread.start()
>
> @classmethod
> @ModelView.button
> def stop_periodic_sync(cls): <-- (error 2 occurs here, when
> "stop"-button is pressed) """
> Stop the synchronization thread.
> """
> if cls.sync_thread is None:
> raise UserWarning("No synchronization is performed!")
> else:
> cls.sync_thread.stop()
> cls.sync_thread.join()
> cls.sync_thread = None
>
> 2 errors occur, for which I unfortunately don't know an answer to fix
> them. Error 1 occurs, when the "start" button is pressed and the
> "run"-method of the class "SyncThread" is triggered:
> orthanc/health_orthanc.py", line 66, in run with
> Transaction().start(): TypeError: Transaction.start() missing 2
> required positional arguments: 'database_name' and 'user' I'm not
> sure, if "with Transaction.start():" is necessary here, but i tried
> this, because i got this error before: orthanc/health_orthanc.py",
> line 269, in sync pool = Pool() File
> "/opt/gnuhealth/venv/lib/python3.10/site-packages/trytond/pool.py",
> line 61, in __new__ database_name = Transaction().database.name
> AttributeError: 'NoneType' object has no attribute 'name' If "with
> Transaction.start():" is required, unfortunately I wasn't able to
> figure out which are the two required arguments or if the solution is
> generally in a completely different direction.
>
> The second error occurs, when the "stop" button is pressed:
> TypeError: OrthancServerConfig.stop_periodic_sync() takes 1
> positional argument but 2 were given Here I was also not able to
> interpret the error, because both my button and the stop method are
> not passed 2 arguments.
>
> I would be grateful for any help and am available for queries!
>
Thanks for reporting! Definitely look into it. I have two conferences
(Volla community days and Tryton unconference) in the coming days, but
I promise to see look into the issue, and come with and (hopefully :))
bring you and answer early next week.
This might be a bit related to how I usually work with periodic jobs...
I like to place it at operating system level (crontab) and call a
proteus script. You can take a look at the example on the federation
queue manager. To me, this way provides more flexibility.
Happy weekend!
Luis
> Best regards,
> Patryk
>