Standardize merge logic when a handler is defined for it
also adds basic merge support for products view
This commit is contained in:
parent
4c29a667cb
commit
409a49ba20
3 changed files with 39 additions and 28 deletions
|
@ -108,6 +108,7 @@ class MasterView(View):
|
|||
supports_set_enabled_toggle = False
|
||||
populatable = False
|
||||
mergeable = False
|
||||
merge_handler = None
|
||||
downloadable = False
|
||||
cloneable = False
|
||||
touchable = False
|
||||
|
@ -1931,17 +1932,34 @@ class MasterView(View):
|
|||
def get_merge_fields(self):
|
||||
if hasattr(self, 'merge_fields'):
|
||||
return self.merge_fields
|
||||
|
||||
if self.merge_handler:
|
||||
fields = self.merge_handler.get_merge_preview_fields()
|
||||
return [field['name'] for field in fields]
|
||||
|
||||
mapper = orm.class_mapper(self.get_model_class())
|
||||
return mapper.columns.keys()
|
||||
|
||||
def get_merge_coalesce_fields(self):
|
||||
if hasattr(self, 'merge_coalesce_fields'):
|
||||
return self.merge_coalesce_fields
|
||||
|
||||
if self.merge_handler:
|
||||
fields = self.merge_handler.get_merge_preview_fields()
|
||||
return [field['name'] for field in fields
|
||||
if field.get('coalesce')]
|
||||
|
||||
return []
|
||||
|
||||
def get_merge_additive_fields(self):
|
||||
if hasattr(self, 'merge_additive_fields'):
|
||||
return self.merge_additive_fields
|
||||
|
||||
if self.merge_handler:
|
||||
fields = self.merge_handler.get_merge_preview_fields()
|
||||
return [field['name'] for field in fields
|
||||
if field.get('additive')]
|
||||
|
||||
return []
|
||||
|
||||
def merge(self):
|
||||
|
@ -1985,8 +2003,15 @@ class MasterView(View):
|
|||
the requested merge is valid, in your context. If it is not - for *any
|
||||
reason* - you should raise an exception; the type does not matter.
|
||||
"""
|
||||
if self.merge_handler:
|
||||
reason = self.merge_handler.why_not_merge(removing, keeping)
|
||||
if reason:
|
||||
raise Exception(reason)
|
||||
|
||||
def get_merge_data(self, obj):
|
||||
if self.merge_handler:
|
||||
return self.merge_handler.get_merge_preview_data(obj)
|
||||
|
||||
raise NotImplementedError("please implement `{}.get_merge_data()`".format(self.__class__.__name__))
|
||||
|
||||
def get_merge_resulting_data(self, remove, keep):
|
||||
|
@ -2008,7 +2033,13 @@ class MasterView(View):
|
|||
Merge the two given objects. You should probably override this;
|
||||
default behavior is merely to delete the 'removing' object.
|
||||
"""
|
||||
self.Session.delete(removing)
|
||||
if self.merge_handler:
|
||||
self.merge_handler.perform_merge(removing, keeping,
|
||||
user=self.request.user)
|
||||
|
||||
else:
|
||||
# nb. default "merge" does not update kept object!
|
||||
self.Session.delete(removing)
|
||||
|
||||
##############################
|
||||
# Core Stuff
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue