Skip to content
Snippets Groups Projects
Verified Commit b9b280a4 authored by Nik | Klampfradler's avatar Nik | Klampfradler
Browse files

Factor out proxy attribute generation to separate function

Closures are hard!
parent e0d51191
No related branches found
No related tags found
1 merge request!396Resolve "Support syncing fields across foreign keys"
This commit is part of merge request !396. Comments created here will be created in the context of that merge request.
......@@ -48,6 +48,26 @@ class _ExtensibleModelBase(models.base.ModelBase):
return mcls
def _generate_proxy_property(field, subfield):
def getter(self):
if hasattr(self, field.name):
related = getattr(self, field.name)
return getattr(related, subfield.name)
# Related instane does not exist
return None
def setter(self, val):
if hasattr(self, field.name):
related = getattr(self, field.name)
else:
# Auto-create related instance (but do not save)
related = field.related_model()
setattr(related, field.remote_field.name, self)
setattr(related, subfield.name, val)
return property(getter, setter)
class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
"""Base model for all objects in AlekSIS apps.
......@@ -297,23 +317,7 @@ class ExtensibleModel(models.Model, metaclass=_ExtensibleModelBase):
if not hasattr(cls, name):
# Add proxy properties to handle access to related model
def getter(self):
if hasattr(self, field.name):
related = getattr(self, field.name)
return getattr(related, subfield.name)
# Related instane does not exist
return None
def setter(self, val):
if hasattr(self, field.name):
related = getattr(self, field.name)
else:
# Auto-create related instance (but do not save)
related = field.related_model()
setattr(related, field.remote_field.name, self)
setattr(related, subfield.name, val)
setattr(cls, name, property(getter, setter))
setattr(cls, name, _generate_proxy_property(field, subfield))
# Generate a fake field class with enough API to detect attribute names
fields.append(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment