fix: category filter, action icons, download filename, reset button,

This commit is contained in:
2026-08-06 16:00:12 +05:30
parent e7805b71a8
commit 87346b99f4
3 changed files with 207 additions and 117 deletions

View File

@@ -29,17 +29,24 @@ def add_action_columns(df, model_key):
if df.empty:
return df
df.insert(0, "Select", df["Id"].apply(
# Edit + Delete side by side in one "Action" column, both as icon buttons.
df.insert(0, "Action", df["Id"].apply(
lambda x: (
f'<div class="d-flex gap-1">'
f'<a href="/file/edit/{model_key}/{x}" class="btn btn-sm btn-warning edit-btn" title="Edit">'
f'<i class="bi bi-pencil-square"></i></a>'
f'<button class="btn btn-sm btn-danger delete-btn" data-id="{x}" data-model="{model_key}" title="Delete">'
f'<i class="bi bi-trash"></i></button>'
f'</div>'
)
))
df.insert(1, "Select", df["Id"].apply(
lambda x: f'<input type="checkbox" class="row-check" data-id="{x}">'
))
df["Update"] = df["Id"].apply(
lambda x: f'<a href="/file/edit/{model_key}/{x}" class="btn btn-sm btn-warning edit-btn"><i class="bi bi-pencil-square"></i> Edit</a>'
)
df["Delete"] = df["Id"].apply(
lambda x: f'<button class="btn btn-sm btn-danger delete-btn" data-id="{x}" data-model="{model_key}">Delete</button>'
)
df["Id"] = range(1, len(df) + 1)
df = df.rename(columns={"Id": "Sr No"})
return df
@@ -235,6 +242,30 @@ def report_file():
bill.Fetch(subcontractor_id=subcontractor_id)
else:
bill.Fetch(ra_bill_no,subcontractor_id,location)
# ---------------------------------------------------------
if (
bill.df_tr.empty and
bill.df_mh.empty and
bill.df_dc.empty and
bill.df_laying.empty
):
flash(
f"No records found for RA Bill No '{ra_bill_no}'. "
"Please check the RA Bill No and try again."
if ra_bill_no else
"No records found for the selected filters.",
"warning"
)
return render_template(
"subcontractor_report.html",
subcontractors=subcontractors,
selected_sc_id=selected_sc_id,
selected_ra_bill=ra_bill_no,
selected_location=location,
selected_category=category
)
# -----------------------------------------
# Generate Abstract Report for Web
@@ -254,6 +285,32 @@ def report_file():
bill.df_tr = bill.df_mh = bill.df_laying = pd.DataFrame()
elif category == "laying":
bill.df_tr = bill.df_mh = bill.df_dc = pd.DataFrame()
if (
category in ("tr", "mh", "dc", "laying")
and bill.df_tr.empty and bill.df_mh.empty
and bill.df_dc.empty and bill.df_laying.empty
):
category_labels = {
"tr": "Trench Excavation",
"mh": "Manhole Excavation",
"dc": "Domestic Chamber",
"laying": "Pipe Laying",
}
flash(
f"No {category_labels[category]} records found for the "
"selected filters.",
"warning"
)
return render_template(
"subcontractor_report.html",
subcontractors=subcontractors,
selected_sc_id=selected_sc_id,
selected_ra_bill=ra_bill_no,
selected_location=location,
selected_category=category
)
# ===================================================
@@ -267,16 +324,46 @@ def report_file():
abstract = AbstractReportService(subcontractor_id=subcontractor_id,ra_bill_no=ra_bill_no)
abstract.generate(workbook)
bill.df_tr.to_excel(writer,sheet_name="Tr.Ex",index=False)
bill.df_mh.to_excel(writer,sheet_name="Mh.Ex",index=False)
bill.df_dc.to_excel(writer,sheet_name="MH & DC",index=False)
bill.df_laying.to_excel(writer,sheet_name="Pipe Laying",index=False)
sheet_map = [
(bill.df_tr, "Tr.Ex"),
(bill.df_mh, "Mh.Ex"),
(bill.df_dc, "MH & DC"),
(bill.df_laying, "Pipe Laying"),
]
for df, sheet_name in sheet_map:
if not df.empty:
df.to_excel(writer, sheet_name=sheet_name, index=False)
writer.close()
output.seek(0)
sc_obj = next(
(s for s in subcontractors if str(s.id) == str(subcontractor_id)),
None
)
sc_name = sc_obj.subcontractor_name if sc_obj else "Subcontractor"
sc_name = re.sub(r'[^A-Za-z0-9_-]+', '_', sc_name).strip('_')
name_parts = [sc_name]
if ra_bill_no:
name_parts.append(f"RA{re.sub(r'[^A-Za-z0-9_-]+', '_', ra_bill_no)}")
if location:
name_parts.append(re.sub(r'[^A-Za-z0-9_-]+', '_', location).strip('_'))
if category and category != "all":
name_parts.append(category.upper())
if action == "excel_all":
name_parts.append("All")
filename = "_".join(name_parts) + "_Report.xlsx"
return send_file(
output,
download_name= "subcontractor_Report.xlsx",
download_name=filename,
as_attachment=True
)