admin: filter errors when cleaning up from subpage (#87946)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-03-08 13:18:46 +01:00
parent 99d1f4c21f
commit 977cdb0019
2 changed files with 88 additions and 19 deletions

View File

@ -390,3 +390,66 @@ def test_logged_error_cleanup(pub):
'types$elementcarddef',
'types$elementothers',
]
def test_logged_error_cleanup_from_filtered_page(pub):
create_superuser(pub)
FormDef.wipe()
CardDef.wipe()
Workflow.wipe()
pub.loggederror_class.wipe()
formdef = FormDef()
formdef.name = 'foo'
formdef.store()
carddef = CardDef()
carddef.name = 'bar'
carddef.store()
workflow = Workflow()
workflow.name = 'blah'
workflow.store()
# FormDef error
error1 = pub.loggederror_class()
error1.summary = 'LoggedError'
error1.formdef_class = 'FormDef'
error1.formdef_id = formdef.id
error1.first_occurence_timestamp = error1.latest_occurence_timestamp = datetime.datetime.now()
error1.store()
# CardDef error
error2 = pub.loggederror_class()
error2.summary = 'LoggedError'
error2.formdef_class = 'CardDef'
error2.formdef_id = carddef.id
error2.first_occurence_timestamp = error2.latest_occurence_timestamp = datetime.datetime.now()
error2.store()
# workflow-only error
error3 = pub.loggederror_class()
error3.summary = 'LoggedError'
error3.workflow_id = workflow.id
error3.first_occurence_timestamp = error3.latest_occurence_timestamp = datetime.datetime.now()
error3.store()
app = login(get_app(pub))
resp = app.get(formdef.get_admin_url() + 'logged-errors/')
resp = resp.click('Cleanup')
resp.form['latest_occurence'] = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime(
'%Y-%m-%d'
)
resp = resp.form.submit('submit')
assert not pub.loggederror_class.has_key(error1.id)
assert pub.loggederror_class.has_key(error2.id)
assert pub.loggederror_class.has_key(error3.id)
resp = app.get(workflow.get_admin_url() + 'logged-errors/')
resp = resp.click('Cleanup')
resp.form['latest_occurence'] = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime(
'%Y-%m-%d'
)
resp = resp.form.submit('submit')
assert not pub.loggederror_class.has_key(error1.id)
assert pub.loggederror_class.has_key(error2.id)
assert not pub.loggederror_class.has_key(error3.id)

View File

@ -253,14 +253,15 @@ class LoggedErrorsDirectory(AccessControlled, Directory):
options.append(('carddef', _('Card Models'), 'carddef'))
if backoffice_root.is_accessible('workflows'):
options.append(('others', _('Others'), 'others'))
form.add(
CheckboxesWidget,
'types',
title=_('Error types'),
value=[x[0] for x in options], # check all by default
options=options,
required=True,
)
if not (self.formdef_id or self.workflow_id):
form.add(
CheckboxesWidget,
'types',
title=_('Error types'),
value=[x[0] for x in options], # check all by default
options=options,
required=True,
)
form.add(
DateWidget,
'latest_occurence',
@ -275,17 +276,22 @@ class LoggedErrorsDirectory(AccessControlled, Directory):
return redirect('.')
if form.get_submit() == 'submit' and not form.has_errors():
type_criterias = []
if 'formdef' in form.get_widget('types').parse():
type_criterias.append(Equal('formdef_class', 'FormDef'))
if 'carddef' in form.get_widget('types').parse():
type_criterias.append(Equal('formdef_class', 'CardDef'))
if 'others' in form.get_widget('types').parse():
type_criterias.append(Null('formdef_class'))
criterias = [
Less('latest_occurence_timestamp', form.get_widget('latest_occurence').parse()),
Or(type_criterias),
]
criterias = []
if self.formdef_id and self.formdef_class:
criterias.append(Equal('formdef_id', self.formdef_id))
criterias.append(Equal('formdef_class', self.formdef_class.__name__))
elif self.workflow_id:
criterias.append(Equal('workflow_id', self.workflow_id))
else:
if 'formdef' in form.get_widget('types').parse():
criterias.append(Equal('formdef_class', 'FormDef'))
if 'carddef' in form.get_widget('types').parse():
criterias.append(Equal('formdef_class', 'CardDef'))
if 'others' in form.get_widget('types').parse():
criterias.append(Null('formdef_class'))
criterias = [Or(criterias)]
criterias.append(Less('latest_occurence_timestamp', form.get_widget('latest_occurence').parse()))
get_publisher().loggederror_class.wipe(clause=criterias)
return redirect('.')