From 2dd5eb874e639cb1df028615c7983c559c456fa5 Mon Sep 17 00:00:00 2001 From: Faheed Date: Mon, 13 Oct 2025 17:17:40 +0300 Subject: [PATCH 1/4] everything before pull --- recruitment/__pycache__/forms.cpython-312.pyc | Bin 21894 -> 22386 bytes .../__pycache__/models.cpython-312.pyc | Bin 45553 -> 45687 bytes recruitment/__pycache__/urls.cpython-312.pyc | Bin 6849 -> 7606 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 45935 -> 45391 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/recruitment/__pycache__/forms.cpython-312.pyc b/recruitment/__pycache__/forms.cpython-312.pyc index 24fad7be176d63f6c1aef3a5de5697584bebdf63..e8051b15dafff5263a62731b42436e2214176b5c 100644 GIT binary patch delta 1489 zcmZuwZA@Eb6z;jD7goNi3~0Mh%Ere^TkOCQCTJPut6^6HGsm^{iiu`z<9=*sJaSEVy~sY0%7e(fJ$B&j3RW9{`@%b6oC{dLPQ3}JWv zb#a6YBe<`?B#bEVmPaccD>$!&QR#8hg8-xWX0aQN;cvyIrN>EW;b0QjR^l@R?-IPn zAtu&@`op0^sb?r}TYtfjWn?N*y@8#|3F=0fo!5`Bz%%cJ6pL@Ute)xtZ{ z8Z^c}$^g70y{p%cf6j^mS+c43@)V#gbm@52u`TGb@Z zlW!gus|>cF479kctfTi|Q_7Sqmou?H13nOH>iJCe$+`#s_Hdx?2$Pkyv zyo8tQ46r1v)HMLiV0pt1xPS*5oG>GuZ5Rf)iM7sx%FjqzNU%&GAN>zvl*S}70XSC@ z#B-5LMN1K|Iz1D=bZ*pqPR132|L%dH0O^ji69BNi$qZ}KD^2BKNZ>n7O4dtS4~LjC z*cavoxl;*vb=PH3lv~Mgk3B)S(qu ziLavGeMDG|*Xt*@1X>*P6s^}Ji}q#Vtj7RZ_@`$MCh?o*y^w>t-8FGZ!6uRrT;cz< z6drO=aYs<8)T;^(>>Hh}GU5uo)xX!u1qJ+Hb_OUIQ3OX3cc?`ustf zu)0IO-dg^y53$}39_QajTxV|p1Kc*KSkUN(R15d#9L*ULe@V%n z)mg?ff7Ds#be7qwU9)=wb7lMIb)C1ALWX)cF8iI3sz)fhJW=xK#Ar!3G^VLx0bh4(uvaciOCZeTHp-ondm$GzA6>0E>M|aY{}lat dDcqU_`r8U63KIz(I%$`~>V6zRr)tG0t0*OJ?+vsrXA zMpK6xb4<*fGGa8_L?FxcM@*KHWh2Yt%v_9F$~4PnG9t1+AXyfd{krEpm$+n2`^owB zz4xAbPr5V-hsGiQhSh2@h|keG3qzw@PUIKCR!wwmKtN4tPHzJDI zF~V`&Q#J_i@E^*oQmGa``fn~{-k#j)c|Gd!u~xk_uObVF(O+xFOBJ`2ECsW8z@^G$ zVwt>}&$zxY!U#X2)&q>-bafC;V}4ED{`aWXEuczlE!k6qGla7Ovr0=cl};wuC^=Hs zX7;`?GS>b?JROTV`_hqgEcIAAYuX*zxhuxbQAI(8&+GPjy-ts_qCvCRd0Ik_3I*FI zOm;y)VwdocJN7z&6t$Wtv_13Zv zvB+Jid_=-=47dm2AdcEf;9dTS`zd+rWi2i+YYMQ)YiV|oY$X)m8;K5Stz~Sw=8chI|49q5Pj2)}rwlmV>&I11=im-rYwA>PQ|>mJH#uZ7wHI&Rbb+@0`T4%QNlI4}W-#Cn z7u+RtjBrmNs9JG2REo!JHq7~-gYS7k^PAF&{}!>I@NA1$IYc6T(&k$pDLHa;_@LD- z<@7U!12^saDXI+X%~b=3vL`-BphpFC=Xt{@(3?Lj1J183%e!z(su6^D?Z#*4`Gq z%vDTfguCLGS}vA7X!uPsnJh~N0oF+S6bt=0+`}EA4dBG{p-Np_;~*{J{*zkCRJvpk z(6y8fsvdrI>v|~E{xq~1(}qcV**W~HfAtEjAMME6fgGrYODt}o6<5K; Hg1+oO%NSab diff --git a/recruitment/__pycache__/models.cpython-312.pyc b/recruitment/__pycache__/models.cpython-312.pyc index bf449775291dd3715fc043e4fccd91339dc40c14..25a528718d537750cbf5aa08965b4071db0e06e6 100644 GIT binary patch delta 2759 zcmZ`*dr*|u72mV43oNc;Vda$tmWQyQ2q+KbAuq9*SY<%NE8xoamG>@wEP_NJ0vQAi zs7DcvVlWnM7b^CPW2ePhC)Hw|v}%%Kccw3!PGVB+m}om0(@gKVz(P9-fBd-T+~4_~ zbI*Nz`{ZxRe}AOZ-qvb03idbR@~EoolC~fm{w41W?^9w>q@OOx1~jKoj0M`1GoxaE ze9`FZZ%`^ktq|;(4{^-Dfc}wzx=_c=e54*PMfkde38A8@CIu~#2KVJQ=ULT2G(`D2 zxiWvA(K9?;2ons#OpXYLlF_D~We2hBPBodt)z9%F9lR);(=0ETsrm!g44YS6;b5+` zsb-lW-=G-n;LR(B@;Y5+>Rh0?%E6u24C9(F{ZExK4&J7wc1n{lw~pt)q=??%CW0eN~prb_^VKd&*F!m0s9kfgHDh za4>liTIKwdC?y=0JJNmwFeqLG+&H($L))iy#=APB+?~7LSyjO5yM|MnPr|!c@x9}kEzFh(-a+RrBd|pt z-SP`3_20?69c%ILT-Xz%cTW503{gP&6N z5}y=a1!wtU(Gq}WyjGkCuDG;ht$H_w$Kv%uPwXgCV|9rUTo6l6t6ONI4fBRQHD($T zJjDFcD`4gsLSKmo*p0_DD*vvjJ}Q^2X=QZgOPR=iq*r)R5pPhS$V0jiQ=9IDjA3 zRI%Xeg;cBtYir%1MsBV>0ooqMH9AYa6w-_O`b0+FR{t`z<9NNlA1{tCfD`xv&Jp!Z zd{7^z<2^V?b}qp%!D%#@J>e|In1eO_@psJ^)V!K#wlZHFY*_|3aJ*##rm$>} zRehDRPx8J0Y)>%!78kb;xX(Cg#*4ROvef_|$bV`b1ocVs9>b+oUf93)2s}VTn{oL( zpEk~}+HI<95~Wi_<;y+Ex05I7YFhzzoM`J|%}Z+6r}EYRjF`MTH)xbZFi8+Yfh`1^ z$>e#i(MU&dlb_7XG$a_ui|wDlWqvj;b$}9n%I1Ak@3E<8cxT_Mu%CB8?DU5(abM@U z1=;W{M!{XjjCj27 zb=4o4u?YW21u%%7LloP;Ao;XcH-yNYI^!BTCu+ST=Y?7+wW`=G(WFr8$k};hXGY#Gg3_P=@xmL|1+# zm6C`XN8;JtXd6i}IM!-+E2yp)bE?HUL5icYL@LWqiCfQmYrLs!g17PcNH%!O>1Vy1 zyvvB;!@LD{x5kPpQD~|Y8>QP=`-4p`w`k4=cs^(C1QKh%uzNpn=sb||GT3KF6kLBY&>U65rAKS(=H0-B|LL#^& zPmQMnM9Auk*^tRUEc}DP&pUs-_$6FHq5LxOgD+AtzMqve;%(zAh`@srddR{bO*Adu UrG$V(&QBHe|7jJjy!5O80yrZ2UH||9 delta 2674 zcmaJ@dr*^C7SH)0fkx6YD<}_<@Djm_AS5UPDgqYQq85Bb5rW^RfF_hLp&*Dan96`y z^!NfnMOslnTl(2{x>{GMuhu#py4^C(?$oZ^b=T2xYL~IQ>*(w~7f6`dZu7@4_nh-P zzjN=okL2ecgvWmsbhmUmt%`lpA3ZG6^yzXVp&ATEgx_6>7Jf}N2`*f-VRBU}uV)FnxHrE?AVJeO$Lu&BrXh{ia{F46E`5S`)VxkMxWpJ=R;>=K>g5)B(&ew>r%5{=}%rPQXE z7_WDxb3dYR#&mz3zBhg}%M?u>!&uKWp1o?gJ7ZCr&a@JoS}_f|v@zr)W-l0H&k@rZExBG*38s`BRaAzO7vrf`s^ZlG zNVvoB2^3?h@d#LO(0B{Vl+MIC?$CgD=3Imdr7d}y0DG02sh%4UrAeW zTu_%W@4xZhs<(vafEBAh0ZO2*TcibDCPp7>D}~`k>wH3wmrY zr^eKflWwehjex68rcpfw=uF642|gvL#V2N?b_YcWJkeOVA9nEN+%3E*z$)yKilGX9 zH-v#znZ4mR0@UK-qD1Xs#x7(Jm0YJZ75NI|nn_|m0pi(`IF@*)q=9X7$)+Nq7SL=C z^2#ihHj6RqH%n&gM&;S27SO%P_)+e%Kc&@UrzH{U@lTeOMp}YnTxM3r;`IF7)k`yS z#;k|Wm9K}V@%40)Kr0qmBcgaq8p(czpq-$N;26Pif)fNC_@Oma+eAZx2<5J|9H5DB zec9`~1$8g;cHlGlTQ;Xb+pBO2BkVcJzusIAYUyv<|0k%0c1YJ-^jx zz9Er8^v0C|4{7*_fIEMr(N6^b#GM$be!zyW;b|0M2z3XxLjg7&NPq$CKkxy(iIoSl zprW(?AgG@)UX^m=PziWHrR*UBuJ{n=A6X6C@#vAQ-mbO9a}q|jM8Z>C(lUWPC>vTr zf>m^rK4a^4=p>{|GOlBu$-bsHCkxKguc*QzVJAtM~Z~}LpOcy2y z*nGlIxpVTVFfos46Im$N@q%rAktCLHmTdCp`1qYgnwu2s#`&ktuuJgZ)GVeP-nBT4 zPN2i9qEy~gY~7eInzz{G04gw2kxC(UnY5G0NzkqQ+?5J2Nim*Da)WLx>wN_Gu;6T# z$<=-SApVhh#vhP)%KeH=e&pyucX(BmmReZ*B|EFjg&m%wQvgh4&DBwRT{D*=cW&UjO3-&Ul@{7XHv_x`z3pdh;cablO>*~oD lLJ-Qp;hAhHrRJr|X&BpA{-RZY$<6LVD*7HOM5XWQe*viv;lcm_ diff --git a/recruitment/__pycache__/urls.cpython-312.pyc b/recruitment/__pycache__/urls.cpython-312.pyc index bca94678526077387139e8075c0ebec10485fefb..ce332ad968cb13b8b8b882d079ba0718c6b33c31 100644 GIT binary patch delta 1486 zcmai!O>EO<7{_hn0BP5DgE}8=qmq&qBi5LHq>zS|(ozCz3R6mP8x7o)xcO*8SmH1U z8quU3xK=*EX)32x+73ZTs7EG*cGxDpuVl$mG_;+OCcTq(*^T!D)P;4-O8$E7-|u<+ zyta}bLQf;@Kee^BaQJw%?~lx!cca}Slv*Ck-#BXmr}L>*UCgZ#+B zPt6oIQ_U7ROX>eI*RZ*^ieYiUEPPgc!vRcWnYws&k8vg%v%-=tZI*w+H!fms?)m78Vy2189MpYW_onf0u z)lW*;2s=ulcuUueB5j~Fy6Me#r`6+Y#Zm!3p6m@{+|Ua*^W@=W&54g7f8t5UfzJh3 z=>&c$rIRGWB*sZZ%r86R{sdm~_*?#ZFUO%hJkP)6dg$liORg7*s);(?ylU>3`fwhT zygrrh5dQptb2x!hsY~`y6b?nf#T83TqBhk`N*?T0r7q@mQg2|(VawA{o(2~*OI$&c zYCe{_vGX!kB{x*8jsuG_dRsj9vOOMpq#eEDWvgq8!H3?=b_F1Z-bA5^?R0h z4kd9vpZ7?O3K=F006A>S^H81#ms6Igqb#e>{RduWIL~k&2!!lF3$L6`mN<3gVMh3i;~ZxNG{dB`OqzV=u&2^+ zDvhNgAIDOSb1VpGmRaYSHB=ATBa3ik5qws)#JlJMqn|K3TG#Ed1vs_<5@ky?&>W*N zM(GwV!Qdruh0=LOFEbk1UbH6?a3TScwDY2Hgzn)A!^8DidvpnoE&;7Z=077KmDMkq S54wD9%k<={*3uIG8NCMQz{1%8 delta 734 zcmXw%!D|yi6o+@?L`^lR*e1K1&9+Sw;|fh;EGvds)Jhv$)4H?`(pZvIEr_YoYI9I) z#hZs-WKnu5DI(1=QYZ!S;MIDVfq?;`AYMFpnf?b(-s-aZ@rLic-^{@7=Du2ieZRj$ z63^$4e;)h@y$z_IhVPTP={s7=JiB}D-p*!6@R;-N^r%zm`Ym7B$#*Y%91^+}Es7ag zd{2LRC5a!AW%)pgz}s~o^>So8*Azvzomr({a8=PR+H$Ao@TBDRVPCoxWSKn4Ik&MHL=}>3(p%jUbC!Bx>Qy1&Stk%yyPkT^xQL z*i>Vp{;tLa4}l@AUFU#REp9;8rGKXkFf&ig{};^K&X(5B`U2g*w1lXA;Wp0$Zv)rD z?ZgjIe*+!@Ro!rJQIcu3mAqwqY?n zN%UlElA`OpE;cw7i3lcv;}N3@o2|O-1I-1Nnj)zwJi9_soxgO$)?AxuS!}RK28(#^ zIYlq{E7y*C;6Ay%A{#1^p%R`4oA*HS4X0*k$H&~oxU+5;{+qCPed5Wq_%Z(ioww!* diff --git a/recruitment/__pycache__/views.cpython-312.pyc b/recruitment/__pycache__/views.cpython-312.pyc index 584200ddbeb13f60efc083d928a50a7a527ce1e2..d431049c31ccd129daa291dcdafb5e57bb099975 100644 GIT binary patch delta 10588 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 H(h&a(4PHa+ delta 11257 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 -- 2.39.5 From cacc8d42b243a72d30bda07593fa4af26e75ecde Mon Sep 17 00:00:00 2001 From: Faheed Date: Mon, 13 Oct 2025 17:23:12 +0300 Subject: [PATCH 2/4] small fix --- db.sqlite3 | Bin 684032 -> 696320 bytes .../__pycache__/models.cpython-312.pyc | Bin 45687 -> 46937 bytes recruitment/__pycache__/urls.cpython-312.pyc | Bin 7606 -> 8049 bytes recruitment/__pycache__/utils.cpython-312.pyc | Bin 17336 -> 17828 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 45391 -> 50929 bytes .../views_frontend.cpython-312.pyc | Bin 19316 -> 18647 bytes .../migrations/0009_merge_20251013_1718.py | 14 ++++++++++++++ templates/jobs/job_detail.html | 4 ++-- 8 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 recruitment/migrations/0009_merge_20251013_1718.py diff --git a/db.sqlite3 b/db.sqlite3 index 0890a9dc46058e30c0945dd89d292f85875dc6c4..12b96f8463a1e9f8587207925fef36f471c08258 100644 GIT binary patch delta 2241 zcmZ{l4{Q_H8NlDWJHPv5-<`u|j=+*!{s1x9l5^O+Uop*x)GKn$i9q|n@DE5hF@k7hC zT)leEVp6?yfWtq_no9be&UU7j_CpMBAY1>Cb2;?o&O2);*qqUNHQ1|BqZ-Y0(Tn-_ zFgr+>Sj``sUp0SIxFrk=L4o7nBg8&F)zEALmFw%{dRx3Zl8ow|Nlnw%hN60WuO4!1 zZm&yoc|tC~t1fRiU7FM7QC+nUxauD8y4U!;ZhxJBV~{W&T)?OcJsFEdqq?4qbnXpx zg%gPbv3UDJNNSd%dHw#jErgO&IS=YiSg&?(FkI&Pz znFQH-UFfZcPg| z5y-X$klIkVBdNzjZDf66Un3C6)V!R<79bEf0aa9&{kI9Y~v0G_@|TXqRG^20LVZb*pz)C7sE&`DCip^bl+ zqXfmsKZman`(=om?dX=#uo|s{=7aWhkX6>NhtKFZ{b$B&d}R&#Cp32b$}|M==2hrZ z>~NyjnEa=L#NKgakTIAs(-#jO?XwQ|F;)bbw*d1N!5(9511)e7sIM<6tMouIT@Fbb zT8^jMnI-sgJ2SvQLNSs$^Sp30tB$rHro~{om@mqpkb^z9=by_4RfL}a9*hF>3GOK{ zDqWY}5UrMBa|?fBwj1g+x&Rrz0X<8?_aft|&(NU&hEr^soa-fH=N0xfDOWW3u}sXO z0hK3ru!sFTwVGtH2y6nfT?&fdw+xYQPS&glAz=k)u)}Bq6)`$>9G(H6gH70x<%*4; zO!94%ar-p)ZQA(YB=;(1xUyUfvcB~9kkV9%PhMr0;1kbLEZ#iAeHC|};tafdgnJPW zk8&IEXCvG@#>^;}qVT>m+@;ZJ7LJvY960bakep(ZapI^W1ArnYz1#Z3 zCo(Ho#qXz%q>|y*4!!UZ#go^OjRME<^t<#@L%e}RicUtNxcDZjH6l0BB5H|4t%%&O z>hZr$(+UpUMArNY6;9y2;F^ z^E0dPv1;Uo;s4Ft&F;*sMoKg=8~fZ@lV*uNW6G>zl|TT#z~iEKO%=GC{HMY8!e$0O zVj0|0jzpaOE6d`SdZ;yc=xutV;X7&CN^#^4TH|{7ajc%%(*YM1|V4 zZFbXkd%8Sh$2VutF)CAyU;YIBfqf{m5-E@Q^MzG~$tCl6@H$c`@cJ*N_&!M_B|?MS zfXc$(f!m~3X3En6x-|dh*_PSMi??zjx2!B*NTi8k5vbt+{>C=JhW+*IkLh-*6rZbS z7qfSU4sRE10}bqORS;GbAd0tK+{7O>bIKeA9xOTZM6V|gGXB)St}dybg#$!>_Y;W` V=_Jxbq>)H~NGp+WuBdBV{x1;Zr?mh8 delta 1913 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 delta 2478 zcmZ`*eNa@_72orA-vYZV3JWX?L0Q%SJ8>*V6wRbbI$$VPh!lc?Rb1F7AIdIyyC|r9 z$VY+Lg7!oMC%Zk-C~m#yY*{f|5Vdo!Q?# z@0{N`_ug~QdG}qtD}4X85b}k=pi{BmV8ETS=H{`G+(hA_Rw+rmr`5HqYM}7tT$Sxr zrEbpV2>o-6)~NDpRnuo6q<;rq98cc^qu9CFEZAOAKFo*~@T*L#@NcyuEcu%{SOa1f z+!s~akb4?DmlY{K3z9PfyW=4#zf)f0q5 zJrx|RE3eXCR>zGU+8jG zW=WE#+*yh@@*A;rc_D7-T7>gf%nQ9i8OOY$j?4?vPU%>5RM_>e1qkiRR1XTj2!0l_8?; z#(ej)HlB_@&~qk1KS3YCI|Ks+g9Pv5kUL)2Ng_d#a?V{1&`GVP6jiqg;t10Y;q8rA zp#x9VWWfP6*5*e4|GZ*jttIAtibqTGh1jdA)|Z#qot`46y;71>@K|jsbSeJYC2H{~ zqn*ICy7yoRzpYDwQ)sClh0}PU-lP45LL6iHFk(?dJbZ~w4PE*PC0W9mB^;9*EpSo! zZR0M0Uc9x{3)gXHlPzJ2Mu+PYH`v!#OY$D_}>#f8R74d^oGQjiq(CIku2z z;v-`6yqzM6s$V`vkW7v>1X=XR=Q&PN1i@znab&d+@IpR9I)V|jw%mjxyqcbEt%INg zf*eLPRvKC}e!3+Ful+s){(@c0qO@n3!vg^qw{3!U9IrFu)wUSn2LT_pE&567W67PG zM4l*V%xq8Bou+4koA`FS45t-cN1O({%5#65DZoGQH(j0D4Au~`2d{OFiC;0|65P4{ zuh4+`JMxA93d+G9OSIa{6y*v&etUV$9TLAI;L355?i2U{tGX@Xw@iK=cXd022Y`>d z>%oqjds5&6j`kdZHeB1A37htg_Ja7B5$lvAyDK2{5&1tL;4$w2Ciks?ChX|j5;|2{ z^Cnmr*`E+a9=<@y>8Ns*J3T&arQ|7dIpj>t>$l7V>a;T~8$N?1%PzU7QgXZPrIP$F zif|p@>QB}315@MqexvRi(h@9F?)L8i_(s__a15SV#Wc5eu_&8D(p*lDy~Go@Op@I$ zr~Ct8$-9@dy-)JC9Cz;h1ze+}5<}VCeRzFunLdTW&L>!auMf?JRBRebfKKJW&=A0C z%-$yj@|G542|wO9pLNpsz86{9&Dn1bkjRZ)nD4tyIuq@NU@yA%rwb+l8;hfaG6C(? zxp=48sLX$F8er>6qgIM==pDgI`GIv1wVEPCF|Rydkh`Qza#XLE-0~NIKmIv0;0zhr zb!czP!+vibYqa~`g>35C!%JsTo%@0}y5x22#wc>wYu$1TtzdFVd@ZO85uKOF<9I4FB`1q4c39o(Y(|8i-x?$SFhmtkvAY#Njtbrz{iVCcyaXQ$f;#H zd_lRBD|BG&SQ`6uu#eppZmBWn(60-p&Y!=sFHw>6`c9$wFVG_|e7c-`!JF7^$Bvs{ zcYJZaz$d$x4-@x!f>&t&F?i$9uXITih2V^mto#xnNpT)dhc*0LgI{{Qq4?XCzYAuQ zEAL|7SrUcg1yo8BKP#RX9ygA37J_&NzQ7kNU33mF$!Qq&L3QFA0?gR1@vCU`mx0w_zt93pp*#G6ibfv(e;(A*Z2$lO diff --git a/recruitment/__pycache__/urls.cpython-312.pyc b/recruitment/__pycache__/urls.cpython-312.pyc index ce332ad968cb13b8b8b882d079ba0718c6b33c31..cc455acb147b16c99ef7eb692df8824a9ee2ab40 100644 GIT binary patch delta 1331 zcmZ{j%}*Og7{6$u?Zi>Y^s_KL@qUUXhI+k#gL}OO0!U}U3NnZj$>?` zG_(Ts)NS~D3wCh9$X<+Tq^b4RPBtk(nyw4MY;7*Y4{H^I}=Q4+Lit2edqT) z@61^1pW?eCZO>X;TU_+kcHCRi*u^x$LM{-NpnLwxO_ zz??*y{_xh^e8KEXB zh3dkvBO~g3u3#38Tv@FjZXf|kRLR?izFYW>)LZ`aDDsA z$%NZe9;82%^{qD&EhlJI7x%4u`?8DFJN5ye!ImxLz1o$bL4kfNe;#(Z$RR-xp1XqV zbK<${Gy$4*Q4|Hux*>K`{ZjP3s|iQlyGLA}X4tIOI`BXe4J6@o)&@D!%2*p?Jsat# zna#}3J2ps?qnhB|ArggL5(X&jiGhOpL6Q8j9 zSEjp6rGU(DkrC+lujR)cEGbA*p!&WIE)ZQ{TW1{zn>#mppZ0I|*Vb%sndIoaVxW)e zqrj;-W?SU8FjQh#nL^4GoH1-*k|jQ+z;QPWMR6#FLMiz1k_`&vHpeR*`yNMeAc6vs z+O!QWkt*HbSTIO6!t{fnoMoG>aeK5@#Y1T{l!kM6ZE%mQ^I;dZ7;- delta 894 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 OjLU9x3l{9uJp32!!Dl}J delta 3107 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 delta 12563 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 diff --git a/recruitment/__pycache__/views_frontend.cpython-312.pyc b/recruitment/__pycache__/views_frontend.cpython-312.pyc index 61b6f94c0ced9e545b74f9d08769340fed4257b2..ea6f6149293ad725e321cb6d1653d54c86d4f871 100644 GIT binary patch delta 851 zcmYk2T}YEr7{|}^Zqx1U9W%Go%{ix~=4YYStgWrN{1}xbTZN>g`HtE$KVC-@*{rV0 zF8c6*80uv=ZIJQ?B7yi7YGxP;f)sesT@*&UsGI7Xtx*Tg?|Gj8^MBv-oD&^}ttX&d zRVrCTRvP=|`p%?MTLjO=f}(PeS%Qo&4d?7ti#^534CgPTF1mb0crHa#&Zmc&xB$ps z8qW~oGY0qg$`aMT7)c5gCy036AQzUzYZq!~fb5Vofc7JQdBSx7 z3C@t5=lIMHT}TmB_)J)(*4+-V{$mLXuMe`LXq*W{Tp>gKe@GV3@CLs*;SS0ZKKhLp z`0R)*ERA>DnI^<%hU5cs*WVa`0P2%8p#T&b`*Z5sI{6NdvED6;Wi4RnPj?W(%eVPG zMwh?sn#Xvdn-;tg@GwgGY$q zwaPQ>v`5q&h|l_xvnppa85N$ zHf*XL>zrfPfRCCEE1Cf5-S8vYjJr%%&(1FBwu9gDiU6& zRs#u3ntV#LjBpt#oT-v!h1IE)tRw@;SClfsp$xBhuWEn+tC(cI3($b?TbkKvdM}D9 z{MBNCY5XlqE1o)W1K<^&u%3g@e5lG%uo~loqGk}Jo!jEOLW|0)8Xbk z4LeVr6s@?*Zi9K;XWwKOsYv0)7pseLlz2z0KeJ0zrs%?t9fx2^oOP@**>9-2N@1XA zp?FKNM)3|uYD;7rB)uhmtbNGHwk0lC4eoX}X4ChN-6S??Y>3#Qu_J^HyyMJ*PvS49 Q3X*F8dLVipYfiWR0qc+1h5!Hn delta 1378 zcmZ8hUrbw77(eH>UH`0w3ar@LQU>j4nJWbcZqODAo0N@dHZ+k$S1!GGP;4pOdl^bv zDba_q2SHC9Tc(MBvn8F$mTRIun7M3j1heFp646S0@?mB^V8DdEsOQ|$ZF-XX`@Zx0 ze&3&S?`c=xg`4M~;Rl032k@%;^^f6!YX);YOp0~&O;F`bQX?j``-yUKe6N~voY{Fs ze~Mx%-`1qmf}3QJMS-L`Q*c2BqNRP$?t1bA#aX?e+9p8~Fy>i3GImu|)dHcuNIL-6 zlhQDH#u787v`Otq11c@Il%#Y*V^P99g~mL#9xFpJHsP5fo77}r!M_MTq@s|ix}wS` z3rvLS2aF}9c~jH3Z71O*cwNyCCZXFd{^%Koj!3Z(u_TXF-mu`B?^8zs1PefbDC@MI zm{nYX#a1bNj9Dc^`LOoU(HO<7GDBesuM~WYS3bs5g1Vpp0L}O-tVzhIib?0-0)*hd zf{G-??D)R`%^9tJMm?(-(HDz7veAcQ7V5nLzEI%vYM$rju!wsP!&Ea$cx!gW6AT^m z3=8pCZIs!^3-k~>l}Mh*s3nr|D>n9*nVlM9%k&o=R{haY?tD zBeQS|1WGXE6@7h&^Ce@n5E%}$F*eSQ3VhyB*z?h$Q98yKGF9?S`7*gh7}twWhsS76 zh|;mVetVKInUb3)#XB(YawP~%avEnU)itOC08(K>dYBCAMiWy6mNBEI(I_1f}6n`6!FeM3)=8rKp!=Z>$ppp z%R`nEQFT*q`L}qtjvxLreAynP!MZXiPB(49%D;?iLl@jE0~L;sL!TbWl{ZNGhIJjf zu-~hF2?FbjaBK5rw7h??x7!Uetr%|X3D#kA)1dEmC~ulw*uO;uOR@RBELe}tZT}vO zcN{8$Zf&Sdai=K|YEdkDA@&zrRG~I8-F%ONJ~4V=2Etx+|KKaS>v%ejKnptF>VwzO zpEk32sr5AoZ=iDD3$PzWe4p!X5fyk@Amt;yCgs$jy5_P;9YdpX%>CKFDbi3B3S}e1YRYu zOdv;K1(hCpTJP>+1KjT--CYXRT@a4L&0aJa8u%C5>vJ~% diff --git a/recruitment/migrations/0009_merge_20251013_1718.py b/recruitment/migrations/0009_merge_20251013_1718.py new file mode 100644 index 0000000..43811e8 --- /dev/null +++ b/recruitment/migrations/0009_merge_20251013_1718.py @@ -0,0 +1,14 @@ +# Generated by Django 5.2.7 on 2025-10-13 14:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0003_rename_start_date_jobposting_joining_date_and_more'), + ('recruitment', '0008_zoommeeting_password'), + ] + + operations = [ + ] diff --git a/templates/jobs/job_detail.html b/templates/jobs/job_detail.html index 2806b26..82eee9c 100644 --- a/templates/jobs/job_detail.html +++ b/templates/jobs/job_detail.html @@ -608,9 +608,9 @@ {% trans "Create Applicant" %} - + {% comment %} {% trans "Manage Applicants" %} - + {% endcomment %} -- 2.39.5 From 60fff6f636edd332265d34d794fad2abcb61b435 Mon Sep 17 00:00:00 2001 From: Faheed Date: Mon, 13 Oct 2025 17:34:32 +0300 Subject: [PATCH 3/4] breadcrumb --- db.sqlite3 | Bin 696320 -> 696320 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 50929 -> 50954 bytes recruitment/views.py | 1 + templates/forms/form_builder.html | 5 +++++ templates/jobs/job_detail.html | 2 +- 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/db.sqlite3 b/db.sqlite3 index 12b96f8463a1e9f8587207925fef36f471c08258..642ba113781aab45f312cd3aa7001ace799c770d 100644 GIT binary patch delta 1704 zcmah}O>7fK6yCMtk_?0`5)@UG_BA4MK(-q%HZhS})r6>t5`)1G5=D_S-W_`fuXpU- zwH-tAg9_=ffdgChlve$bxU>>#eX7KjOM61%z?oy!LshAwQv1dP(;F-AYCZ4Gd*AoH zZ)fwtiOmNmwvUWHQWWLh?j5;3F{M7bv2trgy|ohhX(jwkiG<0HqP@L$lkD8j!W|O7 zu^iq%+f?2^s${bxIb|f;WwtFkapAJ6aN^YE*MvjkhNx5+3x24DXVg@1TZ9h>9~a2p zTxwEJXHMz(j3+1K$&-*wP3!4tJ(I|!Q>m1$>lr;$F?Az-DxES@G?P3{jZ?s@%`VNAW)_zU#o3F!&06^8K@!&PDB2zEiPpP+pm9?hKNilZuc{O7^*#^hCWk}X zlA_(ymT>31Hdc%%vrY9?jC3{JyZ2l8()L|=EfNVmRYFfunIjvRmY z&GRE)T^~O34oZuc`f2Od<*kVF-mnr}D3C)zx=EV7qDOYrNDQcB27meFa`3oCP6RtG zazMUK?_FDtLDZ{p+xCJ|n@o*H@qdnTn>*F$a_{Rl`BfdIhATV|a*2EbCIWAjjH}0k zFILI2st13slKEh^OFjgjI@|-R30GMM2gY0vCW_f&7V;O*pIw?M2H$qc-Gjbp85U62 zhYocaG}?Z`4)WK?&5h+gmWC^?GQ;4{~?0#++49q;wga+=!5aysb zb?Pw3FHzHUnb#+B35SUgVaBp(1DO}8ZMSORGb;h}1}?U#8v~PjegX>2!mkQ)`9ySN zZ7thq*r-78_&RxO!Sh{#@YpIg;mk1@a0fhUGf$ccP(Va23Ah5+V$iWT4z^CaP-ggZ zScMy$+E5X0Q2&ICZ6u&*F)(m5m-7Q^djc$q<-ij*H-VWg;|13;HELB?w6K%xhQ>l; z$cji-0x46E8(@ffqvbOfo;w)4zPHe+h4}djX0yc0mTB436bRoDKK5-R0;l_beqvC^ zWj1D;;EP~|ccxFDhvQEYWvO)F*TkE78{Ju`| z$IkF7oRyV|%&;6`iz+%8Cg!LqL?Z@;1{xvwcb&Wue6T^r7YEXhO~Y7@`C~B{D-2wN zAH%L|W(U4{k+{}Bc;o$pds1Hd_XqMru(dt3wH^6x`?UxAM)8;nsSlOVkLp7_4u4U5 z51V9a|J^(p`fO-r58lIgkMxFC$UoZth&&XvXYy?PNPE`9T7PJvcIf9#vgh^45U$Sk K_HC0twf_LvN+~n| delta 254 zcmZoTpw)0dYl1ZIWd;U@RZz@6QNx_^a$`bk0%L0e)7Av$CGi|g+zkx;a@-A@9TiHr zw>M-nw}@~s@o#6~zr(+MvtYw&{_WfQnSBk|82MK*@UH@jEa2b1>O6DUgv|;K5BL$p z2N?D)Zzw1Qt^Jc*!C1g%CK9lbp*D}<_|3%%(Inu;`+WZ5$Y^mjo=B$SYQJJK!Z^#yL)%be z_d;Ib-U>}v4R=*yneZh1z)Co4ZZkqmBFV}jIG|XxKcWzKOhi0{iyuXXgx?bFsQY`O z$KeQGh;Erc#aMz;ml5L@#(f+Vs>Q^d5Wpj*lU*>5kCWpdk~&jGn8hcl1k?lDN4tPw z|LA_;g;VLHbz&*)fjjsi?XvSK_;c(u5tV$oLv=+lHw6#Tda=tQn4W@9Jf;glXuyw! z9Yg-+@|n84du9;!VqxZ{!R#r;ggjr$IE`;J_rLJ3(h2Cr{wvvLUKrQr7XiYk-geqy z6VERkCNO}Di=P2bVPQ!pa1N`>trUiF_tOP{9KKw6Vcc}A?1M?%D0>MMv1zrLzzuXi nUormX=Gr>k#p~-f3h#0LmDk+lfW93nk(LVKQ>Bf4->Cfstk=;j delta 616 zcmeC`WB%C7%zK)bmx}=i#JJvOL~rE16v#IN$eYfP$xzEw!&qcB`JunqG0!=3v$O4^&Xa8=6;=S(1~QqTrTalzWS< zxFj(>wYUgu!XKalO{Sv%43pPJh_f>=0u2SSPe;6E{5N@Lq$d-Q!xB};4pz&+IJq;b zp7HZ$&gc?WkW77o7>Jslpu+@|JDLyy;>jnf!Ik?YIx(7V?oWKp!kE0dI*pkbq@W>F z5~O@~rWRxQ=3|)^j37aW>^8>E&BwFT7~z^ta1X4b&qksqO?Fpce1_}su`Y>8-j_)iH1Uh*0)mh6K86!8>&f(!? zytKJ%sVNhq@8$!`Z!$85Y@W5UhKVtDv-lb@X2$f*dh3@mGFEQBvSAn4rxP~$GS+Rr zx5<-~9O=WSlKmxGz{^5)G4JX!fU8SOtaGcbvKU;?r} KNKEEF_8$PQ6~q?+ diff --git a/recruitment/views.py b/recruitment/views.py index 2e1437b..a974b2c 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -747,6 +747,7 @@ def form_builder(request, template_id=None): template = get_object_or_404( FormTemplate, id=template_id, created_by=request.user ) + context['template']=template context["template_id"] = template.id context["template_name"] = template.name return render(request, "forms/form_builder.html", context) diff --git a/templates/forms/form_builder.html b/templates/forms/form_builder.html index 5caea5d..c7f86df 100644 --- a/templates/forms/form_builder.html +++ b/templates/forms/form_builder.html @@ -779,10 +779,15 @@ Home / + Jobs / + + Job:({{template.job.title}}) + / + Form Builder diff --git a/templates/jobs/job_detail.html b/templates/jobs/job_detail.html index ab883af..daa9ce7 100644 --- a/templates/jobs/job_detail.html +++ b/templates/jobs/job_detail.html @@ -610,7 +610,7 @@ {% trans "Manage Applicants" %} - {% endcomment %} + -- 2.39.5 From b9904b3ec8316d280a9f6938356fdc495cabba63 Mon Sep 17 00:00:00 2001 From: Faheed Date: Tue, 14 Oct 2025 13:53:34 +0300 Subject: [PATCH 4/4] few bug fixes --- recruitment/__pycache__/forms.cpython-312.pyc | Bin 22386 -> 22386 bytes .../linkedin_service.cpython-312.pyc | Bin 10862 -> 16122 bytes .../__pycache__/models.cpython-312.pyc | Bin 46937 -> 46990 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 51127 -> 52134 bytes recruitment/linkedin_service.py | 318 ++++++++++++------ ...0011_alter_jobpostingimage_job_and_more.py | 25 ++ recruitment/models.py | 6 +- recruitment/views.py | 55 ++- templates/jobs/job_detail.html | 15 +- templates/jobs/job_list.html | 253 +++++++++----- .../recruitment/candidate_screening_view.html | 13 +- templates/recruitment/training_create.html | 2 +- 12 files changed, 479 insertions(+), 208 deletions(-) create mode 100644 recruitment/migrations/0011_alter_jobpostingimage_job_and_more.py diff --git a/recruitment/__pycache__/forms.cpython-312.pyc b/recruitment/__pycache__/forms.cpython-312.pyc index e8051b15dafff5263a62731b42436e2214176b5c..4c340290a228f0fb5abe347ffae9b0bf85f610ec 100644 GIT binary patch delta 22 ccmeygj`7nvM()$Ryj%=G5UcWTBX@c@09*bCCIA2c delta 22 ccmeygj`7nvM()$Ryj%=Gu#o-jM(*@*09_{sOaK4? diff --git a/recruitment/__pycache__/linkedin_service.cpython-312.pyc b/recruitment/__pycache__/linkedin_service.cpython-312.pyc index 56e8775f0831abcba7eaa5d4aff4b4851170266f..2eddf4499474f513a67999c46dee9547344127de 100644 GIT binary patch literal 16122 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 diff --git a/recruitment/__pycache__/models.cpython-312.pyc b/recruitment/__pycache__/models.cpython-312.pyc index a0ac22e0c8c9c1e7caabc2f72d1ef90a2e1aab16..fa7751ddb3c9c11d7c6ac218325ee65f3068a635 100644 GIT binary patch delta 9703 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 aYoxn+4!aM!zlqUFc!Rt9ne%bP=l=jKJJPTK delta 10008 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 Ai~s-t diff --git a/recruitment/__pycache__/views.cpython-312.pyc b/recruitment/__pycache__/views.cpython-312.pyc index 38268c645482e9f70251eeb6b84c87c39108689f..aff3e195cb3ab6f8ed72b7e755c62a5848d927a3 100644 GIT binary patch delta 1489 zcmY*ZZA?>F7(VB=x3|6bmRm}1+qD8^E0BhX&KT#M!G$R->J+BYn3ynTJFN;`4prv7 z*t!obn+Y^0TerlRI)(71KyC;wZXyf1B~H`s!rD}R)L;Hv(2-?ve|C-^l%1qc-uHQ* z_nhaw_uNkQ==u}7qB~|Y56Jr0{pX>trSYPfOM;1{I`aGLJsqwX{0KLRM*I!$#K|i% z)Z2Ytn1D88X7(ZKJ*#c`Qu!a{b4qX=U&{@v@V3@rC$C;4T5E?P+%3_ z&mY+g04i0u!yEv3Zj&XV@FPo-E^b-l(hv|R!t+K};ryZ^xaeSv!YRBWC^|*2u!_NN zK5y(2!;U38z+a?@!}M8`wF|rg!q#Uo0A7GN27p zM^i+bGX>kj0dzbV=tR>benP7+7Ypr6Y`T(lVQrD40N>k&X^C z0nf9A#r~?uAhCC!C57`Oh=N5U5LTSuIxgY1X%*?`9=y&#CTH8OfWLyaVe}l2?<~WTf?JX}u+;4Dv^jGs(I;*sPj&9N?}w`J|6i6ikNiBLS0Y}4#(qdOP$66<^*xaZwvsq$5t zdv*8ryn97#`vbu>?<)N^q`7Llx8+^#*tSIxuzc**S-oRkZ;I8->g{>1q__2V&XJYN zGjdg0uDT|s#E%?i$q;Q^ECZsow>sr+_?6Ryrj)+vpT#$UXnzcJtTXR$#>A}M@ujf9 zk@QIiy~HysJPmem+iq^C(%r6v4NR3zeb|2*vh-VvsBHrWA-ss^27Ts1rf}bUc&g7s z{$%ofHe5F3Wv>$P8MSffX9%xieq@3jBSeonGx8xrh?>zdIE=TBo?|Bo{hfM$^de+` zAmOljdi)Cr2QjBc*dGZorhcVfhh}O8~z|P%c-r?7j(@}Po|?IIufE|AZi*>yNFsu)C8gjA-W%;-DnH(iW(?1637`h ewuSu1jt1(`Bem&P1!HVwU^9ID4vSCxQuiMRg0~R> delta 745 zcmY+AT}V_x7=~xg**UsD>RH#bfs*Ym+lo1*73Xe? z*(+IDCcswFx$l85#_8ld6{RW*nppL{XZQMFy-_eAeCA^`Ko412Lqw@izDRIgoA7@nqB{V09Gx* zP-CmVp%r&_cLnh^b}uNgLO!S-Q`lZxi{kI^NAp@FlBQmY;Lte zx4DzH!)ZA`B|8(cQGX)ufb4t~nw6kBkNoQ&^< zGo&Ma7R4FAMc>9dAsi$}v`T4;AB>SJT0PR392i>Dq@34Gts2`pLVnEClF##QxI|0~ z<>)R_-esqd*#lu6{1FyOVCC3fos8`4 diff --git a/recruitment/linkedin_service.py b/recruitment/linkedin_service.py index 1e97f53..8593fa7 100644 --- a/recruitment/linkedin_service.py +++ b/recruitment/linkedin_service.py @@ -1,10 +1,14 @@ # jobs/linkedin_service.py import uuid -from urllib.parse import quote +import re +from html import unescape +from urllib.parse import quote, urlencode import requests import logging from django.conf import settings -from urllib.parse import urlencode, quote +import time +import random +from django.utils import timezone logger = logging.getLogger(__name__) @@ -14,7 +18,12 @@ class LinkedInService: self.client_secret = settings.LINKEDIN_CLIENT_SECRET self.redirect_uri = settings.LINKEDIN_REDIRECT_URI self.access_token = None + # Configuration for image processing wait time + self.ASSET_STATUS_TIMEOUT = 15 # Max time (seconds) to wait for image processing + self.ASSET_STATUS_INTERVAL = 2 # Check every 2 seconds + # --- AUTHENTICATION & PROFILE --- + def get_auth_url(self): """Generate LinkedIn OAuth URL""" params = { @@ -28,7 +37,6 @@ class LinkedInService: def get_access_token(self, code): """Exchange authorization code for access token""" - # This function exchanges LinkedIn’s temporary authorization code for a usable access token. url = "https://www.linkedin.com/oauth/v2/accessToken" data = { 'grant_type': 'authorization_code', @@ -42,12 +50,6 @@ class LinkedInService: response = requests.post(url, data=data, timeout=60) response.raise_for_status() token_data = response.json() - """ - Example response:{ - "access_token": "AQXq8HJkLmNpQrStUvWxYz...", - "expires_in": 5184000 - } - """ self.access_token = token_data.get('access_token') return self.access_token except Exception as e: @@ -55,7 +57,7 @@ class LinkedInService: raise def get_user_profile(self): - """Get user profile information""" + """Get user profile information (used to get person URN)""" if not self.access_token: raise Exception("No access token available") @@ -64,16 +66,32 @@ class LinkedInService: try: response = requests.get(url, headers=headers, timeout=60) - response.raise_for_status() # Ensure we raise an error for bad responses(4xx, 5xx) and does nothing for 2xx(success) - return response.json() # returns a dict from json response (deserialize) + response.raise_for_status() + return response.json() except Exception as e: logger.error(f"Error getting user profile: {e}") raise + # --- ASSET UPLOAD & STATUS --- + def get_asset_status(self, asset_urn): + """Checks the status of a registered asset (image) to ensure it's READY.""" + url = f"https://api.linkedin.com/v2/assets/{quote(asset_urn)}" + headers = { + 'Authorization': f'Bearer {self.access_token}', + 'X-Restli-Protocol-Version': '2.0.0' + } + + try: + response = requests.get(url, headers=headers, timeout=10) + response.raise_for_status() + return response.json().get('status') + except Exception as e: + logger.error(f"Error checking asset status for {asset_urn}: {e}") + return "FAILED" def register_image_upload(self, person_urn): - """Step 1: Register image upload with LinkedIn""" + """Step 1: Register image upload with LinkedIn, getting the upload URL and asset URN.""" url = "https://api.linkedin.com/v2/assets?action=registerUpload" headers = { 'Authorization': f'Bearer {self.access_token}', @@ -101,9 +119,8 @@ class LinkedInService: 'asset': data['value']['asset'] } - def upload_image_to_linkedin(self, upload_url, image_file): - """Step 2: Upload actual image file to LinkedIn""" - # Open and read the Django ImageField + def upload_image_to_linkedin(self, upload_url, image_file, asset_urn): + """Step 2: Upload image file and poll for 'READY' status.""" image_file.open() image_content = image_file.read() image_file.close() @@ -114,90 +131,223 @@ class LinkedInService: response = requests.post(upload_url, headers=headers, data=image_content, timeout=60) response.raise_for_status() + + # --- CRITICAL FIX: POLL FOR ASSET STATUS --- + start_time = time.time() + while time.time() - start_time < self.ASSET_STATUS_TIMEOUT: + try: + status = self.get_asset_status(asset_urn) + if status == "READY" or status == "PROCESSING": + # Exit successfully on READY, but also exit successfully on PROCESSING + # if the timeout is short, relying on the final API call to succeed. + # However, returning True on READY is safest. + if status == "READY": + logger.info(f"Asset {asset_urn} is READY. Proceeding.") + return True + if status == "FAILED": + raise Exception(f"LinkedIn image processing failed for asset {asset_urn}") + + logger.info(f"Asset {asset_urn} status: {status}. Waiting...") + time.sleep(self.ASSET_STATUS_INTERVAL) + + except Exception as e: + # If the status check fails for any reason (400, connection, etc.), + # we log it, wait a bit longer, and try again, instead of crashing. + logger.warning(f"Error during asset status check for {asset_urn}: {e}. Retrying.") + time.sleep(self.ASSET_STATUS_INTERVAL * 2) + + # If the loop times out, force the post anyway (mimicking the successful manual fix) + logger.warning(f"Asset {asset_urn} timed out, but upload succeeded. Forcing post attempt.") return True + + # --- POSTING LOGIC --- + + def clean_html_for_social_post(self, html_content): + """Converts safe HTML to plain text with basic formatting (bullets, bold, newlines).""" + if not html_content: + return "" + + text = html_content + + # 1. Convert Bolding tags to *Markdown* + text = re.sub(r'(.*?)', r'*\1*', text, flags=re.IGNORECASE) + text = re.sub(r'(.*?)', r'*\1*', text, flags=re.IGNORECASE) + + # 2. Handle Lists: Convert
  • tags into a bullet point + text = re.sub(r'', '\n', text, flags=re.IGNORECASE) + text = re.sub(r']*>', 'β€’ ', text, flags=re.IGNORECASE) + text = re.sub(r'
  • ', '\n', text, flags=re.IGNORECASE) + + # 3. Handle Paragraphs and Line Breaks + text = re.sub(r'

    ', '\n\n', text, flags=re.IGNORECASE) + text = re.sub(r'
    ', '\n', text, flags=re.IGNORECASE) + + # 4. Strip all remaining, unsupported HTML tags + clean_text = re.sub(r'<[^>]+>', '', text) + + # 5. Unescape HTML entities + clean_text = unescape(clean_text) + + # 6. Clean up excessive whitespace/newlines + clean_text = re.sub(r'(\n\s*){3,}', '\n\n', clean_text).strip() + + return clean_text + + def hashtags_list(self, hash_tags_str): + """Convert comma-separated hashtags string to list""" + if not hash_tags_str: + return ["#HigherEd", "#Hiring", "#UniversityJobs"] + + tags = [tag.strip() for tag in hash_tags_str.split(',') if tag.strip()] + tags = [tag if tag.startswith('#') else f'#{tag}' for tag in tags] + + if not tags: + return ["#HigherEd", "#Hiring", "#UniversityJobs"] + + return tags + + def _build_post_message(self, job_posting): + """Centralized logic to construct the professionally formatted text message.""" + message_parts = [ + f"πŸ”₯ *Job Alert!* We’re looking for a talented professional to join our team.", + f"πŸ‘‰ **{job_posting.title}** πŸ‘ˆ", + ] + + if job_posting.department: + message_parts.append(f"*{job_posting.department}*") + + message_parts.append("\n" + "=" * 25 + "\n") + + # KEY DETAILS SECTION + details_list = [] + if job_posting.job_type: + details_list.append(f"πŸ’Ό Type: {job_posting.get_job_type_display()}") + if job_posting.get_location_display() != 'Not specified': + details_list.append(f"πŸ“ Location: {job_posting.get_location_display()}") + if job_posting.workplace_type: + details_list.append(f"🏠 Workplace: {job_posting.get_workplace_type_display()}") + if job_posting.salary_range: + details_list.append(f"πŸ’° Salary: {job_posting.salary_range}") + + if details_list: + message_parts.append("*Key Information*:") + message_parts.extend(details_list) + message_parts.append("\n") + + # DESCRIPTION SECTION + clean_description = self.clean_html_for_social_post(job_posting.description) + if clean_description: + message_parts.append(f"πŸ”Ž *About the Role:*\n{clean_description}") + + # CALL TO ACTION + if job_posting.application_url: + message_parts.append(f"\n\n---") + message_parts.append(f"πŸ”— **APPLY NOW:** {job_posting.application_url}") + + # HASHTAGS + hashtags = self.hashtags_list(job_posting.hash_tags) + if job_posting.department: + dept_hashtag = f"#{job_posting.department.replace(' ', '')}" + hashtags.insert(0, dept_hashtag) + + message_parts.append("\n" + " ".join(hashtags)) + + return "\n".join(message_parts) + + def create_job_post_with_image(self, job_posting, image_file, person_urn, asset_urn): + """Step 3: Creates the final LinkedIn post payload with the image asset.""" + + message = self._build_post_message(job_posting) + + url = "https://api.linkedin.com/v2/ugcPosts" + headers = { + 'Authorization': f'Bearer {self.access_token}', + 'Content-Type': 'application/json', + 'X-Restli-Protocol-Version': '2.0.0' + } + + payload = { + "author": f"urn:li:person:{person_urn}", + "lifecycleState": "PUBLISHED", + "specificContent": { + "com.linkedin.ugc.ShareContent": { + "shareCommentary": {"text": message}, + "shareMediaCategory": "IMAGE", + "media": [{ + "status": "READY", + "media": asset_urn, + "description": {"text": job_posting.title}, + "originalUrl": job_posting.application_url, + "title": {"text": "Apply Now"} + }] + } + }, + "visibility": { + "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC" + } + } + + response = requests.post(url, headers=headers, json=payload, timeout=60) + response.raise_for_status() + + post_id = response.headers.get('x-restli-id', '') + post_url = f"https://www.linkedin.com/feed/update/{quote(post_id)}/" if post_id else "" + + return { + 'success': True, + 'post_id': post_id, + 'post_url': post_url, + 'status_code': response.status_code + } + def create_job_post(self, job_posting): - """Create a job announcement post on LinkedIn (with image support)""" + """Main method to create a job announcement post (Image or Text).""" if not self.access_token: raise Exception("Not authenticated with LinkedIn") try: - # Get user profile for person URN profile = self.get_user_profile() person_urn = profile.get('sub') - if not person_urn: raise Exception("Could not retrieve LinkedIn user ID") - # Check if job has an image + asset_urn = None + has_image = False + + # Check for image and attempt post try: - image_upload = job_posting.files.first() - has_image = image_upload and image_upload.linkedinpost_image + # Assuming correct model path: job_posting.related_model_name.first().image_field_name + image_upload = job_posting.post_images.first().post_image + has_image = image_upload is not None except Exception: - has_image = False + pass # No image available if has_image: - # === POST WITH IMAGE === try: - # Step 1: Register image upload + # Step 1: Register upload_info = self.register_image_upload(person_urn) + asset_urn = upload_info['asset'] - # Step 2: Upload image + # Step 2: Upload and WAIT FOR READY (Crucial for 422 fix) self.upload_image_to_linkedin( upload_info['upload_url'], - image_upload.linkedinpost_image + image_upload, + asset_urn ) # Step 3: Create post with image return self.create_job_post_with_image( - job_posting, - image_upload.linkedinpost_image, - person_urn, - upload_info['asset'] + job_posting, image_upload, person_urn, asset_urn ) except Exception as e: - logger.error(f"Image upload failed: {e}") - # Fall back to text-only post if image upload fails - has_image = False + logger.error(f"Image post failed, falling back to text: {e}") + # Force fallback to text-only if image posting fails + has_image = False - # === FALLBACK TO URL/ARTICLE POST === - # Add unique timestamp to prevent duplicates - from django.utils import timezone - import random - unique_suffix = f"\n\nPosted: {timezone.now().strftime('%b %d, %Y at %I:%M %p')} (ID: {random.randint(1000, 9999)})" + # === FALLBACK TO PURE TEXT POST (shareMediaCategory: NONE) === + message = self._build_post_message(job_posting) - message_parts = [f"πŸš€ **We're Hiring: {job_posting.title}**"] - if job_posting.department: - message_parts.append(f"**Department:** {job_posting.department}") - if job_posting.description: - message_parts.append(f"\n{job_posting.description}") - - details = [] - if job_posting.job_type: - details.append(f"πŸ’Ό {job_posting.get_job_type_display()}") - if job_posting.get_location_display() != 'Not specified': - details.append(f"πŸ“ {job_posting.get_location_display()}") - if job_posting.workplace_type: - details.append(f"🏠 {job_posting.get_workplace_type_display()}") - if job_posting.salary_range: - details.append(f"πŸ’° {job_posting.salary_range}") - - if details: - message_parts.append("\n" + " | ".join(details)) - - if job_posting.application_url: - message_parts.append(f"\nπŸ”— **Apply now:** {job_posting.application_url}") - - hashtags = self.hashtags_list(job_posting.hash_tags) - if job_posting.department: - dept_hashtag = f"#{job_posting.department.replace(' ', '')}" - hashtags.insert(0, dept_hashtag) - - message_parts.append("\n\n" + " ".join(hashtags)) - message_parts.append(unique_suffix) - message = "\n".join(message_parts) - - # πŸ”₯ FIX URL - REMOVE TRAILING SPACES πŸ”₯ url = "https://api.linkedin.com/v2/ugcPosts" headers = { 'Authorization': f'Bearer {self.access_token}', @@ -211,20 +361,14 @@ class LinkedInService: "specificContent": { "com.linkedin.ugc.ShareContent": { "shareCommentary": {"text": message}, - "shareMediaCategory": "ARTICLE", - "media": [{ - "status": "READY", - "description": {"text": f"Apply for {job_posting.title} at our university!"}, - "originalUrl": job_posting.application_url, - "title": {"text": job_posting.title} - }] + "shareMediaCategory": "NONE", # Pure text post } }, "visibility": { "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC" } } - + response = requests.post(url, headers=headers, json=payload, timeout=60) response.raise_for_status() @@ -244,18 +388,4 @@ class LinkedInService: 'success': False, 'error': str(e), 'status_code': getattr(e.response, 'status_code', 500) if hasattr(e, 'response') else 500 - } - - - - def hashtags_list(self,hash_tags_str): - """Convert comma-separated hashtags string to list""" - if not hash_tags_str: - return [""] - tags = [tag.strip() for tag in hash_tags_str.split(',') if tag.strip()] - if not tags: - return ["#HigherEd", "#Hiring", "#FacultyJobs", "#UniversityJobs"] - - return tags - - + } \ No newline at end of file diff --git a/recruitment/migrations/0011_alter_jobpostingimage_job_and_more.py b/recruitment/migrations/0011_alter_jobpostingimage_job_and_more.py new file mode 100644 index 0000000..a961dd5 --- /dev/null +++ b/recruitment/migrations/0011_alter_jobpostingimage_job_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 5.2.7 on 2025-10-13 22:16 + +import django.db.models.deletion +import recruitment.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0010_merge_20251013_1819'), + ] + + operations = [ + migrations.AlterField( + model_name='jobpostingimage', + name='job', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='post_images', to='recruitment.jobposting'), + ), + migrations.AlterField( + model_name='jobpostingimage', + name='post_image', + field=models.ImageField(upload_to='post/', validators=[recruitment.validators.validate_image_size]), + ), + ] diff --git a/recruitment/models.py b/recruitment/models.py index d53801e..b662c0e 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -1,6 +1,6 @@ from django.db import models from django.utils import timezone -from .validators import validate_hash_tags +from .validators import validate_hash_tags, validate_image_size from django.contrib.auth.models import User from django.core.validators import URLValidator from django.utils.translation import gettext_lazy as _ @@ -249,8 +249,8 @@ class JobPosting(Base): class JobPostingImage(models.Model): - job=models.ForeignKey('JobPosting',on_delete=models.CASCADE,related_name='post_images') - post_image = models.ImageField(upload_to='post/') + job=models.OneToOneField('JobPosting',on_delete=models.CASCADE,related_name='post_images') + post_image = models.ImageField(upload_to='post/',validators=[validate_image_size]) class Candidate(Base): diff --git a/recruitment/views.py b/recruitment/views.py index 3b5efa9..a297a59 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -1501,9 +1501,14 @@ def candidate_screening_view(request, slug): Manage candidate tiers and stage transitions """ job = get_object_or_404(JobPosting, slug=slug) - + applied_count=job.candidates.filter(stage='Applied').count() + exam_count=job.candidates.filter(stage='Exam').count() + interview_count=job.candidates.filter(stage='interview').count() + offer_count=job.candidates.filter(stage='Offer').count() # Get all candidates for this job, ordered by match score (descending) candidates = job.candidates.filter(stage="Applied").order_by("-match_score") + + # Get tier categorization parameters # tier1_count = int(request.GET.get("tier1_count", 100)) @@ -1601,19 +1606,55 @@ def candidate_screening_view(request, slug): # messages.info(request, "All Tier 1 candidates are already marked as Candidates") # Group candidates by current stage for display - stage_groups = { - "Applied": candidates.filter(stage="Applied"), - "Exam": candidates.filter(stage="Exam"), - "Interview": candidates.filter(stage="Interview"), - "Offer": candidates.filter(stage="Offer"), - } + # stage_groups = { + # "Applied": candidates.filter(stage="Applied"), + # "Exam": candidates.filter(stage="Exam"), + # "Interview": candidates.filter(stage="Interview"), + # "Offer": candidates.filter(stage="Offer"), + # } + min_ai_score_str = request.GET.get('min_ai_score') + tier1_count_str = request.GET.get('tier1_count') + + try: + # Check if the string value exists and is not an empty string before conversion + if min_ai_score_str: + min_ai_score = int(min_ai_score_str) + else: + min_ai_score = 0 + + if tier1_count_str: + tier1_count = int(tier1_count_str) + else: + tier1_count = 0 + + except ValueError: + # This catches if the user enters non-numeric text (e.g., "abc") + min_ai_score = 0 + tier1_count = 0 + print(min_ai_score) + print(tier1_count) + # You can now safely use min_ai_score and tier1_count as integers (0 or greater) + if min_ai_score > 0: + candidates = candidates.filter(match_score__gte=min_ai_score) + print(candidates) + + if tier1_count > 0: + candidates = candidates[:tier1_count] + context = { "job": job, "candidates": candidates, # "stage_groups": stage_groups, # "tier1_count": tier1_count, # "total_candidates": candidates.count(), + 'min_ai_score':min_ai_score, + 'tier1_count':tier1_count, + 'applied_count':applied_count, + 'exam_count':exam_count, + 'interview_count':interview_count, + 'offer_count':offer_count + } return render(request, "recruitment/candidate_screening_view.html", context) diff --git a/templates/jobs/job_detail.html b/templates/jobs/job_detail.html index 78d6579..2103fcc 100644 --- a/templates/jobs/job_detail.html +++ b/templates/jobs/job_detail.html @@ -269,11 +269,14 @@
    -
    +
    {# RIGHT TABS NAVIGATION #}
    - {% comment %} --- START OF TABLE VIEW (Data relied upon context variable 'jobs') --- {% endcomment %} + {# --- START OF JOB LIST CONTAINER --- #}
    - {% comment %} Placeholder for View Switcher {% endcomment %} - {% include "includes/_list_view_switcher.html" with list_id="job-list" %} + {# View Switcher (Contains the Card/Table buttons and JS/CSS logic) #} + {% include "includes/_list_view_switcher.html" with list_id="job-list" %} + {# 1. TABLE VIEW (Default Active) #}
    + + {# --- Corrected Multi-Row Header Structure --- #} - - {% comment %} - {% endcomment %} - - - + + + + - + + + + + + + + + + + - {% comment %} This loop relies on the 'jobs' variable passed from the Django view {% endcomment %} {% for job in jobs %} - - {% comment %} - {% endcomment %} + - - {# CANDIDATE MANAGEMENT DATA - 7 SEPARATE COLUMNS CORRESPONDING TO THE HEADER #} + {# CANDIDATE MANAGEMENT DATA - URLS NEUTRALIZED #} @@ -314,7 +337,53 @@ + + {# 2. CARD VIEW (Previously Missing) - Added Bootstrap row/col structure for layout #} +
    + {% for job in jobs %} +
    +
    +
    +
    +
    {{ job.title }}
    + {{ job.status }} +
    +

    ID: {{ job.pk }} | Source: {{ job.get_source }}

    + +
      +
    • {% trans "Applicants" %}:{{ job.metrics.applied|default:"0" }}
    • +
    • {% trans "Offers Made" %}: {{ job.metrics.offer|default:"0" }}
    • +
    • {% trans "Form" %}:{% if job.form_template %} + {{ job.form_template.name }} + {% else %} + {% trans "N/A" %} + {% endif %} +
    • +
    + +
    + + {% trans "Details" %} + +
    + + + + {% if job.form_template %} + + + + {% endif %} +
    +
    +
    +
    +
    + {% endfor %} +
    + {# --- END CARD VIEW --- #} + {# --- END OF JOB LIST CONTAINER --- #} {% comment %} Fallback/Empty State {% endcomment %} {% if not jobs and not job_list_data and not page_obj %} diff --git a/templates/recruitment/candidate_screening_view.html b/templates/recruitment/candidate_screening_view.html index 8ce3eed..ee5970c 100644 --- a/templates/recruitment/candidate_screening_view.html +++ b/templates/recruitment/candidate_screening_view.html @@ -172,7 +172,12 @@ {% endblock %} {% block content %} +
    +
    + {% include 'jobs/partials/applicant_tracking.html' %} +
    +

    @@ -189,16 +194,14 @@

    -
    - {% include 'jobs/partials/applicant_tracking.html' %} -
    +

    {% trans "AI Scoring & Top Candidate Filter" %}

    -
    + {% csrf_token %}
    @@ -207,7 +210,7 @@ {% trans "Min AI Score" %}
    diff --git a/templates/recruitment/training_create.html b/templates/recruitment/training_create.html index a09f19d..b4732ad 100644 --- a/templates/recruitment/training_create.html +++ b/templates/recruitment/training_create.html @@ -24,7 +24,7 @@ /* Main Action Button Style */ .btn-main-action{ - background-color: var(--kaauh-teal-dark); /* Changed to primary teal for main actions */ + background-color: gray; /* Changed to primary teal for main actions */ border-color: var(--kaauh-teal); color: white; font-weight: 600; -- 2.39.5
    {% trans "Job ID" %}{% trans "Job Title" %}{% trans "Status" %}{% trans "Source" %}{% trans "Actions" %}{% trans "Manage Forms" %}{% trans "Job Title / ID" %}{% trans "Source" %}{% trans "Actions" %}{% trans "Manage Forms" %} + {% trans "Applicants Metrics" %} - - - - - - - - - - - - -
    {% trans "Applied" %}{% trans "Screened" %}{% trans "Exam" %} - - - - - -
    PF
    -
    {% trans "Interview" %} - - - - - -
    PF
    -
    {% trans "Offer" %}
    {% trans "Applied" %}{% trans "Screened" %}{% trans "Exam" %} +
    + P + F +
    +
    {% trans "Interview" %} +
    + P + F +
    +
    {% trans "Offer" %}
    {{ job }}{{ job.title }}{{ job.status }} + {{ job.title }} +
    + {{ job.pk }} / + {{ job.status }} +
    {{ job.get_source }}
    @@ -283,10 +306,10 @@
    +
    {% if job.form_template %} - + @@ -299,7 +322,7 @@
    {% if job.metrics.applied %}{{ job.metrics.applied }}{% else %}-{% endif %} {% if job.metrics.screening %}{{ job.metrics.screening }}{% else %}-{% endif %} {% if job.metrics.exam_p %}{{ job.metrics.exam_p }}{% else %}-{% endif %}