Files
barker/barker/views/menu_category.py
Amritanshu 20801afc8a Removed IsModifierCompulsory from MenuCategory as it is now not needed and minimum in ModifierCategory set to non-zero to achieve the same.
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
2019-06-22 08:49:33 +05:30

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,
}