Commit 1f3d1b72 authored by PJ Janse van Rensburg's avatar PJ Janse van Rensburg

Merge branch 'fix-inline-model-form-list'

parents 9d67f191 ae1db327
...@@ -7,6 +7,7 @@ next release ...@@ -7,6 +7,7 @@ next release
* Sort on multiple columns with `column_default_sort` * Sort on multiple columns with `column_default_sort`
* Upgrade Leaflet and Leaflet.draw plugins, used for geoalchemy integration * Upgrade Leaflet and Leaflet.draw plugins, used for geoalchemy integration
* Specify `minimum_input_length` for ajax widget * Specify `minimum_input_length` for ajax widget
* SQLAlchemy fix that lets you use inline model forms where models have multiple primary keys
1.5.2 1.5.2
----- -----
......
...@@ -272,11 +272,11 @@ class InlineModelFormList(InlineFieldList): ...@@ -272,11 +272,11 @@ class InlineModelFormList(InlineFieldList):
return return
# Create primary key map # Create primary key map
pk_map = dict((str(getattr(v, self._pk)), v) for v in values) pk_map = dict((get_obj_pk(v, self._pk), v) for v in values)
# Handle request data # Handle request data
for field in self.entries: for field in self.entries:
field_id = str(field.get_pk()) field_id = get_field_id(field)
is_created = field_id not in pk_map is_created = field_id not in pk_map
if not is_created: if not is_created:
...@@ -298,3 +298,27 @@ def get_pk_from_identity(obj): ...@@ -298,3 +298,27 @@ def get_pk_from_identity(obj):
# TODO: Remove me # TODO: Remove me
key = identity_key(instance=obj)[1] key = identity_key(instance=obj)[1]
return u':'.join(text_type(x) for x in key) return u':'.join(text_type(x) for x in key)
def get_obj_pk(obj, pk):
"""
get and format pk from obj
:rtype: text_type
"""
if isinstance(pk, tuple):
return tuple(text_type(getattr(obj, k)) for k in pk)
return text_type(getattr(obj, pk))
def get_field_id(field):
"""
get and format id from field
:rtype: text_type
"""
field_id = field.get_pk()
if isinstance(field_id, tuple):
return tuple(text_type(_) for _ in field_id)
return text_type(field_id)
...@@ -118,6 +118,10 @@ class InlineModelFormField(FormField): ...@@ -118,6 +118,10 @@ class InlineModelFormField(FormField):
self.form_opts = form_opts self.form_opts = form_opts
def get_pk(self): def get_pk(self):
if isinstance(self._pk, (tuple, list)):
return tuple(getattr(self.form, pk).data for pk in self._pk)
return getattr(self.form, self._pk).data return getattr(self.form, self._pk).data
def populate_obj(self, obj, name): def populate_obj(self, obj, name):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment