From 651be3964ae7f377f03aeb6d497f0ae9e5dcd5c1 Mon Sep 17 00:00:00 2001 From: pjpatil12 Date: Thu, 11 Dec 2025 17:58:56 +0530 Subject: [PATCH] create Mh.Ex model and MH & DC model and upload commit --- .gitignore | 9 ++ app/__pycache__/__init__.cpython-313.pyc | Bin 1037 -> 1037 bytes app/__pycache__/config.cpython-313.pyc | Bin 655 -> 655 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 161 -> 161 bytes ...ole_domestic_chamber_model.cpython-313.pyc | Bin 0 -> 3486 bytes .../manhole_excavation_model.cpython-313.pyc | Bin 0 -> 4592 bytes .../subcontractor_model.cpython-313.pyc | Bin 1867 -> 1867 bytes .../trench_excavation_model.cpython-313.pyc | Bin 5390 -> 5390 bytes app/models/manhole_domestic_chamber_model.py | 45 ++++++ app/models/manhole_excavation_model.py | 63 +++++++++ .../__pycache__/__init__.cpython-313.pyc | Bin 161 -> 161 bytes .../__pycache__/dashboard.cpython-313.pyc | Bin 609 -> 609 bytes .../__pycache__/file_import.cpython-313.pyc | Bin 1502 -> 1502 bytes .../subcontractor_routes.cpython-313.pyc | Bin 4201 -> 4201 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 163 -> 163 bytes .../__pycache__/file_service.cpython-313.pyc | Bin 4990 -> 9194 bytes app/services/file_service.py | 128 +++++++++++++++++- app/static/uploads/sub_4/MH__Dc.xlsx | Bin 0 -> 18335 bytes app/static/uploads/sub_4/Mh_Ex.xlsx | Bin 0 -> 21552 bytes app/static/uploads/sub_4/Tr.Ex.xlsx | Bin 0 -> 18517 bytes app/templates/base.html | 2 +- app/templates/file_import.html | 8 +- .../__pycache__/file_utils.cpython-313.pyc | Bin 601 -> 601 bytes 23 files changed, 247 insertions(+), 8 deletions(-) create mode 100644 .gitignore create mode 100644 app/models/__pycache__/manhole_domestic_chamber_model.cpython-313.pyc create mode 100644 app/models/__pycache__/manhole_excavation_model.cpython-313.pyc create mode 100644 app/models/manhole_domestic_chamber_model.py create mode 100644 app/static/uploads/sub_4/MH__Dc.xlsx create mode 100644 app/static/uploads/sub_4/Mh_Ex.xlsx create mode 100644 app/static/uploads/sub_4/Tr.Ex.xlsx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f349a89 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Ignore folders +instance/ +static/uploads/ + +# Ignore files +.env + +# Ignore by type +*.log diff --git a/app/__pycache__/__init__.cpython-313.pyc b/app/__pycache__/__init__.cpython-313.pyc index ff00ddd9aee91801e67a69b6c48a73eb6449c6f7..953580808b36db50ef1255a43f115bf844879011 100644 GIT binary patch delta 20 ZcmeC>=;h%4%*)Hg00ilNRvWpQSO71Y1O5O2 delta 20 acmeC>=;h%4%*)Hg00ciPEjMyAu>b%xl?1u~ diff --git a/app/__pycache__/config.cpython-313.pyc b/app/__pycache__/config.cpython-313.pyc index 1e41384ea687c04f59816157ad24e454fd2bfc17..a5e209a8a32685f567b7952e3c3783f3ac7a91cf 100644 GIT binary patch delta 20 ZcmeBY?Pulw%*)Hg00ilNRvWonm;f+*1bhGh delta 20 ZcmeBY?Pulw%*)Hg00hNcmK(WSm;f&`1VaD- diff --git a/app/models/__pycache__/__init__.cpython-313.pyc b/app/models/__pycache__/__init__.cpython-313.pyc index 6f4a5dd96748cdd4375e8714ede118e53fe1fbcd..169d9893766a63e0612b78f47c70a953164cb219 100644 GIT binary patch delta 19 ZcmZ3;xR8=E_YaC%flbv?VH_kMMywmMQh3P=DqKH-u&3v zncZt|Z$a?8_REB_5kTlq>NI|SR@s||%00v*o|{9n9N|*5?wRw`w=Fsgvd`kCcNlC<&%)DtTFanQA228-viOGZ%B&U)&|v<&x`m$@RG8 z5-z!E-@yus1wNmxG5)yH;KHo z`!@__SAv2DC3#6Gs;0jDT=0|YblF6MCfpHjdD9UI%GW=M2 zntzgijQ{we7M`vJr}yaWe?^(}DVkCf@-n1s!5BI!sNuQmg6S}}wU`khudCh9Nq?z)vOe~KgSuN8#k(Fg_PA*v;`}P3_wT;NCy?n-s zQn1?h=~jR@iJ~o&PMW+a151Q6y5*l%b-}b+FUSRR1?x+Ae#UB*@M&!7P>c>+Aqk(s zr$?xN29Gd*#P$d98QTZTd`BO^jy}kAu(m$Pc(ArV#B{LCclaTu4>KLCtq(IEtnH65 z9W3)5euU|xOb2W0ql^b@`(sQ8%Y26)WBNGL!P@#b{pI)te7byor#rD$S}koxA0{6pA1(fV{kQA2$xQvz zh1xZ|)qSJpi|xd^))rP5HWzB2;jP$>^8E7v>WJPg-6>U~)x<_(bMXGrdbqDVvmNTV ztK3m4o@(<(^XBpUp?c_K`Qmmoww7K^SI$>w)@SO`56g4FcgA0dZO6OUuC89Kkm{}V zTlIKfIrGjUF#JoamnymH%KAz@cJke2-udsw>?-q4Ptsob-iLh;`szKWYQFeRq;oB? zny3s^C)Xz*2cL$YgtsD}muFx2IR8b?*)w#zWYT`i3kRQla5$ULKTpp&~ rb1a=BQ^3*#);I#ib1%nn&rtLkI`Wq<&0XXwi`6UZS6;wX!20?JDB#JP literal 0 HcmV?d00001 diff --git a/app/models/__pycache__/manhole_excavation_model.cpython-313.pyc b/app/models/__pycache__/manhole_excavation_model.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b222504a7de655315f7bd77b6f806063cf15e309 GIT binary patch literal 4592 zcmbVP-Ba3F6b}#-EQlZ~;1^P@vTbeaSN-UAcB^&4R_PEs+wS0`0it9LguR5W^ogf^ z@TILgJAU**@CDo#yHERX#K{Yjna(h?FY8-pY@c^;0yHR$W5WzL_x^t8cg{U0xw$u| zMq?8Kf4iY+N~1@Rf5buMr!99*=V9j$1Vb>@BV<7ZR8Fz4exzPd1GN*eAua^dI1mgC zsQe8Tv3woZl==W&)4Cf@#DQBSsKY_n>cRv|vQ(4|$@U0RadOJ)#J~Xrs4xVmF%{5Y zYJdi`enYi+sqaD{-du}g8VsFM1KroDptYse7fe(;t}5YJ1J*dD0Zq`dy{@GW(_>9A zvf+Zrj=IV#l^B&PX#Q#+hKjaw1*QvpIBVzeMQ2v1vnbTHD%4pO>e>|Q+7;?L6zXgW zb#{e1heBPaLS2_aUAIDAk3wCqLY-5gu1}%PrBHWOp{`${Za|^#nnK;6Lfw!;om-*q z8-=>-3UxOW>TX`3tG~Y)D|<`j3WhK6anas%>jK@2+C43B#~-dmv1YhSk76bV0>-cw zFurDXTLkkW5sNT1`EVmdyd+qPiJhQODp;Z=94EgJ%kUs`B@U=40aExnnR;bTB!eL) z#sVV5G9WQbh3CbyPAo~&M35#0BUa4|rix2Ih8Pe|K-dAjF=7~6G>JvP7 zh)kGVC6Y87Dj!3nbi@;u_&;^Q2ACB1%GUO}H2%NsE00j{lM*=rUu%@l^^WSelBFF$U5`9B0LQQsRMF zM4@4pp_9>=(CCe^xc1&eIIR3dW~#mchM`@i{WiMg-$*l4YT3dD!Hg!be<2(4c&{hS)u?Uaix6ivA-!j8$7o4$fK1Se2z!MyqC3g~CaSbDe-GRH1MvqIY2i_Nsguo(DXqTl@>gM2w+cNxc1JYZuA<2ef%&$UI2tJZ52`j(? z@vBH^!|?|@22-naGTnqGMe9GykQ{y zP?USOygR}D$ZmwU4yG3iwTQWO+rDMr8QGuQo#f5^>4k#Lv9I6LXI#0V>=19e&Y^9E zcAMl_ozrD?e7igCgA?iO-goc0GY@i}tcQ2pk`7Ey;I6?BsZCz&w7mc$PVG%){JCe@XME={huSV@RY!O^2xi%LHK#w&=Uqob zheNz`lta4>4u5k|StpgREt{UOMVD9~RRK=beqhg!98Dfh@_l0*+H*Om z*xd4(+N5^W(rv%`u9Y diff --git a/app/models/__pycache__/trench_excavation_model.cpython-313.pyc b/app/models/__pycache__/trench_excavation_model.cpython-313.pyc index a0bd8294fa7dc54e46ba1c271501e94a5ad97589..9eb233a07a2df81a97081de24e5e75b0b73469df 100644 GIT binary patch delta 20 ZcmeCv>eJ%>%*)Hg00ilNRvWpQMFBLM1Xch5 delta 20 ZcmeCv>eJ%>%*)Hg00fB+mK(X5MFBJz1VI1* diff --git a/app/models/manhole_domestic_chamber_model.py b/app/models/manhole_domestic_chamber_model.py new file mode 100644 index 0000000..201b34e --- /dev/null +++ b/app/models/manhole_domestic_chamber_model.py @@ -0,0 +1,45 @@ +from app import db +from datetime import datetime + +class ManholeDomesticChamber(db.Model): + __tablename__ = "manhole_domestic_chamber" + + id = db.Column(db.Integer, primary_key=True) + # Foreign Key to Subcontractor table + subcontractor_id = db.Column(db.Integer, db.ForeignKey("subcontractors.id"), nullable=False) + # Relationship for easy access (subcontractor.subcontractor_name) + subcontractor = db.relationship("Subcontractor", backref="manhole_domestic_chamber_records") + + # Basic Fields + Location = db.Column(db.String(255)) + Node_No = db.Column(db.String(100)) + Depth_of_MH = db.Column(db.Float) + + # Excavation categories + d_0_to_0_75 = db.Column(db.Float) + d_1_06_to_1_65 = db.Column(db.Float) + d_1_06_to_1_65 = db.Column(db.Float) + d_1_66_to_2_15 = db.Column(db.Float) + d_2_16_to_2_65 = db.Column(db.Float) + d_2_66_to_3_15 = db.Column(db.Float) + d_3_16_to_3_65= db.Column(db.Float) + d_3_66_to_4_15 = db.Column(db.Float) + d_4_16_to_4_65 = db.Column(db.Float) + d_4_66_to_5_15 = db.Column(db.Float) + d_5_16_to_5_65 = db.Column(db.Float) + + d_5_66_to_6_15 = db.Column(db.Float) + d_6_16_to_6_65 = db.Column(db.Float) + d_6_66_to_7_15 = db.Column(db.Float) + d_7_16_to_7_65 = db.Column(db.Float) + d_7_66_to_8_15 = db.Column(db.Float) + d_8_16_to_8_65 = db.Column(db.Float) + d_8_66_to_9_15 = db.Column(db.Float) + d_9_16_to_9_65 = db.Column(db.Float) + + Domestic_Chambers = db.Column(db.Float) + + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + def __repr__(self): + return f"" diff --git a/app/models/manhole_excavation_model.py b/app/models/manhole_excavation_model.py index e69de29..7bd6c1d 100644 --- a/app/models/manhole_excavation_model.py +++ b/app/models/manhole_excavation_model.py @@ -0,0 +1,63 @@ +from app import db +from datetime import datetime + +class ManholeExcavation(db.Model): + __tablename__ = "manhole_excavation" + + id = db.Column(db.Integer, primary_key=True) + # Foreign Key to Subcontractor table + subcontractor_id = db.Column(db.Integer, db.ForeignKey("subcontractors.id"), nullable=False) + # Relationship for easy access (subcontractor.subcontractor_name) + subcontractor = db.relationship("Subcontractor", backref="manhole_records") + + # Basic Fields + Location = db.Column(db.String(255)) + MH_NO = db.Column(db.String(100)) + + Upto_IL_Depth = db.Column(db.Float) + Cutting_Depth = db.Column(db.Float) + ID_of_MH_m = db.Column(db.Float) + Ex_Dia_of_Manhole = db.Column(db.Float) + Area_of_Manhole = db.Column(db.Float) + + # Excavation categories + Soft_Murum_0_to_1_5 = db.Column(db.Float) + Soft_Murum_1_5_to_3_0 = db.Column(db.Float) + Soft_Murum_3_0_to_4_5 = db.Column(db.Float) + + Hard_Murum_0_to_1_5 = db.Column(db.Float) + Hard_Murum_1_5_to_3_0 = db.Column(db.Float) + + Soft_Rock_0_to_1_5 = db.Column(db.Float) + Soft_Rock_1_5_to_3_0 = db.Column(db.Float) + + Hard_Rock_0_to_1_5 = db.Column(db.Float) + Hard_Rock_1_5_to_3_0 = db.Column(db.Float) + Hard_Rock_3_0_to_4_5 = db.Column(db.Float) + Hard_Rock_4_5_to_6_0 = db.Column(db.Float) + Hard_Rock_6_0_to_7_5 = db.Column(db.Float) + + # Totals + Soft_Murum_0_to_1_5_total = db.Column(db.Float) + Soft_Murum_1_5_to_3_0_total = db.Column(db.Float) + Soft_Murum_3_0_to_4_5_total = db.Column(db.Float) + + Hard_Murum_0_to_1_5_total = db.Column(db.Float) + Hard_Murum_1_5_and_above_total = db.Column(db.Float) + + Soft_Rock_0_to_1_5_total = db.Column(db.Float) + Soft_Rock_1_5_and_above_total = db.Column(db.Float) + + Hard_Rock_0_to_1_5_total = db.Column(db.Float) + Hard_Rock_1_5_and_above_total = db.Column(db.Float) + Hard_Rock_3_0_to_4_5_total = db.Column(db.Float) + Hard_Rock_4_5_to_6_0_total = db.Column(db.Float) + Hard_Rock_6_0_to_7_5_total = db.Column(db.Float) + + Remarks = db.Column(db.String(500)) + Total = db.Column(db.Float) + + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + def __repr__(self): + return f"" diff --git a/app/routes/__pycache__/__init__.cpython-313.pyc b/app/routes/__pycache__/__init__.cpython-313.pyc index 772ec629705d7bd68d72074214f37764db675a87..06627912a5da27c11b14205bfc8868726a54cf22 100644 GIT binary patch delta 19 ZcmZ3;xR8_GcPX}0}!a^SZ(CK%nATJqXkv~ delta 20 acmcb|eUF>_GcPX}0}#kcT5jaN%nATHW(4>E diff --git a/app/routes/__pycache__/subcontractor_routes.cpython-313.pyc b/app/routes/__pycache__/subcontractor_routes.cpython-313.pyc index 55b182eb8fef427cfebafa763c5345b851b73b97..f228f306b9210f3a4be2fe7ea9b32125f2cafb86 100644 GIT binary patch delta 20 acmaE<@KS;MGcPX}0}!P9S#9Kw6951~W(7_F delta 20 acmaE<@KS;MGcPX}0}%Y=v)srXCjbCL-vyrl diff --git a/app/services/__pycache__/__init__.cpython-313.pyc b/app/services/__pycache__/__init__.cpython-313.pyc index be71a8111c0a7fc3d85f220dac817fe739772ccc..c4798cc2b72056e241ced079f612b2baa150d8d9 100644 GIT binary patch delta 19 ZcmZ3?xR{aqGcPX}0}!P9Sxw}g0RS!h1dadz delta 19 ZcmZ3?xR{aqGcPX}0}wpEWImC51^_c`1&aUx diff --git a/app/services/__pycache__/file_service.cpython-313.pyc b/app/services/__pycache__/file_service.cpython-313.pyc index 43b0dd9b098cdba124f9732fec2c622ccad66176..5726a18cfb82d4f6d07320d1e81cf347eb739143 100644 GIT binary patch delta 1905 zcmb`HZA@EL7{||P>C1(_x1-Q8*NzP=FI~f+Okjh;)+w)pTa;vB-KD)iwQo7MpfM(V zGubC)$M1f|s3GBl`{JiXVoa9Yr4p7qo0u81%*2Egjf%Q>o=c0wu{aZNa)0N!=XuV# z=Q;o9oF`2`T(Rt$&DDrK2HKM>ys&Di!|$v%PX>9!8%E5-7Gm)tW*bMW!!}~`qB?X6 z@tgF*XZ9Czm@}lZywiw9Tb@69!RkZTnksV{)PH1*yp6X{8!hOZrc)!) z?{p2=aZ6tcD30`g$}#aEXQi&vmnf$ki|^-5OZslJi@0FZY5^P#8E&?CawHoUB`H=J zcW5q-?WLGgw~`}Hde?9kyXc>WMtqF=jNN(%n?(}ob>oNFO`jM?bvt@wtEXd}`+{o8 z4Z(snc;9_|+a0>+4y}`ddsMcKmVKduHFT8E)lC<;(}7kt`5o_|A>u|~yjTnD2X4Bn zBOTgJpFYyA-E78Sx9cJu8=r9fRhBiZXcx0@5)T_2*`s^rj;b{s@z9{9ULS;%t#rb2 zr>_}I9fM+!Smvx!6s?d*DEfFdolfRS09;0rO{M09_#10x;)DU6fFK>W`tS(NSzAtY zu@1@1;6411V-VLyKeM*r!HtL3M;PzYuk3-1Pr0*I=gCXp?E&-x)RmG8U_wEYi-7&5 zGAsJ_`EvczYnF}`Z~4RfcZqv>VOjJ>1Xi+%9xoYWgZwTs1hZTMTn0n{R{$>qUI7dP zMgXILF~B&$065qoG6A1g0h6x*VQYvh9K zjjUD*?ht)!3*%PWYM+Smax^CMH{^Ojb_%jd_^rfaRNM3GPp@KDZM#Urh4D8g%X`B& zhqp~9@0m`1ZSviB*2xWhwc5IHQrZ8?ZQ?Co zC*GlKM#__=IGwY!uAKYVFgQ{Fzj8)Ur5Q0j)#5%Z9eAE!ITB;>AF)^ZmOip>;i#%j z*SfUr?k%``Rc(Tx&Fs9qK;(HzuFuQPyll!ptxfc3Z6@TalV3`*hnJoFmWfxziI&At zt9abc-ExF%>O~cT<+lOaY1nc6I#fBS1E^=M1}p%aMd=j7yQox!b#YwMx9U1eH*iol zfJ=+43FDukiQ@g?Fv#y9Ue+l3oRCQf5^1I%J7!lJg&L+f^6i7dH$;MQVdQ=qu z5t0AAddu-3km7>)rF@c2JkL&TOf?C|Txt$#@+5kYonq``KU+$P7fFW2VD?I&d@E*U zm4^AM0S+Rn(k8x?WC-DFDGg!#B_%+`s5dJxJ+XAW?tKa}9(Wf<_5#}OaJmyne~b)$ zh-BVHGS62!k@?-={GK|6PkdwXQ6||rc1fJmNn7_7+^+T+VJ_!tPXn)Wo`Spe-IsGK zI@qq&=3S~We&Ifz51e-E9;)G5;HZ$|cggrTurrh3rH6qnTBc=Hn+@A#l*_hIYS!!3 zb*l4`M4PqRicz|y%aor?(;QOxC>VoTd=X5-Bz_(p^sBsmf-A=Hfi@6cr)HzHx@_Jn z85_nr^UmV7X1D%?WB?2O>Pd;7W9%!sgui1`e&@SRIUaa1K6I7O=pYBj*vl&p{VXg_ zen@(5@RXn@#5`wzF2JNG4~GIy(-k_*k}cde8fC+x349e_!nMTUvdG$wle7N+3R{|~ xH_LZw<^{UUD8Rx>GWg*FfPI00?-NnGB-te+T@vn+T$f}HghhZn^oWxjuYZ5Zo=gA$ diff --git a/app/services/file_service.py b/app/services/file_service.py index 20d9929..0935831 100644 --- a/app/services/file_service.py +++ b/app/services/file_service.py @@ -1,11 +1,12 @@ -# app/services/file_service.py - import os import pandas as pd from werkzeug.utils import secure_filename from app.config import Config from app import db from app.models.trench_excavation_model import TrenchExcavation +from app.models.manhole_excavation_model import ManholeExcavation +from app.models.manhole_domestic_chamber_model import ManholeDomesticChamber + from app.utils.file_utils import ensure_upload_folder @@ -41,8 +42,18 @@ class FileService: print(df.head()) print("=============================\n") + # Trench Excavation save if file_type == "trench_excavation": return self.process_trench_excavation(df, subcontractor_id) + + # Manhole Excavation save + if file_type == "manhole_excavation": + return self.process_manhole_excavation(df, subcontractor_id) + + # Manhole and Domestic Chamber Construction save + if file_type == "manhole_domestic_chamber": + return self.process_manhole_excavation(df, subcontractor_id) + return True, "File uploaded successfully." @@ -51,7 +62,7 @@ class FileService: - # CLEAN & SAVE TRENCH EXCAVATION DATA + # Trench Excavation save method (TrenchExcavation model) def process_trench_excavation(self, df, subcontractor_id): # Clean column names (strip whitespace) @@ -101,3 +112,114 @@ class FileService: except Exception as e: db.session.rollback() return False, f"Trench Excavation Save Failed: {e}" + + + # Manhole Excavation save method (ManholeExcavation model) + def process_manhole_excavation(self, df, subcontractor_id): + + # Clean column names (strip whitespace) + df.columns = [str(c).strip() for c in df.columns] + + # If the sheet has merged cells -> forward fill Location + if "Location" in df.columns: + df["Location"] = df["Location"].ffill() + + # REMOVE empty rows + df = df.dropna(how="all") + + # Identify missing location rows before insert + missing_loc = df[df["Location"].isna() | (df["Location"].astype(str).str.strip() == "")] + if not missing_loc.empty: + return False, f"Error: Some rows have empty Location. Rows: {missing_loc.index.tolist()}" + + saved_count = 0 + + try: + for index, row in df.iterrows(): + + record_data = {} + + # Insert only fields that exist in model + for col in df.columns: + if hasattr(ManholeExcavation, col): + value = row[col] + + # Normalize empty values + if pd.isna(value) or str(value).strip() in ["", "-", "—", "nan", "NaN"]: + value = None + + record_data[col] = value + + record = ManholeExcavation( + subcontractor_id=subcontractor_id, + **record_data + ) + + db.session.add(record) + saved_count += 1 + + db.session.commit() + return True, f"Manhole Excavation data saved successfully. Total rows: {saved_count}" + + except Exception as e: + db.session.rollback() + return False, f"Manhole Excavation Save Failed: {e}" + + + # Manhole and Domestic Chamber Construction save method (ManholeDomesticChamber model) + def process_manhole_excavation(self, df, subcontractor_id): + + # Clean column names (strip whitespace) + df.columns = [str(c).strip() for c in df.columns] + + # If the sheet has merged cells -> forward fill Location + if "Location" in df.columns: + df["Location"] = df["Location"].ffill() + + # REMOVE empty rows + df = df.dropna(how="all") + + # Identify missing location rows before insert + missing_loc = df[df["Location"].isna() | (df["Location"].astype(str).str.strip() == "")] + if not missing_loc.empty: + return False, f"Error: Some rows have empty Location. Rows: {missing_loc.index.tolist()}" + + saved_count = 0 + + try: + for index, row in df.iterrows(): + + record_data = {} + + # Insert only fields that exist in model + for col in df.columns: + if hasattr(ManholeDomesticChamber, col): + value = row[col] + + # Normalize empty values + if pd.isna(value) or str(value).strip() in ["", "-", "—", "nan", "NaN"]: + value = None + + record_data[col] = value + + record = ManholeDomesticChamber( + subcontractor_id=subcontractor_id, + **record_data + ) + + db.session.add(record) + saved_count += 1 + + db.session.commit() + return True, f"Manhole Domestic Chamber Construction data saved successfully. Total rows: {saved_count}" + + except Exception as e: + db.session.rollback() + return False, f"Manhole Domestic Chamber Construction Save Failed: {e}" + + + + + + + \ No newline at end of file diff --git a/app/static/uploads/sub_4/MH__Dc.xlsx b/app/static/uploads/sub_4/MH__Dc.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fda6952c669fe5bd61f96cb40d41b8443f2de939 GIT binary patch literal 18335 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 INaO|mKP`33e*gdg literal 0 HcmV?d00001 diff --git a/app/static/uploads/sub_4/Mh_Ex.xlsx b/app/static/uploads/sub_4/Mh_Ex.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..49a17483cd8b0937ea71399577a310b16bee2d94 GIT binary patch literal 21552 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 literal 0 HcmV?d00001 diff --git a/app/static/uploads/sub_4/Tr.Ex.xlsx b/app/static/uploads/sub_4/Tr.Ex.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9bcd2db22474adc629ed3c69b283290814256cb0 GIT binary patch literal 18517 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 - {{ title if title else "IndustryBase" }} + {{ title if title else "ComparisonSoftware" }} diff --git a/app/templates/file_import.html b/app/templates/file_import.html index 211d753..68af913 100644 --- a/app/templates/file_import.html +++ b/app/templates/file_import.html @@ -21,11 +21,11 @@ diff --git a/app/utils/__pycache__/file_utils.cpython-313.pyc b/app/utils/__pycache__/file_utils.cpython-313.pyc index 495d14e1819b66f1aefc3101dc3388b4fe3ae04a..0908d0f41d3390983b2f77210e3237c436fca8e2 100644 GIT binary patch delta 20 acmcb~a+8JoGcPX}0}!P9S#9L@V*&s==mgjR delta 20 acmcb~a+8JoGcPX}0}#A;Xugr#j|l)l(go=N