Fix: DiscountLimit was not scaled to 100 in MenuCategory detail. So it is now chaled in the json and scaled back in the frontend for the list as that was not supposed to be scaled. Feature: Modifier is now done Fix: In product save, it was checking menu_category second time again instead of sale_category
217 lines
6.3 KiB
Python
217 lines
6.3 KiB
Python
import uuid
|
|
from decimal import Decimal, InvalidOperation
|
|
|
|
import transaction
|
|
from pyramid.response import Response
|
|
from pyramid.view import view_config
|
|
|
|
from barker.exceptions import ValidationFailure
|
|
from barker.models import Product, MenuCategory
|
|
from barker.models.validation_exception import ValidationError
|
|
|
|
|
|
@view_config(
|
|
request_method="POST",
|
|
route_name="v1_menu_categories_new",
|
|
renderer="json",
|
|
permission="Products",
|
|
trans=True,
|
|
)
|
|
def save(request):
|
|
json = request.json_body
|
|
name = json.get("name", "").strip()
|
|
if name == "":
|
|
raise ValidationError("Name cannot be blank")
|
|
try:
|
|
discount_limit = Decimal(json["discountLimit"]) / 100
|
|
if discount_limit < 0 or discount_limit > 1:
|
|
raise ValidationError("Tax Rate must be a decimal >= 0 and <= 100")
|
|
except (ValueError, InvalidOperation):
|
|
raise ValidationError("Tax Rate must be a decimal >= 0 and <= 100")
|
|
is_active = json.get("isActive", True)
|
|
item = MenuCategory(name, discount_limit, is_active, 0)
|
|
request.dbsession.add(item)
|
|
transaction.commit()
|
|
return menu_category_info(item.id, request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="PUT",
|
|
route_name="v1_menu_categories_id",
|
|
renderer="json",
|
|
permission="Products",
|
|
trans=True,
|
|
)
|
|
def update(request):
|
|
json = request.json_body
|
|
item = (
|
|
request.dbsession.query(MenuCategory)
|
|
.filter(MenuCategory.id == uuid.UUID(request.matchdict["id"]))
|
|
.first()
|
|
)
|
|
if item.is_fixture:
|
|
raise ValidationError(
|
|
"{0} is a fixture and cannot be edited or deleted.".format(item.full_name)
|
|
)
|
|
item.name = json["name"].strip()
|
|
try:
|
|
item.discount_limit = Decimal(json["discountLimit"]) / 100
|
|
if item.discount_limit < 0 or item.discount_limit > 1:
|
|
raise ValidationError("Tax Rate must be a decimal >= 0 and <= 100")
|
|
except (ValueError, InvalidOperation):
|
|
raise ValidationError("Tax Rate must be a decimal >= 0 and <= 100")
|
|
item.is_active = json.get("isActive", True)
|
|
transaction.commit()
|
|
return menu_category_info(item.id, request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="DELETE",
|
|
route_name="v1_menu_categories_id",
|
|
renderer="json",
|
|
permission="Products",
|
|
trans=True,
|
|
)
|
|
def delete(request):
|
|
item = (
|
|
request.dbsession.query(MenuCategory)
|
|
.filter(MenuCategory.id == uuid.UUID(request.matchdict["id"]))
|
|
.first()
|
|
)
|
|
if item is None:
|
|
response = Response("Menu Category not Found")
|
|
response.status_int = 500
|
|
return response
|
|
elif item.is_fixture:
|
|
transaction.abort()
|
|
raise ValidationFailure(
|
|
"{0} is a fixture and cannot be edited or deleted.".format(item.name)
|
|
)
|
|
else:
|
|
response = Response("Menu Category deletion not implemented")
|
|
response.status_int = 500
|
|
return response
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_menu_categories_new",
|
|
renderer="json",
|
|
permission="Authenticated",
|
|
)
|
|
def show_blank(request):
|
|
return menu_category_info(None, request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_menu_categories_id",
|
|
renderer="json",
|
|
permission="Authenticated",
|
|
)
|
|
def show_id(request):
|
|
return menu_category_info(uuid.UUID(request.matchdict["id"]), request.dbsession)
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_menu_categories_list",
|
|
renderer="json",
|
|
permission="Authenticated",
|
|
)
|
|
def show_list(request):
|
|
list_ = (
|
|
request.dbsession.query(MenuCategory)
|
|
.order_by(MenuCategory.sort_order)
|
|
.order_by(MenuCategory.name)
|
|
.all()
|
|
)
|
|
menu_categories = []
|
|
for item in list_:
|
|
menu_categories.append(menu_category_info(item, request.dbsession))
|
|
return menu_categories
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_menu_categories_list",
|
|
renderer="json",
|
|
request_param="s",
|
|
permission="Authenticated",
|
|
)
|
|
def sale_list(request):
|
|
list_ = (
|
|
request.dbsession.query(MenuCategory)
|
|
.filter(MenuCategory.is_active == True)
|
|
.order_by(MenuCategory.sort_order)
|
|
.order_by(MenuCategory.name)
|
|
.all()
|
|
)
|
|
menu_categories = []
|
|
for item in list_:
|
|
products = (
|
|
request.dbsession.query(Product)
|
|
.filter(Product.menu_category_id == item.id)
|
|
.filter(Product.is_active == True)
|
|
.order_by(Product.sort_order)
|
|
.order_by(Product.name)
|
|
.all()
|
|
)
|
|
if len(products) > 0:
|
|
pg = menu_category_info(item)
|
|
pg["products"] = []
|
|
for p in products:
|
|
pg["products"].append(
|
|
{
|
|
"id": p.id,
|
|
"name": p.name,
|
|
"units": p.units,
|
|
"tat": {"id": p.vat.id, "name": p.vat.name, "rate": p.vat.rate},
|
|
"price": p.price,
|
|
"hasHappyHour": p.has_happy_hour,
|
|
"isActive": p.is_active,
|
|
"isNotAvailable": p.is_not_available,
|
|
"sortOrder": p.sort_order,
|
|
"quantity": p.quantity,
|
|
}
|
|
)
|
|
menu_categories.append(pg)
|
|
return menu_categories
|
|
|
|
|
|
@view_config(
|
|
request_method="POST",
|
|
route_name="v1_menu_categories_list",
|
|
renderer="json",
|
|
permission="Products",
|
|
trans=True,
|
|
)
|
|
def sort_order(request):
|
|
json = request.json_body
|
|
for index, item in enumerate(json):
|
|
request.dbsession.query(MenuCategory).filter(
|
|
MenuCategory.id == uuid.UUID(item["id"])
|
|
).update({MenuCategory.sort_order: index})
|
|
return True
|
|
|
|
|
|
def menu_category_info(item, dbsession):
|
|
if item is None:
|
|
return {
|
|
"name": "",
|
|
"discountLimit": 0,
|
|
"isActive": True,
|
|
"isFixture": False,
|
|
"sortOrder": 0,
|
|
}
|
|
if type(item) is uuid.UUID:
|
|
item = dbsession.query(MenuCategory).filter(MenuCategory.id == item).first()
|
|
return {
|
|
"id": item.id,
|
|
"name": item.name,
|
|
"discountLimit": item.discount_limit * 100,
|
|
"isActive": item.is_active,
|
|
"isFixture": item.is_fixture,
|
|
"sortOrder": item.sort_order,
|
|
}
|