From 871a619be58f00ee8d85fd7ab74dcca78b04e95c Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Sun, 3 May 2020 18:28:06 +0200
Subject: [PATCH] Add lazy-wrapped syncable fields retriever

---
 aleksis/core/mixins.py      | 7 +++++++
 aleksis/core/preferences.py | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py
index e958c75f7..fa11c7cb1 100644
--- a/aleksis/core/mixins.py
+++ b/aleksis/core/mixins.py
@@ -7,6 +7,7 @@ from django.contrib.sites.models import Site
 from django.db import models
 from django.db.models import QuerySet
 from django.forms.models import ModelForm, ModelFormMetaclass
+from django.utils.functional import lazy
 
 import reversion
 from easyaudit.models import CRUDEvent
@@ -196,6 +197,12 @@ class ExtensibleModel(models.Model):
             [(field.name, field.verbose_name or field.name) for field in cls.syncable_fields()]
         )
 
+    @classmethod
+    def syncable_fields_choices_lazy(cls) -> callable[[], Tuple[Tuple[str, str]]]:
+        """ Collect all fields that can be synced on a model """
+
+        return lazy(cls.syncable_field_choices, tuple)
+
     class Meta:
         abstract = True
 
diff --git a/aleksis/core/preferences.py b/aleksis/core/preferences.py
index ad356dd0a..95daabc51 100644
--- a/aleksis/core/preferences.py
+++ b/aleksis/core/preferences.py
@@ -157,7 +157,7 @@ class PrimaryGroupField(ChoicePreference):
     section = account
     name = "primary_group_field"
     default = "name"
-    choices = Person.syncable_fields_choices()
+    choices = Person.syncable_fields_choices_lazy()
     required = False
     verbose_name = _("Field on person to match primary group against")
 
-- 
GitLab