From ba4965716373bfd19eba8fb5edef7cc1e5eeacec Mon Sep 17 00:00:00 2001 From: vickytechkey Date: Fri, 14 Aug 2026 19:24:24 +0530 Subject: [PATCH] integrated seller items --- .../__pycache__/db_router.cpython-312.pyc | Bin 0 -> 1356 bytes .../__pycache__/settings.cpython-312.pyc | Bin 5061 -> 5275 bytes customerwebsitebackend/db_router.py | 20 ++++ customerwebsitebackend/settings.py | 18 ++++ logs/app.log | 4 + orders/__pycache__/models.cpython-312.pyc | Bin 4956 -> 5654 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 3681 -> 3220 bytes orders/__pycache__/views.cpython-312.pyc | Bin 10241 -> 12460 bytes ...rorder_remove_cartitem_product_and_more.py | 46 +++++++++ ..._cartitem_product_and_more.cpython-312.pyc | Bin 0 -> 2231 bytes orders/models.py | 37 +++++-- orders/serializers.py | 23 ++--- orders/views.py | 92 ++++++++++++++---- products/__pycache__/models.cpython-312.pyc | Bin 2850 -> 2457 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 1356 -> 1400 bytes products/__pycache__/views.cpython-312.pyc | Bin 2422 -> 2397 bytes .../migrations/0002_alter_product_options.py | 17 ++++ ...0002_alter_product_options.cpython-312.pyc | Bin 0 -> 652 bytes products/models.py | 21 ++-- products/serializers.py | 5 +- products/views.py | 4 +- 21 files changed, 228 insertions(+), 59 deletions(-) create mode 100644 customerwebsitebackend/__pycache__/db_router.cpython-312.pyc create mode 100644 customerwebsitebackend/db_router.py create mode 100644 orders/migrations/0002_sellerorder_remove_cartitem_product_and_more.py create mode 100644 orders/migrations/__pycache__/0002_sellerorder_remove_cartitem_product_and_more.cpython-312.pyc create mode 100644 products/migrations/0002_alter_product_options.py create mode 100644 products/migrations/__pycache__/0002_alter_product_options.cpython-312.pyc diff --git a/customerwebsitebackend/__pycache__/db_router.cpython-312.pyc b/customerwebsitebackend/__pycache__/db_router.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d78e65ec17cdb4fbfa1e810347e3b0d260071fbc GIT binary patch literal 1356 zcmb7E%}*0S6rb64%167cQczH_MU1)}D3TZs8ZVl7!$iGM4x4RfN?W#FoZUi7n&6=a zxrjGBa_}JW;{V~LH8C`M^&c?Q#DtUY&29}4Jou9S=FR)s_ci^h>!Sqd%k)n5yGFnrLD!@KzQ9RF6^|VK*t6_WK!_1oSEPu4-aABKut0oR3eiQqel0Y&LuHJXeNLxy{O2 zUAX1kTE#0j3c0}-wnV{&Zx*cLx~TJiiFv`4s;ToEO+OB|k|RwiEWUm1Y}4mY>9Cvb z0>B&6i(lG%xcl%ZKGTiQ9ISkc&-c=^J$-C%b$9hhpY7_iox4xE`jcMzb}u#A$KIbA z9|M6JAIw56QHxwOz!ojh3TbH{={x$89MWZj$~1V$B*35{attnhB208kLiO9%FRnr< zN6_~g0F;r+y!DP!nQkg`z`Cj2rwM@0a88bcx`+)wO)6nr|9#S=hPM3bkQh;!0)ZcO z3f21x7v*ITxM&8$$_B|LE!%dspux7~Rh;_v^ttrTsuLIhJA?_QRW8d#3^<^_%fAQ` zSpG=3)T~9hhU@(jWw^8`iG~u&S-?q*EvEns7NoE7f5rNwyorV_fKQm_>xO0Hi!se$Ev|ySyn&EK zz!HN%xFQngsel6GV(d0K))<>QPExjT9HVUfSB$Yt;DXk;Z_4Xzq?6%CK^BkYZLm_| Tu-u;!O6hMcO*6*?K*jk3Myf%2 literal 0 HcmV?d00001 diff --git a/customerwebsitebackend/__pycache__/settings.cpython-312.pyc b/customerwebsitebackend/__pycache__/settings.cpython-312.pyc index 6c145d5340e44d41a8ea2068a34c5c9591bbb466..81546852418187799b8b659a31db44a5acab37ad 100644 GIT binary patch delta 1120 zcmb7D%}*0S6yND?TZ`FtXbb(KSmdJ?1r!zesA8clASwnylf96Ix2$azOSUbE#$-Jj z4;r#ZHzs=Uf(NzHqc=}pI5zz&ASRxDyQQ%bFkv_I-uuma?>E1h+5HiJlW_m!`4$GB zPf;zu+_CKrlCACdSIuyM8`^+ED|o>Nehat%g98RDcpxYffkFtvIf6D~*$&G_b42EZ zR_GMGa7OR}C-`x+K}=|eE;tL_Ig%qn0D7PoeGqdYAke3THzI--A&iZYA`t(0Zikrq zm^x1U#n2BNj`MH<2CR1whTtMxf?>lgbRgA$5*4CSG@q>ZH{1MVGpfgu11|5_>aixo zj%l1eqA}KxSoEUkXg>YF8p1#vWnY1-Fk;x?+JPU%cnrp20(}y+>&GmAlQ`!0da1bR5hXEZl;5 z**vO#3*Cl0P3SJ>7Yw`5{bV3^kRqF{>m#?AK@ZcTB)>r zvypK<&p-5xAx=1Ic17Bf6m>%1<$Fm||IKeqn4gE5F-_L2VQZ%ziH|{%)S_x$Z_R~j zHbq&)wPqSs>Z}>1^|$T^o;kC~sT5=xTM|7w>-kJ+I<=IVO5M+_EG{fBWft`>p4X&P zpQ0a5Z(+Il3l$x#{)@g`p^R_1O1r8wRQ2~&X{1Wq_jxCE?0Kz3>`)@mNF446I`+Fm cyzRMbZ-i;fl3ibRm!W&K@~$;z<4U;T9}C~@DF6Tf delta 934 zcma)4$!^n76!mi^k}8fHnlw!eX_6+XncG5#l+ZRE86;SN@GjCZCXq{vQ$VmWON0Qa z@)EDQU{f|I>L;-34_J}-hay(&c(!9TK~%+-@1T3nx#!*I&*JwocNmRE82U^KdUGnh z%caPJ-SUBsgc)oQDTXA58-&`FV@DjDZV<&U@yJMn5TrQ#(pmZq;hdBJhx5ob2*oBb ziX8RBw3Y%vULDy?OKHNejGRW{>)1ZA2QzM7JkC*q?x&`Vafr@)0T*!zmvP19qzt7J zRY4MDp;>VWdTq1Xo4K(Z#MOP)jiu}fxTRj4-UVhojjcFUEi`MrO@H?g1_dhn8YVDl zvY6`n>omTBY0OYRi@6iV_se$Y%UM)B-I&KsRB_7;V&OkY9DS5y@gE$g2LZzUgq%X+p}jq!*2m!wm%R_$NCb;uf@2H%fyOn|fE6BeJd_z`QU fWbqk`PyURC_~4N*9A)2zkMiwT@ln?QoTB~!=!mga diff --git a/customerwebsitebackend/db_router.py b/customerwebsitebackend/db_router.py new file mode 100644 index 0000000..4fe1630 --- /dev/null +++ b/customerwebsitebackend/db_router.py @@ -0,0 +1,20 @@ +class DatabaseRouter: + def db_for_read(self, model, **hints): + if model._meta.model_name == 'product': + return 'productprofile' + elif model._meta.model_name in ['sellerorder', 'orderitem']: + return 'customerprofile' + return 'default' + + def db_for_write(self, model, **hints): + return self.db_for_read(model, **hints) + + def allow_relation(self, obj1, obj2, **hints): + return True + + def allow_migrate(self, db, app_label, model_name=None, **hints): + if model_name == 'product': + return db == 'productprofile' + elif model_name in ['sellerorder', 'orderitem']: + return db == 'customerprofile' + return db == 'default' diff --git a/customerwebsitebackend/settings.py b/customerwebsitebackend/settings.py index beb1e9e..9bf455d 100644 --- a/customerwebsitebackend/settings.py +++ b/customerwebsitebackend/settings.py @@ -88,9 +88,27 @@ DATABASES = { 'PASSWORD': 'vtechnosoft@123A', 'HOST': '127.0.0.1', 'PORT': '5432', + }, + 'productprofile': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'productprofile', + 'USER': 'vignesh', + 'PASSWORD': 'vtechnosoft@123A', + 'HOST': '127.0.0.1', + 'PORT': '5432', + }, + 'customerprofile': { + 'ENGINE': 'django.db.backends.postgresql', + 'NAME': 'customerprofile', + 'USER': 'vignesh', + 'PASSWORD': 'vtechnosoft@123A', + 'HOST': '127.0.0.1', + 'PORT': '5432', } } +DATABASE_ROUTERS = ['customerwebsitebackend.db_router.DatabaseRouter'] + # Password validation # https://docs.djangoproject.com/en/6.1/ref/settings/#auth-password-validators diff --git a/logs/app.log b/logs/app.log index dff5994..590d0aa 100644 --- a/logs/app.log +++ b/logs/app.log @@ -5,3 +5,7 @@ INFO 2026-08-14 13:43:48,808 autoreload 57706 139697750147200 /home/vignesh/gith INFO 2026-08-14 13:43:49,076 autoreload 58191 123150790480000 Watching for file changes with StatReloader INFO 2026-08-14 13:46:26,838 autoreload 58191 123150790480000 /home/vignesh/github/customerwebsitebackend/customerwebsitebackend/settings.py changed, reloading. INFO 2026-08-14 13:46:27,112 autoreload 60038 140193920041088 Watching for file changes with StatReloader +INFO 2026-08-14 13:52:49,207 autoreload 60038 140193920041088 /home/vignesh/github/customerwebsitebackend/orders/models.py changed, reloading. +INFO 2026-08-14 13:52:49,524 autoreload 64078 126174254198912 Watching for file changes with StatReloader +INFO 2026-08-14 13:53:37,086 autoreload 64078 126174254198912 /home/vignesh/github/customerwebsitebackend/orders/models.py changed, reloading. +INFO 2026-08-14 13:53:37,360 autoreload 64566 128112213057664 Watching for file changes with StatReloader diff --git a/orders/__pycache__/models.cpython-312.pyc b/orders/__pycache__/models.cpython-312.pyc index a6c8dbcd19cdc1778c1afbf0fbe0da35d12243a5..24937f39f6675943b4e7fb004353c449dd9fb83d 100644 GIT binary patch delta 2424 zcmZ`*Z){Ul6uloX_oAme2J?Gx@ z=iYP9?fvMdy`FE}ZYP29AXFF&N?&=t=ecS2BmXnk#J;l~ajyf>G@&i ze=h9dnghsb2GBWx2o2(V9eZToI)aObV-jseRvSVH!G_R|ARvShnh?4Wx&cgQKBp>% zrY01FqGcLIs2fMB#{%|I!|?`-*~7jN)^Syq;5625_pusy{k$x&U$_o-UiQ4`);y}? z61f4}aKvR*yhP&O31`e@I$l+%alp{VO?wJZry{I)h`~&=zZ!S5Ly{UFkLk+kghm`n7gtVtp9I&p z$iZvScK{TJ$s@rg2JZ)2rgmT3T?<4jfoQqwX8&~mY#@3suzgnA{^xzUxh8j3fb1$)*d@Fm$(ZW7)h=oa4#p+P&7;#tXP?_S zE59=9c*RPM;h1klsvQ9vm}{nUC`+}}Xy%YMQO_JJ#F#=%CA>_{l$aK6r=4A?CxKA!5*Bqkp|Bri;_6|u6had zVYc7yc2>Ebn2oy8o(I4bGWm3xZo&Br2wM>(gad57)WmIO+oTU)pf4lGD!4UB{ik+; zIq5!1RgLy7-oZBZv$Qc#FXyJ^XUuxt>(&gQmQ|%3VR3iw$RJ2e$;cW?I-!hb^BKcz z&<(}N>$C$!Uj4mPE|~4JtolyTP-+g~(HxXvx;Pg&F&kx{W*8T~E-fHq10Gv0U|K zc54}XQ(o_LsN#(C246QB_tZ^zRo9HP#FXosd~VgVjO%?S*H>3iP~~My{XE%6RPQCC z`j(UiR6q2wrinnT$#k92(rJxa7x!>8xNIPAgn1rlx(Q)r zzD)X$X&Du+Br=dJB(h9hNW9 zWS?Ccf#m@#7RVvkY1xG)B?qotynJ!i(YDx>)+~$Y>HD`Ac9vu8#Q;R;trMlvs({T-3N<9bDs9nyERXH#nWEyyfsnv3>5dR(050y z%6mbhv!xWRIa?~umg}c)byuA)6<_^B;O)U*3BbIAvxn;0fI-7w6H`>jl+0+hPi4CQ z;EUGZ3afuxJq8!8%C*Oio#XHZr?p*l0;HHj`YE>H-?GKS?JAwSa^doY1p?$k#K&zf d4P7~W`S1b(a-ql1g|0@Ydaw2VPJpz$_!k&BO{o9? delta 1665 zcmZ{kUrbw79LMjUmj2=P_7Aj-A{3-{D`_Va$Dd_`F;*B_3X$%GMQ>~GW$RW-ckV55 zWPv8mge4}hoWvQ8iccGX2sjfLU)&>!Mq6#t=Eev2;DgCxmJFlWi=N+YKw$GE{q&sQ zJ%4}a`#m27e(~|&SuAFXlp4qUc{!CX-t5~4N@Rzn4Ml#}GbuQf+yUO60p#?A7 zIQ$pwc2n1n; z%~Chdj#GXn@|10Ur+I}{jaRerw31Y=sfG-i7PARO)stpQdNw6ws#)7W94W(!G<8%E zWCaNVBt(9ZAV-xQuG_&|!6nZ!yL|Re`15ed+gb2-=3Be+*6zHqTRVP)_gnYo6OWml z?OHapG#(){AwA#(fm%B@Ehm-aj5M59q>B<7OiC#c_25s<9`AGW8ib($7x~Eoer#^8 z<2?(LCEiouJiw7#cuFG0A1dvn!A`qT=GEHDvIpz6}u zR0IRl6p0erN#x6T zkPr4(6j!@9L!_(9k4O8X=f{PCbECrpq4A0WPr}Rx6zIWU@d3IQKjht^78q%hFC{aX zWcs2I7eyq=vL;g1lu5-C|1Zyem>S^0r>$R9B-#)8VFEOc(W9WzD#<9ZmmRoW@3iYy zL1?5*m>G&hUAV>8fd96+@f`zi;I&v2{>SEYvLd@?+U;%o@5`0_U+kipNZWC(+Rv#b zEm5F4bd;=tOaxIsqv;)uLgc{hj6f_xkN`LAlwCihcKpB)pZ{nHf+a-eW9k#I1{*DB8_<=ot=7HLPW%Igpy>s=RH{$U?u>#Kz^U#236)77Y0jQV}Wb@P`W#_ zKDRQrHB{uHxls9l>-skPwrY!fBsWyHwk^z*tZfBr+t1cO?p)dax_8M{vU>}5?*{YW zSkWHJy;gSlmL^LsU%}rJAeMn{F(P> z9uIw$)9)n`Jp|VGuQV1Nwyh7)AGVMDsMO=8CRF-{7N2!16_?L&$K~REIzqn`zIs?Z zpfScI;>zL}D~dnV3~DS@BIk%hH;E(NmM|(Ib1_HWBy&BE0vN9|GZOSo+PrqY=2peW zG%Fs&kBW=ZW10}}$hpQKxbPu>`F($kLFE1K$%i0(P1flmYP;4AX z(xS4jdf_)q>f{zJn=&^*%VPk6;xz1xMoyw?CW$ga`%#oEoart(|d_&rtn_QFo;SSw}u zDeGs=+BH%fY8RK}nPFZ4`&$xE!jJcLVN*b@?S%d+xr41A<5HT4~1Ayy$`B-W*$j zA4M2L2pN16r7rSDP=}BetLo`U$m)prOUcnGn4r^>Feoq*4tqW*k$S|821Yn(2hFsa zSn;5x5SHw!djTqpc*`q%-sQ)|=j@F5H=dDIt_wrES}2>5?!=>*#sQy=3D_f39`*(D znQpQ@iS$iN&nbn2vKj3Tgmnk8$*cB$6TJ)jPW4@dpTz?NZ2PeH;TogVTx%I6zhsoY zo4Hf_)%a**>OVzd)6yP6?7Sv=mCb~36Z4IbzcALz@&8xfuEOY5+zCDn<~ZUW3V+L# z(uZXD5jnL(PCXb5#pow=>tZWC>ZeEB1b6KWqtnvXwN_@# N&y4*;aEHlI@)QTS81(=E delta 1698 zcmZux&u<$=6rNdo*WUH-#QEW*i496xmO`AAL`@?oLTyMRh}#e&p>VKV?~pk4k7#x+ zlt2|9atI)#M1#~Gb8Hk2Mf?LCQMuF* zuVPQm1b+wwGy+d&$HvOOvJ>p3zwVs-R+GpKF?^fE@b7HL<-l4%5AOW-nxgA4=n zO+p69Cix{8zc+LcOjc(OBl>oKJ)+kl`u+4lWJ-K45BmS|QaRbI;S*n|G4Z2pYWQEp zY-x@AMO>Q{Un)JXgrTG@135+0_E}{sTga^Pe2%4brTy<@F{XAVTWvZ0z6$x+z3B(o zB!}VXmTX6opDE364~h=YP_zM8KWJ@EXw%hsM39ljVTeMHidnbEFV2|y}77F}D z7`2$+^^Vh+_}P1Qp~<|~-kU=aW;@LDb2v&OI89!}Q5&f`t|3H3O1;=LgN{tmRWVD4 z#RIitgSl3`u%qoU+=c|^JT{-=7*Ym9Dkp0mw4&X4;`f&7>w#5XHYz!5#L8O*mIg@_ zvs~dh#*xAG$ZE6Y=+$$2j`&IVK7BoJQmf?0pGdGX#L=sB24pDv^$~ z^emTZJC_bSE$3f>bbbxN(Wi~dX$&9?;XV`7;3o0Mchhil_@}DVhoPaZPwJteT4?Cr z_3x~M(7V-ZNMKq*0@G5HK&+6`gW?-sZo@f8P7_Y?XFvF__w^#Uy}&N>1<1ks+{^&{ z>7tZAB4;0y@t?@}BXXhP)@br>e?2x{i;Xu3Od7o^eUEN`SnnFGb&WO%&Klhcy-n|) hulG&V`X(9#W_`2~R%lw@> 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 F{tubjU}^vW diff --git a/orders/migrations/0002_sellerorder_remove_cartitem_product_and_more.py b/orders/migrations/0002_sellerorder_remove_cartitem_product_and_more.py new file mode 100644 index 0000000..bca6b40 --- /dev/null +++ b/orders/migrations/0002_sellerorder_remove_cartitem_product_and_more.py @@ -0,0 +1,46 @@ +# Generated by Django 6.1 on 2026-08-14 13:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='SellerOrder', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('supplier_id', models.IntegerField()), + ('order_id', models.CharField(max_length=50, unique=True)), + ('date', models.DateField()), + ('item', models.CharField(max_length=255)), + ('quantity', models.IntegerField(default=1)), + ('customer', models.CharField(max_length=255)), + ('total', models.DecimalField(decimal_places=2, max_digits=10)), + ('status', models.CharField(default='Pending Acceptance', max_length=50)), + ('carrier', models.CharField(default='Pending', max_length=100)), + ('tracking', models.CharField(default='Pending', max_length=100)), + ('eta', models.CharField(default='N/A', max_length=50)), + ], + options={ + 'db_table': 'api_order', + 'managed': False, + }, + ), + migrations.RemoveField( + model_name='cartitem', + name='product', + ), + migrations.AddField( + model_name='cartitem', + name='product_id', + field=models.IntegerField(default=1), + ), + migrations.DeleteModel( + name='OrderItem', + ), + ] diff --git a/orders/migrations/__pycache__/0002_sellerorder_remove_cartitem_product_and_more.cpython-312.pyc b/orders/migrations/__pycache__/0002_sellerorder_remove_cartitem_product_and_more.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..446d3679fa7195602394874981526acdc3792432 GIT binary patch literal 2231 zcma)7OKclO7~Wmm>$T&gYd4ACsnaGUn@4RDs05UvG$ADwO?FA#IZMW;J^_SA9BpG>M0VJwQ9-MoRAO)-;5fB)C)U23O>>d{M{>JSTA1IUqdZfD7{5MEB*h z@9Idhu3fj{X;DTIu)nAmkY?*8)52o01fXH%`!&yYndeUh>J)NW9&lL!@C82W5;*AI zW&!uBa3l;s@5JqqK{@4soBTXLta|s|o!ff?kQiEi6}{gT5sZ&vLa$V;m55ncCoj zH3JXbfrbImCcVRg4nAGO!uqP>#sRHjm()ChnhgOSDkHt9p0coX^9ut(keK2#6M^tPOOlu(Tfd5 z#*)ems4DiWDp_(B0}?u*swANX4Tf?6mPrnvnb)C(=&r;=E3D8rX#|KaD;&6{7nVs2 ztkKYMVBNG~0iq7)TiMcj-79GsfUbBI8qkK!5%!nLu)C3e z<(?C-+zXW6BE?Pb=mis6TWM0ctx7K4tNB+jXOXn!NF~Sv(k%5>`v1M2CcV9=TCAlz z?T1(tYA@evFQu9ZNO};wRNh7OAB24dkxgY!uX`&`g zG=mer2gjW7?BktAc(xXvJ#-&UIa$>)Q9W!qvP}R^YUyXOky@&ymY${FcI3;=VBASA z?0w!yF4U3>hoL8{_2jxE-)IKIPE^?&Z$y<^RCyMibL9C!*}{-q<|Z3bgbVt#L}k(jR~<`3>3E!7j7j(ls-{(*k9QcvD;= item.quantity: - item.product.stock -= item.quantity - item.product.save() + prod = item.product + if prod: + SellerOrder.objects.create( + supplier_id=prod.supplier_id, + order_id=f"{order.id}-{prod.id}", + date=now().date(), + item=prod.title, + quantity=item.quantity, + customer=user.username, + total=item.quantity * item.price_at_add, + status='Pending Acceptance' + ) # Clear Cart items.delete() @@ -141,6 +142,9 @@ class PaymentSuccessView(APIView): order.save() audit_logger.info(f"AUDIT - Payment Success: User '{request.user.username}' successfully paid order ID {order.id} (Payment ID: {payment_id}).") + # Update matching SellerOrders status + SellerOrder.objects.filter(order_id__startswith=f"{order.id}-").update(status='Ready to Ship') + return Response({"message": "Payment verified and order confirmed"}) class OrderHistoryView(APIView): @@ -149,7 +153,40 @@ class OrderHistoryView(APIView): def get(self, request): orders = Order.objects.filter(user=request.user).order_by('-placed_at') serializer = OrderSerializer(orders, many=True) - return Response(serializer.data) + + # Merge tracking details from SellerOrders + response_data = [] + for order_data in serializer.data: + order_id = order_data['id'] + seller_orders = SellerOrder.objects.filter(order_id__startswith=f"{order_id}-") + + # Enrich with tracking details if available + order_data['items'] = [] + for s_ord in seller_orders: + order_data['items'].append({ + "product_title": s_ord.item, + "quantity": s_ord.quantity, + "unit_price": float(s_ord.total / s_ord.quantity), + "tracking_number": s_ord.tracking if s_ord.tracking != 'Pending' else None, + "carrier": s_ord.carrier if s_ord.carrier != 'Pending' else None, + "status": s_ord.status + }) + + # Aggregate status + if seller_orders.exists(): + statuses = [o.status for o in seller_orders] + if 'Pending Acceptance' in statuses: + order_data['status'] = 'pending' + elif 'Ready to Ship' in statuses: + order_data['status'] = 'confirmed' + elif 'Shipped' in statuses: + order_data['status'] = 'shipped' + elif 'Delivered' in statuses: + order_data['status'] = 'delivered' + + response_data.append(order_data) + + return Response(response_data) class OrderDetailView(APIView): permission_classes = [permissions.IsAuthenticated] @@ -159,5 +196,20 @@ class OrderDetailView(APIView): order = Order.objects.get(id=pk, user=request.user) except Order.DoesNotExist: return Response({"error": "Order not found"}, status=status.HTTP_404_NOT_FOUND) + serializer = OrderSerializer(order) - return Response(serializer.data) + order_data = serializer.data + + seller_orders = SellerOrder.objects.filter(order_id__startswith=f"{pk}-") + order_data['items'] = [] + for s_ord in seller_orders: + order_data['items'].append({ + "product_title": s_ord.item, + "quantity": s_ord.quantity, + "unit_price": float(s_ord.total / s_ord.quantity), + "tracking_number": s_ord.tracking if s_ord.tracking != 'Pending' else None, + "carrier": s_ord.carrier if s_ord.carrier != 'Pending' else None, + "status": s_ord.status + }) + + return Response(order_data) diff --git a/products/__pycache__/models.cpython-312.pyc b/products/__pycache__/models.cpython-312.pyc index b75eaeaee359f50f374a36825b37fcb614a1ae77..af6698b532d7b193adc98b1b34ec2e5c5d5e259c 100644 GIT binary patch delta 1084 zcmZ8gO=uHA6yD$LZn~Role9Lmwke3ZR3lPBM2eK!DuO{!K?)^ov)eZ9=EvDhwWW|8 zdPq;D%tbF+#Y0PTP&|m>$&(;R3x&o3L5~W8(u&|k-y~_o4(zvYzW2S^_ujmH((xdq zz0)*51MAt5;`FN(?Xgd|<=QB<($>zsVen`1=*r%G*-{pnQEkru;wgKF#RJ0e;5wTy zSQLc7b(RRO?M&di!Z9|09|{pZVFd6i;j|ANPGJ&%6VCN^f)Yh2L@D_8K>))Y1HfbA zZEjb_uf?dJdgeQSsDvN+BAQSUH`oTFPzKMis^sSwo1gB$XMCY{ z$&xF|2G`K2HBXd!G=HU~85^Ln?LJGbXicqN)5fT_sDdZZ^t5rzWyaDM8LPF)1+6yd zO=vD?gotz<<*Y)=BXYiOxFZHnlw3Ax*^cemL`Ak^dbX9!ni-pD)_5|N%eo#i(^>D! zAIKHS6eNHz^j7eubn47agF_0XDFb#3yoiu3I8F+z=4!Nq*$rcs3l&F&Io=R{tBsW6 z*KE%uEoMHQY~(hQFhmrBa1^G{4nSnc$TP7k*S7a zWw{zWv?SGUn7XjcYcMGBt3>qDo@1kKs;4=|>JtzHb6(%iE}4WbB$GWK{*O-@VKi0i_9lIR-WC_V_SM` zHT8lU$|E~!*OuC~#&4@9OT)pc-b3|0TYAr0|F(X*bOnD^ zE)@R>SI@3l+iHJl_?N(moj(|WU6~c5^;XiaCk%-w*0h?}Dy88B;^{ROWI4i^9b delta 1439 zcmaJ>-EZ4e6!(qo#7^Sc`DjQYx}_f}xS&=OoA?k2M$4p)twLKtD1w;~yHQ#<3D-`y zRFRU0N+bwqD+>+Ywt+;aR#PV)c;JO+#zU(`YIU{!0X*@sg7$*oT<3#nnz)kBJ?D3S z_xSjp-}P6K>oMuJB>5Q_k#K$Cj}7UX=(Eg9zA#_SZG;B-HmrQS@$(PyCNqz8aaG7j zx__0)3^bX`C?j8BzFR{dA(;o74A1>Cm@kkcvGKZVmL*-yL%=$dxvN&%M z@8TtQ7BwwrW-Uw8EV?n3N;PnjW=Mfqk*2e@kuTxuB+W4Zko63h2My*xj;vKbsosqr zy~=$nUK8)cCz>;#p1vzcEnh3RuI~!zFX!(FX`BFluKP(0ROA+U1L0wa zoEO<~6mdRa6CPD@YU~t`k5Kp)`+VvtaER2cGiR8lrorYhKrNd0HRpFW%ICm);E3G2 zgNFjkkN@RIe8PP<_QDG7n&&3kxIN}W$Ru{I#UTZRvQ{)qMzaH2Q_ID1rJ89LA3|-O#z#Q1>Ha?@c%#lZE5CTi?za#9j z#vjXaE2-0^Ow^@KJeH>Plg0jr73#B|(8HkOcr~I%iSI33(knTe2<47rsU9Mhikfbi zhHa1_4jU$@L)VJgCF7TWpa3j5cJw#=rt-FLZei+0|WpdT(M%B&_x=k zhy=40yQCFMm$a;|LoD=S=ZJ6mb$SMFt5Y3mQbDZ9-TEd$xi;1`dYo1eOh=n5t(9G& zqkvg8;e72I9;QMdzUh+}rcchiL4;ga+W2X}@ylSGUwyIqvy{bKb}6?=SZlFDgtyP1 zJykGForr~{Y~Ii+*d*edaoO&m0o|~2xKOqWr6Q(%!1Rg`X$JDo6_$(+%b&xBdstp&Yn98jq*5onjPW4O-9P1}At8n2`&Ep#&_QN{^G5RyXW6)%kMj7 zVbHlEyi`|?u6wV@8}jCJJNl2&wsNX*`XD^AKE59w*$a#_Y%dM}jTIo=Mv&^YrDvT3(N#~WwvbBIrNDx|f|sy-s>3)y16G^u}x zsjf+AtP51^f@w|Ka6ay@i16o1AQ|@>;wk48Z&OqbI8}>P=2(mf+?n;s%NoNdt+={mdqluQHpd zDF8XVKwQiNBw8452#9yE-V#jiWGfN_3KU5I2|rDa$%ZTnY>FTOwaGy&YF1_t#Uh#$ zyswLBUKG*XAa$VRiil5x?+pRf3EbBOR4)pst_VNCaz((k!Sg!{6Ke|NCk7BXc^=Dj YaW=*j#u?n#C5$gh7=L8|@xZnL02zf)$N&HU delta 257 zcmeytb%u-gG%qg~0}u!c)n}=1c?+|N&@Jwi)Z*l#%z~24{JbJQpn}OSn9bDWfD9fWE(Q@T3^xSCJ6LZC)_1ZM zi2((QB!GmUCi`R;76nFy$yqFFYDy4wBAOGtuZw726w%xuf5PR8NMM8ScNQjA2c}O9 eAae34mg(ZGj1EjQxUWkXUz9NZ$^hbl4Fv!(+eB~x diff --git a/products/__pycache__/views.cpython-312.pyc b/products/__pycache__/views.cpython-312.pyc index 878359fa12a394f3760f8ef8627736e341c276d3..d561645e6ea230e37b2a8297b9977af24a840bbf 100644 GIT binary patch delta 621 zcmew+bXSP?G%qg~0}vdQtX_ zoUFy-UC)%lu$l>^g@K`#xrV7osD?3%7s5v-YnawBuV#dZ)H2pE7inNuSHcg|Rl~f7 z1*QWMW2;%?^WejG}Wb>QM%^EDgQN#%}r$`t`++t45$(fwTDl04k65;_8 znk=_iic@paibN;RWYuDno_vJWM63rW(ZFy=SZcccMEmQ)Y8QpoE(>c+7G|sVk^)Nk zX>t|`fD8}>5keq>8$^hK2o?|_4k9E#gf@tf1Q8&eMbaQb7EDaO!KSGI76kE=ffx>; zfynSVZn7dfIFRGm)$18GnQjRN6y>LsCYQLRmLz88gk`3d`)Tr^I|lCGA{C&KMWP@A zrvuU4rVCOGBIJR%SQALJFx=o5>#y%ruD{N&bdg`_GQUcL#|?3f3oIfxq*Sj<>0Ol4 wyCA85kwvUXYO)c>Mm3OkZt(}DmK0^CmZdrdc!Hb>HWN7@CUbITvVgn~0H#=O*#H0l delta 588 zcmcaB^i7EOG%qg~0}u!c)n{pMSHDlD|rOf7&&oc5%e!}d? z$UIq%#k-y*g<&-lNDl);EprW1kx&g|7Au60Ox7^1VO`A#5vgUYVJ_0ZuC9a^rmKc| z4I4}ciYPlww2Ga9K^(>b8p;^VpvmDEQp685VlpFZur+%TCy-er0wP3##4Yxs)WXu# z;*wiDK&q%Rz96wEF}L^@b9!n?5f4y-Cd)0B;?$h9BC*L+ShW~sChuo8k)8;YXkfS_ zEH&MJqWyJY&5OdC8(c03YhD(%oXp8q?IjJA_tWGo5(LskLLfpIL~w%$aS*`*A|ybB zB#6)k5mF!mq_ao{M96`O$>-QKIl+P;{^WYb`g*~DqWqN7iV197n)kZ57J!7tV?Sl?NHonQ4Lzv>2-3;e2=`AsKr cNB~oVB*#WZxyh$Fq_~j`n*4zylLh2_0K*<^?*IS* diff --git a/products/migrations/0002_alter_product_options.py b/products/migrations/0002_alter_product_options.py new file mode 100644 index 0000000..1daef3d --- /dev/null +++ b/products/migrations/0002_alter_product_options.py @@ -0,0 +1,17 @@ +# Generated by Django 6.1 on 2026-08-14 13:53 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('products', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='product', + options={'managed': False}, + ), + ] diff --git a/products/migrations/__pycache__/0002_alter_product_options.cpython-312.pyc b/products/migrations/__pycache__/0002_alter_product_options.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f91b0203c46b7d839f538b6261846a08fde0e892 GIT binary patch literal 652 zcmYjPJ8#rL5T5nxeC8r0;h;c(gmfUeiI0>BA!tB~Na!u0)t-0d+ruwxALuGTN=A%pwbMVd1Luzr903PT zB8Z7k2x#yExONC!7i3}d4eRf*-eO-{8Ls)Kc3h&IScW+(WttShx)$Ic(Nl~bfdHRy z@HI|C;_Dg+W6>=6e+wWz*SR6dck@_lGgxh{EO(%W`#q1VDLczkz6{Djji%G-Ln;$l zN*1X>7gvLrB`g&DITjlUi-j7bS+nE;&ax@3W0Wd~(ikU2H6Bs=cFCeHGvXo>2^UEq zMUmIi)z-796#0J2Mf9p2rkpero%(NZUax%h+MB1b@ZQNV5yjjKWjSBYykJ?B7|!2| zSs_a?W5FAo?)5sn^%Xr-v`bk{MY}ZZcHhZXd41Q$SO|(;G>1@GFuY&s+SvN|vT_iA zc24cdi9I>nx^;Hr?pO2Y_`!v#51mRkx2;cm`SpItfvc+_U$7)hclfN4*)nX`6;0U~ s(UtwUJ=2r?Cc5}jL2(;Rr4vFfEg<(UtZT&j;+$?yPBtf(fKJo>7mfF(fdBvi literal 0 HcmV?d00001 diff --git a/products/models.py b/products/models.py index c1054ff..cb2d48d 100644 --- a/products/models.py +++ b/products/models.py @@ -1,5 +1,5 @@ from django.db import models -from django.utils.text import slugify +from django.contrib.auth.models import User class Category(models.Model): name = models.CharField(max_length=100) @@ -11,25 +11,22 @@ class Category(models.Model): verbose_name_plural = "Categories" ordering = ['sort_order', 'name'] - def save(self, *args, **kwargs): - if not self.slug: - self.slug = slugify(self.name) - super().save(*args, **kwargs) - def __str__(self): return self.name class Product(models.Model): - category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='products') + # Align to seller_central_backend api_product schema + supplier = models.ForeignKey(User, on_delete=models.CASCADE, related_name='products', db_constraint=False) title = models.CharField(max_length=255) + category = models.CharField(max_length=100) # CharField matching seller central price = models.DecimalField(max_digits=10, decimal_places=2) stock = models.IntegerField(default=0) sku = models.CharField(max_length=100, unique=True) - image_url = models.URLField(max_length=500, blank=True, null=True) - description = models.TextField(blank=True) - is_active = models.BooleanField(default=True) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) + image = models.TextField(blank=True, null=True) # Textfield for base64 / URL + + class Meta: + db_table = 'api_product' + managed = False # Managed by seller central backend migrations def __str__(self): return self.title diff --git a/products/serializers.py b/products/serializers.py index 75fe9e0..75cce02 100644 --- a/products/serializers.py +++ b/products/serializers.py @@ -7,8 +7,9 @@ class CategorySerializer(serializers.ModelSerializer): fields = ['id', 'name', 'slug', 'is_active', 'sort_order'] class ProductSerializer(serializers.ModelSerializer): - category_name = serializers.CharField(source='category.name', read_only=True) + category_name = serializers.CharField(source='category', read_only=True) + image_url = serializers.CharField(source='image', read_only=True) class Meta: model = Product - fields = ['id', 'category', 'category_name', 'title', 'price', 'stock', 'sku', 'image_url', 'description', 'is_active'] + fields = ['id', 'category', 'category_name', 'title', 'price', 'stock', 'sku', 'image_url'] diff --git a/products/views.py b/products/views.py index 74a0d61..7534620 100644 --- a/products/views.py +++ b/products/views.py @@ -15,7 +15,7 @@ class ProductListView(generics.ListAPIView): permission_classes = [permissions.AllowAny] def get_queryset(self): - queryset = Product.objects.filter(is_active=True) + queryset = Product.objects.all() category_slug = self.request.query_params.get('category', None) search_query = self.request.query_params.get('search', None) @@ -29,6 +29,6 @@ class ProductListView(generics.ListAPIView): return queryset class ProductDetailView(generics.RetrieveAPIView): - queryset = Product.objects.filter(is_active=True) + queryset = Product.objects.all() serializer_class = ProductSerializer permission_classes = [permissions.AllowAny]