Add mechanism for user to bulk-change status for purchase credits
trying to stay pretty generic yet...
This commit is contained in:
parent
0516d44842
commit
ec4e52fa1a
97
tailbone/templates/purchases/credits/index.mako
Normal file
97
tailbone/templates/purchases/credits/index.mako
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
## -*- coding: utf-8; -*-
|
||||||
|
<%inherit file="/master/index.mako" />
|
||||||
|
|
||||||
|
<%def name="extra_javascript()">
|
||||||
|
${parent.extra_javascript()}
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
function update_change_status_button() {
|
||||||
|
var count = $('.grid tr:not(.header) td.checkbox input:checked').length;
|
||||||
|
$('button.change-status').button('option', 'disabled', count < 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
|
||||||
|
$('.grid-wrapper').on('click', 'tr.header td.checkbox input', function() {
|
||||||
|
update_change_status_button();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.grid-wrapper').on('click', '.grid tr:not(.header) td.checkbox input', function() {
|
||||||
|
update_change_status_button();
|
||||||
|
});
|
||||||
|
$('.grid-wrapper').on('click', '.grid tr:not(.header)', function() {
|
||||||
|
update_change_status_button();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('button.change-status').click(function() {
|
||||||
|
var uuids = [];
|
||||||
|
$('.grid tr:not(.header) td.checkbox input:checked').each(function() {
|
||||||
|
uuids.push($(this).parents('tr:first').data('uuid'));
|
||||||
|
});
|
||||||
|
if (! uuids.length) {
|
||||||
|
alert("You must first select one or more credits.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var form = $('form[name="change-status"]');
|
||||||
|
form.find('[name="uuids"]').val(uuids.toString());
|
||||||
|
|
||||||
|
$('#change-status-dialog').dialog({
|
||||||
|
title: "Change Credit Status",
|
||||||
|
width: 500,
|
||||||
|
height: 300,
|
||||||
|
modal: true,
|
||||||
|
open: function() {
|
||||||
|
// TODO: why must we do this here instead of using auto-enhance ?
|
||||||
|
$('#change-status-dialog select[name="status"]').selectmenu();
|
||||||
|
},
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
text: "Submit",
|
||||||
|
click: function(event) {
|
||||||
|
disable_button(dialog_button(event));
|
||||||
|
form.submit();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Cancel",
|
||||||
|
click: function() {
|
||||||
|
$(this).dialog('close');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</%def>
|
||||||
|
|
||||||
|
<%def name="grid_tools()">
|
||||||
|
${parent.grid_tools()}
|
||||||
|
<button type="button" class="change-status" disabled="disabled">Change Status</button>
|
||||||
|
</%def>
|
||||||
|
|
||||||
|
${parent.body()}
|
||||||
|
|
||||||
|
<div id="change-status-dialog" style="display: none;">
|
||||||
|
${h.form(url('purchases.credits.change_status'), name='change-status')}
|
||||||
|
${h.csrf_token(request)}
|
||||||
|
${h.hidden('uuids')}
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<p>Please choose the appropriate status for the selected credits.</p>
|
||||||
|
|
||||||
|
<div class="fieldset">
|
||||||
|
|
||||||
|
<div class="field-wrapper status">
|
||||||
|
<label for="status">Status</label>
|
||||||
|
<div class="field">
|
||||||
|
${h.select('status', None, status_options)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
${h.end_form()}
|
||||||
|
</div>
|
|
@ -28,7 +28,9 @@ from __future__ import unicode_literals, absolute_import
|
||||||
|
|
||||||
from rattail.db import model
|
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
|
from tailbone.views import MasterView2 as MasterView
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,6 +43,7 @@ class PurchaseCreditView(MasterView):
|
||||||
url_prefix = '/purchases/credits'
|
url_prefix = '/purchases/credits'
|
||||||
creatable = False
|
creatable = False
|
||||||
editable = False
|
editable = False
|
||||||
|
checkboxes = True
|
||||||
|
|
||||||
grid_columns = [
|
grid_columns = [
|
||||||
'vendor',
|
'vendor',
|
||||||
|
@ -67,6 +70,12 @@ class PurchaseCreditView(MasterView):
|
||||||
g.default_sortkey = 'date_received'
|
g.default_sortkey = 'date_received'
|
||||||
g.default_sortdir = 'desc'
|
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('upc', 'gpc')
|
||||||
g.set_type('cases_shorted', 'quantity')
|
g.set_type('cases_shorted', 'quantity')
|
||||||
g.set_type('units_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('mispick_upc', "Mispick UPC")
|
||||||
g.set_label('date_received', "Date")
|
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):
|
def includeme(config):
|
||||||
PurchaseCreditView.defaults(config)
|
PurchaseCreditView.defaults(config)
|
||||||
|
|
Loading…
Reference in a new issue