admin: update statistics data on field display location change (#73770)

This commit is contained in:
Valentin Deniaud 2023-01-24 18:10:46 +01:00
parent a85d88ef35
commit 718723d44d
7 changed files with 129 additions and 2 deletions

View File

@ -501,3 +501,38 @@ def test_block_duplicate(pub):
block_copy = BlockDef.get_by_slug('other_copy')
assert len(block_copy.fields) == 2
def test_block_field_statistics_data_update(pub):
create_superuser(pub)
BlockDef.wipe()
block = BlockDef()
block.name = 'Foobar'
block.fields = [fields.BoolField(id='1', label='Bool', varname='bool', type='comment')]
block.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.BlockField(id='0', label='test', type='block:%s' % block.slug),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data['0'] = {'data': [{'1': True}]}
formdata.store()
assert not formdata.statistics_data
app = login(get_app(pub))
resp = app.get('/backoffice/forms/blocks/%s/1/' % block.id)
resp.form['display_locations$element3'] = True
resp = resp.form.submit('submit').follow()
assert 'Statistics data will be collected in the background.' in resp.text
formdata.refresh_from_storage()
assert formdata.statistics_data == {'bool': [True]}

View File

@ -3765,3 +3765,30 @@ def test_form_import_fields(pub):
('5', 'field 4'),
('3', 'Page 2'),
]
def test_form_field_statistics_data_update(pub):
create_superuser(pub)
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [fields.BoolField(id='1', label='Bool', varname='bool', type='comment')]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data['1'] = True
formdata.store()
assert not formdata.statistics_data
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/fields/1/')
resp.form['display_locations$element3'] = True
resp = resp.form.submit('submit').follow()
assert 'Statistics data will be collected in the background.' in resp.text
formdata.refresh_from_storage()
assert formdata.statistics_data == {'bool': [True]}

View File

@ -3745,3 +3745,41 @@ def test_remove_tracking_code_details(pub):
workflow.store()
resp = app.get('/backoffice/workflows/%s/status/%s/' % (workflow.id, baz_status.id))
assert 'Remove Tracking Code (replace with a new one)' in resp.text
def test_workflow_backoffice_field_statistics_data_update(pub):
create_superuser(pub)
CardDef.wipe()
FormDef.wipe()
Workflow.wipe()
workflow = Workflow(name='foo')
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.BoolField(id='1', label='Bool', varname='bool', type='comment')
]
workflow.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.workflow = workflow
formdef.store()
app = login(get_app(pub))
formdata = formdef.data_class()()
formdata.data['1'] = True
formdata.store()
assert not formdata.statistics_data
app = login(get_app(pub))
resp = app.get('/backoffice/workflows/1/backoffice-fields/fields/1/')
resp.form['display_locations$element2'] = True
resp = resp.form.submit('submit').follow()
assert 'Statistics data will be collected in the background.' in resp.text
formdata.refresh_from_storage()
assert formdata.statistics_data == {'bool': [True]}

View File

@ -24,6 +24,7 @@ from wcs.admin.fields import FieldDefPage, FieldsDirectory
from wcs.backoffice.snapshots import SnapshotsDirectory
from wcs.blocks import BlockDef, BlockdefImportError
from wcs.categories import BlockCategory
from wcs.formdef import UpdateStatisticsDataAfterJob
from wcs.qommon import _, misc, template
from wcs.qommon.backoffice.menu import html_top
from wcs.qommon.errors import AccessForbiddenError, TraversalError
@ -35,6 +36,11 @@ class BlockFieldDefPage(FieldDefPage):
anchor = '#itemId_%s' % field.id if field else ''
return redirect('../%s' % anchor)
def schedule_statistics_data_update(self):
get_response().add_after_job(
UpdateStatisticsDataAfterJob(formdefs=self.objectdef.get_usage_formdefs())
)
class BlockDirectory(FieldsDirectory):
_q_exports = [

View File

@ -25,7 +25,7 @@ from wcs import fields
from wcs.admin import utils
from wcs.carddef import CardDef
from wcs.fields import BlockField, get_field_options
from wcs.formdef import FormDef
from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob
from wcs.qommon import _, errors, get_cfg, misc
from wcs.qommon.admin.menu import command_icon
from wcs.qommon.backoffice.menu import html_top
@ -70,6 +70,7 @@ class FieldDefPage(Directory):
def _q_index(self):
form = self.form()
redo = False
old_display_locations = self.field.display_locations.copy()
if form.get_submit() == 'cancel':
return redirect('../#itemId_%s' % self.field.id)
@ -111,6 +112,11 @@ class FieldDefPage(Directory):
return r.getvalue()
self.submit(form)
if 'statistics' in self.field.display_locations and 'statistics' not in old_display_locations:
self.schedule_statistics_data_update()
get_session().message = ('info', _('Statistics data will be collected in the background.'))
if form.get_widget('items') is None and self.field.type == 'item':
return redirect('.')
@ -128,6 +134,9 @@ class FieldDefPage(Directory):
return redirect('../#itemId_%s' % self.field.id)
def schedule_statistics_data_update(self):
get_response().add_after_job(UpdateStatisticsDataAfterJob(formdefs=[self.objectdef]))
def submit(self, form):
for f in self.field.get_admin_attributes():
widget = form.get_widget(f)

View File

@ -32,7 +32,7 @@ from wcs.backoffice.snapshots import SnapshotsDirectory
from wcs.carddef import CardDef
from wcs.categories import WorkflowCategory
from wcs.formdata import Evolution
from wcs.formdef import FormDef
from wcs.formdef import FormDef, UpdateStatisticsDataAfterJob
from wcs.qommon import _, errors, force_str, misc, template
from wcs.qommon.admin.menu import command_icon
from wcs.qommon.backoffice.menu import html_top
@ -1083,6 +1083,14 @@ class WorkflowBackofficeFieldDefPage(FieldDefPage):
display_locations.options = display_locations.options[1:]
return form
def schedule_statistics_data_update(self):
formdefs = [
x
for x in FormDef.select(lightweight=True) + CardDef.select(lightweight=True)
if x.workflow_id == self.objectdef.workflow.id
]
get_response().add_after_job(UpdateStatisticsDataAfterJob(formdefs=formdefs))
class WorkflowVariablesFieldsDirectory(FieldsDirectory):
_q_exports = ['', 'update_order', 'new']

View File

@ -2163,3 +2163,7 @@ class UpdateDigestAfterJob(AfterJob):
formdef = formdef_class.get(formdef_id)
for formdata in formdef.data_class().select(order_by='id'):
formdata.store()
class UpdateStatisticsDataAfterJob(UpdateDigestAfterJob):
label = _('Updating statistics data')