| @@ -10,7 +10,14 @@ from db.repository.maintenancejob import calculate_total_cost | |||||
| from reportlab.lib import colors | from reportlab.lib import colors | ||||
| from reportlab.lib.pagesizes import letter | from reportlab.lib.pagesizes import letter | ||||
| from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Image, PageBreak | |||||
| from reportlab.platypus import ( | |||||
| SimpleDocTemplate, | |||||
| Table, | |||||
| TableStyle, | |||||
| Paragraph, | |||||
| Image, | |||||
| PageBreak, | |||||
| ) | |||||
| from reportlab.lib.styles import getSampleStyleSheet | from reportlab.lib.styles import getSampleStyleSheet | ||||
| from reportlab.lib.units import inch | from reportlab.lib.units import inch | ||||
| from reportlab.graphics.shapes import Drawing | from reportlab.graphics.shapes import Drawing | ||||
| @@ -27,10 +34,14 @@ def get_repot_jobsdone_by_driver(driver_id: int, db: Session): | |||||
| return "notdriver" | return "notdriver" | ||||
| if driver.Role != "Driver": | if driver.Role != "Driver": | ||||
| return "notdriver" | return "notdriver" | ||||
| tasks = db.query(DriveTask).filter((DriveTask.DriverId == driver_id) & (DriveTask.Status == "Completed")).all() | |||||
| #order tasks by completion date | |||||
| tasks = ( | |||||
| db.query(DriveTask) | |||||
| .filter((DriveTask.DriverId == driver_id) & (DriveTask.Status == "Completed")) | |||||
| .all() | |||||
| ) | |||||
| # order tasks by completion date | |||||
| tasks.sort(key=lambda x: x.EndDateTime) | tasks.sort(key=lambda x: x.EndDateTime) | ||||
| #for each task, add TOTAL distance driven at the time of completion | |||||
| # for each task, add TOTAL distance driven at the time of completion | |||||
| dist = 0 | dist = 0 | ||||
| taskslist = [] | taskslist = [] | ||||
| for task in tasks: | for task in tasks: | ||||
| @@ -46,19 +57,21 @@ def get_repot_jobsdone_by_driver(driver_id: int, db: Session): | |||||
| dist += task.DistanceCovered | dist += task.DistanceCovered | ||||
| res["TotalDistance"] = dist | res["TotalDistance"] = dist | ||||
| timespent = 0.0 | timespent = 0.0 | ||||
| for task in tasks: | for task in tasks: | ||||
| edate = task.EndDateTime | edate = task.EndDateTime | ||||
| sdate = task.StartDateTime | sdate = task.StartDateTime | ||||
| if edate is None or sdate is None: | |||||
| continue | |||||
| if type(edate) == str: | if type(edate) == str: | ||||
| edate = datetime.strptime(edate, "%Y-%m-%d %H:%M:%S.%f") | edate = datetime.strptime(edate, "%Y-%m-%d %H:%M:%S.%f") | ||||
| timetaken = edate - sdate | timetaken = edate - sdate | ||||
| timespent += timetaken.total_seconds() | timespent += timetaken.total_seconds() | ||||
| #time spent in hours and minutes | |||||
| # time spent in hours and minutes | |||||
| hours = timespent // 3600 | hours = timespent // 3600 | ||||
| minutes = (timespent % 3600) // 60 | minutes = (timespent % 3600) // 60 | ||||
| res["TotalTime"] = str(hours) + " hours " + str(minutes) + " minutes" | res["TotalTime"] = str(hours) + " hours " + str(minutes) + " minutes" | ||||
| #add fuel expenditures | |||||
| # add fuel expenditures | |||||
| fuel = db.query(FuelingTask).filter(FuelingTask.DriverId == driver_id).all() | fuel = db.query(FuelingTask).filter(FuelingTask.DriverId == driver_id).all() | ||||
| fuel.sort(key=lambda x: x.Date) | fuel.sort(key=lambda x: x.Date) | ||||
| totalfuelspent = 0 | totalfuelspent = 0 | ||||
| @@ -72,9 +85,13 @@ def get_repot_jobsdone_by_driver(driver_id: int, db: Session): | |||||
| fuelspent.append(fuelpoint) | fuelspent.append(fuelpoint) | ||||
| res["FuelSpent"] = fuelspent | res["FuelSpent"] = fuelspent | ||||
| res["TotalFuelSpent"] = totalfuelspent | res["TotalFuelSpent"] = totalfuelspent | ||||
| #add maintenance costs | |||||
| mainten = db.query(MaintenanceJob).filter(MaintenanceJob.VehicleDriverId == driver_id).all() | |||||
| # add maintenance costs | |||||
| mainten = ( | |||||
| db.query(MaintenanceJob) | |||||
| .filter(MaintenanceJob.VehicleDriverId == driver_id) | |||||
| .all() | |||||
| ) | |||||
| mainten.sort(key=lambda x: x.Date) | mainten.sort(key=lambda x: x.Date) | ||||
| totalmaintenspent = 0 | totalmaintenspent = 0 | ||||
| maintenspent = [] | maintenspent = [] | ||||
| @@ -90,6 +107,7 @@ def get_repot_jobsdone_by_driver(driver_id: int, db: Session): | |||||
| res["TotalMaintenanceSpent"] = totalmaintenspent | res["TotalMaintenanceSpent"] = totalmaintenspent | ||||
| return res | return res | ||||
| def get_pdf(driver_id: int, db: Session): | def get_pdf(driver_id: int, db: Session): | ||||
| report_data = get_repot_jobsdone_by_driver(driver_id, db) | report_data = get_repot_jobsdone_by_driver(driver_id, db) | ||||
| if report_data == "notdriver": | if report_data == "notdriver": | ||||
| @@ -105,11 +123,11 @@ def get_pdf(driver_id: int, db: Session): | |||||
| content = [] | content = [] | ||||
| # Add a title to the PDF | # Add a title to the PDF | ||||
| title_style = getSampleStyleSheet()['Title'] | |||||
| title_style = getSampleStyleSheet()["Title"] | |||||
| title = Paragraph("Driver Report", title_style) | title = Paragraph("Driver Report", title_style) | ||||
| content.append(title) | content.append(title) | ||||
| content.append(Paragraph("<br/>", title_style)) | content.append(Paragraph("<br/>", title_style)) | ||||
| print(report_data["Driver"]) | print(report_data["Driver"]) | ||||
| # Add detailed information about the driver | # Add detailed information about the driver | ||||
| @@ -123,10 +141,12 @@ def get_pdf(driver_id: int, db: Session): | |||||
| ["Role", report_data["Driver"]["Role"]], | ["Role", report_data["Driver"]["Role"]], | ||||
| ] | ] | ||||
| driver_table_style = TableStyle([ | |||||
| ('ALIGN', (0, 0), (-1, -1), 'LEFT'), | |||||
| ('BOX', (0, 0), (-1, -1), 1, colors.black), | |||||
| ]) | |||||
| driver_table_style = TableStyle( | |||||
| [ | |||||
| ("ALIGN", (0, 0), (-1, -1), "LEFT"), | |||||
| ("BOX", (0, 0), (-1, -1), 1, colors.black), | |||||
| ] | |||||
| ) | |||||
| driver_table = Table(driver_info, style=driver_table_style) | driver_table = Table(driver_info, style=driver_table_style) | ||||
| content.append(Paragraph("<br/><br/>", title_style)) | content.append(Paragraph("<br/><br/>", title_style)) | ||||
| @@ -147,17 +167,18 @@ def get_pdf(driver_id: int, db: Session): | |||||
| ["Capacity", vehicle["Capacity"]], | ["Capacity", vehicle["Capacity"]], | ||||
| ] | ] | ||||
| vehicle_table_style = TableStyle([ | |||||
| ('ALIGN', (0, 0), (-1, -1), 'LEFT'), | |||||
| ('BOX', (0, 0), (-1, -1), 1, colors.black), | |||||
| ]) | |||||
| vehicle_table_style = TableStyle( | |||||
| [ | |||||
| ("ALIGN", (0, 0), (-1, -1), "LEFT"), | |||||
| ("BOX", (0, 0), (-1, -1), 1, colors.black), | |||||
| ] | |||||
| ) | |||||
| vehicle_table = Table(vehicle_info, style=vehicle_table_style) | vehicle_table = Table(vehicle_info, style=vehicle_table_style) | ||||
| content.append(Spacer(1, 12)) # Add space between the tables | content.append(Spacer(1, 12)) # Add space between the tables | ||||
| content.append(Table([[driver_table, vehicle_table]])) | content.append(Table([[driver_table, vehicle_table]])) | ||||
| content.append(Paragraph("<br/><br/>", title_style)) | content.append(Paragraph("<br/><br/>", title_style)) | ||||
| total_info = [ | total_info = [ | ||||
| ["Total Tasks Done", report_data["tasks"].__len__()], | ["Total Tasks Done", report_data["tasks"].__len__()], | ||||
| ["Total Fuel Spent", report_data["TotalFuelSpent"]], | ["Total Fuel Spent", report_data["TotalFuelSpent"]], | ||||
| @@ -166,10 +187,12 @@ def get_pdf(driver_id: int, db: Session): | |||||
| ["Total Money Spent", report_data["TotalMaintenanceSpent"]], | ["Total Money Spent", report_data["TotalMaintenanceSpent"]], | ||||
| ] | ] | ||||
| total_table_style = TableStyle([ | |||||
| ('ALIGN', (0, 0), (-1, -1), 'LEFT'), | |||||
| ('BOX', (0, 0), (-1, -1), 1, colors.black), | |||||
| ]) | |||||
| total_table_style = TableStyle( | |||||
| [ | |||||
| ("ALIGN", (0, 0), (-1, -1), "LEFT"), | |||||
| ("BOX", (0, 0), (-1, -1), 1, colors.black), | |||||
| ] | |||||
| ) | |||||
| total_table = Table(total_info, style=total_table_style) | total_table = Table(total_info, style=total_table_style) | ||||
| content.append(total_table) | content.append(total_table) | ||||
| @@ -177,10 +200,6 @@ def get_pdf(driver_id: int, db: Session): | |||||
| content.append(PageBreak()) | content.append(PageBreak()) | ||||
| title_style = getSampleStyleSheet()["Heading1"] | title_style = getSampleStyleSheet()["Heading1"] | ||||
| content.append(Paragraph("Driving Tasks", title_style)) | content.append(Paragraph("Driving Tasks", title_style)) | ||||
| @@ -191,7 +210,10 @@ def get_pdf(driver_id: int, db: Session): | |||||
| content.append(Paragraph("No tasks done.", title_style)) | content.append(Paragraph("No tasks done.", title_style)) | ||||
| else: | else: | ||||
| task_values = [entry["DistanceAtTime"] for entry in tasks_data] | task_values = [entry["DistanceAtTime"] for entry in tasks_data] | ||||
| task_dates = [parser.parse(entry['EndDateTime']).strftime("%m/%d/%Y, %H:%M:%S") for entry in tasks_data] | |||||
| task_dates = [ | |||||
| parser.parse(entry["EndDateTime"]).strftime("%m/%d/%Y, %H:%M:%S") | |||||
| for entry in tasks_data | |||||
| ] | |||||
| drawing = Drawing(width=400, height=200) | drawing = Drawing(width=400, height=200) | ||||
| chart = HorizontalLineChart() | chart = HorizontalLineChart() | ||||
| @@ -200,7 +222,7 @@ def get_pdf(driver_id: int, db: Session): | |||||
| chart.width = 500 | chart.width = 500 | ||||
| chart.height = 125 | chart.height = 125 | ||||
| chart.data = [task_values] | chart.data = [task_values] | ||||
| chart.categoryAxis.labels.boxAnchor = 'e' | |||||
| chart.categoryAxis.labels.boxAnchor = "e" | |||||
| chart.valueAxis.valueMin = 0 | chart.valueAxis.valueMin = 0 | ||||
| chart.valueAxis.valueMax = max(task_values) + 10 | chart.valueAxis.valueMax = max(task_values) + 10 | ||||
| chart.lines[0].strokeColor = colors.blue | chart.lines[0].strokeColor = colors.blue | ||||
| @@ -215,18 +237,34 @@ def get_pdf(driver_id: int, db: Session): | |||||
| content.append(Paragraph("<br/><br/>", title_style)) | content.append(Paragraph("<br/><br/>", title_style)) | ||||
| content.append(Paragraph("<br/><br/>", title_style)) | content.append(Paragraph("<br/><br/>", title_style)) | ||||
| # Add tasks information | # Add tasks information | ||||
| title_style = getSampleStyleSheet()["Heading2"] | title_style = getSampleStyleSheet()["Heading2"] | ||||
| content.append(Paragraph("All DriveTasks", title_style)) | content.append(Paragraph("All DriveTasks", title_style)) | ||||
| tasks_header = ["Task ID", "Description", "Start Location", "End Location", "Distance Covered", "Status", "Start DateTime", "End DateTime"] | |||||
| tasks_header = [ | |||||
| "Task ID", | |||||
| "Description", | |||||
| "Start Location", | |||||
| "End Location", | |||||
| "Distance Covered", | |||||
| "Status", | |||||
| "Start DateTime", | |||||
| "End DateTime", | |||||
| ] | |||||
| tasks_info = [] | tasks_info = [] | ||||
| for task in tasks_data: | for task in tasks_data: | ||||
| task_info = [f"{task['Id']}", task["Description"], f"{task['StartLocation'][0]}, {task['StartLocation'][1]}", f"{task['EndLocation'][0]}, {task['EndLocation'][1]}", | |||||
| "{} km".format(task["DistanceCovered"]), task["Status"], task['StartDateTime'].strftime("%m/%d/%Y, %H:%M:%S"), parser.parse(task['EndDateTime']).strftime("%m/%d/%Y, %H:%M:%S")] | |||||
| task_info = [ | |||||
| f"{task['Id']}", | |||||
| task["Description"], | |||||
| f"{task['StartLocation'][0]}, {task['StartLocation'][1]}", | |||||
| f"{task['EndLocation'][0]}, {task['EndLocation'][1]}", | |||||
| "{} km".format(task["DistanceCovered"]), | |||||
| task["Status"], | |||||
| task["StartDateTime"].strftime("%m/%d/%Y, %H:%M:%S"), | |||||
| parser.parse(task["EndDateTime"]).strftime("%m/%d/%Y, %H:%M:%S"), | |||||
| ] | |||||
| tasks_info.append(task_info) | tasks_info.append(task_info) | ||||
| # Define the styles | # Define the styles | ||||
| styles = getSampleStyleSheet() | styles = getSampleStyleSheet() | ||||
| normal_style = styles["Normal"] | normal_style = styles["Normal"] | ||||
| @@ -235,30 +273,27 @@ def get_pdf(driver_id: int, db: Session): | |||||
| for row in tasks_info: | for row in tasks_info: | ||||
| for i, cell in enumerate(row): | for i, cell in enumerate(row): | ||||
| row[i] = Paragraph(cell, normal_style) | row[i] = Paragraph(cell, normal_style) | ||||
| tasks_table_style = TableStyle([ | |||||
| ('BACKGROUND', (0, 0), (-1, 0), colors.grey), | |||||
| ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), | |||||
| ('ALIGN', (0, 0), (-1, -1), 'CENTER'), | |||||
| ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), | |||||
| ('BOTTOMPADDING', (0, 0), (-1, 0), 12), | |||||
| ('BACKGROUND', (0, 1), (-1, -1), colors.beige), | |||||
| ('GRID', (0, 0), (-1, -1), 1, colors.black), | |||||
| ]) | |||||
| tasks_table_style = TableStyle( | |||||
| [ | |||||
| ("BACKGROUND", (0, 0), (-1, 0), colors.grey), | |||||
| ("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke), | |||||
| ("ALIGN", (0, 0), (-1, -1), "CENTER"), | |||||
| ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"), | |||||
| ("BOTTOMPADDING", (0, 0), (-1, 0), 12), | |||||
| ("BACKGROUND", (0, 1), (-1, -1), colors.beige), | |||||
| ("GRID", (0, 0), (-1, -1), 1, colors.black), | |||||
| ] | |||||
| ) | |||||
| tasks_table = Table([tasks_header] + tasks_info, style=tasks_table_style) | tasks_table = Table([tasks_header] + tasks_info, style=tasks_table_style) | ||||
| content.append(tasks_table) | content.append(tasks_table) | ||||
| content.append(PageBreak()) | |||||
| content.append(PageBreak()) | |||||
| title_style = getSampleStyleSheet()["Heading1"] | title_style = getSampleStyleSheet()["Heading1"] | ||||
| content.append(Paragraph("Fuel Spent Over Time", title_style)) | content.append(Paragraph("Fuel Spent Over Time", title_style)) | ||||
| # Add chart of fuel spendings | |||||
| # Add chart of fuel spendings | |||||
| fuel_spent_data = report_data["FuelSpent"] | fuel_spent_data = report_data["FuelSpent"] | ||||
| if fuel_spent_data.__len__() == 0: | if fuel_spent_data.__len__() == 0: | ||||
| content.append(Paragraph("No fuel spent.", title_style)) | content.append(Paragraph("No fuel spent.", title_style)) | ||||
| @@ -273,7 +308,7 @@ def get_pdf(driver_id: int, db: Session): | |||||
| chart.width = 500 | chart.width = 500 | ||||
| chart.height = 125 | chart.height = 125 | ||||
| chart.data = [fuel_values] | chart.data = [fuel_values] | ||||
| chart.categoryAxis.labels.boxAnchor = 'e' | |||||
| chart.categoryAxis.labels.boxAnchor = "e" | |||||
| chart.valueAxis.valueMin = 0 | chart.valueAxis.valueMin = 0 | ||||
| chart.valueAxis.valueMax = max(fuel_values) + 10 | chart.valueAxis.valueMax = max(fuel_values) + 10 | ||||
| chart.lines[0].strokeColor = colors.blue | chart.lines[0].strokeColor = colors.blue | ||||
| @@ -285,14 +320,18 @@ def get_pdf(driver_id: int, db: Session): | |||||
| # Add space between the tables | # Add space between the tables | ||||
| content.append(drawing) | content.append(drawing) | ||||
| content.append(Paragraph("<br/><br/>", title_style)) | content.append(Paragraph("<br/><br/>", title_style)) | ||||
| fuel_header = ["Date", "Fuel Refilled", "Total Fuel Spent"] | fuel_header = ["Date", "Fuel Refilled", "Total Fuel Spent"] | ||||
| fuel_info = [] | fuel_info = [] | ||||
| for fuel in fuel_spent_data: | for fuel in fuel_spent_data: | ||||
| fuel_info1 = [fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), "{} L".format(fuel["fuelrefilled"]), "{} L".format(fuel["total"])] | |||||
| fuel_info1 = [ | |||||
| fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), | |||||
| "{} L".format(fuel["fuelrefilled"]), | |||||
| "{} L".format(fuel["total"]), | |||||
| ] | |||||
| fuel_info.append(fuel_info1) | fuel_info.append(fuel_info1) | ||||
| # Define the styles | # Define the styles | ||||
| styles = getSampleStyleSheet() | styles = getSampleStyleSheet() | ||||
| normal_style = styles["Normal"] | normal_style = styles["Normal"] | ||||
| @@ -301,26 +340,27 @@ def get_pdf(driver_id: int, db: Session): | |||||
| for row in fuel_info: | for row in fuel_info: | ||||
| for i, cell in enumerate(row): | for i, cell in enumerate(row): | ||||
| row[i] = Paragraph(cell, normal_style) | row[i] = Paragraph(cell, normal_style) | ||||
| fuel_table_style = TableStyle([ | |||||
| ('BACKGROUND', (0, 0), (-1, 0), colors.grey), | |||||
| ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), | |||||
| ('ALIGN', (0, 0), (-1, -1), 'CENTER'), | |||||
| ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), | |||||
| ('BOTTOMPADDING', (0, 0), (-1, 0), 12), | |||||
| ('BACKGROUND', (0, 1), (-1, -1), colors.beige), | |||||
| ('GRID', (0, 0), (-1, -1), 1, colors.black), | |||||
| ]) | |||||
| fuel_table_style = TableStyle( | |||||
| [ | |||||
| ("BACKGROUND", (0, 0), (-1, 0), colors.grey), | |||||
| ("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke), | |||||
| ("ALIGN", (0, 0), (-1, -1), "CENTER"), | |||||
| ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"), | |||||
| ("BOTTOMPADDING", (0, 0), (-1, 0), 12), | |||||
| ("BACKGROUND", (0, 1), (-1, -1), colors.beige), | |||||
| ("GRID", (0, 0), (-1, -1), 1, colors.black), | |||||
| ] | |||||
| ) | |||||
| fuel_table = Table([fuel_header] + fuel_info, style=fuel_table_style) | fuel_table = Table([fuel_header] + fuel_info, style=fuel_table_style) | ||||
| content.append(fuel_table) | content.append(fuel_table) | ||||
| content.append(PageBreak()) | |||||
| content.append(PageBreak()) | |||||
| title_style = getSampleStyleSheet()["Heading1"] | title_style = getSampleStyleSheet()["Heading1"] | ||||
| content.append(Paragraph("Maintenance Over Time", title_style)) | content.append(Paragraph("Maintenance Over Time", title_style)) | ||||
| # Add chart of fuel spendings | |||||
| # Add chart of fuel spendings | |||||
| maintenance_data = report_data["MaintenanceSpent"] | maintenance_data = report_data["MaintenanceSpent"] | ||||
| if maintenance_data.__len__() == 0: | if maintenance_data.__len__() == 0: | ||||
| content.append(Paragraph("No maintenance done.", title_style)) | content.append(Paragraph("No maintenance done.", title_style)) | ||||
| @@ -335,7 +375,7 @@ def get_pdf(driver_id: int, db: Session): | |||||
| chart.width = 500 | chart.width = 500 | ||||
| chart.height = 125 | chart.height = 125 | ||||
| chart.data = [maintenance_values] | chart.data = [maintenance_values] | ||||
| chart.categoryAxis.labels.boxAnchor = 'e' | |||||
| chart.categoryAxis.labels.boxAnchor = "e" | |||||
| chart.valueAxis.valueMin = 0 | chart.valueAxis.valueMin = 0 | ||||
| chart.valueAxis.valueMax = max(maintenance_values) + 10 | chart.valueAxis.valueMax = max(maintenance_values) + 10 | ||||
| chart.lines[0].strokeColor = colors.blue | chart.lines[0].strokeColor = colors.blue | ||||
| @@ -347,14 +387,18 @@ def get_pdf(driver_id: int, db: Session): | |||||
| # Add space between the tables | # Add space between the tables | ||||
| content.append(drawing) | content.append(drawing) | ||||
| content.append(Paragraph("<br/><br/>", title_style)) | content.append(Paragraph("<br/><br/>", title_style)) | ||||
| maintenance_header = ["Date", "Maintenance Cost", "Total Maintenance Cost"] | maintenance_header = ["Date", "Maintenance Cost", "Total Maintenance Cost"] | ||||
| maintenance_info = [] | maintenance_info = [] | ||||
| for fuel in maintenance_data: | for fuel in maintenance_data: | ||||
| fuel_info1 = [fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), "{} L".format(fuel["cost"]), "{} L".format(fuel["total"])] | |||||
| fuel_info1 = [ | |||||
| fuel["date"].strftime("%m/%d/%Y, %H:%M:%S"), | |||||
| "{} L".format(fuel["cost"]), | |||||
| "{} L".format(fuel["total"]), | |||||
| ] | |||||
| maintenance_info.append(fuel_info1) | maintenance_info.append(fuel_info1) | ||||
| # Define the styles | # Define the styles | ||||
| styles = getSampleStyleSheet() | styles = getSampleStyleSheet() | ||||
| normal_style = styles["Normal"] | normal_style = styles["Normal"] | ||||
| @@ -363,25 +407,26 @@ def get_pdf(driver_id: int, db: Session): | |||||
| for row in maintenance_info: | for row in maintenance_info: | ||||
| for i, cell in enumerate(row): | for i, cell in enumerate(row): | ||||
| row[i] = Paragraph(cell, normal_style) | row[i] = Paragraph(cell, normal_style) | ||||
| maintenance_table_style = TableStyle([ | |||||
| ('BACKGROUND', (0, 0), (-1, 0), colors.grey), | |||||
| ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), | |||||
| ('ALIGN', (0, 0), (-1, -1), 'CENTER'), | |||||
| ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), | |||||
| ('BOTTOMPADDING', (0, 0), (-1, 0), 12), | |||||
| ('BACKGROUND', (0, 1), (-1, -1), colors.beige), | |||||
| ('GRID', (0, 0), (-1, -1), 1, colors.black), | |||||
| ]) | |||||
| maintenance_table = Table([maintenance_header] + maintenance_info, style=maintenance_table_style) | |||||
| maintenance_table_style = TableStyle( | |||||
| [ | |||||
| ("BACKGROUND", (0, 0), (-1, 0), colors.grey), | |||||
| ("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke), | |||||
| ("ALIGN", (0, 0), (-1, -1), "CENTER"), | |||||
| ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"), | |||||
| ("BOTTOMPADDING", (0, 0), (-1, 0), 12), | |||||
| ("BACKGROUND", (0, 1), (-1, -1), colors.beige), | |||||
| ("GRID", (0, 0), (-1, -1), 1, colors.black), | |||||
| ] | |||||
| ) | |||||
| maintenance_table = Table( | |||||
| [maintenance_header] + maintenance_info, style=maintenance_table_style | |||||
| ) | |||||
| content.append(maintenance_table) | content.append(maintenance_table) | ||||
| document.build(content) | document.build(content) | ||||
| print(f"PDF generated successfully: {pdf_filename}") | print(f"PDF generated successfully: {pdf_filename}") | ||||
| return pdf_filename | return pdf_filename | ||||