From 81b21bc69b413b8748d44ebfe62342141cb42539 Mon Sep 17 00:00:00 2001 From: kerem Date: Fri, 9 Aug 2024 18:23:02 +0200 Subject: [PATCH] going on forwar added form dire in templates for more precise type handlin like date string and so on defalut havlues fo select is also working now --- web/init/static/csv/nbiotDevice.csv | 2 + web/init/static/csv/nbiotDeviceArea.csv | 5 + web/init/static/csv/nbiotDeviceStatus.csv | 5 + web/init/static/csv/nbiotDeviceType.csv | 2 + web/instance/test.db | Bin 19247104 -> 19247104 bytes .../menuDictionary.cpython-311.pyc | Bin 0 -> 1410 bytes .../__pycache__/theme.cpython-311.pyc | Bin 2538 -> 2914 bytes .../company/__pycache__/forms.cpython-311.pyc | Bin 3101 -> 3101 bytes .../__pycache__/routes.cpython-311.pyc | Bin 7026 -> 7283 bytes web/minibase/blueprints/company/forms.py | 2 +- web/minibase/blueprints/company/routes.py | 31 ++-- .../company/templates/company/account.html | 19 ++- .../__pycache__/utils.cpython-311.pyc | Bin 2372 -> 2842 bytes web/minibase/blueprints/database/utils.py | 7 +- .../__pycache__/utils.cpython-311.pyc | Bin 1660 -> 3175 bytes web/minibase/blueprints/geography/utils.py | 25 +++- .../main/__pycache__/utils.cpython-311.pyc | Bin 571 -> 1012 bytes web/minibase/blueprints/main/utils.py | 9 ++ web/minibase/blueprints/sensor/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 165 bytes .../sensor/__pycache__/forms.cpython-311.pyc | Bin 0 -> 10910 bytes .../sensor/__pycache__/models.cpython-311.pyc | Bin 0 -> 4986 bytes .../sensor/__pycache__/routes.cpython-311.pyc | Bin 0 -> 10040 bytes .../sensor/__pycache__/utils.cpython-311.pyc | Bin 0 -> 1893 bytes web/minibase/blueprints/sensor/forms.py | 117 +++++++++++++++ web/minibase/blueprints/sensor/models.py | 61 ++++++++ web/minibase/blueprints/sensor/routes.py | 133 ++++++++++++++++++ .../sensor/templates/sensor/account.html | 27 ++++ .../sensor/templates/sensor/index.html | 8 ++ web/minibase/blueprints/sensor/utils.py | 22 +++ web/minibase/menuDictionary.py | 29 ++++ web/minibase/templates/form.html | 31 +--- web/minibase/templates/form/boolField.html | 15 ++ web/minibase/templates/form/boolFields.html | 23 +++ web/minibase/templates/form/dateField.html | 15 ++ web/minibase/templates/form/dateFields.html | 23 +++ web/minibase/templates/form/formError.html | 6 + web/minibase/templates/form/integerField.html | 15 ++ .../templates/form/selectFieldHor.html | 15 ++ .../templates/form/selectFieldVer.html | 17 +++ web/minibase/templates/form/selectFields.html | 23 +++ web/minibase/templates/form/stringField.html | 15 ++ web/minibase/templates/form/stringFields.html | 21 +++ web/minibase/templates/form/submitField.html | 5 + web/minibase/templates/formAddress.html | 34 +++++ web/minibase/templates/formDiv.html | 10 ++ web/minibase/templates/navbar.html | 12 +- web/minibase/theme.py | 33 +++-- 48 files changed, 739 insertions(+), 78 deletions(-) create mode 100644 web/init/static/csv/nbiotDevice.csv create mode 100644 web/init/static/csv/nbiotDeviceArea.csv create mode 100644 web/init/static/csv/nbiotDeviceStatus.csv create mode 100644 web/init/static/csv/nbiotDeviceType.csv create mode 100644 web/minibase/__pycache__/menuDictionary.cpython-311.pyc create mode 100644 web/minibase/blueprints/sensor/__init__.py create mode 100644 web/minibase/blueprints/sensor/__pycache__/__init__.cpython-311.pyc create mode 100644 web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc create mode 100644 web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc create mode 100644 web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc create mode 100644 web/minibase/blueprints/sensor/__pycache__/utils.cpython-311.pyc create mode 100644 web/minibase/blueprints/sensor/forms.py create mode 100644 web/minibase/blueprints/sensor/models.py create mode 100644 web/minibase/blueprints/sensor/routes.py create mode 100644 web/minibase/blueprints/sensor/templates/sensor/account.html create mode 100644 web/minibase/blueprints/sensor/templates/sensor/index.html create mode 100644 web/minibase/blueprints/sensor/utils.py create mode 100644 web/minibase/menuDictionary.py create mode 100644 web/minibase/templates/form/boolField.html create mode 100644 web/minibase/templates/form/boolFields.html create mode 100644 web/minibase/templates/form/dateField.html create mode 100644 web/minibase/templates/form/dateFields.html create mode 100644 web/minibase/templates/form/formError.html create mode 100644 web/minibase/templates/form/integerField.html create mode 100644 web/minibase/templates/form/selectFieldHor.html create mode 100644 web/minibase/templates/form/selectFieldVer.html create mode 100644 web/minibase/templates/form/selectFields.html create mode 100644 web/minibase/templates/form/stringField.html create mode 100644 web/minibase/templates/form/stringFields.html create mode 100644 web/minibase/templates/form/submitField.html create mode 100644 web/minibase/templates/formAddress.html create mode 100644 web/minibase/templates/formDiv.html diff --git a/web/init/static/csv/nbiotDevice.csv b/web/init/static/csv/nbiotDevice.csv new file mode 100644 index 00000000..195fc885 --- /dev/null +++ b/web/init/static/csv/nbiotDevice.csv @@ -0,0 +1,2 @@ +name,device_id,serial_no,imsi,iccid,ip,port,user_id,owner_id,man_id,status_id,type_id,area_id +miniUni,24070580,24070576,901405710203483,89882280000107407542,10.128.24.42,50000,1,1,1,1,1,1 diff --git a/web/init/static/csv/nbiotDeviceArea.csv b/web/init/static/csv/nbiotDeviceArea.csv new file mode 100644 index 00000000..725bb338 --- /dev/null +++ b/web/init/static/csv/nbiotDeviceArea.csv @@ -0,0 +1,5 @@ +name,description +Roof,Placed on a roof +WashingMachine,Placed behind a washing machine +BoilerRoom,Placed on a the boiler room +Bathroom,Placed on a the bathroom diff --git a/web/init/static/csv/nbiotDeviceStatus.csv b/web/init/static/csv/nbiotDeviceStatus.csv new file mode 100644 index 00000000..d3cce468 --- /dev/null +++ b/web/init/static/csv/nbiotDeviceStatus.csv @@ -0,0 +1,5 @@ +name,description +Active,Active an running +Ready,Registered and ready but not registered to the network +Offline,Went offline due to a reason like no more battery or +Deactivated,"Registration is overdue, and thus Deactivated by the operator" diff --git a/web/init/static/csv/nbiotDeviceType.csv b/web/init/static/csv/nbiotDeviceType.csv new file mode 100644 index 00000000..4ef5686b --- /dev/null +++ b/web/init/static/csv/nbiotDeviceType.csv @@ -0,0 +1,2 @@ +name,description +WaterDetector,Sensor for detection water levels. diff --git a/web/instance/test.db b/web/instance/test.db index 70a8f4da6e5e987c8fe6d54cf2457e0e2b12a789..623d892aae1f8a43c90ef51cc89341ddeabe6376 100644 GIT binary patch delta 1397 zcmXxkWl)tt6oBEmf+!a8A&m+mcA$u@7@!!~U27|LVJpVk9rq(_#qRFzPV7eP?)E+7 z^~dwhoH@Jub7SvY9b+-w$C5O|x3VQ^q|(ZwRT{1Aw6fPKtyT_NrPC_CR*qU_&?=)= znY7BRRTizBv~t$UMJv~>%80U>F?Lm5%&>Bi9%i!DC}xJHmUS}2A|gG_BBl{)9$gY> z8>g5?aWm#tKHKNePMoF{L&S2a4JI)CCcdltX=VH7UnD zJfGxR&^9_JuyrpSU>lw>E3}3}8?;3`v_}VY zL??7c7eu2gx}iIIpeK5vH~OG2`k_B!FaQHF2!k;MLop1)F#@p|iBTAhG0+%`aTt#Y zn21T3j47CkX_$@~n2A}KjXAKwL>%IgfJDs2Jj}-eEW{!##u6+=5|&{(R$wJoVKvrZ zE!JT@Hee$*VKcU1E4E=fc3>xVVK??*FZN+S4&WdT;V_QiD30McPT(X?;WWBA!f*VUQu*vlkn6FU~Ov)4eT8GkhW}Nn?~&7Om1~l~${CTG?r3uT^@j9JF%O zDuY%|S~+W#QL9W^W!B0?D_5=DwkV@cTtF~S(7)vu931v<{r@UHCC(^iYOr9u5oT&I zI^GC1HJEC4u!7YnX==wrs}XK$@VnLIts@gm9-W+E^7A;`OzzmpW`vl!%wC(h%S`l4 zG~f;oWIUg8yA;|<>89p2*uKH?KT;|spx8@}TQe&QE?<4=rdq9qoRG?KKEbP_v> zy(GQFLE9cu2BHvP!Z^JSAQdZ;6k@SCU!HN?*GG diff --git a/web/minibase/__pycache__/menuDictionary.cpython-311.pyc b/web/minibase/__pycache__/menuDictionary.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e71bbd7b294e8d02420fe4cd37199e07aedbff38 GIT binary patch literal 1410 zcmah}Pi)&%7=O>P6DJ`JYz}p%Wo@}^88m5;&?Gdit0;?hnJ7DSbZsNIer>%ZPW0@o zv~r{#I0Pw&2o8-PdmnO@C#AmYSyDFFS^6)p7U-iZN zK3Rv(l#K|qN1ytdXv!E5YNo%m{AY1hh>?UJ)M6AH@R1jGF0$6=m z5iPMPj=*U^eI)}gywX$rzn(+f^_g!5|ErrN4$t>8Q^PwD)K==SMtPxcSn%E%Or5Z2 zj#+~frji^9sv1TcW)bg_(6(8~XE(JxGB9IiPe`!{X7`*75w2(uen-jY2wzgnZ4$sJ z?-_zo%4;U^8K^{jd88A+QYs-`B_dVEjz+Pf2SJ~j$siGNv1n##TM}H)mr)68x=DBz zBs`58MDRu+5n5j{wZ|yybqO&|O>7!ute=?Gl>#Dg(_mChp3B*L>Fr_xrE_REy``Dy zf~IThih-aH;vAok%%}R2N7>7XIn!wivJSRki-%bNSL?;OppD(H7s@Zp$|u z`9?Kz9F`j&bixyMc*1>6I*z?{6uZ`mUHkFE4{x?(Gfr%#8hRcctL}Y1SDR}nJzzB6 zn5tEpq1Nn^NGCdNN2lGXw_Ed167{j;i&L$*eeqp-y0>oIAAM}k+^1*#ZbNTN)2@_g z=#Dhq$~n^eN78&pn*Sx$mKGgp(UumwesF1`3%ED3@P)3=yW{e~-WPk#tL^dY&iM5% zfUzue<*8=Mk!OE;$C2lbP);@D5~W=x`ijH%l>4>RjRr^2%!st``*#z M<1p3*qslAvFLjncUjP6A literal 0 HcmV?d00001 diff --git a/web/minibase/__pycache__/theme.cpython-311.pyc b/web/minibase/__pycache__/theme.cpython-311.pyc index b4fcfef937f05138e1d0f5b94caa7d5166a81228..f495e65237805449c615c1c31259ab7cb733d43d 100644 GIT binary patch delta 1515 zcmZuxO>7%Q6yDkO&)Q!9cLuZh>$oGad1UXJu$QElqPic&HMS@^Xz-$ z_x7)mKaM3H#^X_rF8Acmn{UMKCC1n8Q0qPi93YLWBLyK2c!dW+5g?!hAgBZ(q=X=> zgh5n9p1a6Fg;ZZb50|{f2-9fof+%xUpP#S%2KSisTqY!OTOo>5Ekw8-7 z5LXhAP?C^TQjk)HU`QE;Fcw%83^R^LJl*5UD2&pC#@xWBLFy!Af6jl4GWLX!d8ZZ2 zs%Bo*zbW!vV@(h~vmWJ&=`Nf(W09sE=u2_1O?z~pZ z0x=q3+|u)wQLAaVHNBkOG;}L(sx7>feS5KCEoUp`>dhK4nmXjGhGvkZ>xOFm2YPi7iM`Id>IBnL2aGA^5B5f2ZhK#zbpm5Od2)B7E6+I#*ShjG4|u=5 z-jk{G53+(ZeVXv>!P1m+BV!q)1`JF2FIm{^tIECjqEC70dXlK&xFWSSjn}K%n z4iB`CJt;y&MGzfWu|uddu;RX~iICXgYlzN45>neR1j9Q5jKJtX8-rtT+{4Bp?Q69F z9T*uV1_xyZ^2FdkfgK1Z;nV=n4rK0Ce~qUDH%VJ`$_>=9-fWH3Rb8!oS~l@pFK5Pd z!yg&-Mp@r-0|nKzT2j?F7c^?k@NU4uw=Gv_63q=?A=or@vlXqEReeF#0pGU&4i=-X z$j&d8>)1XUnh!0|Ya_GvSD_zIiAS1{2-N3?uc}qc&WF!`a-?O>uwOIAw)r9b7uqkM zUUJT%G=ILEyznG>p}n?0p4&e$)hRlo%arVg;qo~-*U9{%Inp|%UV5r?d9UC|pHb?i zCp#;9ZytDZo&28YNS7$}Bf)ftwpl;L$vJyXe3zF`+jqsYi(VtMJc=`td)&J|dV343 zT9&?Q=w-6y)kMZv+EbL-PsB4DX=bs{r1t^x$G|J>aIr7M59$UqHM~MrX)x|FdYzSoOzrcoVOJ<8A2O!3H z@P>2X!hw^Th(_auo1VNFlOF4yh&MTv$jOs4+XWSzo%#Of{xdt@zuyzPP0^Q;h=%Cc z{qS`9i@FwVxj#>>bp*&jz!@Cy1`mQEfM|#y84}2b%%c$m$`b^k7d%3*>8cMy@gpjY zXh$NUwPI3HA#xXWMc;qrIZdFiUjdQX1V%Fp#U=9J}-W#KZvbdFpQ(%}xwvrhr6g+9lG4pd+B}uWr$!oNW^9$ukztE&xe&kqWQ5+ix+!n?qJehY) z*Y(2nOy9ul3bFqUI@6*Dz!cXe%~Cg4C4*ASO12`#tEp}uv#X=kRR8L&YAVfO$ah{@ z9c53w7<)ZW*WqAWu<`RVg>_^hN)Vz1QJR2Kw84WENEsBHgHT|pfn2G(wZIJ5Y#*ndSbyUE_mu4%Q4G#spxv@P^mC)7H!L2(h8h7uX_OufV>I><-$T8rN>Z0lT?hGSHE(!*K1Y>|uF+2Lkt;}8S?SMgiQKkL8e z{}sAgD8Yhb4d8y7OplM;EebV(<2dqG%T35S*H=TwVUPLt{{+&fIk|?8!yfbP|0m%0 F=x@lu2vz_9 diff --git a/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc index 61351cda4fbf9426cf91eb8b76337e40e4a689b5..bbd5348097b5bede9a7878b001f9a5b9ca2495b8 100644 GIT binary patch delta 37 rcmbO$F;{|jIWI340}yB!ZA%N@$Xmq0_+WAaN7&?aPUX!%IaHVdxikuw delta 41 wcmbO$F;{|jIWI340}#ZvOic6N$XmoQc_F9#7fK6rS~8)^Tit?Id>M*c(U!PLK$t{5Ah|_z484p!`MrxnBPgCt8J@ z2P*YIHLA)XRU;IokqA;MB*ewXUfN1sS0mN3gv6!yK-+uY?0VPUG*YvgJimGKz3H=vyRGYvp@t6uLzt!rwD3xX;{^=b6Vy zw5qEJrOc|HGo-*<`9QBz^%Vm`FW^u4#?T5VFVrc@F)3D^+|qb?!=@G~=IHSC?D$tT~)z6S_%5H*bNi+k|dW(O%CMXqKXJADn8HanK#KwEh>BW0ujHc3U*yk=c-!1aYc<$Gup$5kC6zMi+~?VeX zIufmnfY5XuLe3av1catn5xV0$_#MzPHYGmDR1lAtJ^2Tqt~KhD_|Ozb{LbeLNau5g zcg2kl&Eh4^6Y*~Ga&?w7<;*!|t!V`s@`cuv7m=<|&3ubKMx{_q6&~GIJ(z0<7`*53 zJNp>EX}4O+rs;4xil^+y2WVz92SGeS8wjvwklOdxE+{&F>NxES zg0Ij+#Xd?!>&|gPCpGNHqmHftj+(Uy{NZd!7b$fjDa;SV$piV5WQ_~=zq z`8pGlJl=#Lt+Ca}T0-hNqL@H#kB=r-0;kg-@s!!slHaZgubR(SHC!ql}Ksq-TW* zs#?<7DVq36cc3K>2D+V0uaS1>KNiH+zek7hQ+IoQ!%%&43P(x*7g8ieB7!6?{Eg5Y zbKLMAp@9Ifq4>`2Ur7PeI@xlC}hcS zOo~sF_=Do`0vTR_*PzJd2$utxov`gCxy^qXAfae66epoLw0E&HK{^vpOt5Fdc9eX1 z+PsAU(to+wf0guKg;~*ejrgur4px#|v5+IfH;co!$?$FH%_0{jTv!bv_g3LL8JsK* zg1inrRrKE={u=Xiw*13T?tQqF5%U5a(EFN3LzqnsA63#Y_ zU|UOH@LlskNg0QDNg1)bQj_rH#GgC-QsB_r?%q=Gp;B=FtMe_R408p4?fKYpf!4bN zb6z)Y^sqbUXmiQ;LHJC!g5BQB7J3(iAfEMln1xqgdJD|HBg}yf1me9B85$q^>CY%b On2`;Wx*{*j55>O#U!N}k delta 2925 zcma)--%s0C6vyrSB9IUu2|vq^{4g~9*haYvbdswVAaJGSwS&GLYCxt#mG z=YD+bbB^=Z*sG(S@9OL8D7b$4;{Gzz^rPpMt?gJ1MSVpHin@2*v+^r~6$PAaXxKhr z%hN?0YH{`!T)G2A<>{nDUnK#cU7$L3+oaZ3Rn$PgS*{ zs@hmpZK|Rc=%lxbOecL+Rsa9h68!)|dql#!WfcZ>FN)$Uob`bP_Tf*vXi9iPw<*da zyj59nHuPIJqtgaw^R~kOj@jxG)t1C2Rw*v@*rt7rZ`r!mlCK4 zOOj+0T!?Lgkj#Pyu}vP3W$gkFVplvk$8Aa&)qS9DS`X<92!OoSB!#|l^v{yoh;hxJYDiWfDAq&S)8X#9{?ZcH&e|Y0AqX>t{H8*dg@v(^n1#-G`ki@-!@6e z>zVO9q#jy$r7`#jOsLU)YTy_c*&s}xQ(`cujU8WcWb5emNNG$Ay-ief-+i`oOgTKR zOzJ`9V-g7P${XM((9iX~11G@LdEuC-j-8R>{MME2`O-%sb5xUHJ{a#^1CLo0)v*&T zE^RGuFO^or-gh(!=7aGj4ZKK7RL8H@?Qp5@hwx7kvH!Rx!F({@w1F46Dyn10S`2UX z0W%^7M>GlMgYjkzJSHxxW8d@csR!Z>oi^}7tf-Eia51`ddOKP=BZfyc31+?zt$Vv` z%J$VbA74X~cff8-q?a?u=9{1oqiG+5zV^2tQYxox<5+>^`@!S~lu7xm;)l@p-i~2s zBF*Kp0>4pqr{Xu*R4kqr62b4}YNGyb;fQAS6=R za_h}poZpy-&G-c<-R#BXXfCbLYL-?qiKTe9+@yL$Gpelmlxx@6L|QxVRd?t1V$imm zRqebI%_%h)P4=kr<&E|DpeAT%-`@*S(;8JLC7xVXRnTjHq7W*7;dw zeFi2p-rUp5fuTHZw$`fj)oTaktb0ivN15g>|8rNvpRUmFu8`znu#0&?y;-}A{%v_e zOXx}KWTA`MT(~oHckb>5S?$JMC!V}6vMZQf$81)b6!4?~9VrEKIG6*+v)J7&clU0t zDfZoqvf6LE5j?#hO<%*)*Pzd&a14iIuzw!A19IT-R)c1D$!at0j^k)din2J$icDcq zViqy82p;cYcTf&SaPWw>=$6%9+0EnGgfzQ~XIG&|q(}-!Qg>#sy9>K}<=!FOJHEFH z$!ae=&Eu0FOD7lb$pz>EDR31Bt^#llPRNFbRqK5B#AO^^l%gDta!~ma6UR)vYA9+M z?{?y;YtqzpJarw)R|>H>#De!Z?Cz0!`Zhn)>`oc|-8$@-8(Qwzo;7rfJ)_V12Iav~ z`S9T5OKnrM;}ghKIgElGe)OpQkmEyT8B~|g+kFn@vrU#x)ZB5!p`@1|LpM9x=uaPi l+3}PfIzb
- - + + +
- - +
-
-
+
+
{% include 'form.html' %}
- -
-
- {{ info }} +
+
{% endblock content %} + diff --git a/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc index 46588e72f5f7870706af364eb5ab7a24cce54f97..c988bdbb39df26c748fd60e40f605c128f7a05d2 100644 GIT binary patch delta 1118 zcmZXT-%Aux6vywKUpxE5NnKqnHB1Xy2vhoLhO`*025m${x-aYQ-dWw;+0{F{55k5U z7z9Nk^C0vPz4Y4$C5Y&y9(srfQW28*4|-~$w;<@88C}s1J0I@(G3TE9ox7hKABVIT zb#*=h_Ilu5rXnqBt#h}*TOy1wnj;2{Q;KULCm3Q}q(mT5!o+#Pq~`)5Z{Tq)E;$() zGRnS;%slfXt}qqoVP2rhd_XVr-yq?@PizpTw!l(ANlGV8eRbhJRSrO$*IOMzwWS%B zuLuueqzR!ou#SqoUMGnD;zHlsN1{q6R7`picr@-u1P~1f4dM2NRaoJT7zhIFK)S@a zo-Zb*lM^~WvZv6*Ejk@@M`*VGN_WR`_ZV-%(l*5Ih=RX zDaP?_-UR^ZWj$x=2@nLeveg1-I!~l#xrDBeWww-08oDhe&2(6F1(TVc8DX|3Jz2=6 zb<@PbKq5yVJ2X?$`D_f{xs}KkCok)nWGPo1Vf+MCp-$!yphC8^;KQjOTGxiw_3ZS^ z=H=Fvn;YQ^?;~r+2R~h3>yEB>M>o5pU*vDT@7h;weRy~p3f70LtI9DNvP@X2>1n5@?K5X`$y|C;H(b@-Ywlbm)XX^*$H6$Z+c*0k^`cQ=rJO#<2Ox{Hm>&UE zky5%v+Sc5kwW6v`yY5cBDp?=YYgg(88my8UR7%^cqy~l3R&=+a2)Ozm&Y$2PB%#s6`{p4dAxTWR@!Z1hxjXY|bTgk@#7A{?Bid zgXJPo*H(7Dm%35}kr(bfNA^)6gAnvo_oS>fcE2>sTQymvdZ)4FAT8<@jT}%p`(S~l zt;<1b9VU2-G)j~}TNFCtsM>Ik`zUo_i^_@+(!+gDy|@#QRT=(uaU8j4N|TOEP@hxX z@%{R4*MxwJ%4#IcU{^u4IXP^&L+XhiebO%0n~R(zziEOggckkWqP|Ly);U%hBDR}F zX-r)umiG1aJU8g^>y3J)+^Wr%o6X2m|8jjv$}cH`q=Q{4|MHLij@a9-Ez3DnX=>{n pAv6KtkrnRWKcVBmaL8g%C&|^Z48TapI=}()L}TFUUovk|&j06$f=B=W diff --git a/web/minibase/blueprints/database/utils.py b/web/minibase/blueprints/database/utils.py index 25a5a6fc..2aa93aff 100644 --- a/web/minibase/blueprints/database/utils.py +++ b/web/minibase/blueprints/database/utils.py @@ -1,5 +1,5 @@ from minibase.app import db - +from sqlalchemy import case class table_printable: def __init__(self, table, link_for_item, item_to_be_linked): @@ -19,15 +19,16 @@ class table_printable_paginate: self.item_to_be_linked = item_to_be_linked self.paginate = 1 +def queryNameWithDefaultId(table,defId): + choices = table.query.order_by(case((table.id == defId, 0),else_=1),table.name.asc()) + return choices def dbAdd(dbClass): db.session.add(dbClass) - def dbCommit(): db.session.commit() - def dbAddAndCommit(dbClass): db.session.add(dbClass) db.session.commit() diff --git a/web/minibase/blueprints/geography/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/geography/__pycache__/utils.cpython-311.pyc index e0bc12fab48dd66637a1e1a110faf9163603592e..6a3198d77ad18bf979a84ddf77a59fa0b92c088a 100644 GIT binary patch literal 3175 zcmd^BO-vg{6rNpsu`w_NC~1D$6fm@Lm0&3Wk&p@r(H3zbYAK?zDk0mmh7G$mnO%ok zG7^U#x#vnFeu|(Hr>eL1SVfg;TdRUr>Zyk+HzaO3^}Shp?KQ2MN>N*>qup=kf8TrG zoA+j~qa#9~d^h<`=I05{}7w zixEo85;4L8TN4q{AJE&3_C!0>gI|zD2U7qkYXR(JA;1eP4A{k50lQfQu!pq)zQ*J^ z5^H~sLc|m&G?mL|EnaYfQ<_z9lsPMDsZPts>XMerI<0g06c^RmnB)Z0NmET%r57Ji zjRfF5D*`+rmgschp;T*Z)fBFEh_7!h?jgz+?s%^3LeGKMy9+xXc)PEYBAFxm(rirO zxQ(Mc%B!GHILDdF7gL~FHfg9%AZe!eB`1_#&S`1YG;xEz7nAYjoT0{7)Ixkov*L!9 z)l#5jd`(T&8!0`nu5vAFneinxx5SgH%Y}H}(sXlpwcvD#|5eR63%@dXH|(vzYrYGx zL4KjVo5nF6tkA)oh3(Idhej(yqvfG7duXgo@7VOt#`H;B_r~lQ%qD41GiZ4B9ftcHofID$3McTQ0p9{m;E|4650=1pqu&${p4uK7mD0d>V*-Q-vX})^)^)ep?+O1 z%Jp#cC*eK>%c=!tqu8Pp$%^<3lQJ@s4+H-21vAlQMcG0L&XuOr0DIMg-&Vsv>kEt0 zVX!HM1d0L3iOMWTQJy1jkSP>ZH`PT*dtnoE;-bc4Vcz6LVVLU38mq?$r!}MLmPkDN zL4FCx!yk$sjX8>yOzEl{S8=C4C~hRVRwb-p38%ZC5kaNO8-(H;FdH4wOaOorM(D-| zCk@eMfcu48ZjB+Se3X z?`NjOb*s*792VhUJ!U&!0kf;03uX&8Ei^J4>vaZeSDfMct!CJ})eIXs25v9z0j{qL z-SOmcJWS5OA1!A|@N2j=4U0RG6RGd)gll7tA_he+aw6s2}Ar2TMl{5 delta 482 zcmZ9IOG^S#6vyY@d8ngaYYf!FPzhpIJs{}Cv~bZ%Texc@){G!n;++v1FtTVJ$OWNR z5m7`zAE9l_jG*ufw6$#%bna*noyG5-d-$K{d;BXzuESwf0J}eGmqpwrakSi?&Lr`% zu&J0L&}T|OzbOL)rcw}eU;AQ~rNj=aqZ4@)awR6=MV1yj;Q;(}nac1`l|6{DjE%rg z(Gg%TQg2w)EjT5|%9nO5n~p&=z`n&fq%ou<&?O7WE!_!0*BZMHb&C~KSB4!yM1ve5jxeAXC|9bEMT=Xmj(fOb(g;Lt3`h;9iv62v zqnzc1LoQ8#iWjk$7?!5SUy1QdjK|CqF}fu8LUOJ3x1iR_Q;j9Xv)|n%NEqy%{<}Nz zx@0SkJ6L@JWE$(rGd>NxysolSb!~z2b9!g-np3X25h#~fFM diff --git a/web/minibase/blueprints/geography/utils.py b/web/minibase/blueprints/geography/utils.py index 468d76f0..b697cfd2 100644 --- a/web/minibase/blueprints/geography/utils.py +++ b/web/minibase/blueprints/geography/utils.py @@ -1,20 +1,39 @@ from minibase.blueprints.geography.models import Country, City, State, Region, Subregion - +import minibase.blueprints.database.utils as dbUtils +from sqlalchemy import case def queryCountryNames(): choices = Country.query.order_by(Country.name.asc()) return choices +def queryCountryNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(Country,defId) + return choices + def queryStateNames(): choices = State.query.order_by(State.name.asc()) return choices -def queryStateNamesOfCuntry(id): - choices = State.query.order_by(State.name.asc()).filter_by(country_id=id) +def queryStateNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(State,defId) return choices def queryCityNames(): choices = City.query.order_by(City.name.asc()) return choices + +def queryCityNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(City,defId) + return choices + +def queryCiytNamesOfStateWithDefId(defId, Filterid): + table=City + choices = table.query.order_by(case((table.id == defId, 0),else_=1), table.name.asc()).filter_by(state_id=Filterid) + return choices + +def queryStateNamesOfCuntryWithDefId(defId, Filterid): + table=State + choices = table.query.order_by(case((table.id == defId, 0),else_=1), table.name.asc()).filter_by(country_id=Filterid) + return choices diff --git a/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/main/__pycache__/utils.cpython-311.pyc index 518a7e88c448c1721f7ab74ffffe18731f21c3a8..e26819fb8034bf595e47bc4c82cb6951a484704d 100644 GIT binary patch literal 1012 zcmah`L2DC16rS15ChNwm(xNCu4PKf>$zIfhZF3ModdVe-kc(_~r)G6GX=ipR3n}E_ ze<*nBDNRLj%k%GhhZv#X z!kLRQGbXRVI7S}waDYNw$5_}(poFTcU=(Jg*6LXqSA$%r*LAQnpHcmWr-3#+rG~8R z9|34#ZtS+am_^hltO{<%br^AHpUEQwT7^C7fI3Ez3{KTYsB$VN^ZMoid9LIN3@Il9 z@tX7?(ods3K<=mLN2r5p=oD8ijS3j99mIqtTyIm4(D#jmXIf53xau$$ddRuWw(k+itc)Vt*ou{lSmy&~Nz-Xwp6;jfK+)VzN*DR>bVk@mqEr`2j2MCwxtQH6tmh z!Z(Z-05=DlJpt84Kh1kX^Wmkrd0}pz8Q*SQmbNZRTj!;nVQJ^wtPIUc_suB3)~!w; z9l2>+;H2cf1P91nx?7MNEfLm1J)pXu(tU(GxQ1vJo?9xGFcyvLLq{wmlNC=_nunE6Z~tN6e@!$H0vR0N3YtT$7jdwkX_S2Z0l~O%f(l zuq8(%>pexX9@*cOz71c;0jbapND^eT7}QwB7?044!Ri{JXM_K(Uua{ny2e=rua8lx M^we6!geA-R3yq=i;{X5v delta 194 zcmeyuzMF+_IWI340}!|*PfT0NFp*EfPy)!C&XB^8!kEL5%NWJT$dJO+!Vtxj!W_(? z$?_7USd;MmzWW@_=ou4#;#lNA{|S-F97ER)wWS}^-*GEY9wq!w2M5?aYn z!~>*?KoE8+)o8G*Ri07!gbW@Kc%!C-a)6@6f1Vif+sfJuN&1OV~x BE7Je~ diff --git a/web/minibase/blueprints/main/utils.py b/web/minibase/blueprints/main/utils.py index 31d86177..73656b88 100644 --- a/web/minibase/blueprints/main/utils.py +++ b/web/minibase/blueprints/main/utils.py @@ -1,6 +1,15 @@ from minibase.blueprints.main.models import Industries +import minibase.blueprints.database.utils as dbUtils + +from sqlalchemy import case def queryIndustryNames(): choices = Industries.query.order_by(Industries.name.asc()) return choices + +def queryIndustryNamesWithDefault(defId): + choices = dbUtils.queryNameWithDefaultId(Industries,defId) + return choices + + diff --git a/web/minibase/blueprints/sensor/__init__.py b/web/minibase/blueprints/sensor/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web/minibase/blueprints/sensor/__pycache__/__init__.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0ad7e0a12c8a9e86ad0f637be646ac86d633812 GIT binary patch literal 165 zcmZ3^%ge<81i$8ONdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCUl#fq`MIh3 z*{PNK>6s<^X*r3-*_rtz`XHQ?Q<_>(l$lpjtY4g(SDas@A0MBYmst`YuUAm{i^C>2 hKczG$)vkyYXb{M%Vtyd;ftit!@dE>lC}IYR0RU0nC@=s3 literal 0 HcmV?d00001 diff --git a/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd81fa6fd8916cc3e77ab41b881a20bea381dfa7 GIT binary patch literal 10910 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 literal 0 HcmV?d00001 diff --git a/web/minibase/blueprints/sensor/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c4b692e23c9587353278c3b770758a5bcc95fdf GIT binary patch literal 1893 zcmd^9O>fgc5Z!g0CaqN$3KS3pB0ef2kyxUH69Tn-sY2?37DOXKl6p7P)K1FUK}{*B zNc@LhITfn5H@NWwI69H5RF=5FskfkV;>3)tgoYjv9ARZY@63*$*YjrQO>b`xfwBGh zU9l+<@&%3706Q2vqwrWJj4)~vi)N`MWhE<;jaYJ4rs$W$;Oxr7-vzy zZq^0Z!(tO88Q(^_r0grDX`}31=T8lt`}=np6HdXY*nZzG*JO2$cQ{4_FC?ii>jj(Z zG}vGW5qRLeQv_HhPUsEraXapH>!)_D60%6v=?cWG{ftAVJ!1ttYi%$5k~F?beaT=+ zS>OwP^ht$_s^48SOoxlybk&a*4PiT?8&+*(Pkhg4Gi8fwv%IQ3G90aF7VKF_hlcmG zS>bcSC^@!f^O9W_TE#I;J3R-S0rhBgjEO$r=|aMD088YPGTho!7XdJ)<+}ojlL!BApuKMwFX2&n065cOw)4KVB9r5Jce4 z1s1(8mkJj5BL!PumHckKA_R9zW6Y1~Gi9hu+eXerLZ}$rAEZAl&}-qkI0g&IWM=_D z2lb?bqmw3rq?vx)AUVN@z_Fxy{NMnUkTxK zMEVv!!0H=C190iqmeRj8F7^Tazp0$)hhGDsuml33#37uuH4+189!59<(4ok_KoRT@ zEj^Ay2%e3d+W@G?aZf$nP|w%Z^Ba@zuX@8bJ|3+P-*G4Jx)<)b4<5RyTrHLJQn}51 z*~>eP{Cqt>U&}9e`GuPL%u}EJKLX&%`#S-!AGZWZ0LwvSI)Q*?JDybhLFjDhpPelo zcDA%tW^hh}z8N0Wpa^gyevkdcESUNXx2j<+psK-f6R5FB0IY@|2u|ns_+?", methods=['GET', 'POST']) +def edit(deviceId): + if deviceId: + device = nbiotDevice.query.get_or_404(deviceId) + form = updateNbioDeviceUpdateForm(current_device_id=device.id) + form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(device.user_id)] + form.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(device.user_id)] + form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusChoices(device.status_id)] + form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeChoices(device.type_id)] + form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaChoices(device.area_id)] + if form.validate_on_submit(): + device.name=form.name.data + device.device_id=form.device_id.data + device.imsi=form.imsi.data + device.iccid=form.iccid.data + device.ip=form.ip.data + device.port=form.port.data + device.registration_date=form.registration_date.data + device.activation_date=form.activation_date.data + device.deactivation_date=form.deactivation_date.data + device.owner_id=form.owner_id.data + device.user_id=form.user_id.data + device.status_id=form.status_id.data + device.type_id=form.type_id.data + device.area_id=form.area_id.data + db.session.commit() + flash('Device has been successfully updated', 'success') + return redirect(url_for('sensor.edit', deviceId=deviceId)) + elif request.method == 'GET': + form.name.data = device.name + form.device_id.data = device.device_id + form.imsi.data = device.imsi + form.iccid.data = device.iccid + form.ip.data = device.ip + form.port.data = device.port + form.registration_date.data = device.registration_date + form.activation_date.data = device.activation_date + form.deactivation_date.data = device.deactivation_date + + return render_template('sensor/account.html', + theme=theme, + form=form) + else: + flash('You need to select a Device id', 'alarm') + return redirect(url_for('sensor.list')) + + +@sensor.route('/add', methods=['GET', 'POST']) +def add(): + form = updateNbioDeviceAddForm() + form.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserChoices(1)] + form.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusChoices(1)] + form.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeChoices(1)] + form.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaChoices(1)] + if form.validate_on_submit(): + dev = nbiotDevice( + name=form.name.data, + device_id=form.device_id.data, + imsi=form.imsi.data, + iccid=form.iccid.data, + ip=form.ip.data, + port=form.port.data, + registration_date=form.registration_date.data, + activation_date=form.activation_date.data, + deactivation_date=form.deactivation_date.data, + user_id=form.user_id.data, + status_id=form.status_id.data, + type_id=form.type_id.data, + area_id=form.area_id.data) + dbUtils.dbAddAndCommit(dev) + flash('Device has been successfully added', 'success') + + return render_template('sensor/account.html', + theme=theme, + form=form) diff --git a/web/minibase/blueprints/sensor/templates/sensor/account.html b/web/minibase/blueprints/sensor/templates/sensor/account.html new file mode 100644 index 00000000..c4116c30 --- /dev/null +++ b/web/minibase/blueprints/sensor/templates/sensor/account.html @@ -0,0 +1,27 @@ +{% extends "base.html" %} +{% block content %} + +
+
+
+
+ + +
+
+
+ +
+
+ {% include 'form.html' %} +
+
+ +
+
+ {{ info }} +
+
+
+
+{% endblock content %} diff --git a/web/minibase/blueprints/sensor/templates/sensor/index.html b/web/minibase/blueprints/sensor/templates/sensor/index.html new file mode 100644 index 00000000..17a2ec48 --- /dev/null +++ b/web/minibase/blueprints/sensor/templates/sensor/index.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block title %}iot{% endblock %} + +{% block content %} +

