Add support for cloning an upgrade record

until this is all ironed out, seems like it will often be helpful
This commit is contained in:
Lance Edgar 2017-08-08 21:26:06 -05:00
parent 77880abb87
commit d7f5211fc4
6 changed files with 81 additions and 17 deletions

View file

@ -72,6 +72,7 @@ class MasterView(View):
mergeable = False
downloadable = False
executable = False
cloneable = False
supports_mobile = False
mobile_creatable = False
@ -312,6 +313,30 @@ class MasterView(View):
tools=self.make_row_grid_tools(instance))
return self.render_to_response('view', context)
def clone(self):
"""
View for cloning an object's data into a new object.
"""
self.viewing = True
instance = self.get_instance()
form = self.make_form(instance)
self.configure_clone_form(form)
if self.request.method == 'POST' and self.request.POST.get('clone') == 'clone':
cloned = self.clone_instance(instance)
return self.redirect(self.get_action_url('view', cloned))
return self.render_to_response('clone', {
'instance': instance,
'instance_title': self.get_instance_title(instance),
'instance_url': self.get_action_url('view', instance),
'form': form,
})
def configure_clone_form(self, form):
pass
def clone_instance(self, instance):
raise NotImplementedError
def versions(self):
"""
View to list version history for an object.
@ -1805,6 +1830,14 @@ class MasterView(View):
config.add_view(cls, attr='view_version', route_name='{}.version'.format(route_prefix),
permission='{}.versions'.format(permission_prefix))
# clone
if cls.cloneable:
config.add_tailbone_permission(permission_prefix, '{}.clone'.format(permission_prefix),
"Clone an existing {0} as a new {0}".format(model_title))
config.add_route('{}.clone'.format(route_prefix), '{}/{{{}}}/clone'.format(url_prefix, model_key))
config.add_view(cls, attr='clone', route_name='{}.clone'.format(route_prefix),
permission='{}.clone'.format(permission_prefix))
# download
if cls.downloadable:
config.add_route('{}.download'.format(route_prefix), '{}/{{{}}}/download'.format(url_prefix, model_key))

View file

@ -53,6 +53,7 @@ class UpgradeView(MasterView):
model_class = model.Upgrade
executable = True
downloadable = True
cloneable = True
labels = {
'executed_by': "Executed by",
'status_code': "Status",
@ -165,6 +166,20 @@ class UpgradeView(MasterView):
f.remove_field('package_diff')
f.remove_field('exit_code')
def configure_clone_form(self, f):
f.fields = ['description', 'notes', 'enabled']
def clone_instance(self, original):
cloned = self.model_class()
cloned.created = make_utc()
cloned.created_by = self.request.user
cloned.description = original.description
cloned.notes = original.notes
cloned.enabled = original.enabled
self.Session.add(cloned)
self.Session.flush()
return cloned
def render_stdout_file(self, upgrade, fieldname):
if fieldname.startswith('stderr'):
filename = 'stderr.log'