kind of a mess lol but file caching and front end
This commit is contained in:
@ -6,29 +6,49 @@ from jinja2 import Environment, FileSystemLoader
|
||||
from weasyprint import HTML
|
||||
import logging
|
||||
import asyncio
|
||||
from app.schemas.file import FileInDB
|
||||
from app.services.base_service import BaseService
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class PullSheetService:
|
||||
class PullSheetService(BaseService):
|
||||
def __init__(self):
|
||||
super().__init__(None)
|
||||
self.template_dir = Path("app/data/assets/templates")
|
||||
self.env = Environment(loader=FileSystemLoader(str(self.template_dir)))
|
||||
self.template = self.env.get_template("pull_sheet.html")
|
||||
self.output_dir = Path("app/data/cache/tcgplayer/pull_sheets")
|
||||
self.output_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
async def generate_pull_sheet_pdf(self, csv_path: str) -> str:
|
||||
|
||||
async def get_or_create_rendered_pull_sheet(self, db: Session, order_ids: list[str]) -> FileInDB:
|
||||
# get file service
|
||||
file_service = self.get_service('file')
|
||||
# check if rendered pull sheet exists
|
||||
rendered_pull_sheet = await file_service.get_file_by_metadata(db, "order_ids", order_ids, "rendered_pull_sheet", "application/pdf")
|
||||
if rendered_pull_sheet:
|
||||
return rendered_pull_sheet
|
||||
# check if pull sheet data file exists
|
||||
pull_sheet_data_file = await file_service.get_file_by_metadata(db, "order_ids", order_ids, "pull_sheet", "text/csv")
|
||||
if pull_sheet_data_file:
|
||||
# generate pdf from pull sheet data file
|
||||
return await self.generate_pull_sheet_pdf(db, pull_sheet_data_file)
|
||||
# if no pull sheet data file exists, get it from order management service
|
||||
order_service = self.get_service('order_management')
|
||||
pull_sheet_data_file = await order_service.get_pull_sheet(db, order_ids)
|
||||
return await self.generate_pull_sheet_pdf(db, pull_sheet_data_file)
|
||||
|
||||
async def generate_pull_sheet_pdf(self, db: Session, file: FileInDB) -> FileInDB:
|
||||
"""Generate a PDF pull sheet from a CSV file.
|
||||
|
||||
Args:
|
||||
csv_path: Path to the CSV file containing pull sheet data
|
||||
file: FileInDB object containing the pull sheet data
|
||||
|
||||
Returns:
|
||||
Path to the generated PDF file
|
||||
"""
|
||||
try:
|
||||
# Read and process CSV data
|
||||
items = await self._read_and_process_csv(csv_path)
|
||||
items = await self._read_and_process_csv(file.path)
|
||||
|
||||
# Prepare template data
|
||||
template_data = {
|
||||
@ -38,16 +58,24 @@ class PullSheetService:
|
||||
|
||||
# Render HTML
|
||||
html_content = self.template.render(**template_data)
|
||||
|
||||
# Generate PDF in a separate thread to avoid blocking
|
||||
pdf_path = self.output_dir / f"pull_sheet_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"
|
||||
await asyncio.get_event_loop().run_in_executor(
|
||||
None,
|
||||
lambda: HTML(string=html_content).write_pdf(str(pdf_path))
|
||||
|
||||
# Ensure metadata is properly formatted
|
||||
metadata = file.file_metadata.copy() if file.file_metadata else {}
|
||||
if 'order_ids' in metadata:
|
||||
metadata['order_ids'] = sorted(metadata['order_ids'])
|
||||
|
||||
file_service = self.get_service('file')
|
||||
return await file_service.save_file(
|
||||
db=db,
|
||||
file_data=html_content,
|
||||
filename=f"rendered_pull_sheet_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf",
|
||||
subdir="tcgplayer/pull_sheets/rendered",
|
||||
file_type="rendered_pull_sheet",
|
||||
content_type="application/pdf",
|
||||
metadata=metadata,
|
||||
html_content=True # This tells FileService to convert HTML to PDF
|
||||
)
|
||||
|
||||
return str(pdf_path)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error generating pull sheet PDF: {str(e)}")
|
||||
raise
|
||||
@ -68,7 +96,7 @@ class PullSheetService:
|
||||
)
|
||||
|
||||
# Filter out the "Orders Contained in Pull Sheet" row
|
||||
df = df[df['Product Line'] != 'Orders Contained in Pull Sheet:']
|
||||
df = df[df['Product Line'] != 'Orders Contained in Pull Sheet:'].copy()
|
||||
|
||||
# Convert Set Release Date to datetime
|
||||
df['Set Release Date'] = pd.to_datetime(df['Set Release Date'], format='%m/%d/%Y %H:%M:%S')
|
||||
|
Reference in New Issue
Block a user