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
 

Reply via email to