From 5cbaca0750d0a7fc01767e35e4f2b372c08d15f3 Mon Sep 17 00:00:00 2001 From: "jieun4510@sju.ac.kr" Date: Wed, 16 Aug 2023 02:36:05 +0900 Subject: [PATCH 1/8] 'FEAT:01-01' --- .idea/.idea/.gitignore | 0 .idea/.idea/.idea.iml | 8 ++ .../inspectionProfiles/Project_Default.xml | 13 +++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/.idea/misc.xml | 4 + .idea/.idea/modules.xml | 8 ++ .idea/.idea/workspace.xml | 75 ++++++++++++ .idea/.vs/.idea/v16/.suo | Bin 0 -> 15360 bytes .idea/.vs/ProjectSettings.json | 3 + .idea/.vs/VSWorkspaceState.json | 6 + .idea/.vs/slnx.sqlite | Bin 0 -> 90112 bytes .idea/main.py | 16 +++ accounts/__pycache__/__init__.cpython-311.pyc | Bin 169 -> 169 bytes accounts/__pycache__/admin.cpython-311.pyc | Bin 224 -> 224 bytes accounts/__pycache__/apps.cpython-311.pyc | Bin 544 -> 544 bytes accounts/__pycache__/models.cpython-311.pyc | Bin 221 -> 2698 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 0 -> 824 bytes accounts/__pycache__/urls.cpython-311.pyc | Bin 0 -> 428 bytes accounts/__pycache__/views.cpython-311.pyc | Bin 0 -> 1912 bytes accounts/migrations/0001_initial.py | 35 ++++++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 2320 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 180 -> 180 bytes accounts/models.py | 109 ++++++++++++++---- accounts/serializers.py | 10 ++ accounts/urls.py | 9 ++ accounts/views.py | 36 +++++- broccoli/__pycache__/settings.cpython-311.pyc | Bin 2585 -> 3130 bytes broccoli/__pycache__/urls.cpython-311.pyc | Bin 1166 -> 1257 bytes broccoli/settings.py | 45 +++++++- broccoli/urls.py | 4 +- usebody/__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes usebody/__pycache__/admin.cpython-311.pyc | Bin 223 -> 223 bytes usebody/__pycache__/apps.cpython-311.pyc | Bin 541 -> 541 bytes usebody/__pycache__/models.cpython-311.pyc | Bin 996 -> 996 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 831 -> 831 bytes usebody/__pycache__/urls.cpython-311.pyc | Bin 552 -> 552 bytes usebody/__pycache__/views.cpython-311.pyc | Bin 1909 -> 1909 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 1044 -> 1044 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 179 -> 179 bytes 39 files changed, 359 insertions(+), 28 deletions(-) create mode 100644 .idea/.idea/.gitignore create mode 100644 .idea/.idea/.idea.iml create mode 100644 .idea/.idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/.idea/misc.xml create mode 100644 .idea/.idea/modules.xml create mode 100644 .idea/.idea/workspace.xml create mode 100644 .idea/.vs/.idea/v16/.suo create mode 100644 .idea/.vs/ProjectSettings.json create mode 100644 .idea/.vs/VSWorkspaceState.json create mode 100644 .idea/.vs/slnx.sqlite create mode 100644 .idea/main.py create mode 100644 accounts/__pycache__/serializers.cpython-311.pyc create mode 100644 accounts/__pycache__/urls.cpython-311.pyc create mode 100644 accounts/__pycache__/views.cpython-311.pyc create mode 100644 accounts/migrations/0001_initial.py create mode 100644 accounts/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 accounts/urls.py diff --git a/.idea/.idea/.gitignore b/.idea/.idea/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/.idea/.idea/.idea.iml b/.idea/.idea/.idea.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/.idea/.idea.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea/inspectionProfiles/Project_Default.xml b/.idea/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..5204d19 --- /dev/null +++ b/.idea/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea/inspectionProfiles/profiles_settings.xml b/.idea/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea/misc.xml b/.idea/.idea/misc.xml new file mode 100644 index 0000000..50dc922 --- /dev/null +++ b/.idea/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea/modules.xml b/.idea/.idea/modules.xml new file mode 100644 index 0000000..08f54a6 --- /dev/null +++ b/.idea/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea/workspace.xml b/.idea/.idea/workspace.xml new file mode 100644 index 0000000..0b98e2e --- /dev/null +++ b/.idea/.idea/workspace.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + 1691050027413 + + + + + + + + + + file://$PROJECT_DIR$/main.py + 8 + + + + + \ No newline at end of file diff --git a/.idea/.vs/.idea/v16/.suo b/.idea/.vs/.idea/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..8208eadd67b263203208d0fcaabe60e8da56958c GIT binary patch literal 15360 zcmeHO+jCPz7~gV{f}&g$1W^JaA~rEeo3;UgLRv0Dxuq18BII(?rp=|Ea{>g%8J~Uh z(Kr7DXZ!;kXMAxS;lXjnH+l0_-yBEq_uF$eS&}wANy??MU*|j7bI$I5`(5|jJ==SC zH~#+hH{0)v8aOOgiU$wZis!WFU0PXe5aLzb^Vx%k4Mmtxc|d%T`#a6jR$ZZ6pLb7oC5U>N+aU7^TOkGi&#;i zPqBMxb{&;qz7np8yvSh`36T;rxK0W~oD;K8kd2+OTE-_IVgqKkAlp@LWXS5ddy z?NISgzGpF#BIIEJ;}}5#Xv|00eGd9f^M4*~zjE7e!|%Tw_#Chn@16&~2HXx@2V4() z5lCHAh8uz8eKYW7;48o_z#Tw#$=I+4W&V<9{w~9_BY`LB{~L}}{r|hIFb06K|0n7H zAA|0)|4Z>#V#jLSG7jkes{H?Tykj2FjQ>-;^Z7dCz_a54|L>7dM{^-#HuXdspx!wT zaNgGAzuu1VpZ6;MQ~#XeIlpl3;2gp^fwuGpa3|0Q+y&eXd=t0__!e+4@NM8e;5)$m zz;}T?KtC`5d=D4|hJayUFR%|70rmq2fP=s&@Br{2@O|JR;9=kq;1KXA@E9-#90ra6 zj{{EtPXcuw&uI7O-0}tdUeunm{&>y3-iKa(7A)_aC?U(pA=@cPoYXRpVLUOxOCwRi z#R2G_bArnEy@-}EP}Lhozx1@c+w*16FTe_m;uc0w1f?wK&A%24!vEE}!>j%;fjDC{ zq1MhFJ~N;=iBZwg6?Lb6?X?H=o7MjqI^o|Kab;v@rp1ExhKKtq+I!$7>NO0a1~k>x-P03ciO2d_!pe(nIm|WKi7+t0il*Y zql*El&tNrNl(s-?(?{a8Q`bK5&)lLJ{<&sV@u!x)Ly2+DS&1LTIA$RgT0bq3Pj%>b z_0K%VEB{=3sQBxw`^mE;h z52^+H8Q}Uj#-Q7s>K*a7Y5tk7EB!a3KQ1}9vn#&H_{)l4a>F++s+myy+l7p zj`XKifqH1CJ^5&-J@vr$)jnp2aO)Y`9ls<@<52@x#loLm@v>zb`9Q3g%NZ#v#G#vRz66Wkhmr#WiAXBaABy(&8NtEmwI0>EK8lkGYsyX}bH?J* zx<;d1POvCIZwRrZ9f&GQfr9>`kmsJNhLXTBK*JK!7tCHze zEIf?-<-+0t|;T# zIG#>u`3U=uyH7*d-3*|86xUwaOD}#W(3U$f+^I=pe&EdhV+U}N!v2>nx%s&RxXHsh zs3Wsu^kczZEy>MN^ci|At;@o1YRT%PmW$hnNqrr|4c8=j$<4hb7y)W^lS1@ooObL^ zh@U!ur!3|l&V!tDe(3;yoNr(=&=gPqIMHn>&ZWxARCMEtKG!i?x(P3$H<{omi`_t4 z->)5DedNoO*&uhgxW7iumSXJVu2~KoWWZ5%j#c-a#FN8mXXvSZ9Rc(60A1S7iHGWS zRn&Kox)&ZFaQ(^iT+X`f65=*@D;d3~;YWt_D6Z$qu*NC5)0uZychh*wFPp5JL>qpG zWMpAnnZPQ``4*l)xe<_lJHYP{|6uQ9Pb8S^PxTuSe`X*N_4kGQqWRH-&88igYoDl<{_fn5ty}e%k!!YXB9$tZ3bxg1`wiE-3~e~iof6^qo_N{GO4P z{}0w^JUoBJGwSS*a_}OzQw`|z{3FjF(jIyKZ=o}|v_F13Vh-q)KEFBd=AlVIE&o;e vWvrojBDir%qU65|eR-v?pTAhn|D+m3tNB;E`5)sD*I%^UR`Snw^T+=H((%Z+ literal 0 HcmV?d00001 diff --git a/.idea/.vs/ProjectSettings.json b/.idea/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.idea/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.idea/.vs/VSWorkspaceState.json b/.idea/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..6b61141 --- /dev/null +++ b/.idea/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.idea/.vs/slnx.sqlite b/.idea/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..fde3847bd9b23f2735063e4a057f53214ff89be7 GIT binary patch literal 90112 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 Q00e*l5C8%|;C&h($ delta 18 YcmZ37fK6rQzroweg+{gad=CE$?6st=?}66f06m zs>Dh$0Y%U`gvHwkOS-TeMd&f~pq1LVE(W?bUD9LAB50v+YGo`>p+fux6AJ=WKGkgf zvaOSgnx)O@1cqXjD%MTA5TU8lvv!SW<=U1JOO#pVYVPP4h z$KlBLLLEH}r7bJ=hViWhZ68MUT@mV$)yOhfJ`SyKNp(QOF3kWQ?uRb)c zqXqUQyshrz1)Cri7jtYE>|DjMYq@#thMv=`oL*f{0z)9GaQ#mw?UA?K1Ih%?OTOb2zjw7pDpt){Ci=HdYsWfOHH+Z01EmwgjR1NlnVIuhci zg}*Zg-TqHnnNwcol$$)YreyCf-dXfBZ#~cCpJnn7omS?kmpQuD-M`+3QhhIxm`c22 zq$#c^P`u;0-1|)Kz5h;29`xivS041`E#60Z$%qj;1yf7#b`d+$X)Eb`*TyBmy8oo;;2TqR=_vK$kWEkLN5E%OdAdT?19%+{Vp&{u@ zNWJUmKS&Uhg)2i3TUh_|fRHyeGlKN!G8jD$4ND@7Nef%{a8KX}j^fCwxU0fL{RcZX z5pP)f54$+G<2MsC#L?B*&f->T-(?ZmW0Bltu{TBsx9AMk0<%O`+jh;O?6Ht{S)_2h zl*WlUp_IYxfb}F58MjV7FH z7?hmvygW5ASv-AlLOpw7;`4E;Oip}x`NHJHcpy)aAr_G#K0s}rag2Nf-Tni}8`S!p zz0IpXRDP^9&aEZ;n`gab|4R1B_;1eBX*W69N=|yo$;O1Q9B$t5l*23UJ(>PpdWv0T zs-;YM%2eb0S~kD*zL(9fIBxb>D|^h#9&3E=rv{f|UTSb<+)a(PQlnmKv~j^#j<6s{ zR*t#KXiFLOl+ng{KRvwkmX{uWGUld_x6;SG^zp`LTZ1b#H$B!$k9p~_#%F8YhZ{xz zz@a6h@df(@AILtdScubpyr5Zg)sb@5su5#$1QIwuG7Eoa`29jyQKj)s8$25%t8YJ_ z;DREoq!D(!f-}#zaObwZmQMz?<709X>{v;+e+IH16$HUYAG$jqA02deK0dnO?)R*p o5_$wE9ec^ryD!=3t2e5#4k5RW_7b=KZMXmEOQw0XkDBk@zZz$PU;qFB delta 171 zcmeAYy~~)soR^o20SNf5Pp8-b>Bk@r3@||%pM`*o=?p0hDU3M`xr|Yaj0`DE!3>(r zFF^`48E>)W=BK3Q6#Hp1-QrBiO3X{o*Gow%Vg^dCWcUnHGx-dYjnyv>8=$(Y7{{MQmRCeA{t|9W4s&TV|^yOcS50}ph!uV ze-ISqm!wNUaatNAD!Pj<)m6;c=bWr$c6auho$qXTRkI?tjUsC76N9 zTLdQ{K{5?Fix?y9X)osyXW+pWNd6t9uUOBoKR)FE=eR0~0vYT4GPe4J$Bt%|$7sI=}QxExZRT6Q@k>7W##I$!q-r!`j;K@S- zb56x0UoyBq$6yQb)=bYSBTrbyF5XK{ktu#YDg zT-U1m`N;W{k!c~<0xtUq)wi25TDyN7jMg6?hcwI@I?V>EosMs)(`Jd(a(!&tgvzLO zLSd~4*iBS(>aphqPsVUtUD4U~9gd2asHkqMM%jTlFj%`Uh52OY=Wy-%mEE#fwyIov zn<_VNW0hAk*J*3BD*h`&{iNpFeNl7MjN7+T>Jrop;E6RB8Xl@ltQsW2uRE>Z9+cEZlcsvj~>1G4=UoH zX`u(*Q^AwBLT^1eQF9QSoqf!k-S=kMXUnPs#@Xzh83f>?BvsUYi$w>ECt$!x3<+^b zqPZF=xfbgQbtwT2IAJ;>jVcw4Q1x1Q!AL`f`zN}@U178hPVKX7IGUn;Kkq3cOoO;! z+#$+phut(xk6Ndlkl)=K@|*5nIEFG=2vF$vbPi<#nH>P%D TLU*QgXKv69ZD^KDnCSflYbbJk literal 0 HcmV?d00001 diff --git a/accounts/__pycache__/views.cpython-311.pyc b/accounts/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..409ba8bcf059abecd9287f43d1685b21a041a352 GIT binary patch literal 1912 zcmZ`(%}*Og6rcU_`U^Y3c1#KdlAtt}8bVP;o2qF<0i~slp)u*fvbx%M7g)3Ql9@FK zWTYH&uzG3L3sj;Khl)0WYb5@IUhQh7x~rlhRXz0Ph*YX_>YMc!YmxEz?QheD zMuDh+#mV_kztq%qfR`7H6}2$;$dt9hysY7riZxl+HdPG9&_kl0(PW!RoCnifoJIj` zBNe3?1*KVqd5Y4U!a@<8-ILOm3Rn*m#?wyU(4!IBLpuNIBf?s=A+G+r9zb(%6b*#D88KDx_m6tbrI({X-%PP37Ioh2w zy8Jxm#g+y7WIKH-Y{^p+6mFMQ_+8HI?Re!JM$z@5un(Odw7cIDOX6OjCCfk>z6hkV#XLC3OR6oHl%SZNC8lW>AewjCG=aUK}F$7b3% z)p5`?q16vJ$E({@A7tpYBbl7077LmAjqI|F^Yhrqsaca`9$_P!HFPZlJs8CTXx88+ zlhM@;n_o4Ex!LQwbfZ*9DMacZo}lB{wV&gM1C`iBH8x?zCd&R=Aog2e@Yld#H85-i zhU+Nii`OD=Zr}axZZ$GuMMlcge@Aax(f5w{YV?j3y;Gh!9vIpazMtKlE#E)xAKWQg zL+@1k$F2VH^5@6BZ=4KV-<_)s-8#8CTDvw@7r4Pobwq_IUhJ(S5dU64eS=m!QIGf| zp%)0mODf7!^*+>d;hW^w$({H2GDp+pWHmTx1t%-P$yzY%=x^`kj})q(vVv2U;M7Uv zQhD|`9N+O>Y{Q8K~XUP&s*c~z2Zza-@irKnRJl%&T+ zS#MbIRq%a=@HKegD^$>Ja|HcFkQ*SLw10KBPncus=zQ4-Lf=m&0(J-v*_0MB6tHgK zl?K=1ZsjN}ozJsFM?2bOb22;T$){pOM%K-4*gVQT0~#XW22?TUNW(2a_F*3fLlJx|cBihI^Qml?W~ R=gV*Jy>KiqUt@R5{~tez(kB1_ literal 0 HcmV?d00001 diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py new file mode 100644 index 0000000..3d97d95 --- /dev/null +++ b/accounts/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.3 on 2023-08-15 16:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('email', models.EmailField(blank=True, max_length=100, unique=True)), + ('nickname', models.CharField(blank=True, max_length=20, unique=True)), + ('is_superuser', models.BooleanField(default=False)), + ('is_active', models.BooleanField(default=True)), + ('is_staff', models.BooleanField(default=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc b/accounts/migrations/__pycache__/0001_initial.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c5533a9dfacc3e98b964bfe2c99c6eeb6e71469 GIT binary patch literal 2320 zcmZuzO-vg{6y6`(*v5cOAWi`PHIT-Mf}n|dNYao1fhKLD{1{qUNZZ9THcQsKW_JyN zUO4p7V{YY`6IB(f%8?_-9LLg1wWgOyJ#jNiPC50>tnHAPHT&kxoA3S3^D}?;^@Rm^ z{`vb~6z&m(|JbJe_*=~TTfqDwAOVTGP!{uIS;|YIAPI{Cl717AjKy`it+Wr^>&`AO zBi}P2>px=0S&4?rTFFu!%`|KpD4PiDcA>4w)_804eoSI6v5*&$ke84MhNP01_elcw zuLs&H2+V_|XFb@Fh)6_!6sYy=`ydc_y{9OlAV-GU5)?wgT6iD)yoR@f>g6b26ea^} zB8t@dK2Hm*^>bWrOOfFQkXVa$;bLES717|SxHB9V>DcqvhW15>4PNg7pTl2Z#8WV5 zzrdVkC(bb^a;%-}@^!uoGtz|_<(R&9giwPqlt4+8LZh|xKHSpl&P_q|nJ)BK9DMZy|W-M1f0=8$ug@Idq>T!;k3u6 zoi)u)Gmq(2teZy3PCMpg`mQJ1(sVst!cJO+6(TEZw#~lipsX6;0I+GS7S_^c5e#9? zYFVA6L4H*>cBqeWJ7IR0liX)Ez-vK6Ygn%+4u0X#h=p|?FslX~Z112*aARC1Ii^?C zC^vi}mYoaFD!8B(wZdl+7ES9@Zj(C$-2W%F9d75O1`VpKwqrq|;WB;PX`rZK9oe+U ztnm5vC_6xdir0Dy4J!(ayQ+>Ag+>%*qpIpm3wAx4p*hfCG=gvi8weW(4citQp|p37 zcjQAhC@nV2Xk=C^-GyFVV9sc0ZcVj3wr?J4lGDoA+lKG4cJlbhtZC|4HN4%xL)F;M znT)oeCS>Z(`o4J0lL^5;r%$%EXtQ z_ljI@gGuC!^DQ-@2pI2fn5t+!u8TmS3fNGAw!d7q(z|gDrP_-!sVAecv&s zA2j-)BTadDFtGc8eXQ@=J@5#IZ3wNaM#-E+tGvs3 zV|!h~{?YKTw}JZ@yybmoZd-R?%YF&%Wgtyi6h&wnF-wF?-G9wMLJTy8Zt^nhM#qoY L!G}{$x!?Z*GM<-! literal 0 HcmV?d00001 diff --git a/accounts/migrations/__pycache__/__init__.cpython-311.pyc b/accounts/migrations/__pycache__/__init__.cpython-311.pyc index 33b3d36acd9d85c373fddee4542e441b18614e65..351ad5e5595646126db71563db47754c09fd9ffa 100644 GIT binary patch delta 18 YcmdnOxP_5xIWI340}#CMoXE8b04mJ{wg3PC delta 18 YcmdnOxP_5xIWI340}$|APvlw!047)i&j0`b diff --git a/accounts/models.py b/accounts/models.py index d511048..b4a31e9 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -1,26 +1,87 @@ +from django.contrib.auth.base_user import BaseUserManager from django.db import models +from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin -# Create your models here. -class User(models.Model): - user_id = models.IntegerField(primary_key=True) - nickname = models.CharField(max_length=10, blank=True, null=True) - password = models.CharField(max_length=20, blank=True, null=True) - email = models.CharField(max_length=100, blank=True, null=True) - - class Meta: - managed = False - db_table = 'user' - db_table_comment = '사용자 데이터' - -class Userinfo(models.Model): - user = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True) - height = models.IntegerField(blank=True, null=True) - weight = models.FloatField(blank=True, null=True) - bmi = models.FloatField(blank=True, null=True) - info = models.CharField(max_length=100, blank=True, null=True) - accvisibility = models.IntegerField(db_column='accVisibility', blank=True, null=True) # Field name made lowercase. - - class Meta: - managed = False - db_table = 'userinfo' - db_table_comment = '사용자 정보' \ No newline at end of file + +# class User(models.Model): +# user_id = models.IntegerField(primary_key=True) +# nickname = models.CharField(max_length=10, blank=True, null=True) +# password = models.CharField(max_length=20, blank=True, null=True) +# email = models.CharField(max_length=100, blank=True, null=True) +# +# # USERNAME_FIELD = 'email' +# # REQUIRED_FIELDS = ['username'] +# +# class Meta: +# managed = False +# db_table = 'user' +# db_table_comment = '사용자 데이터' + +# class User(AbstractBaseUser): +# user_id = models.AutoField(primary_key=True) +# nickname = models.CharField(max_length=10, blank=True, null=True) +# password = models.CharField(max_length=20, blank=True, null=True) +# email = models.CharField(max_length=100, blank=True, null=True, unique=True) +# +# USERNAME_FIELD = 'email' +# REQUIRED_FIELDS = ['username'] +# +# class Meta: +# managed = False +# db_table = 'user' +# db_table_comment = '사용자 데이터' + + +class UserManager(BaseUserManager): + def create_user(self, email, nickname, password, **kwargs): + if not email: + raise ValueError('Users must have an email address') + + user = self.model( + email=self.normalize_email(email), + # email=email, + nickname=nickname + ) + user.set_password(password) + user.save(using=self._db) + return user + + def create_superuser(self, email=None, nickname=None, password=None): + superuser = self.create_user( + email=email, + nickname=nickname, + password=password, + ) + superuser.is_staff = True + superuser.is_superuser = True + superuser.is_active = True + superuser.save(using=self._db) + return superuser + +class User(AbstractBaseUser, PermissionsMixin): + objects = UserManager() + + email = models.EmailField(max_length=100, blank=True, null=False, unique=True) + nickname = models.CharField(max_length=20, blank=True, null=False, unique=True) + + is_superuser = models.BooleanField(default=False) + is_active = models.BooleanField(default=True) + is_staff = models.BooleanField(default=False) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + USERNAME_FIELD = 'nickname' + REQUIRED_FIELDS = ['email'] + +# class Userinfo(models.Model): +# user = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True) +# height = models.IntegerField(blank=True, null=True) +# weight = models.FloatField(blank=True, null=True) +# bmi = models.FloatField(blank=True, null=True) +# info = models.CharField(max_length=100, blank=True, null=True) +# accvisibility = models.IntegerField(db_column='accVisibility', blank=True, null=True) # Field name made lowercase. +# +# class Meta: +# managed = False +# db_table = 'userinfo' +# db_table_comment = '사용자 정보' diff --git a/accounts/serializers.py b/accounts/serializers.py index e69de29..b4e7a4c 100644 --- a/accounts/serializers.py +++ b/accounts/serializers.py @@ -0,0 +1,10 @@ +from rest_framework import serializers + +from accounts.models import User + + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = '__all__' + diff --git a/accounts/urls.py b/accounts/urls.py new file mode 100644 index 0000000..cd1cc95 --- /dev/null +++ b/accounts/urls.py @@ -0,0 +1,9 @@ +from django.urls import path, include + +from accounts.views import SigninAPIView + +urlpatterns = [ + # path('', include('dj_rest_auth.urls')), + # path('signin/', include('dj_rest_auth.registration.urls')), + path('signin/', SigninAPIView.as_view()) +] \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index 91ea44a..f9e66ea 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,3 +1,35 @@ -from django.shortcuts import render +from rest_framework import status +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework_simplejwt.serializers import TokenObtainPairSerializer -# Create your views here. +from accounts.serializers import UserSerializer + +#01-01 이메일 회원가입 +#로그인 시 이메일인지 닉네임인지 확인 필요 +class SigninAPIView(APIView): + def post(self, request): + serializer = UserSerializer(data=request.data) + if serializer.is_valid(): + user = serializer.save() + + token = TokenObtainPairSerializer.get_token(user) + refresh_token = str(token) + access_token = str(token.access_token) + res = Response( + { + "user": serializer.data, + "message": "Signin Success", + "token": { + "access": access_token, + "refresh": refresh_token, + }, + }, + status=status.HTTP_200_OK + ) + + res.set_cookie("access", access_token, httponly=True) + res.set_cookie("refresh", refresh_token, httponly=True) + + return res + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/broccoli/__pycache__/settings.cpython-311.pyc b/broccoli/__pycache__/settings.cpython-311.pyc index b6b7875515ab34b19a1becba054c1879126556d9..ab294159e91a243154768df87fee246281333d4c 100644 GIT binary patch delta 973 zcmZ`%TTc@~6rS1cvc1sKaxIsZixSePkRVEUa{~jd^n%?b$h>S;&R7TBB4wN4+3XUk=e`Xrlfc0{IZr0N>qwZvhW@O-zHlfB?Re=IbRIQU6Kc zdK6li7lIJlmuP4QT4^h^F%PtF`w+@ukf4K;cOGIBL)X5T!?X>;w4F=pxROdcpc{I4 zz8iWQ*w?^_iE|?DgedKTej4VoyZP#Y0on_Lv=2lT#fFS~yaC>sHKUj-4OH0aB))@( zJ(gKu!19(6!?w6!SgUDm+i$F_ls1c2WpuH^$}wMcT{xPs!(~>n^yg)xz_v=|b-iL1 zHu7w3%i6w?88tSoRjahlil-sh8@yvjXUMFwnACJ-QHztbmY7zwL?*3IClysCY7B2r z{g1oB#fp}>VpwLWIQn==Q#kwI$VHU*hHIA#W^vPEl?(aO7r}T@v8A{=&K^AEc^AJK zlk5&vqX*GjC+*iTqc{);wjswCg#$K^qf9VmhDje zC3>7FGbF2P%L_z3{U{y?wrh(Jb=wVw#p>NHySO4--r&8>o6pK(738PEmIlG1 z%CDy~GbCC4EJu0+T!N<0W|b6K%4FwlubN0LB#F+YSHH=>?oV-|`X{cu<>wd* ztH4hLQFP?h@^SerGJYNz{~8&uao;?CauyvskB)tfj@3fpT3e*nJ?QwF>SP=^PY?zB UcbgqIYA3iBs^&ZVCEH&Ox!7ytkO delta 397 zcmX|6Jxc>Y5Z&3`t)>99zYcm~htM3G=r~Kt_&8`_SWCX-J zaLAEE+KY}r!CA;dIRwTYb^b*^)7!6KWhb;f?a&BC+nnfVl0++FXh)1P13*XDtgbmS z&?Pf8$hvSCi-07hGtK~7K)E{^0V;AauiXk$w*o23>vu(k6c?%ZOG+(>Bo?WRCGxPW zzw~rgsDf3hVvR(THEN@CSOH6J?3^8}Z#Jy>gAYef;vPmz**>rMV2WtyTrBh4_%e`rqaR$ Ox_08lm(Hu4*G@lVUsQVl diff --git a/broccoli/__pycache__/urls.cpython-311.pyc b/broccoli/__pycache__/urls.cpython-311.pyc index 6a7a49ecc4ef437b7cc852e840e5970d428a83b3..5581181573b016172df20990a2eded7b22632401 100644 GIT binary patch delta 158 zcmeC;=lk0l<|4VMD=nZCWcg&6m}rVn!>S+k%3_~ zR&gdKC+C;ul@#k&@xqvs)0kH?_D&XJ$`5&(y#Tf diff --git a/usebody/__pycache__/apps.cpython-311.pyc b/usebody/__pycache__/apps.cpython-311.pyc index e8f946e4aa71c17aa7402ecfa736a5f4bbf6a5df..c2e398496a262f73b3f8350450b92ee739fb2e76 100644 GIT binary patch delta 20 acmbQsGM9yWIWI340}#CMJiU=yhzS5QQUv7y delta 20 acmbQsGM9yWIWI340}w=9Jg|{lhzS5PTLjVo diff --git a/usebody/__pycache__/models.cpython-311.pyc b/usebody/__pycache__/models.cpython-311.pyc index 8dcfda53d9a6f49a99538e4d0075ff48d42ce481..91745115ea58942f311052fa3cac610b0b0d60d5 100644 GIT binary patch delta 20 acmaFD{)C--IWI340}#CMJiU?oCNls(*9JiV delta 20 acmaFD{)C--IWI340}!ZQIjh8% delta 20 acmdnbwx5lAIWI340}!k>J-CtEgc$%fmIUIK?P<2 diff --git a/usebody/migrations/__pycache__/0001_initial.cpython-311.pyc b/usebody/migrations/__pycache__/0001_initial.cpython-311.pyc index 3b507b26b5364b36c63fdf68257365fb19d67095..5687138be0bd67154b0d3668077be38c7ebe5e47 100644 GIT binary patch delta 19 ZcmbQjF@=L`IWI340}#CM+{nen0st#D1PA~C delta 19 ZcmbQjF@=L`IWI340}%Xj+{nen0st#{1QGxM diff --git a/usebody/migrations/__pycache__/__init__.cpython-311.pyc b/usebody/migrations/__pycache__/__init__.cpython-311.pyc index 3fa9a23b23da4b8c637c8d79fe0b7ddd4b79a066..a8565ddaf701ab21e2c9360c1a25505200c8b694 100644 GIT binary patch delta 19 ZcmdnYxS5fAIWI340}#CMJUx+n1pqNs1%Chl delta 19 ZcmdnYxS5fAIWI340}w=9JTQ@a1pqK{1#AES From 25b8b8fb705844a667c4c230a681eb62fc83361a Mon Sep 17 00:00:00 2001 From: "jieun4510@sju.ac.kr" Date: Wed, 16 Aug 2023 17:25:42 +0900 Subject: [PATCH 2/8] 'FEAT:01-02' --- accounts/__pycache__/backends.cpython-311.pyc | Bin 0 -> 1742 bytes accounts/__pycache__/models.cpython-311.pyc | Bin 2698 -> 2698 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 824 -> 1211 bytes accounts/__pycache__/urls.cpython-311.pyc | Bin 428 -> 538 bytes accounts/__pycache__/views.cpython-311.pyc | Bin 1912 -> 3540 bytes accounts/backends.py | 18 ++++++++ accounts/models.py | 9 ++-- accounts/serializers.py | 8 ++++ accounts/urls.py | 5 +- accounts/views.py | 43 ++++++++++++++++++ broccoli/__pycache__/settings.cpython-311.pyc | Bin 3130 -> 3454 bytes broccoli/settings.py | 23 ++++------ 12 files changed, 87 insertions(+), 19 deletions(-) create mode 100644 accounts/__pycache__/backends.cpython-311.pyc create mode 100644 accounts/backends.py diff --git a/accounts/__pycache__/backends.cpython-311.pyc b/accounts/__pycache__/backends.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc6d551fe2f5d75b67db423b23a8f9e37289b7ef GIT binary patch literal 1742 zcma)6&ube;6rTMl$y!CSR*h>cig2aaf<%!aEp9PABn~~8iWJjB7QwRG*;=w!T4#2J zZB+qNa&SuzDim_{p|~yXU(x;pE3;rR)Tf?$+u{~XPMKMGWyx_vXJ_BMH{Y8#^Jc!8 zpAv~FK+5XZf55Le0RE&#ScFUETp`L!00Cr7pwN~znI@~S4AnW4Yw`*o=)5U3MMVsB z!HhJcN|XUC_!L0#1%MHQKO%D+lYdy07-ZH#G5QxZD@6w1+AtioZ5v2!TF@{_kMtQ; z9%}lQ(Sp=NuN(T7x~VxScEz`$kb4{26%WVr8co@~HtKqe|2q!l##ajY>v6`>H}mL<>!6i;pYCAD zGmr;Jp3EN#*P}iqoLdJwV3&IecF55Z{)m)1fT24dP93!U_9(7Wb zTe*N+Ib*kBJDppou~Bz&A)h+4V;;~l>|D!ohOR{sQR3o=RogUl$Hp8XD;Bmi^!>h6 z_N1~al?O@rG&z5goIhOdC+~X6yFTC&*|XF;?(IAM)Pk2M!c#}| z+T*#KTi&kazp*4G5=q80!E literal 0 HcmV?d00001 diff --git a/accounts/__pycache__/models.cpython-311.pyc b/accounts/__pycache__/models.cpython-311.pyc index 1836ea1a9f1d48fed4567a65a44fb0b29e34dfd6..3874be25bda7991d13bf31327decd958fc8d9ebe 100644 GIT binary patch delta 296 zcmeAY?Goi(&dbZi00a_kcT#q46a~&h2(PUxP6Z|}^A|Dvwgv{jktm2ay z*`k=4QkW;lv8jUTHa5k{C)tE1?_?90{2EB#2GSt@Up4_o=E;2Qia^qUU6;u%WO6)v z02|1P-I$lJ!ucw_Sv<~l}3!^y&|C-}KpMLsaV38~5NS;Z$a zvPCg7r!Y;9V^amwZET8@PqGP3-pM8~`8ANf4WvQ*zia}GOq2Q86@jDyyDn3R+vIrm z05)!*ZADy@x3V8+w4Gebp`q!rqx3|`1)iXbJV94@f*M?J@XL3UUE!BsVYDIS0PBgA z3;e+s`Gc?U2Twl7k;@_9;CDk@ZbIf{XU<2d5{!}`7%+(m`X51}Ul39zyo?GT7%+(o U+|n0hbw7e+zF?6qk^(vw08NNf`Tzg` diff --git a/accounts/__pycache__/serializers.cpython-311.pyc b/accounts/__pycache__/serializers.cpython-311.pyc index 90f2c87aa196f9598cd29cb1738fb364486fda0c..a0b49dc476ec77e1599dcbc5140aed51d397d2f3 100644 GIT binary patch delta 536 zcmdnNwwsf0IWI340}y;^yOVO7aU$OoM!kuPHMv?CqF7Q`f*CYfH(rortWRbFseuAE zAk7TKpYwpkbcPbBFo?=xgmD%i>wpO|)G($nN+R=^P|tQ22jW_$ z8YYl?{BE(P<|bz5+~UZ~OwP_r%uT(;QIJ?%T%KQ)qRCt&0#sTg3L?aS1W$$X2YI5j8j7GGInPG$;FI3*rPCf;HJ$rgjGR!~qV z5(L?Qiw&Z&N;DKG7o1v@3Di=RTBHXN<_4-QwgnOm40rj3dup!pt6$<*zagZsK>Ui3 z<_%Hh1zuM~^BL|+j#_z05tf<+eW F0svGCcLx9f delta 146 zcmdnZxr2>wIWI340}v#vyq$8AVItoYMvaM!HCcigG+8!YlVlX}(_|?EDJbFw5j-G5 zXmTO5BBRaZ$;@V)3{0%jA3((9hs+s_Vw1gC%&nLifkK$Xgy<`x1|LBZU$Dp)2>^`- E0Kq*VPXGV_ diff --git a/accounts/__pycache__/urls.cpython-311.pyc b/accounts/__pycache__/urls.cpython-311.pyc index 4e69a5ce18915eacc71954104e548ba2fc7af53b..66063b90fa4aa2a587e6f9a73bb90ed332331644 100644 GIT binary patch delta 261 zcmZ3(Jc~trIWI340}#~jxt-#`$iVOz#DM`eDC2Y2M0I(gT-GR7Mg}H^RK^r$Ajy)& zHZeqn2h3*ylB^)UY5-FddkSkXgC^TckY-J$TPy{MB^kHaGxL&jN>fsS0=&VQ>3NxX zjsc!wnW^QsxE)JNGN7C)_F}M{eidsXP*mSflVjpm9i}3-iT6^u_<-gCUC2;eG1-?< zNzC*D0~R#7o>5l&1`9`nONaOcA=L@mSAW|*o(nj zeLqe1iGOt_>oF#A@d9-M?PVwqpFE3E$yVb60}A@U#lXth;L;&^K}2(c?-dcviz3=r ZM6@rm=v-mZ`M}P?&(y#Tf<@dwGXR1FG(!LY diff --git a/accounts/__pycache__/views.cpython-311.pyc b/accounts/__pycache__/views.cpython-311.pyc index 409ba8bcf059abecd9287f43d1685b21a041a352..5682d9ed0ea41983da0027904ba552318cd585d1 100644 GIT binary patch literal 3540 zcmcguU1%Fu7QXW%X{`TPQXE&V?dG@YHcA>owqCaNx{m3_Z520m3M&l5L^H8RnbEj+ zMhP(rq|gVkENod8l7&G1u$!%kpB4&v*ym**M`0jhs3EZAVc(P{ed$xr8U2o;Ec9is zuFgI8oO6H9opZi>{~n8l36yWY_)h*8aR0$hw*)%O^M3$yhsZ=`G*ZNt)fk;EvJCQ^ z#_4>K_jq0l=)q#p;{#eq7m9+%2emOhTnu}BNQ>yvV$|aWEvCndagQI<5_+_Lei@&5x%gidtCH{-1g&gBXrK+{5R4lb5 zSqk(IY$%p!Tq!FhXsCGh^x0j;4Vso@RZUO}mlSi$sF-LPT3EU8nX23Xc5=<2nz~gB={|+X)L#*y}AgVFtUT=@N5B!5({}x+g zcLwL_O?e-<2fZHsE7p)inezJW(WwsWq1!V3XEA#g_YrJn&_97hndx87l`GcPKw?ehhPNZ+y=j325D2Mh0 zf6OuDmG)z>_DK6xGPL7pcNO0rduKDeM+k#3hA=Nnmb4vj$HVMuwNz3}bC-34lE=9r zs$8Xtxw*@^d=)~_4e4MYZ76QQ!my?IWhfrY+Ac)+re#5dYd2{MB)K@nQ=my8uArLY zbqH(OZp@CT0j3okYw^s`j-#+M*2M`{a$@(e`;nY@R#L#%k@w8 zv(tC0&dfWF>=`F}rvCB%_-jw5j^Df3oH_O6aK3rubSuD3A8ZjMq0oWx76I}@k{p_L zCUUJ*I2C_JfV@CbUu+#BvE&~Mzc1WHqz=}X_Y)I$!_J}Hx5u3`pV)~)BT;Y?1zRXQ2d_zCmv;qGtVp^dif&jGbwjRd z$VWx-^Qxq^H8cmdyM(?44Sf?yyh|{)OcdSj{aWl~;3Cr^qiK5*9RIUXGqM11|35MF zFkrx|G1HGZ46%Bs=Ev62_$Ut{?jRb!Vg&17agQ6qDZuP6z8=Kc+Rz9<;Q<^gV=j8- zB|F|qbamj%%P8#AmNBoq;@{t`poOr}DK%~Yg?SH!1AxLoKw-SuI;Gs(-(G0QJ4E3g zDt7I$l?6cIvAv<2-$UWi_7Ongk@kSX13UKZtB<@Pzn6f#(SjRLbV=1*VM{X28wQng ztScbCV!+e0u*vP%$Hs^`j!lN25g;#+)cIDJM3Z(TyFYp28@@4l(wRJ2Uw)cC`SZar|9=6)CW7J9 zRQ7M@oFnhsDM0XfCpB+J=RG_s&|l!uoO*)CRw)q^$D4^{k2I>+5Xxjhi!jtgMe W_YDTaWi$q delta 709 zcmZ`#J!lj`6rS0g{foC7lAPJi%A36l+MI=j zr8-3_TP0Z9imk0e3Y|tQEbLaW2v)wC3rZx;&&N04`<=IUazBb*h2a>%wg2UF_MSb9 zriOR%wL>zJ(VP@Cp;U7#w+cJ44YzYvIEiC8%iY3DJj0#bFM=eX#3IWib03q;41Z$#bBLRU6V)Iq5{=0Rplb{T}MYUd5ztf9@q4^_74xb8O1T=_OJFAL`_jpdv>Gdzo~y9CbZgl9D9SOWnP zF^ll%&#tX0=Q^#)(Kt$?<5%KiD#966-8D!HzFop5Fw|A+u($y2gUN&boSOK@Jm~Rl z0j>-ibJUY7jp<8fdZxwm81T34U;gEy%=$TBgn2Yjyy68yZBt6+*T&V(#Si4rsofJ) S|K(_Wy8Odfe*VX9D*pz!mA9J! diff --git a/accounts/backends.py b/accounts/backends.py new file mode 100644 index 0000000..97d7780 --- /dev/null +++ b/accounts/backends.py @@ -0,0 +1,18 @@ +import bcrypt +from django.contrib.auth import get_user_model +from django.contrib.auth.backends import ModelBackend +from django.contrib.auth.hashers import check_password +from django.db.models import Q + + +class EmailBackend(ModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + UserModel = get_user_model() + try: + user = UserModel.objects.get(email=username) + except UserModel.DoesNotExist: + return None + else: + if user.check_password(password): + return user + return None \ No newline at end of file diff --git a/accounts/models.py b/accounts/models.py index b4a31e9..3dcdfc0 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -43,6 +43,7 @@ def create_user(self, email, nickname, password, **kwargs): nickname=nickname ) user.set_password(password) + #print(user.password) user.save(using=self._db) return user @@ -61,8 +62,8 @@ def create_superuser(self, email=None, nickname=None, password=None): class User(AbstractBaseUser, PermissionsMixin): objects = UserManager() - email = models.EmailField(max_length=100, blank=True, null=False, unique=True) - nickname = models.CharField(max_length=20, blank=True, null=False, unique=True) + email = models.EmailField(max_length=100, blank=False, null=False, unique=True) + nickname = models.CharField(max_length=20, blank=False, null=False, unique=True) is_superuser = models.BooleanField(default=False) is_active = models.BooleanField(default=True) @@ -70,8 +71,8 @@ class User(AbstractBaseUser, PermissionsMixin): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) - USERNAME_FIELD = 'nickname' - REQUIRED_FIELDS = ['email'] + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ['nickname'] # class Userinfo(models.Model): # user = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True) diff --git a/accounts/serializers.py b/accounts/serializers.py index b4e7a4c..76f23fc 100644 --- a/accounts/serializers.py +++ b/accounts/serializers.py @@ -8,3 +8,11 @@ class Meta: model = User fields = '__all__' + def create(self, validated_data): + user = User.objects.create_user( + email=validated_data['email'], + nickname=validated_data['nickname'], + password=validated_data['password'] + ) + return user + diff --git a/accounts/urls.py b/accounts/urls.py index cd1cc95..f53cb24 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -1,9 +1,10 @@ from django.urls import path, include -from accounts.views import SigninAPIView +from accounts.views import SigninAPIView, AuthAPIView urlpatterns = [ # path('', include('dj_rest_auth.urls')), # path('signin/', include('dj_rest_auth.registration.urls')), - path('signin/', SigninAPIView.as_view()) + path('signin/', SigninAPIView.as_view()), + path('auth/', AuthAPIView.as_view()), ] \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index f9e66ea..8c91c86 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,9 +1,15 @@ +import jwt +from django.contrib.auth import authenticate +from django.shortcuts import get_object_or_404 from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from rest_framework_simplejwt.serializers import TokenObtainPairSerializer +from accounts.models import User from accounts.serializers import UserSerializer +from my_settings import SECRET_KEY + #01-01 이메일 회원가입 #로그인 시 이메일인지 닉네임인지 확인 필요 @@ -13,6 +19,7 @@ def post(self, request): if serializer.is_valid(): user = serializer.save() + #JWT 토큰 token = TokenObtainPairSerializer.get_token(user) refresh_token = str(token) access_token = str(token.access_token) @@ -33,3 +40,39 @@ def post(self, request): return res return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + +class AuthAPIView(APIView): + #01-02 이메일 로그인 + def post(self, request): + # user 인증 + print(request.data) + + user = authenticate( + username=request.data.get("email"), password=request.data.get("password") + ) + + # 회원가입한 user일 경우 + if user is not None: + serializer = UserSerializer(user) + # JWT 토큰 + token = TokenObtainPairSerializer.get_token(user) + refresh_token = str(token) + access_token = str(token.access_token) + res = Response( + { + "user": serializer.data, + "message": "Login Success", + "token": { + "access": access_token, + "refresh": refresh_token + }, + }, + status=status.HTTP_200_OK + ) + # JWT 토큰을 Cookie에 저장 + res.set_cookie("access", access_token, httponly=True) + res.set_cookie("refresh", refresh_token, httponly=True) + return res + else: + return Response(status=status.HTTP_400_BAD_REQUEST) + diff --git a/broccoli/__pycache__/settings.cpython-311.pyc b/broccoli/__pycache__/settings.cpython-311.pyc index ab294159e91a243154768df87fee246281333d4c..1f84904a5680f8eef7630fbdaba7e5a36465e23d 100644 GIT binary patch delta 648 zcmdlb@lT3-IWI340}w1|yfcwonlWag`o#Ja_7skErYOF2h7`_4j8XhRnhQt^0BLR@ zEttZS!kft$CB(##%9O&lhJP6&1H)<{h5)drz#2hR(G;Ont`y-EkvXhU!YQIrA}M02 zoGIc}+zbrqj47-s51hg5=&*x5{DTZC7vRaA`4U?lOhKu z<-w#vCSy8FlthYRlw^uhlvE09lr#{_q$o$prl>^8rLY7uXsT|mV2ov~uaZklPR=jQ zD=F4XN=(j9%}XiPbInc6%yEM7sx(uw67$mY^^)`RN{TX*^b$);G7w6A^HWk`N;R3Q z%&;lWNG#4sEh^S?axSVYC<*p(G%_^{NGvWc&o4@;_W(;)8Q{|x;N&D&2)i5`~w$@ s2-61!7;%9?-~*4C5Ksh0H1K^e;NSxaz=#H}4`Q2*xtSSREP;js04B}4jsO4v delta 301 zcmew-wM&9~IWI340}vdUb9*AUG^5W%^@;WA3@Pl37^C=rGzXC8PvK1A%4CcZU}8vR zO5t9^vy72}VKop#09cfF4Iip#3V$kBia?6s9M&ko6rm`g6ya3P6p<=!28MLT6xI|` zpxI)J7&94D#OJW2Ge!xgNJNRGvSx__&2$8t8zq_|nIZ*LAekZ!CS|~+Y$jtmOO#lO zT$Ff Date: Thu, 17 Aug 2023 00:42:45 +0900 Subject: [PATCH 3/8] 'FEAT:01-03' --- accounts/__pycache__/backends.cpython-311.pyc | Bin 1742 -> 1286 bytes accounts/__pycache__/views.cpython-311.pyc | Bin 3540 -> 5967 bytes accounts/views.py | 47 ++++++++++++++++-- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/accounts/__pycache__/backends.cpython-311.pyc b/accounts/__pycache__/backends.cpython-311.pyc index bc6d551fe2f5d75b67db423b23a8f9e37289b7ef..af23a879d55f06267ac5908d92e7309fae639d35 100644 GIT binary patch delta 412 zcmX@d+s4JWoR^o20SHRl@1!I!ZRBHRc+Q z>Q+S;c1xPpYN&EMKI4!ZiYC+>`qY{Ys040v7;HS)R?50Y4T&v9ACkLjwQhcg2mCjz zJ_aK`W%Fr=PxlsFA8j7^65SDsSe#^|f`bYcD&WvaKQF#0_KLqkfaWYNZ6nb^qJ_kX zcEpK?oY=3}+=|1k*hq4aWFcw5M30!%A(QG~x0#&7 mPEs)azOaVBqghjKswwlKU%nQBxWZX7)_!=mKmQ?3ik$$;A;5M3 diff --git a/accounts/__pycache__/views.cpython-311.pyc b/accounts/__pycache__/views.cpython-311.pyc index 5682d9ed0ea41983da0027904ba552318cd585d1..d07a4c675a19ec9dbb0c166b4b7627a70602ed3b 100644 GIT binary patch literal 5967 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 delta 801 zcmZ{h&ubGw6vyY~$C_@M?IulPYitvLHO5M6K+uDT4fqq0O2k7hv1G?&>t+*XHk9Vl z2!a<6hQU8T6ea4(;8i?`S3P);C4WQ&Paed1yILvKxBEW(=FNM<`_6tYe$8kvV=+I zav+7_ehD|m=v_v6v*xt#QJXCaH?#rqXBWc&Lvcx2$`oYPkgyZjaU7xjg)SZ{CB@s& z#Cv64JcW$-rOb~WX={P))3U4=yWVb?cCON`*D2>Lj;%>V7~xII<}ma}bi*BH+78n( zg<{=cgF61;Q)qPoA?4ylzW3MOR^Qjzk4a+5^+*G$E)h^Jd;p1d;un8 zZ~BK|Ya!(ZH#QvssaM`}(OD{`Z)ts19} zW7-YQre(4Jue`x_5BoE6PM+Dd=y_I_bs(MRBqu=t_(s&e+7~P7nttsI+4YL&=`)~; Yak^AKdk9d`-h7<@?(O{e&%USlH(ZUb)Bpeg diff --git a/accounts/views.py b/accounts/views.py index 8c91c86..7e2ed78 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -4,22 +4,21 @@ from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView -from rest_framework_simplejwt.serializers import TokenObtainPairSerializer +from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer from accounts.models import User from accounts.serializers import UserSerializer from my_settings import SECRET_KEY -#01-01 이메일 회원가입 -#로그인 시 이메일인지 닉네임인지 확인 필요 +# 01-01 이메일 회원가입 class SigninAPIView(APIView): def post(self, request): serializer = UserSerializer(data=request.data) if serializer.is_valid(): user = serializer.save() - #JWT 토큰 + # JWT 토큰 token = TokenObtainPairSerializer.get_token(user) refresh_token = str(token) access_token = str(token.access_token) @@ -41,8 +40,38 @@ def post(self, request): return res return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + class AuthAPIView(APIView): - #01-02 이메일 로그인 + # 01 token에 따른 user 정보 가져오기 + def get(self, request): + try: + access = request.COOKIES.get('access') + payload = jwt.decode(access, SECRET_KEY, algorithms=['HS256']) + pk = payload.get('user_id') + user = get_object_or_404(User, pk=pk) + serializer = UserSerializer(instance=user) + return Response(serializer.data, status=status.HTTP_200_OK) + # token이 만료되었을 때 + except(jwt.ExpiredSignatureError): + data = {'refresh': request.COOKIES('refresh', None)} + serializer = TokenRefreshSerializer(data=data) + if serializer.is_valid(raise_exception=True): + access = serializer.data.get('access', None) + refresh = serializer.data.get('refresh', None) + payload = jwt.decode(access, SECRET_KEY, algorithms=['HS256']) + pk = payload.get('user_id') + user = get_object_or_404(User, pk=pk) + serializer = UserSerializer(instance=user) + res = Response(serializer.data, status=status.HTTP_200_OK) + res.set_cookie('access', access) + res.set_cookie('refresh', refresh) + return res + raise jwt.exceptions.InvalidTokenError + # 사용 불가능한 토큰일 때 + except(jwt.exceptions.InvalidTokenError): + return Response(status=status.HTTP_400_BAD_REQUEST) + + # 01-02 이메일 로그인 def post(self, request): # user 인증 print(request.data) @@ -76,3 +105,11 @@ def post(self, request): else: return Response(status=status.HTTP_400_BAD_REQUEST) + # 01-03 이메일 로그아웃 + def delete(self, request): + response = Response({ + "message": "Logout Success" + }, status=status.HTTP_200_OK) + response.delete_cookie("access") + response.delete_cookie("refresh") + return response From 15881c369dfbf50b8f9ac051796a32fd7d5ee916 Mon Sep 17 00:00:00 2001 From: "jieun4510@sju.ac.kr" Date: Tue, 22 Aug 2023 11:40:25 +0900 Subject: [PATCH 4/8] 'checkout' --- accounts/__pycache__/models.cpython-311.pyc | Bin 2698 -> 2698 bytes accounts/__pycache__/views.cpython-311.pyc | Bin 5967 -> 5967 bytes accounts/models.py | 16 ---------------- broccoli/__pycache__/settings.cpython-311.pyc | Bin 3454 -> 3456 bytes broccoli/settings.py | 1 + 5 files changed, 1 insertion(+), 16 deletions(-) diff --git a/accounts/__pycache__/models.cpython-311.pyc b/accounts/__pycache__/models.cpython-311.pyc index 3874be25bda7991d13bf31327decd958fc8d9ebe..58f4fbebf564a0507bc32372e558194764d48918 100644 GIT binary patch delta 156 zcmeAY?Goi(&dbZi00fK@_fzUN^2RW0-w>7kz{(&X^^t*Dfa?p0=wSK4!NAFTokQ{x zhvW>6iyX>VIFv7NDBsvTg}IKA(O|ML>j{1?R*?@3a6)48dsgwyjBM3Rj5eEVIaV-g Zi8D%mV8A3M=zj!>enChXP4?%q1^{tDD5C%X delta 156 zcmeAY?Goi(&dbZi00a_kcT#q4>LUY-0M{1~(ZTY8i-D8(I)~&X z4#^oB7de!#a428kP=2s^3UeJJqtRqx))V|ZtRf#6;DpTN_pIWZ8QH3t80|LKa;#v~ Zl4O+pz<^0i(EkV${eqA(o9xeJ4FKrsDVP8N diff --git a/accounts/__pycache__/views.cpython-311.pyc b/accounts/__pycache__/views.cpython-311.pyc index d07a4c675a19ec9dbb0c166b4b7627a70602ed3b..4213e8b257e719278aca4d09a324765cccb4f053 100644 GIT binary patch delta 115 zcmX@FcV3ToIWI340}uqhy_2$VBX2ejqu%C99wSyp@6BrjLzx(JCo_p`WMtXAMI?&J Z(VdY|;sXPAa)SCtu*?@6@q Z=*Gw>@qqz5IYIp+Smp~3`63;lEdc9J8`J;* diff --git a/accounts/models.py b/accounts/models.py index 3dcdfc0..f3affa9 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -17,20 +17,6 @@ # db_table = 'user' # db_table_comment = '사용자 데이터' -# class User(AbstractBaseUser): -# user_id = models.AutoField(primary_key=True) -# nickname = models.CharField(max_length=10, blank=True, null=True) -# password = models.CharField(max_length=20, blank=True, null=True) -# email = models.CharField(max_length=100, blank=True, null=True, unique=True) -# -# USERNAME_FIELD = 'email' -# REQUIRED_FIELDS = ['username'] -# -# class Meta: -# managed = False -# db_table = 'user' -# db_table_comment = '사용자 데이터' - class UserManager(BaseUserManager): def create_user(self, email, nickname, password, **kwargs): @@ -39,11 +25,9 @@ def create_user(self, email, nickname, password, **kwargs): user = self.model( email=self.normalize_email(email), - # email=email, nickname=nickname ) user.set_password(password) - #print(user.password) user.save(using=self._db) return user diff --git a/broccoli/__pycache__/settings.cpython-311.pyc b/broccoli/__pycache__/settings.cpython-311.pyc index 1f84904a5680f8eef7630fbdaba7e5a36465e23d..c8da7822445d6414dd987228b137206a52e38fbe 100644 GIT binary patch delta 39 ucmew-)gaBgoR^o20SM$o@25Q9$h(-E@%ZG8+)b<>*cez Date: Mon, 28 Aug 2023 14:29:01 +0900 Subject: [PATCH 5/8] 'FEAT:08' --- accounts/__pycache__/__init__.cpython-311.pyc | Bin 169 -> 169 bytes accounts/__pycache__/admin.cpython-311.pyc | Bin 224 -> 224 bytes accounts/__pycache__/apps.cpython-311.pyc | Bin 544 -> 544 bytes accounts/__pycache__/backends.cpython-311.pyc | Bin 1286 -> 1286 bytes accounts/__pycache__/models.cpython-311.pyc | Bin 2698 -> 3567 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 1211 -> 1714 bytes accounts/__pycache__/urls.cpython-311.pyc | Bin 538 -> 652 bytes accounts/__pycache__/utils.cpython-311.pyc | Bin 0 -> 1775 bytes accounts/__pycache__/views.cpython-311.pyc | Bin 5967 -> 8422 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 2320 -> 2320 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 180 -> 180 bytes accounts/models.py | 11 ++++ accounts/serializers.py | 7 ++- accounts/urls.py | 3 +- accounts/utils.py | 25 +++++++++ accounts/views.py | 52 +++++++++++++++++- broccoli/__pycache__/settings.cpython-311.pyc | Bin 3456 -> 3456 bytes broccoli/__pycache__/urls.cpython-311.pyc | Bin 1257 -> 1257 bytes broccoli/settings.py | 2 +- usebody/__pycache__/__init__.cpython-311.pyc | Bin 168 -> 168 bytes usebody/__pycache__/admin.cpython-311.pyc | Bin 223 -> 223 bytes usebody/__pycache__/apps.cpython-311.pyc | Bin 541 -> 541 bytes usebody/__pycache__/models.cpython-311.pyc | Bin 996 -> 996 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 831 -> 831 bytes usebody/__pycache__/urls.cpython-311.pyc | Bin 552 -> 552 bytes usebody/__pycache__/views.cpython-311.pyc | Bin 1909 -> 1909 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 1044 -> 1044 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 179 -> 179 bytes 28 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 accounts/__pycache__/utils.cpython-311.pyc create mode 100644 accounts/utils.py diff --git a/accounts/__pycache__/__init__.cpython-311.pyc b/accounts/__pycache__/__init__.cpython-311.pyc index 3c2bb83a73fe29d6bd615d0ebfac7ff0a9fa6968..311627176055edc061ec827803f94e34df9f59d3 100644 GIT binary patch delta 19 ZcmZ3#fduvd delta 20 acmZqUYUAQw&dbZi00gD&cQ$hWW&r>(I0cFT diff --git a/accounts/__pycache__/models.cpython-311.pyc b/accounts/__pycache__/models.cpython-311.pyc index 58f4fbebf564a0507bc32372e558194764d48918..bcfc80187ff74275af7bf9c48e51eb99ba26dc1d 100644 GIT binary patch delta 975 zcmaJ;&ubGw6rS1aCOexp3D(xuDzvp$LM5K`&?=hN#vi3AQmJ$!gsn4%Xqw10Dmh4U z@DN1AvVtHUda8&$RC4H_V8MV51POESA|5>1(w@BNn`~1xExzS_JM-TA-g|uWr2R*? z?@eo~fxvvL-{>#zg0B-lTR4$8sh~@U>W>j6%yoyz0%=Pwgx-NWW*XF(LP78Q7q1lD zQ99-NigBOarj>Ae>4WwWP`+( zysRu?7zpl|snsjojXU#D7clh3eOYZoq{o{!1|G1aG4utl(~1p{1^j2b9s5 z6j%=2F|(BtP{R=JNG6raJiH#n!h4S==PaI!-_5g}&~Mihj0Y9b!dc47G8#`?b4-v- zI!;-NW#Q-)CDREWg2w;I)(~Q=12TVPqu6v&#Z;*a=Bq!w&iv2>%UTiPcKYR`L5=qU zjrU171|U3hR@zE1Ds(y<&swu7#`|URu!K%op~@b71di9h=Vh$0`_&E{Dtc;d-9=q~ z4l4o`(V(ws5?2xEFG%=)HWNv*6ctL63L}!?ESX4;vm74)p74x@r$)mU$M`w8@e2}8 zOE@Dzc5Yga56hT@aq#)q0Do;qx{4iD(zQs}$zX+?9jubU!br{EQ+!bM_beV%#Rrv4JKQ% zZe~>8{Fe1JBctZzo$N0eZ6+_~xW??K$vL@&CuQ;%9w{yxkV!yXykxQjuPc)Sa5zF-s&Ar%+r(;WC9k z;1UWN8imS#pio>k3XO;mS)o#yH!H*uZ{~e@Gw+)>-+LEzXR-KEELKmX-Jjptv$Py< zFRsYb0kMe8nRlIYNtcZ(PE6>3~vEVf`sW_09kxtd8uA6&25Hu*gxW z-#AmS9rwGra9XPL&+p!&RKui!N ZEj`x7K+5|K`&-v-!!MY4`y;D*`2aqXkBa~R delta 366 zcmdnQyPK15IWI340}y;^yOVO7aU!2YnhTIOogsxGg)xUAmobWw5yWQ7VajEWVrFDu zVsK|jVQyhaVM%4oVgcy{fo04L46A_{0-{(`Sc4ff*G2{F-1Xy*yO8B?u>$yWtlV0KnnacS&Kjp zE#d|dJRm{{M96>$eh>jRMi9he0~3??Fh}r!1wnj2O}5D^Shdq`@%!edq~-*}T?A2$ zYQirLo80`A(wtPgA_bscMj$Ru01_XV85tRGFsNNXMGqJhE}){xo@{!24BU(&A3y}y FX#my!ON9Uc diff --git a/accounts/__pycache__/urls.cpython-311.pyc b/accounts/__pycache__/urls.cpython-311.pyc index 66063b90fa4aa2a587e6f9a73bb90ed332331644..8e066840a6b0cdab76223b98d1dfafa2cf627b84 100644 GIT binary patch delta 268 zcmbQm(!;90oR^o20SI2rdzw?s=NA&;z delta 218 zcmeBSoyDTQoR^o20SM~%+)i;|WMFs<;=lkKl<~Q1qPj94BLfpdDq{*WkYveXn;4_d z$To40Y5-FddkSkXgC^TckZMh)TPy{MB^kHaGxL&jN>fsS0=&VQ>3NxXjsc!wnW^Qs zxE)JNGN7C)_F}M{eidsXP*mSflVh?cqv7Ow#w0F2pm9JKF%(x!e$A*PW_p1E3!1FS TWFhc@la-&Tfg1#icz`+p;2}3E diff --git a/accounts/__pycache__/utils.cpython-311.pyc b/accounts/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b536f2cd915d2b93b404b74a42904b1dac7ea6bb GIT binary patch literal 1775 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 diff --git a/accounts/models.py b/accounts/models.py index f3affa9..b4d8c7a 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -70,3 +70,14 @@ class User(AbstractBaseUser, PermissionsMixin): # managed = False # db_table = 'userinfo' # db_table_comment = '사용자 정보' + + +class Follow(models.Model): + id = models.AutoField(primary_key=True) + follower = models.ForeignKey(User, related_name='follower', on_delete=models.CASCADE) + following = models.ForeignKey(User, related_name='following', on_delete=models.CASCADE) + created_at = models.DateTimeField(auto_now_add=True) + + class Meta: + managed = False + db_table = 'follow' diff --git a/accounts/serializers.py b/accounts/serializers.py index 76f23fc..5b543e1 100644 --- a/accounts/serializers.py +++ b/accounts/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from accounts.models import User +from accounts.models import User, Follow class UserSerializer(serializers.ModelSerializer): @@ -16,3 +16,8 @@ def create(self, validated_data): ) return user + +class FollowSerializer(serializers.ModelSerializer): + class Meta: + model = Follow + fields = '__all__' diff --git a/accounts/urls.py b/accounts/urls.py index f53cb24..f4596b7 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -1,10 +1,11 @@ from django.urls import path, include -from accounts.views import SigninAPIView, AuthAPIView +from accounts.views import SigninAPIView, AuthAPIView, FollowAPIView urlpatterns = [ # path('', include('dj_rest_auth.urls')), # path('signin/', include('dj_rest_auth.registration.urls')), path('signin/', SigninAPIView.as_view()), path('auth/', AuthAPIView.as_view()), + path('follow/', FollowAPIView.as_view()), ] \ No newline at end of file diff --git a/accounts/utils.py b/accounts/utils.py new file mode 100644 index 0000000..a216da4 --- /dev/null +++ b/accounts/utils.py @@ -0,0 +1,25 @@ +import jwt +import json + +from django.http import JsonResponse +from rest_framework import status +from rest_framework.response import Response + +from accounts.models import User +from my_settings import SECRET_KEY + + +def login_check(func): + def wrapper(self, request, *args, **kwargs): + try: + access = request.COOKIES.get('access') + # access_token = request.headers.get('Authorization', None) + payload = jwt.decode(access, SECRET_KEY, algorithms='HS256') + user = User.objects.get(id=payload['user_id']) + request.user = user + except jwt.exceptions.DecodeError: + return Response({'message': 'INVALID TOKEN'}, status=status.HTTP_400_BAD_REQUEST) + except User.DoesNotExist: + return Response({'message': 'INVALID USER'}, status=status.HTTP_400_BAD_REQUEST) + return func(self, request, *args, **kwargs) + return wrapper diff --git a/accounts/views.py b/accounts/views.py index 7e2ed78..4f00f78 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,13 +1,17 @@ import jwt from django.contrib.auth import authenticate +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import get_object_or_404 from rest_framework import status +from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.response import Response from rest_framework.views import APIView from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer -from accounts.models import User -from accounts.serializers import UserSerializer +from accounts.models import User, Follow +from accounts.serializers import UserSerializer, FollowSerializer +from accounts.utils import login_check from my_settings import SECRET_KEY @@ -113,3 +117,47 @@ def delete(self, request): response.delete_cookie("access") response.delete_cookie("refresh") return response + + +class FollowAPIView(APIView): + # API 08-01 팔로잉 조회 + @login_check + def get(self, request): + user_id = request.user.id + following = Follow.objects.filter(follower_id=user_id) + serializer = FollowSerializer(following, many=True) + return Response(serializer.data) + + # API 08-02, 08-03 팔로우, 언팔로우 + @login_check + def post(self, request): + print(request.user) + following_id = request.data.get('following_id') + print(following_id) + user_following = get_object_or_404(User, id=following_id) + + print(user_following) + + if user_following == request.user: + return Response({'message': "Can't Follow Self"}, status=status.HTTP_400_BAD_REQUEST) + + is_following = Follow.objects.filter(follower=request.user, following=user_following).exists() + + if is_following: + # 팔로잉 중인 상태: unfollow + follow = Follow.objects.get(follower=request.user, following=user_following) + follow.delete() + message = 'Unfollowed Successfully' + else: + # 팔로잉 되어 있지 않은 상태: follow + Follow.objects.create(follower=request.user, following=user_following) + message = 'Followed Successfully' + + return Response({'messages': message}, status=status.HTTP_200_OK) + + + + + + + diff --git a/broccoli/__pycache__/settings.cpython-311.pyc b/broccoli/__pycache__/settings.cpython-311.pyc index c8da7822445d6414dd987228b137206a52e38fbe..63ff606e4deb72c451ad3885b315d71845f0f299 100644 GIT binary patch delta 22 ccmZpWZjk0(&dbZi00h&e-lV+P$Xm<{06xD4HUIzs delta 22 ccmZpWZjk0(&dbZi00eTP_fwv4jh8% diff --git a/usebody/__pycache__/urls.cpython-311.pyc b/usebody/__pycache__/urls.cpython-311.pyc index 49c6604978626b491cda17c269da3d4399207953..d50dafe752178d2c27d86677c1005379dea56b64 100644 GIT binary patch delta 20 acmZ3%vVw(sIWI340}$9LJ=w@D%LD)~_XJJ= delta 20 acmZ3%vVw(sIWI340}#CMJiU=ymI(kg3IzrL diff --git a/usebody/__pycache__/views.cpython-311.pyc b/usebody/__pycache__/views.cpython-311.pyc index fe0fa3e9ca16deef79b51cecde236e596c7fb458..394c57402cbfce402182b07d846ff1ba9857a688 100644 GIT binary patch delta 20 acmey$_mz)(IWI340}$9LJ=w^e#SQ>HYz0mL delta 20 acmey$_mz)(IWI340}#CMJiU=SiyZ($e+C8s diff --git a/usebody/migrations/__pycache__/0001_initial.cpython-311.pyc b/usebody/migrations/__pycache__/0001_initial.cpython-311.pyc index 5687138be0bd67154b0d3668077be38c7ebe5e47..ee3a9834e207eb1c14166e201dd023b98a931fd8 100644 GIT binary patch delta 20 acmbQjF@=MBIWI340}$9LJ=w_3$pQc^X#^Yq delta 20 acmbQjF@=MBIWI340}#CMJiU>dlLY`Wd<4`0 diff --git a/usebody/migrations/__pycache__/__init__.cpython-311.pyc b/usebody/migrations/__pycache__/__init__.cpython-311.pyc index a8565ddaf701ab21e2c9360c1a25505200c8b694..9a43af183ad084fa7303d6029128e2e11a741a7c 100644 GIT binary patch delta 19 ZcmdnYxS5fAIWI340}$9LJ( Date: Tue, 29 Aug 2023 17:26:10 +0900 Subject: [PATCH 6/8] 'FEAT:02-01' --- accounts/__pycache__/models.cpython-311.pyc | Bin 3567 -> 4521 bytes .../__pycache__/serializers.cpython-311.pyc | Bin 1714 -> 2173 bytes accounts/__pycache__/urls.cpython-311.pyc | Bin 652 -> 766 bytes accounts/__pycache__/views.cpython-311.pyc | Bin 8422 -> 9575 bytes accounts/models.py | 16 ++++- accounts/serializers.py | 8 ++- accounts/urls.py | 3 +- accounts/views.py | 63 +++++++++++++----- 8 files changed, 68 insertions(+), 22 deletions(-) diff --git a/accounts/__pycache__/models.cpython-311.pyc b/accounts/__pycache__/models.cpython-311.pyc index bcfc80187ff74275af7bf9c48e51eb99ba26dc1d..4f708ac9df4832243fd919260c1929c8536c70d1 100644 GIT binary patch delta 1055 zcmZuuO-vI(6yDty+Rk)}KWRV;_(QFfs0U1o1Wlwsi5MGd3q}$og&ko{Y2$RokeIXw z4n3%mY+}4zOBO+2=7O`1J>@nD36gNYaCZ7JHyOyh>z%Gw zgdl;B(I-FTZ)C;QBEDNW^Z2YJj0iGX7Gz874ZbR463fn*;3scBezi+> zQCo4eW@!W0H&zw0xGB};*d&1~?E4CfY}vG~O5B&P%9wPR8nY~5w~7q=c!n}1btlc5xx_CSj&y2Trb((& z!^vnep;CD|l~|y0zr_4p!n!$pe+FU;>jI*}Y8xo%Ayv2Y*QuHa8}|Eq?vZuv7wXGi z;rbhVWm-7o_GkG>bKX`y+Mc(=WUV~NhB-w1huKLuoC4?suyQa^IL)Xsm%2umm=6fs z;6Q9}U})HE!f;+qsdSFAutJlv(Kyeg^D0kDX446Ek9<%eEi(%Wy8sqecm%_hn4O(o zR5Hqpl2p_svkK;gi_M~-Y}Q|eQNGE1;_y!=xGf*laoh9w+QjDV&%Pp#mT*+Z(cDm( zoXF-UbaJAgZh4EOw?uk%(whsHNe9p!h4_}WNCG7i&`E&P$dmW!$W!pH#fzw?gnD$; zlN&5!4_x3WWVXB?;zb-P;gF6)+}_>wbV7G`mE7IByE_-zwn_~h+d>VTHqSdi?$$=k zK&8k2w~LM@5wXkA<|Pi=OLXfv3&FAOCE$*;U_65JT!7k!=YRk@h;+VGMY)4a^5&6pe)>_Dma~F}w`}-gAi;o`e O0KfY;*s8rJeSZL9sPx(Z delta 180 zcmZ3f{9c-GIWI340}$|Sf12{2dm^6%W8XyeUbYmjUIFEKau7H585d`fCgYDwzkAihXO&B<}xmaI-dQvxT?;g;l+?%)8yA}OFqk=x{t ze43N*a!ZTag18PK!W2Z9fe5$B9y~IP-jieaSFu|I1^hI*C-VvvPHq;E*1+?-BG&`V6#IrwP?uJJ*Ck)vXzvpY*Ue$-Om=%g3`O%ADXr!E+M}+s`O8RacwF{i z*hQ!y3?Ymo^dsnGgQ!_uD5;VS8{v)b?`wJIVwIToj delta 508 zcmew>u!)y|}a=ZkYt;u+cyEwHdGchN# zDz&Islj#;qD3E`P%`HDCC%=5-ZxcpVPM|vW$tFySY=S^mk?`bbrZwE6Af_0I5T7i> z?9M1OIf_|{k$ZA2vzrx2nV%+W5jRMh2So6K2w@N*3nBzS1lTYk5Q`l~uucBU90IY0 zee!))kIC~{qGds0;HSxkZW=2{6W`={Y_hD1K&I$qOIAfYhy%eISkN_qtw*z29%KlJ z5CP)i$un3TdB8@1g#0u)ChM{rOip4KiU+$8tQggRUmP~M`6;D2sdh!GKrM`5Q-H(= gW=2NF8w_d}P|*VhjSJY&D;kz-;Hh=|c-X9Ehd0|ob}DzZdzrmzPyXmY#+nV`vZi=`m3B;yu)W?phmX-cXl z%VZ`-ZLVAVp~b01nR#jXlhqg%xT;t|OnpC1uF0N^W=usKlWQ1Lxdea)0Nuq zBm2Y&AmW26Cvy}>3R^IPCi`SLMsY^w$!3h&lZzN7nf)|5Cr@QGn|y&WiHjd-8qfxY i;+d0en3QB(E->IklN*?V1wL@I@iR4WgJ2OaP#*x&!YAwi diff --git a/accounts/__pycache__/views.cpython-311.pyc b/accounts/__pycache__/views.cpython-311.pyc index 80f0c54a125bbd78351077d19b1716116003cb34..0064f72650eb579ed9d7c669565b1ff673188537 100644 GIT binary patch delta 3862 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 WOX3*8tlAw{Pru-jFTX<0{qR4=^u9;{ diff --git a/accounts/models.py b/accounts/models.py index b4d8c7a..ab3eaf5 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -59,18 +59,30 @@ class User(AbstractBaseUser, PermissionsMixin): REQUIRED_FIELDS = ['nickname'] # class Userinfo(models.Model): -# user = models.ForeignKey(User, models.DO_NOTHING, blank=True, null=True) +# user = models.ForeignKey(User, related_name='user', on_delete=models.CASCADE, null=False) # height = models.IntegerField(blank=True, null=True) # weight = models.FloatField(blank=True, null=True) # bmi = models.FloatField(blank=True, null=True) # info = models.CharField(max_length=100, blank=True, null=True) -# accvisibility = models.IntegerField(db_column='accVisibility', blank=True, null=True) # Field name made lowercase. +# acc_visibility = models.IntegerField(db_column='accVisibility', blank=True, null=True) # Field name made lowercase. # # class Meta: # managed = False # db_table = 'userinfo' # db_table_comment = '사용자 정보' +class Userinfo(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user") + height = models.IntegerField(blank=True, null=True) + weight = models.FloatField(blank=True, null=True) + bmi = models.FloatField(blank=True, null=True) + info = models.CharField(max_length=150, blank=True, null=True) + acc_visibility = models.IntegerField() + + class Meta: + managed = False + db_table = 'userinfo' + class Follow(models.Model): id = models.AutoField(primary_key=True) diff --git a/accounts/serializers.py b/accounts/serializers.py index 5b543e1..e1c012b 100644 --- a/accounts/serializers.py +++ b/accounts/serializers.py @@ -1,6 +1,7 @@ +import requests from rest_framework import serializers -from accounts.models import User, Follow +from accounts.models import User, Follow, Userinfo class UserSerializer(serializers.ModelSerializer): @@ -21,3 +22,8 @@ class FollowSerializer(serializers.ModelSerializer): class Meta: model = Follow fields = '__all__' + +class UserinfoSerializer(serializers.ModelSerializer): + class Meta: + model = Userinfo + fields = '__all__' diff --git a/accounts/urls.py b/accounts/urls.py index f4596b7..0492553 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -1,6 +1,6 @@ from django.urls import path, include -from accounts.views import SigninAPIView, AuthAPIView, FollowAPIView +from accounts.views import SigninAPIView, AuthAPIView, FollowAPIView, UserinfoAPIView urlpatterns = [ # path('', include('dj_rest_auth.urls')), @@ -8,4 +8,5 @@ path('signin/', SigninAPIView.as_view()), path('auth/', AuthAPIView.as_view()), path('follow/', FollowAPIView.as_view()), + path('info/', UserinfoAPIView.as_view()), ] \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index 4f00f78..089b07d 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,16 +1,13 @@ import jwt from django.contrib.auth import authenticate -from django.contrib.auth.decorators import login_required -from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import get_object_or_404 from rest_framework import status -from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.response import Response from rest_framework.views import APIView from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer -from accounts.models import User, Follow -from accounts.serializers import UserSerializer, FollowSerializer +from accounts.models import User, Follow, Userinfo +from accounts.serializers import UserSerializer, FollowSerializer, UserinfoSerializer from accounts.utils import login_check from my_settings import SECRET_KEY @@ -56,19 +53,34 @@ def get(self, request): serializer = UserSerializer(instance=user) return Response(serializer.data, status=status.HTTP_200_OK) # token이 만료되었을 때 - except(jwt.ExpiredSignatureError): - data = {'refresh': request.COOKIES('refresh', None)} - serializer = TokenRefreshSerializer(data=data) + # except(jwt.exceptions.ExpiredSignatureError): + # data = {'refresh': request.COOKIES.get('refresh', None)} + # serializer = TokenRefreshSerializer(data=data) + # if serializer.is_valid(raise_exception=True): + # access = serializer.data.get('access', None) + # refresh = serializer.data.get('refresh', None) + # payload = jwt.decode(access, SECRET_KEY, algorithms=['HS256']) + # pk = payload.get('user_id') + # user = get_object_or_404(User, pk=pk) + # serializer = UserSerializer(instance=user) + # res = Response(serializer.data, status=status.HTTP_200_OK) + # res.set_cookie('access', access) + # res.set_cookie('refresh', refresh) + # return res + # raise jwt.exceptions.InvalidTokenError + except(jwt.exceptions.ExpiredSignatureError): + data = {'refresh': request.COOKIES.get('refresh', None)} + serializer = TokenObtainPairSerializer(data=data) if serializer.is_valid(raise_exception=True): - access = serializer.data.get('access', None) - refresh = serializer.data.get('refresh', None) + access = serializer.data.get('access_token', None) + refresh = serializer.data.get('refresh_token', None) payload = jwt.decode(access, SECRET_KEY, algorithms=['HS256']) pk = payload.get('user_id') user = get_object_or_404(User, pk=pk) serializer = UserSerializer(instance=user) res = Response(serializer.data, status=status.HTTP_200_OK) - res.set_cookie('access', access) - res.set_cookie('refresh', refresh) + res.set_cookie('access_token', access) + res.set_cookie('refresh_token', refresh) return res raise jwt.exceptions.InvalidTokenError # 사용 불가능한 토큰일 때 @@ -131,13 +143,9 @@ def get(self, request): # API 08-02, 08-03 팔로우, 언팔로우 @login_check def post(self, request): - print(request.user) following_id = request.data.get('following_id') - print(following_id) user_following = get_object_or_404(User, id=following_id) - print(user_following) - if user_following == request.user: return Response({'message': "Can't Follow Self"}, status=status.HTTP_400_BAD_REQUEST) @@ -156,8 +164,27 @@ def post(self, request): return Response({'messages': message}, status=status.HTTP_200_OK) +class UserinfoAPIView(APIView): + # API 02-01 회원 정보 입력 + # BMI 계산 추가 + @login_check + def post(self, request): + # User의 userinfo가 존재하는 지 확인 + is_exist = Userinfo.objects.filter(user_id=request.user.id) + if is_exist: + return Response({'message': 'User already had Userinfo'}, status=status.HTTP_400_BAD_REQUEST) + # user 설정 + request.data['user'] = request.user.id + # bmi 계산 + weight = request.data.get('weight') + height = request.data.get('height') * 0.01 + bmi = round(weight / (height * height), 2) + request.data['bmi'] = bmi - - + serializer = UserinfoSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file From 32ad771542ab99ba5266e96ac887f1e16da19543 Mon Sep 17 00:00:00 2001 From: "jieun4510@sju.ac.kr" Date: Tue, 29 Aug 2023 17:59:28 +0900 Subject: [PATCH 7/8] 'FEAT:02-02' --- accounts/__pycache__/urls.cpython-311.pyc | Bin 766 -> 887 bytes accounts/__pycache__/views.cpython-311.pyc | Bin 9575 -> 10834 bytes accounts/urls.py | 3 ++- accounts/views.py | 22 +++++++++++++++++++-- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/accounts/__pycache__/urls.cpython-311.pyc b/accounts/__pycache__/urls.cpython-311.pyc index f37187a2c5470c92f9b85a689197ba541e728cb2..ca48bc477ecf71cf5f0dac24378aa9e5a772641e 100644 GIT binary patch delta 264 zcmeyz`khTZ zGAc0pX>v_|&S*VZohgY+0H_vdHAC^P$&;CsltM2s5I~dfGUW+;;AQ7$YTyRJB0ivQ E08R`vIsgCw diff --git a/accounts/__pycache__/views.cpython-311.pyc b/accounts/__pycache__/views.cpython-311.pyc index 0064f72650eb579ed9d7c669565b1ff673188537..06553f989ebdc0e94a121743f4f8c8ef2a999ee1 100644 GIT binary patch delta 1418 zcmZ`(O>7%Q6rS0&ovj^v6E=2=f8wnx#hAvXPJl>|BBcqGMkNVN8%RI|$Gdgb4PG?6 zDJ3!_LOtYwL}3mD2?0IOCTfL4SE;uK__HQ&5> z|2yxEe;eCA6S(I0dlAqlTYoAi4t*Fnh&02`NFB>gcQ!>?3+59>I-ALt2Ym}T%7gVPSs zi_tlJy7Ei(HU~9*6@R^>8IMGn#WcMVmOR~z9j1fwQ@#RY7Z?<2S$-UER<`7E99Nix z!8KS$Kfr49cgNj9<;0Qam^u%uNqCq0D-6uXNJX<)L9?8KFQHjp;Q(C<50~bub)Gd; zGOC(6ZIOmUv6YPDVD1HglgaG{gRP8j;Hz-H-jqQQZk!B(F2xZSY{b{#A7%V80E5}e zvU52#Z$UNZ^!cKiHEM8Q4jpUC5d0o`|@?Dit7p=HbkcGkK@j(HW$tfvW`|z}yAR z(B`#8&3wBtT`L{T$QiL-;8JelH021Bvd+|mC1}1@I;WF9I2tUI%&0NQEYEVVMUzzX zduIMQ05nI6*wW#jrR27h{F<|*WK|llrGYh}F0A<13hysgg@`RgEFn@C{A&w#pr7ZcDn=uGfRf4WSy$+QICaw=QqWTPZ7fjgmGwxP455I$r5T1avt?_cUc z&TGi%u-THgfrZg?@-9JFMu$y8q0HP4K#hzt;+ zGucpDYVvjkQN~r9&noyaDkg(OLBw((E;a!Y4RH8@je$*YvXzoH2S|aYT#@5uc6Cig tHn7W*CtGXCa+Lxl7(qI>ZBEjtWpos0^k@9QfSsI>{t+zm1&2J??*NLnTzvol diff --git a/accounts/urls.py b/accounts/urls.py index 0492553..a34cb24 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -1,6 +1,6 @@ from django.urls import path, include -from accounts.views import SigninAPIView, AuthAPIView, FollowAPIView, UserinfoAPIView +from accounts.views import SigninAPIView, AuthAPIView, FollowAPIView, UserinfoAPIView, UserDetailAPIView urlpatterns = [ # path('', include('dj_rest_auth.urls')), @@ -9,4 +9,5 @@ path('auth/', AuthAPIView.as_view()), path('follow/', FollowAPIView.as_view()), path('info/', UserinfoAPIView.as_view()), + path('/', UserDetailAPIView.as_view()), ] \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index 089b07d..a3688a5 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -166,7 +166,6 @@ def post(self, request): class UserinfoAPIView(APIView): # API 02-01 회원 정보 입력 - # BMI 계산 추가 @login_check def post(self, request): # User의 userinfo가 존재하는 지 확인 @@ -187,4 +186,23 @@ def post(self, request): if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + + + +class UserDetailAPIView(APIView): + # user_id -> 해당 유저의 상세 정보 조회 + def get_object(self, pk): + return get_object_or_404(User, pk=pk) + + # API 02-02 회원 정보 조회 + def get(self, request, pk): + userinfo = Userinfo.objects.get(user_id=pk) + + # 계정 비공개 일 경우 + if userinfo.acc_visibility == 0: + return Response({'message': 'This account is Private account'}, status=status.HTTP_400_BAD_REQUEST) + + serializer = UserinfoSerializer(userinfo) + return Response(serializer.data, status=status.HTTP_200_OK) \ No newline at end of file From 7eedfa288ca0b5150a83f91be5bbf72563ca9692 Mon Sep 17 00:00:00 2001 From: "jieun4510@sju.ac.kr" Date: Wed, 30 Aug 2023 13:06:13 +0900 Subject: [PATCH 8/8] 'FEAT:02-03' --- accounts/__pycache__/views.cpython-311.pyc | Bin 10834 -> 11827 bytes accounts/views.py | 27 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/accounts/__pycache__/views.cpython-311.pyc b/accounts/__pycache__/views.cpython-311.pyc index 06553f989ebdc0e94a121743f4f8c8ef2a999ee1..e79ff242dd16cde99eeda7f2fda80e5d18b999fe 100644 GIT binary patch delta 1342 zcmZuwUuauZ7{BM<r4Hbs_5CHo&)BA9Rau;B`(oCVDxMVW8YAgJvsK&J6aPbTIM}*!fUUhxSq7(3f zdp|k}v+g-*f~vhrV297Xq2>#DJPNaQ>~`yi9@ga*EUQkDU^q=lr&rox{wKyMhC1Z5lH%aMgC*bi(6zh>@6Mm zd_h?9IVF8TZblhK(`kB557&L&9Ix@P?ep6?4dsl@jN2Bd2~pT(?cAVdfVkHMP$&!>ROR1`qDs`lO@rSQz*DhT#yxXxhQ8s!X zN}j3|{6UITq{tn^R>zjTBt^>7a8(+7qRXG9c`=%fvi?Ha` zM`L7byh!07g*XLzSe$OcN5sjGL4Qww>;S`yHP)dYC6h~Wk0XKARC}mFG<4E1)AI-V z36jCXY>k04N*t~`r9&E*qr+0S412ylNLVSDnlXmSa2cJ73g%WM$HQwnccNf#g*5KT zacY;)bghB;pOA?Nd35}7oCQ8K7%;cJfe|9UV>_EpPhC*+>a_a0T6h!YLj!ueKp5Bz z#rR#~ql=^mJT1 Qw^wH#xAU_I#Qu?g0gpmCo&W#< delta 1023 zcmZuwOH30{6rDHIma(Os{tIo#mTzfOB5g?2Kq4g=T&NH+6#@wX21*N5GA(}5urP*1 zVj6B-;06{(M2&&W%D5qhs0$YbyC97yE=<%!1!d>P_eM$@J zd97AW;h0(aE;N@c=>(20rD2A48XqExdV=#`AS$VZS=tKQI5%y2SfC4KzRr2jp=mv@ z)#R)c6;pvv??4=c7#`z~Dl3dJ24sRMeFeN{E8tC;9k%oi2ozhuZQvObMZrh41-cY! z$Z9x<8^W9}s~i=h@uXz$dRsWS}BAF0dVZqL$ zPIzr^M=8neID*vYh>5^$=x}yA2#U@$cxG$aV9x=1P0Pnh@fAR-$lCSa)fV74c4M50 zDRX?k4{NHNCeTCjuEnExR*{>H6~IKXxjeR4aEKw2$R`as3q=Wxpok(^)Z1V{VW5*X zNLTS(o?%=OD})9E=?AAmbyggJfVVcF%R8_TDSDcKd}?)=WpzD$echL$iD++hIGVgF zAEgQId0px(JC^9jy)bca`2SB7<^S=XkQ$p;Jt5qHCUu-p0?TmUcM`>= zOTblXp1@+Q=V;E*~!;MxKmvlv?6l#2V*L- OEh{_udJuk9hyDT(5b{z0 diff --git a/accounts/views.py b/accounts/views.py index a3688a5..939efe1 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -90,8 +90,6 @@ def get(self, request): # 01-02 이메일 로그인 def post(self, request): # user 인증 - print(request.data) - user = authenticate( username=request.data.get("email"), password=request.data.get("password") ) @@ -189,6 +187,31 @@ def post(self, request): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + # API 02-03 회원 정보 수정 + # PUT vs PATCH + # PUT : 모든 속성 수정 / PATCH : 일부 속성 수정 + @login_check + def put(self, request): + # User의 userinfo가 존재하는 지 확인 + is_exist = Userinfo.objects.filter(user_id=request.user.id) + if not is_exist: + return Response({'message': 'No Userinfo'}, status=status.HTTP_400_BAD_REQUEST) + + request.data['user'] = request.user.id + + userinfo = Userinfo.objects.get(user_id=request.user.id) + + # bmi 계산 + weight = request.data.get('weight') + height = request.data.get('height') * 0.01 + bmi = round(weight / (height * height), 2) + request.data['bmi'] = bmi + + serializer = UserinfoSerializer(userinfo, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class UserDetailAPIView(APIView):