From 0bccc28cafa31d441b515e394a0c90514559fa3d Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 25 Jan 2026 11:58:26 +0000 Subject: [PATCH] user profile --- core/__pycache__/forms.cpython-311.pyc | Bin 14567 -> 19892 bytes core/__pycache__/models.cpython-311.pyc | Bin 13883 -> 15363 bytes core/__pycache__/urls.cpython-311.pyc | Bin 2178 -> 2487 bytes core/__pycache__/views.cpython-311.pyc | Bin 13671 -> 19234 bytes core/forms.py | 71 ++++++++++- ...ddress_profile_profile_picture_and_more.py | 37 ++++++ ...e_profile_picture_and_more.cpython-311.pyc | Bin 0 -> 2282 bytes core/models.py | 20 ++- core/templates/base.html | 2 +- core/templates/core/edit_profile.html | 94 ++++++++++++++ core/templates/core/profile.html | 71 +++++++++++ core/templates/core/verify_otp.html | 44 +++++++ core/urls.py | 6 +- core/views.py | 120 +++++++++++++++++- locale/ar/LC_MESSAGES/django.mo | Bin 11813 -> 13427 bytes locale/ar/LC_MESSAGES/django.po | 70 +++++++++- 16 files changed, 526 insertions(+), 9 deletions(-) create mode 100644 core/migrations/0009_profile_address_profile_profile_picture_and_more.py create mode 100644 core/migrations/__pycache__/0009_profile_address_profile_profile_picture_and_more.cpython-311.pyc create mode 100644 core/templates/core/edit_profile.html create mode 100644 core/templates/core/profile.html create mode 100644 core/templates/core/verify_otp.html diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc index 3a3aab8f54ee335c8a18d79136f5cec8658fdc45..cbc72b448ce913f4352de8ea6a90fc5eb4fa903c 100644 GIT binary patch delta 5504 zcmb7IYfM{57QWZ-w=w2nAOynOiHYO136z93Hm{QK2qeIUlsXRg0wxB-*hvTtG3{ox zs7t$KFWaSCc1zkQOB8-2BGNwov{khmv_jQ2x)PS9tn#N??fzM!W>;0Dm3Gct8?Z~Z z&0PDtGiT16Idf*_oSFOg(FY&VhTrM+8VaXh(3iYpjvEFG{m&bvUuq;&1I6gCQ;gxp zS2;>EV?0G!Q|@o9Na#Duf0RCv(DvoKivLLHXWS?1Z|S|S(i&k*}e z-QiasyvV*;ocXbPX_JnIXf{lH}hH~?f>GaK}v zDy~@Dt02_c<@dFf3i@^Kp{a~+*Pa{1^hjizT50-2KeYu(d`lN(nv8UCGW5fo7-$;1mX{4xPrYs4U>Q z#71>kP4@`a=CU6#Xaty40G+_1@5hyX3o401OgUip`iz z)2g&^-_lv7WK%-F%+B4a zZ)4@}O1M8sa;r5-J!)S_@t-R#Au@hlk{JCD5@Qg@FWQKry2Vz8c$r8x?kL$9=V3xS zk1<(v3Q@?k*$m2ZMwKYMPr{f8JvEu$4-+b9%!zb7#i^k!kxOZ}v3I%)9*U%HGjWCK z*cE1oCf}?{o1*$?CiA+gJAH~8qq{S(kF-RM9RU`dME*XnkFEEkA@mw<@Q)8LATt1{ zkJ2$7fRTt!(BO~Lfoh|3{%Pt9c9Uy8J)|zadq};BrAK) zG?cMa5xFDyv1+7x@HwE`qX=Ugt zHHiI`m4Tfw4%f@$+zbs1Q%vsoYNVbcVRP*f37%LpM)Cq8;_(5x*iu5e zlZ2p|`$A>m^2_8_*#$CCBw^&kG^3c11=He6Q`8_V9Fi7vT$`$ZL**G=)Xy-;M(r zzEemAVWY)T5RQ|v)F&yzM>?81Lk)j$nHrOxp)S){v#sU2IW*)YR<(DEg{ILmRF&EF%F(QG#`Hvdn)-~1ZU{L0|YGcTH7xnxMx9e*6n0uSAs2fZ5p|9XZm1n+#cH&!E?1>uqN=g8e7m&EE-hjoTG@&Wiq zK&t>a1JDgXLd+!O$VvDO$n^k_D~KC%=K#(F5M@IQWQn3I&fQUq$A5?;XaK+qFbHq~ z0Ioh!1-==%y^MH%R$~ge3t))fdoXF-k{nvyZtt)+=yqSkwE;c$=ig3J5w6Reb2_3m zPFD-s+zm>quB9UfUVfk#4!DE^%~Q40C+2j5u2|5ON9->xO$c_UU_U{~T0vJN=xmXF z_N8iJAO6)4vQp6H3%ateIsL&bZra>d{ci;C6rc?%6dVSBdChFr{>wv5WP@zt6V6k0R4vOh~vHvKw|L~J5*)5|N8_5Kk#Fzh z9gSf}m*D7Hcbr>uoZ~$g!VaI{@NIAYSer3dG;ig#h5YNW#pwAcdR-XJeq|icaw;cnp z@Be(nxwoN&dRSs=sFFT>g~s^TEa%=PIkhS`HDyazvuKRgP-gPc2Ld~}9E!I=khN`> zl|j)8K=vD)!q7B^sHSnq(=T2Pqw0EmUKVeZKLdsdV9>UE7_UEegwptfBkmzKI1utP z+wO*M1NS=^0&oh6-2$%z5ughyTClsp3pM^kO!+hEvv~`n3!{s>Zia4!K7VN?v~qDZ z#P<#H{t2GF#|jC&JAWLh}TlaxI*4O-Q*m*~qoZvqLNWd>6|%_wk4O!-xBY!~MK& zAgmh@bOV!hkIe-$hh|?}G~wsfu(e9CR(+26b`Rg)C1CW9U}XZdQ-WV!+6AvubPebR zFRUEAFfpwbXc#dG<789BkUPar`xl%G&d`GQX49>vKO9=gTS;Hdce@3Qqhq+Yx9CRb zbd)|0ue01mp*Uhp6O8%zFub9brz)OM7@h)59^WwN7G*%3C# z6=R5MTP_ZrXOXzR-vct)Bkx151^~_|TOYi{<^3V1{RaO79=v|zix>Obl#D6)#`4+X zc1i4G827$5Yk9TQpbpi8n5|d_tbK@%K(DfBkL zJHSq3hR(3%wh delta 1187 zcmZ9LOH30%7{{5?ER?oHi$ZyYRjRlWAjFuU;n66dP-uCIph>f|Ybh-)e7lvTQHvbZ zs4*dP@L<%V2ajvw(HK2&F_Du=qw!>n2M=D}PHnKa1066sM>RvGE*^5n zB+DA)sqR|yjk`%={rv0RBW!?I`yx^=b{yv^UsMV~9N=$#em2a%_`0Pb7{a`@s!_t3 zG;W5gB2G5PAJx<~;pa*z&BL(>qy+R*0a=!*gTJeJA=10=FLSU({js8cDuT|GozWQrMKzxVyx{Mo5R61&ZD=Ro7Ru6d%eg=L|yj zJ8ARl4FSoHlRs^!KY=u860kycW4AMt&1iP=9(Ygz3IgLm1~B-qhW*u6;7sU2JLXQf zI?bbvo6PQGr@3+Lxsx@SLtP0L%1%MGM;FpGa1JQUfT%fL0jz2x zZkh$=fD6Dy0mWqxQ4EGSpaGYF1b_=rloHv?(d5oZp}^Ki{hcZVnXejCDW;_dy;)jn zk4BT3q!Ep-o6CdC&MsLj*wv#TR4cQqkgf^nyBfX*BQV4Lp+%2%ccF%rDt<2%W&!>o m6l}A`0_OjkwO!u5l#S=oS}#2mUYx7TJTmf$uZ;FNaoBG?WB{B1 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index f3c7b554a01325ea9bff678f08b4b2fd4c4f5105..1ec0e424701f28ef44cc7bd8abee4550bc5366c6 100644 GIT binary patch delta 4327 zcmb7HZERE58NSzX65H3lcAWSl#3T-o4?`MAlXU^o(Ii0l%r{K4R4&H%CUtOp!?`vT zkIC7JS~M|1bh<5Q6N9x)VMH5JRA~}Z%a3ZJLK@CwZPEROH1!96woI*5X@9o&J=b=~ zM?pJ@AK&wy*Y7>&Iq%0g5905CQcC)t5PywL67kD zd#hIZb0&_v2Op!!m6y3Wc)V8-aA6NKR|V!gg*SMa$O|H0LF8j1KZvUHqH@1%8R0^k z=%@Uk7~*wHGB&BC)r8U?ovH9FG?+f)d69lua;kR|yo~q&G#(&GssZ(KNz#%;lG4sz zHI+z`i>-M<6^wp`>`ik^&dRG7vlc%I&_QdMJ~fNHK>uYv=j$_pJyy7*pah38B!7;K32g6j7%XlDtUR z#Dh41mPiXi@zq4YE&@(g`xs!l_(wfuH_Mo+u<#?n&C|!_LKEuVHR)D0A<0TyNh)MJ zNQfQ5fgmEd=pXE-cf0WssaQ)Kn^aotQ_m|T5lJeoiO8f9M8z6}0R4p}T!$0a%cBOd z>nsGR)9U3LX`?m7BeN5`+ECwCw5j!z1~j&2!Hk4GFc4x?n{0vSX?AT$v+bZtl-PLU zsB)2UrI+`1kMwr$KVY!liLYrzDDqEsV)w<=<9rE#iL0T%u`L-)w*k|BeiIve6%{rj zw&NwlT6<&3i;PodqR8p-z2r5p88We%>DKWA|LfTWwX~g?$$NAsee5up4$}cqXxRrE zdKqZMlov6*AJq0Trf-TbXPR_@I[*AbXg_u$k2PcKf8AmEN`PXMOrZs!w&=6zIj zRhz=5g^wW=$4lK^Eqnb7qjj$7q=Fl+p#{igZKxl*tKAESja5tdG@SgG33N>%11W*{f7GUMIQ zjOQg*d@`iau%Bg4A7oB{F&AUBb6mJuu4Wn3N~&a-8BC<&alO1- zmWiTi&;AQC7KR}+X~*Xi2&ieKBIZ80@zKI&(ueMM8`tD+5(JInWD0q^pT;Y9v3wGy z-&BgNeW0XU@-u#spPvH7p?vZVY<@0rZ(5sCLiBRgjtq0}F#L#lwr(cCnQotY3rdfa zNKKwmh;BPP85vhtcGsQHafGDlz0uNqf-BgW5)z*Q_T22bTh%u%{rb`$OCEM)#Y2nYp`3VVx{p5cJT?NakKXY9(1HsO zm5@Ff@YV7$y4TlS$LeWilqgURq?D!*DZgYg1ZvXZ$^UU?J!KrmXiE2u8sU^U$(XB6cpN7+z=BltfaR zijb%h*T`Ye12yzF-AcS{P)@XhlM<(%)_!2P$pb26z7ejhV;|G*+f1 zBgvGuaVZe<2J*#VhSF_~Mwsj=*k)uvj_P<~Okd<1&$L%4JVilGwPu|866Hni2T z%#SlPTpd?u6o*6jG*187&;tjmw#F(ydc5v}EOItAC9Tx9ee})7_xKO!myH7gvXKu0 zy06Kz={EG)f$j~1Eu23=kQNe6M@kK!y|D0U%W2a=%y;Z`qnnSZ<7(PD1zs?wl1V8J zU2W$m837HwYy`TIgt5&-_?wdeA>P>AL7Lu~uBknQq3}!|ofi{vE1~Aw=m! zTi@0oK0?A+moFZo3}JR5*Y;E1#@>y6JUH_v+U$DMGGA&G3wqn--!7NUm#?lhVJwGG zOyNhY$ri;d^Yd2fsHn}zws~QVx>0*EP7HPX{F<5_cF7_Xs|wi(70IPL2Sx`^DkL@* zi$;<$HKB`zESj2Az-6X?K;074 zr1Oz@OiueVYxrv|41EHIG`xjOb5G%RlliFm!=}-%MEi5KGOEf@0H;!9 zN`*S{0Bo@J>GmEKs%Ru(luQ9<%XVLp$=^_^1%de~78~-H0-(=pUjVFJeV$sYXWKHf zZQ0GQEY`Hs(d{EefHW5CUPoUf$VqU(F6kS@HCucseJZp6*+!Xt?gpRW#i1$X0arEmm~q zDmtf+EV&!5H|E?8ca*HVW6|A_b9YQ1T{fFahxui0V>H%@OAJ-hSo;tkq7T|%&**k} zB9a(aTT{sxR5kPn@+$zn^f-_jH?D)l0~9+Cu=-1|aI(b6V&33xHJ|^nbWN&qDz1Ew z`~#Hn?4|7hpI$EEd47otWZ|Dm9pkS0EVt^Pe%^7drHXG^=GMcNv8(Zaqx|cY!4{hN b&hPhcbMUzOjq&=}`|vXy`}$in7(f354s_5A delta 3177 zcmb7GZ){Ul6z}WW_5W+Pu3PtqF*dffu+0r-U}G+Jg-v8DV}l?K@ObuJO2=C}?`zT3 z#La*K36RViKNw>qn#>RoP4>kE6Gana^aJ82e9=!PDv2f-H6$cP&$+MLV4GWfNl)*+ z=XcLN_jk@c_nv;?hAO`2@iDE5Qd^4nh+^)X^YF-6ly|mP%6I8_nd>SvuKP81RGk59E8=bjRzzF!_x= zNUPZ;N1WAKMZw8htw#gZpf=1{hDcVX_0TV8m#v-ST+;&GSlCS)5!QsF83o2fcSKLf zv_C~ug@$l2fT9dF_6eGqAT&Ekxx?#GftKiI6bnmI^oq%AFv6YfzJ zqN~}E`7*hp%FRo2A-GMvid+)&(&+iDf z{y)3uAVq-z*KUEBX3u+X87%j*L0_ft3%l8QgnjOtogyN!j(GvYKgFfEpwtv8o>@5W zSMkjA@0vJkg+Ba@FAmiV<}K7sQnI2I?;2K0%~Ow>@vmscw}zQAteEituXd$S?fj3{ z(|Ea31{E%#+lFc8cuFO@O*@gAfO?_Z*mtE3eoPhJGLlirU92Woim1rE{^m9j$F0w* za{44s{;-8^;m~wWRp~xx8ufvPtryO9CHu@j*|elwQhtEFg|+8P5{M8=@6TQvC;0TVKGC_#|~ zq2X;%S68@=N)Yp?t#QyFWPerm3DtAktL_(1?SX;)V24MvIG0X6mm@rYx?3aZtTZ9h z1W`5m6yN~HqwJo*Uy?oG&)reLUmhib?NXxPf<&=Ht#B*shF!rMc4?Ii5_ zhP>+xj=X{*#+=MiLmtsomzQW*Q z(eGt9o6ibwvfZJ*-N?&gmg}AZe~=EUB!va~2I%?Y=ShP{+#*GBc<$TK(^ezjGjsKA z$IOS_sKcVDTLv@9Ox`;I8FV~D$0ZfI+GCJ{x+6ECW@JUmW)_327mor!PSf*fU>FV9 zB8ozZrhx~%(ClSjw&$zYp}rQyvLeHdbkw*mqpA)CJ`DQU7aft>|9lF33b=P!BeX+bkf z9wZ;(7>d{DDz=^%T-*)phs)XR?fZlfYv_975M?l;TZc06Br_gxM!m(!ya-|Cpm^kY zSh&F@D?PCHjAxXbN_y!nz~Qx~{V1^8T{-ql_r;b{q2-=wxj1+Hg8Dm-|GB6Pv63Cv OMUzkHyoZ86E&l~EH=Qg1 diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 2b649dde12f5c9c3dd6a473575aed282948df4b5..7bda0a8355cfac8c597cdf819d9afb235d3585a7 100644 GIT binary patch delta 378 zcmZn?+%BxKoR^o20SN9gmSx(rF)%y^abQ3K%J}TZyiwy0)5HU;{MxC^SukOS6rG71 zMEP}rLXt2oDSAL5O?{w{6kNz)4cjti28Pu@3<2pPQPL@f!3>&4oB5dInL?^K3X1a6 zGILV(Z?QvJRlG2v)RfE;{aZXBDjp^&43jKNEy_%*)Xgs`(7(k6;lu+uews3q3s^Vl z@IckYmu04w-x5SN10uwa&@)+vEr?4O=s-pwF80`5!S;(W>;Vf$gG-0hgwQLZ>MJrY zuvlDVvADuwaRV$YKSTA3l;IA(3oPyzS=_I%xPyf+aLO%Uy`o^c!{-8v=S3FJD=eNL QbjA6Z8n{8QNE>K60LL9|d;kCd delta 110 zcmdlk+$5;6oR^o20SK=CF3rqlWng#=;=q6?l=1ly(?*RuOkC-LQ4%TI!3>%@o2!`P tnV9`FB`52$ZJI2|?!%=HRLcm&#Y~&i*?%z#d{7nUXKLUE!6H?lH~{|?7WV)E diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index cd8e56a541155e16e959a99a1b118e4f62aa60d5..b98115b9083d4cb5a96ef28309cd367fc19e383d 100644 GIT binary patch delta 7824 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 delta 2834 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 literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 8804f9f..13e3e99 100644 --- a/core/models.py +++ b/core/models.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ from django.utils.translation import get_language from django.db.models.signals import post_save from django.dispatch import receiver +from django.utils import timezone import uuid class Country(models.Model): @@ -67,6 +68,8 @@ class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name=_('User')) role = models.CharField(_('Role'), max_length=20, choices=ROLE_CHOICES, default='shipper') phone_number = models.CharField(_('Phone Number'), max_length=20, blank=True) + profile_picture = models.ImageField(_('Profile Picture'), upload_to='profile_pics/', blank=True, null=True) + address = models.CharField(_('Address'), max_length=255, blank=True) country = models.ForeignKey(Country, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Country')) governate = models.ForeignKey(Governate, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Governate')) @@ -162,4 +165,19 @@ class PlatformProfile(models.Model): class Meta: verbose_name = _('Platform Profile') - verbose_name_plural = _('Platform Profile') \ No newline at end of file + verbose_name_plural = _('Platform Profile') + +class OTPVerification(models.Model): + PURPOSE_CHOICES = ( + ('profile_update', _('Profile Update')), + ('password_reset', _('Password Reset')), + ) + user = models.ForeignKey(User, on_delete=models.CASCADE) + code = models.CharField(max_length=6) + purpose = models.CharField(max_length=20, choices=PURPOSE_CHOICES, default='profile_update') + created_at = models.DateTimeField(auto_now_add=True) + is_verified = models.BooleanField(default=False) + + def is_valid(self): + # OTP valid for 10 minutes + return self.created_at >= timezone.now() - timezone.timedelta(minutes=10) diff --git a/core/templates/base.html b/core/templates/base.html index 61d4e64..2841df6 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -87,7 +87,7 @@ {% endif %}