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:
Lance Edgar 2021-12-07 17:45:21 -06:00
parent f687078bbf
commit 871dd35a3a
4 changed files with 263 additions and 28 deletions

View file

@ -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))