Add basic views to expose Problem Reports, and run them
not very sophisticated yet but heck better than we had yesterday
This commit is contained in:
parent
f687078bbf
commit
871dd35a3a
4 changed files with 263 additions and 28 deletions
|
@ -1688,36 +1688,43 @@ class MasterView(View):
|
|||
"""
|
||||
obj = self.get_instance()
|
||||
model_title = self.get_model_title()
|
||||
if self.request.method == 'POST':
|
||||
progress = self.make_execute_progress(obj)
|
||||
|
||||
progress = self.make_execute_progress(obj)
|
||||
kwargs = {'progress': progress}
|
||||
thread = Thread(target=self.execute_thread, args=(obj.uuid, self.request.user.uuid), kwargs=kwargs)
|
||||
thread.start()
|
||||
kwargs = {'progress': progress}
|
||||
key = [self.request.matchdict[k]
|
||||
for k in self.get_model_key(as_tuple=True)]
|
||||
thread = Thread(target=self.execute_thread, args=(key, self.request.user.uuid), kwargs=kwargs)
|
||||
thread.start()
|
||||
|
||||
return self.render_progress(progress, {
|
||||
'instance': obj,
|
||||
'initial_msg': self.execute_progress_initial_msg,
|
||||
'cancel_url': self.get_action_url('view', obj),
|
||||
'cancel_msg': "{} execution was canceled".format(model_title),
|
||||
}, template=self.execute_progress_template)
|
||||
|
||||
self.request.session.flash("Sorry, you must POST to execute a {}.".format(model_title), 'error')
|
||||
return self.redirect(self.get_action_url('view', obj))
|
||||
return self.render_progress(progress, {
|
||||
'instance': obj,
|
||||
'initial_msg': self.execute_progress_initial_msg,
|
||||
'cancel_url': self.get_action_url('view', obj),
|
||||
'cancel_msg': "{} execution was canceled".format(model_title),
|
||||
}, template=self.execute_progress_template)
|
||||
|
||||
def make_execute_progress(self, obj):
|
||||
key = '{}.execute'.format(self.get_grid_key())
|
||||
return self.make_progress(key)
|
||||
|
||||
def execute_thread(self, uuid, user_uuid, progress=None, **kwargs):
|
||||
def get_instance_for_key(self, key, session):
|
||||
model_key = self.get_model_key(as_tuple=True)
|
||||
if len(model_key) == 1 and model_key[0] == 'uuid':
|
||||
uuid = key[0]
|
||||
return session.query(self.model_class).get(uuid)
|
||||
raise NotImplementedError
|
||||
|
||||
def execute_thread(self, key, user_uuid, progress=None, **kwargs):
|
||||
"""
|
||||
Thread target for executing an object.
|
||||
"""
|
||||
session = RattailSession()
|
||||
obj = session.query(self.model_class).get(uuid)
|
||||
obj = self.get_instance_for_key(key, session)
|
||||
user = session.query(model.User).get(user_uuid)
|
||||
try:
|
||||
self.execute_instance(obj, user, progress=progress, **kwargs)
|
||||
success_msg = self.execute_instance(obj, user,
|
||||
progress=progress,
|
||||
**kwargs)
|
||||
|
||||
# If anything goes wrong, rollback and log the error etc.
|
||||
except Exception as error:
|
||||
|
@ -1733,13 +1740,21 @@ class MasterView(View):
|
|||
# If no error, check result flag (false means user canceled).
|
||||
else:
|
||||
session.commit()
|
||||
session.refresh(obj)
|
||||
try:
|
||||
needs_refresh = obj in session
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
if needs_refresh:
|
||||
session.refresh(obj)
|
||||
success_url = self.get_execute_success_url(obj)
|
||||
session.close()
|
||||
if progress:
|
||||
progress.session.load()
|
||||
progress.session['complete'] = True
|
||||
progress.session['success_url'] = success_url
|
||||
if success_msg:
|
||||
progress.session['success_msg'] = success_msg
|
||||
progress.session.save()
|
||||
|
||||
def execute_error_message(self, error):
|
||||
|
@ -1991,8 +2006,10 @@ class MasterView(View):
|
|||
the master view class. This is the plural, lower-cased name of the
|
||||
model class by default, e.g. 'products'.
|
||||
"""
|
||||
if hasattr(cls, 'route_prefix'):
|
||||
return cls.route_prefix
|
||||
model_name = cls.get_normalized_model_name()
|
||||
return getattr(cls, 'route_prefix', '{0}s'.format(model_name))
|
||||
return '{}s'.format(model_name)
|
||||
|
||||
@classmethod
|
||||
def get_url_prefix(cls):
|
||||
|
@ -2377,7 +2394,10 @@ class MasterView(View):
|
|||
mapper = orm.object_mapper(row)
|
||||
except orm.exc.UnmappedInstanceError:
|
||||
try:
|
||||
return {self.model_key: row[self.model_key]}
|
||||
if isinstance(self.model_key, six.string_types):
|
||||
return {self.model_key: row[self.model_key]}
|
||||
return dict([(key, row[key])
|
||||
for key in self.model_key])
|
||||
except TypeError:
|
||||
return {self.model_key: getattr(row, self.model_key)}
|
||||
else:
|
||||
|
@ -4311,7 +4331,9 @@ class MasterView(View):
|
|||
if cls.executable:
|
||||
config.add_tailbone_permission(permission_prefix, '{}.execute'.format(permission_prefix),
|
||||
"Execute {}".format(model_title))
|
||||
config.add_route('{}.execute'.format(route_prefix), '{}/execute'.format(instance_url_prefix))
|
||||
config.add_route('{}.execute'.format(route_prefix),
|
||||
'{}/execute'.format(instance_url_prefix),
|
||||
request_method='POST')
|
||||
config.add_view(cls, attr='execute', route_name='{}.execute'.format(route_prefix),
|
||||
permission='{}.execute'.format(permission_prefix))
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue