misc: revamp draft stats, replace second part with completion rate (#89282)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-04-09 11:05:43 +02:00
parent c8e926afb2
commit 881a0424ce
4 changed files with 51 additions and 58 deletions

View File

@ -4870,31 +4870,12 @@ def test_admin_form_inspect_drafts(pub):
assert resp.pyquery('#inspect-drafts p').text() == 'There are currently no drafts for this form.'
data_class = formdef.data_class()
formdata = data_class()
formdata.status = 'draft'
formdata.page_id = '0'
formdata.receipt_time = localtime()
formdata.store()
formdata = data_class()
formdata.status = 'draft'
formdata.page_id = '2'
formdata.receipt_time = localtime()
formdata.store()
formdata = data_class()
formdata.status = 'draft'
formdata.page_id = '4'
formdata.receipt_time = localtime()
formdata.store()
formdata = data_class()
formdata.status = 'draft'
formdata.page_id = '_confirmation_page'
formdata.receipt_time = localtime()
formdata.store()
formdata = data_class()
formdata.status = 'draft'
formdata.page_id = 'xxxx' # unkown page id
formdata.receipt_time = localtime()
formdata.store()
for page_id in ('0', '2', '4', '_confirmation_page', 'xxxx'):
formdata = data_class()
formdata.status = 'draft'
formdata.page_id = page_id
formdata.receipt_time = localtime()
formdata.store()
# create a non-draft
formdata = formdef.data_class()()
@ -4908,11 +4889,8 @@ def test_admin_form_inspect_drafts(pub):
formdata.store()
resp = app.get('/backoffice/forms/%s/inspect' % formdef.id)
assert resp.pyquery('#inspect-drafts p')[0].text == 'Statistics on drafts by page.'
assert (
resp.pyquery('#inspect-drafts p')[1].text
== 'Lifespan of drafts (in days): %s.' % formdef.get_drafts_lifespan()
)
assert resp.pyquery('#inspect-drafts h2').text() == 'Key indicators on existing drafts'
assert resp.pyquery('#inspect-drafts .infonotice').text() == 'Covered period: last 100 days.'
assert resp.pyquery('table[data-table-id="rate-among-drafts"] tr[data-page-id="0"]').length == 1
assert (
@ -4993,20 +4971,10 @@ def test_admin_form_inspect_drafts(pub):
== '(1/5)'
)
# check a global value
assert resp.pyquery('table[data-table-id="rate-among-total-forms"] tr[data-page-id="0"]').length == 1
assert (
resp.pyquery('table[data-table-id="rate-among-total-forms"] tr[data-page-id="0"] td.label').text()
== '1st page'
)
assert (
resp.pyquery('table[data-table-id="rate-among-total-forms"] tr[data-page-id="0"] td.percent').text()
== '16.7%'
)
assert (
resp.pyquery('table[data-table-id="rate-among-total-forms"] tr[data-page-id="0"] td.total').text()
== '(1/6)'
)
# check completion rate
assert resp.pyquery('.completion-rate .percent').text() == '16.7%'
assert resp.pyquery('.completion-rate .total').text() == '(1/6)'
assert 'width: 16.6' in resp.pyquery('.completion-rate .bar span').attr.style
def test_form_import_fields(pub):

View File

@ -1771,7 +1771,6 @@ class FormDefPage(Directory, TempfileDirectoryMixin):
temp_drafts[page_id] += 1
total_drafts = sum(temp_drafts.values()) if temp_drafts else 0
total_formdata = 0
drafts = {}
special_page_index_mapping = {
'_first_page': -1000, # first
@ -1797,13 +1796,14 @@ class FormDefPage(Directory, TempfileDirectoryMixin):
else:
drafts['_unknown']['total'] += page_total
total_formdata = self.formdef.data_class().count([receipt_time_criteria])
for draft_data in drafts.values():
draft_data['percent'] = 100 * draft_data['total'] / total_drafts
draft_data['to_formdata_percent'] = 100 * draft_data['total'] / total_formdata
context['drafts'] = sorted(drafts.items(), key=lambda x: x[1]['page_index'])
context['total_formdata'] = total_formdata
total_formdata = self.formdef.data_class().count([receipt_time_criteria])
context['drafts'] = sorted(drafts.items(), key=lambda x: x[1]['page_index'])
context['percent_submitted_formdata'] = 100 * (total_formdata - total_drafts) / total_formdata
context['total_formdata'] = total_formdata
context['total_drafts'] = total_drafts
context['is_carddef'] = isinstance(self.formdef, CardDef)

View File

@ -290,9 +290,23 @@ span.error-message {
font-weight: bold;
}
#inspect-drafts {
h2 {
margin-top: 0;
}
h3 {
margin-top: 2em;
margin-bottom: 0;
font-weight: normal;
}
}
table.stats {
margin: 1ex 0;
width: 100%;
&.completion-rate {
margin-top: 0;
}
}
table.stats thead th {

View File

@ -98,12 +98,16 @@
{% if not snapshots_diff and not is_carddef %}
<div id="inspect-drafts" role="tabpanel" tabindex="0" aria-labelledby="tab-drafts" hidden>
{% if drafts %}
{% if total_drafts %}
<h2>{% trans "Key indicators on existing drafts" %}</h2>
<div class="infonotice">
<p>{% trans "Statistics on drafts by page." %}</p>
<p>{% trans "Lifespan of drafts (in days)" %}{% trans ":" %} {{ formdef.get_drafts_lifespan }}.</p>
<p>
{% blocktrans trimmed with count=formdef.get_drafts_lifespan %}
Covered period: last {{ count }} days.
{% endblocktrans %}
</p>
</div>
<h3>{% trans "Rate among drafts" %}</h2>
<h3>{% trans "Rate for in-progress forms, by page" %}</h3>
<table class="stats" data-table-id="rate-among-drafts">
<tbody>
{% for page_drafts in drafts %}
@ -111,12 +115,19 @@
{% endfor %}
</tbody>
</table>
<h3>{% trans "Rate among total forms" %}</h2>
<table class="stats" data-table-id="rate-among-total-forms">
<h3>{% trans "Completion rate: count of submitted forms, against count of drafts" %}</h2>
<table class="stats completion-rate">
<tbody>
{% for page_drafts in drafts %}
{% include "wcs/backoffice/includes/inspect-draft-by-page.html" with page_id=page_drafts.0 field=page_drafts.1.field percent=page_drafts.1.to_formdata_percent num=page_drafts.1.total den=total_formdata %}
{% endfor %}
<tr>
<td class="label"></td>
<td class="percent">{{ percent_submitted_formdata|floatformat }}{% trans "%" %}</td>
<td class="total">({{ total_formdata|subtract:total_drafts }}/{{ total_formdata }})</td>
</tr>
<tr>
<td class="bar" colspan="3">
<span style="width: {{ percent_submitted_formdata|floatformat:"3u" }}%"></span>
</td>
</tr>
</tbody>
</table>
{% else %}