From bbb7800dc87c9d89616f1b94505e19dd70b47b47 Mon Sep 17 00:00:00 2001 From: teddy Date: Sun, 21 Apr 2024 15:13:09 +0100 Subject: [PATCH] Restructure pages for permutations and basket with metadata for is_included_VAT, id_currency, id_region_delivery --- __pycache__/app.cpython-311.pyc | Bin 31162 -> 31544 bytes __pycache__/forms.cpython-311.pyc | Bin 5097 -> 5203 bytes app.py | 58 ++++--- .../__pycache__/basket.cpython-311.pyc | Bin 9455 -> 10156 bytes .../__pycache__/category.cpython-311.pyc | Bin 18500 -> 18843 bytes .../__pycache__/product.cpython-311.pyc | Bin 39202 -> 39945 bytes business_objects/basket.py | 21 ++- business_objects/category.py | 8 + business_objects/product.py | 13 +- .../datastore_store.cpython-311.pyc | Bin 28498 -> 28893 bytes datastores/datastore_store.py | 21 ++- forms.py | 6 +- .../model_view_base.cpython-311.pyc | Bin 5067 -> 5232 bytes .../model_view_store.cpython-311.pyc | Bin 16533 -> 16988 bytes .../model_view_store_basket.cpython-311.pyc | Bin 3331 -> 3377 bytes .../model_view_store_checkout.cpython-311.pyc | Bin 3735 -> 3847 bytes ...iew_store_checkout_success.cpython-311.pyc | Bin 2697 -> 2789 bytes .../model_view_store_home.cpython-311.pyc | Bin 2076 -> 2122 bytes .../model_view_store_product.cpython-311.pyc | Bin 3498 -> 3544 bytes models/model_view_base.py | 6 +- models/model_view_store.py | 49 +++--- models/model_view_store_basket.py | 8 +- models/model_view_store_checkout.py | 8 +- models/model_view_store_checkout_success.py | 8 +- models/model_view_store_home.py | 8 +- models/model_view_store_product.py | 8 +- static/css/shared.css | 19 +++ static/js/shared.js | 91 ++++++++++ static/js/store_shared.js | 11 +- static/sql/700_p_shop_get_many_product.sql | 159 ++++++++++++------ templates/_block_store_basket.html | 8 +- templates/_block_store_home_body.html | 35 ++++ templates/_block_store_product.html | 38 +++-- templates/_page_store_admin_home.html | 2 +- templates/_page_store_basket.html | 49 ++---- templates/_page_store_checkout_success.html | 42 ++--- templates/_page_store_home.html | 32 +--- templates/_page_store_product.html | 4 +- templates/_shared_store.html | 77 ++++++--- templates/layout.html | 12 +- 40 files changed, 524 insertions(+), 277 deletions(-) create mode 100644 templates/_block_store_home_body.html diff --git a/__pycache__/app.cpython-311.pyc b/__pycache__/app.cpython-311.pyc index ff49739481d545166170779ff40fd39a235efa77..a2994b7ee42e3d68ad1f6a2ecf38dc43956db96b 100644 GIT binary patch delta 4643 zcmai132>9g75?|vuUoQYTe2<5mgGaW1^B{X8-tB+3%y)Pq=bU#)0TM@h}(+97K6d7!r2ySE^ zgsOsE@KhP$l%p6vc9ej*M+FlFwYkL4`bB3Y409g8cnNTR4nq5Kv_5^3#V~%(ql7cr zw^eW+Rg&vbCu<$d@ScF!N0M!ZamoB*PX;`t%P+x-CMiH*Q$TVPQ0|w+f$#&JhDcy; zMG5?Em9Fld=6f7IHrbJ3JekS5OF1F%`AnZJ$-@yCTEEmyE@a-^v!AhN!FApAQN9|%hxLxx(S73%uWyDQckG{;8n4{% zo0{Znsm$aUo1Ae@qzN5kGp;)X#Mdf{ivt=JQN?2G92=GPA86-uMCMbQTRqG zRxGZSA7&UCo59} zkge_Y&X9h4Sie1@-+o+iS*8wUEIaK%g1@kAc|^86BwK!2lXKel*t+M8p=BK*O=nos z8PRlxWSzoN?o*kWUvMR&!&z0rGOET#y%X?Go=!;@D#GvDlLVTF-B4XHC-ZahRDib) ztH85g4JKnFe6mxS<&yd(7{{s5Ur@s<8;an^#+@tqO{iqx94nYFDxvzvef(x*+B5jA z_$RoL@1?aIO142wc`l5YRKtrNTSC;$~vY5pYl6tmqAK~D4`CEJ4%YR zbU*P9Dx%~m{JejJsL4~3GW&ezXPo>aPWK+CJ2?>Mj1kTl;*8fNOjaRG<8Ui&5B_Q?_Uske($tY|(v`vFBUIG$10}t42)L@WpUPDyyr|dk=FHIQhgt;B& zjC%OOkPUB}4WO|&;bdtJ9Jl0?VmM=|AU1g4QfMhoD#V;t_!XFyVo!FGx1bXYzuIcR zKE2jI=Z>O8$iAr9?Hix+@?(^-8M+G#a`kDZ7d(-&e;&jdIQV&?g}C5_!ZpMRUlp2_ zX|@JyQ7!3#6Xgb&Dw0cHL#5s;;4j)%oNiLB?gPCoqOXi-tL8VxSTQDpiV-VveK${BkuTjbUj2uSVa-pxv zCrciI@K)6+ZCa+%v9xekVK&(S8br9UPR-8nKF6m1-mQ*Ax(k-3Ic%4FN7_Q9 zx>Qm@XMN;U%{qC=$%nPxh}H{jH7#;|Yaa7TUS_KuPSg}F+J2RU+P>)jCnUUEu!g1{ z>&k(*Z1qdCFQ?X4Ad@qGLeFKKs8G_9R}N2@Ehg#WQSH$tQGR-sXF^MzK`KquN9xKD zo7xbTV6z3ROu%MC9IH!eTY}XKSh;}JC$Kb4g|Y;jD_|7@7I#o#4td{#H3(RxfHfqr z)JsBHqSqu~RRY#Tu?DFp|JGP&t}}_%6bXCk>}Uh?t#KX;>NJU|MK3#`w)JptvTJv>+tG+P1 zGl|7LRqN9Gr5;=GbiI<0&G1M=S$^rQcNXjv5C34Sp^@Y&_`Q_VLP=VF!pcUwl%5B8 z8iAuRN76+jd=ngLEX7^MXevI__JsPJ=7Q#h?B^yzJ;Nc#bXYYLQO(SE!Y4&#!A}~) zY(~Kb?WRiR%}QMlCpvrtE;jAzD0O=`ChjVDRcTtcv|0$DPGlg z_Eupk$riHUzEZtjd=^)I9=~`A;0t0Qn@ZGjPimXNUVrEY|dgOr}k`M+&#m_&wxq+S~!{{g36UzmfS=whFHG zw@Im)Y5K1js8GL4W0J?0*F1Aw26_4U2HTmjCo0ZWU8s7Y_GM*giz75T8&=IlRCB>& z1C4Ce3hew!c5736Ci7aRuDwij$=sH|VJ-9fwTkXa(d%M!w_WslF`;$4xVtj=#g3CS z(vJ@A#Yn$0IL|8B;Qpca3G&wMu14O}?hV8m{LSuTq-=!FaRZWp_?29?^h#b&0Yfmh zr-PKkqkA4M3!J+b{6Q-u-4d5xK@6o7 zvobVT9b)GVR~d%g z#eON!7;7ObVhj?hBgusu2S3eiAj@J55-O;Vkh&O4IX?LE_NVo9;LOCpYa^sF#$pRD H9=h>A&9o~( delta 4141 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 delta 419 zcmcbt@lu^{IWI340}$NV_AzxI-$uR-{FC4DS=GCw=46(o7FEUvrKV@*=iOq1(0-b% zMPfkJMdBbr0z_~EiCaRMDe*;MmGLQ1okemWS$Pnl03w25L=uou3=(R9!yA$+Go%+p zT$I$iBB^(QMeM@lwE{9gcbL@ky5$$;#ygi56{Y4SSKi`)v2Zzr8|aW^sA_Z

Boobs

" - # POST request - # return jsonify(Success=True, data={'html_block': render_template('_page_store_home.html', model = model)}) + if request.method == 'GET': + return render_template('_page_store_home.html', model = model) # "

Boobs

