diff --git a/fractal_database_matrix/controllers/replicate.py b/fractal_database_matrix/controllers/replicate.py index daf07c1..cd5bff4 100644 --- a/fractal_database_matrix/controllers/replicate.py +++ b/fractal_database_matrix/controllers/replicate.py @@ -49,6 +49,8 @@ def to( try: homeserver = MatrixHomeserver.objects.get(url=homeserver_url) + if not homeserver.replication_enabled: + homeserver.update(replication_enabled=True) except MatrixHomeserver.DoesNotExist: with transaction.atomic(): # create the homeserver @@ -58,6 +60,7 @@ def to( type=MatrixHomeserver.__name__, registration_token=registration_token, parent_db=current_database, + replication_enabled=True, ) current_device.add_membership(homeserver) else: diff --git a/fractal_database_matrix/migrations/0001_initial.py b/fractal_database_matrix/migrations/0001_initial.py index 9dc6eca..71e9b12 100644 --- a/fractal_database_matrix/migrations/0001_initial.py +++ b/fractal_database_matrix/migrations/0001_initial.py @@ -19,6 +19,7 @@ class Migration(migrations.Migration): ('url', models.URLField(unique=True)), ('priority', models.PositiveIntegerField(blank=True, default=0, null=True)), ('registration_token', models.CharField(blank=True, max_length=255, null=True)), + ('replication_enabled', models.BooleanField(default=False)), ], options={ 'abstract': False, @@ -35,7 +36,7 @@ class Migration(migrations.Migration): ('matrix_id', models.CharField(max_length=255)), ('password', models.CharField(blank=True, max_length=255, null=True)), ('access_token', models.CharField(max_length=255)), - ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='fractal_database.device')), + ('device', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='fractal_database.device')), ('homeserver', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='credentials', to='fractal_database_matrix.matrixhomeserver')), ], options={ diff --git a/fractal_database_matrix/models.py b/fractal_database_matrix/models.py index 4cd5ad4..2a6e11c 100644 --- a/fractal_database_matrix/models.py +++ b/fractal_database_matrix/models.py @@ -49,6 +49,7 @@ class MatrixHomeserver(Service): url = models.URLField(unique=True) priority = models.PositiveIntegerField(default=0, blank=True, null=True) registration_token = models.CharField(max_length=255, blank=True, null=True) + replication_enabled = models.BooleanField(default=False) def __str__(self) -> str: return f"{self.url} (MatrixHomeserver)" @@ -205,7 +206,7 @@ class MatrixCredentials(BaseModel): homeserver = models.ForeignKey( MatrixHomeserver, on_delete=models.CASCADE, related_name="credentials" ) - device = models.ForeignKey(Device, on_delete=models.CASCADE) + device = models.ForeignKey(Device, on_delete=models.CASCADE, blank=True, null=True) class InMemoryMatrixCredentials(MatrixCredentials): diff --git a/fractal_database_matrix/signals.py b/fractal_database_matrix/signals.py index 0b24bc6..f1caf61 100644 --- a/fractal_database_matrix/signals.py +++ b/fractal_database_matrix/signals.py @@ -26,7 +26,8 @@ def create_replication_channel_for_new_matrix_homeserver( if not created or raw: return - + if not instance.replication_enabled: + return if not transaction.get_connection().in_atomic_block: raise Exception("Not in transaction") @@ -83,6 +84,8 @@ def create_matrix_replication_target_for_new_database( return for homeserver in homeservers: + if not homeserver.replication_enabled: + continue instance.create_channel( MatrixReplicationChannel, homeserver=homeserver,