From ca1114fdcd42537a5edf360013fcdb08f2975ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 4 Apr 2012 15:55:36 +0200 Subject: [PATCH] backoffice: set listing as main form page, with a fields selection sidebar https://dev.entrouvert.org/issues/1275 --- wcs/backoffice/root.ptl | 86 +++++++++++++++++++++++++++++++------- wcs/forms/backoffice.ptl | 104 +++++++++++++++------------------------------- 2 files changed, 106 insertions(+), 84 deletions(-) diff --git a/wcs/backoffice/root.ptl b/wcs/backoffice/root.ptl index e453ad8..9bdab43 100644 --- a/wcs/backoffice/root.ptl +++ b/wcs/backoffice/root.ptl @@ -212,6 +212,17 @@ class RootDirectory(BackofficeRootDirectory): return FormPage(component) +class FakeField: + def __init__(self, id, type_, label): + self.id = id + self.type = type_ + self.label = label + + def get_view_value(self, value): + # just here to quack like a duck + return None + + class FormPage(Directory): _q_exports = ['', 'listing', 'csv', 'stats', 'xls', 'pending'] @@ -235,31 +246,78 @@ class FormPage(Directory): raise errors.AccessUnauthorizedError() get_response().breadcrumb.append( (component + '/', self.formdef.name) ) - def _q_index [html] (self): - get_logger().info('backoffice - form %s' % self.formdef.name) - html_top('%s - %s' % (_('Back Office'), self.formdef.name)) - get_session().display_message() - '

%s

' % self.formdef.name + def get_formdata_sidebar [html] (self, qs=''): '' + + def get_fields_sidebar [html] (self, fields): + '

%s

' % _('Fields to display') + '
' + '' + '' % _('Reload') + '
' + + def get_formdef_fields(self): + fields = [] + fields.append(FakeField('id', 'id', _('Identifier'))) + fields.append(FakeField('time', 'time', _('Time'))) + fields.append(FakeField('user-label', 'user-label', _('User Label'))) + + fields.extend(self.formdef.fields) - '%s' % _('Back') + if self.formdef.workflow is None or len( + self.formdef.workflow.possible_status) > 1: + fields.append(FakeField('status', 'status', _('Status'))) + return fields - def listing [html] (self): + def get_fields_from_query(self): + field_ids = [x for x in get_request().form.keys()] + if not field_ids: + for field in self.formdef.fields: + if not hasattr(field, str('get_view_value')): + continue + field_ids = ['id', 'time', 'user-label', field.id, 'status'] + break + + fields = [] + for field in self.get_formdef_fields(): + if field.id in field_ids: + fields.append(field) + + return fields + + + def _q_index [html] (self): get_logger().info('backoffice - form %s - listing' % self.formdef.name) + + fields = self.get_fields_from_query() + qs = '' + if get_request().get_query(): + qs = '?' + get_request().get_query() + get_response().breadcrumb.append( ('listing', _('Listing')) ) html_top('forms', '%s - %s' % (_('Listing'), self.formdef.name)) '

%s - %s

' % (self.formdef.name, _('Listing')) - FormDefUI(self.formdef).listing(include_form = True) - '%s' % _('Back') + FormDefUI(self.formdef).listing(fields=fields, include_form=True) + + get_response().filter['sidebar'] = self.get_formdata_sidebar(qs) + self.get_fields_sidebar(fields) def pending [html] (self): get_logger().info('backoffice - form %s - pending' % self.formdef.name) diff --git a/wcs/forms/backoffice.ptl b/wcs/forms/backoffice.ptl index 3a6d2d1..fa0724f 100644 --- a/wcs/forms/backoffice.ptl +++ b/wcs/forms/backoffice.ptl @@ -27,49 +27,22 @@ class FormDefUI: def __init__(self, formdef): self.formdef = formdef - - def get_listing_fields(self): - fields = [] - for f in self.formdef.fields: - if f.type in ('title', 'subtitle', 'comment'): - continue - if f.in_listing: - fields.append(f) - return fields - - - def listing [html] (self, url_action = None, include_form = False, items = None): + def listing [html] (self, fields, url_action=None, include_form=False, items=None): get_response().add_javascript(['jquery.js', - 'tablesorter/jquery.tablesorter.min.js', - 'jquery.event.drag-1.4.js', - 'jquery.kiketable.colsizable-1.1.js']) + 'tablesorter/jquery.tablesorter.min.js']) get_response().add_javascript_code( - str('''$(function() { - $("table.sortable").tablesorter( - ).kiketable_colsizable({dragMove:false,dragProxy: 'line'}); });''')) + str('''$(function() { $("table.sortable").tablesorter(); });''')) get_response().add_css_include('../js/tablesorter/themes/blue/style.css') - get_response().add_css_include('../js/jquery.kiketable.colsizable.css') - - if self.formdef.workflow is None or len( - self.formdef.workflow.possible_status) > 1: - include_status_column = True - else: - include_status_column = False '' - fields = self.get_listing_fields() '' '' '' for f in fields: '' - if include_status_column: - '' '' '' - '' - '' % _('Creation Time') for f in fields: '' - if include_status_column: - '' % _('Status') '' if include_form: '' # will be displayed by javascript '' - '' - '' # creation time for f in fields: - if f.type in ('title', 'subtitle', 'comment'): - continue '' - if include_status_column: - '' '' '' - '' % get_publisher().get_root_url() '' self.tbody(fields = fields, items = items, url_action = url_action) '' "
%s' if len(f.label) < 20: @@ -78,17 +51,11 @@ class FormDefUI: '%s' % ( f.label, misc.ellipsize(f.label, 20)) '%s
' if f.type == 'item' and f.items: '' + if f.type == 'status': + '' '
" - def tbody [html] (self, fields = None, items = None, url_action = None): - if self.formdef.workflow is None or len( - self.formdef.workflow.possible_status) > 1: - include_status_column = True - else: - include_status_column = False - - if not fields: - fields = self.get_listing_fields() - + def tbody [html] (self, fields=None, items=None, url_action=None): if items is None: items = self.formdef.data_class().select(order_by = '-receipt_time') if url_action: @@ -143,19 +100,26 @@ class FormDefUI: style = 'odd' '' % (filled.status, style) link = str(filled.id) + '/' - '%s' % (link, url_action, filled.id) - '%s' % misc.localstrftime(filled.receipt_time) for i, f in enumerate(fields): - if f.type in ('title', 'subtitle', 'comment'): - continue - '' - value = filled.data.get(f.id) - if value is not None: - s = f.get_view_short_value(value, min(120/len(fields), 30)) - s = s.replace(str('[download]'), str('%sdownload' % link)) - s - '' - if include_status_column: - '%s' % filled.get_status_label() + if f.type == 'id': + '%s' % (link, url_action, filled.id) + elif f.type == 'time': + '%s' % misc.localstrftime(filled.receipt_time) + elif f.type == 'user-label': + try: + value = User.get(result.user_id).display_name + '%s' % value + except: + '-' + elif f.type == 'status': + '%s' % filled.get_status_label() + else: + '' + value = filled.data.get(f.id) + if value is not None: + s = f.get_view_short_value(value, min(120/len(fields), 30)) + s = s.replace(str('[download]'), str('%sdownload' % link)) + s + '' '\n' -- 1.7.9.5