From 6b9504eedb048b96fa482e0d84ce5de98c628b9d Mon Sep 17 00:00:00 2001 From: Babit Shrestha Date: Sun, 12 Jan 2025 08:30:45 +0545 Subject: [PATCH] home functionality --- sahara/db.sqlite3 | Bin 151552 -> 167936 bytes sahara/main/__pycache__/admin.cpython-312.pyc | Bin 1282 -> 1414 bytes sahara/main/__pycache__/forms.cpython-312.pyc | Bin 2973 -> 3082 bytes .../main/__pycache__/models.cpython-312.pyc | Bin 7232 -> 7649 bytes sahara/main/__pycache__/urls.cpython-312.pyc | Bin 714 -> 714 bytes sahara/main/__pycache__/views.cpython-312.pyc | Bin 4591 -> 5468 bytes sahara/main/admin.py | 9 +- sahara/main/forms.py | 46 ++++- .../migrations/0004_user_service_offered.py | 19 ++ ...e_alter_servicerequest_service_and_more.py | 29 +++ .../0004_user_service_offered.cpython-312.pyc | Bin 0 -> 1003 bytes ...cerequest_service_and_more.cpython-312.pyc | Bin 0 -> 1525 bytes sahara/main/models.py | 19 +- sahara/main/templates/main/home.html | 195 +++++++++++++----- sahara/main/templates/main/register.html | 119 ++++++++++- sahara/main/views.py | 50 +++-- ...1064740373976536_6156792533421165886_n.jpg | Bin 0 -> 84567 bytes .../Screenshot_2024-07-17_085055.png | Bin 0 -> 115505 bytes .../Screenshot_2024-07-17_085055_9Hzrf4D.png | Bin 0 -> 115505 bytes .../__pycache__/settings.cpython-312.pyc | Bin 3396 -> 3296 bytes .../sahara/__pycache__/urls.cpython-312.pyc | Bin 439 -> 721 bytes sahara/sahara/settings.py | 13 +- sahara/sahara/urls.py | 10 +- sahara/static/css/styles.css | 144 +++++++++++++ sahara/static/img/backgroung-form.jpg | Bin 0 -> 272233 bytes sahara/static/img/dummypic.png | Bin 0 -> 111278 bytes sahara/static/img/logofinal.png | Bin 0 -> 26912 bytes sahara/static/img/pic1.jpg | Bin 0 -> 504260 bytes ...1064740373976536_6156792533421165886_n.jpg | Bin 0 -> 84567 bytes .../Screenshot_2024-07-17_085055.png | Bin 0 -> 115505 bytes .../Screenshot_2024-08-12_071545.png | Bin 0 -> 222752 bytes sahara/templates/base.html | 15 +- 32 files changed, 558 insertions(+), 110 deletions(-) create mode 100644 sahara/main/migrations/0004_user_service_offered.py create mode 100644 sahara/main/migrations/0005_user_login_profile_alter_servicerequest_service_and_more.py create mode 100644 sahara/main/migrations/__pycache__/0004_user_service_offered.cpython-312.pyc create mode 100644 sahara/main/migrations/__pycache__/0005_user_login_profile_alter_servicerequest_service_and_more.cpython-312.pyc create mode 100644 sahara/media/127266331_1064740373976536_6156792533421165886_n.jpg create mode 100644 sahara/media/profile-images/Screenshot_2024-07-17_085055.png create mode 100644 sahara/media/profile-images/Screenshot_2024-07-17_085055_9Hzrf4D.png create mode 100644 sahara/static/css/styles.css create mode 100644 sahara/static/img/backgroung-form.jpg create mode 100644 sahara/static/img/dummypic.png create mode 100644 sahara/static/img/logofinal.png create mode 100644 sahara/static/img/pic1.jpg create mode 100644 sahara/static/profile-images/127266331_1064740373976536_6156792533421165886_n.jpg create mode 100644 sahara/static/profile-images/Screenshot_2024-07-17_085055.png create mode 100644 sahara/static/profile-images/Screenshot_2024-08-12_071545.png diff --git a/sahara/db.sqlite3 b/sahara/db.sqlite3 index 08c69f92898d1f90f4cc257a7131b1b42bcdb8e4..33e0fb46f1bcdd16f3f9d07d5a4ae9ba0ce1c64b 100644 GIT binary patch delta 7319 zcmcIpd2A!+b)S!iC{m<8X=Poz@QRYThpH8K?jh;OHpL}H9n?iiq+}TMkTbk54G)P5 z44P}WsPm7#5ex=7-5738w{_Q9A!rdd1qu{xT{l6KA~52lE!w(A;3h@g!s+$RNECJM zE^J5OJdiWr_vT&Sd++!3^h^4uUoyOKp}UA-*eJTLqDzG?->qv@ZxOTRzO9w-!1ocw zM&U2v`>&O5!fy1VpF*T>z$Aawe`iP6HKs8P>%Vi`+4URxQNF(o>#ggYSw5M=ahwU4 zi=q_HcRw;$xBd{@+kbog zB0gY1x7*M78T)hC=x|ATtH-sdz8gPkk+NVj4o z-0q+#E6(5y$L@SKAFHYA>w0-P#`N~<+uJc`dKd$RNLq-I;bMX(8P;OskW+BWbj4o? z7S;-@q3G)TY^=E8;ft<I!WLL2uHF&#)V@*<30~kjt*QOevY4!WvtO!J}ci;?j7|A@+Xd4SyB#&{U8`mX8E{SyzY-mqL?ct z@})4^LyzO!IKhQ+8`6rg7IN_eMx?eLZ&$Q)4WF)E?LfU?D!P!OQ`=G3c3^w4KqqE> zp}1rrg-CUJF%ZuP5ovB)lIAiQVsdk8#pT}Q{V~qRx&+Ud-8SQn#3!n}z*i#4Vq%j| ziDJoaZ)%y(w(cs64kWB8(MQq_(q?4{nk4S2s}03_80QFvKBg=3q)yRww0}_XWO*3F zPW5DA*3L&O{*|N~uepVSLj1YCN#A;;ncVXZ*8;wd&H=HaXAJe0DKH z#;2H=pN{wlZpJ-P5{spldh#zqCe`YJYJ2AjcTl9&#&QJ35+p~mEJYDv0%vKC#wm{a zH9N;L6dPs0FqhBzk>iVrEU!^xz$lXrtr`HWUZ$#cwOX%N z$#)Gh(aEIE1dUjG`>R;{tDU52-uOgE)$oS?mv9Va#uwXbH)lbQe3mDAA3|q2?Nkrz z2kSkjIyJcEN`@-=a*B(1snFV#KU?$!Y0K6O6IjlcSGLjF@!F_jLafXtD@%dMS z%bE-^Azn=J@pL97q%+01$q+{gF_SI|JO7qDUjx7XQtQR@3(G#|+_Ce1THxF(ZtBjC zb8=d94h<`@fDL1Vrqc{pvy^#O$V+p9waP}t7b-7J3f{#;!7^W*TFxwoR�UhG?HJ zmY3$IY+G(8pPKPA*KdS2J+b(laD%XI#V1nfSdmZ1QhOxLw+s|R1}XCL2YuQ5w6vA$ zR*mEwG-qXT)=pEcM|*~-a|T6=W<;NS?%ARG*5wGj+O z+geZdMd$U3=*_x<4THh-DGsRpiYm)}6&56PZNG=mo*H`hDmC?7yP{>YzMQ2cZaJ&I z)PA)E=0tsI`AMZ{TswZ+PN;mW;?#MaqH?p$$T3+y#j&{MP@Oru%+x;iI@8i{&!u-y zA7iK2oqDisFMO3+;&TF|CAPDgd%f|`7gZg#JVRzuHmA2baucuV!R!Rz>I-TRQBFf!GGx|i5`IgDd zINFOclFdpH3~H{_@3x-pDJ}Q#FKeFuOEpvn8@fecQD-pemb35HSFO9>O@kM}YhPUj zyCFaLnsKb{Q<2r} zE~ddh2}*4bKit;8FuL=+Wv z5BMJZC-`^p$MCP=_u#AWEAThr=irO*dH5WB20jJ<4E`~E1AZIczTI7zh5@6OU?GU<`YIhl0J zq)R4HCY>@d$pp1gde9*g)HUgWzVV|sz?e~Oyah~mjJG=9#x5Y(Q#W3{Int)}J>z#0 zc{WNj4e=S}eXQZ`U>*rG{jFVloCpMdBfMn&ew-2IN(nb?EM>NW78$Wpum}TDoTN~D) zJ4?>(oGppx5Z2s|L?a?#mY8(r1S00thTleFb>jgB@hlLZHXR5qaA}O1krf5SGlLopHhSTx$D@k>s~6Q8?8=oReiWNdl>_5~N`sAGIPRp< zp0E0W1{)sQH@y+9mUoo+v?%>nm+G+r1AG?^@T?fL!X%tQwfikJ!21LEc~r^zVC{l> zLVp(CmTho0*z6cobKua{*6}n9s2R{omaPZ+A+-w}Nr59rCs*y~(6saDS=a5nRU5p9 zjIHTG)68StrBU_*)`elv*qUe{#lB&voj|i_Kr?tMa`@0__HJOdhCJIG(0pVxn?|kv zsiL1fCaryhIq7|&*<)jq<3O%{i=Xjh=%-4G%JJl12lVKf7J$1 z;A(TM3ebNJ26wLJ`BVRO@VEkmFYKF9KJ(}gpz8{{bV@esF08=V$B~lmDW)S1a+6%rRhj6jrvomfg;P+Z=FC z&biGa%ER5~qhJ#>9uXo@M$8pnilV%8m0(62|0RISy3vOp zxlg2f8NP|VgzSot?xPFN}uE1VSl02JRR(tWlE8B+$fWyP2W$oSw(`!1T%Kl?G; Z3n&P?OSPNMf)`aP;*o|m3UF}w{{iqDEHMB8 delta 911 zcmaixUu;uV9LLY^+}`%K>%G60F=o2JDj68EmEC){?hlIEjTeYxzzAzh%=LCH_qJ>A z%C@qNr*0aJF}Te}&xw>LWdTuQq7P<<#DLDIrzFaQ51yQJ z9=_k-?{_}G-zlE+70-DWnu5cGkX`)zv-%g?IvR$_Ugw&~CBV&^(TJP!^GlO+7z`gC zJRauCwvf#42A@X|0_h9kbR5xO95abs4%>-YoC;T6o{M;I>$i+wn>#V_muCpBdl zIWz4Tg^AR-d#fl!Aek{8Ys@f{IWA|%EU8`)TEQ$#+D1M#o=Zx`)V1uLhwgi;mEg;t+Z3^!yFoZUF6mCNcF=<;V7Kk$Qb(m!L z6X313C*U-&rn7WA``w1JPd-W{4nnj}wlYuEI_XV+ho`Z*8Q!+aU$|Za_S-x3Wrpw4 zXV^g-2CG-naNJ$JFaiq@;%TAA!3fN1X(ySQ{&!G@RqZ)TKcMG7SKnW7ZIy79;3ocx z8~77Gz`OVjuJVSjAzS?nI=H0={m zK3@yIYT8}n`}DMWq&t=vwyo?;Upx_y*zrTjiE$&I*R4Yd!-&1o6^kDm=&}x|x~fMb zsut0sVXb$c9_4$l+M{)A(b}I&91kma247Uxm1*S#`Jr6lm>7ii zc(6qnfRjD>UTbPtRIV2De~pN2eFOIJ;x`H2#P4|V h3c7X(F<{GIL5SV|3zYi*;EHk?e(?mVQh+{w>2CpG3)}zz diff --git a/sahara/main/__pycache__/admin.cpython-312.pyc b/sahara/main/__pycache__/admin.cpython-312.pyc index 125b2d4a9f00fae40c6207fe401e38362ebdb185..d43cfe6209db161fbfec63a8800d70dabd4e7972 100644 GIT binary patch delta 607 zcmb7>$x8z<7{$LNouxB&(bfe~5JaU`DS9bF5pN2j2wtSPAWkYHts@EQ(FK>QL;eO& z{v(1Y78G?rJbCdnUOk9OtF%`GdAyhWzL!Ietus4*6N_0O*Jky2Gp+maF7)9KWe+Mw z(LjJ<8XWBe9G#LYqA-A>NzqnY-8bu2dvmILs!{U_*FA!N%=x$W$Uktyzsn)we|JO! zW0A5wcY}&Fdg-&})2u~FOo@u~fnIWH+2I+?Y!Sn~Q;`M{7(2`>xn&w8c)e!LE0rjt zPGB!kR&hCZy=|T$EUEh9N)loLXIHFRd83J?)LmLi5ZzhleBWcvSi_G0&MHV%WpH3@ zlqE+wYgL&v1L6)}C)6)7C7Rs)R9un?WBI;&<=$Ks?_@X|V(2X5PmLt45J=PxiPo+k z&V@-x6^>@v;NSRs#uoX=jBeHr#9<_zA5gXi3`zH87Al^zTc(q2R7NB>Uy>3MgwQMW jy+ZB{a#hHQ>&STb1N1+Gc5WS6PmroY>SFp4dTM1q!j^Rx delta 458 zcmZqUZsOuQ&CAQh00b>(n$owiPUMqd+%QpHJA;vdiNT#Ag|&qtg)NnNH8V&F149&h zDr1%agpEvQ2_y3$>{QlN_SH-fHX{QreG~V|O%`HQ6=%A|5?Y*Ebc-)IwWusJIW;J? zur#%}WO6v;O$Ctqinu`p4~PJ9{cf?PWv1q&6l*dSaZL_jl2v0usJO))kXn?RSzMf% zpI5BOT*MF3#S0?%Ca-1E=H&nz0aZWwJ(H9UL=vO|q*jyZ7JG6|VsUY5aS_O~KqHV8 zOg3dc!Osa&3nEy7xVULD4~r$c!v!hF3mi_9eOR=ZZ-~`Su3?enQHH7W)8v}Gkj29j zq~{h(ab`*CEsmnp^vvRt)S@CKkSefJ6(H*uhfQvNN@-52U6B@$%Lv59&OqV=Gb1D8 YT?U1_4EpyO)F)f98gX1@PzLJ*0J6SWJOBUy diff --git a/sahara/main/__pycache__/forms.cpython-312.pyc b/sahara/main/__pycache__/forms.cpython-312.pyc index 4fb313875fd2c7f6b26f78926566d2ddaa036a0e..9e091acd3373952fe57eeb2678350bee136bef4a 100644 GIT binary patch delta 1313 zcmZvc?`vCC7{|}KzjE_COVi}WY;9^~@z%O5n|0zwS1Ic@#ej4b48w4nb5d@-$qgro zYeQgyeX)tSh9k3uj)L!G!tk#U*_(C@7A_8p;0r+^WfesbJm)4=DIUn@o_oH}^F8Nz z?jiRQpJ<_n!JrSYF@ECXrDOh1NQ2c*MxQ_cK?_u10YZR8BwJENF31(7pgNE6Y*(jXIPNkcy-&;cNLm><778jB7~&d65tK zx5OiAe2^LVpG=Kw!$BmN@JN=cB#$U4w51k;t6@Dt_k`oB>d3fam=^s@&|dY_h+Q@< z?8r63ig(0C({{r3ek+Q0xr_-$PSCQK%xZBEOMEmVUc1>!F4QdBKeA{LP*UwA1U&CyDHCBHK-7x}&e}%i_7v0T8t?6JyV>Pkk}nnRcaY zS4-}DB%P^JEZp;fcxHX!$?(bD;ghbOW2vWjYMiI0CpVhg?ag*KlGqsOiNaZ?2uXiI;eJRJKk?{Wc^pNkihfMIICmBkEOT?xC@WzVl_v|kHPBH^+@q=?L zEZPRk9)3yA2uQpy@IU|{XhU{qrM#oojC%csO^_2Q+10X1D#gQnaAhx?+EG(vfWuh2;aMR~t;KRLl3WQ1dseyNPV_0LvrFG-Fm zPOw-kS*#@`Y+1#k4hicasPi_@^nJZNpF`!s3d0|3V2?&Tg|Ttjw+|Q&-h^KH`0tt` z&%z$y?0+#Y{lzz968=Zxc;B`Ww&rY7am|R%7W+~B^na=sDmH3bc$&PyUitR*7a4jY kgzzcQo`TmHe*)SMVC+DegK!pZOl@D>y!ab%UtFiZ0lgSY_y7O^ delta 1496 zcmah|-EZ4e6u;N8lN+bW!kRUiI%qc9fYs4aIs^|D>lg)zj|s7?8==UU*zFRWIJ-`? zHHwr8RU$*>BeI|aZ5j`I7^;x=2kf1PNh}#dtt=+-#PddrHtmUXoTRi!6-V;#p6_#g z?m3?)uEZm^!eN;J{dDuw`8$DTBtg$KpHU(Ld4uTEBGLT@&G$8{gM$H26#x}8d@DYT zAtb{Vf{NVyemtJ-C^{JE3hTc#|GLG_(~NwAD6(^#4%5fZ2Gv5F4ws4Zk?^gov&+6r z5OX;#-@Z}NmFIHYE~`bYV7Nh3>#>qi&~m2BN}6q-v$)QK&Z}ZNrucY2l;kmlJpjic z(LU*B6pA!SXy3wpvgz5#g zSEL$uZU+X=j46^U*_D#PT`6lCTG92*8)c52aCgmUW=_}2IjcC$xy8X%v<-94?ejbh zT?M1YF+U&1fS{^o;kRs6wIz^~Ko|IaG^d=SY>19Hf~@aOf8M?q^-fT>PihOP)$&*lJ+pdrqma;6@YQ}^u!M%@y*vsWx1*&d9N(-LCoJdV5QQCg1Kc=UG3>G{O?Nh-0v*OJ;bACHjZPQK22U?MFl7sy)t$>nOZ`h#*kUH>)yLPK2Y`<;cC3YXGtHhMkX zVv{#!?y$)}o;}nMzY1Lpef?&e4c%oUYpicmTxF>?ORchlZFX>#O|;p>jSpL|&9n}m zy30=gzvKI@!n9uuZT_4+Xz8>ut|$ zcYDSiEi`r34ZdUPhKU>C?VlIOhcHDFVL!lQHd(OrifO#Ur$EGMvY!XI@1vC7BZ+(D jWxx$FMUT--FJ3+J-H{D~{KmU9Kxb(ymin6@<7NB@R3u5} diff --git a/sahara/main/__pycache__/models.cpython-312.pyc b/sahara/main/__pycache__/models.cpython-312.pyc index 1aff89dff4cd2037184efd855a1989f8cfb93c43..eb99c66ffe43ee2fb878b2144100a40efca74d2f 100644 GIT binary patch delta 1106 zcmYLIO>7%Q6yC9Sz40bqukH2vulXrSa9t>^A{m9BrZI_ArI2+JhX||`%k@mmwzk)d z(;)jm4CxIHwnl1&go?zel2d_{ON&6j0fYn+t`w=!BBA!y-cVvVaAL-ZV5R-`&HLW> zG~b)q?BLCuYNgRDfpWQBSYD*4+zgy9}rwbf(eE~9l8+Va|@(m8UksS$bo|ST3 zM(gDjn)kGB4-0{sH|E<71Ly$!?w0tY4V>OhO1vGsL@v1=K}}E(&$)!Rz~PWrknkYw zfX6As>@l0=&{N9`i8t!~x`|7<;>ep-glSq#Czn^}XOeX#jqs+CM-n!De^6k-=^Ehm+Bb#Kz`zY;!a=NPOiGgfs-`dqoM=>1UvoYYnmA#kKE%P zR~s-d)D3ls>{p*BKd3$-K%;X6^!ePZUjENWOj57UYHcTGB{Dqdzxj4?cpviKCE zg$kyuWxryWk}$Ua49 zA%hkAR$l<*rf=HK#SfH@4fil)cvW>;z}p;&YqTSr1sUZ z=G;Sd?14JA@AK~~fqf;|6?wm-vGAwFX@d>j(k?VokLA$ErN+er9thzB2N2?i6o!v( zo=z^vq20TxViWM&bPMEXO@EHf>?yksc!|OaUS%QM;9ShsJC>u#n>0g`ft1q{kKL0` z0~4S@ehvHvw#jF~^D$gv(w@mOi{58YqhJlpqC7qD;+%ns5PwKqp|JK5W3MsRnJZv~ zVAd>SgPaeI14QznsDFzUoL~igbe z`zicnqQYu=d+Ak=vSsi0i_qwwzE?{oyk108_$FO4_fq k4Y4~g1cp2Pk5Qowq%M(6O$5S zLOd8~eg|(p5&R5ie#ZGbD&X%6!$tj(t)UbL$Hf_;k*3F zxNa_s@Y)fzvU@+RJK>8QG&f;{(RwpDoKa+fxHFotmeE0l7u$3nwqrRh>V8omf%1W~ z9>i>7J%pW%VeDdz6co)3f1NQ%y1H#tW0f?uLTWlobqX+wc4D^PGT}g76_yR$xhz; zgFl`o87|Q=E=L&#HIaJxhlinR&J()GMuY9Zh?(YjJOHm0Hw*_=bPHyKAJ7scLT7ra zmcbk)nRIrD6dDs&&Ha5B`}+pY(OKS=s#+efFyBr78Z4;st^~5Ib=C!T)$gDH dYOPqq6}6)-Fj?<$q4?V6hZCiVJ%P!F?LW^h!B7AI diff --git a/sahara/main/__pycache__/urls.cpython-312.pyc b/sahara/main/__pycache__/urls.cpython-312.pyc index 5a051a801c663669f373732e2543d88f03ade740..2496d92cb1047da04debcf7739d7c9e2192ace39 100644 GIT binary patch delta 19 ZcmX@bdWx0nG%qg~0}#CZw2|uo6973h1@r&_ delta 19 ZcmX@bdWx0nG%qg~0}zNE+{kr+2>>%S1nd9+ diff --git a/sahara/main/__pycache__/views.cpython-312.pyc b/sahara/main/__pycache__/views.cpython-312.pyc index 2f14f327e6a9630b5ce08109f6c54db604cfe08c..a00c7604ede99310c85413e4b29049cf5452ed8b 100644 GIT binary patch delta 2716 zcmZt|e@q+K`MtZd&u1U@85^5`4F@KmBPv8AVU057R|6y&ut{|3a{I$`d>1%+_I2-$ zkPs7RTBm|mm9Ucv(>j&(pJYo`F;&y5N!6k>(ppth?HCDmGs-{tXa8(j8ckKEX?yR$ zVMBeAzxRFL`@Zkq_w)JhscLudv${Gzz^iTVkH)p&Vz9AT!qgH_fC6=pgEGufGL@rc zI>*QiBz#KuGKCi9QFWq2wENioR^dQpXK+ zS%MCwDHw)u7)b=v#)S(iQk6l>i|^v4)0&x|(shY)!nLE65uc3_Ic+WajB*T6<7 zws2+s%0h9zxI9w{bzeJG#T-nnhuX`b_DZPZ+NnRYp~n=%rK+*ylCfy4$E0#hy7k>s zOsd5C=Z30c$4&kQzb^Kb#lE{kC9$s}4ww1lQy)mSy*vD~;q^psInn!xrU`_x3lu_x5XnSQC2RA|>xGT#_n5s=e$-*U{jIT=ao_p0ylG|fS=IiW`SDrAViPk_ z6*rYGW^|-xl*^(@y2G5QcRLNKVCe}h{?YF$g;Xb?U?JN3(h2VVf`gBR` zU-Nyv8VHkC=w0pnuw%8Q5;#_3j(zzw45G;=fU4V96=F;LB427fez)yzq?8<369%h7 z;}U+`mZxvQb)mZ?bU%tTFAr5B9VNcwUynJg^~@ysySJzFr9RCL8#Ti;`YnzFVVceR~^5gg*Z;8{$$dB8EDPdF{MPAJW%cZbeWmWBYr?T=ymiG}iFcKRu19=y zVPt+}xvRAI&>DaE5yQVRVt0kQsV{&%7JBpn@^McXV^|zpyrM- zWuZ~bKWBFeJ>Fqrqs5kmHWrb2>_qGvLWJLnplg}4-w{OUw?7i%Ubog-ute1Un-Dm_ z6NR8MnaPhEJ>+#m+IjaTxUq3H>gHBGy6>rnw7iMJ_6y<0;z6v4+}a@R>K2b1WA|de z1c=G!z)Wfyqo;d|HsWENR#F(NbpMV#Y62x}N6xg+BtJ(bOE z8!>dXYsAvEBqr?Ob!>Zy`bJ(gEt4IlW3K*9HNXVnGb2DQqH-YmK}WHnvlQ4;bZvPE zGDNSqYj7j|)V)cZwU{4gP0&Z7CeI|Ez@uLJi>INJOaLoX)a!qR`<$=TbCR3jMgz1r z665ixNF#i_svayWYK%ZFfVW1Ez}PUbP4xG$L|+iasYJ!6;;S4OM(Y7pdNGNurivw0 zMo|0{IE&}j0v|>#$ck6=t%&TOH3e!ifO-p$CQJB z#J2hNo2~O3N`ZYv*S<%8hEcp}1#v+Ymm@W^;*40_*n6w_R;<|6zZe-PN9txnGoixS z;^y?7h*FFw_hN~{!BVWXD7OCnKw#${n{^PvSKaLg5W0ZIlUg!L*t=qT6g6$Y%!Sy-Yn&Q| zsWWXpqgwPpusvdneTHftF|7V`Y{CRO7HsU>2)0CIq=gYyLDCK+=_ahewkMxePIW(H zyDj6inzMP>k`7RqZXm4IP;6QZ*0`UAecO%u!FMsv)3f1M@pf7Y|8<<9%ITc#R$(4B z!T_A)NDq@Ueq4~ws#+SRR2t`{=H~I{R61?sbC#qSIaSITmZYA`TGE&{E}7X(PRizJ zBzg#UP&t}V7|0#>#K$;Rto3YcS2p*$;Y|HnI_uXuNjUI%G7~s%`x%;E)8N6$k>^3M zll~OlIrRi&mLj#R_l1)Sk+x~~QmkQi&&-~y{)O0)-l~z7UOrs#s#slaPpck-#TA2Zx-8kFN%B00F{AKtfeTn+!N#P54|%~ z=qR=gEQ*8oT;k;+`d(EhM{4PpRUbabl1#dY_o-Z0I~N0)^Qx_lK%kO~k+(=MC=byq zv97^d=Ap@sD5I%d#^^Ff3}U78mg$sg)e~#49a}R<8##+)Pj#j8*2rp&oy&bxh)ebC zwX>sZmU%0yneg0NW5iGQ$6KcYOdERIkJBNTZNRE#uAc@UO>B-(cWdWV;SvQMlH*z?k?*78HFBrkUue9dq-$k5E=^IC1KM=&kBd}))ikB P?!_ycX;1YA7rX6W4}avF diff --git a/sahara/main/admin.py b/sahara/main/admin.py index 9e6ec17..879e25a 100644 --- a/sahara/main/admin.py +++ b/sahara/main/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin -from .models import User,ServiceRequest # Import your custom User model +from .models import User,ServiceRequest,Service # Import your custom User model class CustomUserAdmin(UserAdmin): model = User @@ -17,7 +17,7 @@ class CustomUserAdmin(UserAdmin): # Fieldsets for the add and change forms in the admin fieldsets = ( (None, {'fields': ('email', 'password')}), - ('Personal Info', {'fields': ('first_name', 'last_name')}), + ('Personal Info', {'fields': ('first_name', 'last_name','profile','service_offered')}), ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser')}), ('Important Dates', {'fields': ('last_login',)}), # Remove 'date_joined' if it doesn't exist ) @@ -26,7 +26,7 @@ class CustomUserAdmin(UserAdmin): add_fieldsets = ( (None, { 'classes': ('wide',), - 'fields': ('email', 'first_name', 'last_name', 'password1', 'password2', 'is_staff', 'is_superuser', 'is_active'), + 'fields': ('email', 'first_name', 'last_name','profile','service_offered', 'password1', 'password2', 'is_staff', 'is_superuser', 'is_active'), }), ) @@ -35,4 +35,5 @@ class CustomUserAdmin(UserAdmin): # Register your custom User model with the custom UserAdmin class admin.site.register(User, CustomUserAdmin) -admin.site.register(ServiceRequest) \ No newline at end of file +admin.site.register(ServiceRequest) +admin.site.register(Service) \ No newline at end of file diff --git a/sahara/main/forms.py b/sahara/main/forms.py index 5f6afaf..acce591 100644 --- a/sahara/main/forms.py +++ b/sahara/main/forms.py @@ -2,7 +2,11 @@ from django import forms from django.contrib.auth.forms import AuthenticationForm from .models import User +from django import forms +from .models import User, Service + class UserRegistrationForm(forms.ModelForm): + # Password and confirm password fields with custom classes password = forms.CharField( widget=forms.PasswordInput(attrs={ 'class': 'form-control', @@ -18,7 +22,7 @@ class UserRegistrationForm(forms.ModelForm): class Meta: model = User - fields = ['first_name', 'last_name', 'email', 'password'] + fields = ['email', 'first_name', 'last_name', 'profile', 'price', 'bio', 'service_offered', 'login_profile'] widgets = { 'first_name': forms.TextInput(attrs={ 'class': 'form-control', @@ -32,8 +36,39 @@ class UserRegistrationForm(forms.ModelForm): 'class': 'form-control', 'placeholder': 'Enter your email address', }), + 'profile': forms.ClearableFileInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Upload your profile image', + }), + 'bio': forms.Textarea(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter your bio', + 'rows': 4, # You can customize the rows and columns as needed + }), + 'price': forms.NumberInput(attrs={ + 'class': 'form-control', + 'placeholder': 'Enter your price', + }), + 'service_offered': forms.Select(attrs={ + 'class': 'form-control', + }), + 'login_profile': forms.Select(attrs={ + 'class': 'form-control', + }), } + def clean(self): + cleaned_data = super().clean() + password = cleaned_data.get('password') + confirm_password = cleaned_data.get('confirm_password') + + # Check if passwords match + if password != confirm_password: + self.add_error('confirm_password', 'Passwords do not match') + + return cleaned_data + + def clean(self): cleaned_data = super().clean() password = cleaned_data.get('password') @@ -41,12 +76,3 @@ class UserRegistrationForm(forms.ModelForm): if password and confirm_password and password != confirm_password: raise forms.ValidationError("Passwords do not match.") - -class UserLoginForm(AuthenticationForm): - def __init__(self, *args, **kwargs): - self.request = kwargs.pop('request', None) - super(UserLoginForm, self).__init__(*args, **kwargs) - # Change the username field label and placeholder to 'Email' - self.fields['username'].label = 'Email' - self.fields['username'].widget.attrs.update({'placeholder': 'Enter your email'}) - self.fields['password'].widget.attrs.update({'placeholder': 'Enter your password'}) diff --git a/sahara/main/migrations/0004_user_service_offered.py b/sahara/main/migrations/0004_user_service_offered.py new file mode 100644 index 0000000..3b71748 --- /dev/null +++ b/sahara/main/migrations/0004_user_service_offered.py @@ -0,0 +1,19 @@ +# Generated by Django 5.1.4 on 2025-01-11 20:13 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0003_service_alter_user_bio_alter_user_price_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='service_offered', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='main.service'), + ), + ] diff --git a/sahara/main/migrations/0005_user_login_profile_alter_servicerequest_service_and_more.py b/sahara/main/migrations/0005_user_login_profile_alter_servicerequest_service_and_more.py new file mode 100644 index 0000000..faf1e2b --- /dev/null +++ b/sahara/main/migrations/0005_user_login_profile_alter_servicerequest_service_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.4 on 2025-01-12 01:26 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0004_user_service_offered'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='login_profile', + field=models.CharField(choices=[('NORMAL', 'Normal User'), ('SERVICE', 'Service Provider'), ('ADMIN', 'Admin User')], default='NORMAL', max_length=15), + ), + migrations.AlterField( + model_name='servicerequest', + name='service', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='service_offered', to='main.service'), + ), + migrations.AlterField( + model_name='user', + name='profile', + field=models.ImageField(blank=True, null=True, upload_to='profile-images/'), + ), + ] diff --git a/sahara/main/migrations/__pycache__/0004_user_service_offered.cpython-312.pyc b/sahara/main/migrations/__pycache__/0004_user_service_offered.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7f596c3af3f5370b32003776b7d6188d716cca6 GIT binary patch literal 1003 zcmZuvy>HV%6hD9DVp}PcsNzGV6ljI;5>)~ggpf+>fJ*5?i&SIPy5ugYQ-6eW0!k-9 z9T>ayUjVfO6EjQl||F%9U z1MpLTY~_xOVVN5{00S)fz?S$a`*NVzN}$@R1Z40KU}Xznl_-sbEh9+JT_rv3Tt_l< zzXVt^Wo86kouZZ(g)xIcgoz(l)5LVon1-J?-T@@3Y|B`xOSU2dqMlX@%UHx<^MYS5C1TSwE1ZnBWZK^C+@lm+J z)UfUQOpijBD@$60$*ss#xavY_H$(wvO!i#OBR*a-N0{a&e%ED&%WLAcPqdVQtg`b6RX0#;Jqn#A^6F|W@-d;#GC@JvNAbE7qjf}) zBW8F0JtT)qdpi~LKb=a=4u!lxvgNrEKj+&P7(k#eNCQP4gRd6{2GB3RGkV&1R~zqN znCPFo-Y-sV-{=*my2YvY(;t^VKl{4+WwmFmbgh-1wbr%PdRDD#)%G_!-;0|Ec~v(C z3M|4m3-n4>&4lbyszV7^O6f~4Wn$2aJdNpp905=a{L4w;xZ*;mlI{h1PkP!RaJ6MI`tgaH%CETXX3Fap=t=;nEXt);m}gJusH%eQ##oH{Z;Av%k&H z8wlFF%ir36Y6$%y9NE$dINt&AJtBxG3^f$6DpOspp}DC>N#k2I3tM7Nwz&kHA1h*a8t>dtiDD}aO+_^I zqP>Vp#GKw;kTf%EgTfyak|z3DMru0CN)$5|XR9S5Iby_&B{?#))aYKGc@lN=63uM) zu^j$A`T` zo*}f2`z(Tb!CzX8dUn)-c_XeE%fl|^skl$K9m)t_NK^;(UY~{$&m=xCBtRZ#kQe7Q zlTo0|`JM$;NF&Pg0cAL%WXi8bKF=iQJsuPibi;A6O~acInLc6Iy9+w{jPYE*$9znz z$gh`+JZr@qmcyCz z&%WAzuetw0ZKwGmZr#OE$M>3b`o(J7XOOMtF~#lsSL{neVzuuo1D0l5UW0bu* z%w8QYt&A5}$ECH0ua8P=!_wMc2)$WRCkWkAkA(SLJy9pPfg}$lMy5TO)IKXzq^8!=ZWj_%k1<`bssX+I}Gw=y;B5 zhedxGA$&@U_cLt|9j7#27FM&QH*{{V>E Bj&A?} literal 0 HcmV?d00001 diff --git a/sahara/main/models.py b/sahara/main/models.py index fe61cac..257ba59 100644 --- a/sahara/main/models.py +++ b/sahara/main/models.py @@ -32,7 +32,6 @@ class UserManager(BaseUserManager): user.set_password(password) user.save(using=self._db) - # Send verification email try: self.send_verification_email(user) except: @@ -76,6 +75,12 @@ class UserManager(BaseUserManager): ) +OPTIONS = [ + ('NORMAL','Normal User'), + ('SERVICE', 'Service Provider'), + ('ADMIN', 'Admin User'), + ] + class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) first_name = models.CharField(max_length=30) @@ -83,13 +88,19 @@ class User(AbstractBaseUser, PermissionsMixin): is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) - profile = models.ImageField(blank=True,null=True) + profile = models.ImageField(blank=True,null=True, upload_to="profile-images/") price = models.PositiveBigIntegerField(blank=True, null=True) bio = models.CharField(max_length=200, blank=True, null=True) member_since = models.DateTimeField(auto_now_add=True) updated_on = models.DateField(auto_now=True) + service_offered = models.ForeignKey(Service, on_delete=models.CASCADE,blank=True,null=True) + login_profile = models.CharField( + max_length=15, + choices=OPTIONS, + default='NORMAL', + ) USERNAME_FIELD = 'email' - REQUIRED_FIELDS = ['first_name', 'last_name'] + REQUIRED_FIELDS = ['first_name', 'last_name','price','bio'] objects = UserManager() @@ -112,7 +123,7 @@ class ServiceRequest(models.Model): remarks = models.TextField(blank=True, null=True) is_completed = models.BooleanField(default=False) completed_date = models.DateTimeField(null=True,blank=True) - service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name="service") + service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name="service_offered") def __str__(self): return self.service.name diff --git a/sahara/main/templates/main/home.html b/sahara/main/templates/main/home.html index c2af0db..0a76e01 100644 --- a/sahara/main/templates/main/home.html +++ b/sahara/main/templates/main/home.html @@ -1,63 +1,152 @@ {% extends 'base.html' %} +{% load static %} {% block content %} - - - - - - Login Form - - - - -