From 15d9a3a76f0222934b39baed96bc9b82a39085fa Mon Sep 17 00:00:00 2001 From: teddy Date: Mon, 14 Oct 2024 11:42:51 +0100 Subject: [PATCH] fix: Updated Store for Product Categories, Products, and Product Permutations pages for tweaked architecture for controllers, datastores, and python data objects. --- .../__pycache__/base.cpython-312.pyc | Bin 4168 -> 4040 bytes business_objects/base.py | 2 ++ .../store/__pycache__/image.cpython-312.pyc | Bin 5824 -> 6018 bytes .../store/__pycache__/product.cpython-312.pyc | Bin 28382 -> 28569 bytes .../product_category.cpython-312.pyc | Bin 30241 -> 30382 bytes business_objects/store/image.py | 3 +++ business_objects/store/product.py | 10 +++++----- business_objects/store/product_category.py | 2 ++ .../store/__pycache__/product.cpython-312.pyc | Bin 2608 -> 2623 bytes .../product_permutation.cpython-312.pyc | Bin 3831 -> 3855 bytes forms/store/product.py | 2 +- forms/store/product_permutation.py | 4 ++-- static/css/pages/store/stock_items.css | 10 +++++----- static/dist/css/store_stock_items.bundle.css | 10 +++++----- 14 files changed, 25 insertions(+), 18 deletions(-) diff --git a/business_objects/__pycache__/base.cpython-312.pyc b/business_objects/__pycache__/base.cpython-312.pyc index 5f33a95bb2989a43af0792d39b779de0ffb2f013..ad5c69b4e5ee9a1d5bf09cf101db09d2aeb294f3 100644 GIT binary patch delta 160 zcmX@1a6+EZ5J z*96KtBk{E=T{K-cXR(}M-ki-5$;fEE`6#CXBct8sXIv7DjE7}x|S$MWCfHDcuY!~i6U{DC$C0RH$WNdN!< delta 286 zcmX>he?o!xG%qg~0}vRk<4S+Kk++bM@!95j#(t)l6vrsFRF+g$NuXpZTZ*O)kWO)m zQb!Wg28pF=q&T-QtOl|`AWAb;E5!wguML!UMdIsJx@o#^c40ZeY*{6hmzbNXn^;m( zl$lgolB%0uP?DLSr(2R*QBoz1U9K!Kr!;jl4@V>;qvhr_P6b9ro6YT95{!)YlNWH? zGwM!$zet|`DhQ$KsnYNc%+;8Z3USN@$;jtii crtf7I&j+jmlkf7~<27L9`osVviu{540mBkdrT_o{ diff --git a/business_objects/base.py b/business_objects/base.py index 6d6c9a9a..6a2ee579 100644 --- a/business_objects/base.py +++ b/business_objects/base.py @@ -51,8 +51,10 @@ class Base(): FLAG_URL: ClassVar[str] = 'url' FLAG_VALUE_LOCAL_VAT_EXCL: ClassVar[str] = 'value_local_vat_excl' FLAG_VALUE_LOCAL_VAT_INCL: ClassVar[str] = 'value_local_vat_incl' + """ NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'name-attribute-option-text' NAME_ATTR_OPTION_VALUE: ClassVar[str] = 'name-attribute-option-value' + """ @classmethod def output_bool(cls, value): diff --git a/business_objects/store/__pycache__/image.cpython-312.pyc b/business_objects/store/__pycache__/image.cpython-312.pyc index 1ecc355a28409ae78430d999626f25df7196f38d..0dfe173d1c00b47f10606a7368c99c92aa846fd7 100644 GIT binary patch delta 1683 zcmah}O=ufO6rPcGS1YYnvMtL$vK<@8v049+lqQa4Qd7lpVuSx8%c;8w*(lkqYNMZa zB$v8S3?-$1hbGLSPD>$|9)jJ5;9H=7w?d$prckrsLkd0Q))bdQPknC`*FSC3f&FIQ z+wZ-3^WK~Jrthtzq5HZXATYk#4rT{yZiE`>$2Yp-FWJ;qa)G>NYLs}$Sz`OH5nFZq zt6n4%Vg`lQ588kuEyOC?z36yWrHX8Z1XlxYaMklf7haMK{qDU68Z@Y@4(BqZ()kSI zKhSR#6)0|uSIJTSh37Ncyq@-UP#WS((j}_$O{u*)3XBp3Xk*oYEW|bW1a0LBd4Wdw zn!Kj!pf+Tt^2V!eM~hghg;Iw#Hx?LLGnKcT^ESRQ|QEartKm@FU_7liI}e%o3ZLUPp4|Mj$(i z?KuUr?KORSbQ0=3#8DS;#{&bjwFgun+VYz6cT%-Iwiw;+Kx00nHnl+A{@cA^=>Ny? zK|Rq2-%z6?>cXMjU3ONsZxyQpV`nz2p5nD#>|65`hKT)A#1B1qjhMAI^qm>C1Aui) znh|v6v3w@$xZXvUbEA`qi4iN2PN%G?>Gastq?I0-OS|g4ZOsc--9HHD6XUZZ>!13A z)bK;l3~vO}03KlrKavp?07GR4Osp4x{}g}*>&BI=4bW;nq@APF{JNHhMtZ0>uGa@! z=@DeI;|To-NM{2GVSt?$<`?u9dXX>bSsGb?sCQDTb2S{VM`JfEPBNCXrc+bN+2J%h z&ga61;^@v*&x|L|TC=Hf;n=MaVsdO|dOY!>HI+(^r2b{IJK-j3^ZVg9ma$nUje6Dr zGdqINiO_?9$927>GIPV0l_?a8%;$;7*`oC<`(k>*Ed!uJ6VT`#8i%Z z0!boBWv0yL3)xDDzSG5G&dC(mNkU$Dk_v2kHiU2np$lR6f{BD9JPTjxJAk*zX3wz= zsc~iC*6_{e9!SSFd;2$}*vjawnVS<2q<+3xb-QvAjrDh`@6om?FoIVm@S2rjS*yJC zio>Qs#m=E#VGTSJIT=OLu9^*^IKw}WG%4bq&++dg?X=7vM=nEsQ?=v$;)(IH{dR`L zs?c)3wuISgg8}c&kF|aDP40=dU%)dO{sY-}z4L`K8--u4bOmz7=Fr_mly%FxitprA zCzrD{f*Qc53t0#y1vMreGCG;WcOUr2O| sG;J#}+P#w8CNX-rdwVcW1Mi;xaP+;=>kHcigg;)VHT0R^2!JU0U&h@>H2?qr delta 1541 zcmah}&2Jk;6rWk|m)GCMcI`MJkqK=#RhyOq!F)uxPMQSL7Mw&VR>k0ESC+$i-HshZ za%lxQfW$}BkqT#SC6y5J1#zKVxbPp06bT`5D5n6fkT@}KXq`5+Fw*|!&2QeDdGmX- z^WONaqtPED5etd-^T$fPo7jqG@h4k{ilYjeL5{wO9K#K62fzWLswG)dut8T{&1_vA z%7rCm2`aR$+;xkrt9JP7AF`PJioeGOyQzGK^Ib16igAQ(sc#BuS1n{x!o7_JjL^71 z8WFH@oV^~%ut{wIKhBo5Rh(q!l^omAm>Cw+wnh#1u0A}Nhk-&9qT_ngZC-F`8@3-2 zYq73g!bjL0eO5$I8b^vbF+m3aAdC(IK&0G}7KC*J(IgNu4+AWKH2cCBzbq$UxFWuO z)9zY-d?QZq8FEn-JE*EC$PKKTeXqVDSgCTKkcNYADt*=ThsWv&mbBOvGe2ZJ+~qzG z^Zz_*!AE&W9%{0$Ie~2`l4$q(YUojGh)lCG)5w2#SZvoE91bE!-9*)xqX~?|RjVe} z4cp|}T(eepyF*qO9|I+65CGJ>tpb4Zw}mRmHtAu}akJr&2E?#R$kupZje6`#=s6vV z$qNjJ3hbxQ7(T;7;U?UtXs&xLJdDfZVxArccnaVoz%u|*0ry=@ZW2P>iZMd~=&Js&-YahSayD^A0rJXTs=EG)KYm-?!vSCSW+%6PS2dHEX)15 zd3wGyLzXJ@^d!UaY~o+3u(5a^*VyU!hP;z!?Ie8y(j5hO5&-n!db#DTHGOW(`5m|J zQo47}6W|1g<@!R0HvGCgG&fGQTAo|;>C-ST_br0;0zetyAi&-qk^}O97jR zT~FN5rO)B+bn;s~@`|8s%&m7wjn+wL{h~`>g}8a(b$WmerzXbG^j}cPy{Z^;eX|(({AzZy6l%Wf-^cw5^dOReAZJw_^@m z0X+6n=1@q=0Yf{=TA53i4+xX1uD{l#aE;|F!?iOl$MvL~GIXEXf0-{fTh5y2PEvS* z;9qQ)1ndSd#=j{RR__cTT--sq9W?q2O84{uJofoi4~ee#`~IQ8l5hqG5#d+0GS P`m=+R_{8r>fUM}>{G=W| diff --git a/business_objects/store/__pycache__/product.cpython-312.pyc b/business_objects/store/__pycache__/product.cpython-312.pyc index 3f2fa8071dd17395f88cb7c744e325446d4062e1..b4aa8f7b30fa371ac3f62c57951e65132237a981 100644 GIT binary patch delta 328 zcmcb2mvQEOM!wU$yj%=GAoYbOU3=9=K80Y$Ta)#JEtriN872pcichu;5t;lyn3b)9 zu~-5j#KcfKc_viVykKo)6+kXKLn#9fLoL%}nRJuM4Z)(D14HI9GV^eiZ2lO^%E;I> z`Foh`WTzlAryELY%k>xPUsp1_sART7`J$5TC8g>EBFE(q%3pU3z33QvAu{@+V>D3k zLVWV|_`HkpdDr8MFUA*NCr3U8BTkr8eh;yk=zL=G+_=#>&X(KRF>>RwC|z$#v)8i_XE1=*O%U&FmM>b@{AI54>| zePCd4W%6YD4B~l#c=e3lAd26I38;e8cXLL>B^E}9$=0!olM7%x`y>2=;x9ikgMwqiFiNd0*qZnGokkDpIj?ZZlhPMbZtQWI- z2%_7=){M>atw`$h5cJYR^^im^gGB5hdMu;Dpx*jU-^1^JzH<(o^UZ(5qYdawy6#rE z+P-R|Umoi@)A>hH?0RR{W%o!asr&edN@kQ~IhC>+m9aW)VJpbRddSUsshq7OjjbY` z^-%>|O&-=yUN%6LYzv|6iiT1-qI8v~G8UfMNvk0W^T*46Fk3Iy(MK19Mm=NjSb-)s_V=sX7 zLhbVbQ+BZb8K&)G{}N{HyT^awnz)%918#`F0}Y4dSV$xPfewgZ>PMi_5a3!&l~am_sN6EB7+ne` zni!LJP->LQqDDpFEE*kLbRiBnf+Ha&eqwNQ@bnD7bDlH2A4@;*_&e-1+YTwI{z|Cm zt=JE`Z@iOqPZg94Qm!$m3TDAaI3Qax%F3-HQ}mNh3{ag|Pku2-0Wn1NVgm(5i$bDJ z4Pql%ViVb7Gc}4~Y7$$5ikhWIC@i*8OSw+Qb+|#duH^9BMDC=d~A0 zxe1ENK1p$L4>{uAD~WV+!_ncKqt_2!M=xi4hJeHT^w2)Te*{XEX7!^?jCcB;7#QIB zOx(aQ^U=>hj^~cA!^lJLI8naX{|X>ZWj_KFI+b-+Pb>qIymImjaEb2>z6YjxU?>7y z)?>r3F{6_sYbfilBY!Z*o9+Z~n|pH|z+Enm-UKTA>vRQp$hY#RfJME1<^x{p7iX_x znLEeinpOTuQ@|UYA3v5zdHdyy-a?J4u;H6LSDN+~Wz<{aRsS;?W)&|LtpGOp?S*a= v-}v8D7x0PGrJR|b0XnMAuB!Fl*Gvn(U8f7y{ho!)e5QK-uae+($|?T=yMUYD diff --git a/business_objects/store/image.py b/business_objects/store/image.py index be364066..376c052a 100644 --- a/business_objects/store/image.py +++ b/business_objects/store/image.py @@ -16,6 +16,7 @@ from extensions import db import lib.argument_validation as av # external from enum import Enum +from typing import ClassVar class Resolution_Level_Enum(Enum): @@ -48,6 +49,8 @@ class Resolution_Level_Enum(Enum): class Image(db.Model, Store_Base): + NAME_ATTR_OPTION_TEXT: ClassVar[str] = 'url' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = 'id_image' id_image = db.Column(db.Integer, primary_key=True) id_product = db.Column(db.Integer) id_permutation = db.Column(db.Integer) diff --git a/business_objects/store/product.py b/business_objects/store/product.py index b04362ad..96b87743 100644 --- a/business_objects/store/product.py +++ b/business_objects/store/product.py @@ -490,10 +490,10 @@ class Parameters_Product(Get_Many_Parameters_Base): def from_form_filters_product_permutation(form): # if not (form is Filters_Product_Permutation): raise ValueError(f'Invalid form type: {type(form)}') # av.val_instance(form, 'form', 'Parameters_Product.from_form', Filters_Product_Permutation) - has_category_filter = not (form.id_category.data == '0' or form.id_category.data == '') - has_product_filter = not (form.id_product.data == '0' or form.id_product.data == '') + has_category_filter = not (form.id_category.data == '0' or form.id_category.data == '' or form.id_category.data is None) + has_product_filter = not (form.id_product.data == '0' or form.id_product.data == '' or form.id_product.data is None) get_permutations_stock_below_min = av.input_bool(form.is_out_of_stock.data, "is_out_of_stock", "Parameters_Product.from_form") - print(f'form question: {type(form.is_out_of_stock)}\nbool interpretted: {get_permutations_stock_below_min}\type form: {type(form)}') + print(f'form question: {type(form.is_out_of_stock)}\nbool interpretted: {get_permutations_stock_below_min}\ntype form: {type(form)}') return Parameters_Product( get_all_product_category = not has_category_filter, get_inactive_product_category = False, @@ -595,11 +595,11 @@ class Parameters_Product(Get_Many_Parameters_Base): def from_filters_product_category(cls, filters_category): return cls( get_all_product_category = True, - get_inactive_product_category = filters_category.active, + get_inactive_product_category = filters_category.active.data, ids_product_category = '', get_all_product = True, get_inactive_product = False, - ids_product = False, + ids_product = '', get_all_permutation = True, get_inactive_permutation = False, ids_permutation = '', diff --git a/business_objects/store/product_category.py b/business_objects/store/product_category.py index a025347a..fc2d5cb7 100644 --- a/business_objects/store/product_category.py +++ b/business_objects/store/product_category.py @@ -320,6 +320,8 @@ class Filters_Product_Category(Get_Many_Parameters_Base): """ class Product_Category_Container(Store_Base): + NAME_ATTR_OPTION_TEXT: ClassVar[str] = '' + NAME_ATTR_OPTION_VALUE: ClassVar[str] = Store_Base.FLAG_ROWS categories: list def __init__(self): self.categories = [] diff --git a/forms/store/__pycache__/product.cpython-312.pyc b/forms/store/__pycache__/product.cpython-312.pyc index 2e89a74cc3f3fa2bcf9eca135fa44368e4b14247..73c5e222410352f7539b3c8f0d1679433959c532 100644 GIT binary patch delta 204 zcmdlWvR{PvG%qg~0}y0>=1E__|Qkd7UtY(1-MX@q5q_U;3 zu4aVt*};6a6!tY7tC^r;9I2csoGlEiAzX$it`x2ohA3{JC^wQQPbH5g@8n-hD(pof zK$V)zlNFdnId8G2q^2d7=9Ek}WmaM>k^stVPGGKMm5u_kS{QB$$9 S6SfzUQmzQ4ZvMt$#RvdBur7oE delta 199 zcmdllvO$FRG%qg~0}#0Da;4AR$eY46QI?ajYH~G`YSbF$)yyC%28JkBCWchD6qePD zP(C}D&zi!vhJ7^?RE#5)GliptVKs!y5XF_k*}@RT4HV@<66LAn*5sM|he<_Tlj#;$ zSz=CRN@7WVQSmMIrTl|h8Awlt;F7W|D{w|@;Aw`OlmvEU({=g;5;^|kU zJozJ+IHSsBPHuTdwauE`@r;}rKwW;C{6+ecC-P|2gH2NenZ^kslt2Uzh)@O*Dj-4~ zNZjI1&PgmT&P^@J$WJLU1&XX>C<2*Oqy{3yV1x{iQJf1TS{QB$$9 z6SfzUQmzQ4HhA9@l$jB^(POjM2AdPwC)i~#BqUuCOrC7X>%gcnxr(=%QD^cu-q})? cAQRyh{Nk|5%}*)KNwq6-nY^0Mg9Ri50I$YzegFUf delta 455 zcmeB|`!36OnwOW00SF%VGNpgw-pKckX`(DAGldP#=K}ND;e2jRh7^t#hA5s?-W1Lj z2AH`~e3e|9+_$9NCa+`G71w0C#Z{J=lbMoOl3!GOi#<6bKQlSCcoWN1Hf}kfMMcse zLVofBE>T8>$=kS03>AR_w*=jM9NpssLmmA>JVPSmeLek(l(30AMiePemgbgcRNZXN z9nZ+A4pii)$zP;5c`=VhDA)o8pimJfhya;f!~-HgW)&%e2sI#ai#s_dvA8%lwIm}y zrN{&*vXY?)WKxkTh!BGjGC)Rg`eX%O5%DWRkqzEA1!ZPLZuHpfwZZ0u_6gZ5g5i?` sc^w$lCr{$7X4Ia{$2VKb0;Csi)GrR3-29Z%oK(9a=gEipJXk<704woivj6}9 diff --git a/forms/store/product.py b/forms/store/product.py index b1c7c6da..702e2fcf 100644 --- a/forms/store/product.py +++ b/forms/store/product.py @@ -22,7 +22,7 @@ from flask_wtf.recaptcha import RecaptchaField class Filters_Product(FlaskForm): - id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')]) + id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')], default='') is_not_empty = BooleanField('Not empty only?') active = BooleanField("Active only?", default = True) @classmethod diff --git a/forms/store/product_permutation.py b/forms/store/product_permutation.py index c859782b..f32abac3 100644 --- a/forms/store/product_permutation.py +++ b/forms/store/product_permutation.py @@ -26,8 +26,8 @@ from abc import ABCMeta, abstractmethod class Filters_Product_Permutation(Form_Base): - id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')]) - id_product = SelectField('Product', validators=[Optional()], choices=[('', 'All')]) + id_category = SelectField('Category', validators=[Optional()], choices=[('', 'All')], default='') + id_product = SelectField('Product', validators=[Optional()], choices=[('', 'All')], default='') is_out_of_stock = BooleanField('Out of stock only?') quantity_min = FloatField('Min stock') quantity_max = FloatField('Max stock') diff --git a/static/css/pages/store/stock_items.css b/static/css/pages/store/stock_items.css index 3f980784..07fc5c2f 100644 --- a/static/css/pages/store/stock_items.css +++ b/static/css/pages/store/stock_items.css @@ -7,9 +7,9 @@ th, td { #tableMain { max-width: 90vw; } -#tableMain thead tr th.category, #tableMain tbody tr td.category { - width: 8vh; - min-width: 8vh; +#tableMain thead tr th.product_category, #tableMain tbody tr td.product_category { + width: 12vh; + min-width: 12vh; } #tableMain thead tr th.product, #tableMain tbody tr td.product, #tableMain thead tr th.storage_location, #tableMain tbody tr td.storage_location { @@ -80,6 +80,6 @@ th, td { #tableMain thead tr th.date_unsealed, #tableMain tbody tr td.date_unsealed, #tableMain thead tr th.date_expiration, #tableMain tbody tr td.date_expiration, #tableMain thead tr th.date_consumed, #tableMain tbody tr td.date_consumed { - width: 17vh; - min-width: 17vh; + width: 15vh; + min-width: 15vh; } \ No newline at end of file diff --git a/static/dist/css/store_stock_items.bundle.css b/static/dist/css/store_stock_items.bundle.css index 8ca65b65..ecdb2197 100644 --- a/static/dist/css/store_stock_items.bundle.css +++ b/static/dist/css/store_stock_items.bundle.css @@ -60,9 +60,9 @@ th, td { #tableMain { max-width: 90vw; } -#tableMain thead tr th.category, #tableMain tbody tr td.category { - width: 8vh; - min-width: 8vh; +#tableMain thead tr th.product_category, #tableMain tbody tr td.product_category { + width: 12vh; + min-width: 12vh; } #tableMain thead tr th.product, #tableMain tbody tr td.product, #tableMain thead tr th.storage_location, #tableMain tbody tr td.storage_location { @@ -133,6 +133,6 @@ th, td { #tableMain thead tr th.date_unsealed, #tableMain tbody tr td.date_unsealed, #tableMain thead tr th.date_expiration, #tableMain tbody tr td.date_expiration, #tableMain thead tr th.date_consumed, #tableMain tbody tr td.date_consumed { - width: 17vh; - min-width: 17vh; + width: 15vh; + min-width: 15vh; }