Closes #33: Add ability to clone objects (pre-populate form fields)

This commit is contained in:
Jeremy Stretch
2019-12-06 16:13:52 -05:00
parent 47fefbec07
commit 446acbdf82
23 changed files with 186 additions and 34 deletions

View File

@@ -0,0 +1,3 @@
<a href="{{ url }}" class="btn btn-success">
<span class="fa fa-plus" aria-hidden="true"></span> Clone
</a>

View File

@@ -1,4 +1,5 @@
from django import template
from django.urls import reverse
from extras.models import ExportTemplate
@@ -7,12 +8,47 @@ register = template.Library()
@register.inclusion_tag('buttons/add.html')
def add_button(url):
return {'add_url': url}
return {
'add_url': url,
}
@register.inclusion_tag('buttons/import.html')
def import_button(url):
return {'import_url': url}
return {
'import_url': url,
}
@register.inclusion_tag('buttons/clone.html')
def clone_button(url, instance):
url = reverse(url)
# Populate form field values
params = {}
for field_name in getattr(instance, 'clone_fields', []):
field = instance._meta.get_field(field_name)
field_value = field.value_from_object(instance)
# Swap out False with URL-friendly value
if field_value is False:
field_value = ''
# Omit empty values
if field_value not in (None, ''):
params[field_name] = field_value
# TODO: Tag replication
# Append parameters to URL
param_string = '&'.join(['{}={}'.format(k, v) for k, v in params.items()])
if param_string:
url = '{}?{}'.format(url, param_string)
return {
'url': url,
}
@register.inclusion_tag('buttons/export.html', takes_context=True)