backoffice: add "current forms" view (#8227)
This commit is contained in:
parent
2c6f7eb464
commit
d2260dfa88
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue