From 7a02213046633b68d8132e49e7829dc9b9da4e5a Mon Sep 17 00:00:00 2001 From: xiaji Date: Mon, 18 May 2026 11:34:15 +0800 Subject: [PATCH] Split maintenance into host and battery types with separate forms --- ups_management/db.sqlite3 | Bin 180224 -> 180224 bytes .../__pycache__/settings.cpython-311.pyc | Bin 2665 -> 2665 bytes .../__pycache__/urls.cpython-311.pyc | Bin 1172 -> 1172 bytes .../__pycache__/forms.cpython-311.pyc | Bin 0 -> 4577 bytes .../__pycache__/models.cpython-311.pyc | Bin 7668 -> 8782 bytes .../__pycache__/urls.cpython-311.pyc | Bin 3680 -> 3860 bytes .../__pycache__/views.cpython-311.pyc | Bin 15478 -> 18879 bytes ...0004_maintenancerecord_maintenance_type.py | 18 ++ ...ncerecord_maintenance_type.cpython-311.pyc | Bin 0 -> 1012 bytes ups_management/ups_manager/models.py | 8 +- .../ups_manager/battery_maintenance_form.html | 155 ++++++++++++++++++ .../ups_manager/host_maintenance_form.html | 141 ++++++++++++++++ .../ups_manager/maintenance_list.html | 32 ++-- ups_management/ups_manager/urls.py | 3 +- ups_management/ups_manager/views.py | 21 ++- 15 files changed, 363 insertions(+), 15 deletions(-) create mode 100644 ups_management/ups_manager/__pycache__/forms.cpython-311.pyc create mode 100644 ups_management/ups_manager/migrations/0004_maintenancerecord_maintenance_type.py create mode 100644 ups_management/ups_manager/migrations/__pycache__/0004_maintenancerecord_maintenance_type.cpython-311.pyc create mode 100644 ups_management/ups_manager/templates/ups_manager/battery_maintenance_form.html create mode 100644 ups_management/ups_manager/templates/ups_manager/host_maintenance_form.html diff --git a/ups_management/db.sqlite3 b/ups_management/db.sqlite3 index 59c4acd39024ba4730e6297b71f6eb3ae4e505fa..d1d2b2ce4a2ea79541da673550ad74f5c593b6f3 100644 GIT binary patch delta 1780 zcmaJ>Yitx%6uxuz(e6AKShi_Pad}H0!@cvK@rSMmjcL%X7`udEDX^(5+bt`l)DV(_ zF_egC(}WxF9StU6Vo7b6hmn88fA~Wao5&wiq(&3t4?|R9yfeE{pkT6hb7tnA@0|0U zbH3qWVR%@0r*T0EA=JuFGdmnRn@3x9u5^C;r%EWvuOF+4w*bF>A{|%wWF{FwE4HTh z@7>qk*Hi52&Ao~-HfW{`7B%@E)Eiao`hx$c42_U1IKS#8*CBTfqIp00bQt!gH= zG-u*uLow1I$kRyqMfpy-th}teshn2Yl!UTT{zsmkSeBZS`Bm{yrZyE1wb#;27Mdb; zO2~}S(he>$mRR>Impp=}Fvoq{D4ayR(2T^tl@Vo$JT5;YO^L_Fq;OVfW2Fe0YAPRjzMIAh&9!W!mK4as#S#N3|T5upQ2a<^$AI-AXyV^?M_em(Qmhcg#W&rVLx z9-ElC@E$QOjEO-^)`R;7R~Td&hejc!||r*G~(eZl0y;*??=^eI&>h8rmj^z10)in#;b-IWQRGr3lJJ;VC8Eengw-)w;v zE_AqaJ^i8!nrXBP2<5ZT=35Cm)CFew^k#T66lQ%nOUJult^ef^^LX0#*h+u&FHifI zJF;L&>6*I!cJ6R#cX3y4D2PnYWr1+3==Ch@lLuIO?d{x1Z;)Q)`@t>H#I=@BZGjLh zY)vhHV3+CmHmECa+Q9*oKiCF4p;4GZJfGpDyz(}m5l_gc1Y1e+SH#=WG*gNee&t|D zVEYy$%hH9ah0^I*J;5r`4As?CqFWUAL#oo&SNcH?cF^+J8nPSMz^pMhFMl~Z{_bGy z9ju2TV0x_p$?5`Ewgx+vW7rkvLs90uCT6l7u7=lC*HwvO(4YEX(|z;r5H`Qg&Cf<} zymdnQ9{oTs?STxtF&KVC0|(wC9t^mY;CC+@DFW~(k!5w}_bLpu=AQK&-AV`C1A zuTbLS1ywn|78r)AW7jaNc!gLcqyL8yn8fWVfE1{L>*;LCb=9>DOLOV2J}51f+flf{ zKOD-ycZ&-&QlbCu0V&`sfFgvo(R56!!ZRDr7idQjo@+Q5VSsC6>*g3|4L4Lm2z{{# z9d|kvD28b{gy=WUpTBwR;$Y1~SZ4D=Fcte?V^9QBnn2ogCRL7B9_fdn)M%#=Tg$>f e&dw^f`@bn?K7zO?u}2j5|IkYI_IG8pGx8snXR%5E delta 1044 zcmZva&2JM|5Wx4%uD#yfxBKkWZir1Jr%+IVzmWeBkON9fWK;gCZ@P*%XH|3MG!fddj8P^h?o+Dj-%U4H~*sVl8^-s(4_ zc{9ICMX6MjsYE2paoo1XOZ;!o^frrR7YBb~d`zCXB8ImvbtH%6rI~ms@Ug_A9Q%v? z!5*>0>^z%eoh-`sE=304Xjh^;UXs|jzN{1SdqO?Q$x4!=Z`dSj(XMHm)Ok8isWPJ^ z{c?hWNd;umfgKduNDLQ>unt%AurBDjj%(?7M1eS!%M#@_w-aJ;|3f;iYZ@j#tCCVV z)I^%~VwPjNZn|15D%IoADG`5S(1U{`5W>e4v=-A%>gg`a>9XzZnY8JqEL^2u)MJc&6kx=~$VJW8iBQ;&QMYpxo93AvA;eP$fZ?~j5W#mj5V7Yg5WSlRV2XHiIoQJs-|z1d@yVC)D~{%13%@^8 zJAH-=2f@INIq0lLQT(J29O7bs9~{DG2mQZK`=DFe=ZLM{-DEO`dOz$TpL(PHz=PLw zlmK`)zJ_Cv@E0H}%b@1jCALBHv~KlJ`i@S~4a&0b(3~O^WQD_r1?a5~PK_Iu%?X8kJz-OACkfL{>!#U2 z#b#6=fxS%Sz02NF2| diff --git a/ups_management/ups_management/__pycache__/settings.cpython-311.pyc b/ups_management/ups_management/__pycache__/settings.cpython-311.pyc index d9972fdf6b84af999907e8420401ff1fa5a0ba05..f2f85874f1214c3b954b5344318cabba3724f719 100644 GIT binary patch delta 21 bcmaDU@=}CnIWI340}!lh;>y~{6UzkvL!y~{)4>7&H3|g( delta 21 bcmbQjIfavFIWI340}wE&f5_a()4>7&GK>V> diff --git a/ups_management/ups_manager/__pycache__/forms.cpython-311.pyc b/ups_management/ups_manager/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d30c99b50bccb6ae3b60ea7ede4a0338116dde7 GIT binary patch literal 4577 zcmd^C|8G;*6~E8+vmM*{>Ns{YC>g{ghQ)x!RG^48BZ0s~$`q0Y3)Or0-UQR<=j^`c zr9@EDsZ&F{sz}QOKcs8gb&QA(Wm>nPcHPwf;2Bxs=}D714MOvqQ9z3LY3DpUw(||N zsoM|R^?e`TFXx_n?|Ju}&%3{=uJ#Z}H-F+e`}Z0`{(+UHR8=f2Ohe%cp@a%DNeMAQ zz_LxYrR*^~liJOk*n7HPiJyNz)iVmnf(!prcq>h(h5CVI(F{60=#W7GTx3Yc^N| zJcSgqQ~Mhv=AaH(iD-I@x(~rhmZ`Oj4MP@o!z#*ZnLXx!%?Te0F_GHPpj4zz>Y{Ec zOu1rCFoWx?ducLSMLkJ01L(McyRp*ODzo(J!Qj+KtEX&V!)!IQme#GKX~{0|lGoas zWd$#-2jez8uB$L^^cd5mh|3gDb4j75m`YP7o1WxIT%wdSRW;o|%1DZq)Xtf1Ih~NS zWLhx;vZQM9l$2C7rbtSH#i^t*)0Ido8XS@g9<6&nfBpWYpB0L~eEZ(Jf6Ac!j~u@@ zHGA*9@kb~!_lw#2H{X5aL+RgMotym2-Ot~-|M|^F4bX7+)?0HQe{lb^PwxKpy}2uY zoWJr(25tJ)>y!6?|JmJ7KQ+Y!EJ7Xg;pyzaiFsO{fx`=Dk*lV#YsSW#V1Q{)C6%#Y zrBn+pb|jg2g>h@{`SDA0Z_mtK`Ssk?`%9y|BeIlWXVNldyf@-A-SN00rC2;}dg5^~ zQbxwIFCGW$$b}w`TjJF?r*kODWU87@Svt*Rm8095RVUc1+7V?WqnX~`OzJe_g^II} z$t(eGG@7KtOjBpb0*I5xdwcesQkguYrPK1M%!t~NRED^OC9u3A4YL$ew2CS}WjShe zzd8Yk*ndU9kan(QGMqTz4>Ui`Dm{B zs1b@>6?35owEp0PzOx^5XdoLJ$b|-sP}@~;s`mQmtr|UgSP%7NLp`}rj}hKI-TzTs z?|xZNU(la_4RiQnHheJ`zGwuuT+U3Mzy928ufFY|9_-2nyK=!UShyb-?)OZ%@W&&t zdA=PWQSx-CV0gl}vhZgB2+ab7W0E2lAT*yRXG@aPr2qwDr9|z^BgX~Xc^ltbMa~P; zsB=|1Z=;Uo;cj{;+@g` z+zB4M9Xyx~cISfKdR_P8-~1c%M5qpw!KiDz?8w`pZEx7{>I7TQ7FchfY2N*B?^0r114(4ijfNc-U z9p7?`jc|ZhL17-8A^}e+EuEx=-OyBK#HSN2(5*;CU<9Y>Ei(8jy7d;PS=a+EQC9w6 zrCZ#wm7YkYl~O>I>(J!C_6bl&>uJMNHLW9MQLcyj!N84=>naRvQSOY3BkdLGVw5F^ z&uF|BTj~HzUs6#uNtP{MwcI&_;`b;2F!#IZBC}RB6!;Zm#r&J^0HwCSG92N4)Yb@K z4ZU~s(pSIwX@TT;0K1SK$2Ke@#>z^En&LqevG0uTiWJGzp#pRAXK;8k_U)(~(NbA~ z;T1gFak}t{$T#3nbokzgccoh)S6K$(o3XS70iz9XMF=CbA*^sZ%Nt*SjtD$z2OQM0 z(-pZ+(d#iI*KIK%H*GF*-G*&Ick6JS{+&L3`w2bJpAGcq0{tbjTiM>!cA4dx+VnjG z`VW~N9m3o+oNXG;H4QIup1yBTm#DszVGa#tLqoaHP>J+#X!IpLG?)zy=0bzUhV56o zr(V?er}Bhc6pq>8@7uj)-1wsH0U>}7Ei94bk3p`-Hh_ZrUn=9)K@FEklaQ1++}0S}y)j@yL^YlCtfUO53l|Pw zp%TSGDtCa0>9p>5YT>Ga@z$(5hBv-LAX4~x!THRZ3TyT;ZAHX=?A~9v0UhASK^g)s zQFQ?Lm=Xkog!JXvAW?mJHb|?!R?a&&3GnH&8ZL(?cRaxMhvm*LA%eoIp&$(H56hi{ p0%>T|>$e&XFXpO7!{aq-{f769ZsmNns{x`Uz(a)b8vI!=;GY$^Ru2FG literal 0 HcmV?d00001 diff --git a/ups_management/ups_manager/__pycache__/models.cpython-311.pyc b/ups_management/ups_manager/__pycache__/models.cpython-311.pyc index 5d99660b67397fdaa0c01649c992dc4e65f1d938..09eaefd5f82d396b75a2b84e2b801627a4e58ea1 100644 GIT binary patch delta 2675 zcmaJ@TTl~M7(SajNk~EnkO0~!R80#38?Ceg7P%-F(Ggm0)MjGN8iFy2XE!PoCrrz9 ztffM`&frvR^PsddFpiGxj8oe2wbO@Au$htBCm$612m?>NwEx+_a!K2h-EYtS|My?c z+4G;1rTu?2nZD1>)gx$IujzZAmagSliNo=C-uCEv0Ld^4c)tYVe_id(jU0(8tKo!dqYLi8!>iZ3gYcT{@R&(z zvSNT>fY}%Y7NxdxnQ<;N{!`1$nPsMOnc20>xLjIMeU|tmSX5t#Vm2)5!mvj8P&6WH z{IM7d3VkT%^J7d{juZ79?KMb9Zvj-2>0c>YkR>Jr2y29ZZ)Ul*F=wDsbRSZF5wmq-(}loi&TVs zS8l04PYfqgx~+n#xJFpYeY-dSN$!W6?4UrGIH48M>9PxTy5b#PDmX>qBLLCZ8sXU> zOIku~7?XA?KMf$_bZ>PbLSO| zx}Aa40T+}=V;VZSBGPEougxPFERRfNgn}z`!UQC!Tu2S)2)hmW+Cq9xdW(d1gCk+bcBp=bn0LegG>#50e==F@Tf|$|{Nc z>f!XuZ@+M<2%UIQ8|aCK0xU-wC>4(Ly@+7wg3IO=3F;>OwA(~s4?rf4HmPx?aeK^F$!u~#TRk-J9uAvK=qvsIpTh_v7R?kzbXU4iWZQYwP2jF^K{!3-1_ghoC z!=LGRK1UC zw1Fu7@VwwEsXj?dfl#2^7S{mPHz@y}>zuQ?vU#=AsY$6y=k>_GYxGjOXy=2sQU^|? z{K0vIE;G#vc-UJM3lc6#m{QqySw8xAi}`O=!QMi|*r@s5qDoJZMkOEYdfP{CIy^N5G^51qNt4>K1xc6TUxBD*2c339Fb5;c@nPFvfn66gH{+?IxjBlx<^w z9Ey5Eq&Eoza)wUk^H?s&9gQ8hL}+Ehl0#u;y{-^eK)* z9LE4>lVLU{$DVziJEl3N0JiUyqNUI2bkfiZ#FpP)(u$U0E!%RTl-DeyRAh#FiEYR+ z_NVH{&#=GLhoPEFl=^C@0Y#8{YV5gS@J?^AAmUlJ9v;GJRtGr{P} z3@B+0=_rc{$_fI~#RV4x)|)PY<=(Rht_Yi;tgVK+vYsd6Wr%NT#EV2Eu8OoNK@N1M zWtGQr;z;)%NOJEbu^*N8SBa-0Kd$+#zrIFbZ%xv4Aflxnp*A8E;;s0Y>J6;~8$OXV zSNxk$30sY7$hMIHRA)#)FCo&hiirBee3-OCbp&m7N;5!EMXi|EXY_oD5}JX9K>}&` zqx>^)j`C8bDGsjFB_H57R_XBJ9Q(FolJ!PT$ghD9k`~!&Jl)OTlF5Y(rP3O{*_Q@(B4ZILhc!8zpB1_Q~mLjMk z)di(j)Sa%YdtFlZx~T4RMcwB@aH`z}mb8m3X;)a%psLhYh+ffjxvuGRNz><|rr#A! fzYC$67g(|`vSeLh$@*X}!_U;f4T41$Kwkg=oSC-Z delta 397 zcmbOt_drH{IWI340}y;u`;ghm&cN^(#DM`xDC0BNMs-#;u5{5TsTBQS22F#_b!?7I z!UDO8nRz9td5L++srrd2Df+kgC-ZX_GD>f5$I=L$;>RFV1$ v(JPu>*ENGKX$D=?47s8iav?fj@&Zf2MV5jqECnA-rTLi}xIwVU4Cp`ritLIB diff --git a/ups_management/ups_manager/__pycache__/views.cpython-311.pyc b/ups_management/ups_manager/__pycache__/views.cpython-311.pyc index 19ff530f58457b66c976ae349227332862e66389..2c5eb347fbfbc79de3bebeab1fb1ccd16ea9683f 100644 GIT binary patch literal 18879 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 delta 4374 zcma)9eQZ&i(MuLH_qK=Nk@(Rl?7o!}C%5`j?!()c0~E>6{diB63WM%K zOO|q^T~fsKB`IQ74L``0q$~JjK7lpNS&+*^E_FYd&!iPen`+GJSiqbeIfrV>;@r$R zk#ni$EY8E+8szeI&J?DYEI`t&Gw5Z`gIuA`pu(INIYnpC$D9wjBAvk^=8BOkVSCNX zLsQJ;S|r!$43;ogid-3#%F6z7lqz(?uVbxB zm~Hb;TMV)++or9?3A3pfwL}Sg#a^1X5yiW5xoCp7?QQuU>Mp0{W15Uox$we&>^r=V zqO92vCZ!KTv%^nbi%d$w2Lq0EvIh=3%4 n@68HtcH_X+87=kPb7sM8-;_wN#KIF z9W`<_%sF-`g`{sfG7%C7wX``rnn zYqmqEu@S!LSp(NR7I>q^CmUg=rb#xzJfax}3l;cFqc_+1rUlAt{m^c9aW-j7uG6R`7Ul*;)tnVEtD zuX`&@L)fg{h5yxtp;I~kG)=^B6@%1`DDeaV1wZ4=FiB4$q-|rNgV97NsRo}pE;w>~ zh#Nsz9;m(4NU$49>WX2|w=EN_z3@@%Q}8F>BPpEK;$+j-=vXimi3nBGL^pNqK}Z*3 zE|S4`D2iE3gc4yj7(v6C$?Zdhq04y>b~$Z&Hmb%Vn#iN!Y}$A@j2439A|^_yAO$Co zGaIE>f)GA;HbZxV$JsPFc*_x;<-f^3I9=q)Od?8?7|!22JhFRKOYR*bul7aN32~SP zIYPkhi3EvRhBRs;I7Grx0`@|~L5sjyb!3qH`YjKh8c#`#QTHqZ+EQ@M%NQ^sCh~^8POBz`3BPi_a4T2o4ZX1qup^-^4{Ho~4E^f~7uO zY9?&EztV2jR>&vdzqP*|S-HS?A@fj+1tt#C$g3CD1knWJSXlcqvzp+d`mnAgwOCQ2 zm-LoO$sSE;$q=q;uAn%QY0LPS7CeLr6vyy&g<8t;j>5Tm)K3s=CHy)*nF4|f{>qGp zC)mT1dUxmZr1t^=TNRTeW@Ye2Y9ly9!bt)ykrx+Aqy?_lcl2|AeVJr=O_jf5nVcem z;1$@`urcH2DK3wh1}u;1Pa7`CT}#O~E=xYmP<(@606{Y%P~PutF!=i1+FsmxLt%Kw z>ovVjN@sAdSqt6`&#h7lyq$NUrg-R5m?CY03s?&E;Am>h%wmdz4NWbPMMu*{6}OR? z_$q3zkm)Sr56<*yGE49yd=?VDW8*@iPqXcxZgh9PL~5KsHY(22dsd>)Q5(U#B)m+( zi9WZO=+ABH7~%f+ za}7sZDoxjr)?VfW|G4FaRT9icbr%iv&_bY{XB-|YpEr#xC{Yx(&mK& zgsv#@kT@c~jjbyrJIj#=C;K&Wf#7%e+}VsUiC_5VmZnUty@u|50iNG#>-;`xQmJR` zic2JB<@*Y?5!@!>G6CoN%0j-IVNKii$JlRuzO(#ZHQ#U1umpdX;9G4Ae!fL3+gmia zbe8T>!=oZH5Y>{<*i#Dq?Q55v3B|S8KW$B_;X{dNI2uZ%E!z0lSS+dv_~ zFIlgpRH)Q?rNQLwa!{vIg|Q3l#AxrMexvN|3lQa3BrHjqYXl^yAWo2 z4DH2@vj*i>foJmZd4t2aWnOwXz~%mj*8S^Bbm8n3>cY+CE^O+lOkFmK6nXj>0VOBB z26xT-E?*0GYP^JV2H!!Y6_!}mq(^DIRqORCu>{6k8P^zG>1oTXt*f{yo(kyQUUuQ) zee)+Y0DB^SMq<{Yo1r!WD-JK-qc>i3Gxruwnwi+{u(epx<6%#k4Ds(mbqcuN!dZbOPp=cZw$Ua^PQCMi+rc!tB>Hz z2Hz6s0OvE1Pb5A|c(3PelQ%BjZ+Ji8lHy2j;drovS<$*{*@mu-$JFiOS2#3A41Xr% zO458T{>Fm?JBQ)MPA|;vEP#T(lMwBzpMI~eGN;}xV>RmGqUB?1{bY%1gaiGG`(pja dl0k0%gkYY*N$oio>tUk5j{beOzt})g`#<^ox_$rv diff --git a/ups_management/ups_manager/migrations/0004_maintenancerecord_maintenance_type.py b/ups_management/ups_manager/migrations/0004_maintenancerecord_maintenance_type.py new file mode 100644 index 0000000..4c49edc --- /dev/null +++ b/ups_management/ups_manager/migrations/0004_maintenancerecord_maintenance_type.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2026-05-18 03:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ups_manager', '0003_alter_upshost_brand'), + ] + + operations = [ + migrations.AddField( + model_name='maintenancerecord', + name='maintenance_type', + field=models.CharField(choices=[('host', '主机维修'), ('battery', '电池维修')], default='host', max_length=20, verbose_name='维修类型'), + ), + ] diff --git a/ups_management/ups_manager/migrations/__pycache__/0004_maintenancerecord_maintenance_type.cpython-311.pyc b/ups_management/ups_manager/migrations/__pycache__/0004_maintenancerecord_maintenance_type.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0821500e1ef49e2d034378767febc950ed846681 GIT binary patch literal 1012 zcmZuv%WD)d98NN`vpdr**jiAuic}HTM=98o6!AqB(SisbmW7zzWM9l<&CH6u_28l4 zr3axG5xrEzA`}$F9{d;f&_l`9+S1#U_SBQVWV^LmlgXFgGx_*3ANu<}1mpdz*E~TG z`l+4X$m|*06JX3EjyU#FfQvXFMS>AQcM&Hq5w`?xTD_(Pus-d3MT^^yQ6aOb(*>fu zpiz@7X+&YHoFL-Dk1M@Sy&E#HZ*zcoBv27^R3seNaM2=2*v%d(xSH#T)6D8dJ-E#? zHNqX9<+(+7!3H9*x?|D%n;4vz<9$FauiS?{PC&4)-HK_zLRJ$}9UmJTyGog#2uUGc zkK%-uB@4M42v{RbM99L5kfIVvu8tfC(PX+M;51vewDUk=?c4JDo9`RTU)FwnhD5f^ z5;%3*0G|knPi>q1hz+n>h0)LvSo0`V4AgE zZwmqJXh@+J#w(I_t);f!2eqQkn()Sd=wH#gB$|GGQ_E`}99 k0Z1*3F_6cF4!UsoOPxG+Qgj&Ryp<#8wsd0WKUs6{Zw=2OAOHXW literal 0 HcmV?d00001 diff --git a/ups_management/ups_manager/models.py b/ups_management/ups_manager/models.py index 8168565..569f9fc 100644 --- a/ups_management/ups_manager/models.py +++ b/ups_management/ups_manager/models.py @@ -90,6 +90,12 @@ class Battery(models.Model): class MaintenanceRecord(models.Model): + MAINTENANCE_TYPE_CHOICES = [ + ('host', '主机维修'), + ('battery', '电池维修'), + ] + + maintenance_type = models.CharField(max_length=20, choices=MAINTENANCE_TYPE_CHOICES, default='host', verbose_name='维修类型') ups_host = models.ForeignKey(UPSHost, on_delete=models.CASCADE, verbose_name='UPS主机') battery = models.ForeignKey(Battery, on_delete=models.SET_NULL, blank=True, null=True, verbose_name='电池') supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, blank=True, null=True, verbose_name='维保供应商') @@ -99,7 +105,7 @@ class MaintenanceRecord(models.Model): created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') def __str__(self): - return f'{self.ups_host} - {self.maintenance_date}' + return f'{self.get_maintenance_type_display()} - {self.ups_host} - {self.maintenance_date}' class Meta: verbose_name = '维修记录' diff --git a/ups_management/ups_manager/templates/ups_manager/battery_maintenance_form.html b/ups_management/ups_manager/templates/ups_manager/battery_maintenance_form.html new file mode 100644 index 0000000..25a9d73 --- /dev/null +++ b/ups_management/ups_manager/templates/ups_manager/battery_maintenance_form.html @@ -0,0 +1,155 @@ +{% extends 'ups_manager/base.html' %} + +{% block content %} +
+
+
+
+

添加电池维修记录

+
+
+
+ {% csrf_token %} + +
+
+
+ + {{ form.ups_host }} + {% if form.ups_host.errors %} + {% for error in form.ups_host.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + {{ form.battery }} + {% if form.battery.errors %} + {% for error in form.battery.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + {{ form.supplier }} + {% if form.supplier.errors %} + {% for error in form.supplier.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + + {% if form.maintenance_date.errors %} + {% for error in form.maintenance_date.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + {{ form.technician }} + {% if form.technician.errors %} + {% for error in form.technician.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + {{ form.content }} + {% if form.content.errors %} + {% for error in form.content.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+
+ +
+ + 取消 + + +
+
+
+
+
+
+ + + + + + + +{% endblock %} diff --git a/ups_management/ups_manager/templates/ups_manager/host_maintenance_form.html b/ups_management/ups_manager/templates/ups_manager/host_maintenance_form.html new file mode 100644 index 0000000..f1f9d55 --- /dev/null +++ b/ups_management/ups_manager/templates/ups_manager/host_maintenance_form.html @@ -0,0 +1,141 @@ +{% extends 'ups_manager/base.html' %} + +{% block content %} +
+
+
+
+

添加主机维修记录

+
+
+
+ {% csrf_token %} + +
+
+
+ + {{ form.ups_host }} + {% if form.ups_host.errors %} + {% for error in form.ups_host.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + {{ form.supplier }} + {% if form.supplier.errors %} + {% for error in form.supplier.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + + {% if form.maintenance_date.errors %} + {% for error in form.maintenance_date.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + {{ form.technician }} + {% if form.technician.errors %} + {% for error in form.technician.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+ +
+
+ + {{ form.content }} + {% if form.content.errors %} + {% for error in form.content.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+
+
+ +
+ + 取消 + + +
+
+
+
+
+
+ + + + + + + +{% endblock %} diff --git a/ups_management/ups_manager/templates/ups_manager/maintenance_list.html b/ups_management/ups_manager/templates/ups_manager/maintenance_list.html index 145a4ca..1dddaef 100644 --- a/ups_management/ups_manager/templates/ups_manager/maintenance_list.html +++ b/ups_management/ups_manager/templates/ups_manager/maintenance_list.html @@ -6,18 +6,22 @@
-
- +
+
-
+
-
- -
- @@ -26,18 +30,26 @@ + - + {% for record in maintenance_list %} + @@ -51,7 +63,7 @@ {% empty %} - + {% endfor %} diff --git a/ups_management/ups_manager/urls.py b/ups_management/ups_manager/urls.py index 31f713e..70ad666 100644 --- a/ups_management/ups_manager/urls.py +++ b/ups_management/ups_manager/urls.py @@ -25,7 +25,8 @@ urlpatterns = [ path('supplier//delete/', views.SupplierDeleteView.as_view(), name='supplier_delete'), path('maintenance/', views.MaintenanceListView.as_view(), name='maintenance_list'), - path('maintenance/add/', views.MaintenanceCreateView.as_view(), name='maintenance_add'), + path('maintenance/host/add/', views.HostMaintenanceCreateView.as_view(), name='host_maintenance_add'), + path('maintenance/battery/add/', views.BatteryMaintenanceCreateView.as_view(), name='battery_maintenance_add'), path('maintenance//edit/', views.MaintenanceUpdateView.as_view(), name='maintenance_edit'), path('maintenance//delete/', views.MaintenanceDeleteView.as_view(), name='maintenance_delete'), ] diff --git a/ups_management/ups_manager/views.py b/ups_management/ups_manager/views.py index 468ea55..cc2eadc 100644 --- a/ups_management/ups_manager/views.py +++ b/ups_management/ups_manager/views.py @@ -285,17 +285,32 @@ class MaintenanceListView(ListView): return queryset.order_by('-maintenance_date') -class MaintenanceCreateView(CreateView): +class HostMaintenanceCreateView(CreateView): model = MaintenanceRecord - template_name = 'ups_manager/maintenance_form.html' + template_name = 'ups_manager/host_maintenance_form.html' fields = ['ups_host', 'supplier', 'maintenance_date', 'technician', 'content'] success_url = reverse_lazy('maintenance_list') + + def form_valid(self, form): + form.instance.maintenance_type = 'host' + return super().form_valid(form) + + +class BatteryMaintenanceCreateView(CreateView): + model = MaintenanceRecord + template_name = 'ups_manager/battery_maintenance_form.html' + fields = ['ups_host', 'battery', 'supplier', 'maintenance_date', 'technician', 'content'] + success_url = reverse_lazy('maintenance_list') + + def form_valid(self, form): + form.instance.maintenance_type = 'battery' + return super().form_valid(form) class MaintenanceUpdateView(UpdateView): model = MaintenanceRecord template_name = 'ups_manager/maintenance_form.html' - fields = ['ups_host', 'supplier', 'maintenance_date', 'technician', 'content'] + fields = ['ups_host', 'battery', 'supplier', 'maintenance_date', 'technician', 'content'] success_url = reverse_lazy('maintenance_list')
维修类型 UPS主机 电池 维保供应商 维修日期 维修内容 维修人员操作操作
+ {% if record.maintenance_type == 'host' %} + 主机维修 + {% else %} + 电池维修 + {% endif %} + {{ record.ups_host }} {{ record.battery|default:"-" }} {{ record.supplier|default:"-" }}
暂无维修记录暂无维修记录