178 lines
5.5 KiB
Python
178 lines
5.5 KiB
Python
import uuid
|
|
|
|
import transaction
|
|
from pyramid.view import view_config
|
|
from sqlalchemy import and_
|
|
from sqlalchemy.dialects.postgresql import insert as pg_insert
|
|
from zope.sqlalchemy import mark_changed
|
|
|
|
from barker.models import SectionPrinter, MenuCategory
|
|
from barker.models.validation_exception import ValidationError
|
|
|
|
|
|
@view_config(
|
|
request_method="POST",
|
|
route_name="v1_section_printers",
|
|
renderer="json",
|
|
permission="Products",
|
|
trans=True,
|
|
)
|
|
def save(request):
|
|
json = request.json_body
|
|
section_id = uuid.UUID(request.matchdict["section_id"])
|
|
current = []
|
|
for mcs in json["menuCategories"]:
|
|
menu_category = mcs.get("menuCategory", None)
|
|
menu_category_id = (
|
|
uuid.UUID(menu_category["id"])
|
|
if menu_category is not None and menu_category["id"] != ""
|
|
else None
|
|
)
|
|
printer = mcs.get("printer", None)
|
|
printer_id = (
|
|
uuid.UUID(printer["id"])
|
|
if printer is not None
|
|
and "id" in printer
|
|
and printer["id"] is not None
|
|
and printer["id"] != ""
|
|
else None
|
|
)
|
|
if menu_category_id is None and printer_id is None:
|
|
raise ValidationError("Please choose a default printer")
|
|
if printer_id is None:
|
|
continue
|
|
try:
|
|
copies = int(mcs.get("copies", 0))
|
|
if copies < 1:
|
|
raise ValidationError("Copies must be an integer >= 1")
|
|
except ValueError:
|
|
raise ValidationError("Copies must be an integer >= 1")
|
|
stmt = (
|
|
pg_insert(SectionPrinter.__table__)
|
|
.values(
|
|
id=uuid.uuid4(),
|
|
menu_category_id=menu_category_id,
|
|
section_id=section_id,
|
|
printer_id=printer_id,
|
|
copies=copies,
|
|
)
|
|
.on_conflict_do_update(
|
|
index_elements=["menu_category_id", "section_id"],
|
|
set_=dict(printer_id=printer_id, copies=copies),
|
|
)
|
|
)
|
|
request.dbsession.execute(stmt)
|
|
current.append(menu_category_id)
|
|
SectionPrinter.__table__.delete(
|
|
and_(
|
|
SectionPrinter.section_id == section_id,
|
|
~SectionPrinter.menu_category_id.in_(current),
|
|
)
|
|
)
|
|
mark_changed(request.dbsession)
|
|
transaction.commit()
|
|
|
|
return {"id": section_id, "menuCategories": report(section_id, request.dbsession)}
|
|
|
|
|
|
@view_config(
|
|
request_method="DELETE",
|
|
route_name="v1_section_printers",
|
|
renderer="json",
|
|
permission="Products",
|
|
trans=True,
|
|
)
|
|
def delete(request):
|
|
section_id = uuid.UUID(request.matchdict["section_id"])
|
|
SectionPrinter.__table__.delete(SectionPrinter.section_id == section_id)
|
|
mark_changed(request.dbsession)
|
|
transaction.commit()
|
|
return {"id": "", "menuCategories": report(section_id, request.dbsession)}
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_section_printers",
|
|
renderer="json",
|
|
permission="Authenticated",
|
|
)
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_section_printers_noid",
|
|
renderer="json",
|
|
permission="Authenticated",
|
|
)
|
|
def show_id(request):
|
|
section_id = request.matchdict.get("section_id", None)
|
|
if section_id is not None:
|
|
section_id = uuid.UUID(section_id)
|
|
return {"id": section_id, "menuCategories": report(section_id, request.dbsession)}
|
|
|
|
|
|
@view_config(
|
|
request_method="GET",
|
|
route_name="v1_section_printers",
|
|
renderer="json",
|
|
request_param="m",
|
|
permission="Authenticated",
|
|
)
|
|
def show_details(request):
|
|
section_id = uuid.UUID(request.matchdict["section_id"])
|
|
menu_category_id = request.GET.get("m", None)
|
|
if menu_category_id is not None:
|
|
menu_category_id = uuid.UUID(menu_category_id)
|
|
item = (
|
|
request.dbsession.query(SectionPrinter)
|
|
.filter(
|
|
SectionPrinter.section_id == section_id,
|
|
SectionPrinter.menu_category_id == menu_category_id,
|
|
)
|
|
.first()
|
|
)
|
|
return section_printer_info(item, request.dbsession)
|
|
|
|
|
|
def report(section_id, dbsession):
|
|
menu_categories = (
|
|
dbsession.query(MenuCategory.id, MenuCategory.name)
|
|
.filter(MenuCategory.is_active == True)
|
|
.order_by(MenuCategory.sort_order)
|
|
.all()
|
|
)
|
|
list_ = []
|
|
for item in [(None,)] + menu_categories:
|
|
mc = (
|
|
dbsession.query(SectionPrinter)
|
|
.filter(
|
|
SectionPrinter.section_id == section_id,
|
|
SectionPrinter.menu_category_id == item[0],
|
|
)
|
|
.first()
|
|
)
|
|
list_.append(
|
|
{
|
|
"menuCategory": {"id": "", "name": "Default"}
|
|
if item[0] is None
|
|
else {"id": item[0], "name": item[1]},
|
|
"printer": {} if mc is None else {"id": mc.printer_id},
|
|
"copies": 0 if mc is None else mc.copies,
|
|
}
|
|
)
|
|
return list_
|
|
|
|
|
|
def section_printer_info(item, dbsession):
|
|
if item is None:
|
|
return {"menuCategory": {}, "section": {}, "printer": {}, "copies": 0}
|
|
if type(item) is uuid.UUID:
|
|
item = dbsession.query(SectionPrinter).filter(SectionPrinter.id == item).first()
|
|
return {
|
|
"id": item.id,
|
|
"menuCategory": None
|
|
if item.menu_category is None
|
|
else {"id": item.menu_category.id, "name": item.menu_category.name},
|
|
"section": {"id": item.section.id, "name": item.section.name},
|
|
"printer": {"id": item.printer.id, "name": item.printer.name},
|
|
"copies": item.copies,
|
|
}
|