diff --git a/tailbone/templates/purchases/credits/index.mako b/tailbone/templates/purchases/credits/index.mako new file mode 100644 index 00000000..db59b939 --- /dev/null +++ b/tailbone/templates/purchases/credits/index.mako @@ -0,0 +1,97 @@ +## -*- coding: utf-8; -*- +<%inherit file="/master/index.mako" /> + +<%def name="extra_javascript()"> + ${parent.extra_javascript()} + + + +<%def name="grid_tools()"> + ${parent.grid_tools()} + + + +${parent.body()} + + diff --git a/tailbone/views/purchases/credits.py b/tailbone/views/purchases/credits.py index ffda8b6c..3056dcb6 100644 --- a/tailbone/views/purchases/credits.py +++ b/tailbone/views/purchases/credits.py @@ -28,7 +28,9 @@ from __future__ import unicode_literals, absolute_import from rattail.db import model -from tailbone import forms +from webhelpers2.html import tags + +from tailbone import forms, grids from tailbone.views import MasterView2 as MasterView @@ -41,6 +43,7 @@ class PurchaseCreditView(MasterView): url_prefix = '/purchases/credits' creatable = False editable = False + checkboxes = True grid_columns = [ 'vendor', @@ -67,6 +70,12 @@ class PurchaseCreditView(MasterView): g.default_sortkey = 'date_received' g.default_sortdir = 'desc' + g.filters['status'].set_value_renderer(grids.filters.EnumValueRenderer(self.enum.PURCHASE_CREDIT_STATUS)) + g.filters['status'].default_active = True + g.filters['status'].default_verb = 'not_equal' + g.filters['status'].default_value = self.enum.PURCHASE_CREDIT_STATUS_SATISFIED + + g.set_enum('status', self.enum.PURCHASE_CREDIT_STATUS) # g.set_type('upc', 'gpc') g.set_type('cases_shorted', 'quantity') g.set_type('units_shorted', 'quantity') @@ -80,6 +89,62 @@ class PurchaseCreditView(MasterView): g.set_label('mispick_upc', "Mispick UPC") g.set_label('date_received', "Date") + def change_status(self): + if self.request.method != 'POST': + self.request.session.flash("Sorry, you must POST to change credit status", 'error') + return self.redirect(self.get_index_url()) + + status = self.request.POST.get('status', '') + if status.isdigit(): + status = int(status) + else: + self.request.session.flash("Received invalid status: {}".format(status), 'error') + return self.redirect(self.get_index_url()) + + credits_ = [] + for uuid in self.request.POST.get('uuids', '').split(','): + uuid = uuid.strip() + if uuid: + credit = self.Session.query(model.PurchaseCredit).get(uuid) + if credit: + credits_.append(credit) + if not credits_: + self.request.session.flash("Received zero valid credits", 'error') + return self.redirect(self.get_index_url()) + + # okay, really change status + for credit in credits_: + credit.status = status + + self.request.session.flash("Changed status for {} credits".format(len(credits_))) + return self.redirect(self.get_index_url()) + + def template_kwargs_index(self, **kwargs): + kwargs['status_options'] = self.status_options() + return kwargs + + def status_options(self): + options = [] + for value in sorted(self.enum.PURCHASE_CREDIT_STATUS): + options.append(tags.Option(self.enum.PURCHASE_CREDIT_STATUS[value], value)) + return options + + @classmethod + def defaults(cls, config): + route_prefix = cls.get_route_prefix() + url_prefix = cls.get_url_prefix() + permission_prefix = cls.get_permission_prefix() + model_title_plural = cls.get_model_title_plural() + + # change status + config.add_tailbone_permission(permission_prefix, '{}.change_status'.format(permission_prefix), + "Change status for {}".format(model_title_plural)) + config.add_route('{}.change_status'.format(route_prefix), '{}/change-status'.format(url_prefix)) + config.add_view(cls, attr='change_status', route_name='{}.change_status'.format(route_prefix), + permission='{}.change_status'.format(permission_prefix)) + + cls._defaults(config) + def includeme(config): PurchaseCreditView.defaults(config)