From 48f61f173f81858920d2165edf376708d5269adc Mon Sep 17 00:00:00 2001 From: ismail Date: Tue, 7 Oct 2025 17:53:28 +0300 Subject: [PATCH] update the form builder --- .../__pycache__/settings.cpython-313.pyc | Bin 5152 -> 5165 bytes db.sqlite3 | Bin 487424 -> 602112 bytes recruitment/__pycache__/forms.cpython-313.pyc | Bin 18777 -> 20729 bytes .../linkedin_service.cpython-313.pyc | Bin 11109 -> 11109 bytes .../__pycache__/models.cpython-313.pyc | Bin 37614 -> 40793 bytes .../__pycache__/signals.cpython-313.pyc | Bin 10965 -> 10965 bytes recruitment/__pycache__/urls.cpython-313.pyc | Bin 6071 -> 6221 bytes recruitment/__pycache__/utils.cpython-313.pyc | Bin 10658 -> 15295 bytes recruitment/__pycache__/views.cpython-313.pyc | Bin 28898 -> 33092 bytes recruitment/forms.py | 46 +- ...26_interviewschedule_scheduledinterview.py | 60 +++ recruitment/models.py | 43 ++ .../__pycache__/form_filters.cpython-313.pyc | Bin 2653 -> 2515 bytes recruitment/templatetags/form_filters.py | 50 +-- recruitment/urls.py | 1 + recruitment/utils.py | 147 ++++++- recruitment/views.py | 139 +++++- templates/forms/form_builder.html | 231 +++++++--- templates/forms/form_submission_details.html | 394 +++--------------- templates/forms/form_templates_list.html | 1 + .../email/interview_invitation.html | 76 ++++ .../interviews/email/interview_invitation.txt | 23 + templates/interviews/preview_schedule.html | 125 ++++++ templates/interviews/schedule_interviews.html | 97 +++++ 24 files changed, 986 insertions(+), 447 deletions(-) create mode 100644 recruitment/migrations/0026_interviewschedule_scheduledinterview.py create mode 100644 templates/interviews/email/interview_invitation.html create mode 100644 templates/interviews/email/interview_invitation.txt create mode 100644 templates/interviews/preview_schedule.html create mode 100644 templates/interviews/schedule_interviews.html diff --git a/NorahUniversity/__pycache__/settings.cpython-313.pyc b/NorahUniversity/__pycache__/settings.cpython-313.pyc index 345c317d215461bcf974bcc9c6626617c4b4a710..988431b8898dd93c0f2df0cbafbc9a8a90dca444 100644 GIT binary patch delta 82 zcmZ3Wu~vikGcPX}0}wQdJk8+R$eY0=Y+Ym?Y*S@=DO?D7|006u77%~6= delta 69 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 YfB*=900@8p2!H?xfB*=9z^N1X|1~|(?*IS* literal 487424 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

L0Db{Q?%r7(O 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 delta 3416 zcma)8eQZOTD)Hpk1SB8r#%Koiy6MR@J0!e@tQmtxVdcYTEhT zXE#}9)LPLm=bn4cx%ZyW_pfv8y{DP~qteo12mQL)UnVd2pZ3=<^Ypse@}Q%}(d-!a z)j7tC?_>KmiiJBXPG9$y)kyYAVwWss*GhINvHgo|zpsoK<%;vw!2}XDpW0g$G*(mVz+ZJ`yJ<_&bm6fEMEht2Q&a00ZpRUJrimp^4}|u7<@XC zR+DPn47qtBl_v4N`yAUKj(c{p)#6v4E1oVG*_u7G;)JuOmgxPKm#a#`(38h_3$5pw z<%_4&v3OERrwiMJg+?)2{FUY?k(OsxOH8OHUk|T3k)@&qD&ohP-?X^j^R|aW&A^j5qR0fOLwNsG$9O#P-clwqaGwMF$?QdYO%g zXm#BV`2u-%0*WwU1>%YxGr6LtHFzmz8e9dxXv)y^P?0>>^6BbqEG_+~iKnU?SaVj;w{w|zes z3$ZX*oBdMrW2~!CJkH>(#dth}<+FgZ1eS{%vwT3*w}uaXQpTS-1|={fn}jS##DPCa zkY4WgbFIJsG`F9E@+on)E$8-A;_Z^!?E7t-i`bcL`Gzp_*bfo?;b@)hYtlgDe{e?Q zYQpYSghG`{?>*J6YPv1X??z?a^p77zws^Ns9mI>Buhj zir5_q2VNx+s|Y2|AA_CO#L376dtF?Qv~-;W;|Qg znEdNtx&fVl<-@|^@aFo&e75=atIm9*_)o_RZ02XyCCQ~x5%p|m6KUWTG3V(^TXoSRJ?Jd9#fE+zuO{cyNy##nsfE+tW z$nyWo$ga)5U|rddH$TDH8{%u7_jpoJ7!iN!YzaRIGEI=18ZsW1i>3y3U}YkmHx}gG z*^VvcPCGNNh~e(|9kvw zzTsgw&2q<+s-p7|&^{%Rh^d?#oIb(i4W(6E1y*G*Md+!Q=9}p?akKBlRBmu07$JYb zOnV3hwgM0*ZUO!X_%qhHTH3OTbY+@~ zRb1cRwHA#oKV40AI+et*!Tx^!bC|(+Ka&n-&E_KcJNU928FpRbsO!6yrkR=jpeD_?f& ze`0rlAXAnbvioxm;NQj8Hvp)HeE#OABC)L6A^Hx_%M&f$8hUXQ!R7Z7gnXYRw6~7n z4H&v1emlHwjkJmNo=~IZNlYpFgkfjxuf^Wc80!$1M)!?az7Zp#CUGfV31#^)l>v1M zAX7qGMXYk4t3+Aeo@pa7lT`2KF6MC1pCkQMad51uX#5Y3adCW1DgK9JJu8+P{{>Y< B^N#=k diff --git a/recruitment/__pycache__/linkedin_service.cpython-313.pyc b/recruitment/__pycache__/linkedin_service.cpython-313.pyc index 6cd5c87b6d4da363a1eadf04707184db8e864228..5e09bbbc3c6fb1f0fe4db8dfaa16a6251c63750a 100644 GIT binary patch delta 19 ZcmaDF_B4#^GcPX}0}wQdY~+g81^_~H1#SQU delta 19 ZcmaDF_B4#^GcPX}0}%8IY~+g81^_~*1$F=c diff --git a/recruitment/__pycache__/models.cpython-313.pyc b/recruitment/__pycache__/models.cpython-313.pyc index c673a1c5ee53944078f2cc258d731f6dc8cb9f43..ebf02043c27fd5daef979d622f5ae4e013f0dc43 100644 GIT binary patch delta 6775 zcma)A3sjU>lIAwhJQ|wrhK6pQjeyWb@DWVnTjVLAsEsB@v~B1gXz2&uZcthR9D_RM zNvzq#Ofu1AXA+s1iA>KVx|@wLlgxO|jF|>E2mH@wCuh&Nlh;NwF*~!K&Fog)9~vLC zv%@)-x2x*bty@+1yLJCBf2g|rwo3bTa&lr6{{1lTO6NuYQ(6s^&ls`m$3nVSY!DrGG0Zbnn*qTEcrn-&Ef07sI5eU+qB)9dScLY zUIYKEU91+mHIS6@=q;j`Qub)Jla@hI9e0`G&ka`CrF(|$3jIlUl(DYRqlWD&)(5{& z+rr$i(wNB}f(MLi*ul`V#!pnt9Xen-&yxDlfE?p=1SH-SYRX*B$~F>5)9&LQ`(9Vj z!JT{_a;%IWrvDOTwLjnp^!RxU{^b2|CToTIAPu|VMpnP^B^ve-IYHz&66*^1s>ui^ zvgb1wT+E)Q86nA0A^@r!o1WįGrjZ1Pn`LocTlZ&1o%(1ZJ@N&*0>;x>z?P7c2 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

fpG3HS$u7lPP%LZQ zswJ5YeO#<924O`@FaS^1o0u9-*5{g942U6d5v+(u3`s@gDIrADlWZ34PzK(itieQ^ zM$C#}R=LWSEI8U3JIF~9oCrE0M=v;rS)BzjHVtA^G|#Z5Ar_fzMsDs%w`RzOnG@oS zoEg`@;f{lI5sU^2ja>Nk5kH^wINX*Qm~q|=LunDNJyMMd4#^1-hMX7~`uW!wKn0Jq zkwujcC~Hw7CqxW3$q5nn67d=DVxX0RBIilNs?eVsQp^{*%s{ z6}Lv9V>yxbO74rfllkT2`Q>4=Wy$F+XUfmrclN$>tIn;3|kNaKm^ zh$RFF#S^K;CpBk!&kdX%2)A^Mr*;lC3iPl{q*%iFi_f&5^PcsFw|9)EbRvcrvj%TH z>Ep&)Jmj~Ze}$WzI+>g^k(@J?YWz6a^lbjIhUdz{N!F>qVSFtiR-bq+DN3LHl|DhM z9;*4q#9|v6A^@ItvHK0yxiB(P$kxHnMn10;nGoLxDeB6bNqia*?>h0;6R$P#LJ|$D zXdp$qBrv!@1(%=7)~v>uq5=FK#Eu^QUE%d89m~F6qGQXB#n5=!^+F?SWXICJiK71n GApI|?Pel>{ delta 4372 zcmai13viUx73OY|4aw%QfrPwvLm&~@5E2!9@DRv5F@X>gpql{eCi^G(H~Y%{ck@^x z3PcbPFdQxFP+px<309&1SRbP_T4+W`Vs*soUvxsgm2>GV<+Li^GTn!PwyB=NMmPD&pyW@+vZp-s!8{J470!m z!va_9xz|7pi4&XX5VbXJ90;)6hstQ-mfY)fB@+#skcz z<|gfD%&9&%rAfznU~0-5QwOSOk#^puX!?%s(65h6t#S|VgZ`A|tY1BsGNxl4>eFej zu((Y^-C_4j+^KHLSj-A)X~fX#&%+T5PyFZ}tNc`lRU^H`y zzMn)V%rf<*93`=b;4r}<1j`b5%a{UhnDSXWd~eD#?4y|hg8finuD_YqXfdU@hjLkR zIrwAroo4s>Tyl%uFMB;U*`xS*poL_G_rPg$Hai4wn|HCpupz61`QWvzf(#c~z9KbL}XqS|a#)vNJ;P=1(L`B!7bjembwkw%9!mnOIe{h`YVbCnC6&)EYsVyJr!t zz;r345pkl+P(n*0WyGk+8=4Bnl=ax%*~AUnsDefL=5#SBbjPzt=z=f5BK>YM&O}aG z!ahWPHNju$qx`vmI*^jBud%Y+4qOs_p24R+gPz+I}(?l&~xE9x42-fb$FAH~$ycVZJj`zmWwO{Atm~B_gm7 z$mu8n`Qt+*3!HksLN9;C9=2 zFMo~(qeb3Jj!^9ow4Q>O7Qe_|f$k-9N(BF6XM#hbkEfFR3<4K@&LlWXa1KEn;qnlN z!!$UoezN30IyS6+xJ+WEF&xsO8f3pq;-913fV=m4{F2Adzk-cL^Vpa0P?1R=${WlU zD?}GpvG1U+IE^g@XR+fdTkT|fB3qY>t@R>!;(`k$5qoq?*vm7tf!HqDA$e^s+0(&u zF%T`XRmKes(VA$2R|tMja1()xa#g>OLS6{ZmK-~1_&u)<262FXVwaKLcE~*NzhD+sh*%g>p(ZH&}8@y|J=;XC1zpyYdn&ApFD}qle z@(klKt$>Wm8M$YKX~$L5l)GGnHreTwJ+=UM@#nx+S!te6;iUwqK>L!>Se4;tgO9IMuT&irKAK zCtImLE8Kzh@XAakvy`EV4sB(J>qIOLXoYaT)&vc;D-1348DYm)(g{!1KDlB#Ey^Yk z6pDPNjNm5;h6u!oi^CQ-B1TqhcC7tfQuy#mMh6v8{cY2yOyN>I*gl%iK>(fZ$PrM+hE9SZT?^ z9wGTYPBdzU@~X0$Qd@&{RayOYoC-1or<8MoQ!UD6Z@YK5CKx=Q&&!^P2 zvZ%!=fo8Yt_v1^_+{rc9l1(#E)DpwZl*ezA+;-V@eHA@Ox(DHK+Y{`d zxIXpm%@o=n)N%Z*e=LyEI;vMw)qPUNPBo4v> z?_oA5xLW1QVX@dNP*pAu&V?)0>F~?Wsd%RbJF}3)5Is2%#p`rWGkCZ@l?{Q9-#4w7 zEZulZTo9!=s>gTjBc&Tk$+eQ`3p8VY%wMI$pk&YtO1m9%9lLga`}GI>GFf>U-d5V# z%j#mkF@mjwn(n3eeC+NvBcAA9ggDxLTZ%YSY9)CY!C_iB1_eD;p}$5#GqAO1$SA7C zxMnr1?yW^5$9l_+&9)i_4vSW zJA54MOk78yMu(;qY)bFhl&5#lZd+r17xA9n4Wq5qyN4Z`W2Q}yqW_&&V8bDmMOtKy=GJNARPV;5=uqI%P=XBfMv zUfA8ovYODl{1WBBT_`mK4MlB|r=>T0r5&5PO7QMU*I%Jk|Af7J3bE*(*^`+;X{Z^R zU3O20O*|43H<1ISG=x(W5k+J<4gp>PbhO>}D z=1uVRzO&IJuC(OBUk~Q8O8D{M<%PpExsXhi6Nn0-kR(c)D08AxiJLD@O_16&3Gxn^ b44FtIDo;{An*?=-Mq|I7WMn3ugCqX~=?$Ku diff --git a/recruitment/__pycache__/signals.cpython-313.pyc b/recruitment/__pycache__/signals.cpython-313.pyc index df8b0cd633c1060f77bc5bdfd9539192876cd510..71ee1e2a18779770d2834d057cf29b5d155e947d 100644 GIT binary patch delta 19 ZcmcZ_dNq{mGcPX}0}wQdY~(tv1pq+s1-k$M delta 19 ZcmcZ_dNq{mGcPX}0}y=X-^g`Z3jjld1}Fdk diff --git a/recruitment/__pycache__/urls.cpython-313.pyc b/recruitment/__pycache__/urls.cpython-313.pyc index 45ba5c0c6ea3983a4dc8f45eca10b20cd82ef9f3..3d7de9551256c93dbfaa29af51bd9c397a6af11f 100644 GIT binary patch delta 1343 zcmZ{jPf!|H9LIU^K#Wn*WkHH8D1u;sB?cRnDq2N!ql8FEJ4ztNF#aPt1Cpd^qtlzc zCG##!4v9UqVRGou;n3ddz0=IT$zi9NaeC;V>7g^-Ond09-F+{PJ+wQ!KYrie=llD; zee;&D`0v84f3&uq(J0qX?w{9>AGO-R^q2kjK^t7;)asiHeGA@4tJ*M1Ykz$7#DOmA z5{<{Yb^vsZ=glv{~C1Z|2z#>lNSt-#j=Vgd)j}JrLWUDC4MdE&o}0cOCajm+__oi z-zgU>Yolry=gX_>gM` zsD=w_h@cl8%Ohze1NOf!2LL$Mbd#Go);MJ-fOhTo(0I`Oa8I&Eur=~^6vKq9 z6VT1hUb{+PpV8=>54b8T+5Fh%ub;(mOl}d-)6TA8!c7Vno4cz8i3?#aRL^4guG~S8 zg`i-qBJpv|$Hn;^hI!d4px-;~KtL^wy_fhn;tSV3(qIY?ro{J(7~Ynhg!Q5T<7je| zybq-quE|4kFZzbDoxO+Q2Xa3t_|Rj9)A|MU1Jh?9m4IU5VnLFJ$P(UKo8(JiUqVdY zz;H$82@4Yzs<%nu3=U_+>@J2C`8;87qe*jj;3CO~iO*imNse*s7?&I~*fI0cF)Lms z!$yc{6n$dmv{3=QFu!??arA|mYl;y%js7w_jB!B3405neK0(DSAk+J6tmKble_Zk} zVE@8P|7G#o8iwog9JL8(i*+QCPxoSze%Y5!G4Nou=X{wYm;H z&qAMu>U$W@$Qg>3(66k^xJ*SBnJiZ0bt-a1goUJ+}*@M^~tS2#? zk~b*ar0`rVBL!nP7(3d=Fe7hKSXALb*TW%+31B85UYNyjPQFdyHtp;=9Fp8)*gYmr zlMU@qS^^ro`mOnD9%*0#4@?|APzRSO-9>*}*!>C>cj%zl5i3pR@MKObC_CPl?^1f7 zQu6i@Y>$Z16oyyi4=MeKQtnVMxrVW8Sd67HyedDSbdOT9xi}6gA2m7reMv1WP#F3oXk2Yc7+*cf9QV!#j5+5yM4Y)nkNyh?Cg9&t@kA;g3LF`;Q` z0;+o96cNpZQwyhXbmc>GL_OsaX-6DJMa`*IFO{n4<5X2@cV}`)R=cC`KfnL?eKWJW zFZ-UwtbbXp=MCC5{qHZg*Pd8i!1w*7Z6F9!UbHX7&@(Uzd@Sm3`Wamj3QxXmYwQXw z0Kmp$=m0Int3^vvm;`0uHxyHd8l4wDcw;7AhEopox3NPoPGwo0UQ+Z}< ztO=U8=0zskXXqPS)#TKr-1yTbfu3$X?$L){eF$sAneEnk?e6@8>h?lyasKn_(t}!5 zn?{jV7aDDyN#4)|(4NhQMuUM00DxBp54-KJ4DA#u;N7Mlp=HmrzeAjH?2JE8VR)Si z3i_$l4;1uYt1F><{&>e=Jg1%u9G0F|jw;W?y2;9bjRDWW67fc{H(D=an4=dIG;Vim z`Bl4nnAt8eoBuFRf+-wKskst{A5%ADK8@|Q9kdX60LueJ&SE)xD(6&X7Q;E(!90HS ztKDl3usDdC9bR)Mi@Q*t7GGjE3r=CHzFoWSN&2!r@IuqM1*SRPl zAhlN%E=G8Pu45w!4dKv`Ix>ghO*+cyq)xR1G!i+4<&YZ7V3?&hIGp0CzQfL^(W7X6 z2g6}nA8Z!&P3U z<1j%2X&gwa*Vu0Fa=O83=(v;gWN}aS160r|Bk#_kqEq zf5n*-kqlPwU`1Whj$@Z@ar^~Ros#8CF1FF{PD%NSi-){w?{SGl@;H)L$3Deyfj;7N bhtv1!c@m$%@d>rW&SaO-ubXQhYX9H=rtV*v diff --git a/recruitment/__pycache__/utils.cpython-313.pyc b/recruitment/__pycache__/utils.cpython-313.pyc index 4a8959a020b7ea23f61a6b03eccf5f18daf7841d..0ce0d33da0f3d77a1b4f341849e0751a2eb22eb9 100644 GIT binary patch delta 6102 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 delta 1671 zcmZuyO>7%Q6yEiE*Ip-f>?F36IK_^eG~T2kA%&_xs7R=)P%EOUTTu>?oK1E~oY-FX z&4y45FhYeQDpgc-Xb+sYL>)XN%Z1qsK>l?X({I|@

7_iN$y+FiCbwk`{Zf<$0<&U`O^mF>Q22f~2V< zrpy>(zuAL0VD=&onkh3rBCX4iHWN6{n0<&@Gl@8~su=yxDZ3&2TFtecD#KBfIi6Rk zud?>v^6ikUayR@)9YU|^_ABaBWqJ&U&B)Ty(mHeN5TTiZvu45paG?MWYq)jh7(Jl# zqHfD^en&r+rYOiDFcqOd4`lfddQm-%^E2%~^asl2Gvss@!4I#y%gk30;T##yBd{of zh!nx()^A&EZP~TJF0WYC>aw-60dL`g)BZ7jGbF#nPbJ??O`rizkbBtL^wwaKf1Pwk zrpP)?Fh?*$>&mL*L7Y#drpCHK@HQ>KiomGW&i9dfBb8C#LCaSAZt7Gx=SRIt&1t%I z2f`FFLXaaE<-exqG?8$I$1*ogRMG0kYK}uPmn$~Z$<0MD!oJ2l%iCmN@H?54av%RT zGuFCE>jp(dY{#=IRkj_1u5rPL01<&BN`g2=Da->y2b-MUBUmL^AOHfvjY{-;_gLAM zX9fGEOPHfmw%9Z)JFMP9=X>o|_9q2<4Ks8Ky`GyJpk%(*u)wM@n54xG{vbD>?(&6? z$@n2bAAgoBwmcfXkFc&>zAsJVdG7*>w0Emm}@(3U4U+1FEADZWB}xp8rgv4W1r9 zu92iD@rChXx!WJU+OWKpwLn*$9H{dTh#Ro=dp8>>oMQ*_{fGPiX!FP8!|Gj3G~eDC z=b@2flv7X?#6F|x7X%yp%gN)dfEdo3!InN diff --git a/recruitment/__pycache__/views.cpython-313.pyc b/recruitment/__pycache__/views.cpython-313.pyc index dc13da4d3a8a5fa258dc22706fb43fb0de11d90a..b67b9f3c9a38a0c37d46e42773a590dcdbbfa983 100644 GIT binary patch delta 9195 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 TPV)}lcxRB`s^N|7e_r^1UJ2xD delta 5643 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 diff --git a/recruitment/forms.py b/recruitment/forms.py index 220e76c..5ccb8d2 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -4,7 +4,7 @@ from crispy_forms.helper import FormHelper from django.core.validators import URLValidator from django.utils.translation import gettext_lazy as _ from crispy_forms.layout import Layout, Submit, HTML, Div, Field -from .models import ZoomMeeting, Candidate,TrainingMaterial,JobPosting,FormTemplate +from .models import ZoomMeeting, Candidate,TrainingMaterial,JobPosting,FormTemplate,InterviewSchedule class CandidateForm(forms.ModelForm): class Meta: @@ -408,4 +408,48 @@ class FormTemplateForm(forms.ModelForm): Field('description', css_class='form-control'), Field('is_active', css_class='form-check-input'), Submit('submit', _('Create Template'), css_class='btn btn-primary mt-3') + ) + +class InterviewScheduleForm(forms.ModelForm): + candidates = forms.ModelMultipleChoiceField( + queryset=Candidate.objects.none(), + widget=forms.CheckboxSelectMultiple, + required=True + ) + working_days = forms.MultipleChoiceField( + choices=[ + (0, 'Monday'), + (1, 'Tuesday'), + (2, 'Wednesday'), + (3, 'Thursday'), + (4, 'Friday'), + (5, 'Saturday'), + (6, 'Sunday'), + ], + widget=forms.CheckboxSelectMultiple, + required=True + ) + + class Meta: + model = InterviewSchedule + fields = [ + 'candidates', 'start_date', 'end_date', 'working_days', + 'start_time', 'end_time', 'break_start_time', 'break_end_time', + 'interview_duration', 'buffer_time' + ] + widgets = { + 'start_date': forms.DateInput(attrs={'type': 'date'}), + 'end_date': forms.DateInput(attrs={'type': 'date'}), + 'start_time': forms.TimeInput(attrs={'type': 'time'}), + 'end_time': forms.TimeInput(attrs={'type': 'time'}), + 'break_start_time': forms.TimeInput(attrs={'type': 'time'}), + 'break_end_time': forms.TimeInput(attrs={'type': 'time'}), + } + + def __init__(self, slug, *args, **kwargs): + super().__init__(*args, **kwargs) + # Filter candidates based on the selected job + self.fields['candidates'].queryset = Candidate.objects.filter( + job_slug=slug, + stage='Interview' ) \ No newline at end of file diff --git a/recruitment/migrations/0026_interviewschedule_scheduledinterview.py b/recruitment/migrations/0026_interviewschedule_scheduledinterview.py new file mode 100644 index 0000000..08541f3 --- /dev/null +++ b/recruitment/migrations/0026_interviewschedule_scheduledinterview.py @@ -0,0 +1,60 @@ +# Generated by Django 5.2.6 on 2025-10-07 14:12 + +import django.db.models.deletion +import django_extensions.db.fields +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0025_formfield_max_files_formfield_multiple_files'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='InterviewSchedule', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')), + ('slug', django_extensions.db.fields.RandomCharField(blank=True, editable=False, length=8, unique=True, verbose_name='Slug')), + ('start_date', models.DateField(verbose_name='Start Date')), + ('end_date', models.DateField(verbose_name='End Date')), + ('working_days', models.JSONField(verbose_name='Working Days')), + ('start_time', models.TimeField(verbose_name='Start Time')), + ('end_time', models.TimeField(verbose_name='End Time')), + ('break_start_time', models.TimeField(blank=True, null=True, verbose_name='Break Start Time')), + ('break_end_time', models.TimeField(blank=True, null=True, verbose_name='Break End Time')), + ('interview_duration', models.PositiveIntegerField(verbose_name='Interview Duration (minutes)')), + ('buffer_time', models.PositiveIntegerField(default=0, verbose_name='Buffer Time (minutes)')), + ('candidates', models.ManyToManyField(related_name='interview_schedules', to='recruitment.candidate')), + ('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interview_schedules', to='recruitment.jobposting')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='ScheduledInterview', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), + ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')), + ('slug', django_extensions.db.fields.RandomCharField(blank=True, editable=False, length=8, unique=True, verbose_name='Slug')), + ('interview_date', models.DateField(verbose_name='Interview Date')), + ('interview_time', models.TimeField(verbose_name='Interview Time')), + ('status', models.CharField(choices=[('scheduled', 'Scheduled'), ('confirmed', 'Confirmed'), ('cancelled', 'Cancelled'), ('completed', 'Completed')], default='scheduled', max_length=20)), + ('candidate', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scheduled_interviews', to='recruitment.candidate')), + ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scheduled_interviews', to='recruitment.jobposting')), + ('schedule', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='interviews', to='recruitment.interviewschedule')), + ('zoom_meeting', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='interview', to='recruitment.zoommeeting')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/recruitment/models.py b/recruitment/models.py index 2619a0b..88fa105 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -714,3 +714,46 @@ class HiringAgency(Base): verbose_name = _('Hiring Agency') verbose_name_plural = _('Hiring Agencies') ordering = ['name'] + + + +class InterviewSchedule(Base): + """Stores the scheduling criteria for interviews""" + job = models.ForeignKey(JobPosting, on_delete=models.CASCADE, related_name='interview_schedules') + candidates = models.ManyToManyField(Candidate, related_name='interview_schedules') + start_date = models.DateField(verbose_name=_('Start Date')) + end_date = models.DateField(verbose_name=_('End Date')) + working_days = models.JSONField(verbose_name=_('Working Days')) # Store days of week as [0,1,2,3,4] for Mon-Fri + start_time = models.TimeField(verbose_name=_('Start Time')) + end_time = models.TimeField(verbose_name=_('End Time')) + break_start_time = models.TimeField(verbose_name=_('Break Start Time'), null=True, blank=True) + break_end_time = models.TimeField(verbose_name=_('Break End Time'), null=True, blank=True) + interview_duration = models.PositiveIntegerField(verbose_name=_('Interview Duration (minutes)')) + buffer_time = models.PositiveIntegerField(verbose_name=_('Buffer Time (minutes)'), default=0) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) + + def __str__(self): + return f"Interview Schedule for {self.job.title}" + +class ScheduledInterview(Base): + """Stores individual scheduled interviews""" + candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE, related_name='scheduled_interviews') + job = models.ForeignKey(JobPosting, on_delete=models.CASCADE, related_name='scheduled_interviews') + zoom_meeting = models.OneToOneField(ZoomMeeting, on_delete=models.CASCADE, related_name='interview') + schedule = models.ForeignKey(InterviewSchedule, on_delete=models.CASCADE, related_name='interviews') + interview_date = models.DateField(verbose_name=_('Interview Date')) + interview_time = models.TimeField(verbose_name=_('Interview Time')) + status = models.CharField( + max_length=20, + choices=[ + ('scheduled', _('Scheduled')), + ('confirmed', _('Confirmed')), + ('cancelled', _('Cancelled')), + ('completed', _('Completed')), + ], + default='scheduled' + ) + + + def __str__(self): + return f"Interview with {self.candidate.name} for {self.job.title}" \ No newline at end of file diff --git a/recruitment/templatetags/__pycache__/form_filters.cpython-313.pyc b/recruitment/templatetags/__pycache__/form_filters.cpython-313.pyc index 76ea8d45d06445a32b1d79dda8d28ed58d54b840..a5b4be1d95a3ea5aa300882d7da19d8b2edd9430 100644 GIT binary patch delta 1148 zcmZ`&PfXKb6o2j7wcF@GHz*S2PsT>4pfUrQV`(CWI28mphXizSVc;-YNC#0lI5-$N zcra;<^#&$}T}?cA1TT6r?KEk#%;-UnCJ;=x`h8m#2k1Ne`o8!5-tT+weP6%2Kf9be z9A^h)J4b(}6Sgl;_$w0#G0DCy(KRAc?a0p7-B;91pqAXi@zJ|M~}%cP5-adID9ol*9qrGe~?4-+w~WId?T#q2LO*@W7s zqW{w6(Cm&KVkPFF4q^LmHO{@2;1#OIF0s`rF^6)M=7~Dx1bu|79(YYDepvZM@m~9I z?ca&ueqv6E!AfyTvc)*b9w(yp%4@pCUwhKpLzK^LMOQtP0&qadTP%BVq8o|&JzmnksmWF|R3FUuU>L(c~60;Sh$ZOyv>d zJ6*8JQ<=G0DKnKRuoYKsz*HVXF z(C~!xnwFKwx7x;)hs9R^v&av=S$&Y>4Zb_icfY;;F8z@)dPnlTBgOFfjmU>9n^&}J z<3@Nw4^OO)ttZwJhBuh^2DQlOX;achZyI7k7Za=Lb!km9 ze4)HAq@^;dqd0P18@pwUP3vRRTL3e}IdT`^D$!4Fmp>KxOS<>c7w;hAM95LHB3{zI zWr#^#Os)pk#WfN2lJ|tP+jmvA7&!Y**vMWm0)u*BaFtzmzH(~Oag{FiU;HR&*Cvhr zl-{4pv4$Y#1yQ>rz2v@kbmh{yam^c4?WV6sb(r20$nyv)Yqkn1Z3>+#_ubuQxCPxU zn7-3yM*w4cr`hH+{k_{9bG%^}n0o%V2ilHr(?GTNZS^WIY?oW`MacMvlpPps2nuZY Q-fU{&?vyBd6~cbw4~QECk^lez delta 1237 zcmZuvL2MI86rEkKvv%-K?5yKBfne5Nl1&9$k;aj6C8J6WSz(7DZ`=ryh?v&YEn<_d zgWv#!TRHTw(Wp||3+6_ z`MV?j7KZ-_LN6fpa_f)sp6?0FvgIE<0Q?9(1_o0A3gw8+FvVX0SY-CU04RVw$$H;( zCV7zYL6&W^y2ndOQOFa9?a(nQ$)lTWY{mfK1`EJiqTmrpW332)!7cjR%?g~(B?(Wh z<9af=UT2OM{ml-Z?ug`DbMDu*QSW(QsTd){ars^p;zTBZ98MhMbiTks@Cj>pJ3F9F zE*#Z;9~Ph_dc{S8y5H#OuIlZo8m4V&m6{jZw|jdg58OFMKVzmwY6o!WY(2vt_}pwTe&5sbbO%qiE0eT$niK00lA= z7#B>A91YLcrS(>{;r(X4biLBx%f(7@ecd$sXljT;kU~EN`lMz{D1yBF=tm|bfrhW$ z&5TlhhyvNeLFRr-w8)>@kVud!RyN7+eGlvgz`)?W+28p{(nu1`tT^0ChO9qeYs>`HSE%=y}V|fYoF2R6RarudG_xW=^-~m+<@*Xa0)))oq-+ zzm~1(W@frpwl7@9nH49qQq{1WuFGlr>bIM-ZxZ9%%J#4=Ot<8 diff --git a/recruitment/templatetags/form_filters.py b/recruitment/templatetags/form_filters.py index 6cbf01e..bf10384 100644 --- a/recruitment/templatetags/form_filters.py +++ b/recruitment/templatetags/form_filters.py @@ -22,31 +22,31 @@ def get_all_responses_flat(stage_responses): """ all_responses = [] if stage_responses: - print(stage_responses.get(9).get("responses")[0].value) for stage_id, responses in stage_responses.items(): - for response in responses: - # Check if response is an object or string - if hasattr(response, 'stage') and hasattr(response, 'field'): - stage_name = response.stage.name if hasattr(response.stage, 'name') else f"Stage {stage_id}" - field_label = response.field.label if hasattr(response.field, 'label') else "Unknown Field" - field_type = response.field.get_field_type_display() if hasattr(response.field, 'get_field_type_display') else "Unknown Type" - required = response.field.required if hasattr(response.field, 'required') else False - value = response.value if hasattr(response, 'value') else response - uploaded_file = response.uploaded_file if hasattr(response, 'uploaded_file') else None - else: - stage_name = f"Stage {stage_id}" - field_label = "Unknown Field" - field_type = "Text" - required = False - value = response - uploaded_file = None + if responses: # Check if responses list exists and is not empty + for response in responses: + # Check if response is an object or string + if hasattr(response, 'stage') and hasattr(response, 'field'): + stage_name = response.stage.name if hasattr(response.stage, 'name') else f"Stage {stage_id}" + field_label = response.field.label if hasattr(response.field, 'label') else "Unknown Field" + field_type = response.field.get_field_type_display() if hasattr(response.field, 'get_field_type_display') else "Unknown Type" + required = response.field.required if hasattr(response.field, 'required') else False + value = response.value if hasattr(response, 'value') else response + uploaded_file = response.uploaded_file if hasattr(response, 'uploaded_file') else None + else: + stage_name = f"Stage {stage_id}" + field_label = "Unknown Field" + field_type = "Text" + required = False + value = response + uploaded_file = None - all_responses.append({ - 'stage_name': stage_name, - 'field_label': field_label, - 'field_type': field_type, - 'required': required, - 'value': value, - 'uploaded_file': uploaded_file - }) + all_responses.append({ + 'stage_name': stage_name, + 'field_label': field_label, + 'field_type': field_type, + 'required': required, + 'value': value, + 'uploaded_file': uploaded_file + }) return all_responses diff --git a/recruitment/urls.py b/recruitment/urls.py index a1c2404..d0c9b05 100644 --- a/recruitment/urls.py +++ b/recruitment/urls.py @@ -18,6 +18,7 @@ urlpatterns = [ path('jobs/linkedin/login/', views.linkedin_login, name='linkedin_login'), path('jobs/linkedin/callback/', views.linkedin_callback, name='linkedin_callback'), + path('jobs//schedule-interviews/', views.schedule_interviews_view, name='schedule_interviews'), # Candidate URLs path('candidates/', views_frontend.CandidateListView.as_view(), name='candidate_list'), path('candidates/create/', views_frontend.CandidateCreateView.as_view(), name='candidate_create'), diff --git a/recruitment/utils.py b/recruitment/utils.py index 3524a1a..a4b3b06 100644 --- a/recruitment/utils.py +++ b/recruitment/utils.py @@ -4,7 +4,11 @@ # import requests from recruitment import models from django.conf import settings - +from datetime import datetime, timedelta, time, date +from django.utils import timezone +from .models import ScheduledInterview +from django.template.loader import render_to_string +from django.core.mail import send_mail # nlp = spacy.load("en_core_web_sm") # def extract_text_from_pdf(pdf_path): @@ -53,7 +57,7 @@ def extract_text_from_pdf(file_path): raise return text.strip() -def score_resume_with_openrouter(prompt): +def score_resume_with_openrouter(prompt): print("model call") response = requests.post( url="https://openrouter.ai/api/v1/chat/completions", @@ -63,7 +67,7 @@ def score_resume_with_openrouter(prompt): }, data=json.dumps({ "model": OPENROUTER_MODEL, - "messages": [{"role": "user", "content": prompt}], + "messages": [{"role": "user", "content": prompt}], }, ) ) @@ -75,15 +79,15 @@ def score_resume_with_openrouter(prompt): res = response.json() content = res["choices"][0]['message']['content'] try: - + content = content.replace("```json","").replace("```","") - + res = json.loads(content) - + except Exception as e: print(e) - # res = raw_output["choices"][0]["message"]["content"] + # res = raw_output["choices"][0]["message"]["content"] else: print("error response") return res @@ -381,4 +385,131 @@ def delete_zoom_meeting(meeting_id): return { "status": "error", "message": str(e) - } \ No newline at end of file + } + +def schedule_interviews(schedule): + """ + Schedule interviews for all candidates in the schedule based on the criteria. + Returns the number of interviews successfully scheduled. + """ + candidates = list(schedule.candidates.all()) + if not candidates: + return 0 + + # Calculate available time slots + available_slots = get_available_time_slots(schedule) + + if len(available_slots) < len(candidates): + raise ValueError(f"Not enough available slots. Required: {len(candidates)}, Available: {len(available_slots)}") + + # Schedule interviews + scheduled_count = 0 + for i, candidate in enumerate(candidates): + slot = available_slots[i] + interview_datetime = datetime.combine(slot['date'], slot['time']) + + # Create Zoom meeting + meeting_topic = f"Interview for {schedule.job.title} - {candidate.name}" + meeting = create_zoom_meeting( + topic=meeting_topic, + start_time=interview_datetime, + duration=schedule.interview_duration, + timezone=timezone.get_current_timezone_name() + ) + + # Create scheduled interview record + scheduled_interview = ScheduledInterview.objects.create( + candidate=candidate, + job=schedule.job, + zoom_meeting=meeting, + schedule=schedule, + interview_date=slot['date'], + interview_time=slot['time'] + ) + + # Send email to candidate + send_interview_email(scheduled_interview) + + scheduled_count += 1 + + return scheduled_count + +def send_interview_email(scheduled_interview): + """ + Send an interview invitation email to the candidate. + """ + subject = f"Interview Invitation for {scheduled_interview.job.title}" + + context = { + 'candidate_name': scheduled_interview.candidate.name, + 'job_title': scheduled_interview.job.title, + 'company_name': scheduled_interview.job.company.name, + 'interview_date': scheduled_interview.interview_date, + 'interview_time': scheduled_interview.interview_time, + 'join_url': scheduled_interview.zoom_meeting.join_url, + 'meeting_id': scheduled_interview.zoom_meeting.meeting_id, + } + + # Render email templates + text_message = render_to_string('interviews/email/interview_invitation.txt', context) + html_message = render_to_string('interviews/email/interview_invitation.html', context) + + # Send email + send_mail( + subject=subject, + message=text_message, + from_email=settings.DEFAULT_FROM_EMAIL, + recipient_list=[scheduled_interview.candidate.email], + html_message=html_message, + fail_silently=False, + ) + +def get_available_time_slots(schedule): + """ + Generate a list of available time slots based on the schedule criteria. + Returns a list of dictionaries with 'date' and 'time' keys. + """ + slots = [] + current_date = schedule.start_date + end_date = schedule.end_date + + # Convert working days to a set for quick lookup + working_days_set = set(schedule.working_days) + + # Parse times + start_time = schedule.start_time + end_time = schedule.end_time + break_start = schedule.break_start_time + break_end = schedule.break_end_time + + # Calculate slot duration (interview duration + buffer time) + slot_duration = timedelta(minutes=schedule.interview_duration + schedule.buffer_time) + + while current_date <= end_date: + # Check if current day is a working day + if current_date.weekday() in working_days_set: + # Generate slots for this day + current_time = start_time + + while current_time + slot_duration <= end_time: + # Check if slot is during break time + if break_start and break_end: + if current_time >= break_start and current_time < break_end: + current_time = break_end + continue + + # Add this slot to available slots + slots.append({ + 'date': current_date, + 'time': current_time + }) + + # Move to next slot + current_datetime = datetime.combine(current_date, current_time) + current_datetime += slot_duration + current_time = current_datetime.time() + + # Move to next day + current_date += timedelta(days=1) + + return slots \ No newline at end of file diff --git a/recruitment/views.py b/recruitment/views.py index b671f81..9b10a33 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -9,17 +9,17 @@ from django.db.models import Q from django.urls import reverse from django.conf import settings from django.utils import timezone -from .forms import ZoomMeetingForm,JobPostingForm,FormTemplateForm +from .forms import ZoomMeetingForm,JobPostingForm,FormTemplateForm,InterviewScheduleForm from rest_framework import viewsets from django.contrib import messages from django.core.paginator import Paginator from .linkedin_service import LinkedInService -from .models import FormTemplate, FormStage, FormField,FieldResponse,FormSubmission +from .models import FormTemplate, FormStage, FormField,FieldResponse,FormSubmission,InterviewSchedule from .models import ZoomMeeting, Candidate, JobPosting from .serializers import JobPostingSerializer, CandidateSerializer from django.shortcuts import get_object_or_404, render, redirect from django.views.generic import CreateView,UpdateView,DetailView,ListView -from .utils import create_zoom_meeting, delete_zoom_meeting, update_zoom_meeting +from .utils import create_zoom_meeting, delete_zoom_meeting, update_zoom_meeting,schedule_interviews,get_available_time_slots from django.views.decorators.csrf import ensure_csrf_cookie import logging @@ -838,3 +838,136 @@ def form_submission_details(request, form_id, submission_id): 'responses': responses, 'stage_responses': stage_responses }) + + + +def schedule_interviews_view(request, slug): + job = get_object_or_404(JobPosting, slug=slug) + + if request.method == 'POST': + form = InterviewScheduleForm(slug, request.POST) + + # Check if this is a confirmation request + if 'confirm_schedule' in request.POST: + # Get the schedule data from session + schedule_data = request.session.get('interview_schedule_data') + if not schedule_data: + messages.error(request, "Session expired. Please try again.") + return redirect('schedule_interviews', slug=slug) + + # Create the interview schedule + schedule = InterviewSchedule.objects.create( + job=job, + created_by=request.user, + **schedule_data + ) + + # Add candidates to the schedule + candidates = Candidate.objects.filter(id__in=schedule_data['candidate_ids']) + schedule.candidates.set(candidates) + + # Schedule the interviews + try: + scheduled_count = schedule_interviews(schedule) + messages.success( + request, + f"Successfully scheduled {scheduled_count} interviews." + ) + # Clear the session data + if 'interview_schedule_data' in request.session: + del request.session['interview_schedule_data'] + return redirect('job_detail', slug=slug) + except Exception as e: + messages.error( + request, + f"Error scheduling interviews: {str(e)}" + ) + return redirect('schedule_interviews', slug=slug) + + # This is the initial form submission + if form.is_valid(): + # Get the form data + candidates = form.cleaned_data['candidates'] + start_date = form.cleaned_data['start_date'] + end_date = form.cleaned_data['end_date'] + working_days = form.cleaned_data['working_days'] + start_time = form.cleaned_data['start_time'] + end_time = form.cleaned_data['end_time'] + break_start_time = form.cleaned_data['break_start_time'] + break_end_time = form.cleaned_data['break_end_time'] + interview_duration = form.cleaned_data['interview_duration'] + buffer_time = form.cleaned_data['buffer_time'] + + # Create a temporary schedule object (not saved to DB) + temp_schedule = InterviewSchedule( + job=job, + start_date=start_date, + end_date=end_date, + working_days=working_days, + start_time=start_time, + end_time=end_time, + break_start_time=break_start_time, + break_end_time=break_end_time, + interview_duration=interview_duration, + buffer_time=buffer_time + ) + + # Get available slots + available_slots = get_available_time_slots(temp_schedule) + + if len(available_slots) < len(candidates): + messages.error( + request, + f"Not enough available slots. Required: {len(candidates)}, Available: {len(available_slots)}" + ) + return render(request, 'interviews/schedule_interviews.html', { + 'form': form, + 'job': job + }) + + # Create a preview schedule + preview_schedule = [] + for i, candidate in enumerate(candidates): + slot = available_slots[i] + preview_schedule.append({ + 'candidate': candidate, + 'date': slot['date'], + 'time': slot['time'] + }) + + # Save the form data to session for later use + schedule_data = { + 'start_date': start_date.isoformat(), + 'end_date': end_date.isoformat(), + 'working_days': working_days, + 'start_time': start_time.isoformat(), + 'end_time': end_time.isoformat(), + 'break_start_time': break_start_time.isoformat() if break_start_time else None, + 'break_end_time': break_end_time.isoformat() if break_end_time else None, + 'interview_duration': interview_duration, + 'buffer_time': buffer_time, + 'candidate_ids': [c.id for c in candidates] + } + request.session['interview_schedule_data'] = schedule_data + + # Render the preview page + return render(request, 'interviews/preview_schedule.html', { + 'job': job, + 'schedule': preview_schedule, + 'start_date': start_date, + 'end_date': end_date, + 'working_days': working_days, + 'start_time': start_time, + 'end_time': end_time, + 'break_start_time': break_start_time, + 'break_end_time': break_end_time, + 'interview_duration': interview_duration, + 'buffer_time': buffer_time + }) + else: + form = InterviewScheduleForm(slug=slug) + + return render(request, 'interviews/schedule_interviews.html', { + 'form': form, + 'job': job + }) \ No newline at end of file diff --git a/templates/forms/form_builder.html b/templates/forms/form_builder.html index a3217a6..df6d614 100644 --- a/templates/forms/form_builder.html +++ b/templates/forms/form_builder.html @@ -1112,46 +1112,47 @@ state.draggedStageIndex = null; } // DOM Elements - const elements = { - stageNav: document.getElementById('stageNav'), - formStage: document.getElementById('formStage'), - emptyState: document.getElementById('emptyState'), - fieldEditor: document.getElementById('fieldEditor'), - currentStageTitle: document.getElementById('currentStageTitle'), - stageNameDisplay: document.getElementById('stageNameDisplay'), - stageRequiredIndicator: document.getElementById('stageRequiredIndicator'), - stagePredefinedBadge: document.getElementById('stagePredefinedBadge'), - addStageBtn: document.getElementById('addStageBtn'), - saveFormBtn: document.getElementById('saveFormBtn'), - renameStageBtn: document.getElementById('renameStageBtn'), - renameModal: document.getElementById('renameModal'), - stageName: document.getElementById('stageName'), - closeRenameModal: document.getElementById('closeRenameModal'), - cancelRenameBtn: document.getElementById('cancelRenameBtn'), - saveRenameBtn: document.getElementById('saveRenameBtn'), - fieldLabel: document.getElementById('fieldLabel'), - fieldPlaceholder: document.getElementById('fieldPlaceholder'), - placeholderGroup: document.getElementById('placeholderGroup'), - requiredField: document.getElementById('requiredField'), - optionsEditor: document.getElementById('optionsEditor'), - optionsList: document.getElementById('optionsList'), - addOptionBtn: document.getElementById('addOptionBtn'), - fileSettings: document.getElementById('fileSettings'), - fileTypes: document.getElementById('fileTypes'), - maxFileSize: document.getElementById('maxFileSize'), - closeEditorBtn: document.getElementById('closeEditorBtn'), - // Form settings elements - formTitle: document.getElementById('formTitle'), - formSettingsBtn: document.getElementById('formSettingsBtn'), - formSettingsModal: document.getElementById('formSettingsModal'), - formName: document.getElementById('formName'), - formDescription: document.getElementById('formDescription'), - formActive: document.getElementById('formActive'), - closeFormSettingsModal: document.getElementById('closeFormSettingsModal'), - cancelFormSettingsBtn: document.getElementById('cancelFormSettingsBtn'), - saveFormSettingsBtn: document.getElementById('saveFormSettingsBtn') - }; - +const elements = { + stageNav: document.getElementById('stageNav'), + formStage: document.getElementById('formStage'), + emptyState: document.getElementById('emptyState'), + fieldEditor: document.getElementById('fieldEditor'), + currentStageTitle: document.getElementById('currentStageTitle'), + stageNameDisplay: document.getElementById('stageNameDisplay'), + stageRequiredIndicator: document.getElementById('stageRequiredIndicator'), + stagePredefinedBadge: document.getElementById('stagePredefinedBadge'), + addStageBtn: document.getElementById('addStageBtn'), + saveFormBtn: document.getElementById('saveFormBtn'), + renameStageBtn: document.getElementById('renameStageBtn'), + renameModal: document.getElementById('renameModal'), + stageName: document.getElementById('stageName'), + closeRenameModal: document.getElementById('closeRenameModal'), + cancelRenameBtn: document.getElementById('cancelRenameBtn'), + saveRenameBtn: document.getElementById('saveRenameBtn'), + fieldLabel: document.getElementById('fieldLabel'), + fieldPlaceholder: document.getElementById('fieldPlaceholder'), + placeholderGroup: document.getElementById('placeholderGroup'), + requiredField: document.getElementById('requiredField'), + optionsEditor: document.getElementById('optionsEditor'), + optionsList: document.getElementById('optionsList'), + addOptionBtn: document.getElementById('addOptionBtn'), + fileSettings: document.getElementById('fileSettings'), + fileTypes: document.getElementById('fileTypes'), + maxFileSize: document.getElementById('maxFileSize'), + multipleFiles: document.getElementById('multipleFiles'), + maxFiles: document.getElementById('maxFiles'), + closeEditorBtn: document.getElementById('closeEditorBtn'), + // Form settings elements + formTitle: document.getElementById('formTitle'), + formSettingsBtn: document.getElementById('formSettingsBtn'), + formSettingsModal: document.getElementById('formSettingsModal'), + formName: document.getElementById('formName'), + formDescription: document.getElementById('formDescription'), + formActive: document.getElementById('formActive'), + closeFormSettingsModal: document.getElementById('closeFormSettingsModal'), + cancelFormSettingsBtn: document.getElementById('cancelFormSettingsBtn'), + saveFormSettingsBtn: document.getElementById('saveFormSettingsBtn') +}; // Utility Functions function getFieldIcon(type) { const icons = { @@ -1443,7 +1444,6 @@ fileUpload.appendChild(uploadedFile); }); } - fieldContent.appendChild(fileUpload); } else if (field.type === 'select') { const select = document.createElement('select'); @@ -1515,18 +1515,16 @@ }); }); - // Make draggable + // Make draggable for reordering fieldDiv.draggable = true; fieldDiv.addEventListener('dragstart', (e) => { state.draggedFieldIndex = parseInt(fieldDiv.dataset.fieldIndex); e.dataTransfer.setData('text/plain', 'reorder'); e.dataTransfer.effectAllowed = 'move'; }); - fieldDiv.addEventListener('dragover', (e) => { e.preventDefault(); }); - fieldDiv.addEventListener('drop', (e) => { e.preventDefault(); const targetIndex = parseInt(fieldDiv.dataset.fieldIndex); @@ -1536,21 +1534,30 @@ // Add file input event listener const fileInput = fieldDiv.querySelector('.file-input'); if (fileInput) { - fileInput.addEventListener('change', (e) => { + // Remove any existing listeners to prevent duplicates + const newFileInput = fileInput.cloneNode(true); + fileInput.parentNode.replaceChild(newFileInput, fileInput); + + newFileInput.addEventListener('change', (e) => { handleFileUpload(e, field); }); // Make the file upload area clickable const fileUploadArea = fieldDiv.querySelector('.file-upload-area'); if (fileUploadArea) { - fileUploadArea.addEventListener('click', () => { - fileInput.click(); + // Remove any existing listeners + const newFileUploadArea = fileUploadArea.cloneNode(true); + fileUploadArea.parentNode.replaceChild(newFileUploadArea, fileUploadArea); + + newFileUploadArea.addEventListener('click', () => { + newFileInput.click(); }); } } return fieldDiv; } + function handleFileUpload(event, field) { const files = Array.from(event.target.files); if (files.length === 0) return; @@ -1860,59 +1867,106 @@ function handleFileUpload(event, field) { // Initialize Event Listeners function initEventListeners() { - // Sidebar drag start - document.querySelectorAll('.field-item').forEach(item => { + // Wait for DOM to be fully loaded + setTimeout(() => { + // Sidebar drag start - ensure elements exist + const fieldItems = document.querySelectorAll('.field-item'); + fieldItems.forEach(item => { + if (!item.hasAttribute('data-drag-initialized')) { item.addEventListener('dragstart', (e) => { const type = item.dataset.type; const label = item.dataset.label; startDrag(e, type, label); }); - }); - // Form stage drop zone + item.setAttribute('data-drag-initialized', 'true'); + } + }); + + // Form stage drop zone + if (elements.formStage) { elements.formStage.addEventListener('drop', drop); elements.formStage.addEventListener('dragover', allowDrop); elements.formStage.addEventListener('dragenter', dragEnter); elements.formStage.addEventListener('dragleave', dragLeave); elements.formStage.addEventListener('click', clearSelection); - // Button events + } + + // Button events + if (elements.addStageBtn) { elements.addStageBtn.addEventListener('click', addStage); + } + if (elements.saveFormBtn) { elements.saveFormBtn.addEventListener('click', saveForm); + } + if (elements.renameStageBtn) { elements.renameStageBtn.addEventListener('click', () => { - openRenameModal(state.stages[state.currentStage]); + if (state.stages[state.currentStage]) { + openRenameModal(state.stages[state.currentStage]); + } }); - // Form settings button + } + + // Form settings button + if (elements.formSettingsBtn) { elements.formSettingsBtn.addEventListener('click', openFormSettingsModal); - // Modal events + } + + // Modal events - Stage Rename + if (elements.closeRenameModal) { elements.closeRenameModal.addEventListener('click', closeRenameModal); + } + if (elements.cancelRenameBtn) { elements.cancelRenameBtn.addEventListener('click', closeRenameModal); + } + if (elements.saveRenameBtn) { elements.saveRenameBtn.addEventListener('click', saveStageName); + } + if (elements.renameModal) { elements.renameModal.addEventListener('click', (e) => { if (e.target === elements.renameModal) { closeRenameModal(); } }); - // Form settings modal events + } + + // Form settings modal events + if (elements.closeFormSettingsModal) { elements.closeFormSettingsModal.addEventListener('click', closeFormSettingsModal); + } + if (elements.cancelFormSettingsBtn) { elements.cancelFormSettingsBtn.addEventListener('click', closeFormSettingsModal); + } + if (elements.saveFormSettingsBtn) { elements.saveFormSettingsBtn.addEventListener('click', saveFormSettings); + } + if (elements.formSettingsModal) { elements.formSettingsModal.addEventListener('click', (e) => { if (e.target === elements.formSettingsModal) { closeFormSettingsModal(); } }); - // Field editor events + } + + // Field editor events + if (elements.closeEditorBtn) { elements.closeEditorBtn.addEventListener('click', clearSelection); + } + if (elements.fieldLabel) { elements.fieldLabel.addEventListener('input', () => { if (state.selectedField) { state.selectedField.label = elements.fieldLabel.value; renderCurrentStage(); } }); + } + if (elements.fieldPlaceholder) { elements.fieldPlaceholder.addEventListener('input', () => { if (state.selectedField) { state.selectedField.placeholder = elements.fieldPlaceholder.value; } }); + } + if (elements.requiredField) { elements.requiredField.addEventListener('change', () => { if (state.selectedField) { state.selectedField.required = elements.requiredField.checked; @@ -1920,6 +1974,8 @@ function handleFileUpload(event, field) { renderCurrentStage(); } }); + } + if (elements.addOptionBtn) { elements.addOptionBtn.addEventListener('click', () => { if (state.selectedField && (state.selectedField.type === 'select' || @@ -1929,42 +1985,83 @@ function handleFileUpload(event, field) { renderOptionsEditor(state.selectedField); } }); + } + if (elements.fileTypes) { elements.fileTypes.addEventListener('input', () => { if (state.selectedField && state.selectedField.type === 'file') { state.selectedField.fileTypes = elements.fileTypes.value; } }); + } + if (elements.maxFileSize) { elements.maxFileSize.addEventListener('input', () => { if (state.selectedField && state.selectedField.type === 'file') { state.selectedField.maxFileSize = parseInt(elements.maxFileSize.value) || 5; } }); } + if (elements.multipleFiles) { + elements.multipleFiles.addEventListener('change', function() { + if (elements.maxFiles) { + elements.maxFiles.disabled = !this.checked; + if (!this.checked) { + elements.maxFiles.value = 1; + if (state.selectedField) { + state.selectedField.maxFiles = 1; + } + } + } + }); + } + }, 100); // Small delay to ensure DOM is ready +} + // Initialize Application function init() { - // Initialize form title - elements.formTitle.textContent = 'Loading...'; + // Initialize form title + if (elements.formTitle) { + elements.formTitle.textContent = 'Loading...'; + } // Hide the form stage initially to prevent flickering - elements.formStage.style.display = 'none'; - elements.emptyState.style.display = 'block'; - elements.emptyState.innerHTML = '

Loading form template...

'; + if (elements.formStage) { + elements.formStage.style.display = 'none'; + } + if (elements.emptyState) { + elements.emptyState.style.display = 'block'; + elements.emptyState.innerHTML = '

Loading form template...

'; + } + + // Initialize event listeners first + initEventListeners(); // Only render navigation if we have a template to load if (djangoConfig.loadUrl) { loadExistingTemplate(); } else { // For new templates, show empty state - elements.formTitle.textContent = 'New Form Template'; - elements.formStage.style.display = 'block'; + if (elements.formTitle) { + elements.formTitle.textContent = 'New Form Template'; + } + if (elements.formStage) { + elements.formStage.style.display = 'block'; + } + if (elements.emptyState) { + elements.emptyState.style.display = 'block'; + elements.emptyState.innerHTML = '

Drag form elements here to build your stage

'; + } renderStageNavigation(); renderCurrentStage(); } - } +} - // Start the application - document.addEventListener('DOMContentLoaded', init); +// Make sure the DOM is fully loaded before initializing +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', init); +} else { + init(); +} \ No newline at end of file diff --git a/templates/forms/form_submission_details.html b/templates/forms/form_submission_details.html index a2fd33f..0b38326 100644 --- a/templates/forms/form_submission_details.html +++ b/templates/forms/form_submission_details.html @@ -7,228 +7,57 @@
-
-
-

Submission Details

-

{{ form.name }}

-
- +
+

Submission Details

+ + Back +
- -
-
-
-
-
-
-

{{ submission.id }}

- Submission ID -
-
- -
-
-
-
-
-
-
-
-
-
-

{{ submission.submitted_at|date:"M d, Y" }}

- Submitted -
-
- -
-
-
-
-
-
-
-
-
-
-

{{ responses|length }}

- Fields Completed -
-
- -
-
-
-
-
-
- - -
-
-
Submission Information
-
+ +
-
- - - - - - - - - - {% if submission.submitted_by %} - - - - - {% endif %} -
Form:{{ form.name }}
Submitted:{{ submission.submitted_at|date:"F d, Y H:i" }}
Submitted By:{{ submission.submitted_by.get_full_name|default:submission.submitted_by.username }}
+
+ Submission ID: {{ submission.id }}
-
- {% if submission.applicant_name %} - - - - - - {% endif %} - {% if submission.applicant_email %} - - - - - {% endif %} -
Applicant Name:{{ submission.applicant_name }}
Email:{{ submission.applicant_email }}
+
+ Submitted: {{ submission.submitted_at|date:"M d, Y H:i" }} +
+
+ Form: {{ form.name }}
-
-
- - -
-
-
Submitted Responses
-
-
- {% for stage in stages %} -
-
-
-
- {{ stage.name }} -
-
-
- {% get_stage_responses stage_responses stage.id as stage_data %} - {% if stage_data %} -
- - - - - - - - - - - {% for response in stage_data %} - - - - - - - {% endfor %} - -
Field LabelField TypeResponse ValueFile
- {{ response.field.label }} - {% if response.field.required %} - * - {% endif %} - {{ response.field.get_field_type_display }} - {% if response.uploaded_file %} - File: {{ response.uploaded_file.name }} - {% elif response.value %} - {% if response.field.field_type == 'checkbox' and response.value|length > 0 %} -
    - {% for val in response.value %} -
  • {{ val }}
  • - {% endfor %} -
- {% elif response.field.field_type == 'radio' %} - {{ response.value }} - {% elif response.field.field_type == 'select' %} - {{ response.value }} - {% else %} -

{{ response.value|linebreaksbr }}

- {% endif %} - {% else %} - Not provided - {% endif %} -
- {% if response.uploaded_file %} - - Download - - {% endif %} -
-
- {% else %} -
- -

No responses submitted for this stage.

-
- {% endif %} -
+ {% if submission.applicant_name or submission.applicant_email %} +
+ {% if submission.applicant_name %} +
+ Applicant Name: {{ submission.applicant_name }}
+ {% endif %} + {% if submission.applicant_email %} +
+ Email: {{ submission.applicant_email }} +
+ {% endif %}
- {% if not forloop.last %} -
{% endif %} - {% empty %} -
- -

No stages found

-

This form doesn't have any stages defined.

-
- {% endfor %}
- -
-
-
All Responses (Raw Data)
-
+ +
+
Responses
{% get_all_responses_flat stage_responses as all_responses %} {% if all_responses %}
- - +
+ - - - @@ -236,35 +65,24 @@ {% for response in all_responses %} - - - @@ -285,138 +103,28 @@
Stage Field LabelField TypeRequired Response Value File
{{ response.stage_name }} - {{ response.field_label }} + {{ response.field_label }} {% if response.required %} - * - {% endif %} - {{ response.field_type }} - {% if response.required %} - Yes - {% else %} - No + * {% endif %} {% if response.uploaded_file %} - File: {{ response.uploaded_file.name }} + File: {{ response.uploaded_file.name }} {% elif response.value %} {% if response.field_type == 'checkbox' and response.value|length > 0 %} -
    +
    {% for val in response.value %} -
  • {{ val }}
  • + {{ val }} {% endfor %} -
- {% elif response.field_type == 'radio' %} + + {% elif response.field_type == 'radio' or response.field_type == 'select' %} {{ response.value }} - {% elif response.field_type == 'select' %} - {{ response.value }} {% else %}

{{ response.value|linebreaksbr }}

{% endif %} @@ -274,9 +92,9 @@
{% if response.uploaded_file %} - - Download - + + Download + {% endif %}
{% else %} -
- +

No responses found for this submission.

{% endif %}
- - - {% endblock %} {% block extra_css %} {% endblock %} - -{% block extra_js %} - -{% endblock %} diff --git a/templates/forms/form_templates_list.html b/templates/forms/form_templates_list.html index 0194a88..72d6484 100644 --- a/templates/forms/form_templates_list.html +++ b/templates/forms/form_templates_list.html @@ -269,6 +269,7 @@ {# Action area - visually separated with pt-2 border-top #}
+ {% trans "Preview" %} diff --git a/templates/interviews/email/interview_invitation.html b/templates/interviews/email/interview_invitation.html new file mode 100644 index 0000000..5766426 --- /dev/null +++ b/templates/interviews/email/interview_invitation.html @@ -0,0 +1,76 @@ + + + + + + Interview Invitation + + + +
+
+

Interview Invitation

+
+
+

Dear {{ candidate_name }},

+

We are pleased to invite you for an interview for the position of {{ job_title }} at {{ company_name }}.

+ +

Interview Details:

+
    +
  • Date: {{ interview_date|date:"l, F j, Y" }}
  • +
  • Time: {{ interview_time|time:"g:i A" }}
  • +
  • Platform: Zoom Video Conference
  • +
  • Meeting ID: {{ meeting_id }}
  • +
+ +

Please join the interview using the link below:

+ Join Interview + +

If you have any questions or need to reschedule, please contact us at your earliest convenience.

+ +

We look forward to speaking with you!

+ +

Best regards,
+ The Hiring Team
+ {{ company_name }}

+
+ +
+ + \ No newline at end of file diff --git a/templates/interviews/email/interview_invitation.txt b/templates/interviews/email/interview_invitation.txt new file mode 100644 index 0000000..e5e6d68 --- /dev/null +++ b/templates/interviews/email/interview_invitation.txt @@ -0,0 +1,23 @@ + +Interview Invitation + +Dear {{ candidate_name }}, + +We are pleased to invite you for an interview for the position of {{ job_title }} at {{ company_name }}. + +Interview Details: +- Date: {{ interview_date|date:"l, F j, Y" }} +- Time: {{ interview_time|time:"g:i A" }} +- Platform: Zoom Video Conference +- Meeting ID: {{ meeting_id }} + +Please join the interview using the link below: +{{ join_url }} + +If you have any questions or need to reschedule, please contact us at your earliest convenience. + +We look forward to speaking with you! + +Best regards, +The Hiring Team +{{ company_name }} \ No newline at end of file diff --git a/templates/interviews/preview_schedule.html b/templates/interviews/preview_schedule.html new file mode 100644 index 0000000..ffd8e18 --- /dev/null +++ b/templates/interviews/preview_schedule.html @@ -0,0 +1,125 @@ + +{% extends "base.html" %} +{% load static %} + +{% block content %} +
+

Interview Schedule Preview for {{ job.title }}

+ +
+
+
Schedule Details
+
+
+

Period: {{ start_date|date:"F j, Y" }} to {{ end_date|date:"F j, Y" }}

+

Working Days: + {% for day_id in working_days %} + {% if day_id == 0 %}Monday{% endif %} + {% if day_id == 1 %}Tuesday{% endif %} + {% if day_id == 2 %}Wednesday{% endif %} + {% if day_id == 3 %}Thursday{% endif %} + {% if day_id == 4 %}Friday{% endif %} + {% if day_id == 5 %}Saturday{% endif %} + {% if day_id == 6 %}Sunday{% endif %} + {% if not forloop.last %}, {% endif %} + {% endfor %} +

+

Working Hours: {{ start_time|time:"g:i A" }} to {{ end_time|time:"g:i A" }}

+
+
+ {% if break_start_time and break_end_time %} +

Break Time: {{ break_start_time|time:"g:i A" }} to {{ break_end_time|time:"g:i A" }}

+ {% endif %} +

Interview Duration: {{ interview_duration }} minutes

+

Buffer Time: {{ buffer_time }} minutes

+
+
+
+
+ +
+
+
Scheduled Interviews
+ + +
+
+
+ + +
+ + + + + + + + + + + {% for item in schedule %} + + + + + + + {% endfor %} + +
DateTimeCandidateEmail
{{ item.date|date:"F j, Y" }}{{ item.time|time:"g:i A" }}{{ item.candidate.name }}{{ item.candidate.email }}
+
+ +
+ {% csrf_token %} + + + Back to Edit + +
+
+
+
+ + + + + + +{% endblock %} \ No newline at end of file diff --git a/templates/interviews/schedule_interviews.html b/templates/interviews/schedule_interviews.html new file mode 100644 index 0000000..2588a74 --- /dev/null +++ b/templates/interviews/schedule_interviews.html @@ -0,0 +1,97 @@ + +{% extends "base.html" %} + +{% block content %} +
+

Schedule Interviews for {{ job.title }}

+ +
+
+
+ {% csrf_token %} + +
+
+
Select Candidates
+
+ {{ form.candidates }} +
+
+ +
+
Schedule Details
+ +
+ + {{ form.start_date }} +
+ +
+ + {{ form.end_date }} +
+ +
+ + {{ form.working_days }} +
+ +
+
+
+ + {{ form.start_time }} +
+
+ +
+
+ + {{ form.end_time }} +
+
+
+ +
+
+
+ + {{ form.break_start_time }} +
+
+ +
+
+ + {{ form.break_end_time }} +
+
+
+ +
+
+
+ + {{ form.interview_duration }} +
+
+ +
+
+ + {{ form.buffer_time }} +
+
+
+
+
+ +
+ + Cancel +
+
+
+
+
+{% endblock %} \ No newline at end of file