" + else: # POST request + html_block = render_template('_block_store_home_body.html', model = model) + print(f'html_block:\n{html_block}') + return jsonify(Success=True, data={'html_block': html_block}) # update with local basket, if not logged in- partial @app.route('/store/basket_load', methods=['POST']) @@ -176,11 +182,11 @@ def basket_load(): print(f'data={data}') # model, html_block = render_basket_from_JSON(data) - id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) - model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery) + id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) # , Model_View_Store.KEY_BASKET) + model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery, is_included_VAT) # model.import_JSON_basket(data) model.get_basket(data) - model.is_included_VAT = is_included_VAT + # model.is_included_VAT = is_included_VAT html_block = render_template('_block_store_basket.html', model = model) print(f'html_block:\n{html_block}') @@ -192,9 +198,15 @@ def basket_add(): data = request.json # .get('data') print(f'data: {data}') id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) - model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery) - model.is_included_VAT = is_included_VAT + model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery, is_included_VAT) + # model.is_included_VAT = is_included_VAT form_data = data[Model_View_Store.key_form] + """ + try: + form_data[Model_View_Store.KEY_VALUE_DEFAULT] + except KeyError: + form_data[Model_View_Store.KEY_VALUE_DEFAULT] = + """ print(f'form_data: {form_data}') form = Form_Basket_Add(**form_data) print('form acquired') @@ -227,7 +239,7 @@ def basket_edit(): data = request.json # .get('data') print(f'data: {data}') id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) - model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery) + model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery, is_included_VAT) model.is_included_VAT = is_included_VAT form_data = data[Model_View_Store.key_form] print(f'form_data: {form_data}') @@ -258,7 +270,7 @@ def basket_delete(): data = request.json # .get('data') print(f'data: {data}') id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) - model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery) + model = Model_View_Store_Home(db, get_info_user(), app, id_currency, id_region_delivery, is_included_VAT) model.is_included_VAT = is_included_VAT try: # print('importing basket') @@ -292,7 +304,7 @@ def store_basket(): try: data = request.json id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) - model = Model_View_Store_Basket(db, get_info_user(), app, id_currency, id_region_delivery) + model = Model_View_Store_Basket(db, get_info_user(), app, id_currency, id_region_delivery, is_included_VAT) model.is_included_VAT = is_included_VAT except: raise Exception('Bad data received by controller') @@ -316,7 +328,8 @@ def basket_info(): _m = 'basket_info' data = request.json # .get('data') print(f'data: {data}') - model = Model_View_Store_Basket(db, get_info_user(), app) + id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) + model = Model_View_Store_Basket(db, get_info_user(), app, id_currency, id_region_delivery, is_included_VAT) form_data = data[Model_View_Store.key_form] print(f'form_data: {form_data}') form = Form_Billing(**form_data) @@ -360,8 +373,8 @@ def basket_info(): return jsonify({'status': 'failure', 'Message': f'Invalid address information\n{form.errors}'}) -@app.route('/store/product?permutationId=regionId=&¤cyId=', methods=['GET']) # & -def store_product(permutation_id, region_id, currency_id): +@app.route('/store/product?permutationId=regionId=&¤cyId=&isIncludedVAT=', methods=['GET']) # & +def store_product(permutation_id, region_id, currency_id, is_included_VAT): _m = 'store_product' """ av.full_val_int(product_id, 'product_id', _m) @@ -379,7 +392,7 @@ def store_product(permutation_id, region_id, currency_id): # print(f'product id: {product_id}') print(f'permutation id: {permutation_id}') try: - model = Model_View_Store_Product(db, get_info_user(), app, permutation_id, currency_id, region_id) + model = Model_View_Store_Product(db, get_info_user(), app, permutation_id, currency_id, region_id, is_included_VAT) print('model reached') # model.id_currency, model.id_region_delivery, model.is_included_VAT = DataStore_Store.get_metadata_basket(request.json) # model.get_many_product_category(product_ids = str(product_id)) @@ -451,7 +464,8 @@ def get_checkout_session(session_id): def create_checkout_session(): # quantity = request.form.get('quantity', 1) # domain_url = os.getenv('DOMAIN') - model = Model_View_Store_Checkout(db, get_info_user(), app) + id_currency, id_region_delivery, is_included_VAT = DataStore_Store.get_metadata_basket(data) + model = Model_View_Store_Checkout(db, get_info_user(), app, id_currency, id_region_delivery, is_included_VAT) print('checkout model created') try: data = request.json # .get('data') @@ -561,9 +575,9 @@ def set_delivery_region(): if form.validate_on_submit(): app.id_region_delivery = form.id_region_delivery.data """ - app.id_region_delivery = form_data[Model_View_Base.KEY_ID_REGION_DELIVERY] - print(f'id_region_delivery: {app.id_region_delivery}') - return jsonify(Success=True, data={Model_View_Base.KEY_ID_REGION_DELIVERY: app.id_region_delivery}) + id_region_delivery = form_data[Model_View_Store.KEY_BASKET][Model_View_Base.KEY_ID_REGION_DELIVERY] + print(f'id_region_delivery: {id_region_delivery}') + return jsonify(Success=True, data={Model_View_Base.KEY_ID_REGION_DELIVERY: id_region_delivery}) # currency @app.route('/store/set_currency', methods=['POST']) diff --git a/business_objects/__pycache__/basket.cpython-311.pyc b/business_objects/__pycache__/basket.cpython-311.pyc index 0c1f504e88d604019171fd6c6dbca5a6d0317568..c6901b7b4fb31a84207e4ebd85b1b656a249729b 100644 GIT binary patch delta 1398 zcmZ{i&u<$=6vt=mv16|jJ9cd6haKCoq7s8h6E#FsM1T`pmFqMiwv*ON&??Ptf-uq!y^fS}TVl8Q^kr8yMQVu>670Hps|OYd{PZmE6+8;%X+FQP$F>mZP$--Ke(QVyu+CQru+xO>eOFI?OmG+vJcapw8MM z1xLHi2F})Xc5wENQ%RBNFMvxieI0_>fPNKK`7E3GcectPmw={^5bh0+P91=+;#ca# z3Jo5y&m=28dBmEos1-SfamY%}V2m50^K|&ffLJaLlTtQ40YTs3{ev&kj~lNI4%z5B zFAZ~gyYb8LO$z2(BtbX$LF5Acf`1#insUJeJjCy(fMc=`?6jS~4^HmcczP&l+b4Y5 z9;%TY+_-4ZO>lIwhh)du(a*in)5*dcxU^^$)~TIaFF{6s2k}1QZ3O;H{Tf2lQ^sZV zGWW-WT!{u(z64uM1M1{yZ=l&5Jy9RW&i@=cZ^ovZvFRt6J9o;O6LUf)?`4|fGeV|L zXPPg~x806@sZAViNsq!;HYqo4!N$XAn0iEMFXD1r+#HS5UH)uzj(*K2V^5r0m|n+S z_)&f+on7q7U2X3hJ{$kaDJECA8Gn_YHlzf@^83cdojW*jgI^p|=y&|?*j6p9=P|X2 zxPn+iY$KKs;^;CeQ4Ud^x6rO2mJxVm_3MZm2vNHWsBR&|RxhLa2vI=bQQ_JF_*&9i z8;74=|Hos6WA)2->;{WLH(AVzOw^a}6b&{3-DDG1a@JrYCkqCHIBT+5D?Vkg!IJ@l zL7Xz#log8Bb4OK!MWLH4YI%J1d_8|VZ-s^phTUYt)=p z0a`PiA)TRyAs%ES7^E-+GZd)DRGmZ$;&gQ zOlDKCVeFdhtZ-L54kV1~L4_hIuv#Ed#RUm1y`0p%iIcq*r?P>SCQg2)Xu&vrv%C@u z$P+5cDr`w0Es>M`l;auaO{*@uEmJah@VO~h zFY->lj`MK)fWD`vl55m;fd@u-d}J_oi!$JxvO3O}LZYy!R^*vfRWHcII#!5z48hpF zE=SYBroF9AyIPyY^(=CcWiW^-PdC-TeWFiZ5mUXC)8%9#_5?9a0lEW z8LMa1N!|mZo^=-VIBY)2i=DV4Jr{b6^x-j~(0r7&2`+Xx z_BS7LI0Si6w!76O_OVd(61EbKpDD;z8Na!K- zGPr2p%jUOAsAKD z=4@^iEfj?B!T_$TN>kinW4a}-SCX^J2Kkjdu&euTdPQIRZ1~-`NTYTUPFJ`50&NN& A=Kufz delta 847 zcmZ{iUr1AN6vuZqHgo3a!71Bv<;uow^KOeZSKHi{+E`$-B*>^1iTPp{cS54#8fGq5 zEIFbRBZVI9A&BvN=_R7SFTPY1h2&GvLqeK_4+hom+!45>`|!EvoZt7H^ZRqA5nkK| z-CTLOR>8lS<<-udE3aGI0@s+jGzr?Yq7P0P+Y~|t8`o|%DFqWQ?aAPP)d^Ylz&Zd` z3YGdCtZX8S3R3{X_<3)AZHkv(D2c~=IS6Z`h;4DCz16Lxdzp0ysjFk$mbR<1zlU_d*IU*WJ@(c(4O-#a4lJ z;!eomQPBx+F)4oH_G!lvc*o`(Y2c32H3lEpGnY=ee}XEt5hz`X5sndR2*(MN9D-Uh zkljMaq1xRKi|nfVC6rB3#81dzt49wxyx?)d7dGiR4>cPWNzu+Bs0x)%QXq#$uN%Iy zm^Zvhe0GEQOhKGKun)drx52_R2hGK;9X@K^>=R)XD@_(Q;rmDM#7~0vezA0oip_H1 zvgZvh2C9nA@H;>{ow*Wi4Ho6Pg2fs(@9h%L{(F!fDwo52&;`G6eTN0rp_wxIGJ9zS z@nOgZDqISsU<@yYolwH=hDYcbb~hdZEp|1&;U!s diff --git a/business_objects/__pycache__/product.cpython-311.pyc b/business_objects/__pycache__/product.cpython-311.pyc index f2d0372b1d7841ccf278d812740f591e98cca703..547dcc043a4d364557e8ee287cb7e30f4c835de9 100644 GIT binary patch delta 3224 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 B@tyzx diff --git a/business_objects/basket.py b/business_objects/basket.py index 3ee058f5..5468f374 100644 --- a/business_objects/basket.py +++ b/business_objects/basket.py @@ -108,9 +108,21 @@ class Basket_Item(): ''' class Basket(): + KEY_BASKET: str = 'basket' + KEY_ID_CURRENCY: str = 'id_currency' + KEY_ID_REGION_DELIVERY: str = 'id_region_delivery' + KEY_IS_INCLUDED_VAT: str = 'is_included_VAT' + KEY_ITEMS: str = 'items' items: list - def __init__(self): + is_included_VAT: bool + id_region_delivery: int + id_currency: int + + def __init__(self, is_included_VAT, id_currency, id_region_delivery): self.items = [] + self.is_included_VAT = is_included_VAT + self.id_currency = id_currency + self.id_region_delivery = id_region_delivery def add_item(self, item): av.val_instance(item, 'item', 'Basket.add_item', Basket_Item) self.items.append(item) @@ -134,7 +146,12 @@ class Basket(): json_list.append(item.to_json()) return json_list def to_json(self): - return {'items': self.to_json_list()} + return { + Basket.KEY_ITEMS: self.to_json_list(), + Basket.KEY_IS_INCLUDED_VAT: self.is_included_VAT, + Basket.KEY_ID_CURRENCY: self.id_currency, + Basket.KEY_ID_REGION_DELIVERY: self.id_region_delivery + } def output_total(self): sum = 0 for b_i in self.items: diff --git a/business_objects/category.py b/business_objects/category.py index c696cecd..6ec8706a 100644 --- a/business_objects/category.py +++ b/business_objects/category.py @@ -184,6 +184,14 @@ class Category(db.Model): if not (len(self.products) == 0): print(f'getting first permutation from product') return None if len(self.products) == 0 else self.products[0].get_permutation_selected() + + def is_available(self): + if len(self.products) == 0: + return False + for product in self.products: + if product.is_available(): + return True + return False class Product_Category_Filters(): diff --git a/business_objects/product.py b/business_objects/product.py index 5060058d..8bf7d8e5 100644 --- a/business_objects/product.py +++ b/business_objects/product.py @@ -317,6 +317,15 @@ class Product(db.Model): av.val_instance(discount, 'discount', 'Product.add_discount', Discount) index_permutation = self.permutation_index[discount.id_permutation] # self.get_index_permutation_from_id(discount.id_permutation) self.permutations[index_permutation].add_discount(discount) + def has_permutations(self): + return len(self.permutations) > 0 + def is_available(self): + if len(self.permutations) == 0: + return False + for permutation in self.permutations: + if permutation.is_available(): + return True + return False class Product_Permutation(db.Model): @@ -362,7 +371,7 @@ class Product_Permutation(db.Model): self.form_basket_add = Form_Basket_Add() self.form_basket_edit = Form_Basket_Edit() self.is_unavailable_in_currency_or_region = False - self.is_available = True + # self.is_available = False def make_from_DB_product(query_row): _m = 'Product_Permutation.make_from_DB_product' @@ -422,6 +431,8 @@ class Product_Permutation(db.Model): permutation.id_permutation = json_basket_item[key_id_permutation] return permutation + def is_available(self): + return len(self.prices) > 0 def get_price(self): return self.prices[0] def get_price_local_VAT_incl(self): diff --git a/datastores/__pycache__/datastore_store.cpython-311.pyc b/datastores/__pycache__/datastore_store.cpython-311.pyc index c081b60bb4019a1511fab5248358c9d4fc6c597b..bd7618eda7f56b9486628e53cb26e1083b6ba5a6 100644 GIT binary patch delta 4157 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 A_5c6? delta 3805 zcmbW3YitzP6@cgN%e&t9+TNGfc-QZRf}z1c2w-Cz-hL!D1vVzbvNN{V*lT=uodBK1 zRJaXMLPB(^@S_SMjY1pJv>}^FBvO-BRTA|_B-2`zyDFec=}RhVD5OP@G(BgA#fAVy z9cw?Ix%bSSbI9L^F-6=tSxJw{c5Qs zQv}cM3c@*88MDIKZZCuvIKbzQ=&dK5aA{4IC+oQ7filGbXDwwc0<1e=bt;ZFVaMsL zOR+(Cq0fkk5D>s!>kVh!ifzzy!!|*22MVH)^(dYbC2-nZhUyMYJ(Mj`JcFeL9i?QJ zdMUJfeEL$w1^u2y?y_5~@!=?11MhnrtPG`6gW^09ptbS#x+lV%G^kTxn{42VXi#tYhfP(_`ZRe_X}UCi3*TcK;Abm zsAg^>-LE99B488+-VBxgQj|3(n+fd%KY{$IrLpIh zG!}=F=?rhBS@l(GNNR)OfS<+Tdx34t4;KREI;@s21M`d0IGg@LpIa2%qcgnV|Gq!> z)6g>vH{lux8C4!8&Om)MeHm$;M^V2YCslMDzQid=_c!HpMu?3~5Me`U{ zHGh(DbN_jpR@Jp)TF!`z_&CkB5e_2KRLImk)C+xbwJOR!$yHS!Kp*5@u6bU^Ho~I% zwsEzI^wDGegaJg}K%UMUcFX(Hc_WXf`en^PN_x#`>Qwonw46>SM^gDBd9R!p%g9<> z)UDC3aO-NgkJ4kR@wAP+eIT9|3z3B@^&#ucJ@F$@-cW5(y-Ya;|Ea5E7jvnG#|x4B zbM#O#Mrd&H_Rzf|1Q!-RRQ6j8z}Er;jZIA^&HFIeG`~u9zlkhNk#W|fBqrh+xqpQ3 z<0CY@2i|R($1?Dzrg4)NAsAe8oQ;BIY5#mR5!K+R*?5E=h|@Z@l>Fq(LdR)*6kb|d zm6g50S++%$M8rV9umjs-_H?A7!ey)0AX4^0EcO zEj8>CJlxWUG5$%*JZ1uVM<<+H9bl*6->V-rsjhtsI$K-V=Ww+39aLPqrcuwj;EA>S ztjkHAQXQYUwzmF0OJOOT?+L)0>*mD5`0Up_j>};tsD{t<3Dxat7~J%_Q-r$~fr~dm z!}{eb?ob7sT%I?La7pHA&Gi;?y*esK-%_pkMD6cXy^8?WlByKs?f z#ab38Q~hC1j<{C5hmS~OiA;KVnBParwRf~Nt-YHA99kE+qZi<#j=J%Cdf+wtOdH4> z#bHs}bz3)3{lG`bjcWc`$q6^?pX~-zNZS!N8bhHy2(Y_zGi%75>3n*|F(-AvdOFI; zIsESgH9anpbRX{ceNSuC(EsI*t}Qi7?&%Kx8QO5CZNRB58(2r~$`*AO2e!V)F2jS{ z7HXeIYV%R+vJh9ErF9Gl@&h)>quZLX(kHh)!s_9`)*}{v4dbcHtkE> zA7Tn>m%{4UN-U)DSd5j^lGogLP$l=s3*vi{B6iX6%5YT255bkkTDMo=JfA}_64ZqF zCP|ACc~gSR*nRjR8o>_$A+JkHcrvMdl$KTxM*dHfX4y^S*Wvlzx$L{}Uhgwh(>p$5 zR#pEMnlyq>Y;=>Dw{UFLoMV<_@7XG@ir!|BdKBDh6~|9OffvF1Vo&4?63u9sYGTwl z%QE#%HSoaBh}LBo#CA5Y7va#(zo_mE)J{7P6x^8$!|dqW#NN)u z`rcucbYv%}hZZh93iP|Y7jX<04%E67fjU#+8q~q+ffBt=5#Ymth)1vJ6urXw^xeX1 ztOG;kg|1|4)R4CgrbkjDmq*8B%m(@nn)$q$6+8H4a%KB@tdlf-z8@5(gLSWtPt|Xn z3T`^=oc30|+B{X=I^|t+*g9PieWP(|Zr4=BBa`Ofv@=X)86WXozoSIa=+W%$mSZ1E$lPlf0Nfk<8UjhfYFpUcX;?k7E}w2UZj0l g^^&B1tkva~jr6h&W5tY?zWcvR+T4|UsHhA67ninUp8x;= diff --git a/datastores/datastore_store.py b/datastores/datastore_store.py index 4c876d54..3f1f1f01 100644 --- a/datastores/datastore_store.py +++ b/datastores/datastore_store.py @@ -43,9 +43,10 @@ import os # CLASSES class DataStore_Store(): - KEY_IS_INCLUDED_VAT = 'is_included_VAT' - KEY_ID_CURRENCY = 'id_currency' - KEY_ID_REGION_DELIVERY = 'id_region_delivery' + KEY_BASKET: str = Basket.KEY_BASKET + KEY_IS_INCLUDED_VAT = Basket.KEY_IS_INCLUDED_VAT # 'is_included_VAT' + KEY_ID_CURRENCY = Basket.KEY_ID_CURRENCY # 'id_currency' + KEY_ID_REGION_DELIVERY = Basket.KEY_ID_REGION_DELIVERY # 'id_region_delivery' # Attributes db: SQLAlchemy # Global constants @@ -112,7 +113,7 @@ class DataStore_Store(): return category_list, errors # categories, category_index - def edit_basket(self, ids_permutation_basket, quantities_permutation_basket, id_permutation_edit, quantity_permutation_edit, sum_not_edit, id_currency, id_region_delivery): + def edit_basket(self, ids_permutation_basket, quantities_permutation_basket, id_permutation_edit, quantity_permutation_edit, sum_not_edit, id_currency, id_region_delivery, is_included_VAT): # redundant argument validation? _m = 'DataStore_Store.edit_basket' print(f'{_m}\nstarting...') @@ -176,7 +177,7 @@ class DataStore_Store(): print(f'raw basket: {result_set}') # print(f'variations: {result_set_3}') # variations = [Variation(**row) for row in result_set_3] - basket = Basket() + basket = Basket(is_included_VAT, id_currency, id_region_delivery) for row in result_set: index_category = category_list.get_index_category_from_id(row[0]) category = category_list.categories[index_category] @@ -732,7 +733,11 @@ class DataStore_Store(): return regions, currencies def get_metadata_basket(json_request): - is_included_VAT = json_request[DataStore_Store.KEY_IS_INCLUDED_VAT] - id_currency = json_request[DataStore_Store.KEY_ID_CURRENCY] - id_region_delivery = json_request[DataStore_Store.KEY_ID_REGION_DELIVERY] + try: + basket = json_request[DataStore_Store.KEY_BASKET] + except KeyError: + basket = {DataStore_Store.KEY_IS_INCLUDED_VAT: True, DataStore_Store.KEY_ID_CURRENCY: 1, DataStore_Store.KEY_ID_REGION_DELIVERY: 1} + is_included_VAT = basket[DataStore_Store.KEY_IS_INCLUDED_VAT] + id_currency = basket[DataStore_Store.KEY_ID_CURRENCY] + id_region_delivery = basket[DataStore_Store.KEY_ID_REGION_DELIVERY] return id_currency, id_region_delivery, is_included_VAT \ No newline at end of file diff --git a/forms.py b/forms.py index 7154480c..6e3b5ebd 100644 --- a/forms.py +++ b/forms.py @@ -96,7 +96,9 @@ class Form_Is_Included_VAT(FlaskForm): is_included = BooleanField('Include VAT') class Form_Delivery_Region(FlaskForm): - id_region_delivery = SelectField('Region') + id_id_region_delivery = 'id_region_delivery' + id_region_delivery = SelectField('Region', id='id_region_delivery') class Form_Currency(FlaskForm): - id_currency = SelectField('Currency') \ No newline at end of file + id_id_currency = 'id_currency' + id_currency = SelectField('Currency', id='id_currency') \ No newline at end of file diff --git a/models/__pycache__/model_view_base.cpython-311.pyc b/models/__pycache__/model_view_base.cpython-311.pyc index 1e0d7cf787f97bd36d723644a351863c159fd347..5d8e3f3cd89524351037cba767de78685ef1c787 100644 GIT binary patch delta 861 zcmZ{g%TE(g6vpTFUCK)@Qi}2VA7at~~ey2y}x8&WexoWvwsMTdq zJ6W08traRD19_q!uv#}xMRKSg@>}FnO|_LOrL9t-Tw-f_rMlDntpA2kw)xR`ANelQ zE2!2|rC7~x*JVZ37iu+Cm)}&zN#5)?jZ#^eA`No@Et41KB1$$5miIdGJnLUzUAO0umaxgtzY zvrR?MU|=v(s9mXC?oK|JS`!lWR~XHyG*=g2!@ zLEyF4pQ)zF{v3&8%zcXC21Ay-7G0rPn${7;tfD<`CzBXLOsJD%akbYMZy7voZ>(i- zw}a4v8%yMtBfvX@jm5Sn+A=uXb|Yq zjcm7Aen>oI!TXvQgm zEDBclq`DBtYwe8+wb1)wtHPe!*SX6jj@a4q~jK2i~Nx@)>smu z`!lM#-D?|$sv1twXU*ExD?;ll0z1*o0ct(9)zyY-vu$W~RqYF@UgjU29abA(a=o)C z3v|3rSR@?dY4>L0ILT$g3BnA)v`_Mf?)8;b>H`85hhF~ckut4Qq-aOOA#k{uUg5vp zC3baO^xS2v#-GbuwW4q<7QG=J`}W>osOh4kzQ;h{U>D#&y{o+GJ3oHvd&ZP1y{601*9jMR!ynF^7Sdn>XAdvSLlz-J z#&vG^TS|IqVoOfrg^4XPRU*3^{IfshismP_(9{>@!N3Rc3ts|Fw#@6nR-!}+w3iw9 k%e8iMfOmS@8C~Zuf=|wEFqS`%{>{hRUrp!xe|$6c51inlJ^%m! diff --git a/models/__pycache__/model_view_store.cpython-311.pyc b/models/__pycache__/model_view_store.cpython-311.pyc index b1396928117b9ba672f545103eb5355182e01388..3985ff5de6ba0d90ab7b1322bf0872fcab8574bf 100644 GIT binary patch delta 4157 zcmZ`*du*H475}c^j$er#+le3XGfteR6T5jeZIb3e(xiDcX~Bh>kk2VGX@jo66q?#3 zMTG@cM&Yi40TbDf!nPs?WSS->rlDyX1+qb)A|0QlE zA77YTSrT%Fp=EkDc4RL3P+W-h@jO+5uk%VarEpo5yd

