backoffice: add "current forms" view (#8227)

This commit is contained in:
Frédéric Péters 2015-09-10 14:21:51 +02:00
parent 2c6f7eb464
commit d2260dfa88
3 changed files with 105 additions and 3 deletions

View File

@ -30,22 +30,24 @@ from quixote.directory import Directory
from quixote.html import TemplateIO, htmltext
from qommon.backoffice.menu import html_top
from qommon.backoffice.listing import pagination_links
from qommon import misc, get_logger
from qommon.afterjobs import AfterJob
from qommon import errors
from qommon import ods
from qommon.form import *
from qommon.storage import Equal, NotEqual, LessOrEqual, GreaterOrEqual, Or
from qommon.storage import Equal, NotEqual, LessOrEqual, GreaterOrEqual, Or, Intersects
from wcs.forms.backoffice import FormDefUI
from wcs.forms.common import FormStatusPage
from wcs.categories import Category
from wcs.formdef import FormDef
from wcs.roles import logged_users_role
class ManagementDirectory(Directory):
_q_exports = ['', 'statistics']
_q_exports = ['', 'current', 'statistics']
def is_accessible(self, user):
return user.can_go_in_backoffice()
@ -250,6 +252,94 @@ class ManagementDirectory(Directory):
r += htmltext('</ul>')
return r.getvalue()
def current(self):
if not get_publisher().is_using_postgresql():
raise errors.TraversalError()
get_response().breadcrumb.append(('current', _('Current Forms')))
from wcs import sql
html_top('management', _('Management'))
get_response().filter['sidebar'] = self.get_sidebar()
user_roles = [logged_users_role().id] + (get_request().user.roles or [])
limit = int(get_request().form.get('limit',
get_publisher().get_site_option('default-page-size') or 20))
offset = int(get_request().form.get('offset', 0))
criterias = [Equal('is_at_endpoint', False),
Intersects('concerned_roles_array', user_roles)]
total_count = sql.AnyFormData.count(criterias)
formdatas = sql.AnyFormData.select(criterias, limit=limit, offset=offset)
r = TemplateIO(html=True)
r += htmltext('<table id="listing" class="main">')
r += htmltext('<thead>')
r += htmltext('<th>%s</th>') % _('Form')
r += htmltext('<th>%s</th>') % _('Date')
r += htmltext('<th>%s</th>') % _('User')
r += htmltext('<th>%s</th>') % _('Status')
r += htmltext('</thead>')
r += htmltext('<tbody>')
workflows = set()
for formdata in formdatas:
workflows.add(formdata.formdef.workflow)
r += htmltext('<tr class="status-%s-%s" data-link="%s">' % (
formdata.formdef.workflow.id,
formdata.status,
formdata.get_url(backoffice=True)))
r += htmltext('<td>%s</td>') % formdata.formdef.name
r += htmltext('<td class="cell-time">%s</td>') % misc.localstrftime(
formdata.receipt_time)
try:
value = get_publisher().user_class.get(formdata.user_id).display_name
r += htmltext('<td class="cell-user">%s</td>') % value
except:
r += htmltext('<td class="cell-user cell-no-user">-</td>')
r += htmltext('<td class="cell-status">%s</td>') % formdata.get_status_label()
r += htmltext('</tr>')
if workflows:
colours = []
for workflow in workflows:
for status in workflow.possible_status:
if status.colour and status.colour != 'FFFFFF':
fg_colour = misc.get_foreground_colour(status.colour)
colours.append((workflow.id, status.id, status.colour, fg_colour))
if colours:
r += htmltext('<style>')
for workflow_id, status_id, bg_colour, fg_colour in colours:
r += htmltext('tr.status-%s-wf-%s td.cell-status { '\
'background-color: #%s !important; color: %s !important; }\n' % (
workflow_id, status_id, bg_colour, fg_colour))
r += htmltext('</style>')
r += htmltext('</tbody></table>')
if (offset > 0) or (total_count > limit > 0):
r += pagination_links(offset, limit, total_count)
if get_request().form.get('ajax') == 'true':
get_response().filter = None
return r.getvalue()
rt = TemplateIO(html=True)
rt += htmltext('<h2>%s</h2>') % _('Current Forms')
rt += r.getvalue()
r = rt
if offset or limit:
r += htmltext('<form id="listing-settings" action="." style="display: none;">')
if not offset:
offset = 0
r += htmltext('<input type="hidden" name="offset" value="%s"/>') % offset
if limit:
r += htmltext('<input type="hidden" name="limit" value="%s"/>') % limit
r += htmltext('</form>')
return rt.getvalue()
def _q_lookup(self, component):
return FormPage(component)

View File

@ -27,6 +27,8 @@ def pagination_links(offset, limit, total_count):
r = TemplateIO(html=True)
r += htmltext('<div id="page-links">')
query = get_request().form.copy()
if 'ajax' in query:
del query['ajax']
if offset > 0:
# link to previous page
query['offset'] = max(offset-limit, 0)

View File

@ -352,6 +352,11 @@ table#listing.activity {
cursor: pointer;
}
#listing.main th,
#listing.main td {
text-align: left;
}
div.letters-nav {
text-align: center;
border: 1px solid #888;
@ -652,13 +657,18 @@ h3 span.change {
}
div#page-links {
margin: 1em -1ex;
margin: 1em 0;
padding: 2ex 1ex 0 1ex;
}
div.bo-block div#page-links {
margin: 1em -1ex;
}
#page-links .previous-page,
#page-links .next-page {
display: inline-block;
padding: 1ex 1.5ex;
}
#page-links .previous-page:before {