add label printing to product index
This commit is contained in:
parent
b4193db0f2
commit
6212932f74
|
@ -38,6 +38,9 @@ def before_render(event):
|
||||||
* ``rattail``
|
* ``rattail``
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Import labels module so it's available if/when needed.
|
||||||
|
import rattail.labels
|
||||||
|
|
||||||
request = event.get('request') or threadlocal.get_current_request()
|
request = event.get('request') or threadlocal.get_current_request()
|
||||||
|
|
||||||
renderer_globals = event
|
renderer_globals = event
|
||||||
|
|
|
@ -7,14 +7,80 @@
|
||||||
${parent.head_tags()}
|
${parent.head_tags()}
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
|
|
||||||
|
table.header td.tools table {
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.header td.tools table th,
|
||||||
|
table.header td.tools table td {
|
||||||
|
padding: 0px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.header td.tools table #label-quantity {
|
||||||
|
text-align: right;
|
||||||
|
width: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
div.grid.Product table tbody td.size,
|
div.grid.Product table tbody td.size,
|
||||||
div.grid.Product table tbody td.regular_price,
|
div.grid.Product table tbody td.regular_price,
|
||||||
div.grid.Product table tbody td.sale_price {
|
div.grid.Product table tbody td.sale_price {
|
||||||
padding-right: 6px;
|
padding-right: 6px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.grid.Product table tbody td.labels {
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
% if edbob.config.getboolean('rattail.labels', 'enabled', default=False):
|
||||||
|
<script language="javascript" type="text/javascript">
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
$('div.grid.Product a.print-label').live('click', function() {
|
||||||
|
var quantity = $('#label-quantity').val();
|
||||||
|
// TODO: Validate quantity as integer etc.
|
||||||
|
$.ajax({
|
||||||
|
url: '${url('products.print_label')}',
|
||||||
|
data: {
|
||||||
|
'uuid': get_uuid(this),
|
||||||
|
'profile': $('#label-profile').val(),
|
||||||
|
'quantity': quantity,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
alert("Label has been printed.");
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
% endif
|
||||||
|
</%def>
|
||||||
|
|
||||||
|
<%def name="tools()">
|
||||||
|
% if edbob.config.getboolean('rattail.labels', 'enabled', default=False):
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>Label</td>
|
||||||
|
<td>Qty.</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<td>
|
||||||
|
<select name="label-profile" id="label-profile">
|
||||||
|
% for profile in rattail.labels.iter_profiles():
|
||||||
|
<option value="${profile.name}">${profile.display_name}</option>
|
||||||
|
% endfor
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="label-quantity" id="label-quantity" value="1" />
|
||||||
|
</td>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
% endif
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
${parent.body()}
|
${parent.body()}
|
||||||
|
|
|
@ -26,12 +26,18 @@
|
||||||
``rattail.pyramid.views.products`` -- Product Views
|
``rattail.pyramid.views.products`` -- Product Views
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from webhelpers.html.tags import link_to
|
||||||
|
|
||||||
from edbob.pyramid.filters import filter_ilike
|
from edbob.pyramid.filters import filter_ilike
|
||||||
from edbob.pyramid.grids import sorter
|
from edbob.pyramid.grids import sorter
|
||||||
from edbob.pyramid.views import GridView
|
from edbob.pyramid.views import GridView
|
||||||
from edbob.pyramid.views.crud import Crud
|
from edbob.pyramid.views.crud import Crud
|
||||||
|
|
||||||
|
import edbob
|
||||||
|
from edbob.pyramid import Session
|
||||||
|
|
||||||
import rattail
|
import rattail
|
||||||
|
import rattail.labels
|
||||||
from rattail.pyramid.forms import (
|
from rattail.pyramid.forms import (
|
||||||
UpcFieldRenderer, RegularPriceFieldRenderer, SalePriceFieldRenderer)
|
UpcFieldRenderer, RegularPriceFieldRenderer, SalePriceFieldRenderer)
|
||||||
|
|
||||||
|
@ -102,6 +108,12 @@ class ProductGrid(GridView):
|
||||||
g.sale_price.label("Sale Price"),
|
g.sale_price.label("Sale Price"),
|
||||||
],
|
],
|
||||||
readonly=True)
|
readonly=True)
|
||||||
|
|
||||||
|
def callback(prod):
|
||||||
|
return link_to("Print", '#', class_='print-label')
|
||||||
|
|
||||||
|
if edbob.config.getboolean('rattail.labels', 'enabled', default=False):
|
||||||
|
g.add_column('labels', "Labels", callback)
|
||||||
return g
|
return g
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,10 +131,31 @@ class ProductCrud(Crud):
|
||||||
return fs
|
return fs
|
||||||
|
|
||||||
|
|
||||||
|
def print_label(request):
|
||||||
|
profile = request.params.get('profile')
|
||||||
|
profile = rattail.labels.get_profile(profile) if profile else None
|
||||||
|
assert profile
|
||||||
|
|
||||||
|
uuid = request.params.get('uuid')
|
||||||
|
product = Session.query(rattail.Product).get(uuid) if uuid else None
|
||||||
|
assert product
|
||||||
|
|
||||||
|
quantity = request.params.get('quantity')
|
||||||
|
assert quantity.isdigit()
|
||||||
|
quantity = int(quantity)
|
||||||
|
|
||||||
|
printer = profile.get_printer()
|
||||||
|
printer.print_labels([(product, quantity)])
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
def includeme(config):
|
def includeme(config):
|
||||||
ProductGrid.add_route(config, 'products.list', '/products')
|
ProductGrid.add_route(config, 'products.list', '/products')
|
||||||
ProductCrud.add_routes(config)
|
ProductCrud.add_routes(config)
|
||||||
|
|
||||||
|
config.add_route('products.print_label', '/products/label')
|
||||||
|
config.add_view(print_label, route_name='products.print_label', renderer='json')
|
||||||
|
|
||||||
|
|
||||||
# from sqlalchemy.orm import joinedload
|
# from sqlalchemy.orm import joinedload
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue