List all forms on backoffice homepage, with pending / total stats (#1673)
This commit is contained in:
parent
ab7f7619e2
commit
8cb9bd2d36
|
@ -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)
|
||||
|
|
|
@ -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%;
|
||||
|
|
Loading…
Reference in New Issue