NWpoIODSLGcqx0|QpMg> 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 delta 252 zcmdle)hxxkoR^o20SKJsBWvKpH?qu%5=HVxH_{6$yzi!N{!70Cl7l93GssRSE( zY4UD1N490GKtow4v#{R-8v2-BSr}}T0vI$D$pRG@X-}5t&|*xU?8PC+d6C2W3WxUv x4)4vy96n5p+LI4(i85+#zQ)DDC{xV%fq{t?E6FkWKeyUs1)gR`|H(^udI5?yIT!!{ diff --git a/models/__pycache__/model_view_store_checkout.cpython-311.pyc b/models/__pycache__/model_view_store_checkout.cpython-311.pyc index e32733349fd23ee35d46c8ba5cef68da29b2d901..3854ddaa1c5f80b3c0c92b466d7cb2ec77cfdba8 100644 GIT binary patch delta 508 zcmbO(+b+kuoR^o20SKPTDy6;K$h(zUj2*;<0!|>!48)%kCf{K8<*8w*VXa|X22`<{ zeX=%-DkI0_Ko$uX?#z_<`u$VL2P2RwwWPKqd{z78$2L^^RMpvef z3=9HpOkcnxP>9owsYn>8BN^G1AS1x8G@1OJ#TMpDHlQonHe0biVFWr;o?TM8NEWEB zNDf5E0|}VTK+6>xiUdKzs*^q0b+mec%pVO5PdRuy*?ZWpb4Xm`keDGfBYZ*f3hN6N zUMKu7a>QKWh`GQKGkHC`_~!NOB8+T$Ks{9&ll|DGCO_sl#i%=Z9jBy{K2Y!$2P|ZY zK~4nP1+mHyq(Kd=ftl+VP{S!MEjAO7pdMIIgnO}?Dv(vHa%V`nF@0cQV#P*oj_0vrWK#nfpgDOyuM(r%QNm=g;MZgIxPC+8#<7stmJvjTNa-ppdos4@99i<0U^ z{@^S8!527!i-ds^$;kGARD$i%o9w}A%eD;2Ud_CDBI^@I1J)t|pk$FGh>!vi(jY6c+`}xz7ayOQmst`YZvax(Hu*lgBG00UwD5RMUcjulc>$9xqf#;_$N(q+v6+GR^8_Fds33}kW-YJo|&H)pOTuBS(aK< zd5b@@I6gBkIj1xwH6=dGG2|9geC{pI`1s_U#Ny)k_+oCLZ3+qsleJl$7^5cVvD#T* zh)KVYS^a^5p^nj)=_3P!fFIKrFbNdm^kXU#0_s3QlXtSoYsvvt70H7L1rVVGB#J=+2(%mm8j1u!5^9s*vzcgx0GU4;7@l(QcCz=d zU+0jx#33<5Xh!&gCHW>V;1HXqh Ic{ArV02OD0f&c&j delta 408 zcmaDV+9}GnoR^o20SLNT->1G{+sMbu#27PKhRI$fg`DNf$YC^@;0m1FZ9CR;{jzhpL$Nl*Y{GXwGGE+8?LaXLc^V=dd{-^|jC zY?H-V!q}FvFfgoUnOwvY}2C2vTU|&%Yf|F%#+jDmN2qU=4O|dkq62bvjYhQ zFlZLEC!b(O_~rs~qT7 fJ6pMo6VnFlFh_uQIWI340}ur8OQZ>IVOC{i zpZtm0lAkj^J~=0`xHvw(m>sBWvJZ1 zs^OUI%Ph&rIXRtq6GsjEGIj=r)$EhyS-KdxC$D1hG~~}Lj?c_X&M8evO^FY447tS= zpL>g|EIzR)J-(!}AoUh!e0*|FVsUYNd@(oBJcY?Ztk#TECi}70`F&tuC}nhE`pCc_ z;K~Ga0FVR1S36He_Y|B`I zwy|z*V~b`~=0J8<3g?#EqXein+v!C7#US2ALJHg dRG567+gqxH@dE=ND>ibn4bL}5i^;~kO99wvQbPa$ diff --git a/models/model_view_base.py b/models/model_view_base.py index 0c0a5c81..4251628b 100644 --- a/models/model_view_base.py +++ b/models/model_view_base.py @@ -38,15 +38,19 @@ class Model_View_Base(ABC): # app: Flask is_page_store: bool # Global constants + ATTR_TEXT_COLLAPSED = 'textCollapsed' + ATTR_TEXT_EXPANDED = 'textExpanded' FLAG_BUTTON_MODAL_CLOSE = 'btn-overlay-close' FLAG_BUTTON_SUBMIT = 'btn-submit' FLAG_CARD = 'card' + FLAG_COLLAPSED = 'collapsed' FLAG_COLLAPSIBLE = 'collapsible' FLAG_COLUMN = 'column' FLAG_CONTAINER = 'container' FLAG_CONTAINER_INPUT = FLAG_CONTAINER + '-input' + FLAG_EXPANDED = 'expanded' FLAG_INITIALISED = 'initialised' - FLAG_ROW = 'column' + FLAG_ROW = 'row' FLAG_SCROLLABLE = 'scrollable' FLAG_SUBMITTED = 'submitted' # flagIsDatePicker = 'is-date-picker' diff --git a/models/model_view_store.py b/models/model_view_store.py index 57f4510e..6737f43b 100644 --- a/models/model_view_store.py +++ b/models/model_view_store.py @@ -67,26 +67,30 @@ class Model_View_Store(Model_View_Base): ID_BUTTON_CHECKOUT = 'btnCheckout' ID_BUTTON_BASKET_ADD = 'btnBasketAdd' ID_BUTTON_BUY_NOW = 'btnBuyNow' + ID_CURRENCY = Form_Currency.id_id_currency # 'id_currency' ID_CURRENCY_DEFAULT = 1 ID_LABEL_BASKET_EMPTY = 'basketEmpty' + ID_REGION_DELIVERY = Form_Delivery_Region.id_id_region_delivery # 'id_region_delivery' ID_REGION_DELIVERY_DEFAULT = 1 IS_INCLUDED_VAT_DEFAULT = True - KEY_BASKET = 'basket' + KEY_BASKET = Basket.KEY_BASKET # 'basket' # KEY_CODE_CURRENCY = 'code_currency' KEY_FORM = 'form' - KEY_ID_CURRENCY = 'id_currency' + KEY_ID_CURRENCY = Basket.KEY_ID_CURRENCY # 'id_currency' KEY_ID_PRODUCT = 'product_id' KEY_ID_PERMUTATION = 'permutation_id' - KEY_ID_REGION_DELIVERY = 'id_region_delivery' - KEY_IS_INCLUDED_VAT = 'is_included_VAT' + KEY_ID_REGION_DELIVERY = Basket.KEY_ID_REGION_DELIVERY # 'id_region_delivery' + KEY_IS_INCLUDED_VAT = Basket.KEY_IS_INCLUDED_VAT # 'is_included_VAT' + KEY_ITEMS = Basket.KEY_ITEMS # 'items' KEY_PRICE = 'price' KEY_QUANTITY = 'quantity' + KEY_VALUE_DEFAULT = 'default' TYPE_FORM_BASKET_ADD = 'Form_Basket_Add' TYPE_FORM_BASKET_EDIT = 'Form_Basket_Edit' # development variables # valid_product_id_list = ['prod_PB0NUOSEs06ymG'] - def __new__(cls, db, info_user, app, id_currency, id_region_delivery): # , *args, **kwargs`` + def __new__(cls, db, info_user, app, id_currency, id_region_delivery, is_included_VAT): # , *args, **kwargs`` # Initialiser - validation _m = 'Model_View_Store.__new__' v_arg_type = 'class attribute' @@ -95,26 +99,27 @@ class Model_View_Store(Model_View_Base): # return super().__new__(cls, *args, **kwargs) return super().__new__(cls, db, info_user, app) # Model_View_Store, cls - def __init__(self, db, info_user, app, id_currency, id_region_delivery): + def __init__(self, db, info_user, app, id_currency, id_region_delivery, is_included_VAT): # Constructor _m = 'Model_View_Store.__init__' print(f'{_m}\nstarting') super().__init__(db, info_user, app) self.is_page_store = True - self.basket = Basket() + self.basket = Basket(id_currency, id_region_delivery, is_included_VAT) # self.basket_total = 0 # self.db = db # if logged in: # else: self.id_currency = id_currency self.id_region_delivery = id_region_delivery + self.is_included_VAT = is_included_VAT self.show_delivery_option = True self.form_is_included_VAT = Form_Is_Included_VAT() regions, currencies = self.get_regions_and_currencies() - self.form_currency = Form_Currency() + self.form_currency = Form_Currency(id_currency=self.id_currency) self.form_currency.id_currency.choices = [(currency.id_currency, f'{currency.code} - {currency.name}') for currency in currencies] self.form_currency.id_currency.data = str(self.id_currency) if len(currencies) > 0 else None - self.form_delivery_region = Form_Delivery_Region() + self.form_delivery_region = Form_Delivery_Region(id_region_delivery=self.id_region_delivery) self.form_delivery_region.id_region_delivery.choices = [(region.id_region, f'{region.code} - {region.name}') for region in regions] self.form_delivery_region.id_region_delivery.data = str(self.id_region_delivery) if len(regions) > 0 else None @@ -203,14 +208,14 @@ class Model_View_Store(Model_View_Base): # item_added = False print(f'basket: {self.basket}') ids_permutation, quantities_permutation = self.basket.to_csv() - self.basket = DataStore_Store(self.db, self.info_user, self.app).edit_basket(ids_permutation, quantities_permutation, permutation_id, quantity, quantity_sum_not_replace, self.app.id_currency, self.app.id_region_delivery) + self.basket = DataStore_Store(self.db, self.info_user, self.app).edit_basket(ids_permutation, quantities_permutation, permutation_id, quantity, quantity_sum_not_replace, self.id_currency, self.id_region_delivery, self.is_included_VAT) return True def get_basket(self, json_data): self.import_JSON_basket(json_data) if self.is_user_logged_in: ids_permutation, quantities_permutation = self.basket.to_csv() - self.basket = DataStore_Store(self.db, self.info_user, self.app).edit_basket(ids_permutation, quantities_permutation, None, None, None, self.app.id_currency, self.app.id_region_delivery) + self.basket = DataStore_Store(self.db, self.info_user, self.app).edit_basket(ids_permutation, quantities_permutation, None, None, None, self.id_currency, self.id_region_delivery, self.is_included_VAT) # return self.basket def _get_json_basket_id_CSVs_product_permutation(self, basket): @@ -223,8 +228,8 @@ class Model_View_Store(Model_View_Base): product_ids += ',' permutation_ids += ',' basket_item = basket[index_item] - id_product = basket_item[self.key_id_product] - id_permutation = basket_item[self.key_id_permutation] + id_product = basket_item[self.KEY_ID_PRODUCT] + id_permutation = basket_item[self.KEY_ID_PERMUTATION] id_permutation = '' if (id_permutation is None or id_permutation == 'None') else str(id_permutation) product_ids += str(id_product) # str(basket[b].product.id) permutation_ids += id_permutation # str(basket[b].product.id) @@ -235,7 +240,7 @@ class Model_View_Store(Model_View_Base): return product_ids, permutation_ids, item_index_dict def _get_basket_from_json(self, json_data): - basket = json_data[self.key_basket]['items'] + basket = json_data[self.KEY_BASKET]['items'] av.val_instance(basket, 'basket', 'Model_View_Store._get_basket_from_json', list) print(f'basket = {basket}') return basket @@ -244,6 +249,10 @@ class Model_View_Store(Model_View_Base): _m = 'Model_View_Store.import_JSON_basket' # av.val_instance(db, 'db', _m, SQLAlchemy) items = self._get_basket_from_json(json_data) + basket = json_data[self.KEY_BASKET] + id_currency = basket[self.KEY_ID_CURRENCY] + id_region_delivery = basket[self.KEY_ID_REGION_DELIVERY] + is_included_VAT = basket[self.KEY_IS_INCLUDED_VAT] print(f'json basket items: {items}') product_ids, permutation_ids, item_index_dict = self._get_json_basket_id_CSVs_product_permutation(items) category_list, errors = DataStore_Store(self.db, self.info_user, self.app).get_many_product_category(Product_Filters( @@ -252,12 +261,12 @@ class Model_View_Store(Model_View_Base): False, product_ids, False, False, # :a_get_all_product, :a_ids_product, :a_get_inactive_product, :a_get_first_product_only False, permutation_ids, False, # :a_get_all_permutation, :a_ids_permutation, :a_get_inactive_permutation False, '', False, True, # :a_get_all_image, :a_ids_image, :a_get_inactive_image, :a_get_first_image_only - False, str(self.app.id_region_delivery), False, # :a_get_all_delivery_region, :a_ids_delivery_region, :a_get_inactive_delivery_region - False, str(self.app.id_currency), False, # :a_get_all_currency, :a_ids_currency, :a_get_inactive_currency + False, str(id_region_delivery), False, # :a_get_all_delivery_region, :a_ids_delivery_region, :a_get_inactive_delivery_region + False, str(id_currency), False, # :a_get_all_currency, :a_ids_currency, :a_get_inactive_currency True, '', False # :a_get_all_discount, :a_ids_discount, :a_get_inactive_discount )) # product_ids=product_ids, get_all_category=False, get_all_product=False) # print(f'categories = {categories}') - self.basket = Basket() + self.basket = Basket(id_currency, id_region_delivery, is_included_VAT) if len(category_list.categories) > 0: # not (categories is None): for category in category_list.categories: for product in category.products: @@ -265,7 +274,7 @@ class Model_View_Store(Model_View_Base): product.form_basket_edit = Form_Basket_Edit() # key_index_product = Basket.get_key_product_index_from_ids_product_permutation(product.id_product, product.get_id_permutation()) permutation = product.get_permutation_selected() - self.basket.add_item(Basket_Item.make_from_product_and_quantity_and_VAT_included(product, items[item_index_dict[str(permutation.id_permutation)]][self.key_quantity], self.app.is_included_VAT)) + self.basket.add_item(Basket_Item.make_from_product_and_quantity_and_VAT_included(product, items[item_index_dict[str(permutation.id_permutation)]][self.KEY_QUANTITY], self.is_included_VAT)) """ if len(items) > 0: for index_item in range(len(items)): @@ -317,8 +326,8 @@ class Model_View_Store(Model_View_Base): # print(f'product id: {product_id}, type: {str(type(product_id))}') try: - permutation_id = json_data[self.key_id_permutation] - av.full_val_int(permutation_id, self.key_id_permutation, _m) + permutation_id = json_data[self.KEY_ID_PERMUTATION] + av.full_val_int(permutation_id, self.KEY_ID_PERMUTATION, _m) permutation_id = int(permutation_id) except: permutation_id = None diff --git a/models/model_view_store_basket.py b/models/model_view_store_basket.py index cd4819ef..7426e43c 100644 --- a/models/model_view_store_basket.py +++ b/models/model_view_store_basket.py @@ -65,13 +65,13 @@ class Model_View_Store_Basket(Model_View_Store): def title(self): return 'Store Basket' - def __new__(cls, db, id_user, app, id_currency, id_region_delivery): + def __new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT): # Initialiser - validation - return super(Model_View_Store_Basket, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery) + return super(Model_View_Store_Basket, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT) - def __init__(self, db, id_user, app, id_currency, id_region_delivery): + def __init__(self, db, id_user, app, id_currency, id_region_delivery, is_included_VAT): # Constructor - super().__init__(db, id_user, app, id_currency, id_region_delivery) + super().__init__(db, id_user, app, id_currency, id_region_delivery, is_included_VAT) # self.product_categories = Model_View_Store_Basket.get_many_product_category(get_all_category = True, get_all_product = True) self.form_billing = Form_Billing() self.form_billing.form_type_billing_not_delivery = True diff --git a/models/model_view_store_checkout.py b/models/model_view_store_checkout.py index 6a072fc0..73652ccd 100644 --- a/models/model_view_store_checkout.py +++ b/models/model_view_store_checkout.py @@ -41,13 +41,13 @@ class Model_View_Store_Checkout(Model_View_Store_Basket): def title(self): return 'Store Checkout' - def __new__(cls, db, id_user, app): + def __new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT): # Initialiser - validation - return super(Model_View_Store_Checkout, cls).__new__(cls, db, id_user, app) + return super(Model_View_Store_Checkout, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT) - def __init__(self, db, id_user, app): + def __init__(self, db, id_user, app, id_currency, id_region_delivery, is_included_VAT): # Constructor - super().__init__(db, id_user, app) + super().__init__(db, id_user, app, id_currency, id_region_delivery, is_included_VAT) self.key_secret_stripe = os.environ.get("KEY_SECRET_STRIPE") self.key_public_stripe = os.environ.get("KEY_PUBLIC_STRIPE") diff --git a/models/model_view_store_checkout_success.py b/models/model_view_store_checkout_success.py index 6705ae75..01f7daed 100644 --- a/models/model_view_store_checkout_success.py +++ b/models/model_view_store_checkout_success.py @@ -40,16 +40,16 @@ class Model_View_Store_Checkout_Success(Model_View_Store_Checkout): def title(self): return 'Store Checkout Success' - def __new__(cls, db, id_user, app, id_checkout_session, checkout_items = None): + def __new__(cls, db, id_user, app, id_checkout_session, checkout_items, id_currency, id_region_delivery, is_included_VAT): # Initialiser - validation _m = 'Model_View_Store_Checkout_Success.__new__' # av.val_list(checkout_items, 'checkout_items', _m) av.val_str(id_checkout_session, 'id_checkout_session', _m) - return super(Model_View_Store_Checkout_Success, cls).__new__(cls, db, id_user, app) + return super(Model_View_Store_Checkout_Success, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT) - def __init__(self, db, id_user, app, id_checkout_session, checkout_items = None): + def __init__(self, db, id_user, app, id_checkout_session, checkout_items, id_currency, id_region_delivery, is_included_VAT): # Constructor - super().__init__(db, id_user, app) + super().__init__(db, id_user, app, id_currency, id_region_delivery, is_included_VAT) self.checkout_items = checkout_items self.id_checkout_session = id_checkout_session self.order = self.get_many_user_order('', 1, id_checkout_session) \ No newline at end of file diff --git a/models/model_view_store_home.py b/models/model_view_store_home.py index 5cbed4c5..ad2925d9 100644 --- a/models/model_view_store_home.py +++ b/models/model_view_store_home.py @@ -40,13 +40,13 @@ class Model_View_Store_Home(Model_View_Store): return 'Store Home' max_products_per_category = -1 - def __new__(cls, db, id_user, app, id_currency, id_region_delivery): + def __new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT): # Initialiser - validation - return super(Model_View_Store_Home, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery) + return super(Model_View_Store_Home, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT) - def __init__(self, db, id_user, app, id_currency, id_region_delivery): + def __init__(self, db, id_user, app, id_currency, id_region_delivery, is_included_VAT): # Constructor - super().__init__(db, id_user, app, id_currency, id_region_delivery) + super().__init__(db, id_user, app, id_currency, id_region_delivery, is_included_VAT) # self.categories = Model_View_Store_Home.get_many_product_category(self.db, get_all_category = True, get_all_product = True) # self.get_many_product_category(get_all_category = True, get_all_product = True) """ diff --git a/models/model_view_store_product.py b/models/model_view_store_product.py index 23bc705a..633f6baf 100644 --- a/models/model_view_store_product.py +++ b/models/model_view_store_product.py @@ -37,7 +37,7 @@ class Model_View_Store_Product(Model_View_Store): def title(self): return 'Store Home' - def __new__(cls, db, id_user, app, id_permutation, id_currency, id_region_delivery): # *args, **kwargs + def __new__(cls, db, id_user, app, id_permutation, id_currency, id_region_delivery, is_included_VAT): # *args, **kwargs # Initialiser - validation _m = 'Model_View_Store_Product.__new__' print(f'{_m}\nstarting...') @@ -51,13 +51,13 @@ class Model_View_Store_Product(Model_View_Store): print(f'ending') # return super().__new__(cls, *args, **kwargs) # Model_View_Store_Product, cls # , db, id_user, id_product) # , db, id_user) - return super(Model_View_Store_Product, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery) + return super(Model_View_Store_Product, cls).__new__(cls, db, id_user, app, id_currency, id_region_delivery, is_included_VAT) - def __init__(self, db, id_user, app, id_permutation, id_currency, id_region_delivery): + def __init__(self, db, id_user, app, id_permutation, id_currency, id_region_delivery, is_included_VAT): # Constructor _m = 'Model_View_Store_Product.__init__' print(f'{_m}\nstarting...') - super().__init__(db, id_user, app, id_currency, id_region_delivery) + super().__init__(db, id_user, app, id_currency, id_region_delivery, is_included_VAT) print('supered') print(f'user info: {self.info_user}') # print(f'user id: {self.info_user.get("sub")}') diff --git a/static/css/shared.css b/static/css/shared.css index 1f64ed2b..47069acf 100644 --- a/static/css/shared.css +++ b/static/css/shared.css @@ -57,6 +57,8 @@ h5 { border-bottom-left-radius: 2.5vh; border-bottom-right-radius: 2.5vh; flex-wrap: wrap; + font-weight: bold; + font-size: 2vh; } /* Style the topnav links */ @@ -82,6 +84,23 @@ h5 { height: 100%; } +.topnav select { + padding: 1vh; + margin: 1vh; + border-radius: 1vh; + /* background-color: var(--c_purple_light); */ + color: var(--c_purple_dark); + border: 2px solid white; + font-weight: bold; + text-align: center; +} +.topnav select .collapsed { + width: 5vw; +} +.topnav select .expanded { + width: 25vw; +} + /* Create two unequal columns that floats next to each other */ /* Left column */ .leftcolumn { diff --git a/static/js/shared.js b/static/js/shared.js index 70073b3f..139fe764 100644 --- a/static/js/shared.js +++ b/static/js/shared.js @@ -81,6 +81,7 @@ function hookupOverlay(idOverlay) { } function hookupSelectorCurrency() { + /* let elForm = $(idFormCurrency); let elSelector = $(elForm.find('select')[0]); initialiseEventHandler(elSelector, flagInitialised, function(){ @@ -97,8 +98,43 @@ function hookupSelectorCurrency() { }); }); console.log("form currency initialised") + */ + + let dropdownCurrency = $(idCurrency)[0]; + // dropdownCurrency.options.map(function(option) { + let option, indexHyphen, textOption; + for (let indexOption = 0; indexOption < dropdownCurrency.options.length; indexOption++) { + option = $(dropdownCurrency.options[indexOption]); + textOption = option.text(); + indexHyphen = textOption.indexOf('-'); + option.attr(attrTextExpanded, textOption); + option.attr(attrTextCollapsed, textOption.substring(0, indexHyphen - 1)); + option.addClass(flagCollapsed); + } + handleSelectCollapse(dropdownCurrency); + initialiseEventHandler(dropdownCurrency, flagInitialised, function() { + dropdownCurrency = $(dropdownCurrency); + dropdownCurrency.on("focus", function() { + handleSelectExpand(dropdownCurrency); + }); + dropdownCurrency.on("blur", function() { + handleSelectCollapse(dropdownCurrency); + }); + dropdownCurrency.on("change", function() { + let selectedCurrency = dropdownCurrency.val(); + console.log("selected currency: ", selectedCurrency); + let basket = getLocalStorage(keyBasket); + basket[keyIdCurrency] = selectedCurrency; + // setLocalStorage(keyIdCurrency, selectedCurrency); + setLocalStorage(keyBasket, basket); + let ajaxData = {}; + ajaxData[keyBasket] = basket; + ajaxJSONData('update currency', mapHashToController(hashPageCurrent), ajaxData, loadPageBody, false); + }); + }); } function hookupSelectorDeliveryRegion() { + /* let elForm = $(idFormDeliveryRegion); let elSelector = $(elForm.find('select')[0]); initialiseEventHandler(elSelector, flagInitialised, function(){ @@ -111,7 +147,62 @@ function hookupSelectorDeliveryRegion() { }); console.log("form delivery region initialised") }); + */ + + let dropdownRegion = $(idRegionDelivery)[0]; + + let option, indexHyphen, textOption; + for (let indexOption = 0; indexOption < dropdownRegion.options.length; indexOption++) { + option = $(dropdownRegion.options[indexOption]); + textOption = option.text(); + indexHyphen = textOption.indexOf('-'); + option.attr(attrTextExpanded, textOption); + option.attr(attrTextCollapsed, textOption.substring(0, indexHyphen - 1)); + option.addClass(flagCollapsed); + } + + handleSelectCollapse(dropdownRegion); + + initialiseEventHandler(dropdownRegion, flagInitialised, function() { + dropdownRegion = $(dropdownRegion); + dropdownRegion.on("focus", function() { + console.log("dropdown region focused"); + handleSelectExpand(dropdownRegion); + }); + dropdownRegion.on("blur", function() { + console.log("dropdown region blurred"); + handleSelectCollapse(dropdownRegion); + }); + dropdownRegion.on("change", function() { + handleSelectCollapse(dropdownRegion); + let selectedRegion = dropdownRegion.val(); + console.log("selected region: ", selectedRegion); + let basket = getLocalStorage(keyBasket); + basket[keyIdRegionDelivery] = selectedRegion; + // setLocalStorage(keyIdRegionDelivery, selectedRegion); + setLocalStorage(keyBasket, basket); + let ajaxData = {}; + ajaxData[keyIdRegionDelivery] = selectedRegion; + ajaxJSONData('update region', mapHashToController(hashStoreSetRegion), ajaxData, null, false); + }); + }); } + +function handleSelectCollapse(elementSelect) { + let optionSelected = $(elementSelect).find('option:selected'); + optionSelected.text(optionSelected.attr(attrTextCollapsed)); + console.log('collapsed: ', optionSelected.text()); + optionSelected.removeClass(flagExpanded); + optionSelected.addClass(flagCollapsed); +} +function handleSelectExpand(elementSelect) { + let optionSelected = $(elementSelect).find('option:selected'); + optionSelected.text(optionSelected.attr(attrTextExpanded)); + console.log('expanded: ', optionSelected.text()); + optionSelected.removeClass(flagCollapsed); + optionSelected.addClass(flagExpanded); +} + function hookupCheckboxIsIncludedVAT() { let elForm = $(idFormIsIncludedVAT); let elSelector = $(elForm.find('input[type="checkbox"]')[0]); diff --git a/static/js/store_shared.js b/static/js/store_shared.js index 693b0c47..fb5aac3e 100644 --- a/static/js/store_shared.js +++ b/static/js/store_shared.js @@ -11,7 +11,6 @@ function hookupStore() { function hookupBasket() { // const containerBasket = $(idContainerBasket); - toggleShowBtnCheckout(); // containerBasket hookupBtnCheckout(); hookupBtnsPlusMinus(); @@ -45,13 +44,19 @@ function hookupLocalStorageStore() { } if (createNewBasket) { - basket = {'items': []}; + basket = {}; + basket[keyItems] = []; + basket[keyIsIncludedVAT] = true; + basket[keyIdCurrency] = 1; + basket[keyIdRegionDelivery] = 1; setLocalStorage(keyBasket, basket); console.log("new local basket created"); } let ajaxData = {} ajaxData[keyBasket] = basket; - // console.log('ajax:' + ajaxData); + // console.log("hookupLocalStorageStore\nhashStoreBasketLoad: " + hashStoreBasketLoad + "\n"); + // ajaxData[keyIsIncludedVAT] = getLocalStorage(keyIsIncludedVAT); + console.log('ajax:' + ajaxData); ajaxJSONData(keyBasket, mapHashToController(hashStoreBasketLoad), ajaxData, loadBasket, false); } diff --git a/static/sql/700_p_shop_get_many_product.sql b/static/sql/700_p_shop_get_many_product.sql index e0ca4462..ed335da2 100644 --- a/static/sql/700_p_shop_get_many_product.sql +++ b/static/sql/700_p_shop_get_many_product.sql @@ -178,6 +178,14 @@ BEGIN SET a_get_inactive_discount = 0; END IF; + /* + SELECT a_id_user, a_get_all_category, a_ids_category, a_get_inactive_category, a_get_all_product, + a_ids_product, a_get_inactive_product, a_get_first_product_only, a_get_all_product_permutation, a_ids_permutation, + a_get_inactive_permutation, a_get_all_image, a_ids_image, a_get_inactive_image, a_get_first_image_only, + a_get_all_delivery_region, a_ids_delivery_region, a_get_inactive_delivery_region, a_get_all_currency, a_ids_currency, + a_get_inactive_currency, a_get_all_discount, a_ids_discount, a_get_inactive_discount + ; + */ -- Temporary tables DROP TABLE IF EXISTS tmp_Discount; @@ -277,7 +285,8 @@ BEGIN FOREIGN KEY (id_region) REFERENCES Shop_Region(id_region), active BIT NOT NULL, - display_order INT NOT NULL + display_order INT NOT NULL, + requires_delivery_option BIT NOT NULL DEFAULT 0 ); CREATE TABLE tmp_Currency ( @@ -506,18 +515,20 @@ BEGIN INSERT INTO tmp_Delivery_Region ( id_region, active, - display_order + display_order, + requires_delivery_option ) WITH RECURSIVE Recursive_CTE_Delivery_Region AS ( SELECT DR.id_region AS id_region_parent, - NULL AS id_region_child - FROM Shop_Region DR - INNER JOIN Shop_Product_Delivery_Option_Link PDOL - ON DR.id_region = PDOL.id_region - INNER JOIN tmp_Shop_Product t_P - ON PDOL.id_product = t_P.id_product - AND PDOL.id_permutation <=> t_P.id_permutation + NULL AS id_region_child, + CASE WHEN FIND_IN_SET(DR.id_region, a_ids_delivery_region) > 0 THEN 1 ELSE 0 END AS requires_delivery_option + FROM Shop_Product_Currency_Region_Link PCRL + INNER JOIN Shop_Currency C ON PCRL.id_currency = C.id_currency + INNER JOIN tmp_Shop_Product t_P + ON PCRL.id_product <=> t_P.id_product + AND PCRL.id_permutation <=> t_P.id_permutation + INNER JOIN Shop_Region DR ON PCRL.id_region_purchase = DR.id_region WHERE ( a_get_all_delivery_region @@ -525,39 +536,79 @@ BEGIN ) AND ( a_get_inactive_delivery_region - OR DR.active + OR DR.active = 1 ) UNION SELECT DRB.id_region_parent, - DRB.id_region_child + DRB.id_region_child, + 0 AS requires_delivery_option FROM Shop_Region_Branch DRB INNER JOIN Recursive_CTE_Delivery_Region r_DR ON DRB.id_region_parent = r_DR.id_region_child AND ( a_get_inactive_delivery_region - OR DRB.active + OR DRB.active = 1 ) ) SELECT DR.id_region, DR.active, - DR.display_order + DR.display_order, + requires_delivery_option FROM Shop_Region DR INNER JOIN Recursive_CTE_Delivery_Region r_DR ON DR.id_region = r_DR.id_region_parent OR DR.id_region = r_DR.id_region_child ; + /* + select * from tmp_delivery_region; + SELECT * + FROM tmp_Shop_Product t_P + WHERE + /*( + a_get_all_category + OR a_get_all_product + OR a_get_all_product_permutation + )* + FIND_IN_SET(t_P.id_category, a_ids_category) > 0 + OR FIND_IN_SET(t_P.id_product, a_ids_product) > 0 + OR FIND_IN_SET(t_P.id_permutation, a_ids_permutation) > 0 + ; + */ IF v_has_filter_delivery_region THEN SET v_ids_permutation_unavailable = ( SELECT GROUP_CONCAT(t_P.id_permutation SEPARATOR ', ') - FROM tmp_Shop_Product t_P - INNER JOIN Shop_Product_Currency_Region_Link PCRL - ON t_P.id_permutation = PCRL.id_permutation + FROM ( + SELECT * + FROM tmp_Shop_Product t_P + WHERE + /*( + a_get_all_category + OR a_get_all_produc + OR a_get_all_product_permutation + )*/ + FIND_IN_SET(t_P.id_category, a_ids_category) > 0 + OR FIND_IN_SET(t_P.id_product, a_ids_product) > 0 + OR FIND_IN_SET(t_P.id_permutation, a_ids_permutation) > 0 + ) t_P + LEFT JOIN ( + SELECT * + FROM Shop_Product_Currency_Region_Link PCRL + WHERE + ( + a_get_all_delivery_region + OR FIND_IN_SET(PCRL.id_region_purchase, a_ids_delivery_region) > 0 + ) + ) PCRL + ON t_P.id_product <=> PCRL.id_product + AND t_P.id_permutation <=> PCRL.id_permutation LEFT JOIN tmp_Delivery_Region t_DR ON PCRL.id_region_purchase = t_DR.id_region - WHERE ISNULL(t_DR.id_region) + AND t_DR.requires_delivery_option = 1 + WHERE + ISNULL(t_DR.id_region) ); IF NOT ISNULL(v_ids_permutation_unavailable) THEN INSERT INTO tmp_Msg_Error ( @@ -586,7 +637,7 @@ BEGIN -- select * from tmp_Shop_Product; # Currencies - IF NOT EXISTS (SELECT * FROM tmp_Msg_Error) THEN + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid) THEN INSERT INTO tmp_Currency ( id_currency, active, @@ -625,14 +676,14 @@ BEGIN SELECT * FROM tmp_Shop_Product t_P WHERE - ( + /*( a_get_all_category OR a_get_all_product OR a_get_all_product_permutation - ) - AND FIND_IN_SET(t_P.id_category, a_ids_category) = 0 - AND FIND_IN_SET(t_P.id_product, a_ids_product) = 0 - AND FIND_IN_SET(t_P.id_permutation, a_ids_permutation) = 0 + )*/ + FIND_IN_SET(t_P.id_category, a_ids_category) > 0 + OR FIND_IN_SET(t_P.id_product, a_ids_product) > 0 + OR FIND_IN_SET(t_P.id_permutation, a_ids_permutation) > 0 ) t_P INNER JOIN ( SELECT * @@ -674,30 +725,31 @@ BEGIN END IF; # Discounts - INSERT INTO tmp_Discount ( - id_discount, - active, - display_order - ) - SELECT - D.id_discount, - D.active, - D.display_order - FROM Shop_Discount D - INNER JOIN tmp_Shop_Product t_P - ON D.id_product = t_P.id_product - AND D.id_permutation <=> t_P.id_permutation - WHERE - ( - a_get_all_discount - OR FIND_IN_SET(D.id_discount, a_ids_discount) > 0 + IF NOT EXISTS (SELECT * FROM tmp_Msg_Error WHERE guid = v_guid) THEN + INSERT INTO tmp_Discount ( + id_discount, + active, + display_order ) - AND ( - a_get_inactive_discount - OR D.active - ) - ; - + SELECT + D.id_discount, + D.active, + D.display_order + FROM Shop_Discount D + INNER JOIN tmp_Shop_Product t_P + ON D.id_product = t_P.id_product + AND D.id_permutation <=> t_P.id_permutation + WHERE + ( + a_get_all_discount + OR FIND_IN_SET(D.id_discount, a_ids_discount) > 0 + ) + AND ( + a_get_inactive_discount + OR D.active + ) + ; + END IF; # select 'pre-permission results'; # select * from tmp_Shop_Product; @@ -725,7 +777,7 @@ BEGIN DELETE FROM tmp_Shop_Product t_P WHERE - FIND_IN_SET(t_P.id_product, (SELECT GROUP_CONCAT(UET.id_product SEPARATOR ',') FROM Shop_User_Eval_Temp UET)) = 0 # id_product NOT LIKE CONCAT('%', (SELECT GROUP_CONCAT(id_product SEPARATOR '|') FROM Shop_User_Eval_Temp), '%'); + FIND_IN_SET(t_P.id_permutation, (SELECT GROUP_CONCAT(UET.id_permutation SEPARATOR ',') FROM Shop_User_Eval_Temp UET)) = 0 # id_product NOT LIKE CONCAT('%', (SELECT GROUP_CONCAT(id_product SEPARATOR '|') FROM Shop_User_Eval_Temp), '%'); OR ( ISNULL(t_P.can_view) AND ( @@ -833,6 +885,13 @@ BEGIN ON t_P.id_permutation = PPVL.id_permutation ORDER BY t_P.display_order ; + */ + -- select * from Shop_Product_Currency_Region_Link; + -- select * from shop_currency; + /* + select * from tmp_Currency; + select * from tmp_delivery_region; + select * from tmp_shop_product; */ # Product Price @@ -851,8 +910,8 @@ BEGIN ROW_NUMBER() OVER(ORDER BY t_P.rank_permutation, C.display_order) AS display_order FROM Shop_Product_Currency_Region_Link PCRL INNER JOIN tmp_Shop_Product t_P - ON t_P.id_product = PCRL.id_product - AND t_P.id_permutation <=> PCRL.id_permutation + ON PCRL.id_product <=> t_P.id_product + AND PCRL.id_permutation <=> t_P.id_permutation -- INNER JOIN Shop_Product P ON PCRL.id_product = P.id_product INNER JOIN tmp_Currency t_C ON PCRL.id_currency = t_C.id_currency INNER JOIN Shop_Currency C ON t_C.id_currency = C.id_currency @@ -1056,7 +1115,7 @@ CALL p_shop_get_many_product ( 0, # a_get_inactive_product 0, # a_get_first_product_only 1, # a_get_all_product_permutation - '', # a_ids_permutation + '1,2,3,4,5,6', # a_ids_permutation 0, # a_get_inactive_permutation 0, # a_get_all_image '', # a_ids_image diff --git a/templates/_block_store_basket.html b/templates/_block_store_basket.html index 3e53f581..11395991 100644 --- a/templates/_block_store_basket.html +++ b/templates/_block_store_basket.html @@ -1,6 +1,6 @@ {% set show_delivery_option = False %} -

+

Basket

@@ -9,10 +9,10 @@ {% for basket_item in model.basket.items %} {% include '_block_store_basket_item.html' %} {% endfor %} -

Total: {{ model.output_basket_total() }}

{% if not model.app.is_included_VAT %}

+ VAT

{% endif %} -

Buy some shit dawg!

+

Total: {{ model.output_basket_total() }}

{% if not model.app.is_included_VAT %}

+ VAT

{% endif %} +

Buy some shit dawg!

- +
\ No newline at end of file diff --git a/templates/_block_store_home_body.html b/templates/_block_store_home_body.html new file mode 100644 index 00000000..a8380b73 --- /dev/null +++ b/templates/_block_store_home_body.html @@ -0,0 +1,35 @@ + + +{% set block_id = 'styles' %} +{% include '_shared_store.html' %} + + + + +
+
+ {% for cat in model.category_list.categories %} + {% if cat.is_available() %} + {% include '_block_store_product_category.html' %} + {% endif %} + {% endfor %} +
+
+ {% include '_block_store_basket.html' %} +
+
+ +{% set block_id = 'scripts' %} +{% include '_shared_store.html' %} + + + + \ No newline at end of file diff --git a/templates/_block_store_product.html b/templates/_block_store_product.html index f2dfadb9..44765124 100644 --- a/templates/_block_store_product.html +++ b/templates/_block_store_product.html @@ -1,22 +1,24 @@ -{% set permutation = product.get_permutation_selected() %} -
-
- Template product image -
- {% set form = product.form_basket_add %} -
- {{ form.hidden_tag() }} -

{{ product.name }}

-

{{ permutation.output_price(model.app.is_included_VAT) }}

- {% if permutation.is_available %} - {% set tmp_quantity = 1 %} - {% include '_block_input_number_plus_minus.html' %} - {{ form.submit() }} -

Get it: {{ permutation.output_delivery_date() }}

+{% if product.has_permutations() %} + {% set permutation = product.get_permutation_selected() %} +
+
+ Template product image +
+ {% if permutation.is_available() %} + {% set form = product.form_basket_add %} + + {{ form.hidden_tag() }} +

{{ product.name }}

+

{{ permutation.output_price(model.is_included_VAT) }}

+ {% set tmp_quantity = 1 %} + {% include '_block_input_number_plus_minus.html' %} + {{ form.submit() }} +

Get it: {{ permutation.output_delivery_date() }}

+ {% endif %} - - -
\ No newline at end of file + +
+{% endif %} \ No newline at end of file diff --git a/templates/_page_store_admin_home.html b/templates/_page_store_admin_home.html index 90061e55..51464d50 100644 --- a/templates/_page_store_admin_home.html +++ b/templates/_page_store_admin_home.html @@ -69,7 +69,7 @@ - + {% set block_id = 'checkout' %} + {% include '_shared_store.html' %} - + {% set block_id = 'checkout' %} + {% include '_shared_store.html' %} - - + {% include '_block_store_home_body.html' %} {% endblock %} \ No newline at end of file diff --git a/templates/_page_store_product.html b/templates/_page_store_product.html index 5083f27a..92aa3973 100644 --- a/templates/_page_store_product.html +++ b/templates/_page_store_product.html @@ -30,7 +30,7 @@
-
+
{% include '_block_store_basket.html' %}
@@ -42,7 +42,7 @@ +{% elif block_id == 'checkout' %} + + {% endif %} \ No newline at end of file diff --git a/templates/layout.html b/templates/layout.html index bca6b428..7d8c2aff 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -10,13 +10,17 @@