From 0d7e5edc41e2bee28ee618f62ce096f8b4f8145c Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sun, 1 Jun 2025 18:32:07 +0300 Subject: [PATCH 1/8] Features: 1) Add code ownership for .mjs, .cjs, and .astro files to SaVBaD. Fixes: None; Extra: None; --- CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CODEOWNERS b/CODEOWNERS index 9bbaf276..2a23c894 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -28,5 +28,8 @@ storefront/ @SaVBaD savbad@wiseless.xyz *.mo @fureunoir contact@fureunoir.com *.html @SaVBaD savbad@wiseless.xyz *.js @SaVBaD savbad@wiseless.xyz +*.mjs @SaVBaD savbad@wiseless.xyz +*.cjs @SaVBaD savbad@wiseless.xyz *.vue @SaVBaD savbad@wiseless.xyz +*.astro @SaVBaD savbad@wiseless.xyz *.scss @SaVBaD savbad@wiseless.xyz From 06b890889c8ec9ade1dd813d04453b3925de54f4 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sun, 1 Jun 2025 18:42:44 +0300 Subject: [PATCH 2/8] Features: 1) Updated translations for `en_US` in `django.mo` file; Fixes: 1) Resolved inconsistencies in localized strings; Extra: Streamlined formatting and corrected typos in comments. --- core/locale/cs_CZ/LC_MESSAGES/django.mo | Bin 42364 -> 42170 bytes core/locale/cs_CZ/LC_MESSAGES/django.po | 6 ++---- core/locale/da_DK/LC_MESSAGES/django.mo | Bin 41033 -> 40825 bytes core/locale/da_DK/LC_MESSAGES/django.po | 6 +----- core/locale/en_GB/LC_MESSAGES/django.mo | Bin 39613 -> 39400 bytes core/locale/en_GB/LC_MESSAGES/django.po | 6 +----- core/locale/en_US/LC_MESSAGES/django.mo | Bin 39612 -> 39399 bytes core/locale/en_US/LC_MESSAGES/django.po | 6 +----- core/locale/es_ES/LC_MESSAGES/django.mo | Bin 42471 -> 42273 bytes core/locale/es_ES/LC_MESSAGES/django.po | 6 ++---- core/locale/fr_FR/LC_MESSAGES/django.mo | Bin 43493 -> 43315 bytes core/locale/fr_FR/LC_MESSAGES/django.po | 6 ++---- core/locale/it_IT/LC_MESSAGES/django.mo | Bin 42851 -> 42647 bytes core/locale/it_IT/LC_MESSAGES/django.po | 5 +---- core/locale/nl_NL/LC_MESSAGES/django.mo | Bin 42128 -> 41928 bytes core/locale/nl_NL/LC_MESSAGES/django.po | 6 ++---- core/locale/pl_PL/LC_MESSAGES/django.mo | Bin 42317 -> 42130 bytes core/locale/pl_PL/LC_MESSAGES/django.po | 6 ++---- core/locale/pt_BR/LC_MESSAGES/django.mo | Bin 42424 -> 42236 bytes core/locale/pt_BR/LC_MESSAGES/django.po | 6 ++---- core/locale/ru_RU/LC_MESSAGES/django.mo | Bin 54556 -> 54427 bytes core/locale/ru_RU/LC_MESSAGES/django.po | 6 ++---- core/locale/zh_Hans/LC_MESSAGES/django.mo | Bin 37975 -> 37765 bytes core/locale/zh_Hans/LC_MESSAGES/django.po | 6 +----- core/viewsets.py | 20 ++++++++++++++++++-- 25 files changed, 37 insertions(+), 54 deletions(-) diff --git a/core/locale/cs_CZ/LC_MESSAGES/django.mo b/core/locale/cs_CZ/LC_MESSAGES/django.mo index 7b3dceb8bd6108e2bc0a1044b6197ce5bd5c1ee3..608769b1bea663b9c0e9a5dc6466dc884c875d92 100644 GIT binary patch delta 1225 zcmXZbOGs2v9LMoLhH2Wvpzzh>W+aqjmYS6&nqVlEDTI$+G|mi0*36(|(S(i?L}i-g zJM%TUD54Tv6t0v}GFQ>2R_)p(ZL-2Zu7T1LYzT z^*|&K?WlPa*WwZ;;R^1?q*l`tm_oj4s%*F*giplLF8F<;U%W@8N{xX(f+9UHoEm%UH#v+XAFs;H;aivS z$HoAI%?$3KF4&EFl0iI=pHL^-x<%GuI!5C$+=E4!fNtD`_c0gyaRR?!6Snr4>qhm; zYQ=L=TM%ewU}Nyg@++p2!}~-IV+J0?TGTr*h#5F-P27S(%*S`AC0)WYj2JLKtim{Q4LY$Ib))a7>%=}2Ie-PI zxgHa72(^Nfn2$5KmHj1r(EK0~wGyW=3vXdIj-$3_0k!mt7>O&m9V3U#(kG)HAPd*y zNzBAb)cI}b!yeRsNAxgvh5h9a1HGN)s68A;J>gr_R?MOH`Y*=dwh^<3si>v(T6qc! z$!kW<78Rpbq7ifO4W7my*p5enTwGoF1B2uE6LrJ1=jO>TqL#1^wZ|b$!Cz?LjxqCx z=Ao`riMy}~<8fqcVm>k7T|V3A^34qRT@J(P@!90_ w@z#57_MXpWcd|6S?f=Kufz delta 1421 zcmXxjS!feM9LModJX=rjNK?d7@xf!nTU4a6QV_)J!CS1G?AoMBH|u62riejB!Fu2K zt@xrS)Qbv&pom3Zd=pW8@WCfVP!#d{{ zO4TW)M(t5*Ii|1&cHl^SjHB>FWUswSjU$goX%HZ<>Gv>?tWzly9q zq|_3!eW)A`yh}rhhHtnQR~=R=iT6+j)*K0KM(KZuJu!Avsi~;3A1*_Uc9eJGHuBLZ z4>`tM&g@ZDH>2FT!FHaMqGo3Q3ig(-uM-(@ehv1s^dz$JsaweUz)YiE{LJu@^qZ zVc3as^dC_+@B{l`-wWZl5l0!n7z131@^`#MU8eX>Azx?gVmOh7G4e)~t7t>H>jyXh z-=W;$XOyFzd@0P^v4Q*)<%+5=ha0QI*<=qF;tk|SQa^E>OuYMwQgiVZ%7R}|c0T-S zc!aA_?szB4e}4xxzDIe{F4w{rjN=G$0&6gNt-Z50;g;=uD(m<Ab63EZ1ssCU_-nJC2uY41CKiy6zZSc*8%46w_$+*&&2}~xCqS-Rdo)p=v$yR1`bH>d{ ziD!b^I)z57 R7^I~unaek|uWwr&{|6eb8L|KX diff --git a/core/locale/cs_CZ/LC_MESSAGES/django.po b/core/locale/cs_CZ/LC_MESSAGES/django.po index 9720b73b..a3dd3530 100644 --- a/core/locale/cs_CZ/LC_MESSAGES/django.po +++ b/core/locale/cs_CZ/LC_MESSAGES/django.po @@ -615,10 +615,8 @@ msgstr "Automatické dokončování zadávání adresy" #: core/docs/drf/viewsets.py:495 msgid "raw data query string, please append with data from geo-IP endpoint" msgstr "" -"docker compose exec app poetry run python manage.py deepl_translate -l en-gb" -" -l ar-ar -l cs-cz -l da-dk -l de-de -l en-us -l es-es -l fr-fr -l hi-in -l " -"it-it -l ja-jp -l kk-kz -l nl-nl -l pl-pl -l pt-br -l ro-ro -l ru-ru -l zh-" -"hans -a core -a geo -a payments -a vibes_auth -a blog" +"Řetězec dotazu na nezpracovaná data, doplňte prosím data z koncového bodu " +"geo-IP" #: core/docs/drf/viewsets.py:501 msgid "limit the results amount, 1 < limit < 10, default: 5" diff --git a/core/locale/da_DK/LC_MESSAGES/django.mo b/core/locale/da_DK/LC_MESSAGES/django.mo index 1a2603b56b1e5f99fa8e3ef3e15e283aee6ce6c5..6513d29eabfa6fd10e8827abd760a88e4a1e8ca3 100644 GIT binary patch delta 1211 zcmXZaOGs2v9LMp0qLo?^W;UthXgOs$Jmpte zd3-_S0RF*B^mK_V#q*eky_kXbZ6`2`{MF7e+qK=+d%G~3=aqOITd*3Z@hCcaL|k~X zMay~6GI({}w0kzBGD4`T@R z#BVSer;s}pk&g`YGX1a$l6ccvFcbXq>wlx3U=cGh{3Dh}!WOx>#TGhOEm~gZkkS)DJvGy$h3=j&ryIm)sHAhpW(whfx3N0G8kk z>MzQ?YjvU$i^(0R&nNH<{>6H2{pn$A1HL5dg2At z6D5s^Y{X*J4cCv1e#n?@_SQxpI2(MXudyZUH(I0P;eg=}8ipD6hXVOdvnkjZ9dCBF l`$NH|fMNcB)!7*KIRpL{cSVic2)3E6ZJ`t9=u}s?;~&bl*nR*2 delta 1421 zcmXxiU1$_n6u|LgFrwB%Yb1uG+S^)Fwcc32LEHLCX~EB!2iu2+$?mwj+0D#!c2=86 z9VjKS+E_o@n%b&)6B|K62q-p~J{cbbK@lxfCh|IvFs0*IKg*bvs@XyrQ2b1ybsr&FP>O*OM2X&!| zUyE$OHvA9=()^Fq=6;d2jCc0O$%{h_=+6GaEx7Sek{?6O$5U5+ljOZv%lK_vg}>nx ztUoMb(BMnB4!^|KG{1v&FNbqo|!5 z$I18~uE9x1=_bC^JvB6y1WE1JJeTHc21$op_Lj^RA4{Z8a< zY{A#D9rZ(BU<+POeTZ|(8@?CWgzurA_#nQ3N02)e%Si&gOqY@Yxr@5sKd2{Kd_1|F zt593~Io4wzZpBl$3?HLzV9r32x8fW69?rmXsF!*a^`O_Vk@e*%fu7{$ACd{nP|;xKCKe?dLLHGBncVI4lf2CO|HG9725&R>i#Vjf#@H)_Ynu$lGc8G&9h^JDU1 zAN2!!QSZVbY{X%lhBxsY{2f2Qrk|33n#Hx`L#Vo%{$*XyJqjJKTyi4U*phKQ zo9ocP39S=qkSW_tj|N%CW{cIpwb}n)u9S7eEyvcaM!Q10t2!-Tumw+Rg~%2n4LTj$ z8E8-}+G6#KUdehT9SKS{NP@_ARHui&4Sg+z6&qGG=*inW8#UJ9kRj_kCg<{sV*;nU dtI_qMYHfF+!!5Tvl_;;Jj*_3d_@sA#!*fO+8uS1F diff --git a/core/locale/da_DK/LC_MESSAGES/django.po b/core/locale/da_DK/LC_MESSAGES/django.po index ddc0f711..4babf2c5 100644 --- a/core/locale/da_DK/LC_MESSAGES/django.po +++ b/core/locale/da_DK/LC_MESSAGES/django.po @@ -621,11 +621,7 @@ msgstr "Automatisk udfyldning af adresseinput" #: core/docs/drf/viewsets.py:495 msgid "raw data query string, please append with data from geo-IP endpoint" -msgstr "" -"docker compose exec app poetry run python manage.py deepl_translate -l en-gb" -" -l ar-ar -l cs-cz -l da-dk -l de-de -l en-us -l es-es -l fr-fr -l hi-in -l " -"it-it -l ja-jp -l kk-kz -l nl-nl -l pl-pl -l pt-br -l ro-ro -l ru-ru -l zh-" -"hans -a core -a geo -a payments -a vibes_auth -a blog" +msgstr "Rå dataforespørgselsstreng, tilføj venligst data fra geo-IP-slutpunkt" #: core/docs/drf/viewsets.py:501 msgid "limit the results amount, 1 < limit < 10, default: 5" diff --git a/core/locale/en_GB/LC_MESSAGES/django.mo b/core/locale/en_GB/LC_MESSAGES/django.mo index d947478f604f96c041edc7608daebffd064d59e6..ee037fdf1f4e8ad45b98220eb3cdd95ee5cd47c0 100644 GIT binary patch delta 1150 zcmXZbOGuPa6u|M5mD4|^q?TD2q&;w)IezH!Cd@?b@&S{tUPP_kGR^nkp5m=i80goa!Dg&Zh=lMUYDsUP z-pmZvqg*oc8ju$*$FWPVK1*Xe`Y)T;(1n|chfz0rfqJFCQEOeE6e&Rqy?6k1Jc?R^ dYpA81N~Wg#{qpCX7G2r54G|INKV{l4>^bI&>7`DO?d6G9GKN4r7sVoX$8CjSog%jU0&PU*Sg9RqYd5 zg9(h|Wwh}9J}FC#pk}{FH7>_VxDMxI8h^l(kq>YldtVVc;s)ml=*9&<#6Fk63ry0{weY^CQ-+iunAvBHgtva9u6h{FD}HJI0j##zRYLT zf@%+nY{7aQi(OcQ-S{nDFB9m8{isiV7aQ;)w&15Izv@spAIDMT*W)zYjC#=TI06r& z!83Rq?_&yoIV>^Wzn<3_pzF3dZYEZ+-;z z0;f=0bq@6+y{Hx4LH)N3;Anh-TF4t5j&-L*Y@CDj*ok$VFSiKR;4{=7)}9V~Ive%J zv;=GLSJW4AQCri2&Df92@e8iTpU#9W_yhH2uHZs^in?ypUn2bDr3JU@(+?1=!ne2p zfBaiyF}9)hvIn*2k5GI40ViW^cUW;F>ijy?7L-t1dA7Un(Ui-nax$ODI=+?2w|n`5 zV>um8!m>Tj^72mLmn^^NT3#tg=UuDacI}i?@0F~i<9NAkfp5EooEJsLuD~a#8y9d3ItR^uZCFd(jcu4h&G;2A z!aP!HOFq%4q2mwghThBO23l|daW`sBW;8L7G zE!k_-8_J`L|H~{5FCDJ5IdLQE!YFRT9@LXRL_NS`)KX2N9wd*N(G2QqDPk#>UNMPO zVhM2syKoOSVitY;U%t@L=i$hh8iufpcsJ@Z>q0jsQEy}zwKSs`!U6`c?y5)-52Kd! zHtNkxqaSBc=lQRR@WSN;9@MKZ(%6Aj!{#*{z$W5B)Qw)CUg>YtTKh(riy`#jA=L2% gY6)(lmh$CDcG5c*o3l6F84mKj5pK>tOaArz2k7a)Hvj+t delta 1427 zcmXxjUx-vy9Ki8knwe?4xgu%1=G9VH?X0+{DcP#Eu;arbC=^8`cV><=vom||_0FAi zmtu%D)AfJrf3%cv1x>Jq>?IJE zSl6&!q!ZJ)7SE!C&$dfd<`Xo1EAkqy#Oc_L3o(a_aVYT*T)_D6#MwKf{(U#<`You1 z{D|#%KN&afjQ2?;_TziZ|Fp9jFMLR%i$wFF$QsO`j?ds~{4=p_S3K|Ii{yXCC3p#6 z#Yd4r+<7ym5T~}@0C-M%#M>rP;uocgtKGAK|3LE!}%)w4v zfIT<^520>c!=-o+b-&36MBc^@T!|UficjH097bAQm0t+nB5@0K!>70i8@T=i>_F{l z3bpdDaT@N%wRi^S;}g^iP9KUdxC*tP9&E$|s4Y8bU=re!ziKotYb=! z^-M0Ufg2h()F4wfnSKqjuE`ebfi>Cx7gx%fvE{0<^=MOQHq}4N7fiv^xk6+Lkp?}k z=?OF_7EQ6fqgOIsNi#vo1aT0Vbp7+tH=(anVa0?M4f^vY&qW>MQe?>au9LGYah<^J k>us@KRG<5zkhbNGZY9d=RJ!EnWc|>|)biTnf#*~I163p!PXGV_ diff --git a/core/locale/en_US/LC_MESSAGES/django.po b/core/locale/en_US/LC_MESSAGES/django.po index 8c9a1341..c21ba266 100644 --- a/core/locale/en_US/LC_MESSAGES/django.po +++ b/core/locale/en_US/LC_MESSAGES/django.po @@ -598,11 +598,7 @@ msgstr "Autocomplete address input" #: core/docs/drf/viewsets.py:495 msgid "raw data query string, please append with data from geo-IP endpoint" -msgstr "" -"docker compose exec app poetry run python manage.py deepl_translate -l en-gb" -" -l ar-ar -l cs-cz -l da-dk -l de-de -l en-us -l es-es -l fr-fr -l hi-in -l " -"it-it -l ja-jp -l kk-kz -l nl-nl -l pl-pl -l pt-br -l ro-ro -l ru-ru -l zh-" -"hans -a core -a geo -a payments -a vibes_auth -a blog" +msgstr "Raw data query string, please append with data from geo-IP endpoint" #: core/docs/drf/viewsets.py:501 msgid "limit the results amount, 1 < limit < 10, default: 5" diff --git a/core/locale/es_ES/LC_MESSAGES/django.mo b/core/locale/es_ES/LC_MESSAGES/django.mo index 55164da3a6caca6ba9f2752ccbcc02753ee2362b..4e70cb9e3cb17bdea0fece9bc3848fad31000dd0 100644 GIT binary patch delta 1219 zcmXZaSx8i26u|L=QA!JCmJ3#1jZAYT%eBlX3!_4W)EBFZGm0_IHD{)Xs6iiVGPP36 zG{+?9MM5Je%9j?%iK2SzEik5{1u}vNs{iTUhne3w-+s^cMI$lcnV8%Dq+p$hd^jso zh85>T4qyOdF@hQR2Gj7TV`4~TJ$W%|`$5Mujw85%_GvtfAF&?yoM$YCaUDvx1f>u& zyX}P<98X|A?E_efPq765VgZ(1ux-U$9fvypF;?RoR$y6=$W9DkCEj=Z<+PXf2JL~T zdqo-;a1Zxke4l;dLs(0G*D>~@-QS2>p_{lFCvYjwVmAK36}aY-hzE->9!D_+CviSL z4-zC1yv8{EgylGgCgxwZ2ln6s@_xr*)Dn;5N_^?~9<^e>u^%__cMKz_?OO*#_Tq8W ziUl7LXbHb#CZ-LFY{Xrt2RVs4@eb;peL;N_30FkYu^5Z65w*l2Cy$^({ulS7an=41 z3m20IFqQqKi$FIXu^Z$GZYO_-iMV!1qy@`SCx%fEFo6yD3iSZl*X%E9!b0+plRrdV z=QHY+%^S8qcoD8x%p`#vkVi)RyQ&@#j)VsD@Uqh94#tibd!?jM_wqR9|8>7AC`5ZR_3sBd8ywE{D!ulWz^f?4DIun{w`6O(Wp z^)Ws`1EZLXaZ}Gy)2zB3rpxU$4VT+!w!FT8$NxWenSRS>_}aWidxzER_L&{IhUq#I i@cP|`haS7%<@Oluv{^<=o7eOht!^u?rgkzEP5B4?rQgE< delta 1420 zcmXxjZHN_B7{Kwzl}xP2d^dHSd@0|KiYD6L)RvT0P!S>XgS$F=@9e#I@9fMpcdmGs zV50nznt4rA%hz5I6iHeIR|E-KL8ZV?B8Z=~Es&MKFNtse=gtI|`+J^q&YW}RIcH8@ zZ|J|#a4s4fj~gWN_fC=bL}buzk&iHgFJld-;9;DMms9WHJLFH&eA-t@|BBQc&Z2(@ zZpB}4BM#pq(uR4Qj#u|cEb|E-(4Y%U`Z{qb&LwZfCAb?GV;|1Lr>SPI$Q&JqI({dv z#9qwcb6kO$n#eNzEcFU%`?Fe{4E%7P$j3CqxE61r?s)n)BJ1(f)IU)B8}}y_a&ZxP zgsS5dzL;Pv!66)q=dcNT(Z)xp12=vvG6XlLW>HJr ziKFpA>KW9E{f7MHF@K+6?O@VA_>jmN^7m0I7Jo^gCA^4l<9%F!uO3b|vK*I?ccY$J z59*z`jc?%-T!@X|B_-Z~n%B_6K3s=?p}xqX@0lAjIDz$L6@f0COB!SsHj|&iG58O5 zpd3ja%%g4~LOrsBs0%(seWR&IrGBS2pypqo&hsnkrM`yx!Z&de>&r8O*)&W%mOQu$ zb;2rsfM-#6K7g;`Bh;g6IG$AC6&y)!a3VJ2aBRaS^l=!T#xh>OWjON$>&65Hg4MVm z^%C7hy%PgyaL7rK5%@0Z#4Xr@n@}(332erH(|q9%$yc%i^(fC{2K#X-PW@4YqKb{J zdZteamTSjPNolgE71)b;`ZKHvXI(K?~|eJ5ev==V;+s9EX4QT$?c2k8^&u z#QMtYrs*75GjRR;{q&SwS@__@32edv@NL8&s{F;{@)OD73w@Ye$Y{ zT+8uHzFh-5Ge6MNj*Rkts$R zblRpf(4bT@rTUDXYdlw50@nmd5SjM+aNQMyoJZxKX6L?jU*_0+$cp{H-Hz4pxPwfCOSZ~c64{2m#>?ivxP zy&{r=udp2b+eDUQ4Mv~?qp;0(6646{?Od)}^=R8{jHh0YCD>=Xh{fc`+pX_SwToMl z82G|KEQWQ6gyUgM#7f+Qowyh0a2GD?v`obW^3$m1_u>hh!F<%NiJU|yX5p;u`Yw@d z@}e%cHF21MQU(^V9P_(H&fo;97l!s&8mQ_oa5W}g7uk(zxCWb0b?(LuIF6Tb8iO$J z22Elq`r`#RK_EdZ24ENNz<%`L94^JYUh7DX;7al$RGn8~B(|ek&;;(sr}zYaBWo33 zpS94Oevu4v4{k&EG=X~2SB$|;H${^1Af}^%X*h{n@f)fm3%X^^&%*8G4Va02xDVgk z^^gH;$1+fLJc6rm3`6+7OcAIBJV({ZAI!zggI1?Hs!Qrb)!{pg!jD*n0Yg@2HMo;} zz|LQyx)c7x93Lj5dcFWtu^1!xzH}3)2Ysl{?h~rp9XMibWjd;(Ige|x71iI-fsxp2 zk3Ys>@)$t#`AsoMQ{|i+_CP0foiKSVKk0oIKH;)3#e}I zl2MUD%*A6kh-LT_4`Jb5juCq>2j@}!6_NKuhS7l~YKzv5S%m|bLf(ezj7?PaMN~T! zbKkl&MHofyLA9_^RP&x;H2%Oa+~}JP9crw}tgSE~I&`gC*Ias2i}}F#7gswS4%4eQ zYn84RLvN1P%wes{+0a;TdJWyBRh-qUw0g?_=T*08jm|oUp;gD~=M0zWZKyL$uXf7x NIumjVe4aKv>@Re#?o9vy delta 1420 zcmXxjTWl0n7{Kw55-yc!6i8a7v_lG|0S=cI5HAGLh|m%cONb=UcDj4o-R^dFGCONn zL>J=&nxKG|Te-DhsSQ3DnutDvKHvos3Nb$L;7d(Rj8Pv9K}h(2JLA*u`_6aHoa>B@ zS4`Zl_%f_2RZkL09TZt5BJX`9(ur4a8diTSQi~4OvJsDBH- zNnXS)IF37U-lrlP@a@=ZxRJcFzZ7+RqhF+*h9T@kIVzF?7xjZTVjGS{^%BmY{a0L# zf8gU-e>~dx3Y<;ejvrzkXW~Pw!6#3MOhHp3c#5DIr{b%)3^(I`+=r9#A?lS(I?1ZB z5_RXZunyOwF382T*oWWXC1mYl2cm`khcA&gof2upQl3CRbQ&A*2V9ANXVvF;4lgsu1j9zw1Eh@JQk>WQ1Z9iFD&U)E$0+_1KRc_%-SkR1bg)a%*W#Zz6_=c65H_P;#miWSEpdAPaOo@J;5I z5rS=a2lXv9d=?$`8k|qwj&t#S)cO$W>m9>3e1O~W_2KA5hH*Xll#Beb_!@4)1E_z+ zEgVE=gx^z-=qiC0{=!wb?(^u53#j!`)D!vz8?kaUx`HOuh3!D?7vg-pfHio1?E5+A z{8BQP$k@P1t83#m^c)3PRIW9vwmZxhWVZIz3z9v^WCLyVFL?c(}DP)Q$*5l zixgrjp2F7{iR-ur!@ES1Fxj>g_mO+-yxVr#_6KIszlxW2-W_Y*4y+>ogejQVEkVg4 zDD4(W!!}IBan$yCJdSHvjCnmGx!7X+91oNKMjap9D^iZ-coKW?BL2b(%nDhyVj1~| zP|z9}bywsH4HvKyUttYy>a*UU&UOy9KklB$R=kEe*n&H83J>5M#^W+};y>Jlo&8pO zKZcXP3=-(X8H~b@n1|m{k1qT^o4~86C8@{FcpddY0o;aTwlDA~`CEL3tJsDk10n?& zH)xgOEM}7jhY1c5e8qHJ$0L|FWF37iYCejoxM;U;U^4l!VXFkSSV-Q7MYw=EKI(x; zH6F$Y?8fcbkGpxkj1%Z(dWU-1{$eqPjfiZ)60F8Es7F494xGg*TtwYq#zT>VSdV&w zeVB=#aR;uUZXj~hda-DXmG^Z2MIQ^y={A7i{nhb)_g!S3HN4*OXPpyghs5NZDG#s*>$Gzk$ z=)jmst3Ml)$g7dsO2_2PmjqX%vohfK`aCYf?KN&RoBlS#ZF&v2E8sOeezU#Zn?Yi@ nJRWbe&tv*c!)5on&4z~krqA8f==B8*kJ*@6ac-uh%SiYSN(LBqy{Cb+|eG10`BVElh`#?|lpzVp22oO|ivv0@AaMI@@@8gELd+|N;uTlH|f?II* z8IcchCw_vru@nEPyYZ~ZX7a(aRp0RmgUHCCh!In$@O4@N6`AXD< zI&cOS>h8leIxabVcM{to9HrCAf?&_yAYnU#Lglde!HB_zw9n zYJCD1;c1AxD_XG6E@!RuYEV_iHxFd;2CPag}41AX8S(PX1)Hp&!S z5@e$OI4Zfo?Q@yH#&HlwE=?*yQVxT-lIEf?=(nNmb!~Aa$T}AnyVAslrJ_w;V2XhY zO>egbHZeBQAX74#{TgJg$rfsXGui(;mrGi4rK)kYs3$Q!wPCru$%opOPfb46pwF7V zSc5{r6lybuMH3da5*JPEgVc1_h9{9pB5g{_CMj#MKWB1mG%%KrOjzFry^bz6h;5~R ct_#yz+d#hCmAY&>&1qA2G3p)Ndn#!94|qEprvLx| diff --git a/core/locale/it_IT/LC_MESSAGES/django.po b/core/locale/it_IT/LC_MESSAGES/django.po index 802212d8..352cc2dc 100644 --- a/core/locale/it_IT/LC_MESSAGES/django.po +++ b/core/locale/it_IT/LC_MESSAGES/django.po @@ -632,10 +632,7 @@ msgstr "Inserimento automatico dell'indirizzo" #: core/docs/drf/viewsets.py:495 msgid "raw data query string, please append with data from geo-IP endpoint" msgstr "" -"docker compose exec app poetry run python manage.py deepl_translate -l en-gb" -" -l ar-ar -l cs-cz -l da-dk -l de-de -l en-us -l es-es -l fr-fr -l hi-in -l " -"it-it -l ja-jp -l kk-kz -l nl-nl -l pl-pl -l pt-br -l ro-ro -l ru-ru -l zh-" -"hans -a core -a geo -a payments -a vibes_auth -a blog" +"Stringa di query dei dati grezzi, da aggiungere ai dati dell'endpoint geo-IP" #: core/docs/drf/viewsets.py:501 msgid "limit the results amount, 1 < limit < 10, default: 5" diff --git a/core/locale/nl_NL/LC_MESSAGES/django.mo b/core/locale/nl_NL/LC_MESSAGES/django.mo index 4d5fdc0847618ac0027b6c446947127638de67ca..710fbbdc8c17ae37ad17c4048e924bded659df8e 100644 GIT binary patch delta 1219 zcmX}qT};h!7{Kvok(ZX2w3M3dPtxLq6w;eWOXlUoqBcq6?>KWhsB;dDIqQOzUR6k> z$d)a(EV;-<7a@6D7w(!3V=m1_Vzcpm{Lfr{p6B`f&iOsR=l5?O3wkjc)bEM(+eM_W zMr1So#=V$TD-w(?xER|p0UrnafHv}wOICeDz_NgKxQg{bH1RVQh@B8~>~Nvt9dYPHtS zVFYZ^Y6Z?WX`b9TH zHew!XgVh+0{iu_BikbKpqc~qeZ(28s!&DXu(T0tfflpAM;3sMWe^46>>9iUN$2sIS zjKDP18`@DDFF`%H6U(s|(=g%|4RgNO2@3E$>JP^;65pdvW)c^m(PgbCV-|Tf?m$20 z<7?c43%jj}6k|Gh17_kF?!uY3nI7)LgRum!2<-R`_2bFDW4*Z-^{x9*-*N(%U~tdB zx086(Mz>)+9>Q3x!5F;XGw?FzqszX>d)hP{ro;4^?#feMv!bffQ{i+wY!qEiszzCv p+who%&+BrTZlm1v{NHZ)SaO&r67%hb>2x1C>2-SsMrz+g{{`ye-c$ep delta 1421 zcmXxie~4676u|N0in5iWDYDZp8`nh4@NRBvVY!={mMo-gm_=r-Z)UDD&Df1waWTG<`4KK5zm(EgsDBv)CZNkmYNSh|D8@8r!kdB)F3x$_DmeANeS1%g*6+yz9+WgSU|{ zLcNk+oQ*G_{?Nx|SjRK?G48;vN9iv9jH__wF_Goi+(6Jvuosu&SEvhrM|~4!BF*!- zkbDB~$FH#m|HON+`?$yoT!jzd%cuo@j_dI%>OmHrNITVohW%v)!F^0@!7kj3YjG0w zMAva8{*AX|?^_}{?8oPD6KcmkLv8&vd>Ch)ObZ;ux#T-hJ2!>{cocK&FP91QL^p6b zcE6pz&S$Zo{8iM-zd@T@@ zc@X#n>LZ%K4*U?cGiPxQUeD%l;-lp4?}u?Z{;A8k3YDeb3pI*r(93Vf08}KJg z@a_*pURpqKm|zIMM14H%lj)rgpmwH)dY6+pA1|W8zfcREeTsX}LmP)W71wQC*I-xKmMPR&k3+`n@0pTg iiDx3OG1BRRq&2srl6SRXubz~3D({D-(>M2B?ED`gu^Qw6 diff --git a/core/locale/nl_NL/LC_MESSAGES/django.po b/core/locale/nl_NL/LC_MESSAGES/django.po index 09f4a61b..a5f6b935 100644 --- a/core/locale/nl_NL/LC_MESSAGES/django.po +++ b/core/locale/nl_NL/LC_MESSAGES/django.po @@ -631,10 +631,8 @@ msgstr "Automatische adresinvoer" #: core/docs/drf/viewsets.py:495 msgid "raw data query string, please append with data from geo-IP endpoint" msgstr "" -"docker compose exec app poetry run python manage.py deepl_translate -l en-gb" -" -l ar-ar -l cs-cz -l da-dk -l de-de -l en-us -l es-es -l fr-fr -l hi-in -l " -"it-it -l ja-jp -l kk-kz -l nl-nl -l pl-pl -l pt-br -l ro-ro -l ru-ru -l zh-" -"hans -a core -a geo -a payments -a vibes_auth -a blog" +"Ruwe gegevensquerystring, gelieve aan te vullen met gegevens van geo-IP " +"eindpunt" #: core/docs/drf/viewsets.py:501 msgid "limit the results amount, 1 < limit < 10, default: 5" diff --git a/core/locale/pl_PL/LC_MESSAGES/django.mo b/core/locale/pl_PL/LC_MESSAGES/django.mo index 24e19b6fd662adf32e7f9892beed497bfe1144f5..f932adc6e9d681f83401cb7ecb94999beb838a1d 100644 GIT binary patch delta 1232 zcmXZaTS!z<6oBE4nW1H7U>C>olx9|T6BDyi(=tLVwZJgP7{*BlYsSX0X$E3I63Hwt zdFeV{@}-b6?4=Mw8li;J2n_6{hi(r+FGhud{i}1HzO~lg=j^rDIj<)|I$nhgyI1=NU=h~gF$`iMu4++g z2cB+Gew9biLm?hNpd2`d=@@%eseM?CIoOI)pE6u@P0zCo>#>COAuPaoJdOpe>i;=? zhM#aR_2f3czR}jEl$F9`EXSC3rh+ak#y5sqhraGYnb0Jz$7zhhKbVZ+*Ogj|sdxeR zV*g`Oi8&K;}YBT0z2A;!R_yA@7qfrmLp}!y-rEbT3Y(;5c z8ni%}*~jWW_8n(!T#;t!OY9lEVI zHF_rin4Q8=EkZ^VJwZA$~!5Fs)a=VIHQFpTgDHjj}$B2k<${ zUmn`0=S7BHC^w(M3=HYl8`*<0u?FOBY6dHk2s{HyoxlLfr}%}^VZuFqGG^RK-i$Kp zQH;m$D2*){)SpYj1o9Fz;rYRl2~+!7bDlleSf%+awO+TyVYg_N7KhhbtvT$rT9?n} z_BdTWr&LljhvkfIeAKH|I>#G=jaHvG*d)7cnop~(chtD+wHoL6C9Bh8t8!{pHs{vE LMI&|1GqL{wO6}+7 delta 1421 zcmXxjU1$_n6u|Lgq=H{Ro@bE%Kt zC$b(Ja3jXJ79ZjgoV{OS`G{b{evw&t1a-s9_%1%e&G)6=O#LHu$wAhl zp2JV@DsIAYhorhsYw9Wdfc*1AaWc{A7s-$);Wm7Lt!M^Bnz1MKDQew(ncPq>&SBh- zFX1IzfVc2P`~`R6-#8g7hec-M9@P1#V}dCJ7w`qViEraw)CT^+vDh-0Y`7hDUKZcL z4%7t)Z~~sk_wg#8!{0E(vqwZ0nTQH`Ir^?g&oAQEbA;SjYY{?F6SJ(U{tXjg0r9 zPP~rVxtvVi;RMvHuEm*Hk1t~rzJ|@HjryoJ@&)Sr+xRIy!1r+FDgF}nm)!(w@eJyN zzoMS-U(~O??liw3Hlx;y_%U{)e&yHG@x(Jpem&~R2XPr*Lv7@D)EirVR)oXLAnwrr zxN%5i3$~!Xii@ZnK102k+HXac;wsdu{v2oFcc_isL4EEgtjEd2$pMxQkBrXf?~Jp4 zrf5Sa<97yr**bQY%{XolIDv1Yu*(T6o)dIMdEaw7UC+(ghM>#IS{szwqR{oqB{#B; zDLK|NxpocQ(72%nnX<`rYmjwKwpb0U$^JjNQr3(u$HrEpouS!TeJo!v1y5^*$P^+C zI$YBcXizMgVs%BYWW17Qf|3c6ATsUM$3x$QzLvs@2`d_O=S`kQ9piGyko{dJXPM$U gf!oztXT7Le`>fDz%WZBY%4?~;@f;J8 zKbJ&Ou(+8An{f%wVkCaW2=s3;#$Xir4sTxO^`h5)T+jOvEWj_gA2VA`-h?sa)2-r> zR03%e357J&2@hgAR^fKMhud%tGcmT^=)g4cUexhZxEq&U7RkaRxC`4+zcb}ExWkMq z?(mp_eH4lqFpUQ=xl^PN&to3G^%~V>-q)fZ^%tlUy~35~(=8H@77W51Jd61lh?5wO zv#1^Z>mgW8;CICote8Q*4lA$(eQ^wR!f{-Vlc+8HfMMu+Rb&-L;%3~4H_(Cloq61Z zWj&^oJ(xi5c~6i?u;`jdG^U{D#i%W9!ZaK~J=5=~3k<(*c2a=J5eDB9$;L`d#Rr&y zGu}M3*No3Yf9h4Z6;Gp;`Q-^g9ECTit^19-xu|E@iED8Xlkg=*;1ASGWa&3Mh(`Ub z9GH&}@i6)fm<|+RI(ZxFxG~Jdz(Emy1S!E2u>{`;_F~Xoku7)}b>c469gL!0o(0^1 zi9=jaEW|KuM7{N0-uiR2l7AW+o(NB>PTy&Fx+?58r^{CAuC8mStp6W7?M`={%~9J> s@2*R**{fZRE*k|?cDijf-6zk41mqsFmAl;KwW9-N6{YTBOUr%hKY;VvjsO4v delta 1421 zcmXxjdx%t39Ki9Ph9&u0-C*6-hTHmF+G9S;t(95`Yc&_LvInBvojLBz&g`ArojcNO z!OfsRU0WZyJ~mft)Bd%VKqD+d6qO_)di-MsiYVwGfe4F;-{0KpU!ULaoHOTl&+nYM zcW&&73uBLmbW;`tX7*W+B~ zEBGcJ!PR&t$=h~_%po7xA(1R2_=$n(_&;jF37?BRhfUaqF201r*n(FRQ~e^(lD~tx zz8_cOS$qK}?-Y3%SE26HpLhv%UG1(YUijWFk#!6V;A?mb-@@m2i*(@5#D7ue7wi#v z6hA~Q^a)PEQ}{Gq#3yhRKf)IlV8Rh*6kH}1h=3T z{1hi*A8HE^U_JhfHTVxM!JBvhQv>lnC-52a#(i-o*J3kyw1>bD{DQObc9Pfbk6YS? z+Tse%#pAdf|3W=U4OJFlGioO`pmykBl3&Lx`K*H?!dS#ce73Y5`)wg6(KX5R~|3F>;_#u(;*n}%^F*Z&{*e1~iBDWR3P5I@G5_#NuT7jXq%LH%2$z7lx@yYY2Ah1!9duj4ChM_soC z+wnK#4DX%v1A?lflWKE?>m0chC#&%%AVs_!ferVdR))#vJ3o*ld;w> zYzza}D;3<(I;P-Q&vbQa;0DGGG)R|Bx>tjYYclz2U`^)X;&MqxY$-Cf8f^;9rs~hK zIg|5rE*F|ys6n@Dx_u4ud6Td1=oO4t&=J32{5S|rXZ7bn(F8@E3d$xZYtWlDSw7S; rE{6=L?>b$UC9dPUm7WIch1I#uxlUW!=$6B*PIVTFT_fwZ9cy?1W)dF3 diff --git a/core/locale/pt_BR/LC_MESSAGES/django.po b/core/locale/pt_BR/LC_MESSAGES/django.po index 69fec0c1..fcb88ad0 100644 --- a/core/locale/pt_BR/LC_MESSAGES/django.po +++ b/core/locale/pt_BR/LC_MESSAGES/django.po @@ -618,10 +618,8 @@ msgstr "Entrada de endereço com preenchimento automático" #: core/docs/drf/viewsets.py:495 msgid "raw data query string, please append with data from geo-IP endpoint" msgstr "" -"docker compose exec app poetry run python manage.py deepl_translate -l en-gb" -" -l ar-ar -l cs-cz -l da-dk -l de-de -l en-us -l es-es -l fr-fr -l hi-in -l " -"it-it -l ja-jp -l kk-kz -l nl-nl -l pl-pl -l pt-br -l ro-ro -l ru-ru -l zh-" -"hans -a core -a geo -a payments -a vibes_auth -a blog" +"Cadeia de consulta de dados brutos, anexe os dados do ponto de extremidade " +"de IP geográfico" #: core/docs/drf/viewsets.py:501 msgid "limit the results amount, 1 < limit < 10, default: 5" diff --git a/core/locale/ru_RU/LC_MESSAGES/django.mo b/core/locale/ru_RU/LC_MESSAGES/django.mo index 208d1e0ad6be4410bbdaa317814a3d675183339c..a3ff4d50319d348b92bbebe7dc07b06d0235d6eb 100644 GIT binary patch delta 1290 zcmX}qSxA&o7{>9ZEQm5m3)H-5gfuUd_QiJFtPoPNk`^#ii)=3pDjdxgXt{`X^ui*w z-EnQyoM}}nv-7oIv_KSe5z%E7ME}z_bTRWg?|a^J&Uco|t6>#a!hE};y=Nt5)JW^` zGnU)9RtiUhsrVj8WAtU$beurEI}~3J`7UJm6=^2@)3F5iVj2Fz)41=dv=F1N$*YYt zR$Y_EV<#r#FIKQ zz$UaGe6romProf~C$7T`^u~8cnKZWGN(^ES4i890xD(glN3=Ve!LitZhj0eIz-)}X z<64Neza8zB4Y(^+;x@D!8GKI~iZM8m^_5Ix4v9RpJE_Lq*o*ejEx0f7Zd8oJ(euE4 zBh&CA@dnJpK@X*+xCPhZJzRz(JEbYO2V<}iH(?KsWqqY~xdV$Zi;f`9!N_j+$g1!uog zY67Os_&ny8@tL3voiakF%sJ|m@;m4;P4sk_4jUwUOppOBWZIo_(@NQX<0IQd*7meh y=_l9hG0pbx|5$U|_?gwiVgYKJox?E@Fs&Y{1I}Uce$V=XttpE#8}n=ZDSrW;7e-|O delta 1420 zcmXxiYitx%6u|LANH8%Lev(*K| zYKkTxYD7&W?T1QYA0P^rM=2Dg^0cBAAD_^KG-ymrh>-*mHTXX}A=wd!>>Q#gqnN?sli`5b5N6Y0i_iLWzB z$7dZ7xf#c>8ON~!A3PYJYz59B@4}yO5U1hWgCcifKTgJTHG(?{E+mCXhvFaJirv&p zcs))Yid!-bZz6BRC3qj|4{N9k^kIl2_zNyP9B+8ak+?pL>!{BertMhULGU!eC43GS z9~D`Romjxj*n(@hjwU>c`r&n7h&+rdaV2g`{0(*dp<{8&He(n0pQs0UYeeK0+>Q%b zUv?8bMqwQFB#mE+yogVsKDtxL`;jX+9X~uCzmX%jgZy_);nou(EASG!`1nbYXYeDu zAOFUwxZspX5trdy)|Vjy{qPT5j*Cyn8`_3?l|Q0hdDEG=$IqhnejU!kO*j(|qHg$S z)P-*RN+g4gI0fIpcd#4v#^;T4)2uHY1Y7Yu>Z8ejEpj`)hI+-lI2SLXjyIg89XKBc z@jYzEW#6zFJdWD3rQgPHsTW(xui-{)9pgPs;D6Zi1cl4riM)b~&WSvaL)eTB-;3Of zK0b;)NYCU~d;o9zA#O!8>P9!=92`MySU}9iff|K^~yyzvW_V_)-&0Z25xBFP=j>Yq}OYZ zaZRRB53I@jKej%bUEXWBJJBBMsVI(-vq@D40V1k6zJuMXdxy z6U0GeQuWV6--Nyng%uN4G+3WAIX3DTmqUiE?>bq_6xRvdYH7OlqWV~SK4r^m+)9+w Op;Xb&4vhBaMjH3uJxIeQr&05*iHKnt z!f08|Oi5&r*1{IG3S3AcQP9lj%0(qTHhq8n@9J~UJ^y>px%d9(9>z6|#f2|#@|GK8 zifvPsO_>9*S zFfqi03ca^3U>5N*s<92X97|F2)z(&P&^n8GCvH&Bc8U zAy%RbZ=g=tj@fu0wegJ2&*MJg7;2;R9%ubg)DzUBZX}4xf3*3(HqPzkIhj9+=X8Q; z25Mjq_2#SYIObs{@i8pIOSlI|F%=hZBmPD;x~|VTaS3J+SM^PNNU5nVk8}-3#@eI( z;b>XX?qa87g%f=j|_!lJM~a>CQ-TK^9arrv`9 delta 1421 zcmXxiU5HF!7{KwDw4p(f*$um$W!YL@UyBkV5m~IFD6!7W95Z8P&z#Pj!JuYX>-%GU z#DzPxv5_`=V{_#K+v0ND3$;n&M#@)|kNlrGudCnlywCgbyze=kcSaB29o-vLmuf~S z)m&DpQ7N_gxKhh7z$(0llkp+e;8WuW){*}(dGthBUtrvbQn#@M%eV?(;yN7P5!PEf zR7uTaz-2%Vx@CNT4dhQy8hdY?crqMcX54Ko8@sWI`GctOJ1)doongMic*5A*Sqcjy z46J2huBm9jl~{4R`}1_!y_-fXUzCR`Sm#UvnnB=oXaq`$`0| zFlhz?l#Y+0G;-gJf5dU*Urqi8<)ATV!woHzeVS2TU=7l<%HU4?g7Qf=oeN(yZ7f|O zsHf16vf*p2d|Q;8MbC!|R^U|fILg0JMEPV_QPy{3Gd?%@FO+?1FN7CaiE`s(#tw`q zzW+G_Irt{ZhJDzG&u|=m!bSMg+NRBlrQOv2Q5z|DqgFeK~xgMw~#t3g==A%KSsP9gkxZ z4q-j#b5hvROq2t*p}fQ%oQ)pJ)88=l`?#FEA7!JjC^xFR5`KcsC@)e*sozGazcTqR zOq0*Ks?=V&K^K8c=t24B!^Yn@i@g4tQj2jtF2%z*10P@%U!XMl7UjlcuPZeZmt5}~ zoSsgU61jNB@vV5S-OJ@2%Q@`CE!*=fFXse)(eewfFwe3p~&+GUR2@ zX;*6LK&Jx<4%qsDCqX8oGnF0Ptah_9;$^iL27!)MmisyF=cMEpv|o_mNJ^(@)Y3MW o^f}+Qk`7aB%d?B^(;PRb)DEU&PQJ}91Su)Svbkhmu^gH54_B2AS^xk5 diff --git a/core/locale/zh_Hans/LC_MESSAGES/django.po b/core/locale/zh_Hans/LC_MESSAGES/django.po index 9fa2e28a..45cb607c 100644 --- a/core/locale/zh_Hans/LC_MESSAGES/django.po +++ b/core/locale/zh_Hans/LC_MESSAGES/django.po @@ -583,11 +583,7 @@ msgstr "自动完成地址输入" #: core/docs/drf/viewsets.py:495 msgid "raw data query string, please append with data from geo-IP endpoint" -msgstr "" -"docker compose exec app poetry run python manage.py deepl_translate -l en-gb" -" -l ar-ar -l cs-cz -l da-dk -l de-de -l en-us -l es-es -l fr-fr -l hi-in -l " -"it-it -l ja-jp -l kk-kz -l nl-nl -l pl-pl -l pt-br -l ro-ro -l ru-ru -l zh-" -"hans -a core -a geo -a payments -a vibes_auth -a blog" +msgstr "原始数据查询字符串,请附加来自地理 IP 端点的数据" #: core/docs/drf/viewsets.py:501 msgid "limit the results amount, 1 < limit < 10, default: 5" diff --git a/core/viewsets.py b/core/viewsets.py index af3a123a..1682d7be 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -51,6 +51,7 @@ from core.serializers import ( AddressAutocompleteInputSerializer, AddressCreateSerializer, AddressSerializer, + AddressSuggestionSerializer, AddWishlistProductSerializer, AttributeDetailSerializer, AttributeGroupDetailSerializer, @@ -549,6 +550,18 @@ class AddressViewSet(EvibesViewSet): return AddressAutocompleteInputSerializer return AddressSerializer + @action(detail=False, methods=["post"]) + def create(self, request): + serializer = AddressCreateSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + + serializer = AddressSerializer(serializer.create(serializer.validated_data)) + + return Response( + status=status.HTTP_201_CREATED, + data=serializer.data, + ) + @action(detail=False, methods=["get"], url_path="autocomplete") def autocomplete(self, request): serializer = AddressAutocompleteInputSerializer(data=request.query_params) @@ -559,14 +572,17 @@ class AddressViewSet(EvibesViewSet): try: suggestions = fetch_address_suggestions(query=q, limit=limit) + serializer = AddressSuggestionSerializer(suggestions, many=True) + return Response( + serializer.data, + status=status.HTTP_200_OK, + ) except Exception as e: return Response( {"detail": _(f"Geocoding error: {e}")}, status=status.HTTP_502_BAD_GATEWAY, ) - return Response(suggestions, status=status.HTTP_200_OK) - class ProductTagViewSet(EvibesViewSet): queryset = ProductTag.objects.all() From 8f7eaa794b757d7e8078f828c41157cfa46476d4 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sun, 1 Jun 2025 18:44:00 +0300 Subject: [PATCH 3/8] Features: 1) Add `pagination_class` attribute to `AddressViewSet` for disabling pagination; Fixes: 1) Remove unused `*_args` and `**kwargs` parameters from `current` and `buy_unregistered` methods in `OrderViewSet` and `WishlistViewSet`; Extra: 1) Minor formatting adjustments for improved readability. --- core/viewsets.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/viewsets.py b/core/viewsets.py index 1682d7be..a6e92631 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -245,7 +245,7 @@ class OrderViewSet(EvibesViewSet): return qs.filter(user=user) @action(detail=False, methods=["get"], url_path="current") - def current(self, request, *_args, **kwargs): + def current(self, request): if not request.user.is_authenticated: raise PermissionDenied(permission_denied_message) order = Order.objects.get(user=request.user, status="PENDING") @@ -281,7 +281,7 @@ class OrderViewSet(EvibesViewSet): @action(detail=False, methods=["post"], url_path="buy_unregistered") @ratelimit(key="ip", rate="2/h", block=True) - def buy_unregistered(self, request, *_args, **kwargs): + def buy_unregistered(self, request): serializer = BuyUnregisteredOrderSerializer(data=request.data) serializer.is_valid(raise_exception=True) order = Order.objects.create(status="MOMENTAL") @@ -457,7 +457,7 @@ class WishlistViewSet(EvibesViewSet): return qs.filter(user=user) @action(detail=False, methods=["get"], url_path="current") - def current(self, request, *_args, **kwargs): + def current(self, request): if not request.user.is_authenticated: raise PermissionDenied(permission_denied_message) wishlist = Wishlist.objects.get(user=request.user) @@ -539,6 +539,7 @@ class WishlistViewSet(EvibesViewSet): @extend_schema_view(**ADDRESS_SCHEMA) class AddressViewSet(EvibesViewSet): + pagination_class = None queryset = Address.objects.all() serializer_class = AddressSerializer additional = {"create": "ALLOW"} From a90498a94a76d719acb7bbb735780f61602b6a1d Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sun, 1 Jun 2025 18:50:37 +0300 Subject: [PATCH 4/8] Features: 1) Add `.gitkeep` files for `payments/static` and `blog/static` directories to track empty folders; Fixes: 1) Update `.dockerignore` to include exceptions for static directories under `core`, `blog`, `vibes_auth`, and `payments`; Extra: 1) Adjust `.dockerignore` formatting by adding a newline at the end and ignoring `scripts` directory. --- .dockerignore | 9 ++++++++- blog/static/.gitkeep | 0 payments/static/.gitkeep | 0 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 blog/static/.gitkeep create mode 100644 payments/static/.gitkeep diff --git a/.dockerignore b/.dockerignore index 3e789adf..46687cd6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -72,6 +72,13 @@ db_backups/ services_data/ static/ media/ +!core/static +!blog/static +!vibes_auth/static +!payments/static # Environment file -.env \ No newline at end of file +.env + +# Host's scripts +scripts \ No newline at end of file diff --git a/blog/static/.gitkeep b/blog/static/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/payments/static/.gitkeep b/payments/static/.gitkeep new file mode 100644 index 00000000..e69de29b From 194e2bef78ea63683d9aa4bf928810de1210da6b Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sun, 1 Jun 2025 18:57:06 +0300 Subject: [PATCH 5/8] Features: 1) None; Fixes: 1) Remove unused positional arguments from wishlist-related viewset methods; 2) Adjust `create` method to accept only required arguments; Extra: 1) Minor cleanup for method signatures in `core.viewsets.py`; --- core/viewsets.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/viewsets.py b/core/viewsets.py index a6e92631..fb7221ea 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -469,7 +469,7 @@ class WishlistViewSet(EvibesViewSet): ) @action(detail=True, methods=["post"], url_path="add_wishlist_product") - def add_wishlist_product(self, request, *_args, **kwargs): + def add_wishlist_product(self, request, **kwargs): serializer = AddWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: @@ -486,7 +486,7 @@ class WishlistViewSet(EvibesViewSet): return Response(status=status.HTTP_404_NOT_FOUND) @action(detail=True, methods=["post"], url_path="remove_wishlist_product") - def remove_wishlist_product(self, request, *_args, **kwargs): + def remove_wishlist_product(self, request, **kwargs): serializer = RemoveWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: @@ -503,7 +503,7 @@ class WishlistViewSet(EvibesViewSet): return Response(status=status.HTTP_404_NOT_FOUND) @action(detail=True, methods=["post"], url_path="bulk_add_wishlist_product") - def bulk_add_wishlist_products(self, request, *_args, **kwargs): + def bulk_add_wishlist_products(self, request, **kwargs): serializer = BulkAddWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: @@ -520,7 +520,7 @@ class WishlistViewSet(EvibesViewSet): return Response(status=status.HTTP_404_NOT_FOUND) @action(detail=True, methods=["post"], url_path="bulk_remove_wishlist_product") - def bulk_remove_wishlist_products(self, request, *_args, **kwargs): + def bulk_remove_wishlist_products(self, request, **kwargs): serializer = BulkRemoveWishlistProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: @@ -551,8 +551,7 @@ class AddressViewSet(EvibesViewSet): return AddressAutocompleteInputSerializer return AddressSerializer - @action(detail=False, methods=["post"]) - def create(self, request): + def create(self, request, **kwargs): serializer = AddressCreateSerializer(data=request.data) serializer.is_valid(raise_exception=True) From 18782a8bc0adc1c98b2851eff81965136eb8ad5b Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Sun, 1 Jun 2025 19:58:51 +0300 Subject: [PATCH 6/8] Features: 1) Add context to serializers in `create` method of `AddressViewSet`. Fixes: 1) Correct serialization flow by separating create and output serializers. Extra: 1) Minor variable renaming for clarity; 2) Improved readability of the `create` method. --- core/viewsets.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core/viewsets.py b/core/viewsets.py index fb7221ea..922094b2 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -552,14 +552,22 @@ class AddressViewSet(EvibesViewSet): return AddressSerializer def create(self, request, **kwargs): - serializer = AddressCreateSerializer(data=request.data) - serializer.is_valid(raise_exception=True) + create_serializer = AddressCreateSerializer( + data=request.data, + context={"request": request} + ) + create_serializer.is_valid(raise_exception=True) - serializer = AddressSerializer(serializer.create(serializer.validated_data)) + address_obj = create_serializer.create(create_serializer.validated_data) + + output_serializer = AddressSerializer( + address_obj, + context={"request": request} + ) return Response( status=status.HTTP_201_CREATED, - data=serializer.data, + data=output_serializer.data, ) @action(detail=False, methods=["get"], url_path="autocomplete") From b71cc2355e2b515e9aa65cd84fba5e2bcf1ed4f5 Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 3 Jun 2025 21:20:48 +0300 Subject: [PATCH 7/8] Fixes: 1) Fix OrderViewSet buy action. Extra: 1) Minor code improvements. --- core/viewsets.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/viewsets.py b/core/viewsets.py index 922094b2..2ca3486b 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -260,8 +260,9 @@ class OrderViewSet(EvibesViewSet): def buy(self, request, *_args, **kwargs): serializer = BuyOrderSerializer(data=request.data) serializer.is_valid(raise_exception=True) + order_uuid = kwargs.get("pk") try: - order = Order.objects.get(user=request.user, uuid=kwargs.get("order_uuid")) + order = Order.objects.get(user=request.user, uuid=order_uuid) instance = order.buy( force_balance=serializer.validated_data.get("force_balance"), force_payment=serializer.validated_data.get("force_payment"), @@ -277,7 +278,7 @@ class OrderViewSet(EvibesViewSet): case _: raise TypeError(_(f"wrong type came from order.buy() method: {type(instance)!s}")) except Order.DoesNotExist: - return Response(status=status.HTTP_404_NOT_FOUND) + return Response(status=status.HTTP_404_NOT_FOUND, data={"detail": _(f"order {order_uuid} not found")}) @action(detail=False, methods=["post"], url_path="buy_unregistered") @ratelimit(key="ip", rate="2/h", block=True) @@ -299,7 +300,7 @@ class OrderViewSet(EvibesViewSet): return Response(status=status.HTTP_202_ACCEPTED, data=TransactionProcessSerializer(transaction).data) @action(detail=True, methods=["post"], url_path="add_order_product") - def add_order_product(self, request, *_args, **kwargs): + def add_order_product(self, request, **kwargs): serializer = AddOrderProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: @@ -317,7 +318,7 @@ class OrderViewSet(EvibesViewSet): return Response(status=status.HTTP_404_NOT_FOUND) @action(detail=True, methods=["post"], url_path="remove_order_product") - def remove_order_product(self, request, *_args, **kwargs): + def remove_order_product(self, request, **kwargs): serializer = RemoveOrderProductSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: From 3bf0eaeba2579e4b1e597e59ee2a144c2c370b1a Mon Sep 17 00:00:00 2001 From: Egor fureunoir Gorbunov Date: Tue, 3 Jun 2025 21:35:41 +0300 Subject: [PATCH 8/8] Features: Add order's IDs to TransactionProcessSerializer. Extra: 1) Minor code improvements. --- core/permissions.py | 5 +---- core/serializers/__init__.py | 18 +++--------------- core/viewsets.py | 10 ++-------- payments/serializers.py | 10 +++++++++- vibes_auth/serializers.py | 5 +++-- vibes_auth/viewsets.py | 5 +---- 6 files changed, 19 insertions(+), 34 deletions(-) diff --git a/core/permissions.py b/core/permissions.py index c033af30..0dbd3645 100644 --- a/core/permissions.py +++ b/core/permissions.py @@ -68,10 +68,7 @@ class EvibesPermission(permissions.BasePermission): if request.user.has_perm(f"{app_label}.{codename}"): return True - return bool( - action in ("list", "retrieve") - and getattr(model, "is_publicly_visible", False) - ) + return bool(action in ("list", "retrieve") and getattr(model, "is_publicly_visible", False)) def has_object_permission(self, request, view, obj): if request.method in permissions.SAFE_METHODS: diff --git a/core/serializers/__init__.py b/core/serializers/__init__.py index 96f2fe80..ccce0500 100644 --- a/core/serializers/__init__.py +++ b/core/serializers/__init__.py @@ -158,24 +158,12 @@ class AddressCreateSerializer(ModelSerializer): # noqa: F405 write_only=True, max_length=512, ) - address_line_1 = CharField( - write_only=True, - max_length=128, - required=False - ) - address_line_2 = CharField( - write_only=True, - max_length=128, - required=False - ) + address_line_1 = CharField(write_only=True, max_length=128, required=False) + address_line_2 = CharField(write_only=True, max_length=128, required=False) class Meta: model = Address - fields = [ - "raw_data", - "address_line_1", - "address_line_2" - ] + fields = ["raw_data", "address_line_1", "address_line_2"] def create(self, validated_data): raw = validated_data.pop("raw_data") diff --git a/core/viewsets.py b/core/viewsets.py index 2ca3486b..fde2e24f 100644 --- a/core/viewsets.py +++ b/core/viewsets.py @@ -553,18 +553,12 @@ class AddressViewSet(EvibesViewSet): return AddressSerializer def create(self, request, **kwargs): - create_serializer = AddressCreateSerializer( - data=request.data, - context={"request": request} - ) + create_serializer = AddressCreateSerializer(data=request.data, context={"request": request}) create_serializer.is_valid(raise_exception=True) address_obj = create_serializer.create(create_serializer.validated_data) - output_serializer = AddressSerializer( - address_obj, - context={"request": request} - ) + output_serializer = AddressSerializer(address_obj, context={"request": request}) return Response( status=status.HTTP_201_CREATED, diff --git a/payments/serializers.py b/payments/serializers.py index 4bbad8f1..a9f16448 100644 --- a/payments/serializers.py +++ b/payments/serializers.py @@ -1,4 +1,4 @@ -from rest_framework.fields import FloatField, JSONField +from rest_framework.fields import FloatField, JSONField, SerializerMethodField from rest_framework.serializers import ModelSerializer, Serializer from payments.models import Transaction @@ -16,6 +16,14 @@ class TransactionSerializer(ModelSerializer): class TransactionProcessSerializer(ModelSerializer): process = JSONField(required=True) + order_hr_id = SerializerMethodField(read_only=True, required=False) + order_uuid = SerializerMethodField(read_only=True, required=False) + + def get_order_hr_id(self, obj: Transaction): + return obj.order.human_readable_id if obj.order else None + + def get_order_uuid(self, obj: Transaction): + return obj.order.uuid if obj.order else None class Meta: model = Transaction diff --git a/vibes_auth/serializers.py b/vibes_auth/serializers.py index 847b767e..7f60b2ea 100644 --- a/vibes_auth/serializers.py +++ b/vibes_auth/serializers.py @@ -94,8 +94,9 @@ class UserSerializer(ModelSerializer): Returns a list of serialized ProductSimpleSerializer representations for the UUIDs in obj.recently_viewed. """ - return ProductSimpleSerializer(Product.objects.filter(uuid__in=obj.recently_viewed, is_active=True), - many=True).data + return ProductSimpleSerializer( + Product.objects.filter(uuid__in=obj.recently_viewed, is_active=True), many=True + ).data class TokenObtainSerializer(Serializer): diff --git a/vibes_auth/viewsets.py b/vibes_auth/viewsets.py index 8c4fae3d..41194cbd 100644 --- a/vibes_auth/viewsets.py +++ b/vibes_auth/viewsets.py @@ -67,7 +67,6 @@ class UserViewSet( @method_decorator(ratelimit(key="ip", rate="2/h" if not DEBUG else "888/h")) def confirm_password_reset(self, request, *args, **kwargs): try: - if not compare_digest(request.data.get("password"), request.data.get("confirm_password")): return Response( {"error": _("passwords do not match")}, @@ -151,6 +150,4 @@ class UserViewSet( instance = self.get_object() serializer = self.get_serializer(instance) instance = serializer.update(instance=self.get_object(), validated_data=request.data) - return Response( - self.get_serializer(instance.data) - ) + return Response(self.get_serializer(instance.data))