kind of a mess lol but file caching and front end

This commit is contained in:
2025-04-17 13:28:49 -04:00
parent 21408af48c
commit 8f35cedb4a
45 changed files with 1435 additions and 1316 deletions

View File

@ -1,15 +1,12 @@
from fastapi import APIRouter, HTTPException, Depends, Query
from app.services.external_api.tcgplayer.order_management_service import OrderManagementService
from app.services.label_printer_service import LabelPrinterService
from app.services.regular_printer_service import RegularPrinterService
from app.services.address_label_service import AddressLabelService
from typing import List, Optional, Literal
from typing import List
from datetime import datetime
from pydantic import BaseModel, Field
from enum import Enum
from app.schemas.tcgplayer import TCGPlayerAPIOrderSummary, TCGPlayerAPIOrder
from app.schemas.generate import GenerateRequest, GenerateAddressLabelsRequest, GeneratePackingSlipsRequest, GeneratePullSheetsRequest, GenerateResponse
from app.services.service_manager import ServiceManager
from sqlalchemy.orm import Session
from app.db.database import get_db
class SearchRange(str, Enum):
@ -73,142 +70,86 @@ async def get_order(order_id: str) -> TCGPlayerAPIOrder:
except Exception as e:
raise HTTPException(status_code=500, detail=f"Failed to fetch order: {str(e)}")
@router.post("/generate-pull-sheets")
@router.post("/generate-pull-sheets", response_model=GenerateResponse)
async def generate_pull_sheets(
order_ids: Optional[List[str]] = None,
all_open_orders: bool = False
) -> dict:
request: GeneratePullSheetsRequest,
db: Session = Depends(get_db)
) -> GenerateResponse:
"""
Generate and print pull sheets for the specified orders.
Args:
order_ids: List of TCGPlayer order numbers (optional if all_open_orders is True)
all_open_orders: If True, generate pull sheets for all orders (ignores order_ids)
request: Dictionary containing:
- order_ids: List of TCGPlayer order numbers
Returns:
Success status of the operation
"""
try:
order_management = service_manager.get_service('order_management')
if not all_open_orders and not order_ids:
raise HTTPException(
status_code=400,
detail="Either order_ids must be provided or all_open_orders must be True"
)
if all_open_orders:
order_ids = await order_management.get_order_ids(search_range="LastWeek", open_only=True)
pull_sheet = await order_management.get_pull_sheet(order_ids)
pull_sheet_file = await order_management.save_file(
pull_sheet,
f"pull_sheet_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv"
)
pull_sheet_service = service_manager.get_service('pull_sheet')
pull_sheet_pdf = await pull_sheet_service.generate_pull_sheet_pdf(pull_sheet_file)
order_ids = request.order_ids
pull_sheet = await pull_sheet_service.get_or_create_rendered_pull_sheet(db, order_ids)
regular_printer = service_manager.get_service('regular_printer')
success = await regular_printer.print_file(pull_sheet_pdf)
return {"success": success}
success = await regular_printer.print_file(pull_sheet.path)
# TODO: change to accept file instead of path
return {"success": success, "message": "Pull sheets generated and printed successfully"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Failed to generate pull sheet: {str(e)}")
@router.post("/generate-packing-slips")
@router.post("/generate-packing-slips", response_model=GenerateResponse)
async def generate_packing_slips(
order_ids: Optional[List[str]] = None,
all_open_orders: bool = False
) -> dict:
request: GeneratePackingSlipsRequest,
db: Session = Depends(get_db)
) -> GenerateResponse:
"""
Generate and print packing slips for the specified orders.
Args:
order_ids: List of TCGPlayer order numbers (optional if all_open_orders is True)
all_open_orders: If True, generate packing slips for all orders (ignores order_ids)
Returns:
Success status of the operation
request: Dictionary containing:
- order_ids: List of TCGPlayer order numbers
"""
try:
if not all_open_orders and not order_ids:
raise HTTPException(
status_code=400,
detail="Either order_ids must be provided or all_open_orders must be True"
)
# TODO: Add logic to fetch all orders when all_open_orders is True
if all_open_orders:
order_management = service_manager.get_service('order_management')
order_ids = await order_management.get_order_ids(search_range="LastWeek", open_only=True)
packing_slip = await order_management.get_packing_slip(order_ids)
packing_slip_file = await order_management.save_file(
packing_slip,
f"packing_slip_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.pdf"
)
label_printer = service_manager.get_service('label_printer')
success = await label_printer.print_file(
packing_slip_file,
label_size="dk1241",
label_type="packing_slip"
)
return {"success": success}
order_management = service_manager.get_service('order_management')
# get or create packing slips
packing_slips = await order_management.get_or_create_packing_slip(db, request.order_ids)
if packing_slips:
# print packing slips
label_printer = service_manager.get_service('label_printer')
success = await label_printer.print_file(packing_slips.path, label_size="dk1241", label_type="packing_slip")
return {"success": success, "message": "Packing slips generated and printed successfully"}
return {"success": False, "message": "Packing slips not found"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Failed to generate packing slip: {str(e)}")
raise HTTPException(status_code=500, detail=f"Failed to generate packing slips: {str(e)}")
@router.post("/generate-address-labels")
async def generate_address_labels(
order_ids: Optional[List[str]] = None,
all_open_orders: bool = False,
label_type: LabelType = LabelType.DK1201
) -> dict:
request: GenerateAddressLabelsRequest,
db: Session = Depends(get_db)
) -> GenerateResponse:
"""
Generate and print address labels for the specified orders.
Args:
order_ids: List of TCGPlayer order numbers (optional if all_open_orders is True)
all_open_orders: If True, generate address labels for all orders (ignores order_ids)
label_type: Type of label to generate (dk1201 or dk1241)
request: Dictionary containing:
- order_ids: List of TCGPlayer order numbers
- label_type: Type of label to generate (dk1201 or dk1241)
Returns:
Success status of the operation
"""
try:
order_management = service_manager.get_service('order_management')
if not all_open_orders and not order_ids:
raise HTTPException(
status_code=400,
detail="Either order_ids must be provided or all_open_orders must be True"
)
if all_open_orders:
order_ids = await order_management.get_order_ids(search_range="LastWeek", open_only=True)
shipping_csv = await order_management.get_shipping_csv(order_ids)
shipping_csv_file = await order_management.save_file(
shipping_csv,
f"shipping_csv_{datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.csv"
)
# Generate PDFs
address_label = service_manager.get_service('address_label')
pdf_files = await address_label.generate_labels_from_csv(
shipping_csv_file,
label_type=label_type
)
# Print each PDF
label_printer = service_manager.get_service('label_printer')
for pdf_file in pdf_files:
success = await label_printer.print_file(
pdf_file,
label_size=label_type,
label_type="address_label"
)
if not success:
raise HTTPException(
status_code=500,
detail=f"Failed to print address label for file {pdf_file}"
)
return {"success": True, "message": "Address labels generated and printed successfully"}
address_label_service = service_manager.get_service('address_label')
address_labels = await address_label_service.get_or_create_address_labels(db, request.order_ids, request.label_type)
if address_labels:
# print address labels
label_printer = service_manager.get_service('label_printer')
for address_label in address_labels:
success = await label_printer.print_file(address_label.path, label_size=request.label_type, label_type="address_label")
if not success:
return {"success": False, "message": "Address labels not found"}
return {"success": True, "message": "Address labels generated and printed successfully"}
return {"success": False, "message": "Address labels not found"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"Failed to generate address labels: {str(e)}")
raise HTTPException(status_code=500, detail=f"Failed to generate address labels: {str(e)}")