From 579cc085e2138ec383a9c697e6d655c7d8b0b7e1 Mon Sep 17 00:00:00 2001 From: ismail Date: Thu, 9 Oct 2025 12:55:09 +0300 Subject: [PATCH] more update related to integrations --- recruitment/__pycache__/forms.cpython-313.pyc | Bin 21447 -> 21802 bytes .../__pycache__/models.cpython-313.pyc | Bin 40793 -> 42715 bytes .../__pycache__/signals.cpython-313.pyc | Bin 10965 -> 10981 bytes recruitment/__pycache__/urls.cpython-313.pyc | Bin 6221 -> 6478 bytes recruitment/__pycache__/utils.cpython-313.pyc | Bin 16432 -> 16536 bytes recruitment/__pycache__/views.cpython-313.pyc | Bin 33125 -> 36841 bytes recruitment/forms.py | 45 +- recruitment/migrations/0001_initial.py | 376 ++++++++- .../migrations/0002_candidate_address.py | 19 + .../migrations/0002_trainingmaterial.py | 28 - ...date_updated_at_job_updated_at_and_more.py | 28 - .../0003_scheduledinterview_slug.py | 19 + ...move_candidate_status_candidate_applied.py | 22 - recruitment/migrations/0005_zoommeeting.py | 36 - ...date_options_alter_job_options_and_more.py | 318 -------- .../0007_alter_jobposting_status.py | 18 - ...ng_published_at_alter_jobposting_status.py | 23 - ..._slug_job_slug_jobposting_slug_and_more.py | 49 -- .../migrations/0010_remove_candidate_name.py | 17 - .../migrations/0011_alter_candidate_stage.py | 18 - .../0012_form_formsubmission_uploadedfile.py | 57 -- ...hecklist_candidate_match_score_and_more.py | 33 - ...age_remove_formsubmission_form_and_more.py | 156 ---- .../0014_source_jobposting_source.py | 31 - ..._candidate_submitted_by_agency_and_more.py | 43 - ...e_options_hiringagency_address_and_more.py | 58 -- .../0017_alter_jobposting_hiring_agency.py | 18 - .../0018_alter_jobposting_hiring_agency.py | 18 - .../migrations/0019_merge_20251006_1224.py | 14 - recruitment/migrations/0020_delete_job.py | 16 - ..._api_secret_source_description_and_more.py | 88 -- .../0022_alter_source_trusted_ips.py | 18 - ...ter_jobposting_application_url_and_more.py | 24 - ..._created_at_fieldresponse_slug_and_more.py | 141 ---- ...ield_max_files_formfield_multiple_files.py | 23 - ...26_interviewschedule_scheduledinterview.py | 60 -- .../__pycache__/0001_initial.cpython-313.pyc | Bin 2219 -> 28040 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 167 -> 167 bytes recruitment/models.py | 755 +++++++++++------- recruitment/signals.py | 31 +- recruitment/urls.py | 3 +- recruitment/utils.py | 19 +- recruitment/views.py | 155 ++-- templates/base.html | 26 +- .../forms/form_template_submissions_list.html | 103 +++ templates/forms/form_templates_list.html | 191 +---- templates/forms/form_wizard.html | 76 +- templates/interviews/preview_schedule.html | 30 +- templates/interviews/schedule_interviews.html | 109 ++- templates/recruitment/candidate_list.html | 18 +- 50 files changed, 1322 insertions(+), 2008 deletions(-) create mode 100644 recruitment/migrations/0002_candidate_address.py delete mode 100644 recruitment/migrations/0002_trainingmaterial.py delete mode 100644 recruitment/migrations/0003_candidate_updated_at_job_updated_at_and_more.py create mode 100644 recruitment/migrations/0003_scheduledinterview_slug.py delete mode 100644 recruitment/migrations/0004_remove_candidate_status_candidate_applied.py delete mode 100644 recruitment/migrations/0005_zoommeeting.py delete mode 100644 recruitment/migrations/0006_jobposting_alter_candidate_options_alter_job_options_and_more.py delete mode 100644 recruitment/migrations/0007_alter_jobposting_status.py delete mode 100644 recruitment/migrations/0008_jobposting_published_at_alter_jobposting_status.py delete mode 100644 recruitment/migrations/0009_candidate_slug_job_slug_jobposting_slug_and_more.py delete mode 100644 recruitment/migrations/0010_remove_candidate_name.py delete mode 100644 recruitment/migrations/0011_alter_candidate_stage.py delete mode 100644 recruitment/migrations/0012_form_formsubmission_uploadedfile.py delete mode 100644 recruitment/migrations/0013_candidate_criteria_checklist_candidate_match_score_and_more.py delete mode 100644 recruitment/migrations/0013_formfield_formstage_remove_formsubmission_form_and_more.py delete mode 100644 recruitment/migrations/0014_source_jobposting_source.py delete mode 100644 recruitment/migrations/0015_hiringagency_candidate_submitted_by_agency_and_more.py delete mode 100644 recruitment/migrations/0016_alter_source_options_hiringagency_address_and_more.py delete mode 100644 recruitment/migrations/0017_alter_jobposting_hiring_agency.py delete mode 100644 recruitment/migrations/0018_alter_jobposting_hiring_agency.py delete mode 100644 recruitment/migrations/0019_merge_20251006_1224.py delete mode 100644 recruitment/migrations/0020_delete_job.py delete mode 100644 recruitment/migrations/0021_source_api_key_source_api_secret_source_description_and_more.py delete mode 100644 recruitment/migrations/0022_alter_source_trusted_ips.py delete mode 100644 recruitment/migrations/0023_alter_jobposting_application_url_and_more.py delete mode 100644 recruitment/migrations/0024_fieldresponse_created_at_fieldresponse_slug_and_more.py delete mode 100644 recruitment/migrations/0025_formfield_max_files_formfield_multiple_files.py delete mode 100644 recruitment/migrations/0026_interviewschedule_scheduledinterview.py create mode 100644 templates/forms/form_template_submissions_list.html diff --git a/recruitment/__pycache__/forms.cpython-313.pyc b/recruitment/__pycache__/forms.cpython-313.pyc index ec10c536df3b4b8e44685e27df4d5a0035c124d7..62636ce517f03e8ec95214222faa33fd7815e80d 100644 GIT binary patch delta 5576 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 diff --git a/recruitment/__pycache__/signals.cpython-313.pyc b/recruitment/__pycache__/signals.cpython-313.pyc index 71ee1e2a18779770d2834d057cf29b5d155e947d..fcfcc913062d6ff873c417fc153f2ae69f795aa8 100644 GIT binary patch delta 1352 zcmah|O>7%Q7~R>K@%}jLzu0m7lh}?)sNJSfaYDP4B~+q8C{?9;SS~(Tt9oN194G9i zLgfNNLLe$mpO8QmP>%E#`Np9rhjK!K3iaXx6$g-fOO;y>z|1DL15{#GJM-q7_r85Q z^UXv1ciT8L3|->QyZ6VNH}{Mmk@6Cjq|c;T_!XtWPbEp0Gzh$v%FA^H_NS6?OHSFU zkcd_fAB`t_hHMg%YVry?iWa4|)G&q&n+)S!+K7&#s2+oJcoHQ*!#U$WaZqs%npjzv zZ5ojnuHmlINRQOYD5uJZ9pVgXtGo}@XjePI(?&eK5rsXRdT(NsL$BwCcs#OEW*c=P z!?^u)uFA9(`G~{W<9~QMTNmu=h#vc&TPJl}0K{To|bj(4+y`o@i&mb2?N zH#Xf)%ZIPy4$#Ew*_2@8w!7>7I}LObf2p7FgMME+AU&A8g?VWvTR%2IR|=6E8& z28(bU4RDNwSezvUj!&{AkEi%M#Wa>SRd90W!_ypNMoiMB@Xb_Bqb$R+TqDDStc7zt z=OAs-JkNu{$y-{8%?QlD`}VY@%m(=<0$gB4u8Rh`5+BWsMdyY(csWas{qASRI)R_z zI^kE~`2Z&brVGLc{FGhA&x$|DS@Bb>BAhY2B(W+#?9PICs6OoC|!4y}GFB?76_H*ex-uo$$TPR$zO^qR$IH?9KdB8D{6l%K0$65PUPr z-799OC^1t!!z$-D+iaU~dp4(;7A{B|sPY1QKl@QgU)%KjU05%?xS(Be{N3VJXUp}( z-FVlyyya|mikDg~&-ML2b;Wc5Uly`eQ5k*Zcx7!s0(#x$<>?mfozAw?>XVJljys_6 zTOrwdQdq~K4>`%d0PAIj<{-9E>D?~hrIofSMdp4sN(Wd{qmPWzL!

7sd8fJ7%Q6rS1HKksJ!Z*RP5;y)VVBy|dINZi;8QBfiUiW-krJ@^p0*iMif$67ZM zM4~^ZR6-!cQ&BGecO0s7#d>ZM)cwOcb^;IV(BJ9=ob8r&F~lxuu;PZts$FK2-JkAG0j{)E^``w z#a3E8BA&Kwu_}9hMT8gQW3V8^bhj7hD+bew%m}vVM+L!?OtC)IfLCXW9^aO#p<@VT@Oo=V|5fuxhtyB|UlC2zfP^o0gEJL9L=G{|uvM8k}auscd)H2%I>Bql2Fa{P>oBMi?= ztTT-P*BPY|_|qy!o~2`q6DXNNG{<&!yr{rkYX(n1XJ}rU^yaFcp?Rh#7R9y(y;#Ag z(J8l|z+QKbd1qaZFADdbb7#z#g?rEU=dTy&xhFchtE1EDr*!laIy!x!uk*4_XZUPr zkku*)*C&-mcZzp=b&zltd|Zt<9E65;bwI2p^2>NWR6bRtvJp z5^N@86Au3>wg)b*Z?+q$<*kj&4QF5KaPNRe_LYTt-Dz~Yiw6WgO(rb{9vSe1gU}FjP!jY{daeOC4IDV zzLFt7X0*y#C6{m_a5eXie2N7e3qs=`pKD>ff*%nigP57(Ka-OSy7^&ZY03YSFe N=i%`q=xnmme*sP_4Wa-5 diff --git a/recruitment/__pycache__/urls.cpython-313.pyc b/recruitment/__pycache__/urls.cpython-313.pyc index 3d7de9551256c93dbfaa29af51bd9c397a6af11f..11edbbae5c083b237a6f1eeb7d2f591160780449 100644 GIT binary patch delta 1626 zcmZ{kO;B1_6vugR@iW0MKvV=jP>J#-LZeYCp!kuXbu{=9Er>!b2E_ozHl6BpRTrJs z%-y(YYF2Sc$LUN~9XFlnrkQu@;!d4ry68-|xoNt}rhV^T)4E9Cz~P+p`=4{}z3)AK zay@fvUR}LfrjV}E+#er)r+cU|2w!~L@kr31=_WaSap4!jykNlxDkt7i{{HY$BVJUE zo_w#W5Cql9Go%%yRMo&tNuO#;SQ1(kGrlD>9mIdBTk$Kk7IzhCq=woz-K1Z&B<_ayD-TnM_t?a?XKVdVB4LY~FRQ#y1nGL_D8#o@*r-OCT<8#_R2;omrG?fbIx;~Tg4AL z_j!3@J-)e?acpPPxvWasL$(PQRjw$rRXADsc~PC5sXzI%QZIzMWZxzmyKEeiIj>|x zc2W=G*+lGqD!G$&$*fy8ZrSw6#v>cAY~I0R)r)-*$rYq;j;Iw1suBd@xx&akHP01h zio!yL@)uOHZ#>u~wH~PTJnaWGN>yR}Yjukd#(!7W?a7*#R}|_}v9$Fl@+A5=`qUhT4zS#2N%^P#li|TBbFO85px4Zxd$-oFOqB1r(!o zjMXz{KGKn9FEsCY#ep!O3EIG*k-?Uu5V7=wrC$t20L{`y#+n#&721e<3fxoTTpG{@ zZD!0OvHiwF4KehBp_dr^VDO(Aq(vm+`+gN zmupSM*O=dlU6S9$e4CW7yRrr79<{TCo1xzTv=2YHUzr6MM!0jnfQ=Tf9y4k(adk zpw%Z1v)$g~G|#E^xQ%rBq0@i*DWC}5=I}m;&Vr6~2cbLoV^gbQ}DSgSAHQe!QafC&Ouc{b%qz!siz0l zqfga3PK~lx>HHZwyO5j6wT-Fgxh2lgl8Y>%>;?R{#>pA5Sv#QCWE0f*rq+o+)-G@e z|E_i8KeYY58QGapy8nOVW{;*?J)E}czf-)tjE~!XIQp{v6Ac%_i(Q`cTemmLwOYBd zxm;ewA9h*rtFCX1ftTl2@0B+1RD4_2^;%Ue7p&UxSKYUzgMYlEN_<|m8z@D56f%YRlmXlN*GZ>PzhI*5W*e$LPt)Pocz`5xT5EK z(_EM8C)BoQ+20|i5ST*8o1^P)YJr z7NE@6)R90Q0(o)i0iZ2ugt9kew%516N%%1EVZuj%kDT(+lZvvVQEIu0f0P@KQGE^n zBkOUhCvb|lsUm4?MCanaQ8D6nMdzZRk}Mub@qX2qNI^xu_l(i4*{K{v9(Ob*c% zCaw&)GGgvNpmnLlYTRYGw;m>aUg+~S=KxJgWd`p(GaGmBGrg`D_ssiYq8|qRuy`c} zXhzy#aFbOTXoQI~0?vpyMK@bvw92S(=q7_P7>u1f29%d-3_f7c-!zhu1dJrUwE|j@ zwitZKwOEvg5Ir%HcoE`7aZNsrU1^))M;Od}`}-{UfWwm6IP;igJFM)`VV-!C;7y7d jdZl(5jj8D04K|Y`GzXzMF;CAVu2PQd$+_xV@{|1+Fyetm diff --git a/recruitment/__pycache__/utils.cpython-313.pyc b/recruitment/__pycache__/utils.cpython-313.pyc index b60ea1bafd0bfa7c7b5d042c1bbb47799346d3bd..4e08a674d53b28426a8ea20d841e147c0437e9f2 100644 GIT binary patch delta 1095 zcmZ`%OHUI~6h3#R^fA+E3oYf7{<%_I$vDkPvXgi_QEL3S)5 zR|1JHTp1E$0%0MEkEp+(O+YlVV54CP0cB1a!D;x<%@awa1X8YAb(8}69XhKo<^45dyE2L4yr(A$f(1dFS8i@ z>A)mjR*=87^-KmPOO9+tR+0{94yy_Xb(Bs~A zS(_$XhdC-(k9qnuU?B#N8KlwX3l{RsiR@i> zy+IgzFcR+V9}fk?LnCr1LO#3ecrFg;4G#?ukOQ|1c}cZLB+ooU#!ZE0x^?FEOlyR* zt|)zq7)pZd|)uyHR#nr{~ z#lof0RqLug;_Z&~3~uy{MSI2~-Qh@hd7ru=<#9 zmf~F=N-BQqAh&GGlsDf#OFlGp+8V)_v(pTk?B|*nqtRS@RBfNu?sOsGbG~qA_HV6J XHs3^On@n6<Fqh|gC5zNee delta 1019 zcmZ`$OH30%7@q02bRXTdw9pq&5Hvh0FLALi(ZqN#1i@~`6dQ$-mPf=PEcFatjPYX3 zpz&Zr55$;wDIrlbp7mt16%C~EfCoHqBEf@4XIs{mh?DHh|Ih#L_kZ6v&+o(B5)=#ko zF!K2ZGXgQz_@#Ve3%%#bMcEy+m2Zs*TWM7?vhs=9M75D2vSO{((QC+Kxo(k5xQ&X! zAhQJeO!6VyCQwl`Ba;La3u0)8`PhysWGQx3{kOx4xTE;-7F#$BK=L;L$Q1LEZpL>B z^A%Is;#3at6q%2&MkrN^P*t8^x=X&N02VCxLBdBq_tw`mgLptTm4qR#lLoOy9eoko z;vd7ybR^X{{7A835n0;~4M=uS6!ve{0ziBt`~iTJpGKc_qA4!`ih#umh9VLuHwoG3 zegavGF-tkJWsXQRFjLmkbOel@BtLqbvIz-_z3X_ptBb-NI`|R0i}F1G%EJh8TP7wfXinkOUr``-v*DHk7CaB=jLeL<8^tli`1=?Nf`QU3v9)y>n zgVaTWzJh&1O(*Y+Eo72vW-K#vH(iiQH)Jq!ovcRs+k}da0#{1XI8_iAX6G_vse5WN zGc$+PFJv#$PtHU`&`Bnvifh~9+j0c*j=<93w%xO3Z_V3Vm#&g`(HZj&@7g5t1$Dsx zGPG0QwplN4G;D^@cGp?W6Zr0F$Xc?q+1t6^+^yWOc6n60nbt-pwaF=MdS07SHUGj_ zPv)n)gES4?Xp(``y&nc#?F%kDpZB!q+4hIF{UHbh_cy-z*U0*_fol-%k=={0goEf6 K2&>g`YSbUk6~UhX diff --git a/recruitment/__pycache__/views.cpython-313.pyc b/recruitment/__pycache__/views.cpython-313.pyc index 708fe60d829b7630a48c25dc5f359c1e28d65017..2121db6ca17a8742aa06332ee4aa2082a344c9eb 100644 GIT binary patch delta 12788 zcmbt)3v^q@b>MsW6CVP^k01z;APIiJzerIMB}$?`6eaLy^9hnHQi4DNA|ZhwGXQ0a zmJQb1#7fe{vZh@-ahlkTUE6IEYs;?7Cfig_o5qQqhA^FieU@Wy*Sp=EHYp`}+WhULoi(-(Z1H!H4u2=<^lv3w{avKXzm05TjYY) zUZp0T)j96(;!#Q*M+O{RH77WooKQYqG5RFk=e3l|vt>i9%mrocTv;ktHq6Q@psaGd zr7MRWVOS4ftH#^&*n1eZ8n89vZF%gy4C@7K?RaY*J1W#UIU)%40FMd{00V*#;4z^Q z;PGuj6a1VIngQM?v;aIQv;rIx+5nD^Zx{9o?N06--zANKBd5mI<3;pcne#**b$YxA z#@yM)=cFKPb#nRApwI=R&IsE8hJK^w_6;>BSm_RWkG%Bsq_7j}hZ$ze2FklO)Q<=~ zQ0J_$8{m|%2jKJ+@9X_JvO4VJMdcic#*>gRkw`ooA;IKqFp&h@6n#{Fkylb);Wvw> z{Uj1Pe>6H1IW$XVgh-MOD7u$q$|7Fo)6!2Xj_Jgrd=>h(qIQ>DG#v~jLy2UFj7Ac3 zv++bkbO;f0Awq;mJlS^vKz}42A)(|f5%oYm985%~;-OfAenB0jNtK1Kp_f&AD%ycl zQ9V0xE;5-+i1JV@CTc!4A0ZbLktA`@_f#$Xc4}51(4sU6f*KlB*Q)lhEd8AN;ZyaP z+zw#arz1Ns(~V#!f?WvO5cD9}jbIOgG6Z`O^di9KgwfoOse?ICPa~RaX9wvOO^9z^ zx}}+r^Y_qz{tSPFzO46o3{Y8=$7k;+HcTlagutNHBm(0AVY}$Z`Z8w~Qap+vfZ!N{ z;|NA+hoQb<43pysLI6Y+i6rJ@Ns*5vG?4dXKeC_xj$sSmv9x4(gx?_zS%23dw;~ng z%xpLk6Aj78%v>y#j0EGMnFuk`8Kb*q8vE)+aL3U55r?3ee$(ic81#t*vC1U`4`DrtzNk8Xe~3&aM0K_c9ppss z$=TVNp-3bN3O*Q3B#%WS)NM8MA=+*|*u6q@nUQlqhn%Nhv)1VrFo|?YFI}

T_aGQWZ~}nn5rJ z!q0hAJ%0+3Jv08uI7AI!!WR-Ls%9d|>De$bL6$s6`|IoYlQdrMPCbtZv@W6&cfz@X zI7MYLnv6wAL7=MG>=cZN>8hw=c0D1DP$5YfI}_!=t|VIpWMLE_Sj1;J3}W$L0OC*J zKe423cvji=93)@lMMWYuKjo7#wI+WIxI+ZTMi`IGX1;*g7wOwAZW!K&E#;{{1;m0G z1=|)0N0Ugrbvii{11fBVybR?&JNX8-V@kxPP?7@TzKP&l2wpgUIfy4{bx6Mma)a1A(-+_9sF1^>fN3Qxy zZ1NOs=xF3$rb5S5s=)axSd>>jQ8_s~A5Th}$9gWhvuD=ed)Vr45d1BI?<4p$fJ6}h zoFVpQrwK$D3`dfoXpH;-ivJ6&((cZ`1BLrku#E4aRj147_s&?r#g_^4fUKR*d6r(- zpoR(ZzEHs?q(CS*8H$IaXr-(|5b4R41`wDIMBblPXwxraQRUHfYV0n8h*s)OU;@NsAas`xq7yN^C{pha2}^oIw2WO*KNqAu@QM#JDV{qey{h@yaSJpyKF{uQe! znBU2kYu0Z50xNu)-aJ_9V5U+Jnl%%gn2*LFNFnP`dYF3p?v;G1=a%m8dqcthlKTDS zO|0d=Km{1oFOdpkL_0?!;mFx&JQ6+xUgN)E!7u3*|2BS}{=mP#>AQ&d5P+yX8;!)m z!Q{oc2>IWL{TRXf2>u6x59ro`zAC1-tSj_#UX)4G!)94>h3JEbP_4u zLclE76PW4&AgZKI3sf8SKa7qdqyh2TXd)ViXevG#5f!-e5g)cuBR~;K%LiAE&&V`G zRD?t2;4q&Dl&FK2Q;~$^4>7L)jSdgG`R~%$p!?7V*q-MB$Pi3HHem#iT}rth$>^99 zp$m~9n~mJuk`ibpEd69~uZ+L6WE@e*Q%wFv5@#PFc@*siak4Idjky1b;5Go56*dqi zA4HH}0XRAgzCs=^>cWx4B<#saFe_qFG!YCDi+_GR-_R1^@7Q`rnUjIq(#AK@fZe zz)=Y1ZJTHWgV98MJ{DtK`s89!ZsHQ6l10)aOvjJcZ7^B&NDTE++DE^MDJ_Br5!exY z4M7P4whQ36q`0{pQa+7jovKha9t6)|`5z(pLj=qdVf(EHvXT(0b8eAk6ZZ+`=#grm z@*P@p;-=*1@#kpUebxNu=~8ty{rf%-ZP#jOOHGmT495lds{t$h?tM@9<_=rD+=zAz z_fGb8Wq;%R7#d^t1>m4g&;cBlMb4wg6*XbjXAYmkin`9&|jj@ zjE(R&=*=-t>xyg3s-V{SnL$KF_ z3ei*Je`<5$thf;5R~NBR_o>P-V+3LD!UYnB;DTq`+uD8H@>;(=1p zDn&n=`y(yT-7n~l;10Gm{a%QT7T4^89n~z+#+2>;=t78uC07i|g9}jL0;h&FZs7xME z2Q-3)brhF6s^9|hQ5U^-s7@~w30fFeQ30W22yFqOX9!&ZVPFV-0a45lh8#jG7#X5C zP()4lT2;lIUcZBzJQ$m=UOXT3WbLotILXuM@lvx ziP(77hS#&Sfx%+>%r-0ixLUI{qzBVdJldEeSNI*_1r>1ET)^Z~w0F){TGFkC{@G?Hz1hZLRWxk*b1uz1r_`skx96RuNap^~;8?;<3(dc_nw2&zA4lR1Vs?p&X4d z`=CxW$Hk3f9XZTs7xtJk2aF&pS*};?MNq|!`;5a6NWW+KPoU>v^a|s!kL}9Q4j6Ov zgwj@-;1J5XWeHi1vNziUQr1XA@j2;#3Og!c55olsKWOemmE?P|(?GB)|4J(&-c%{9 zDpARd4lGOThcJ|3eh&9b2=LEFW03{zp(sftJ;QK<2|J)(q7;mUCL*zgqCq%`WbUAQ$d=n1cuIi{~t~iiDf#bfj7(nLm0ZVr`P+ z0EeLwJ5KXeY%oMkh-KTd8Y?|V|1sjxF+Y$wnvL}1h$AHy!NAyodqOmXqX{_Jy%=QD z6N?MZJ38E=v5;qDkb?a-oC!7fRw!2K;09BY&y1tl5UMeU7j3h&i-7-`!Xv&r+#j4X zQ6tR=!~xqdYXr}2J`{sa(Ax$q&MDcBU>AZO1iKOJL9iD=FM=uPErF|C@)`;(d1f+WE9)|7FelPR{Pl*qYL|ri`s4 zZR=P*ykhHEvGrZnzFS#GHB%p@)*beulC`p$Oj%31tR+*nC0({<`O-?+mX)%>%l$ z2o%^o8GB>e-k7nsrtPiEM^@~uEB4f(%l&J%%8bpIw)rx)mb9&9dGCs?WyLmd`Ov#f zU74l>>81lKjR&vqyB^IPI+Z?jYNhY=N<;9n|4n`Eny)qE>q+~1Fju#xw?8)W*^xK( z?i+erM(F_U)t{L$*0yFl^I7%+R?Js z*#1)MORZNfJdwJZS`M=T)u*lX8EaG8+O%%u47E2ojiLB`2USg1$wqkEFkRpImesW` z=S$olzTeE5%5HPAqLLeW^J9ab9b75zx)!=7tdw=Xso!}+Z~Aau356fNZ=&BG-jez% z%=IJtDh3<4SG;C~+xIC4c-i-QwnOG`wj=6qwLJrF+4ofnNPl0~=N{=ZXL=IccLVt<@wbb7nNI3@Aoz^h&=ql}D*IxvQ#xEC9QFt8Bw*lV)KH-fDOt z%=fTmz|LP19#{*WkS8%0nT(!|PGYv;#e$vvHZUcf>~+9;SunInO9;-b z&~ZyDxPdft&U5FBXv3L*4{mV5ePVuZ!E`;0l^#UE;)qL_V&;oQ6zFSZk9{^=OW`S~ zv_rt^PQmh)#zmgN#(#tWql(`Qs4AF?mh;ztgKr|haF2jxNc=7|U*z61dY*M%8~RD? zhq1JAZ1M1WW>3c4kTy4D%x!6N+p=TD+_qwN?$4M9(&m9zM^??_iv#bgxDw}+O;3|m zQzQM_32#l-@jkR>b-~|FrThr5y3NV;>UB=8RI_`SC0X=3?_xnR>~hFI6CDep*hxbv z{n6P==6q^;s37diJp(*pU_d!Pzf15ie$FTr;yxXB^DHDA`Q?f@z333uz-G?&&9<*HK zKzydEXX)Xfz6FxznrHW1n@N`(U-Yl5xMKTb!OsRWhL*IU<%Q{0!}g4!H*M&>Ub<>H zLeIn|cY%cMo;9;$%~r8i-gr}|+K-}Ep{P|^QE&3XaREZt-0cZ14Y{gl<%~PUT(~Owcky*hb>xo5Ks?`m;-+q95bD!RTfYlX54^+B1(e8f=qcb=Dd@0aj>FL7 z1)PODd>LFh%~;*l{&xLXt_nBW2z=Wt8bQyxG~@z~(H3~3;k;YL;=5JU2u6rUiUKNd zeyzUIEjfM*zk#9x(?g%j1`f39Q?}x`c7qtVq8Llj!3Q_Lq*I>b2Sy4u6XrwBMr+{c zSGPLK6-C@wLEL5#w*|!wp7t(e9}WjJ+J0GR8RVeYi~<7!wcs2dCc%ayimP*Z`qG?A ziQ$M;TFOc>8j}$0?{tP=jA}Qj1@8B9@v^uxP#P#>3RE6&+)exeXP{iD!W!^fjlV)oA=ree20da&1Ny9T z7^Gh%Om!Axl77o!+5>6}cg&TLwZRDwFam}&?h3d@{nV4F)VTr{!P{CCSDv_sKC{)9 zQsB&Q8fY!pImZS?vM^PuYtd%q1eY0J5&WX>}AMFw-tu` z?I1)(2?%FZ(J-9i#zoZxKEz6}hd>LO+QU0*hj!KqaAz8a8w+@z1ysh7N(d;@casgO zA7Jj^)1vtr{uSCXUr#?hU)4++u|tj2;RNzIi6D$1-<(7+dzNPAgARzh!$3$hut8Tldd9%9vivLDcW2UMjUDc7P>P}a6->7NI)NFmD zX6v<+*Y)YHp;s4HYfffrg6W#zYE9@yl@BVvQPpv6=kmF9=aE-;u2vn(RE?#p##XCN ztt+|eo#5_Q+pqZ7HJr`;#K_|#87s!f#uv2zVC}rA<7#%Un~a7-lw9;z+tZ~xR!lqA z&79u!*zV8ner)gO_CEPgrm`zt*_El>{zm0?x^gi@k1kZDU~G2B* zBmAW;jn{T&I{oQRf2MOd-8uZ~1DVbftDPs-tj;Hf9v@n(YtPi}PS@>Tj-~4cGIfD; zU0}8D_?ovhi=VW;8=j2Qa))V0fWWs(=0dh@7*!Z*xkRMd4C?KWf=eO?@A( z>j1-lbZbJ!Rre%t!T(*uKE2Suy}{d$Hk(%)v`2mN)sE()Uiq69Jfz?BDgpZVVPBLe zc>2mEN2xu0E)<`dZOz55t?a0i&|h7uR81zxS)!!BzEqup%LKUH&DNbxCg-GE8D_Ke zSu|T*qzG%8vZ(MxD|`8wV7GdC0`LGLL2%2>V{qq^UM1wH%_pN!$$*uVXH$5CLNKb5 zo>8%DFJ^|(0*l2Em%>3DfwRW@XUTbDWymZK_*9cbC#0t%wmgzVTJtZ#*a?AX%0FMo zJ^m;~Iy%UuqM=xHAwm+wfjpEUJ~zh1^ejnE&L>$2Jr^ju+MV zNDLmFie|La5V4cs+{IRj3xeSh>A-4oLFgl$m@0xNDTC6(GVt%Ew^X8j2)j83mJ;4y zvv07V2*P#j=1evTo6jsx?76NedcXV6HKjAomv zttW}O-EJRAG}~sYyKU+z+q3RzyJ^}qZeKZ2)0KYF=Fy~^^tJfdG~IUF{r~UB44Ad2 z+p}}<_uc!y@BjV3?!CTyM)CH;3iC~qNzcJgz4Gk?&z?GMcJsZbYkCcOqW5tECun;N zrypw08U<62Bj_Z~po_SIZsHCWlVVoE+*1-PC8aEF>G1^1NEu68d&+}e;)S$PDD3eC zD@X-P7xh#It4LMQPyE4ZQXO1EmIP}^O>ik$%F1m}9w33>GO{dKOKKU-p6ICyE+@-_ z^`ssMoZ#qL5o{n0!IflXa1~j_XwIJ1!8K$}u#q$dn@CfznKZM;uAa5Qb!1(zg|r0M zll8$?(i+@AHn2AC9#yc7w6Qeb(@xq4+jkzNkJs5t20I#gWDCcUO>VA|6N*bXp=7Xh z=SOIT&*oCjmvyqTQYiD}%Cfn#E>>0sW#xlw8gtYwjOqodZ?HK}-O8vHK&>2X%2T@; zwF;>I!Nxpwn^0ZCk)W^yut%r?>=l**_6Y&N&~9NFe6|aZQH4fSqCKuI@gs;B-*2lhL)zv1 zN_t+qS-%3hBnaj7J#DpSJ11 zv>;$}!uo8*R9g-z>F;&(gSF9bIE(4Vf^NQM>SV!?k`K~f8u#;?X`d-zFhT=KnM@rf zHhRotUsHwof_OSLk|JZ#jHHWAkZ2~JN|L46bqHZQ!VZMH5PIo%Of`luCU+wY(BGLn zd@FUESMtlJg64<$th`9$9T(|=Hj;WQ6%!MZDI<=JC!!fKl8lat1h+%d<4hvMiD)`4 z8PXHO!(uuenIH)=goE9Q2_0B~Py_$cr5s0ltYtFeJAm=U^tg3D-#zt?^?BZZ4^)wq zTf25i%26>RX-49Sj7UfUkOL~R7d~Vy{a(=$4P$SH{-&s!579E)1N?gWY1?NGB(X*c z;RpgQG@vGF_()dhFfyD3gNLJJG%ac8>yk+*OsfEV zKHpKo27Zt}We@O!^pd@^mhCnh$n+-}N@6&QNSho>S~8e?5CNGbnIbYXhs8u95()6~ zaA=D*%45Z`Dnd8?grh;`Tb#+z+m3cVN~@i9A$da!{@nQ3(=miQZPO!IfDol;oTc(O zkH9#hW&}%)(^^+0zj-R;dRdX}LP`%nKuH!!8dA3cOj=h=j020sJ)W73AukHB^kb%mTlScbrK zgAIZH4y1rd&ps@Q07yo8iZNLh_5&%c27pcW`DD(cL`yzuaXF}`)Swx|Dt5Zv?3mhA zs^mxW8y^b%xt&MNA&iZT{UT;Z5&opooWxRu5&8vBt-Kp2X~C5azAG60Fn+hb38gK5;Vc{ zbC6W`riRiaNb4#+{!aisH+F7&Bpp_gU+FaAdKS>YO2o4m3fJ4%ZiJ1eb7_mT>JWYR6vm}dxCz)_YBNL#JX!s=E zL|P=w1fIo;Xe}f)j2j8kY2%ersgVB^w`R4~3x+PiROat%;bAB@-H3z5&!=jvVA^9q8qBwqpuILWh^X3|xT zDVc4U`a6WrBb-BE+It>Te~)k$0l7y00bxM|zku01$H*5k%fylif|@il#hyYk&On|E z6GSy+fmQRWD(S>nJi}P^6)1Rd>O(8ql$tMNlaJHqS1seeM1Q_&G`leKuVPU%0!pQ% z9!^apGqOmsp$p_4S{Ru%_!>6&I>NsoJdcnCNEZOG*(}URkJ1?vGtqd0ya2_of!~{6 z{SruMU03nc7aQ+Z@n5FumUS8wUXZ=cmfhMEBtzi9pK003_tSS9~Q}eD3%JC2uH@!qq4kefjGZtW-le{cq*NVWKy7%$%C*VN%9I*`3=uaeYo`r zMVA9RF`{NgCo%_E%z(287s7V=hghu36{VGsh2CXL{B6h(gjzb#zItBE&$V|dWbVC4 zZ*)AGT`(=kA6bqVd)UCt{YT|+C6hWRCdqfPmH|L=^ll6FbaieEMYai%&D%qvuFbo; zI%WTqXB2o4HqRepGn_1$M#xKJ72}1>iNYKQBE!){VkkO%kX(bx>!vCZM$?%}faA8N=#fjRl_2*E&noAW_^7`iIWtOs0Oi?=0jcLq24S$A}1& zNf!oe=@l$&8=8nGVj`(OkQqyWon`vqgi5mhzKI>En4M$e&zq^AVudUn+v0M!Vh!Ws zuE@`T)J31%a+mC*o}Rk7<%g=RZvl1E6izam81rp`DM*@h25fwqu>RhF3cv%b$IOGI zA17i=9Em5z*cJ%I-o}ErsIj++Ptnc2n`$p2;W_|Bpm8w~i)4X40voq)w!wv9zQbO2v-Img)n%VH0IK^$w1~ zOvmGxYNGr4Twxa^C4D>{Pr@RT!=j{Oj>(NR&}S0lEn%{R`WCP-S&~#N4#jPPSekK1 zjz-wL-=^Q~E8{QHclyc#zryCfL3kg537rK}Oy(AVw9@*JTdn0mGNyV$?F#$H zlv&2^0(llUum|MiBJQ#Ne~q;NKzJ7bHi1o=tsDvDmjJs$AUAosWQd9BVeo@^B*Ak^ zBs!dl9};D2jhuo#2F7POwxQrbKET!mW@6`(COSSYCS&pd@8Ottn&$!^*nYDKGA0+m zx``eE)kV^v3696WuB~F4D{~clWy3OwV#BJLM5S*tX!QAAZnYWudSdG8u4O#v*i(Cp zr+m9x6}l93ah@k*x;p5m}0^zUe+5U3yG|%_D`F(V@f5{??#FVTFYu%5)+$A~< z=6+ZdL_UdGD+2SaI5GK%$#hXC8y^=g&WZ48EdLC`ClHvIX1+)VSy>`fXg=w&dy3U= zXmOFAx#zlUIu#G_bmKCgBKmRq@*Y7Q=eRIWJBIAEW#BA5>2|gX+I0#)w_QJ=gwEKn zasHd+2a4yDT$mGdLP3~s;B$8selDP=C4*(lo`yPdL^5eX<@e>xlCP3{7Rs2}fFSm# z9NjbMAHvx~5dAEcFcx6@MWF=a*IA@7)830Iw(V7zV&cfSG;c8(Gth!8vY4+9mgq}> z4buuBKTZEQxSfBCZr|&3d@^)V_q^es4KudRX=CS{i8GeoveN9{GPdO}I;_a;A_O)L z8@7NR+UMQErh%IQ5_X3TmNbW=i3u=xOg1^Jr;v9M+oWM0uurf-ukI^Wdx7#g{q4Se zFlc||IsOf*-Cwtl4S?ngd`|_gl#Rle!E6t9e13k-dEs7IGn7hpIqZ)xo1NPPQU$~P zf}Y;L7KVdxgf?_GQg^gX!&a!LgHcaA_6M$cVc1HXKqWN1eE=)#`EYzPN@9^iaq%#z zhB~+CKSk?3>!Haot~2*T*;K;6n^qO&hpO!ATtQfoyN~kGUpIQ`_ft;#T(^_9`t9_K zg+^*STvsS48|V8H)a#THW&6vGVv(O}| zDdz^9^m?NQ`_%Ujp@=8718zq8e#$}j4LdC$&g+yuuJ16%88{zDXAV2_1AJxp|2IIj zGOP{j1U(x7?kRA90dI~0fhoi}id})NnQnD-% z#W9G8L9kFgNeze!SqgwRJ?PXyL*Ar6JK$epLZX@}5LB+kdW>Y67)MtPCpx$q66rhf zN{y@~)OxSI@weD%H^Mf6fNhcZqS%oV1ZIZ+8&k~69H!gv^<~|dN6RJ|J5yphl*)A7 z4@XN$y=7Z(mvBcPu9uY=6-8bR&Qj9J3xVjX4zm_;h!fES%odjiR9ppFju3^0X*~c~ z>n!}kpBz5Iz1q+ioM(`^qzUT24}zcm1tgAgbD9RV>#EKFxxotuXKb5J=&tHaCk~vl z+|qDP{}o5=jHC97W7Ujf)vTjzwzTq0>!(_;l-ACa)=t;8UL3ky+A-^?I@9~9-YcHE z8Bg8x^0sd%E_*f?&S^R4>N!s3)SuALnK@q#y?XHX{#zxS)idiVopm+Nmeriu`>DOx zwW>1xO-^MsK;;6%`?soSDCwqsNsCUhd*+mUVHrJ@T$4@1x*p!--CD|hv$_azZHIb` zU-7LC&5(InVNp)Jea_-D4_+oE?HP`7Rgr(7#B$vv&T%bumPNch&UoygQA_ zKE8!s&)Bof`?L8}LfwFT%#^guhJtX^!(g&2zkLE^Jr>|>?{w5;5q^Zp3_AhNA3M{e z9a=31j-l4H4t@c@`Z??!i>nNWsU3T4|*~DvZavGy{ zj?<{M?C$$ElaKBkH|6FYEj>ou)LK?RA2{SuDx+|ClT zqAqQ{BCP78^qL1%(YR~~jO|Up{v6Cvt!a|I>g@l##z6U); zOXugem5;s$_E@>I9+zM+fb}Jd==sjg+-g-WU;s~> z3t%y7Ee$Kf3c*vaScqF!a7p_>b8g6RemXX;dkM!)C}0~39Z6@{7M6MB3fp(CLm{el zhFwA#atFTU_!Ybh?i*qW*jfYU10TC{J+1JSsKR8aLTr`QW*2j&0=CtDhmEbQH!SdKd%*x6mDrETF`rcaIsQVdlAAsU!3c0Vsgt*u z{!OvRESLsr^IhubeMem#3(7LD^(-QRW*s_+NZ5BFB1tQJupULvUq$Faj2z zz-1Ov%rYfkqX^z2@nTFo9LYV$Nrs_`kr9!w1_8Z1UKbkeEeKl?cHx zy7ce?F*X4g)qhbRsL}zi?DWcU9nT_wRLuub>@E$W=EaXPRhTVBfQSoj09eSyoMjmj znJfG%q~PU2%n;nDMK^AzF?$Y6jl&5s3b#V?%}5<*PoSvi5`u9J#Ultn2fhXFQkbg-05+ zoinbEX=?}l_eVyR7Skqr^&>(1ni<#HY3tg#BF<=iY{SV7kF|faopv9OR(h+hcpGNC z4bv+(&v@Zb?3pdAxKdU>Q&vB{qJ5@pN>r&w9eZPXUR-g0FSXP`+y=5qTyk@#|<1EB2mLizQW(-%9 z7_KPQ+V^jPWw)2z2*kHmb{PBo-1l|P z&{F3Q{Q6L}@(1;GA)oT)5+2eo`_zB|J`~tT{tK#0IwIZ&hkw|76^RcYAWG`}Sea%x zO-6_cl9gF>6>xucZ!|fYf(zNqxO~V!%PJY?$!KHJM295nJSjF*&mQN~>`^@50ldJc z2_7c$6nMTKk*~LNy-j4|P|1ju)FT6Mwn(!lefb#&<20twk{QBWIC~Iy`8u2;2MIW2 zIM&S%kB{OcKE&=}BuAb|#CmwZizlO*6d`u%JLT-dNC6($@IMly<%j4plyMxP?5x=iTI=l4`z5mCO#TE8*&mv02Go(SIZu)7y_N5W2aEJi1& z_D{gfeBb-t_kHiZ@4f$f1FqjIE3@11zu)}S@6E{(o9%b$A@RR_>*hTbH=nUd zHYsPsrslA#U|n<7JocQg7O-ofT7;`GQao%|?IMlI9VrUj$6 zCs)dwDsk=3*e6JWlrI%XgZ>$nv8VClD#Vj6eU?HN;ySGu2j|~WL-=7me;Zk zGiA^K_9I9RsiI53YAQFO*)CNvnjKTyT;lV4ay4aW+xvVQlh00k?~-Q1q`HnAX>WV3w67~St6W=u zfaSUe(%&z&b>%|(2eL|EkY17wN{1L#JE#t3l&v6jNQasHk8Hx}s6}%OH0@dVbh7hs z92AGMP@IrXvYAdzRcExe4M|}FG+GU?=iUvQ*Fcxqj|kF~bX~f^_UhSW-d82B zG%fkqUj3lU=5=MvI%CZ`o1I^WO`5xqBPr5R>83PKyYAQ~eMAau$x0WtY^9rN<-?2* z!K{*TNg-*Gd4yY8X^uk1s^#k_8fVr;A{vK5kvYyptau&GI+ItrZLMYrG?~5J9gE8{ zD6-j@Cf#LwdMztWzI4x`d3_U_`xebdH=+3Q68~@srsoVV6Gzem~8qJ`JkO_K+|A zjD>GD!$3c~1q}3a7R}FNt}MEqs*^q=eU`20bDOODL2})n2UX_t@`m&a)_lLX$=-g+ zqWMBrK5t47Etw}AV8?fYKOe-o0=;sK<;1?m57<^jG6s)6U_$k3c1tw?V(s=t#> zi{GUNGo8x6EB!rwDy3h4p|k#d%NG<$Uz1j)ueS@EM!6oW|Jd^C|KtT~@*7z^0QdAo(qriz>7Q=!0OvB=|38!d`3qe2zmUF3_9y*IR;|dq zBK?J~$k?!=%r&yu_x&mO4d^&?taC~K%0l}8dJ~%8v}m%|PCBHxMU%aDa#UKgXr5rM z%>LMvz9sz|mNWboXtGsL{;l-ejON>*$%Zw5$I1r?Yh~O!@a?|?zWp8427Xui_bkKx z51<{+cuuGm`g=Tgkp5#fj-dHZ($fwB90ln=OaFys_5XEKp1*JL{BN7^{O{7b#q(W@ z=O1j!^F52_A8v`~A6Y#A$EH00*y8y=K{c9HLagp2{V&jD(;Tmi{qOgs_&=b?64$3% zrT@#c|NlUf5k*7#9|Y?96X`pHc!PjXPFDeP$lX#5_rm){QPAYV*0xZSn8?{m)f!aa zMt| zYhYta*_g6t#*}9p1I?tbhvc7;_cL^kY;;&@h2+F{C0QS|kQFz8W;;GrNtx{c&nzbb zbUQi5U=rAsZFWfjnOo~f5I%JA~@GGwwlkd)m^n{qz5!43|AHoJD) z)8y9y$}I5`>ph&b*X%Kz_J0(zPRWkmgJjFJtv3-&R-IdBFa=Vi#Nc0GNNjJ?Ji2ICnFA!75&$b%9fM zYn4FZ#%Ge^F|HT0QKRn?K9}*i!jRYt%zQKFy;#XrS_!U{sb@T0-}@>KW+ORFSv8f7 z?-Vj-x1hdmt#K-o*Z4rzcq6gK&GK&0c&wGZIO$!amErR$KHjc8Ykk>#(Dasl&}L`h zLwx^-UHV|1*(0!@M;6e@+0Gt|D>GS70Xw^_g7SjwOZp~O%g$a$A?{}JncG4}r2GKr z@+NeY5vefDIDY|13DOAQvtW7DV73uJA1=^^_-|Bjx0sz0y|?gDleF}vH)Fg4SMrDv zp1b3Y-uP}tc{@qD^uF`oNzT6v+U$9VX4Pu4|DwW*saW6L?6WfYyq28v9w={Q@}Sn9 zUr+8NE86-%eC>VgqEGq=zTwa4Ju~h;iq8*i5oi7I55T#|UP&Mu{}`_U;_l;{+RZ1p z-GJ_spv#`$d@4!zBcL0|Y!l$}qxk$7K0nUh^<+gX9|Zc&>aBkQ>-kA$C&jq?DSUo< z3%>KyTegwxwa4F2qRXFw)H43A6RY{zBvsZ7nfbb(WBKvVrz$g>R=fE7*G=*S%={V3 zMRBFyCcQX3@>$GynWH(}y;vkkb6ZFfcb|Kq`+k5KKcC$98<_hAp$E+S3;6t^g`n;9 z`{0f$^)T9gNj)-{Gy8@8Z{lanX7O0!htp5#7tn6AxJQ+}^KNB9HU-5$U`wqR(<J$v2NpdM z`A!5sP50jMSS<2Gs$W)BfddI zWxuxX5`LRM2L_QjB`o5fSG34QRSrk7F18@eP9hYU47HNfeYh=`OJIAt&OD2OsOk-v zMQok;Z9S-Hr|NcEL1Ac-|H8iXoT8%BIV%T!%UTJ)iX;rs(@(tB2Kr)ZF876k5w9=e zS(MdqDERcV=+Vl1d80VN8ZoMt2C$)QRKC36RRT}{1g&jCs?*G0oC^izrdYYtzjq_k=39#AhKuCI~|Hfm{_47tT(}r3ANA{iUuR<@>5bt`Z8dM z(Llf~B$JZE_!9%Zh)$4cWqkXhwf}ADkBW>xK#)RF)hBD)9QLUSQ;fF92^&a0CQXYmGfVnX zU5TACW=!CAWsw~p>{Y9E!<>gEL~HLG`Dk|ZI4!BcSuZyG-yO#Zp%-bgBeJ2 zBGXPYgk^Y!h<1eN`TZ8>(d;xtV#Cdnh#C!($50l-+QHt?!h-iuSYGtvk4j{}7*N6y zCI(KFCL9=Cl{?jH2?j<`jN=NkS8mJNp$$is>z18Z*3DL{z-FyKU@;4vtQ|UPA(5tZ zv^|Z=gJT=UpSx(y7x_&>OKCLXq8f^Xe4)V8qa@MobTF(*L~B%Ax&~9nuQcEdM?B%> zppQK0VRGB>CJT#+NvK;4M}0n+%S<#N66Ks43Mv}Ys#ZEm1QJ?BXT&UFjKClg4Y%dN zvE>c*jrQZ)ACSq-NmtJI4xJyw4FDUE5c{dYEM4*{v|W#it!t&1_><_ulet5~w`UfXzT{o@z};b3 zSk`usl*B>aEV``bgzHG1!Xoc9tMt=AsGp($o+wE%^C!snlQ9sz7Z5-zW@DVVB{nlk0Pb=C z-`IH|b{;Q+0q58vX1;+vPrnhL^lK*oBD`qa>(KeQA?TfXY`Dhp>Yu(|@SCBVOoCdZX$YmU>O!;S^q=45a&xHaA^O|EK^&ryv6LL)Y zbF)a5Z$%YEc&#qwFf5soyGV97Y(Nfd_5^akA)A%8hSd0Hu>qr2spzd88|UGiX@^S$ zHqCVu7WaoEFgU;H4U5Cl_<7N*s@~X9C+c)ODqbx)hI7@1$t&a7G`z^F{ zT0B11(`J@004OPoSPC%+Yt3vaVxpA|4~vlyg_ z7&p;t?Q8!MVpozWpNdq22q3qa`Aqr@D``7a#FeNLS-^R0$I)G2eQmjBG0rIdJW-AS zE~|0?cIoGES%`!zur@#^$O3EZK5Ui~a+9Ld3rd*0zF8Wk`v?v8M$B^W;$i?16)uI~ zv$i80mnQqnZOK~?gIC&4cD@p3oa{~KKD}%@X!#yCA)7qmXI16`mdNPu(AP4Fa2qXD zOs!ONJkt=?$_{NPwf!o8UJx4nTVOgPaXvgc>bF=>cN=wX&6)XLPNm9bUxws1$n zZfVJ8F>m!mLS{ZY4`y+~>4l$H9H+3S_OI1Er`x1rv~sqaq_>1TNSVoJ0+Qs_RVr_q zr6e1-yZ}c5Csm!UHCjFVgw-XcVYh_3Hd1Un@`-^dl#$AxpwV(Bn*eIb*&^g!!Zx!rJa2t|`HwFyV z>kax9^5EoVR6r7D-u3~yX8_tPW=MrK7csB!i?QX1%3+)(bWmQal_MnM8FtK`LCf+JMhjSr!v^nB=;SwTfHdmoh!=fP%;~@5 zT~HtJhhjoq>TN|{Qa{gI^2cXpkOaPgCo^B7odSii*ulJN3V#&K;NxKdte9Ae6vfOE z)(Qy`;z2B%@P@He^$VPN!2lvA9^b^HR>DSMiWE5F6R|l`5xks0BU>Y%tvtDAKBXho zpPaYI3G_#JUHu}TxyU8oL{LS;FVozP6c4@t(;lLI^BL?+2Aq2-Z|9t~Qr=^YDQ4h@ zi-4gXE`kMb#5d;&`w*c}e~73oK@XeuC6q3Lz@)I9N@PXYl;ZWU08R)#p+*w3xjp5C zrk6cX0#ZY>D%A*Y%1!SXTb^U7FQ?bGO9?kDPA^;eU|T^dRa7^6M{aEPq*Y_Z!=dR3 zAUF<0l?VWF4nv@(-A~yEiyvmu&CoQ5O9jw)@xbKhsK-4t)~^*0AW1z$(39FHoG!Q3 zPLMLuUer5&-tBVsy3Ha=y9ud*+CFsN-S0Xtog13KJ?TFfo>LalQ#j!4og8&v!Hw64 zsEUl)EOz&gO^myot}D33fe)!TChD(}<}KWlv|Y1&DWuLb?8DcbOFYNVd!!+Ezg9RN zJj9ZASgxyoY~0;X2XXBTQo>mpV`s<{qvOtLEiXNX5f$vH_lEKKP zBl&El@>-eXjrtX@=v2Ma3V>lM4bZwtULvHqAx~CdX z`0!!zkl1pH-I+zxau7A1NLX|9Sa)#wI5}`Ri3m=~2TLq!kW+{NC8{i@3|1r$wY(v< zV{y-pP)go3q=wBZE7~(oe%b2}psHlxU8<@nN?6M>GGgs}dQXhj%a&BACF0}}aSexJ)Z;5PI7 zRPPMgZt=uq&*+eJ4(VX=M06Twdk%F2*iY~1xP-=n-T2PRZ zm>fN8HIqTe8&!(PGVOu&iM)@XFMJ3~NCA6mFTny>9WzPC`w6ip>c}hzR00T5ibTat z)RU>rEGI$JM%WBtZSVOcdZ(V`++1mF8Zxjlt}4s*YtH^VlC4m{dW#S&HeIKC#HKR+$dK_`He8l*G)>geR?J7@l#0 zo10de_7FBJlHpuJJoQJBX5a_xPL(jqLLAAGfSqU3_h?r%Z?uQz+M`p(G*Oh5-<vp2}D#%bEts$2f&EpF(nYJR7PEQ{XTK#J@I zM@g9R@+>KM%i*vd5@S%`mzbDL+mWdii7F}4Dl(3SX3YYsfrf%@1Y8PT{TC+t zB{yymEm2V<2kq*YCdSW8{kXF#Oe+1D6kT~#7sNLTe0Z|=y84~&e$ViDPvZTLNa8`y zr~ zOTg8um0C+D=;}4gEWjZ1&a%W7cy9^!s~#WzdqgNyG8iuQ;=wEf{tu}h|w;dpp@$mqtGe*d}@&=HYB=YcN>Xp!?9{?Jr&T^9EDPmp|wKj{Jm{^up`CJoR zO2RSulYYcZOKh0H(h?gtfo5cGDQAItP?80;W6$uh3sfhW&=Pa*n#2d_q;io8T=20d8`CVf<&TEN5lfQ>|KEy6Z@_CrC?K$=0e* z=Lg~N^GzSQF()JjP-p0;^VKtXb4583`@T)4?#Y&vPDqZ6GF81206K%)xh|D5pa~ngbK_2)?rP~(+k>2 zX)k|i$oqE;0;Q{pZ)n1L`D1aQswuzCqvX@17qPN38^k*;vw-u&n*^!^VnaAsPN~<~ z2RA77yFKTT;UUk%f#DpAz}jL0J9XEx#+b3zgd!I7iOiE z2;hA}0_vLE#=OC0cZj|@`?B$%><;0JKiUUSQMW{52d+x|*VcA;JmlsSdQ%ipm1&CB z9*^1tyMGTlwwc2nbD;&fLkUwYzXL9ess!Nqz~l+&YjM9l=>) z=GVTstQLYH`=Z|}gntdm#V2jwF0cIP;Cg|rcze94HCEL6R#AL^x3RzbH;SC=xk6RJ zM@QG~tg}8=RKHeH`|XMypS~U6bs)Cuz)IfZ7X7M6530tlu%VX=MP@&Cv8SghgLYL)JO)oAeQ zj%jN;YF%;b6PWS3?zpj5u}iN$5U)ODR3D00cN*25@#;RKy6 zEUZnpgugLoNlF@WWcPy`OE2=7Aud+2BT5IiGt7~~M^lo9^j`DYRIk4HL zw9PiWzZ75CW*Q|=p`8$TVtUI){o<|XV&=2}Zj#GHoW^3$WX4#9u>`|h zfk+x$j6?#-zPAeE`%lI8pIV9N;}MYb@a0Ov98tC@jPfQZ8y@bAHy)2Q9$)FxM_&i! z0AJ@7zN4npj*^0Z6!`;?<=h}1b3%|VcZGX&8O^esKxM#GHmm`(GRtF=bM zdEGH?IpKt+jk*iE!Lzu^Mb`MH=MB#a8u%G+c{mf_*A?5>1)H3l zGxjOEJIN(#s0VU#Sfg09XP#O^|(*>+%^s@>5e-Il^~e(BPhY6w(f*7+S8P= zg}C%Vd(@;d^y9<&rK?8GHQh0lrVbcj*Tp;-*>ql%Ea7CX{ z4DqJ!n75R2I97LfWrsej7anFhxCt}SfR-*bu z)M&n~JC>|N-xaIxT5SZciJWob)iA+$T>vk(0TxqczN&mhiJurSP7K6Pj2kD$<0mc| zCobtTK@5!KjL^V6qii7Jbz=oi=)UK|Y+E&qqBG4X8bACKnsimGokrt1-7&Nw!s^3b zJ$TD#R&__%Iw;3uEzGU?^;;36C8|4aTmJ57tnuhd)oP#az8ZI5H{93bZolF7$K4Bt zdm-+=ZMZqGVIkqVAPawNvt1XWBsuHSbejoqNm#Eah5&ck8jr5EcCFPN)N2p%C|X?s z3AUt3Q2g*Em^@aGs(>DJWx=T7h=f_<(O8ou6`#@M*B$bftm+o5YANSDvnmz~D<%>r z;Bc(r@XCp=b-mpcKQm&S8Ht~98)w|{GgHPH#BCDsYdM!`pm>Ez^J+?(M*vCQ&Ci8< zs{Zo~`1HAEyJ{WHw zH`>Sb8}nd$i+hOeqXKxrgn7oo*)(m9%?#KC;PkNK?Qo50Y_^>Ee9!?V>7iGSJw~>3 zRd-yod~AEHzI~xAs+FDoL`sF#JISq>(kL@LAI^xsid-^aT#ZiuZFAB^Y72z(i+xHq{cQ4@sI0W7R z+?XFf5^FrNlBW-Pbnmi0pn=^vVT6Xd5GHYvg)p&eiZFIjuw&DsE*r-3PJI-tf%0|N(-EnrUV(-J-@z#^E){`s#$9+aC*Db@&U9tULt9eLtuX*Fw z{KhqZ{Mx*6Z9aZ2VqA;FuiZ1Q-NPcs1RpJLPUs=UT*#fth3eX7nSSPS*N;>qG@P(C z9(>Yzj61U~5htoACm9ur zUWoDU7TGGRDI@2wH&#P}S}&#^yREW5QGj^lUkw`#Bf4XBy@dKoZI!i&N(2fkC$G`w z<=jQu_PyNuB!l{HLS+@sy!A2~QEsbjO60;A@iI%xMg%tr&kGr1M2nv(S{Bx~(FljF zvXQC+JSIJEHkt@!uUAlCWg0iitc_+mf9u<+ugX^0Ldcn{_3e;;^?GbCow)TK=tPvR zY)E8}#+iFD@pavCe|;B?+r5FOF&s3SL%L&ey_z~}Y?UIVN!(_Qa|~!S63|%RL;baB z0(sPD^j$RSF6oZT>vhywZ>wy6IPj(MFOILY7{fFA0-eNeVSwCvH%uO~qYHat0I?ef zfIazmpHG0ux&cBk?tab;32Sd68C-9mDMVZ4{GuFj>h@i^)?!Nz*bpD zxhy}_7&L&`1M15HLYvK|2oVy5BHSm2bYV{}GB-tV5vw^tBEAi7#&7 z`i#+lzWkc8_nz)}ef<#ix7#ZBKAibd=!+rhRg8U<1FUyY*I`@bK5`1DW38uGkH=bv zbjR@e5$ZX*LCD4gnBFzom>`Z(f2TF_Oso~vg~x8A)ulV6_2blc!ZIM9XRk(##!=ld zwtkZOPNnOh(-@i6Be#tfma278|LJFpZ$=N_HX2#~8R|d#jDoJ}UMo#qf0_DUu`K(Q zSo15Zw+#1PqnR!GBh=ZQW1X{8u_n|CAXxl2k4W0nC=@`x3&J2t_F}F~Vs4&cVupWn z=Fn(3GOqlCu|23OVOU=div?b8t+#|FQrRs*BbIbwPfk+cEf@xS8s<;K{7K?Z>@p3P z0?KIaP#)RNFmov*dF#Dw@^d-1#`Y(z$J1cXNX`Mc*Nf@ywPkCdJI%BHnTwwA-^#1VFtHiy_ zhIcvEK>p-O#m)x>@!f5)-EEHszB=@kp?GJX(b*U895Xt{;+>NQ{`r@o&HFj5+E$&Y zwryIEAk_I}*IqDZ;B{ZDa^It!U#S88(g#$B(!S{PQk?`)!_xY)5vS zhB`T$rUaYKFtBmsCfF?IoFj|9ButUF-F|%oH^Q(`#?}mL1Mp!&eI}597v`2qEcO~B zcZ_k-)*|iO)OiaTtA9`)TGH=4(h(O1O zxX-#w-eWd5#3BzvCl$AH(~jh$zE#P%Q8v}CXq86mu8HnS=}*bDS!&pk0S2~#+4aEECS~v5+x4*jlmF4)!LF43L{N#jjaw2~6vVniI{NPFC z(Wix*WYe|t^iUBH*!cqxXgvCa>KDlr@|hCtlZxgK-{4bOm+u{`MEitZktAMhd|feW z3HdM?zIp$R`;Xl3lo}0GcYTt2BlRfH=!P@88LOVx9RW)Pl!-&$Gv83YuEYl}8Uq*O z10G|*6Cao}2IlmIC}LHRr?l2(61f=!DNZv%A`jSZ$3fX`YwUc|dWIjAJsV3v@8>j< z>6h-jU^EkYc#=xVj8t1P&m>!y$x($6TA|Lt+#zP`!z@gXAVExeoYkttn~Y@BiaXZO zqdR(^@XV?sR^PF*?`v&ux5ZBn8>ffkrzPXG6hD2D0sZLaStaI2Nt7~7``L*h|tK(fmM%Pfh%Vl)A;$2q_{8OSBco&cYmwE;X zE2c1Gst#E2jpDBt$Gazt?umH!6{Gt~yxVKw-{M`2a3U|or71CReMbotlwS_#)myTd zUs>>pVRZuUhS^)(wr%E4{wBPg-dne)exIto0vfa0>hw>y^Z!q;_T>BWUC+LiZ=Yd* zGOnJYfqSgp)DH&Q!Na2HAc_q?%}Sehh&oG>iwe&0pEeXHSHgY;!G6BL-$v7mZoZ=n zG_>d}|5?Q=>J>cVpDlbCU+cL!IXUkY*mCN>WfQ+;!*|oSY<0h76Mx&b{|^i9<@dve6Uc_@@X998v%P literal 2219 zcma)7J#5=X6ecN&`mtYNt*C(^&!o1SMYNvni52 zQf}-iK!MI#T6oOb&7GPtLx+r{GSIjs0Xlh8;C5~MNJ_1WC_fa$yZ7$9ci(;Q-SMoy zKf%EB`Ri9Z4|#_9-7`8*q}@3yL+3|EWJLBJLs)3Jd)#`6gx13(e33~rml!dWWyJ7y zXw#3@2@tf4p`ay^8k>)tddB@cM-z2iBeI2c&7^!?SCDE}17PqTY8z+2ao+0N{>p?C zSrQUC5-u<#vdwP}bWaKT9vk2i+w4T>g1{IDzlg|-(WP*a6JvlI?gF&CfQyTXB^D5U zfEewCSZq51ll%lsKVZ_m;sBcgf2F~XA_PEWd&c0zloz8A6^E9%_v&))lXV$}l|HP? z2q4b)dh&`S398`LJ!|e58u^yePT|$Bu*`bAQv$&7X^-th|^@Wb~!&o;~SltKaIlFEgD+aE0n`Z znR08Te3&NXhNVkYf@BLRw9g>8E|UXk4;|3Bi3pZee28drACZb~B1x0$h(;`Isp#}? z2$*N#Sjmqi6=^kVhYl#ntP*T^hfG4+|81GjBsL|ZQBkqEgA|w>RnQ~3p;~mv&`ls9 z0T&f(dq}|=O|)4_vIWq9sHT4>$%+D}IqXy6A7P{_CXKJknt~PB1jzs`8bNg#tEYc? zeV!n*QAdZdpfw8+E#5FxUG~fU5>spdvx4Cv%`8XX!t~y);H+ zlJAftnvf*8ml`U9eo~UYZOE#(ORxqd=@BNT1>zu02S*fZ*n;fPq=F2jDM+hgWD@V@ zqkXG>Iyby4j)Xl=@;0umK%&c@S|HYrOxoQo^wfF8~lH_TNtB_iY z;7Y?nrX-PBpn3*>hOQTO^g1eF(_6J*5PcU_EwdoQe@~VhJ21~IbZK4q?`khxyLRm} zsjbeuaX{cB!}u@n0GL0q4D$o?W?<;a-By?#=AV4siZStXZfv3%n>b00zDbQd-FL@k zn`5)j!!M`phmx%kXUwz(>m-#vnsKwU&Ft)P)yXc~!i|$u?%8#BYN0u`@M>z&7OwYj zOgmefP?8^UCszMd!+zEv%oUE*$Ni%>vvbF$lf7XJH&0TTqwDVY zTyuQxc-I+Uv4z`Rte;OiQ(xM`t!~uX%PD94zAb#ygC~B0f#DBj|Zgmos=V>M= zrg^0@AAG6jI~7Hi0Y>Bhj{7C=S9y?WuZV(BD;_X*GdNLSkP?`Xe8!xFS1ZJ_>>1Cn Zx!26qKlmKWKTWv8v?EOa$$;Sp_y;!NFk%1z diff --git a/recruitment/migrations/__pycache__/__init__.cpython-313.pyc b/recruitment/migrations/__pycache__/__init__.cpython-313.pyc index bde0d3df1c526103f741a3857c08c63d9c1bce95..f41c21065ada0a9725ccb7e7a4f0f176cd67ccfb 100644 GIT binary patch delta 19 ZcmZ3^xSWyuGcPX}0}xzme>RbO4gfUw1?~U< delta 19 ZcmZ3^xSWyuGcPX}0}z/', views.form_wizard_view, name='form_wizard'), path('forms/form//submit/', views.submit_form, name='submit_form'), - path('forms//submissions//', views.form_submission_details, name='form_submission_details'), + path('forms//submissions//', views.form_submission_details, name='form_submission_details'), + path('forms/template//submissions/', views.form_template_submissions_list, name='form_template_submissions_list'), path('api/templates/', views.list_form_templates, name='list_form_templates'), path('api/templates/save/', views.save_form_template, name='save_form_template'), diff --git a/recruitment/utils.py b/recruitment/utils.py index b252c57..fdfa198 100644 --- a/recruitment/utils.py +++ b/recruitment/utils.py @@ -465,7 +465,7 @@ def send_interview_email(scheduled_interview): fail_silently=False, ) -def get_available_time_slots(schedule): +def get_available_time_slots(schedule, breaks=None): """ Generate a list of available time slots based on the schedule criteria. Returns a list of dictionaries with 'date' and 'time' keys. @@ -481,8 +481,6 @@ def get_available_time_slots(schedule): # 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) @@ -492,6 +490,7 @@ def get_available_time_slots(schedule): print(f"Date range: {current_date} to {end_date}") print(f"Time range: {start_time} to {end_time}") print(f"Slot duration: {slot_duration}") + print(f"Breaks: {breaks}") while current_date <= end_date: # Check if current day is a working day @@ -510,13 +509,15 @@ def get_available_time_slots(schedule): if slot_end_time > end_time: break - # Check if slot conflicts with break time + # Check if slot conflicts with any break time conflict_with_break = False - if break_start and break_end: - # Check if the slot overlaps with break time - if not (current_time >= break_end or slot_end_time <= break_start): - conflict_with_break = True - print(f"Slot {current_time}-{slot_end_time} conflicts with break {break_start}-{break_end}") + if breaks: + for break_time in breaks: + # Check if the slot overlaps with this break time + if not (current_time >= break_time.end_time or slot_end_time <= break_time.start_time): + conflict_with_break = True + print(f"Slot {current_time}-{slot_end_time} conflicts with break {break_time.start_time}-{break_time.end_time}") + break if not conflict_with_break: # Add this slot to available slots diff --git a/recruitment/views.py b/recruitment/views.py index 95a2b40..9ab9d48 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -1,6 +1,7 @@ import json import requests from rich import print +from django.template.loader import render_to_string from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_http_methods from django.http import JsonResponse @@ -10,19 +11,23 @@ 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,InterviewScheduleForm +from .forms import ZoomMeetingForm,JobPostingForm,FormTemplateForm,InterviewScheduleForm,BreakTimeFormSet 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,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,schedule_interviews,get_available_time_slots from django.views.decorators.csrf import ensure_csrf_cookie +from .models import FormTemplate, FormStage, FormField,FieldResponse,FormSubmission,InterviewSchedule,BreakTime, ZoomMeeting, Candidate, JobPosting import logging +from datastar_py.django import ( + DatastarResponse, + ServerSentEventGenerator as SSE, + read_signals, +) logger=logging.getLogger(__name__) @@ -194,7 +199,6 @@ def create_job(request): - def edit_job(request,slug): """Edit an existing job posting""" if request.method=='POST': @@ -575,14 +579,8 @@ def applicant_job_detail(request,slug): # submissions = form.submissions.all().order_by('-submitted_at') # # Pagination -# paginator = Paginator(submissions, 20) -# page_number = request.GET.get('page') -# page_obj = paginator.get_page(page_number) +# -# return render(request, 'forms/form_submissions.html', { -# 'form': form, -# 'page_obj': page_obj -# }) @ensure_csrf_cookie @@ -732,9 +730,8 @@ def create_form_template(request): template = form.save(commit=False) template.created_by = request.user template.save() - messages.success(request, f'Form template "{template.name}" created successfully!') - return redirect('form_builder', template_id=template.id) + return redirect('form_templates_list') else: form = FormTemplateForm() @@ -770,15 +767,19 @@ def submit_form(request, template_id): """Handle form submission""" try: template = get_object_or_404(FormTemplate, id=template_id) - print(template) - # Create form submission - submission = FormSubmission.objects.create( - template=template, - applicant_name=request.POST.get('applicant_name', ''), - applicant_email=request.POST.get('applicant_email', '') - ) + # # Create form submission + # print({key: value for key, value in request.POST.items()}) + # first_name = next((value for key, value in request.POST.items() if key == 'First Name'), None) + # last_name = next((value for key, value in request.POST.items() if key == 'Last Name'), None) + # email = next((value for key, value in request.POST.items() if key == 'Email Address'), None) + # phone = next((value for key, value in request.POST.items() if key == 'Phone Number'), None) + # address = next((value for key, value in request.POST.items() if key == 'Address'), None) + # resume = next((value for key, value in request.POST.items() if key == 'Resume Upload'), None) + # print(first_name, last_name, email, phone, address, resume) + # create candidate + submission = FormSubmission.objects.create(template=template) # Process field responses for field_id, value in request.POST.items(): if field_id.startswith('field_'): @@ -806,7 +807,29 @@ def submit_form(request, template_id): ) except FormField.DoesNotExist: continue + try: + first_name = submission.responses.get(field__label="First Name") + last_name = submission.responses.get(field__label="Last Name") + email = submission.responses.get(field__label="Email Address") + phone = submission.responses.get(field__label="Phone Number") + address = submission.responses.get(field__label="Address") + resume = submission.responses.get(field__label="Resume Upload") + submission.applicant_name = f"{first_name.display_value} {last_name.display_value}" + submission.applicant_email = email.display_value + submission.save() + Candidate.objects.create( + first_name=first_name.display_value, + last_name=last_name.display_value, + email=email.display_value, + phone=phone.display_value, + address=address.display_value, + resume=resume.get_file if resume.is_file else None, + job=submission.template.job + ) + except Exception as e: + logger.error(f"Candidate creation failed,{e}") + pass return JsonResponse({ 'success': True, 'message': 'Form submitted successfully!', @@ -818,16 +841,32 @@ def submit_form(request, template_id): 'error': str(e) }, status=400) -def form_submission_details(request, form_id, submission_id): +def form_template_submissions_list(request, template_slug): + """List all submissions for a specific form template""" + template = get_object_or_404(FormTemplate, slug=template_slug, created_by=request.user) + + submissions = FormSubmission.objects.filter(template=template).order_by('-submitted_at') + + # Pagination + paginator = Paginator(submissions, 10) # Show 10 submissions per page + page_number = request.GET.get('page') + page_obj = paginator.get_page(page_number) + + return render(request, 'forms/form_template_submissions_list.html', { + 'template': template, + 'page_obj': page_obj + }) + +def form_submission_details(request, template_id, submission_id): """Display detailed view of a specific form submission""" # Get the form template and verify ownership - form = get_object_or_404(FormTemplate, id=form_id, created_by=request.user) + template = get_object_or_404(FormTemplate, id=template_id, created_by=request.user) # Get the specific submission - submission = get_object_or_404(FormSubmission, id=submission_id, template=form) + submission = get_object_or_404(FormSubmission, id=submission_id, template=template) # Get all stages with their fields - stages = form.stages.prefetch_related('fields').order_by('order') + stages = template.stages.prefetch_related('fields').order_by('order') # Get all responses for this submission, ordered by field order responses = submission.responses.select_related('field').order_by('field__order') @@ -839,22 +878,21 @@ def form_submission_details(request, form_id, submission_id): 'stage': stage, 'responses': responses.filter(field__stage=stage) } - # print(stages) + return render(request, 'forms/form_submission_details.html', { - 'form': form, + 'template': template, 'submission': submission, 'stages': stages, 'responses': responses, 'stage_responses': stage_responses }) - - -def schedule_interviews_view(request, slug): - job = get_object_or_404(JobPosting, slug=slug) +def schedule_interviews_view(request, job_id): + job = get_object_or_404(Job, id=job_id) if request.method == 'POST': - form = InterviewScheduleForm(slug, request.POST) + form = InterviewScheduleForm(job_id, request.POST) + break_formset = BreakTimeFormSet(request.POST) # Check if this is a confirmation request if 'confirm_schedule' in request.POST: @@ -862,7 +900,7 @@ def schedule_interviews_view(request, slug): 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) + return redirect('schedule_interviews', job_id=job_id) # Create the interview schedule schedule = InterviewSchedule.objects.create( @@ -875,6 +913,15 @@ def schedule_interviews_view(request, slug): candidates = Candidate.objects.filter(id__in=schedule_data['candidate_ids']) schedule.candidates.set(candidates) + # Add break times to the schedule + if 'breaks' in schedule_data and schedule_data['breaks']: + for break_data in schedule_data['breaks']: + break_time = BreakTime.objects.create( + start_time=datetime.strptime(break_data['start_time'], '%H:%M:%S').time(), + end_time=datetime.strptime(break_data['end_time'], '%H:%M:%S').time() + ) + schedule.breaks.add(break_time) + # Schedule the interviews try: scheduled_count = schedule_interviews(schedule) @@ -885,16 +932,16 @@ def schedule_interviews_view(request, slug): # Clear the session data if 'interview_schedule_data' in request.session: del request.session['interview_schedule_data'] - return redirect('job_detail', slug=slug) + return redirect('job_detail', pk=job_id) except Exception as e: messages.error( request, f"Error scheduling interviews: {str(e)}" ) - return redirect('schedule_interviews', slug=slug) + return redirect('schedule_interviews', job_id=job_id) # This is the initial form submission - if form.is_valid(): + if form.is_valid() and break_formset.is_valid(): # Get the form data candidates = form.cleaned_data['candidates'] start_date = form.cleaned_data['start_date'] @@ -902,11 +949,18 @@ def schedule_interviews_view(request, slug): 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'] + # Process break times + breaks = [] + for break_form in break_formset: + if break_form.cleaned_data and not break_form.cleaned_data.get('DELETE'): + breaks.append({ + 'start_time': break_form.cleaned_data['start_time'].isoformat(), + 'end_time': break_form.cleaned_data['end_time'].isoformat() + }) + # Create a temporary schedule object (not saved to DB) temp_schedule = InterviewSchedule( job=job, @@ -915,14 +969,20 @@ def schedule_interviews_view(request, slug): 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 ) + # Create temporary break time objects + temp_breaks = [] + for break_data in breaks: + temp_breaks.append(BreakTime( + start_time=datetime.strptime(break_data['start_time'], '%H:%M:%S').time(), + end_time=datetime.strptime(break_data['end_time'], '%H:%M:%S').time() + )) + # Get available slots - available_slots = get_available_time_slots(temp_schedule) + available_slots = get_available_time_slots(temp_schedule, temp_breaks) if len(available_slots) < len(candidates): messages.error( @@ -931,6 +991,7 @@ def schedule_interviews_view(request, slug): ) return render(request, 'interviews/schedule_interviews.html', { 'form': form, + 'break_formset': break_formset, 'job': job }) @@ -951,11 +1012,10 @@ def schedule_interviews_view(request, slug): '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] + 'candidate_ids': [c.id for c in candidates], + 'breaks': breaks } request.session['interview_schedule_data'] = schedule_data @@ -968,15 +1028,16 @@ def schedule_interviews_view(request, slug): 'working_days': working_days, 'start_time': start_time, 'end_time': end_time, - 'break_start_time': break_start_time, - 'break_end_time': break_end_time, + 'breaks': breaks, 'interview_duration': interview_duration, 'buffer_time': buffer_time }) else: - form = InterviewScheduleForm(slug=slug) + form = InterviewScheduleForm(job_id=job_id) + break_formset = BreakTimeFormSet() return render(request, 'interviews/schedule_interviews.html', { 'form': form, + 'break_formset': break_formset, 'job': job - }) \ No newline at end of file + }) diff --git a/templates/base.html b/templates/base.html index caf1cc4..010b2ab 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,4 +1,5 @@ {% load i18n static %} +{% load partials %} @@ -99,7 +100,7 @@ background-color: var(--kaauh-light-bg); color: var(--kaauh-teal-dark); } - + /* Language Toggle Button Style */ .language-toggle-btn { color: white !important; @@ -470,20 +471,19 @@ +

- {% if messages %} - {% for message in messages %} - + {% if messages %} + {% for message in messages %} + {% endfor %} - {% endif %} - - {% block content %} - {% endblock %} -
- + {% endif %} + {% block content %} + {% endblock %} +