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! Best regards, Patryk