List all forms on backoffice homepage, with pending / total stats (#1673)

This commit is contained in:
Frédéric Péters 2012-09-18 10:23:43 +02:00
parent ab7f7619e2
commit 8cb9bd2d36
2 changed files with 64 additions and 109 deletions

View File

@ -19,7 +19,7 @@ import csv
import cStringIO
import time
from quixote import get_session, get_session_manager, get_publisher, get_request, get_response
from quixote import get_session, get_session_manager, get_publisher, get_request, get_response, redirect
from quixote.directory import Directory, AccessControlled
from qommon.backoffice import BackofficeRootDirectory
@ -69,7 +69,6 @@ class RootDirectory(BackofficeRootDirectory):
items = [
('forms', N_('Forms')),
('pending', N_('Pending Forms')),
('/', N_('WCS Form Server'))]
def _q_index [html] (self):
@ -79,124 +78,74 @@ class RootDirectory(BackofficeRootDirectory):
get_response().breadcrumb.append(('forms', _('Forms')))
html_top('forms', _('Forms'))
session = get_session()
user = get_request().user
l = []
forms_without_pending_stuff = []
forms_with_pending_stuff = []
def append_form_entry(formdef):
formdef_data_class = formdef.data_class()
count_forms = formdef_data_class.count() - len(formdef_data_class.get_ids_with_indexed_value('status', 'draft'))
not_endpoint_status = formdef.workflow.get_not_endpoint_status()
not_endpoint_status_ids = ['wf-%s' % x.id for x in not_endpoint_status]
pending_forms = []
for status in not_endpoint_status_ids:
pending_forms.extend(formdef_data_class.get_ids_with_indexed_value(
'status', status))
if len(pending_forms) == 0:
forms_without_pending_stuff.append((formdef, len(pending_forms), count_forms))
else:
forms_with_pending_stuff.append((formdef, len(pending_forms), count_forms))
if user:
if not user.can_go_in_backoffice():
raise errors.AccessForbiddenError()
for formdef in FormDef.select(order_by='name', ignore_errors=True):
if formdef.disabled:
continue
if user.is_admin or formdef.receiver_id in (user.roles or []):
l.append(formdef)
append_form_entry(formdef)
if not l:
raise errors.AccessForbiddenError()
cats = Category.select(order_by = 'name')
lists = []
for c in cats:
t = [x for x in l if x.category_id == c.id]
if t:
lists.append((c.name, t))
t = [x for x in l if not x.category]
if t:
lists.append((None, t))
mid_term = ((len(lists) * 2) + sum([len(x[-1]) for x in lists])) / 2
count = 0
in_second_column = False
'<div class="splitcontent-left">'
for cat_name, formdefs in lists:
if not in_second_column and count > mid_term:
'</div>'
'<div class="splitcontent-right">'
count += 2 + len(formdefs)
if forms_with_pending_stuff:
'<div class="bo-block">'
if cat_name:
'<h2>%s</h2>' % cat_name
elif len(lists) > 1:
'<h2>%s</h2>' % _('Misc')
'<ul>'
for formdef in formdefs:
'<li><a href="%s/">%s</a></li>' % (formdef.url_name, formdef.name)
'</ul>'
'<h2>%s</h2>' % _('Forms in your care')
self.display_forms(forms_with_pending_stuff)
'</div>'
'</div>'
get_logger().info('forms backoffice - home')
if forms_without_pending_stuff:
'<div class="bo-block">'
'<h2>%s</h2>' % _('Other Forms')
self.display_forms(forms_without_pending_stuff)
'</div>'
def display_forms [html] (self, forms_list):
'<ul>'
cats = Category.select(order_by = 'name')
one = False
for c in cats + [None]:
if c is None:
l2 = [x for x in forms_list if not x[0].category_id]
cat_name = _('Misc')
else:
l2 = [x for x in forms_list if x[0].category_id == c.id]
cat_name = c.name
if not l2:
continue
'<li>%s</li>' % cat_name
'<ul>'
for formdef, no_pending, no_total in l2:
'<li><a href="%s/">%s</a>' % (formdef.url_name, formdef.name)
if no_pending:
_(': %(pending)s open on %(total)s') % {'pending': no_pending,
'total': no_total}
else:
_(': %(total)s items') % {'total': no_total}
'</li>'
one = True
'</ul>'
'</ul>'
def pending [html] (self):
session = get_session()
user = get_request().user
if not user:
raise errors.AccessForbiddenError()
get_response().breadcrumb.append( ('pending', _('Pending Forms')) )
html_top('pending', _('Pending Forms'))
formdefs = FormDef.select(order_by='name', ignore_errors=True)
max_forms = 30
lists = []
for formdef in formdefs:
if not user.is_admin and not formdef.receiver_id in (user.roles or []):
continue
not_endpoint_status = [('wf-%s' % x.id, x.name) for x in \
formdef.workflow.get_not_endpoint_status()]
forms = []
for status_id, status_name in not_endpoint_status:
forms.extend(formdef.data_class().get_with_indexed_value(
str('status'), status_id))
if not forms:
continue
if len(forms) > max_forms:
lists.append((formdef, forms, not_endpoint_status, 1))
else:
lists.append((formdef, forms, not_endpoint_status, len(forms)))
mid_term = ((len(lists) * 4) + sum([x[-1] for x in lists])) / 2
count = 0
in_second_column = False
'<div class="splitcontent-left">'
for formdef, forms, not_endpoint_status, nb_forms in lists:
if count > mid_term and not in_second_column:
in_second_column = True
'</div>'
'<div class="splitcontent-right">'
count += 4 + nb_forms
if len(forms) > max_forms:
'<div class="bo-block">'
'<h2>%s</h2>' % formdef.name
'<p><a href="%s/pending">%s</a></p>' % (
formdef.url_name,
_('More than %d forms, click for listing') % max_forms)
'</div>'
continue
first = True
'<div class="bo-block">'
for status_id, status_label in not_endpoint_status:
status_forms = [x for x in forms if x.status == status_id]
if not status_forms:
continue
status_forms.sort(lambda x,y: cmp(getattr(x, str('receipt_time')),
getattr(y, str('receipt_time'))))
status_forms.reverse()
if first:
'<h2>%s</h2>' % formdef.name
first = False
'<h3>%s</h3>' % _('Forms with status "%s"') % status_label
'<ul>'
for f in status_forms:
'<li><a href="%s/%s/">%s</a></li>' % (
formdef.url_name, f.id,
formdef.get_backoffice_summary_form(f))
'</ul>'
'</div>'
'</div>'
# kept as a redirection for compatibility with possible bookmarks
return redirect('.')
def _q_lookup(self, component):
return FormPage(component)

View File

@ -590,6 +590,12 @@ div.bo-block ul.biglist {
padding-left: 0em;
}
div.bo-block span.disabled a {
color: #666;
text-decoration: none;
border: none;
}
div.splitcontent-left {
float: left;
width: 49%;