Use product handler to normalize data for products API
at least, as much as possible
This commit is contained in:
parent
db62bd20b3
commit
71851e1a05
|
@ -2,7 +2,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# Rattail -- Retail Software Framework
|
# Rattail -- Retail Software Framework
|
||||||
# Copyright © 2010-2022 Lance Edgar
|
# Copyright © 2010-2023 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Rattail.
|
# This file is part of Rattail.
|
||||||
#
|
#
|
||||||
|
@ -30,6 +30,8 @@ import six
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from sqlalchemy import orm
|
from sqlalchemy import orm
|
||||||
|
|
||||||
|
from cornice import Service
|
||||||
|
|
||||||
from rattail.db import model
|
from rattail.db import model
|
||||||
|
|
||||||
from tailbone.api import APIMasterView
|
from tailbone.api import APIMasterView
|
||||||
|
@ -44,20 +46,41 @@ class ProductView(APIMasterView):
|
||||||
object_url_prefix = '/product'
|
object_url_prefix = '/product'
|
||||||
supports_autocomplete = True
|
supports_autocomplete = True
|
||||||
|
|
||||||
|
def __init__(self, request, context=None):
|
||||||
|
super(ProductView, self).__init__(request, context=context)
|
||||||
|
app = self.get_rattail_app()
|
||||||
|
self.products_handler = app.get_products_handler()
|
||||||
|
|
||||||
def normalize(self, product):
|
def normalize(self, product):
|
||||||
|
|
||||||
|
# get what we can from handler
|
||||||
|
data = self.products_handler.normalize_product(product, fields=[
|
||||||
|
'brand_name',
|
||||||
|
'full_description',
|
||||||
|
'department_name',
|
||||||
|
'unit_price_display',
|
||||||
|
'sale_price',
|
||||||
|
'sale_price_display',
|
||||||
|
'sale_ends',
|
||||||
|
'sale_ends_display',
|
||||||
|
'vendor_name',
|
||||||
|
'costs',
|
||||||
|
'image_url',
|
||||||
|
])
|
||||||
|
|
||||||
|
# but must supplement
|
||||||
cost = product.cost
|
cost = product.cost
|
||||||
return {
|
data.update({
|
||||||
'uuid': product.uuid,
|
|
||||||
'_str': six.text_type(product),
|
|
||||||
'upc': six.text_type(product.upc),
|
'upc': six.text_type(product.upc),
|
||||||
'scancode': product.scancode,
|
'scancode': product.scancode,
|
||||||
'item_id': product.item_id,
|
'item_id': product.item_id,
|
||||||
'item_type': product.item_type,
|
'item_type': product.item_type,
|
||||||
'description': product.description,
|
|
||||||
'status_code': product.status_code,
|
'status_code': product.status_code,
|
||||||
'default_unit_cost': cost.unit_cost if cost else None,
|
'default_unit_cost': cost.unit_cost if cost else None,
|
||||||
'default_unit_cost_display': "${:0.2f}".format(cost.unit_cost) if cost and cost.unit_cost is not None else None,
|
'default_unit_cost_display': "${:0.2f}".format(cost.unit_cost) if cost and cost.unit_cost is not None else None,
|
||||||
}
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
def make_autocomplete_query(self, term):
|
def make_autocomplete_query(self, term):
|
||||||
query = self.Session.query(model.Product)\
|
query = self.Session.query(model.Product)\
|
||||||
|
@ -77,6 +100,39 @@ class ProductView(APIMasterView):
|
||||||
def autocomplete_display(self, product):
|
def autocomplete_display(self, product):
|
||||||
return product.full_description
|
return product.full_description
|
||||||
|
|
||||||
|
def quick_lookup(self):
|
||||||
|
"""
|
||||||
|
View for handling "quick lookup" user input, for index page.
|
||||||
|
"""
|
||||||
|
data = self.request.GET
|
||||||
|
entry = data['entry']
|
||||||
|
|
||||||
|
product = self.products_handler.locate_product_for_entry(self.Session(),
|
||||||
|
entry)
|
||||||
|
if not product:
|
||||||
|
return {'error': "Product not found"}
|
||||||
|
|
||||||
|
return {'ok': True,
|
||||||
|
'product': self.normalize(product)}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def defaults(cls, config):
|
||||||
|
cls._defaults(config)
|
||||||
|
cls._product_defaults(config)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _product_defaults(cls, config):
|
||||||
|
route_prefix = cls.get_route_prefix()
|
||||||
|
permission_prefix = cls.get_permission_prefix()
|
||||||
|
collection_url_prefix = cls.get_collection_url_prefix()
|
||||||
|
|
||||||
|
# quick lookup
|
||||||
|
quick_lookup = Service(name='{}.quick_lookup'.format(route_prefix),
|
||||||
|
path='{}/quick-lookup'.format(collection_url_prefix))
|
||||||
|
quick_lookup.add_view('GET', 'quick_lookup', klass=cls,
|
||||||
|
permission='{}.list'.format(permission_prefix))
|
||||||
|
config.add_cornice_service(quick_lookup)
|
||||||
|
|
||||||
|
|
||||||
def defaults(config, **kwargs):
|
def defaults(config, **kwargs):
|
||||||
base = globals()
|
base = globals()
|
||||||
|
|
Loading…
Reference in a new issue