From 8186366b69f7fdb58192ebe2c19dae247c308d40 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 2 Aug 2017 19:16:45 -0500 Subject: [PATCH] Add view for consuming new batch ID; misc. tweaks for grids etc. --- tailbone/grids/core.py | 11 ++++- tailbone/static/css/grids.css | 1 + tailbone/static/js/tailbone.js | 11 +++-- tailbone/templates/master/index.mako | 68 ++++++++++++++-------------- tailbone/views/common.py | 23 ++++++++++ 5 files changed, 76 insertions(+), 38 deletions(-) diff --git a/tailbone/grids/core.py b/tailbone/grids/core.py index 6026714d..fd0ac595 100644 --- a/tailbone/grids/core.py +++ b/tailbone/grids/core.py @@ -26,6 +26,7 @@ Core Grid Classes from __future__ import unicode_literals, absolute_import +import datetime import urllib import six @@ -34,7 +35,7 @@ from sqlalchemy import orm from rattail.db import api from rattail.db.types import GPCType -from rattail.util import pretty_boolean, pretty_quantity, prettify +from rattail.util import prettify, pretty_boolean, pretty_quantity, pretty_hours import webhelpers2_grid from pyramid.renderers import render @@ -149,6 +150,8 @@ class Grid(object): self.set_renderer(key, self.render_percent) elif type_ == 'quantity': self.set_renderer(key, self.render_quantity) + elif type_ == 'duration': + self.set_renderer(key, self.render_duration) else: raise ValueError("Unsupported type for column '{}': {}".format(key, type_)) @@ -211,6 +214,12 @@ class Grid(object): value = self.obtain_value(obj, column_name) return pretty_quantity(value) + def render_duration(self, obj, column_name): + value = self.obtain_value(obj, column_name) + if value is None: + return "" + return pretty_hours(datetime.timedelta(seconds=value)) + def set_url(self, url): self.url = url diff --git a/tailbone/static/css/grids.css b/tailbone/static/css/grids.css index 98bca954..c9692c85 100644 --- a/tailbone/static/css/grids.css +++ b/tailbone/static/css/grids.css @@ -24,6 +24,7 @@ .grid-wrapper .grid-header td.tools { margin: 0; padding: 0; + text-align: right; vertical-align: bottom; white-space: nowrap; } diff --git a/tailbone/static/js/tailbone.js b/tailbone/static/js/tailbone.js index 753f10eb..334f570e 100644 --- a/tailbone/static/js/tailbone.js +++ b/tailbone/static/js/tailbone.js @@ -27,13 +27,16 @@ function disable_filter_options() { /* - * Convenience function to disable a form button. + * Convenience function to disable a UI button. */ function disable_button(button, label) { - if (label) { - $(button).html(label + ", please wait..."); + $(button).button('disable'); + if (label === undefined) { + label = "Working, please wait..."; + } + if (label) { + $(button).button('option', 'label', label); } - $(button).attr('disabled', 'disabled'); } diff --git a/tailbone/templates/master/index.mako b/tailbone/templates/master/index.mako index e417499c..a01ebfde 100644 --- a/tailbone/templates/master/index.mako +++ b/tailbone/templates/master/index.mako @@ -90,37 +90,39 @@ ## ${grid.render_complete(tools=capture(self.grid_tools).strip(), context_menu=capture(self.context_menu_items).strip())|n} -
+${grid.render_complete(tools=capture(self.grid_tools).strip(), context_menu=capture(self.context_menu_items).strip())|n} - - - - - - - - - - - - - - -
- % if grid.filterable: - ## TODO: should this be variable sometimes? - ${grid.render_filters(allow_save_defaults=True)|n} - % endif -
-
- ${self.grid_tools()} -
-
- - ${grid.render_grid()|n} - -
+##
+## +## +## +## +## +## +## +## +## +## +## +## +## +## +## +##
+## % if grid.filterable: +## ## TODO: should this be variable sometimes? +## ${grid.render_filters(allow_save_defaults=True)|n} +## % endif +##
+##
+## ${self.grid_tools()} +##
+##
+## +## ${grid.render_grid()|n} +## +##
diff --git a/tailbone/views/common.py b/tailbone/views/common.py index 9066df9d..cfa731b0 100644 --- a/tailbone/views/common.py +++ b/tailbone/views/common.py @@ -29,6 +29,7 @@ from __future__ import unicode_literals, absolute_import import six import rattail +from rattail.batch import consume_batch_id from rattail.mail import send_email from rattail.util import OrderedDict from rattail.files import resource_path @@ -40,6 +41,7 @@ from pyramid_simpleform import Form import tailbone from tailbone import forms +from tailbone.db import Session from tailbone.views import View @@ -124,6 +126,14 @@ class CommonView(View): return httpexceptions.HTTPFound(location=form.data['referrer']) return {'form': forms.FormRenderer(form)} + def consume_batch_id(self): + """ + Consume next batch ID from the PG sequence, and display via flash message. + """ + batch_id = consume_batch_id(Session()) + self.request.session.flash("Batch ID has been consumed: {:08d}".format(batch_id)) + return self.redirect(self.request.get_referrer()) + def bogus_error(self): """ A special view which simply raises an error, for the sake of testing @@ -133,6 +143,10 @@ class CommonView(View): @classmethod def defaults(cls, config): + cls._defaults(config) + + @classmethod + def _defaults(cls, config): rattail_config = config.registry.settings.get('rattail_config') # auto-correct URLs which require trailing slash @@ -142,6 +156,9 @@ class CommonView(View): if rattail_config and rattail_config.production(): config.add_exception_view(cls, attr='exception', renderer='/exception.mako') + # permissions + config.add_tailbone_permission_group('common', "(common)", overwrite=False) + # home config.add_route('home', '/') config.add_view(cls, attr='home', route_name='home', renderer='/home.mako') @@ -162,6 +179,12 @@ class CommonView(View): config.add_route('feedback', '/feedback') config.add_view(cls, attr='feedback', route_name='feedback', renderer='/feedback.mako') + # consume batch ID + config.add_tailbone_permission('common', 'common.consume_batch_id', + "Consume new Batch ID") + config.add_route('consume_batch_id', '/consume-batch-id') + config.add_view(cls, attr='consume_batch_id', route_name='consume_batch_id') + # bogus error config.add_route('bogus_error', '/bogus-error') config.add_view(cls, attr='bogus_error', route_name='bogus_error', permission='errors.bogus')