Hompage of iot

+{{ info }} +{% endblock %} diff --git a/web/minibase/blueprints/sensor/utils.py b/web/minibase/blueprints/sensor/utils.py new file mode 100644 index 00000000..b51bfb79 --- /dev/null +++ b/web/minibase/blueprints/sensor/utils.py @@ -0,0 +1,22 @@ +from iot.blueprints.sensor.models import nbiotDevice, nbiotDeviceStatus, nbiotDeviceType, nbiotDeviceArea +from sqlalchemy import case + + + +def queryById(id): + return nbiotDevice.query.filter_by(id=id).first() + + +def queryStatusChoices(curretnId): + choices = nbiotDeviceStatus.query.order_by(case((nbiotDeviceStatus.id == curretnId, 0),else_=1),nbiotDeviceStatus.name.asc()) + return choices + + +def queryTypeChoices(curretnId): + choices = nbiotDeviceType.query.order_by(case((nbiotDeviceType.id == curretnId, 0),else_=1),nbiotDeviceType.name.asc()) + return choices + + +def queryAreaChoices(curretnId): + choices = nbiotDeviceArea.query.order_by(case((nbiotDeviceArea.id == curretnId, 0),else_=1),nbiotDeviceArea.name.asc()) + return choices diff --git a/web/minibase/menuDictionary.py b/web/minibase/menuDictionary.py new file mode 100644 index 00000000..d449c09c --- /dev/null +++ b/web/minibase/menuDictionary.py @@ -0,0 +1,29 @@ +import os + +def generate_blueprint_structure(root_dir): + blueprint = {} + + # Traverse the directory structure starting from the root_dir + for root, dirs, files in os.walk(root_dir): + # Identify the relative path to the current directory + relative_path = os.path.relpath(root, root_dir) + # Skip the root directory itself + if relative_path == ".": + continue + # Split the relative path into its components + path_parts = relative_path.split(os.sep) + # Check if we're in a directory like user/templates/user/ + if len(path_parts) >= 3: + if path_parts[0] == path_parts[2]: + blueprint_name = path_parts[2] + # Initialize the dictionary for the blueprint if it doesn't exist + if blueprint_name not in blueprint: + blueprint[blueprint_name] = {"directory": [], "html_files": []} + blueprint[blueprint_name]["directory"].append(blueprint_name) + + # Process files, specifically .html files, and add them to the "html_files" list + for f in files: + if f.endswith(".html"): + blueprint[blueprint_name]["html_files"].append(os.path.splitext(f)[0]) + return blueprint + diff --git a/web/minibase/templates/form.html b/web/minibase/templates/form.html index 57920858..2854705e 100644 --- a/web/minibase/templates/form.html +++ b/web/minibase/templates/form.html @@ -5,33 +5,12 @@ {% if item.id == 'submit' %} {% elif item.id == 'csrf_token' %} {% else %} - {% if item.type == 'BooleanField' %} -
- {{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }} - {% else %} - {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} - {% endif %} - - {% if item.errors %} - {{ item(class=theme.form.input_error_class) }} -
- {% for error in item.errors %} - {{ error }} - {% endfor %} -
- {% else %} - {% if item.type == 'BooleanField' %} - {{ item(class=theme.form.check_class) }} - {% else %} - {{ item(class=theme.form.input_class) }} - {% endif %} - {% endif %} + {% include 'form/stringField.html' %} + {% include 'form/selectFieldVer.html' %} + {% include 'form/dateField.html' %} + {% include 'form/boolField.html' %} {% endif %} {% endfor %} -
-
- {{ form.submit(class=theme.form.submit_class, style=theme.form.submit_style) }} -
-
+
{% include 'form/submitField.html' %}
diff --git a/web/minibase/templates/form/boolField.html b/web/minibase/templates/form/boolField.html new file mode 100644 index 00000000..aa69cfc5 --- /dev/null +++ b/web/minibase/templates/form/boolField.html @@ -0,0 +1,15 @@ +{% if item.type == 'BooleanField' %} + {{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type == 'BooleanField' %} + {{ item(class=theme.form.check_class) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/boolFields.html b/web/minibase/templates/form/boolFields.html new file mode 100644 index 00000000..0649be71 --- /dev/null +++ b/web/minibase/templates/form/boolFields.html @@ -0,0 +1,23 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type == 'BooleanField' %} +
+ {{ item.label(class=theme.form.check_label_class, style=theme.form.check_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type == 'BooleanField' %} +
+ {{ item(class=theme.form.check_class) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/dateField.html b/web/minibase/templates/form/dateField.html new file mode 100644 index 00000000..a350e9da --- /dev/null +++ b/web/minibase/templates/form/dateField.html @@ -0,0 +1,15 @@ +{% if item.type in ['DateField', 'DateTimeField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['DateField', 'DateTimeField'] %} + {{ item(class=theme.form.input_class, type=theme.form.date_type) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/dateFields.html b/web/minibase/templates/form/dateFields.html new file mode 100644 index 00000000..ea6a0c85 --- /dev/null +++ b/web/minibase/templates/form/dateFields.html @@ -0,0 +1,23 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type in ['DateField', 'DateTimeField'] %} +
+ {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type in ['DateField', 'DateTimeField'] %} +
+ {{ item(class=theme.form.input_class, type=theme.form.date_type) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/formError.html b/web/minibase/templates/form/formError.html new file mode 100644 index 00000000..fb6de25d --- /dev/null +++ b/web/minibase/templates/form/formError.html @@ -0,0 +1,6 @@ +{{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
diff --git a/web/minibase/templates/form/integerField.html b/web/minibase/templates/form/integerField.html new file mode 100644 index 00000000..128d4dcd --- /dev/null +++ b/web/minibase/templates/form/integerField.html @@ -0,0 +1,15 @@ +{% if item.type in ['IntegerField', 'DecimalField', 'FloatField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} +{% if item.type in ['IntegerField', 'DecimalField', 'FloatField'] %} + {{ item(class=theme.form.input_class) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/selectFieldHor.html b/web/minibase/templates/form/selectFieldHor.html new file mode 100644 index 00000000..e3f2590c --- /dev/null +++ b/web/minibase/templates/form/selectFieldHor.html @@ -0,0 +1,15 @@ +{% if item.type in ['SelectField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['SelectField'] %} + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/selectFieldVer.html b/web/minibase/templates/form/selectFieldVer.html new file mode 100644 index 00000000..fd8227e4 --- /dev/null +++ b/web/minibase/templates/form/selectFieldVer.html @@ -0,0 +1,17 @@ +{% if item.type in ['SelectField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +
+{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['SelectField'] %} + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style) }} +
+ {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/selectFields.html b/web/minibase/templates/form/selectFields.html new file mode 100644 index 00000000..456e0a39 --- /dev/null +++ b/web/minibase/templates/form/selectFields.html @@ -0,0 +1,23 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type in ['SelectField'] %} +
+ {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type in ['SelectField'] %} +
+ {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/stringField.html b/web/minibase/templates/form/stringField.html new file mode 100644 index 00000000..060fd3a7 --- /dev/null +++ b/web/minibase/templates/form/stringField.html @@ -0,0 +1,15 @@ +{% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} +{% endif %} +{% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+{% else %} + {% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item(class=theme.form.input_class) }} + {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/stringFields.html b/web/minibase/templates/form/stringFields.html new file mode 100644 index 00000000..26e5e47f --- /dev/null +++ b/web/minibase/templates/form/stringFields.html @@ -0,0 +1,21 @@ +{% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item.label(class=theme.form.input_label_class, style=theme.form.input_label_style) }} + {% endif %} + {% if item.errors %} + {{ item(class=theme.form.input_error_class) }} +
+ {% for error in item.errors %} + {{ error }} + {% endfor %} +
+ {% else %} + {% if item.type in ['StringField', 'TextAreaField', 'PasswordField'] %} + {{ item(class=theme.form.input_class) }} + {% endif %} + {% endif %} + {% endif %} +{% endfor %} diff --git a/web/minibase/templates/form/submitField.html b/web/minibase/templates/form/submitField.html new file mode 100644 index 00000000..9c91323b --- /dev/null +++ b/web/minibase/templates/form/submitField.html @@ -0,0 +1,5 @@ +
+
+ {{ form.submit(class=theme.form.submit_class, style=theme.form.submit_style) }} +
+
diff --git a/web/minibase/templates/formAddress.html b/web/minibase/templates/formAddress.html new file mode 100644 index 00000000..856c7194 --- /dev/null +++ b/web/minibase/templates/formAddress.html @@ -0,0 +1,34 @@ +
+ {{ form.hidden_tag() }} +
+ {% if itemList | length == 1 %} +
+
+ {% include 'form.html' %} +
+
+ {% else %} + {% for labelItems in itemList %} +
+
+ {% for item in form %} + {% if item.id == 'submit' %} + {% elif item.id == 'csrf_token' %} + {% else %} + {% for label in labelItems %} + {% if label == item.name %} + {% include 'form/stringField.html' %} + {% include 'form/selectFieldVer.html' %} + {% include 'form/dateField.html' %} + {% include 'form/boolField.html' %} + {% endif %} + {% endfor %} + {% endif %} + {% endfor %} +
+
+ {% endfor %} + {% endif %} +
+
{% include 'form/submitField.html' %}
+
diff --git a/web/minibase/templates/formDiv.html b/web/minibase/templates/formDiv.html new file mode 100644 index 00000000..d3979c9d --- /dev/null +++ b/web/minibase/templates/formDiv.html @@ -0,0 +1,10 @@ +
+ {{ form.hidden_tag() }} +
+
{% include 'form/stringFields.html' %}
+
{% include 'form/selectFields.html' %}
+
{% include 'form/dateFields.html' %}
+
{% include 'form/boolFields.html' %}
+
+
{% include 'form/submitField.html' %}
+
diff --git a/web/minibase/templates/navbar.html b/web/minibase/templates/navbar.html index a59783d0..2726ba78 100644 --- a/web/minibase/templates/navbar.html +++ b/web/minibase/templates/navbar.html @@ -14,7 +14,7 @@ {% if item.sublinks %}