From 6e6218e69994e66b7df44ff3645e7c741ad143f1 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Sun, 10 Apr 2022 16:05:10 +0200
Subject: [PATCH] Add tasks for syncing rooms periodically or after changes

---
 aleksis/apps/matrix/apps.py    |  9 +++++++++
 aleksis/apps/matrix/signals.py | 12 ++++++++++++
 aleksis/apps/matrix/tasks.py   |  9 +++++++++
 3 files changed, 30 insertions(+)
 create mode 100644 aleksis/apps/matrix/signals.py

diff --git a/aleksis/apps/matrix/apps.py b/aleksis/apps/matrix/apps.py
index 1c60d9e..ac659eb 100644
--- a/aleksis/apps/matrix/apps.py
+++ b/aleksis/apps/matrix/apps.py
@@ -1,3 +1,5 @@
+from django.db.models.signals import post_save
+
 from aleksis.core.util.apps import AppConfig
 
 
@@ -11,3 +13,10 @@ class DefaultConfig(AppConfig):
     }
     licence = "EUPL-1.2+"
     copyright_info = (([2021, 2022], "Jonathan Weth", "dev@jonathanweth.de"),)
+
+    def ready(self):
+        from aleksis.core.models import Group
+
+        from .signals import post_save_matrix_signal
+
+        post_save.connect(post_save_matrix_signal, sender=Group)
diff --git a/aleksis/apps/matrix/signals.py b/aleksis/apps/matrix/signals.py
new file mode 100644
index 0000000..cf1296f
--- /dev/null
+++ b/aleksis/apps/matrix/signals.py
@@ -0,0 +1,12 @@
+from aleksis.apps.matrix.models import MatrixRoom
+
+from .tasks import sync_room
+
+
+def post_save_matrix_signal(sender, instance, created, **kwargs):
+    """Sync Matrix room after changing a group."""
+    if created:
+        return
+
+    for room in MatrixRoom.objects.filter(group=instance):
+        sync_room.delay(room.pk)
diff --git a/aleksis/apps/matrix/tasks.py b/aleksis/apps/matrix/tasks.py
index c7346d8..f61f53b 100644
--- a/aleksis/apps/matrix/tasks.py
+++ b/aleksis/apps/matrix/tasks.py
@@ -1,3 +1,4 @@
+from datetime import timedelta
 from typing import Sequence
 
 from aleksis.apps.matrix.models import MatrixRoom
@@ -25,3 +26,11 @@ def provision_group_in_matrix(pk: int):
     """Provision provided group in Matrix."""
     group = Group.objects.get(pk=pk)
     group._provision_in_matrix()
+
+
+@app.task(run_every=timedelta(days=1))
+def sync_rooms():
+    """Synchronise all Matrix rooms."""
+    rooms = MatrixRoom.objects.all()
+    for room in rooms:
+        room.sync()
-- 
GitLab