From 11c5c49373c1cedeb4af4f1800071deb696608e7 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sun, 15 Nov 2020 23:42:19 +0100
Subject: [PATCH] Auto-exclude self as remote when scanning remote syncable
 fields

---
 aleksis/core/mixins.py | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index 39f19ca94..df4a4a911 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -270,7 +270,7 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
             to.property_(_virtual_related, related_name)
 
     @classmethod
-    def syncable_fields(cls, recursive: bool = True) -> List[models.Field]:
+    def syncable_fields(cls, recursive: bool = True, exclude_remotes: List = []) -> List[models.Field]:
         """Collect all fields that can be synced on a model.
 
         If recursive is True, it recurses into related models and generates virtual
@@ -281,9 +281,12 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
                 if ExtensibleModel not in field.related_model.__mro__:
                     # Related model is not extensible and thus has no syncable fields
                     continue
+                if field.related_model in exclude_remotes:
+                    # Remote is excluded, probably to avoid recursion
+                    continue
 
                 # Recurse into related model to get its fields as well
-                for subfield in field.related_model.syncable_fields():
+                for subfield in field.related_model.syncable_fields(recursive, exclude_remotes+[cls]):
                     # generate virtual field names for proxy access
                     name = f"_{field.name}__{subfield.name}"
                     verbose_name = f"{field.verbose_name} -> {subfield.verbose_name}"
-- 
GitLab