From 30a23d680717de73d430c6d35643e20e3485297b Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 27 Aug 2023 19:29:58 +0530 Subject: [PATCH 1/2] url shortner --- .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 195 bytes auth_login/__pycache__/admin.cpython-311.pyc | Bin 0 -> 192 bytes auth_login/__pycache__/apps.cpython-311.pyc | Bin 0 -> 507 bytes auth_login/__pycache__/models.cpython-311.pyc | Bin 0 -> 8163 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 0 -> 7019 bytes auth_login/__pycache__/urls.cpython-311.pyc | Bin 0 -> 1279 bytes auth_login/__pycache__/views.cpython-311.pyc | Bin 0 -> 12908 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3810 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 206 bytes base/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 189 bytes base/__pycache__/permissions.cpython-311.pyc | Bin 0 -> 2123 bytes base/__pycache__/urls.cpython-311.pyc | Bin 0 -> 554 bytes base/__pycache__/utils.cpython-311.pyc | Bin 0 -> 846 bytes config/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 191 bytes config/__pycache__/urls.cpython-311.pyc | Bin 0 -> 2977 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 702 bytes .../settings/__pycache__/base.cpython-311.pyc | Bin 0 -> 3596 bytes .../__pycache__/local.cpython-311.pyc | Bin 0 -> 963 bytes .../__pycache__/third_party.cpython-311.pyc | Bin 0 -> 4972 bytes home/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 189 bytes home/__pycache__/admin.cpython-311.pyc | Bin 0 -> 391 bytes home/__pycache__/apps.cpython-311.pyc | Bin 0 -> 713 bytes home/__pycache__/models.cpython-311.pyc | Bin 0 -> 3929 bytes home/__pycache__/serializers.cpython-311.pyc | Bin 0 -> 862 bytes home/__pycache__/urls.cpython-311.pyc | Bin 0 -> 1051 bytes home/__pycache__/views.cpython-311.pyc | Bin 0 -> 7364 bytes home/admin.py | 2 + home/apps.py | 4 +- .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 1781 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 200 bytes home/models.py | 50 +++++++++ home/serializers.py | 7 ++ home/urls.py | 11 +- home/views.py | 104 +++++++++++++++++- 34 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 auth_login/__pycache__/__init__.cpython-311.pyc create mode 100644 auth_login/__pycache__/admin.cpython-311.pyc create mode 100644 auth_login/__pycache__/apps.cpython-311.pyc create mode 100644 auth_login/__pycache__/models.cpython-311.pyc create mode 100644 auth_login/__pycache__/serializers.cpython-311.pyc create mode 100644 auth_login/__pycache__/urls.cpython-311.pyc create mode 100644 auth_login/__pycache__/views.cpython-311.pyc create mode 100644 auth_login/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 auth_login/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 base/__pycache__/__init__.cpython-311.pyc create mode 100644 base/__pycache__/permissions.cpython-311.pyc create mode 100644 base/__pycache__/urls.cpython-311.pyc create mode 100644 base/__pycache__/utils.cpython-311.pyc create mode 100644 config/__pycache__/__init__.cpython-311.pyc create mode 100644 config/__pycache__/urls.cpython-311.pyc create mode 100644 config/settings/__pycache__/__init__.cpython-311.pyc create mode 100644 config/settings/__pycache__/base.cpython-311.pyc create mode 100644 config/settings/__pycache__/local.cpython-311.pyc create mode 100644 config/settings/__pycache__/third_party.cpython-311.pyc create mode 100644 home/__pycache__/__init__.cpython-311.pyc create mode 100644 home/__pycache__/admin.cpython-311.pyc create mode 100644 home/__pycache__/apps.cpython-311.pyc create mode 100644 home/__pycache__/models.cpython-311.pyc create mode 100644 home/__pycache__/serializers.cpython-311.pyc create mode 100644 home/__pycache__/urls.cpython-311.pyc create mode 100644 home/__pycache__/views.cpython-311.pyc create mode 100644 home/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 home/migrations/__pycache__/__init__.cpython-311.pyc diff --git a/auth_login/__pycache__/__init__.cpython-311.pyc b/auth_login/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44615ebae68dcd3a7be2a58d2616cf6cb614b564 GIT binary patch literal 195 zcmZ3^%ge<81S^7Gr-10kAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnuP|q;n9$u*uC&Da}c>D`Ev&19C_)Kalvq%*e?2fdNJoF$2W_ Dlddz> literal 0 HcmV?d00001 diff --git a/auth_login/__pycache__/admin.cpython-311.pyc b/auth_login/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41c55079124f8f6a8a9d1cd2e50cfba461d6d05c GIT binary patch literal 192 zcmZ3^%ge<81S^7Gr-10kAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnuV81Zn9$ As{jB1 literal 0 HcmV?d00001 diff --git a/auth_login/__pycache__/apps.cpython-311.pyc b/auth_login/__pycache__/apps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa24369c2a7d25031635900152fbe2f49ac3e5e2 GIT binary patch literal 507 zcmZuty-ve05I!dL!}Ny3`CJE3x_ss>XQ`;7sZ@Yv6Tuufa1y|TID~)! zr@)O{;HF3JO@L?oIXMQm&Y)g;(`KC{n=L8Zp}6t~mqkXVNMS6u5zN5@hj74J;+WjP zdNZ+G(|DLyCN@J%gK*%BUfoK{lnOTSC{1iiCn28(8doX3p0c2bSXw{9QqNiS+ehxX z@*?H7#E1!Y&>guQPmSYHx*Q#Yu;Gi?i-emiHS}d8W@_BXqwddqmr1Fb@+Q*P$%KVK z?Vy-_^P;jl>u8Ru>#QEGRLQ$Fb&E(}EN@cLC`+s%T9uFUl}@59H1(lW7e#6kLKblN X^82M5gzTm8SKRG?Xz%Agp={U}UJ-p! literal 0 HcmV?d00001 diff --git a/auth_login/__pycache__/models.cpython-311.pyc b/auth_login/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a3362352b98268c7ff1cd56d7598b5fba3e19785 GIT binary patch literal 8163 zcmb6;TWk|qmbc0-yZlP|k&pxkDUy(op-GeO01f@vCXg^mAk09RRaX*C~w>`M8V54zP_t+YROR8p*3wS=@9?V|lL3M;kv znLX#0U9p|?E?cfTb?-grp1P0oy#9wkz)Rp-zxrSDy$~V)j+Of5sui~X846zznaE6% zMDfignG_pkQ;w*E!MY>qOmR^z<%+s!-I;W!_$W`yT+);BM!mG`O8Qd%sGpYI$v~hB`naSi*EK~og?j0-l$I716^Q(GB1#baiK3_BP&S_O1z#(DY;BqfwF&5(RJmv9!pBOJ5UcmJ+_cY zDzOzwUy9epO~3Us(acacAb2mAI~%F4$Tf8eGclga&ob#O=7UqJz8)J4}vBi0QQ?BUtpe(>;vvLG6QxFsCj6ppS(*5}K@s3DAQ38y!O(`Dg|A)MLh+Zf&GGlUNd z&MNElbX6i<4?opJe5jn9HIlUP< zFDc?;;!`CpDroB{(Tb#Ls~J@uu{q>A=74U3Qlwxd#d$^46di0RN4uGxg={hzOG_!` zOES!v-k(XytTLgh88E!*jGB^?iJTInwCVvEx#@@QU?!~(nNA$nunXQwazX6}0(AhX zc$>lxc2vWBTHBqA^6~dUoyjNCO(_H5EXfRCxk|3-WsE zyYRtM&saHp(g>d{`A=4Y?OVZt&EP=sdO3K^2p%hN6`{MJ-_MnVnIiYJ8(wg4B&~PB zS>gR#eD@~b{pe_!?>G4V65kJPzw!La^SST7ui&c)k%Dgk|ejm=MS!Exh87)|D=%n=tSm^`q;5JOs!#_( z8q^U0!<_mfEZaJw9>eNe05p`N26YJ5PmeY$V2Phm--eOTf&t=V)ELELrZ*M?znO)gEN1#+v0GUwiDoJmqsytDf)45t z1lX0@5%n;Z5FCU@I}IRj|Ef+e*Ip$y=<;)ym@3&DT0D_c93K0shfv!`!7u!>$#F#; zEK!`xcA$nqoZ@=oYzcSW%~Vk1TlEfmLQn>}(hy*KXg``1;Am(+cZ(J}pda7T&qw?D z>ocJJJT3jawAI(#`o!PDDX<5pKyx1%*MOJXnp<~qYNMQlrZEZ4eU#ubq&?R4B-m^Z zF%f~4w)@L4Z_HW7p=y^S(GGa_$?c0wv=jPtHGAb~H%(qTAbHu>GLHQP zvcSll_xR`mxeG#;gK{^(9{Her;2sk_R3NvRXfIf{9+R)9FuC`rjnkJB8rT?765}+w zp#iT*qeRQOr!w=9jfm-NYQ7c;zxXq(#vH_}-jsAZmQ>P<`jY8eQ4=Xiy%W2s+%erX zyOX0XT|`|OX4Ma&o5{^5rS#2QpcW~}vZ`nrAU{T=%ZfyEerhR2fO=M&%$uCrvAe^^8mq=^6BFSQAL4^EH(G%%Kpp0j- zX%2?o31U11P?ZqRr|g41dQ^H<SCi#+R8SIc9fGHQJ3rl!Qfs8>Vh$HS`S;5u{s86xJpL@Jcm?{!ZQl+WM&~y<*36nxp-2M(xxXC zizgwL1*g&ptkod|{Qy9QskfekvW7{3n73TaH7MuW>}{iLZXnSZfba9qrZ<6^;i-&=qmUDT%a#MPtg8H55v zm1G&-)&)Yt8he<)ihPhg@mfu{u=CFJ(mbEk(U_4dDl4jTFyD=u%p|5=Ie**!N~Ru+J? zd2Vka8$~-GgYNd#s(5n4F$k=fBiG-sP+(+KomxkF)PQLeD%{9xMpTjeu*1q=I5=NO ztbn|%Bon&&Gr(vKi_(UZr>y9j=Q^8KWe0)N)P@1%$#Wrc|FbQje^cl$3r7s$$d+(y zQ#iJMzAT(DgcDCghVX8Qf0wS=Y*U(nVFyh!{s@I;^;))7tyzgqlDk}^8tx>rR_F~v zg~I_d0icSLHRoRyPJOM-n#f&p854)(inr%%#OP!*XdPeMB+-XGR)BY7ep8P2gG6G^b&}Rht zs>I=$Vv5V(`GbbPrxNUZ)LHydrM>InG@OsTEmj?DU>w3rgwNkPRpn^m?8jEYYX6V% z$!`X}9{hIj*dKW^DfQxwd7xo#R?&7tla;5JS2!r>%mju8o z1o`pjLGgjh2#UoJ{NDe&Lw`85asHWJ3SKG)FB!p0`KgM(r!Wa3^+*C2ER+wOFb{);aiOk|3I4+5;Z zxuEMM0q_bz{>N262@T*7;DiIaAH@?6I5DA}t1J^Z`_kcvctP?a-m2Rjg3bV5A;?cv zgCsKaV9*E;7H<`At@o6NP8&m~pLKnEuoRvxhi8rOY<{K^I`Uwj5jyg8Y(xK-fl}y7 zIdsJcUCB?^5$pQK*fY5lnkk27jL-}q!rjoV<6wTa(%JVQmA_JH>n*kQmfH>+ZHMz0 zt4;@;G?Lu_l!WVok=C(ZmisX(-QJLQa)+wK27ZzGnaa;IAM0_fE?f1i1~&x}c&#d4uEzasjZ~7_8SVEsbSfc%eHaH*hQo zf7~P$brtGRaV>xyhU#sr%4IMMQSV^QK{FdGig(ACGKsjNK_KtRt|T*(9Mdy9k$f%D zp;7&$dI5UBXm4RbaZMXp_p96cfV6odWww4g{n~RKLkAjH;|iD@)-`lvr=hwNx~rG4 zdKtkH1aBk2qfC{Wq|cy~heyK`*1A>6lS*d~#^OgH2DfgjA9k4?4z_+`5t^xuR+pe; zIyB|B>77b}!?bKHMi8cZMa|$JU8ZLa_JSfz$9y8A-bAbq&b=U|NGv22*$h}oXv|7N zt%0@-9_LKAUW0=6Zvb`%-(VDZ;yX|nG`#yOk&Z`maANxwYH0&>u)ZngB|-R#!u)x# zq=HyjFxq<8k5edzgPhii`laGi(Xw~c@Q&usSHefoG96i0N?|w) z9y7vYU{u-%9!whT15eqF0kEO%)8+PQqkTGmx$0!OK~(=%0K?!0VHCR%*5c!ohxe%w zc$q!cKRqK5s6ebZKZ5`GjLgITmNc4B9YCWxk#PTBgw~%zD(aq!W&>Ow{aXpxsfrZ_ zd1@{4yyblTwR%=hBsG;f&926#5jbg2Ye@-XDHU~!x@OahV;ZqKp%hThZMjA2*XTAj zZ|!UT1MBeZBlXwN1GPcB01*5c!&HbbPk+zJOlhyXLMBRk-4$}M)O_#Na=1jA?g}|o zYQCS7fl~8bb@`bfoaWWRq5TY=?(Gd92`?$;RU`iFDF*HT-moO}mJW};q}W%DG&&-ESMm5#QxEd89~Dlw!+YjI0kciqzPaRY!4TJGPt;TTC0-LCUBhPP~&$i6Yg# zlRp>-B?3P%fqNkO%X%X~7Wy60C@sd$=S7FFj8%giTJqH3K>W>hXI#cx5M=98kJ`j#_u zz=@|V@eCamN7No~y7eq+q50@rp z(I{#5VtSEJ^Wm$DvzJ9_NzSay3Q)0-8A+yPk)>z#AL(XtWklwsr4gMw%dg5e_EAUWex3WW0Zvc(z<3Fsen40B&Oz7Yi4dy!ncIO>@fVOfdx^HH_lr2SQ9jw1r9EW9&$j)2TmHVHzhCk97hL_CWr@bl8b-YXjld{UH;VPj4dyQz_urVL77gd}4f(re z1{@Wv4og%e5gY3OoecSE$Mn?YcQ3}@x;QfxzwyB})w;@35z3AOPr~k04d&3EDxkBy zZEUUbaCD?sfaJ*cT*ulQWkTH->32Oxm7bA8*M&{#$)`{L3^(}oUMTrH^Gq{68u73Y zG-KUJaGaP8h}vCW#{j3B8Q}_oSzi!{1J;jHUPnEX&9)^!SzE*=U}n(gwlB;_a1(9gRnt+gWdzqPc=w0w;mv& zWkXDGR?Y3w%>5lNNsT7E+M4W{LZ_@l2AvQ?udljRpz-Yt6Pj&5i6Tgb;F3_b!FF$7 z{;J~bD|-7CZ+~v8zi49p}K(l=J>gKP3iPA~yO(ykYr!viA2ZLKUC-fN=<=Ne1<1rKJe zRR|RQp%)eyzrfQM{%^JI=<>r=pzvOsd=JAc>O zy>0){mVc-e>`{UP8w*NswA6i2={~X9t8|Z*dU} z>=1hZ+#!&>t?VUk-?r=Emh0fdew12NdS5TPCKT61!8K8GdB1Xh>HdOSNl!7BVUI2P9NJ;J zS4GqI!azV=+f`Lca?hQGz3d(aXi)loFgOc)_EEsynRq^KuGC<^OG7HjHQi#v4VjnrBej zYo={xxzDNWH0dkbn!K<{mX)HiQgTJZo z$6Gy#jPbKtF!tV~mz$!A8AE{F_L^If+o&0m4KJ*@1;wU5LxSRkHM`8V!D?&lGbA-$ zShJ^Dv*xk6=u_NiXNPgKi2J>;ww_>}@NzgM^02nfh7+(U<`dwo^)+MK?BLL2INzNF za+OeUfA`2A4}1mzVFPMfi#fo2NFG2|XzidtW(Ye5(vUN8CM9i!KDMZq(brTPzP@qA zRov$m#I$&4g-vG9?7hfpyMfVjsZ4@TNt2^Svk%}!yLbZo5k5Im2#v#c)3$#7!R*(w zfBEFEpXfD>R13!0LGv&rGHIDlrt4#MQui&t!U(OdtcZ+7!G^}6VZVop7aWuu(3IiG z=%${0uBloV61*e=P-H;IuV6J~fPP`CKl-^=Yh8G*)p#g0R)Y&ygFtSPD%#M<+R5K66l`fh9Z>@>n>ZNX;yp1-KIK{)_% z2ZLrUn9(mM^OLnu_9lk1^BBs`V<#Z6VQltFfwS0d z0^3bsyNUhUxf8%|MdIYswtYX1pMwYiw(VMdCfIR$9voYFamk-fGzEd?&) zYp-apy`sJL3atn2Xr!avnV;d|Mn7}m0iKzUW7?^RT}H;cND@ezQblL54#}%oVn}$nnzJk&$MZ`{$MIsvfYLFLd%NW8%YUr+`ij1O#n+#^f*;*_ zR1l5$R8G%Bk3zVbuVysi<&d0ZkO_yNzoZ|&99k}1(vRK#X-tgQGaOoCQ1vuaU_MLB z1ZktJ^|r~3itC)7d!J;>AdI_2_)mn8vXxT$JqZ`g-x3)tn7?HQp$7}(K;yUUc!@&x zu$8QTtaQJ&gN$c&?ii&JSd1-XeM#wgbq5)+U~62Lg$}{$Y9SAYm0r*cjAwPO=M)9t iwUYHum6t|#knya}U8EKYY0y?u?FTSWb+d>zjsF9Vn)H7F literal 0 HcmV?d00001 diff --git a/auth_login/__pycache__/urls.cpython-311.pyc b/auth_login/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b37eb2f32820b5dd8d09bb92a2a768e134d405c GIT binary patch literal 1279 zcma)4&1(}u6rWA@Ba<{~ZDL8qqGAaRG0mx1MGVy*ieJ>$R#*aIakt4PyV+%TV>PE9 zJq9W0!Got7sR#d*jVu`ERPa>1q_n4=e6yP_EkbYA3jK@{|e7}2qa85BYa zBXfXU&96fC#tZu*f7iIzx9R|dY`KuyD-lf z)Q*g-9lwy101iKrGkzgw0yx4yj(ka;l#`!Adob;NIKh%r=eZSL9Fs4vqwLfn4aqWu zH6^DCH}_gqw(Ud8&2j`kF)C_f6HElJO1AB*L|C811|1a$tEsj_5~gH1s-%^hrYt#1HblY|#UUI#@>P`xgXm}3IEl$MsZlZJ zo0eu<^!p)c=*1~-SVo(UWa1^Uye?`X-jZW7d-Ysp|ie;CU8qke&{c)|dtk`wOFiSyud9^_q zrQouws+o5ryPglcC8_CDgGrR=JLb)|r;&TQAvZPUzI6>s(7)4u3fK=b4AVnb-Lt!g zZo6mq0a|hYZ})k`;hp7oX*W6BzT+ilyUC1~%yeG5>_V4a@YsbO8v*~co658wd8te{ zHRq+~I&WNdvCA%c?BW6SyLh^XCp~=gC(ixAxh~FoINwXm^tljs;|KwqP#9Jloh_&~ zX7l`+m!1i(R(pvBkiDrCn~n+%0!DdxatlC9}lz5yd0KOg&&ueC(|} Y2N$?dR6p`950Su-%!KZ5R5(f|Me literal 0 HcmV?d00001 diff --git a/auth_login/__pycache__/views.cpython-311.pyc b/auth_login/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bdbf13a654cf12e759292b290cc0b34a2b52aca GIT binary patch literal 12908 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 literal 0 HcmV?d00001 diff --git a/auth_login/migrations/__pycache__/0001_initial.cpython-311.pyc b/auth_login/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8f649132ea3e01aa3a54a8b4ab1c7dd1156bbf1 GIT binary patch literal 3810 zcmZ`+%WvDr87K9YEZee8CC*p-3%B z#jy@W4twZvZ<|98MNzmZR)2sGJ>;094Cp{ifg(UpMlTHF(;nJ>Gb76O%BI9mGo0@= zzwg1(-}?Jg5?ud$^dJ1M5lQ+tn*>+1Gx)FygYP6PVcC$@Wd0jk3&U^7h*YC%(Q0fh zCX4m>S|TLfmvHzS2}ekDGZ`q`2}{!VaEog#iRH&qKDy7Q5Aq?Js_GRRxw>UKG*-1R zF`QC|m;a1)CLfBR<2#9PKh{E620ua-c`Xu>z*;O2!C}mv#5WV&Cs7<}#&$yB1>E8) zhj5&8b-lzgd=ky%ac_Yy#rZf^OcwXyH12N>^zaQHw@Ugp;~ittW;z(*3|Q%F4(&w1 z8@R;PR2WmGp@n%p2pO>@Z$S9lZB@&5nV z_98Y*ESuFh?W@^(71`U`GqO#S;EIk6y+LTQ47=bvZt$VXfXjz%Rzh4-=!}vo(vAK9 z!qY}SAFBvsn>Y?w>GIN8-PFIX6CsmesJN(HZrnHm$kqmdJ=tty0+JFk8MLZyx|To+ z;i_(`j_#5|Bh58*c1@F@5|v#2Icbm+bp|*)fT)4hB2itNKp-$cstU=1`owgIK}wyt z=%(WmgjK7oLW?IZLmib$R^4=+0*whF+J`}lwrS}m!3{o9#UvjRDDy-}m4r17xsY6G zNKi{Ntu2jV#aatjc^_pQJthp8q7j+9f=aJ)UeSj?Fzh2e}&dYpD zw7+TOP{R@KVGKYwutVckjh{9i@mDNTdJM;+pz(X^(0T}K9Q zZW@j2rtU%=(=;YEVq#*JbVvYpqM?0vcqXo}V~fq+=QMd|1KCT=679bW@T}@pBBtp@ z%Q6Tu#f+mW8Xr|E#3XPABAO^{tpxgL>KEk-+zSOBm%fBjwh09%lLAa`!A zb6nSNn_w5IzuH`fKJd)7YU{$0d1xcVHrK_Ev!U1KUF1BQ7pvGw&rJ2aNd9=+Lk~ zAY~^#WtQ>Hdg`<{;d;}b`SA$j1aiQLAB_X&u#`RLDN~Gd%2O}5)vIlF$(x+Of%Kf;4D*`oAjoypQbc-%;VpA(+j70 z4CaHqP5B{dayjHp&!5IT(FIJM`D?nZe%e-VyzM{H-q2XEw7dE?(#oyu@}h9i&z zM*L_W;CNojjvv7Xf~oxDeEY`3(_A~-8l8I;Ymd&oc6X;*qqp`(Z?#8nwK89NL*p%V z;m@(Qy0Ck%r7rHNi*0qWmAUgyfh-V#dVPI&@y%*WS>98Y+sd*Z4TA?MDLdvVmsx}^ zLxdQVO9163-bYux3$qN<{y6g+$N?jMGzC(lQg-%;ls9od5c!y8*-0Yz!=|hZ_`eTJ zmu9`$0$9%u_!1+fa9vKO-b;)gaO#J*_Jl0X#p2`8xx%?+j+?O3PFdle-Rk4AF&a)$Nm=nkoa6Q%rETU!jv6!oo|5n zVOf@;a^-U^X;geYX{Z%^J!!6W($|wNwt}x8`-3dUeCcHRZK|D_de0XRPGR9*{vWam BCB^G=4F<|$LkeT{^GF7%}*)KNwq6t1zG@dLNPy(_`uA_$oPQ)Miemv#Q+``F+czS literal 0 HcmV?d00001 diff --git a/base/__pycache__/permissions.cpython-311.pyc b/base/__pycache__/permissions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb50ef3cc533b5b18255f20f4ef7d7a3a61eaef2 GIT binary patch literal 2123 zcmbVN%}*0S6rbsC+oeFO@}=U(iXVU#t|o?<_>q`~1dT)wO_R;i9c25l3o~00&L;t1cCPH@h@vT zO2`jaJ7T(9KfGUDsXY3f*1SO-FZ^ z3M}s-gITtx+up47kykr5g36&@;XbyMEm~-qi&ED`Ql$%3>Z=vOcvbaP!Ai@1oU^qG z6P~X=x7oU{z+wU&<1Y6X@7>Bh0k+89aSEnm>hp!%eI|;YyPC6L;F&vPJ09asE_jF) zdv(S$MR6vu=9Wysa_v)!+0_kyWW^Lla3-T|+B_dBG<&4E54I#u0&J5;jGP$SdG@yS zH8oMwCid`{3)QHv8HQt)nPK<|!zjB}rG)(f!&s}BrO*;L49m?M21i#_!cW12pFqGA zm4JsAGXUGIPa_hEY7K&*DbdRfau@Oqe6BI|Mt!T$MR;7CO76GeZi^JSK~TYhbQMI9_MJ-xfx5sj9*UV2lqU zBmo3^gFKN6`bi92M?lZC&m?2oHVxz46hIKnu{T@w)MQPYlp;bXITH8?!YINRf{uW< ztRrZ65RQP(_Id?v3WL@SfhU}Qte_2M#DeQJQX&182lx-F@nXVk`1MdfD6|dl0<2~QJ&|K{3+HxJI z4FQC;<;{zCH{Z{F?MO+E)@}hOaSY)qc5t(SCOEV(9ru$Q%Br!u!-CPCSeX^c`zcU|l3YjZ&{yUo);!HX)s0W=g!>34FicJSMXX%s5dVR&7vC#Qa+ z;ZNH-s!_NUhhb;Delm^ZDI|v!AVU@$hMoEP@GO#VAUUM`%k%4(_0)8?=hhlh!M}r{ B$k6}* literal 0 HcmV?d00001 diff --git a/base/__pycache__/urls.cpython-311.pyc b/base/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..14c03b10e50c3eab66e344cbdc3b0e5e2ff4b457 GIT binary patch literal 554 zcmZWlJ#Q015S`uo@||@=p@5D!mOygh(4#04!X1brD2a4A>9k}w&e`{2?cNEI%B4#R zB>sT`@hkWTvE(A!mI|dgDP1aNxwt^g?!KAXnKw_nU&Al}v~Pzu{3rTfCfS&KAKYGI z@C7(TzzL@r$!SD$E3$~mt<27y$RR*MIFk(rmdN?BnFNuCRmyEdOL&vcrm!T~g{QS8 z#SBktV-oq?c?Sdc@=;LAF)LEVsS2op0Vmeduef&)m#jS_GDRC zLMjb!2Z8pIgqLSYqPu*;igCGT_|ihIv=Q_JDO8o5OO}fdrJPE~T!tfY&g!f>{5wgz z?L=)GuI?hDCQ20QJKSPF+`W1AB0f?m8ow-1hV@=g;*n6(s+`5G?l3J3BW|6#NN2-} zsp+t-#_yRD@%_{8I{SIa>r5QTZ5(cXNYx09MF?pqC3XV_IzXOX!PEcuHT19k-Hi*u z&f@Xff3os>Yri*l@y7Azqs7C;$>QYG@#oW3xVsK_S9X7G_Zy3D(RtS_xrNGq07X=m AhyVZp literal 0 HcmV?d00001 diff --git a/base/__pycache__/utils.cpython-311.pyc b/base/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dffa0fc185faa21c9fbe98bf33ed703b303beca3 GIT binary patch literal 846 zcmZ`%&1(}u6rcS_lb8>dMzG%EVJRu3q^DE~g6P4b?ZM)qVWq5{X}jrWcG;O)4GHAn zNdyrB6^f8kjpUzcN}w_z6r@7&Qs}KG-)zhhExw(3@6G#|_v1JFC6l>g_1q z(y-Q44^UG(K%cdi{-1j%rbVp?>rMR-@b)9jz)5VSkv7-Nx{1xl=CZkZEFz4dVolf>kuTrEGmXFX>mVAca#v#FhbQnMZr zw!=N&!VuWGL!;bYIy0s_@e?C|Y~;H$17mJz%=H$AMzOtgnp^A^ zj&h5=HBhkHPrs)!@5>)5?<${?-O3u6|-gU|S;1(R^v#`6ME;L0^zM*70{7%uGqrcb1R9soOK-X1x^>6aw#n%7; literal 0 HcmV?d00001 diff --git a/config/__pycache__/__init__.cpython-311.pyc b/config/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..642a6d5a48b0566297127a4490ea8e87ed02286f GIT binary patch literal 191 zcmZ3^%ge<81S^7Gr-10kAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnuOMfun9$u*uC&Da}c>D`Ev&0dhn!Kalvq%*e?2fdNJoF$2W_nGrG_ literal 0 HcmV?d00001 diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60fcd2aa99f5f9360026074439c3ae927fedafaf GIT binary patch literal 2977 zcma)8&2JmW6`!T}v0Q$wEZh2`V$CLeTzs|G)ZQM1;O!gSh1*=DWWq5c(U^Q4{Hco-hR~(M$-8pD|~wWHZV6 zq?xkP%{1pzX2uemqLpoCEvYGSS=!85`DUK;8M9y&n?=rxX33J9vNhYB6;J}dOK^d&t1`Eope{;dlq%hNmRWr)@ccmX|Z+=~^^P>v<%-})-oG3B>@6u__dgS89RiDVF97$ioW&$Ro1mXfjMo*?igL= z;r+YH4rd2M^9;w9r2QUNJ{b_x)jSUqn|`902K5x;3_MKP0;+h9a$w*?T2<~iM6n!# z6~pd0#NsLx*Tfpd3dOiCDbRYJ=hAwuraNs~)%%*=bzI`~aoel59jk`z+MCsDHP3O4 zHmxym4YsE>>D^B?3v|)CbZ20Q+qkHAU&+zvlw zk>m9+VMbMX&|=fxcPz|3`GuA-d{v_=Q*yQPO1t*#wmHxZy9;6AyE124rsIh1@lYvX z5G0IY@zsjbiGo`X0~jW#%2E)U8ezA1n0~R%k4&dqgOJ8MZ88DZyIHA7-?DP82!Tkk z=Yh!-_%!vPg4)2PG~F`n%1n@CnF%tHjvzy@$|L~EI4-s|*8sNE#hyyrJ#1+_Je5R{ zb1|_DN}*_IP}BzCvJI+vfe!NzY{PZ2N0r7$dqLvhT9DH*Z4<*~MK*jbF4)7v!)n)Y zx+dm@>N=*;HZZNhcVW@m@B)O^)7su|P0a$!8HSk-Rv6|m_s)Y|<*w1jHpL)KvNEcq zgOq1@CJstE?q~zkQ+b&=HYq|h0+}mTosLQ|Ie@i6CfXv%z}8IFKEx#L4j#cUxbVV9 zwarQr)8O*7t3SxmFw5$dhkux2pxUs+UMeKTup@a7YOFTQvR5csqla3zi^H za2QySBb7LgcdxP@WK$l{?x9+Mnf&940*xd%sI zkl6`qA;?5I55$IPI)@GWD45%K9%H*PRf9nkC0?&Vwz2!c-aQq*)*uO|4i1vc&Okae zydH#99T-7|@r=oxJGlbs!G2?ZZ-=kUMg08_Kim(pAH2J}*Whv~WSRJ1=sPeOeSdGK z-g*c%Mq3RVf~zUN>$i3>eGF%CD~#T@VYAb}6~1WCaJM~;KHd&zTPznwx5ccix<}uO zw=72=nD{oi0qWU54cdcCW-=oP!X!}?k`u&;f`qjZQqDgBmRq z(e(2woo|iME1s{5D^DChDIdT0=evHf>@Sr4i);R3!tp%)q>xFaPZ5waMkX@K%l^Wz#tU1c`I=vTeO$ghT5e3{3#G&<0&>R4 zaSo!8${z3fqU4LECz+?Y=VEy*mQPcO)an@mGD$~(5(kXrwddmcSX^g_4Tjiw3Gsha z$YXKI7Ymhm9?3&}tmcJC2{rn}iGKI2$OR$wdKz(s-l1ru5PZ5waMkc>r;J&|!g#43( zCkIb^vcJ%tpLKOhD{Yz{>dp~fECm37HXl1;WV%giK@p2U+B z!Qw?h1Wz^6tAEJ0^bqD$@FZRWz2)R=HWBl9^Stapt?+c$F&{qK>1%rhN;b9E9qu&{-!-YjRS8B(eNQ04_t zb#tknPU=M^-mZOd%6zQ4Qo zyk4u;8#0UV00%TYQh?G{FHyfKd`gZtcFDjCe557~d`3y!0P|BVUoWi4wCf_;bX}Ph z9iJgL^q3e*opPC;w@agq1&axlW{fJWfHu8A+WTJ6$5qBC`vGoZ2BwEk%g#%V8F!u# zMS=&Pb)6l|dxC}znz2$;zr>6-xkOu3HL+(@Z5H z@-e%uX2m4%6J;ibrfC!1)XWKpjSaL15xAe|Bn57*zwdq^C*BCE7Gcq>E=G|yn$JW|u?b6zctgW$mFIv`X`_8-VXyei7P?KDwk literal 0 HcmV?d00001 diff --git a/config/settings/__pycache__/base.cpython-311.pyc b/config/settings/__pycache__/base.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cbfc47860c7b8d382f2fb7bb488fa8f76a854889 GIT binary patch literal 3596 zcma)8OK%&=5pF)j_e&D>uq@m3%CbZ`qWp@jIEJGUIhG0W6_T>D10jPEdqj;ya+sN+ zwVo3L_}~};O!%T4axnJbI7kkA+@C=%2&~Y^K|oGHE(G?rr&JF~n|dK0a{5vARdrQ$ zO;`WT>vbV`K4$-m|K&yK-*nP{Y`wux9t%Q;2qO+*6E>GjoC$hM$y~N@7E_mI<*a5T zTK9(f!XIGpkNyO4wn5%|`zOZ009!wpKnC9KV?vAs}3(+Iz=$^a~J$erM5}>CBW7!|$ARaqo$>k!# zyW$LG@jzF;mceIaMOUhj<0ZE;j5w>U(?+P z6-_vVuLJL^Z%vX3&-~R2v7f;=@GQ)3;G0G}XSDN@sc7YH;4n9f7r2`^#LdAwk8g2d zY|f$ZFZ2c1wxEiU>Py!u^r4)nX;P)AhIV8n6x$OjMLCpF2z!Uasl$`!B-Uy*s<#>_0fTw;lfd z3tf9~m#^G8ke6?+EdMH86U80%LG}LPL(p!=;*L-&X=EtIu5PS7B~B)mjHmdGY(lpQ zxGYtch-rZY*3#*<1j|PgaW<9b<1vCr@FcBk8ga2nCZ6D*rE_`RraJ7`X@a`14=+*7 zl7U&O3aYvkcIdMOSy6XI0gH+nDN7ia!~;PQBT*nHKTY+;o`C}hBQYfHWh6&41O@}} z`=|ZsMPP7+T$eT=6+XKNY;0MsfHk!HKTuWKiA14!E{O*N(1)jNp+Ok5gMm40om7C3 zpIGCx6aC#96i#+`aA3Iy=QvT43j2FPVIMxn$nT!geN0#BVuKNOLkjIk#Yjylsrph+ zi6)k-B|#G-+aN7guo~$xV#ep0@3B?l>?74Y88MRa8;!3jasljvoeW#``O_-Tq9Rz_ zt`+r#FF-2dA8L@4`mG+8Dli;7e@t6@m2EY?)r z!>E$5v@VzS1x?WXG$h?a!U#fmf!KK-%LSe%W?3cnDpZ4#w5`D93K2UL1xb-B#KJ;# zu+S3WP~fECjSRqH2m_rMj%!vRqQ=?MVOz(d>1?hy<2Rqh^K2rX%bz40dU$9R zdI?jYrXq!2q!g&WNTHV`Vu6ED@zaqHwB`W|Yd{j^NFe_#o{jMtCY%4dOL0fRgmkjU z22dg%WoVM|G{uNBkp|0X{UWYpJQho^n@pA^o@_dur_^XV1w}5;CNl{p&*sP^vyp!W z`n$!4f6gT0F(waQ5pRM?t!*%CQ1#L=P@In^S)NO$SmJ=<#mDa~r-+S?@*MFST4+t< zlK@Wq9sLB}pr1FRkG5zot6NM3&I2K|zPA+<)qPE_Zgmp~>Nl+cTc1n8A}s~I(|ilQ zJ2-N-)ZR^Dt9O6++3~n6<6234qO8C=^!BTkp;mS*CX=aSwwSCPL>m_}x#~{(J3^Dq zlm8>+s~f*#+i<=3YX6VrSLM3p7};OBe?-9_P_Xg5g{IqRx{0PcHslGszTa^C>B*m; z{OG>^gZp~RJ=3QDg|_=n+r3)OMboC@>bj4YTX60PS0D%8%JZ} z{p@Q;%Q4?}%-4s2>wAf_S~&IfjlzS7^-_=FgevkLFg}CZlbZH z$t%#pEI4ua@ZH1a<;Cxm#>3X=qxR^dCJG!)OdTG)J7`|}<@ZYCpf$1Do>=Wle>UpZ z)Tqa8@8i1bXk_eg?%iB->ehGJ#$0P;xjnL6_aBX4IxM~`Hm~0MKHDg^##h?oD@`XvlIxi2vOgiKG4u_V2w!>xKj6kV30K(4PW}pdTV&D8JIr`P9A$g9W*rK z8)z){psVBb4B0w}HWr`P3_5Qjr@tBCIugd8f^gEu9b=o~(P1 cJyUh(vD;sF96P;r+wsUu-A{kY6G*%N0n%zQT>t<8 literal 0 HcmV?d00001 diff --git a/config/settings/__pycache__/local.cpython-311.pyc b/config/settings/__pycache__/local.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dba35dbe41de01f5c895479ee8258989e799d88 GIT binary patch literal 963 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 literal 0 HcmV?d00001 diff --git a/home/__pycache__/__init__.cpython-311.pyc b/home/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2b1a0f1ebe67d0a7c03f922003f548f57ab0786 GIT binary patch literal 189 zcmZ3^%ge<81S^7Gr-10kAOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnuK;JOn9$B^G=4F<|$LkeT{^GF7%}*)KNwq6t1zG@dLNPy(_`uA_$oPQ)Miemv#Q-5)F-`yg literal 0 HcmV?d00001 diff --git a/home/__pycache__/admin.cpython-311.pyc b/home/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0b21bab7abd37b4d90cf3f21570cea435f5490f GIT binary patch literal 391 zcmY*TJxjwt7=Evplv0UH2RnAnkp2J>K`J=-F|>3kw?yw~FHJ7tE)GsE{s1>uCq?>a zstA^>PQ|6rt&{JW2I|Xm_kKU`^Xhp`K)WCO@C^O8O)8_?VBN>y2{>>PLqbM`0IzWx z*AhCS1O$nkYUSCjqFpcO3jvtnD-HLZ0r>9Hramd$kS9_tZ67l_>|b2@^jKp-O2hI1u$fl*?+tawVPrqBf@- z`U83^zn}>5XM)6GwO3Av13}@`6ZSrkDj3@{-+27ZjK&}9^;Mum_J5F{%6`*MC3XoG z+X`F)0tjRvfG&g@8_Wny*Mh(RF99*n0kJ5&G6DFkP9d&M>^^8Y-?iI<*-AH#_o8s< zkCamzQ7P%EL<~>P-j$5pRQ$zb5 zXZ>-+Wk`8ZYI2_(;cygn$YCdl2xX$P>yNsLj9&PZk<1!L0iDzauX~#n@u0PoEh7}- zfFhKwBBXc;)3}DvNrG7!xlQO0Crl!&vY}y-PRBB+p1!C2FcLIR^9d|;qu0H?ZEqkb z7hX41UE$4FN8Uaa$1;k&qRqA+O3Fj8FkTE}mSx{nFg}+T5D<^y2Fk^`PZsYvqJ=UaqH~-7Rkt>8p83 zjzht)^rMhlnpm&c{FX*}vW7y}%g>8Z?eGod>hBS6l$x6m!W2B1-P|d7I=i{&jtL*m R!N2Om$}fHU`#+(){2y@R6k!z{&b*^^)RD*R z9W7a<0s=JSt%UhNea!9srz zt#?7=K}{>}Fy)*zITqS3!FCtsdH`QJ0naV4^}IRDL;GC|NWoW5@dk6O#%f#iJap9S z#GC%Fgx8etRmXr8JNJy?7d)#d$q4T2u6VQ1a2*cBOXVe8} zqAYQz`6W&kGjrNJvF9?05fv}mJEMvNZXAMBW#127B@;O-}?yFTBgY|HL z_JWo8oThLYWs&0rVKPzMI`mRAdEwh01MUaRI&z^rN&%ysR9@R9ovPJ0YR*=bq$Oz9 zO!SbcKY)$u1=_8!$NVd7p2c3xvm+u{>PMM|IX0@UwIc?#dPmA5uGX7p@QCKGHBrh{ ztqayX^J^rqA6n~YS+V798zvM~C97rqEGu@{F|~l1HfkxOWAvP2MIrwC){#evh+D zOx^g@gUqyd{DkE#0KFB*yN>BfxyUS{CF@&gk%>Ad?}OJVSelbEyv*gWyxa`F9p+^$ z^1`*SxFo5Xy6m6VwCsr^N2IKjNh&c(IkId!l2Vn-vS&J%NQkPM1V@iVFa-o+8^&0{ z(I9cD^9lx3!ZM~uP8`aWl$g*|Voyr4CSu%fiYFzkYM2_EG|!0{5%ZeJ)l`WSi*Ti2 z8N>=8Mp!y8amh-8*CaqUV&}72F(VM0n#+oququC5#MJeOZ)|4f4enU)QSRK-@Y$K+ zA>tZdN{CsiN31X>37Qgpy}jIPXNS0{;Y*i?r)Q!r7(|ql#4Tm%MZ~Z_!t!_y=2}=Z z%SQ8Hq|6-M99>}NR$otV80c&*N!&7}AY zAHJBH9TL?AP07v*z?f5dqzoKVX0}|Y^HR1)oQt7JBQ&|@EQMeG*z+6DN8UT$HBZSGyxH`` z*ZtVny^${Z`V3#6?(5rZZ2$T2`=d8TZ;apS(i@{22Z5CH(?ICf>z|AmeHZn>crh?; z1jhBo@#kN7+qVz{Tii`cfzaCEtsnh1aWC>w@=j9k==mgR3|!I!Q^mlP5tz~&_vYu2 zwybm9k+(n%OLnOi@>}XvsWz;lq}bsS`8Hu687NX&>nQHN3<0t&p`NM zCkd)sGz|qmfN%Q@kPn!Ph=Er?9=+YZ!f3T61BBJ;@9zQoH_`E}A$1mo&_A%MEnl zl?FA4O2cIVmAnDN8`hm+b5e7tXe)7YT!v4J9N3ei@6DV{>x~@uPL7w$J(xZt2*slj zNtA^$)Vt1s^~-H~h$Q%iqDq={RXh(!Hz!uQs6S%59nz4HrNjc4P;wcKxGqe;K4~fw zR)(;IY0xA-EG8k6K=4wP9EMOtJVOvaW~8)OmUSl}lxd>C@tTQ|rk(Hz)%8@cIU&k2 z$HD0w1Fm^G6_e7aWri*q?NxZ`Q~Onan}Pjn12=zI40IWRuEKc97hba)zHlkfa!a_^ z^=JmL#D5Y{)qfID)qk>ZezUn}?V!=zQ}X%s&R)omnv0!%MrWTsFbetaOmX0XF>pbD z=_05GCK%8K3d%qW7dI>8-wW!#SkV_Ve6hm$Qrn@mt47}Dw?unon4BibYD|MGtjgw-0n-;FK1oMlX#^&=3HpD^H1vH`-jRt(&QoRI zK8@c7VR~!Se*yvPFiZ)J>MzPA)S=hs5{l^cxrAbReJ&wS!Tjy2cnjvQgkI6>a|sRT n^?B3LQh2xMXfqsb1$N7RkO8ZGo2(wZ@yb_}|Md$x&29e|yQs%o literal 0 HcmV?d00001 diff --git a/home/__pycache__/serializers.cpython-311.pyc b/home/__pycache__/serializers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e8fbce375ebe89c8dc8f1cdb939d47bbe6974ab6 GIT binary patch literal 862 zcmZuvy>AmS6!*v7^@F6)v=RsjsS_eXNq1BsA&MAEI}mj_ophYAn_O}q!M+H=#K6#z ztt(Rz;{RaIzz}(5s#sE`QzqVvxt3G=eE#`;-Ota@{#LKA5|9_2KjJ5>ztJeg{in=! zK{+9U2%3=Po1PX+PWVm}J|u~PSiO}E446C1ao<9i=p(#3emi417+S=;}yHXE| zd>9CDbn{l66;fq^U34!Vwu(p(S~eQ=@>B-@b+tYGU>vMktpL9VQ$GOsbU7w>Hjdp% zW9#eV@p}8%!=W0Gp*8^ynvSZWQAb!S-D(}RMb-vtOC{jR^bWuk|CBLzdrGduIr=Vc z2v}m|#D=aZsf+MPK~vx7YM}5f8E?@%Z992;A3J$<)3%&yiSy+hdl^sFJs`lRrr!We lIi++$9*(Qugxnohzp2M59OF8C+55G*eU5>P8={M|`~@6Q&e;F} literal 0 HcmV?d00001 diff --git a/home/__pycache__/urls.cpython-311.pyc b/home/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2adb760e3c9dd2c9c27f7a731a5ddcb5cefe07b GIT binary patch literal 1051 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 z zARrsIe^`;j`=RX*i&F3v(H<(=Ly|otnnOIXP>p*BsA;$WHAkaqhz!xFY>h@!88(+B zJQIz+or@*QCDpxH*2j`b*$hWKd><~*F$sIJqk8;`#*;BP9}`r9$-2PT2~jrQS>S$; zz5hLlk5ZrXT7Y z7?i?!s;qFh&{Ob;bf8EFBs%ayg&rDqk_yr2dEUN1=;VdW6zyVObDI zDu#pm12c;kqxWO{5++-a+*tVx=7dC&SLQ%&D<4gR@l0C4iMN9APm$#y%rplA#NFja zSOP+HkpP6%48DVnqygo|q*YrIWVv_-$Akl*0g2|R4d+O>})>?TzlOX+^ z3iW=7FRy44rpwnD#=|}<$UyPDwmS7$4yO`;Jm9(klN&(UaX54Z^2BojulSfEa#G_IP^@`e5LLO0@j*>YiB26lx9#NYP3_qkO;FrG+7(cB1gP%na`kM>E0NER7WmtYh7-2z06#>?e8fu0s;bx=~5l{#%ARPV<;Rp#g z0w1&=M(6;hKPpiyte{f#go{h15KA?cI+aaD*9;bG>X@iTt!wKoeO=+~4}qUeymKod zEL6gEREdNTi8f+^0}kOZXyT2;3ypvU9Kq4U*nR}!fa#Bo5RQA6$w0FY%t0U^*iU%- zURJmoaFQ^E!_*r{J)UJx;EdBG-RKRZMsNePcPY@ly5in_xY+?rfBc7UCfI*<#p#Q_ z_0VD8ehAQD`UCE9$%`%#D46L4(PUB$a4&bCX51wyLsNTT>pk z3G1n;N^MK3>21xVJYy%kgwT_5Og7}UYO>Te9E@dCrv^)^dd=_Cl0e@9LzbargHQ?q z7t3Ov?M)j z%PKbpDXwUW3HN7dOj<<4M5`&pp!`9xo;fdJi~QA4-r6jEQ>ov8RL=7=SOT)_bIG|) znfk2wm2LpyHo2{tq)xip7;eZ~U1yP+P6>UNV`UfRM-ODRO@R1G0F|P>rb^yf`Etoe zj;M-ZvfeV(a8+p%UzyTdr2D>qLuY`Co=bC|R_{Yqjp_{zPL+r6HmYS}Y?*qi>W49* zKx|a2`irrtv?fg1*qZQntDAb0R9}8Ks#8-_*Q9QqCR;m{e-Ato2gdjUp4RS*pVODy zT{!L^*uCe*P_p=a%1#uV>>vmO?>XY-$Md#$*%>c6V^^F}&bZ0wz~CtYa?XhxO=NR! z4&{dTihF}U7ds=<_Q4VjyT5M$A10j>CK~6Yx#jCu64vUTU>LaVem?!fl)`i z%5APX!z0J}(Vye7_5OdL+lIY~;;_lhPbtkwwJTx;+68h=F+Y&_z|6?V_<;dN I6fpzE0Mpzx@&Et; literal 0 HcmV?d00001 diff --git a/home/models.py b/home/models.py index 5b7207d..1da02f0 100644 --- a/home/models.py +++ b/home/models.py @@ -1,2 +1,52 @@ from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models +from rest_framework import status +from django.contrib.auth import get_user_model +import random +import string +import requests +from rest_framework.response import Response +from django.utils.translation import gettext_lazy as _ + +User = get_user_model() + + +class URL(models.Model): + # created_by = models.ForeignKey(User, on_delete=models.CASCADE,null=True,blank=True) + original_url = models.URLField() + short_url = models.CharField( + max_length=10, unique=True, blank=True, null=True) + click_count = models.PositiveIntegerField( + default=0, validators=[MaxValueValidator(11), MinValueValidator(0)]) + locations = models.JSONField(default=list) + referral_sources = models.JSONField(default=list) + created_at = models.DateTimeField(auto_now_add=True) + + def save(self, ip_address=None, *args, **kwargs): + try: + if not self.short_url: + existing_url = URL.objects.filter( + original_url=self.original_url).first() + if existing_url: + # self.created_by=existing_url.created_by + return Response("URL already exists") + self.short_url = self.generate_short_url() + + if ip_address: + response = requests.get(f'http://ipinfo.io/{ip_address}/json') + location_data = response.json() + self.locations.append(location_data) + + super().save(*args, **kwargs) + return Response("Successfull!!", status=status.HTTP_201_CREATED) + + except Exception as e: + return response({"Error": str(e)}, status=status.HTTP_400_BAD_REQUEST) + + def generate_short_url(self): + characters = string.ascii_letters + string.digits + short_url = ''.join(random.choice(characters) for _ in range(6)) + return short_url + + def __str__(self): + return self.original_url diff --git a/home/serializers.py b/home/serializers.py index 236cd38..3588d58 100644 --- a/home/serializers.py +++ b/home/serializers.py @@ -1 +1,8 @@ from rest_framework import serializers +from .models import URL + + +class URLSerializer(serializers.ModelSerializer): + class Meta: + model = URL + fields = ["original_url", "short_url"] diff --git a/home/urls.py b/home/urls.py index 3746b64..ac079c1 100644 --- a/home/urls.py +++ b/home/urls.py @@ -1,6 +1,15 @@ from django.urls import path, include from rest_framework import routers +from rest_framework.routers import DefaultRouter +from .views import URLViewSet +router = DefaultRouter() +router.register(r'urls', URLViewSet, basename='url') -urlpatterns = [ +urlpatterns = [ + path('', include(router.urls)), + path('redirect//', + URLViewSet.as_view({'get': 'redirect'}), name='url-redirect'), + path('analytics//', + URLViewSet.as_view({'get': 'stats'}), name='url-analytics'), ] diff --git a/home/views.py b/home/views.py index 3c9bcd4..8a5bbe7 100644 --- a/home/views.py +++ b/home/views.py @@ -1,9 +1,107 @@ from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema - -# Create your views here. +from django.contrib.auth.models import User from rest_framework import viewsets, status from rest_framework.decorators import action from rest_framework.pagination import PageNumberPagination -from rest_framework import permissions as pe from rest_framework.response import Response +import requests +from rest_framework.exceptions import NotFound, APIException +from rest_framework import serializers +from .models import URL +from .serializers import URLSerializer +from rest_framework.permissions import IsAuthenticated +from django.shortcuts import redirect + +class URLViewSet(viewsets.ModelViewSet): + queryset = URL.objects.all() + serializer_class = URLSerializer + + #permission_classes = [IsAuthenticated, ] + + @action(detail=False, methods=['post']) + @swagger_auto_schema(responses={201: "Successfully added!"}) + def shorten(self, request): + ip_address = self.request.META.get('REMOTE_ADDR') + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + short_url = serializer.validated_data.get('short_url') + # created_user= request.user + + try: + if short_url: + instance = URL.objects.filter(short_url=short_url).first() + try: + if instance: + raise serializers.ValidationError( + "URL with the given short URL already exists.") + except Exception as e: + return response("Url with this short url already exists!.", status=status.HTTP_406_NOT_ACCEPTABLE) + + if not instance: + instance = URL() + # instance.created_by=created_user + instance.original_url = serializer.validated_data['original_url'] + instance.short_url = serializer.validated_data['short_url'] + instance.click_count = 0 + instance.referral_sources.append( + request.META.get('HTTP_REFERER')) + response = requests.get( + f'http://ipinfo.io/{ip_address}/json') + location_data = response.json() + instance.locations.append(location_data) + instance.save(ip_address=ip_address) + return Response({"message": "Successfully added!", "short_url": instance.short_url}, status=status.HTTP_201_CREATED) + + # instance = URL(original_url=serializer.validated_data['original_url'],created_by=created_user) + instance = URL( + original_url=serializer.validated_data['original_url']) + instance.save(ip_address=ip_address) + headers = self.get_success_headers(serializer.data) + return Response({"message": "Successfully added!", "short_url": instance.short_url}, status=status.HTTP_201_CREATED, headers=headers) + except Exception as e: + return Response("error occured while adding", status=status.HTTP_400_BAD_REQUEST) + + + @action(detail=True, methods=['get']) + @swagger_auto_schema(responses={201: "Successfully added!"}) + def redirect(self, request, short_url=None): + if not short_url: + return Response({"error": "Parameter 'short_url' is required."}, status=status.HTTP_400_BAD_REQUEST) + try: + instance = URL.objects.get(short_url=short_url) + except URL.DoesNotExist: + raise NotFound("Short URL not found.") + try: + instance.click_count += 1 + if instance.click_count > 10: + instance.delete() + raise NotFound( + "Short URL is exhausted due to excessive clicks.") + referral_source = request.META.get('HTTP_REFERER') + if referral_source: + instance.referral_sources.append(referral_source) + ip_address = request.META.get('REMOTE_ADDR') + response = requests.get(f'http://ipinfo.io/{ip_address}/json') + location_data = response.json() + instance.locations.append(location_data) + instance.save() + return redirect(instance.original_url) + except Exception as e: + raise APIException({" Error:", "e", e}) + + @action(detail=True, methods=['get']) + @swagger_auto_schema(responses={201: "Successfully added!"}) + def stats(self, request, short_url=None): + if not short_url: + return Response({"error": "Parameter 'short_url' is required."}, status=status.HTTP_400_BAD_REQUEST) + try: + instance = URL.objects.get(short_url=short_url) + except URL.DoesNotExist: + raise NotFound("Short URL not found.") + response_data = { + "original_url": instance.original_url, + "click_count": instance.click_count, + "referral_sources": instance.referral_sources + } + return Response(response_data, status=status.HTTP_200_OK) From 3a8311e99c042be80569a99ae233a573fc52eb88 Mon Sep 17 00:00:00 2001 From: AnjanaKJ <96719400+AnjanaKJ@users.noreply.github.com> Date: Sun, 27 Aug 2023 20:13:51 +0530 Subject: [PATCH 2/2] Update views.py --- home/views.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/home/views.py b/home/views.py index 8a5bbe7..d32de86 100644 --- a/home/views.py +++ b/home/views.py @@ -18,7 +18,8 @@ class URLViewSet(viewsets.ModelViewSet): serializer_class = URLSerializer #permission_classes = [IsAuthenticated, ] - + + #Shortens the url @action(detail=False, methods=['post']) @swagger_auto_schema(responses={201: "Successfully added!"}) def shorten(self, request): @@ -29,6 +30,7 @@ def shorten(self, request): # created_user= request.user try: + #checks if custom url is provided.If not generates a new short_url if short_url: instance = URL.objects.filter(short_url=short_url).first() try: @@ -62,10 +64,11 @@ def shorten(self, request): except Exception as e: return Response("error occured while adding", status=status.HTTP_400_BAD_REQUEST) - + #Redirects to the original url @action(detail=True, methods=['get']) @swagger_auto_schema(responses={201: "Successfully added!"}) def redirect(self, request, short_url=None): + #checks if the given short_url is found if not short_url: return Response({"error": "Parameter 'short_url' is required."}, status=status.HTTP_400_BAD_REQUEST) try: @@ -89,7 +92,8 @@ def redirect(self, request, short_url=None): return redirect(instance.original_url) except Exception as e: raise APIException({" Error:", "e", e}) - + + #analytics(provide the click count lacation and referral sources) @action(detail=True, methods=['get']) @swagger_auto_schema(responses={201: "Successfully added!"}) def stats(self, request, short_url=None):