From cbace0274a5f4c144827a60c5f1924233284aaeb Mon Sep 17 00:00:00 2001 From: Faheed Date: Thu, 13 Nov 2025 15:31:45 +0300 Subject: [PATCH 1/5] ui consitant --- templates/meetings/list_meetings.html | 5 ++- templates/participants/participants_list.html | 12 +++---- templates/recruitment/agency_list.html | 33 ++++++++----------- templates/recruitment/candidate_list.html | 18 +++++++--- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/templates/meetings/list_meetings.html b/templates/meetings/list_meetings.html index c0a2972..391bdd9 100644 --- a/templates/meetings/list_meetings.html +++ b/templates/meetings/list_meetings.html @@ -40,8 +40,7 @@ transition: all 0.2s ease; display: inline-flex; align-items: center; - gap: 0.4rem; - padding: 0.5rem 1rem; + gap: 0.25rem; } .btn-main-action:hover { @@ -209,7 +208,7 @@ -
+
-
- + + +
+ {% if page_obj %} diff --git a/templates/recruitment/candidate_list.html b/templates/recruitment/candidate_list.html index efb3acd..5ffafb6 100644 --- a/templates/recruitment/candidate_list.html +++ b/templates/recruitment/candidate_list.html @@ -39,7 +39,7 @@ } /* Main Action Button Style (Teal Theme) */ - .btn-main-action { + .btn-main-action { background-color: var(--kaauh-teal); border-color: var(--kaauh-teal); color: white; @@ -47,8 +47,7 @@ transition: all 0.2s ease; display: inline-flex; align-items: center; - gap: 0.4rem; - padding: 0.5rem 1rem; + gap: 0.25rem; } .btn-main-action:hover { @@ -226,6 +225,14 @@ {% endfor %} + + + + +
+ +
+ {% endif %} - {% if status_filter %}{% endif %} + {# Hidden inputs to persist other filters #} + {% if search_query %}{% endif %} + {% if status_filter %}{% endif %} + {% if candidate_name_filter %}{% endif %} -
+
+ + +
+ +
-
+
-
+
- {% if status_filter or search_query or candidate_name_filter %} + {% if status_filter or search_query or candidate_name_filter or type_filter %} {% trans "Clear" %} @@ -225,59 +190,63 @@
- {% if meetings %} + + {% if meetings_data %}
- {# View Switcher #} + {# View Switcher (not provided, assuming standard include) #} {% include "includes/_list_view_switcher.html" with list_id="meetings-list" %} {# Card View #}
- {% for meeting in meetings %} + {% for meeting in meetings_data %}
-
{{ meeting.topic }}
- - {{ meeting.status|title }} +
{{ meeting.topic }}
+ {# Display the type badge (Remote/Onsite) #} + + {{ meeting.type|title }}

- {% trans "Candidate" %}: {% if meeting.interview %}{{ meeting.interview.candidate.name }}{% else %} - - {% endif %}
- {% trans "Job" %}: {% if meeting.interview %}{{ meeting.interview.job.title }}{% else %} - - {% endif %}
- {% trans "ID" %}: {{ meeting.meeting_id|default:meeting.id }}
+ {% trans "Candidate" %}: {{ meeting.interview.application.person.full_name|default:"N/A" }}
+ {% trans "Job" %}: {{ meeting.interview.job.title|default:"N/A" }}
+ + {# Dynamic location/type details #} + {% if meeting.type == 'Remote' %} + {% trans "Remote ID" %}: {{ meeting.meeting_id|default:meeting.location.id }}
+ {% elif meeting.type == 'Onsite' %} + {# Use the details object for concrete location info #} + {% trans "Location" %}: {{ meeting.details.room_number|default:meeting.details.physical_address|truncatechars:30 }}
+ {% endif %} {% trans "Start" %}: {{ meeting.start_time|date:"M d, Y H:i" }}
- {% trans "Duration" %}: {{ meeting.duration }} minutes{% if meeting.password %}
{% trans "Password" %}: Yes{% endif %} + {% trans "Duration" %}: {{ meeting.duration }} minutes

+ + + {{ meeting.interview.get_status_display }} +
- + {% trans "View" %} - {% if meeting.join_url %} + {% if meeting.type == 'Remote' and meeting.join_url %} - {% trans "Join" %} + {% trans "Join Remote" %} + {% elif meeting.type == 'Onsite' %} + {% endif %} - - + + {# CORRECTED: Passing the slug to the update URL #} + - {% endif %} + {# Display the event type badge #} + {{ meeting.type|title }} + + + {{ meeting.interview.application.person.full_name }} - {% if meeting.interview %} {{ meeting.interview.job.title }} - {% else %} - - {% endif %} - {{ meeting.meeting_id|default:meeting.id }} {{ meeting.start_time|date:"M d, Y H:i" }} {{ meeting.duration }} min - {% if meeting %} - - {% if meeting.status == 'started' %} - - {% endif %} - {{ meeting.status|title }} + {# Display the meeting status badge from the ScheduledInterview model #} + + {{ meeting.interview.get_status_display }} - {% else %} - -- - {% endif %}
- {% if meeting.join_url %} + {% if meeting.type == 'Remote' and meeting.join_url %} {% endif %} - + - + {# CORRECTED: Passing the slug to the update URL #} +
- {# Pagination (Standardized) #} + {# Pagination (All filters correctly included in query strings) #} {% if is_paginated %}
-{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/templates/meetings/reschedule_onsite_meeting.html b/templates/meetings/reschedule_onsite_meeting.html new file mode 100644 index 0000000..6a81ca4 --- /dev/null +++ b/templates/meetings/reschedule_onsite_meeting.html @@ -0,0 +1,111 @@ +{% load static i18n %} +{% load widget_tweaks %} + +
+
+
+
+ + {% trans "Update Onsite Interview" %} for **{{ candidate.name }}** +
+

{% trans "Job" %}: {{ job.title }}

+

{% trans "Location Type" %}: {% trans "Onsite" %}

+
+
+ +
+
+ {% csrf_token %} + +
+ + {# --- STATUS FIELD (Now Visible and Selectable) --- #} +
+ + {{ form.status|add_class:"form-select" }} + {% for error in form.status.errors %} +
{{ error }}
+ {% endfor %} +
+ +
+ {# --- TOPIC FIELD --- #} +
+
+ + {{ form.topic|add_class:"form-control" }} + {% for error in form.topic.errors %} +
{{ error }}
+ {% endfor %} +
+
+ + {# --- ROOM NUMBER FIELD --- #} +
+
+ + {{ form.room_number|add_class:"form-control" }} + {% for error in form.room_number.errors %} +
{{ error }}
+ {% endfor %} +
+
+
+ + + {# --- ADDRESS FIELD --- #} +
+ + {{ form.physical_address|add_class:"form-control" }} + {% for error in form.physical_address.errors %} +
{{ error }}
+ {% endfor %} +
+ +
+ +
+ {# --- START TIME FIELD --- #} +
+
+ + {{ form.start_time|add_class:"form-control" }} + {% for error in form.start_time.errors %} +
{{ error }}
+ {% endfor %} +
+
+ + {# --- DURATION FIELD --- #} +
+
+ + {{ form.duration|add_class:"form-control" }} + {% for error in form.duration.errors %} +
{{ error }}
+ {% endfor %} +
+
+
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/templates/meetings/schedule_onsite_meeting_form.html b/templates/meetings/schedule_onsite_meeting_form.html new file mode 100644 index 0000000..2c2fecd --- /dev/null +++ b/templates/meetings/schedule_onsite_meeting_form.html @@ -0,0 +1,98 @@ +{% load static i18n %} +{% load widget_tweaks %} + +
+
+
+
+ + {% trans "Schedule New Onsite Interview" %} for **{{ candidate.name }}** +
+

{% trans "Job" %}: {{ job.title }}

+

{% trans "Location Type" %}: {% trans "Onsite" %}

+
+
+ +
+ {# The action_url is passed from the view and points back to the POST handler #} +
+ {% csrf_token %} + + {# --- HIDDEN FIELDS (application, job, status) --- #} + {# These fields are crucial for creating the ScheduledInterview record #} + {{ form.application }} + {{ form.job }} + {{ form.status }} + + {# --- TOPIC FIELD --- #} +
+ + {{ form.topic|add_class:"form-control"|attr:"required" }} + {% for error in form.topic.errors %} +
{{ error }}
+ {% endfor %} +
+ + {# --- ADDRESS FIELD --- #} +
+ + {{ form.physical_address|add_class:"form-control"|attr:"required" }} + {% for error in form.physical_address.errors %} +
{{ error }}
+ {% endfor %} +
+ + {# --- ROOM NUMBER FIELD --- #} +
+ + {{ form.room_number|add_class:"form-control" }} + {% for error in form.room_number.errors %} +
{{ error }}
+ {% endfor %} +
+ +
+ +
+ {# --- START TIME FIELD --- #} +
+
+ + {# Assumes start_time widget is DateTimeInput with type='datetime-local' #} + {{ form.start_time|add_class:"form-control"|attr:"required" }} + {% for error in form.start_time.errors %} +
{{ error }}
+ {% endfor %} +
+
+ + {# --- DURATION FIELD --- #} +
+
+ + {{ form.duration|add_class:"form-control"|attr:"required" }} + {% for error in form.duration.errors %} +
{{ error }}
+ {% endfor %} +
+
+
+ +
+ +
+
+
+
\ No newline at end of file diff --git a/templates/recruitment/candidate_interview_view.html b/templates/recruitment/candidate_interview_view.html index 98ab26f..fb6a4fa 100644 --- a/templates/recruitment/candidate_interview_view.html +++ b/templates/recruitment/candidate_interview_view.html @@ -304,8 +304,8 @@
- {% if candidate.get_latest_meeting.topic %} - {{ candidate.get_latest_meeting.topic }} + {% if candidate.get_latest_meeting %} + {{ candidate.get_latest_meeting }} {% else %} -- {% endif %} @@ -380,8 +380,10 @@ {% endif %} - - {% if candidate.get_latest_meeting %} + + {% if candidate.get_latest_meeting %} + {% if candidate.get_latest_meeting.location_type == 'Remote'%} + + {% else%} + + + + + + {% endif %} {% else %} + {% endif %} -- 2.39.5 From d0235bfefe75decba8d6276028ab8d88ecfb9061 Mon Sep 17 00:00:00 2001 From: Faheed Date: Mon, 17 Nov 2025 12:48:32 +0300 Subject: [PATCH 3/5] changes --- .../__pycache__/settings.cpython-312.pyc | Bin 8849 -> 8897 bytes .../__pycache__/urls.cpython-312.pyc | Bin 3229 -> 3238 bytes recruitment/__pycache__/admin.cpython-312.pyc | Bin 9926 -> 9831 bytes recruitment/__pycache__/forms.cpython-312.pyc | Bin 78644 -> 84205 bytes .../__pycache__/models.cpython-312.pyc | Bin 106984 -> 107063 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 1236 -> 1245 bytes .../__pycache__/signals.cpython-312.pyc | Bin 8114 -> 7900 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 185031 -> 187287 bytes recruitment/admin.py | 2 +- recruitment/forms.py | 6 +- recruitment/models.py | 494 ++++++++++-------- 11 files changed, 277 insertions(+), 225 deletions(-) diff --git a/NorahUniversity/__pycache__/settings.cpython-312.pyc b/NorahUniversity/__pycache__/settings.cpython-312.pyc index 741dbde2ba80d3bcafbd3231b3d0a7c1e09f0779..d8f921754502ef2231465b51df5fc35dda9a39a4 100644 GIT binary patch delta 1114 zcmYLHOH&kA6z)^rAq`@bhH!%0IawBrr^*7S-P0Jx7>!_@Mvv!gE|R>ON6OWJ;p&@6yLthpt8ZaZ>2wXvUBdacq&s#&z9V^dc zEyLm*4TbWC3fSx_x{j5yFlLMytUCI(#%*qB4eNLhckn*jA7BF?;v?L3yts!=e2h2K)XHisLQ#eC&yL#t@Xs-UHypuk<)Y{i@osj70|97ggM6 zW|C>6>a&ycONQHcHITP*dBd_zqY(30UsWDN{_u&Pq!AqnC*ljaj1j+?Trdp8XRX{V qBV`xlkI|ukUuYVCTA?JLMehcl*Le5qziE-@yDOUqc6z-&j{OTa#Y<-Z delta 1068 zcmYLIOLG)e6rS7D^I&iyjPoF1LP7$`Oh_gP3FO5y8NwssC15-%8u*${>r8smGbALU zqljTozvXZgNwF_5l+*oA|mOB?NEGd71=Qb7XuJfI9&*STJ?(O?yZY|ev zKN^kr`04pQVcqXrYpC}liUw1ogz3ZMRY6H?q7*{31)Hf6F+71d5~i>OlCEY6+KQCC zp>=m`xvME2pU)Hsp^>Y%R#nzES2qPU;Yn)d>L$4=CgeTQSZTQ{9_6DIJJ99^nX3iu z*vU2R*yUk|hnwhP!Ixj@r>hJE74o>}DOJ4s@f3SvrxWG2m;`dRj1hz2lBgB%}`Wo=N5%5SxO zm9h09X$bpi7zenWgH^$Js48&S+mI0)p;3&}7$#^xa&!Pk=^!TQ5X)iaK7wO3j^i|e z6a3X2PSR19Nlei(Ow)0kq7yhxCvgU6aSl%*!ULRVD}oCZ-m8mv8Z)jR&w%hOo@48I z4qb9Jyuk9J`xs4O7MF2_SAgN^t1vx12g}nh;bl+fQBc|p(lq8_^B6^SX1w1%EO=u% zJXQ&1&hg<|wW0!x>{{|1*Q>&qHm0%cYU>&++|VnyfmiVwDr~=wH*gbg;+Cu9Exe6) z@UCaShxhRTZY$f=`ItX+1NewPrQVNSKYLbPKb^uForb_C`7?#HbWUE<8>5mB@jUL( zg=H=MY3-K&m%sK+c>4wsmOpJC_y4K+WH6QqUgV$4nUQ;A-Rq_mTM$=j4`OYi)mFih zg0cc{d5x`fi!<*zLI&Ww(R+mvn1~&$HaB{cQTXwN=5WV%UE)% zD)Vav%QBnl6f1HjHPn$;2?47xYZ~=HdG>PN@H($YijG}0oU&z<(thW&+7GGU0^&P) zr)e}glAW^)M)vCLoMAxz(KH+h^9@v&u=Kg?Y`z(L81@Bvf7OQ{2K?K!pM9x+BDL?E KH|TnhbN&UR_BW^i diff --git a/NorahUniversity/__pycache__/urls.cpython-312.pyc b/NorahUniversity/__pycache__/urls.cpython-312.pyc index f543051cd4d7e84f457108a7b06de5f25fb25b7d..b2d58f64349025c9a71d0363e86cc8c67bb34400 100644 GIT binary patch delta 48 zcmbO$xlEG#G%qg~0}#A;EVYqao=ePLKO;XkRX;5;BQ-TeKcFZ-D>b>Kc(XZI8WR9i CbPmV> delta 39 tcmZ1`IaiYVG%qg~0}w2~Bf61Wo{QH^KO;XkRX;5;BQ-T;vjbNe69CYh3i$v4 diff --git a/recruitment/__pycache__/admin.cpython-312.pyc b/recruitment/__pycache__/admin.cpython-312.pyc index 8f7e3a6f718c1894a29401ba240937d62c2a32a3..6908ef3c5bd29d0f2c3a0b09ea1350bbc7d2136a 100644 GIT binary patch delta 2555 zcmb7G-%ndr9PcfqE&TxngwoPN%a4-FZ<#Y$Alrhd;GnaNiK3BR+LKbawB5P44oGyy z=|;i>!>6a8@9*#V zo^$V~Bi|1@KX*E92KM~9>rE`LIz7VtYRjco!4NaVEOPCfZ^9=Sj0WP{LM8T0_>G1q z4KeHMhFA#^X8Is3cwH0qoU}30zDHUo0?baB>4zpkghrtf&I#p~#w<6#&$)$u_+tNG zxurR)5isVgLRn7D<65%ZXIbvH5k2{ea#mtiBc0BIjK$@3o~d5aH=^qnav9+=$$HTmIQ@t{xv9`n8J zU(81ZvyUlJA9Psj%prXlv5tlPY#A0yXgyK^gdl(S}Y$U z(dlF&D#?KXqDl!_5lyrUuG;#9Zn$gn*ty3?(5MG~wq0ZFiv2}1Po@_h*v|?f7;>x# z$Kh*7t>*;l^)paR32BB~e?zns*tu!X7WO6z|s6?aF z3x%DDplSqucg^daiNH(ciqHYO>S`Vlkf+I)y|OA%=jHAr@&SMb5-|Dw-{m z#+b25Nu@_oC0jS2roUTjmJ4J`NvK3KWfa!j@Qu8&x9D?^b@;0aW?MqP65OpA($ki< zeU-fe&zR+zM(KG5TIq!polVOU+dp+7P4YLECQ&PeFvmbF;y=6u8b>yldvTsF_pP9u z2e1yOq7oh%)&nQpf9Qm81gfj9wV_MR7NvxDVrn7hSF;Z#RT8JVm5GkRH&v$u3a!;Y zn9=281B}$vK)2g|=n=ULw>@r{b)RGh>Xv&$ScbuxrbD%_z#BDZc$*e$;f}i+eyw@g zyo{0Rd88GO^-$X-7HM3!^`WgdDyI|@3yY-(ja#slUdGOxM!15ogix?|GIBC3dH>M& zPUeU4z1s9Kz9X-on2#O@#(HMSS%(uGSII(_+~OA!;HS-@Enp20Eva-$xBDH z|6}*idji#8ju0 zQKzXFK5F#n?^F@KZ1hI>tsg;SeqHdnXW| delta 2614 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 delta 6639 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 delta 26619 zcmaid34ByV()je;$z*b0lXG&yB!qA$5CVi85C|b80YW&!ByU1OjtOtVkpT%PDu^i9 z>O;{LR`*i`4>q4hT@PG!J=YC}{lHNa+`rel2WVV(U3LFe_2$YDTzNsEN3@RN5rQ>b+e75of#AGO;++xU`Lv0FF)p@=)6;!$a zN*CHHy!|Yo+)Bt@WUJsV)rQmK*e!G?SrZ9KWJZ$u5E~u^2$L#UM_{#0&%l09?AJ zCc)m))Fc-2=|Q=fR85?P#nfsxex-Uq9DF!-@>4-uL%!21HI}ax0K}q!-N8Fqe*j{= zwb{`tT3dPpu^}Pi5&%eqLkD1w;(S!xKE2%I*mR0GK`vvNwbxeP-es$3w{;3)A?5|Q zh&IR-_|A~T6v7=qeJRuu5#;m1kTqHwRw=)<$;2-5qru}s1STkLnhorv>V%q`tJ9+) zgPqiPr%JC>*i?62Vli=$58pw8_5=fT@K4a4)I+0?lV+_g#HQMqAYGZsq9>gU_BIX` z40{xfVSOPMqf1vK+FRQ@ZS~)W^vGXLJ?$;|7BzoCm$v9j0T5bL;&}KYPDGFo;QNr8 zHhZ_tT)nxg*(QD&f_2osVlfvhViT9njq|vY&q**zJ%?GW^v!ZMzCWzJ%euj4ZncZ% z%?_JrKF(Zf{J_5sTW6~S2V)j-rcoMT(wdr_VQyL{x-%9)sUr%&F2(r>^U>&sO~*_} z4MSlQhV&C?-l{F(0iq>OSuk%7O4%slI&>KXo1=Y0x3#z3-c6GymSDDVX}7K34nUsO zDVV1#EvYLlDJvJPkP?wKfnrpTc?fX29XkMk7)59Cyx_RDkswWscGr^2A&RJsgW2aI z)6YbvKhp9{^y#v*k(Ij^pASjeTX8NV=}bt{`OwJ2(Z@?3=^ma?{6_kSN@>*YD!;5% zgqZivIA=&bV@N%!eo{LadMfmdRc8$=ca?pkW|}-%QtK6b!n^UB7xfCo%~DA|GY!-j zBX#|-G-+LXm*z}iG04Cyp$cHpUPUVtmh90t&K9a6U2K~pz@k3^BW#<c!>X%*y>1MxlEu>rg(shs) z{L=N1jlh zH&8h(P$wUkI1h5$5*Gm+NUTdH1irRZl@MTk>9mu@@;ymU_t!wmrRi<&?XtuPZQBekii>=ta>T)KArV{-(qBvP7pK<$6Q{~frT za3!T3oV%Aln>q@ZxlH#>3EqOKa`5ceS^O z4?seMg{E++y6szC>OPxQ6g&8?^t!Yb%vD>(4Gx#KV=Mj@<)%HNt+jod_yiwGpPfh> z*)vep8Rkc%!@9+$A6T66xH6j1XnL$-ufu_xsu@%wH)hXb>3m`KRv5vl2`2u2_M35! zQ-1>NIir}spBg<&F|%p>HcK^NzF_%*wQyHXF`Lcfb0-2^kXuF6HSoXWmZV%j zoTzA9#P%Liw4*q_c)~okgx@+LlbYO@M%6<%ZMJr{x4MaNjPATUuY%P=3lo1g&p@q~ z^Zbe0L~5yTwsixOdjs0kOq>NvZU02GTt7(s6sWQ&#S1(*KPASWAfz_4&FX04VfpcV zdHzhchToo_4(*N|m?52>%@Vn4()!U-W1m#P*7K()$+b-U>q#$0{Ou~Hy*zmlv+t2`b{$p^(GG=KhQkVm^aY~aDrJV@TCL{Jn8kKeE7)J5 z)$AetY`ImkW@&4yO%$)uoxX62=0;eO-|%D8V?%V*xNt~cNR2l~TutBSg@tS%^pqtJ zC0VnuU9<_;LjU5-DTV`pUJOQ1#Q#0>lLaF<=6@jgCjwkI7A=@$)^4F4SBOJIog$*y zLMDJn?Efn!{iT3s7R_RJ@TQ^_Knbq1KNPi2_yKFtP!a8MmFSz4s}WddS7;vqx*R!t zUSSOX?QD||lUa!bdohV|m>kvp_Tt&v2Ys#IEB0@#`ERZF&#BNp>}&m(IsUEn|E={q z^X9M<+)y&rkKpkC*65>>Iff^&QYr$OXY=O26Zse98ObfO2rR`Go>E$=CFN(~U8QMk zfZtv!#Gw&vSsAc_z!4z0EC&?)^s=1QzeP;1B6tl!G=h&2d;-7~;;?pF#l9xd+P%Rh zeui24<+W9^0T+SQ-ov~gwAba#w=nZd1P}1%%FOIe{z2I$wv;a^pT~yyZRIo5vSBE$ z;0n8F0~>L%t=US3rtK8Wou^DoMm_D?~)2CD-NNt@8rYnM+fWFh_vtC9MA z18eEQBJQz?y?x?4STKy>0)mSO{)FIj1b;?A3gilYk(eovuPOvu1VIQw0c430_!)yB z9zgP~)S zNi@G_Nv4iYC>;vvNdt@LA1=AI9~-$0J+QGhkuC2K*FcU_gE{%2R#!kuM02Lv5*#?E zDlBV5&c(>~UlAICqg$;gklX}oPr-m-)f z8hMb7;m}Wnw?-mAwk%2)33=L$+0rpHi&6n%eq@=6?_6fm+F~JpBIWbXmW4+^*-7&W zts7OmQo#?^##ta&NV6quz;mTqNcVP{;q5e$IwR2mM-M_*~J-N=nIMIzBNaX3qVp zI>m8iwfIM5VcfnFj9%F5Mq{0gSjCNqreh3T zuAtVOzj6Uj3g5NFzU(?Cmu$QGlaD!z^22>>olm%Y2U&7~5oeV{XN z8Ni&-jQy))R28@^+epsbwS+?cugd{n$N>(H#D>T~8PXUtR1nG4Rq|Dp=c zN5o2rhY}Cl9%#R(eJFhVBW33%%sDe*&bbL?XC{=L7S2^PoT+FySFz?y#hRhqwP(WD zUQsEdLoX|o#!xtFheyK(Hu>nge9P+VE1pCej2mpdP2jI+>aq*AP7xKUOJ8Ph+1zF8 z?xpR`rEC|#BEUh2$q2Rpw;ZVJ%w)IES!0eg1Lfb$hpb(SZ?%e`Qg)vAteFK2f}@C} z(y;XY{2{_T+(&tQYGiHpkZ0ODrM%`UB zgxy|rOA$D=E=I+>y(8lSWpa)}4ZRlf*Vm+IW#Qpptx4{0#c3}=f+pja9e_&Uo& zI1lS18|M3MrwcK&3jy*)+=<|N1OW?X8Rj8)1OD%*<>%L?XPgfT*=Ied+rM#0Z=&y^ z@QmTm%prZ&LokHgwM<^M-X(raYp2GV_`G zGd0VGYF7={G@cDvy{r6ubmqZ|bJ3Y+qB9@Kd{THb;*Gh(m8;K2ui3TayfK--vMybD zC6os@-4%P@81a5g>`+|ZaLmLJojP7Sq>jEE%mW0ty#|8nfQ4**qv*lOe{BnuufQ?!V3A~^{+<@A%by(5|lW=4T=rmkiAdKt6xsw z6;_k9ekxNNLj~_PbuyCoSc^Q_QC?*q$xl6(5fKfFK2-4SRk8fCH6tcYh!(!9Y4=oc zaE1yhZ=H1S7L>#<3MM|iB{nVts(a|k^w!Mc%`F*Gp8RZY{y2WPWoD|c#dvRt#f#g_ zJ6lZ2p0+vO8soek)HLe-H!ZPQK1{jZdOl3)zz_At3fd^W2q$pb`pC7J1E*JbwD3Nj2N1 z=0_uA`hh+HZJtn}*n{Nc9B;8jE%{*DZ+d|<6$bKOa0Q*AYEpg z-l`PJ_oz>R(!qa?GbpzJax3KAe#$QNR$ky&d8Rjap5g{LfYTwTL)=>pKm>+{e8a6A?@$; zT>)wG`O5t(8dpMwztgt?(*920Rgm`g`8Gnj)sLXnklx^zUIXbizw}y2xBI2nL3$&k z@wNm1H8znGc|AChJNT>Z%cS^p7Q=HkZtCyTS@hpWl=%F26YF}xP!P#;K~4wq9gqtE zkMu5mt!<;N1um<`IH(muS1w&iO-)s0d6`RH-cYi{6;xSWUtYVSvV0}j+!Yn&wPJ>h zrhHL(X?;d{S-@88(#Qm$n`ScFBP;lZj!FFCjvU#Hy;F*~lbQJCj@HUCEM%9qrlhV8 zI@eZ|R90P$Jh*(DwF^4v-RuzWh8|{O4=IwlfJH|~nC_W;xZz0AP(=1Vt!zvmkvqHC z+13&QwZ+?zbX^UYGT=+}*xuvki=HI0C>KGhj|+t91bfQ z(iedRi1o9!M8v*;_yZfg%&WGfuuISgz3d0Kyps4bR(olzy07x?tx3vHmHgrjiH5Ex zmwBDUY1U8u1sLMQnuXmz;+B%s{gw&>i%vP7Cg=>Ge%(0s6E@<`>w<~?#eC?x&0|+T%UADA)u=#Nzv0&FOokbLQ-Ndn zac5)Vd)H*tIWG2REA=XVYFm<__?gY#;k?}c+}QoS&kya&P#WbHv!0nh95#1IKi55| zg59;TV|T_M*j>yb`NuaT88$u%oNzne)3)Q#!uY!DmyX@tNBouR)0A;?cZJWSkD8wi zH!PTZ)%>7DUxWcWWBhj?xVpD>Z|H4vBmoVwE1;3D-(yX@bWPs;iGR2!k);vMoln9* z-FFno)xH~-{7lPF`K24vmDw`UGoP6<95!c2KgZ3Zn{HbAGfh9|mv2fn~>Pr@sH`SFdTV7sWTJCXw1lcz$s%N~^`ti_(bP~*8Ba?7za%o!IMOd}|6!IVL7{^4O$)`cHV+TxJ zSuShL>Qp{C?ve` zu3Wa0-*gww3S42s#muqWlkgTcN;+^a3+6xERj75aKIIN3ZCb>l)z>L^DEX=2n0{3U z*c_rtP+zC&RtlQyRJ{hEi2m(R?obIz&vE`b^$s-{(pu+{U|1~luh!Npw%fMY9A?<@ z&0TP(VRrP`TJS#F+-a9D#?6AQ7o^c)9`D%P+ybKQFt>NZ%I$8kSIMV zH;=vMx|TMZu({JFRCdE%{g!syR(|Y`nEnZ7h=i&J`J3n^LF7Pcwb%pD73s9wySi*P z3}SHi>WTrbxA%fSP^QM64I0OYETlV49nMf>yQilnPhFSM^VQS~W~57336_nuw^syX z4b_NC?{JeT!d(LRKCLY+;L8K&Ckmx2%uPv?yH5vRM$l*>I^o&73ycyjP!Td=frj!Q z?@nEI1zf7}hqs+eo%LSoEbu|Xx=qPGmt1%z8TO+DaA}34oHOK}G2}k7?L9-m`J_qv zmRwAlx_8M)up%*iD1F+KU8n1Z6Bg|ayBL--q)&n60HQEZDSg3afFDT#hPxiR6UnF2nm{w zt{`j*-rip8Xpw9?GMT-`?>&Oj3!ZKM*^xh($0OINYvj6^grFIacz#ue(DJgPeio38KQUvnF3sSle zlg}e~8NpMS_bPmWzU;JHd&So=_e})vAUKcZf537TC{yta=HWUK&*IlP1bFc#zK>rY zBKQaa8c<^YpAdeE;By2ztoRjvT}FWWxZmB5&pS^W6z(Llhg^kXfm)ihum~5Ia6gP7 z4FTQ_h~VIZNHGLc5s*8*lFfzBMbHz;uKT8VKlY3OYdaEwq<`*Fysw@yqSk8i4rWWcEp7v8Joi^{^#Fe z=VNluhetpW1xbbsR6pFWikU<%@+3{F+iwnEm*?TYz|ntm$3_p!Mt(-3RGB?bv!HSl|cfA?6r z=TMpYcwzsiND8~gDH5rQuNSTD-LPFO!I-diYp3Uy@1L+%9T@upL9<~|w>$Sa;Wos5 z9~2e1xN%*}F*1etMTb^2yjF=WOw+|p@D?0@6JFnlGk{i?8smxObv^}a(PEl{;^SLP z0Ryc>;Y08_&wt{WJkUx$=UEfqaUxX8Yhg(PJr}Jk{tV!&Kkn~=Am4(>FI>t7?}7T0 z?7Y2D#T5z{bzM!pwyqx9c8|Lq2J4U}DqM#?*k1B5e{Iom;b$s_}(?InX1uO)|Q7_hGEs-DkGL9|h$G^1baNaAN+5EOE z3H+Ncw-ioCx@I6KKyVKNTIMtH%iF2kC(*SLP!_5Au|Fqyrv21+HFyzUMpx#~!6=R^ zU3!lkUPBT9yE6hpjL?m_!RA?~^VGcas~oTu@H+n4uhviQK>E@DJIbuU^f%CtGt7sf zrPF5ZE>-hIfAP#vjppZ}zaCKzPYrTvU}6?!DnxZ&LC)ar|S=^-d_b5yl~QVGVM(7E@S5 z?>ApF!#2!xBG}G1eLI;g;}3p&v+fd%sRCqf@;}-p5EGk$B!4a7n>h+dn@BTvi<-ao zkFR8dl-&lWoqYbzaGZ3yh^hInhNJoKhhr%r&COy7{U~H$)uJ6F(&XXFa%nn|Emuj3 zfGiGm$w%5xI{{eWdpZ=W*u~{m1)< zCeD4vaeCV8vtFKcdcshD*wP{WQuqFmJeHWb3>B5-Rb@@}t7^*Y$WoN|1{4fgD-i7@ zbNeuF7XXMX^Ua%V0qRBDrp*)!>Jv(bvJM)QV5=JtT#sN6f*TRsgy3cbv|LF@kp+Ph zycw$?Scr^hAE^1)Mix}VKK7U3H-uOiOToX z{QIAZ+)6!qthw}?z5tcs-RU6=6PW^*yU^6!CoVRkO)hrJdz9$$cL)?w4o4JfK{lHSPt^5&4 z3pFf5`A@afrC}K3i*1i;*i5oMK=O`a-wz-d)#@J_mZkhjEhTFi2E^k_h`%08leTHu z470BZT-T3ohoe_X??NLmpQX!M<__)}oTOvRnHCkE_%f))Xz2kxo1H-x2NM?n8X%r}?^m2uso1D(*%iXnFq*^AOqSvD_ZS@|D3F z>2wgY|96vwHawCe+VE&bNCD6+kuITb(Uz4NNApX1gU*0N<1ew44pDPzP*pQn?M%k{DJ8CC6ge&1{!siDh%;Han#5Shf^OUW^6tbxP53tWG(ol-lFi zmb5Q%OR^|k>YAl>_2Oxu4-%@H<@MsrNbqUp-SMn03OmC51?BbPZ!!P3%E8un7Q|+v z@QZ6Os~NsVF&)y*&^r5OvBhie9fgS$*JAA=*b8c1Ws}GZjXcNeW>!dM!G43txG3v zd;%G=vuJ}TKYZ%6!?P_S^btv$$t1ftWjuwQm2n8J-nb#h0X= zP$Tp)Tmb`s5JWInAw8POa+IqXpDe{of6HVYRc@p0L7WBRuNIG(@Bo$0oz0MamAJ&B z!`Mw(mEHT4ZCE4yDvQB;A`qH!{I*ZDl0KWwVq7ZCW;w+HOe4`C&gEjy*F4vJ1(g4v zMtU@xjrZ(ja91#RB^!7!^Ghfcky$d+aSlK{$nDnD0Z!w@l0ryHH|q?_jewhM0R?Sfb$ zEwr#S^WP8^g{2z7pNKKM;LV1!miQ(Xyrq=(Sy$0Wk@`Sc?gbc20yg0 zyP3?Mb7&$e&oX{2ICF3?7xGsLQ4rA-OW|nI5RMje0vh4J#<;#%OPq+Y3}6gV0IxUT z6;&pw z{`mC7pHV*&gNMO}e+Oust@$jf=yvQl4BlLU>&Q&~w}UqqWwcs+9Y-I)5n9{-fr6hj z(rfw59f*Rt)t30c$tBIwhUAjD=$lO|=Fx1@Y6xusj~lFrCJ1qX0ClnwMW36K+)lc! zwr0Hlkmpqc!TvyJBtE=$>00cY!CluUl0VcptpTLt9MD934vcVoqmTwCvCrbZhPTwF z@3bmS($@+A@=kg{R!dhVv*YT1i~$pO0f0E2rAun6${{icKJDOavVqm>(v>&VRMtYC zu6$b$9awI_7JC4UVPw*BB$Rq!j~I-A>W`+@6<$Kmi@I!*v490>bx=>Im68gW`x#6K zWVpiMB~6q34hh539byLd{D{2Lw7g|I$O?BM4GZFc5_={6>5Ri5bld*_4Qaipol@^p{!edXJi7z1QW5 zZtY4`p*#^m*YK4}DYLWhKh> zTIs#HtQlxYeY`;GoW~|dBqJ@&fX1^cNRQ70lXs(5`gk5pEM0~TMwGA%Y^GlaICAnA zk%%QBj>JGjSmzsHu+t>HG>^q-(Q{#u3(#DiAd_qzm0UHf?1R| zX{Fy)unc!~)dKc^Q&6(x$8=dpC9xS7gGh_Y9|d-s3MJAD^I*>RYo)w}VD-_xnRMSm zc49jA3{TqOw1w9~aMr???eH2yMa^XHJ%d>Mu}V8C*;3_QTIu(dY&KxKU@;A5ECR$V zTIyTOa%PPOtQGDXN|zqY}n^2CL8oFF9nT9B_Ox;Rs2haV|*u#B}_k2az;~IhdS+AYk2V zR0=&@qd|#UJNV%eW>?A!Uo*I@hP|s~k4WY^X4cXHVX;&JucsqVfq3|?U`l#H$MHIr zKQRoDIE_^hkYX;O+imb?u0~Y@^%c$#InP{5JIP5VoiMOu$ym?+P8!b@;*AOHuyvEx za|PQ-+rw=^FS)L(k6-ofkrtxQ^cqXs1q_&YHycR3poP`n0HjIVm$OwKb%$#Peotj# zgug)I+zL|F3YM(=Tq|{~U`ZgAa9u7PTfsh9FbCP{RcU?-A`k_sg;?1Hk-33aT(XPu z&syn~m8=Ny%FBJR)Zf4|=LaAUM2R!(OuPyuED4!+!r!&hrwyb=aAcNMtRvR9y#29B zkFH|ll_Of|>?*KHWwjmN$cFN8vEgO9Z-fhQzzY#vy>yMM*%al!v{K1xTDqquq)PX% zW;;#AP~ENL#VYvrY4~Yt*fiyTw9>{k2@+e!W+@FisdydB4H6rn6tqW` zv}qm7C`K2EOG8hb!EZ)_3m4)J$5!~A4Nq`G9S*h@0nsj_p9lB2(iz08(MiT8HV?QK zaSON|n%KE1I9{9*%*NKY7;NlI;DPbYpK3?`7+Yp%yojn82Uzt@*{3zU?0uVzVi z3#_1mEDojnIg^fMW;H?ER}PN@)V1X$W#YYrptiiecGcBS z5yS|b^bP>II_Ym4S2%EBZ2o6_JEkw2Tv}1U~BY@Hw?LR{E68Aazb7^M> zGtYBHpc8_k);w`+_0EV|8(y*tW^dUwuG_&8GSIiN6viJjqZ^K+ zh_V@g$9BgwsenJjP&(pCuQDh#MWqF!Dp5?q2*N zV{8w8k<#<;SNhz}CMcVAQcMqnA3u_o^su*Tz4c*F^01yT>-;dItodQS*@ND*Lw*Z$ z>DwXOH-VRDgHAfKiIpsql^GLp43@OO73bAyA~}27y<;K6HNZ!JycLV2JP}S*8{pd& z;V;RuXA+l*%ql&&fovFFDc?Zt#Kz=YTZa6nJ%z?Wyz*J7H)6fL2u97lLgofCI~^9g z^aqi>mltN<+j=fE^-O5$d41yf$arbup^4{XGU1J{Cuk{WI3{<*s0-8XS}48iU`J$m zX&JQlvM?6v3aNpOr5z;H3P*M6hRtx9(jYy$ndN1n#-h!Jc7Jgd(%b;RWhnFgTAlRc zX4YQ(9CB7k9vaz2;y>p;S@ZA8BWpW!(t}%AMwC2BM*rE7HYKpAVp<&!Aric&^Yg%L z@E{Ik(*a~1f^MB;*~$*cyUhW4w^2T>dAxC z*y%o&5CJ|p=qb+IQ#}8}@6sislLhtry=L}=1~-~$&!J!B^zJzc0{j+dVT7thRAl>C;--QQm zO45DXSz7vNX>=LfEolql!0sD#(#PA`Oqt#Hs-)B%EI~kp?uq~%XoK^n;Bk67>cwq1 zOHKeTeV44^9ZrKsjl*j$aR8?qeUNbZu(=tZ2U0AYGtAvDoQvd;xX-1-J6Lu&I*gpU zTJZRQ28Uym)YA(;6Z8G1iIROLtB@M6V_W+VQGad(4vKDupe9iIpwGPFR&eSi9jb#f z0T@VvTtZ>#A#PG>rB{n{aSWr`BAbQBpx`*}$Q?jGgebnOTsov14}qvh@hF11 ze&>-#FnP6hPTbALDF<~@*=|-0IPv^*WH+lD?I8MoH_J_V5eJ8k9nbTJZTq$z?i~ut z7}96JpAO$d0+&fMZe(-g9O}@X(DcPNfppE2PKvvNo+1&^o6}r}n~vowSc-%%T~Y2f6Z$c3Iz~O%Cj17I2yj?qf@|=aG~MDfkvv5ssuZ3}>$zj%^$YZ@jFPY`3tP;V09E zCbSOcY#2^x8;Wj&+yTg)^Q17?cB<`k{p+h=UOf~yc{py_xwwWiaSdnV8b3_1V4IfV z9AP-YHWY2UtWw0UW&p$EFB=pg*)RtYw``Ff-_Mf!zs5Nj>->b{4e@XdfAQ~Ipj7-8 ztD`!$Wcq7k9B9B^c`r)QSlc8qjwTS~zu)cU!DE(72Z0&1lqu}ag-FSZgVFlpuMp4y zi^P=ebS)aReCvG>N~(*Net3#WM8KwYFgQMvs9Yw%ixO##v;v!23Oq1<|x_r z!MhH!1QyOv0v<)i72wwi>7_&Lph;W-In|bsKsFXi8}DFi#*J1St`N@;xsXB~1X6!O zQv2u~vBWrQmo@7fDrpmEQRcNs2%3$~pryo9b7h&lU*m7Sh+CzHI2%{7!c&WW2a6o) zPNSzMGj%l%tDvH-7q{Ri-s?CGa?Bf;)bsnqX0(70tlJKF;it>ozc(YRPdM+(-C>zg zaF@xJkXNJrjHY}G#+eI_62}zjhdbH$==aQP&W5bLtWrh=@6&lg2tc_F*4@QUvNC$N zbQe-d=Bv&(Prn z+%r^U0PjNdG!nRkSh0sB$DqBfSN`<*9^EH`+tn5UDfcBc#5h7H`=!@bVs>;oktIfn&tOt#}E*Iz4~tf6GHiS5W3lO0In> z6Mic<_o?ad3!v7gobKQce(9;3wJ5#f4&MFr)eo%&{_xW&%3XT?`qQ{wdZP8q2Ir?v z8-oIxjjw@%J$nAD!8DQ@nxbmU&&1!7=zNUC6R|!SAmcj-nl@K9)_N_a$(Yn+8@s`=io$Gd5iV6^=uEB5!*>NhhnY z9sI!aiE?b>c&xIB4?LegnW7yc{EiW3diNlr=~v+lUj+B==J_@_dfUtk;klf+k4L?5 zr-hy0=V)mRzUfOv+)D>o<7S!K2jch+0lEW8t&2C4bS!>hDmT3{xq}d&XARMu>->c%HVOC%mb7naV=tc_04YM zlRzve=d~z2+v&Mz!&|knv~x5=o&$>AzwHizr>EaaQKkp+i*K1HqaajUvixNLQTQw$ zvUi99s0-nD$|k>^6hdo%JtZ6bVsf*uhUJws23AqvMoWp z=e_x{w5~EBP0teDLG$DJ8}FHC(A2C$r1=Oa1bI7tp-tloM&Ai}`5fX(6mdG$|69rD z4#(#h5#i&=P7;eyF9ALexo1i29)7W65NnbZKqrf_g#bErCU`uGzL&9{t$$q*zwzu$ z(7-R9{arnItSHO?+`$Sl55YK~X$*%h@avl1Jh#%cKuc>7fB%nF{^~mY+9F8mnwUz$ zNODCxJ<{NJuSz!_exiz`L?W#u8Zr2Vg6RtBar=M-bOOmylOc{i2e?7Whv<-ha*xJJ z!bk)5?GpHcNY;k}b}^O`Fkux0*+Bzw=bGHYXj0Rgx4X_irM$}Lz#BhEPYsYXJ@{O0 zw5R6-s_r0u`3jPlN*&ly|~R;o|jP`*GXgnpRJcJK)wW*fIc2IvaP z-v&zb<}9>ae=fg`^koU?*FcB<{4s(!N8IP8_45`N@-%a+Jj>^-8JWC|ev7$t(wx zMilVpN{)2fQFzl5%JTNM-rl*db3_53Bk2weOFI}nqQJi+odz{)U54dBnnEa{D7Y-!3i#G%qg~0}#A;EVYq)6Qh`uenx(7s(xBxMrvw`en3%vR%&ud@#a&ET+9G; C<`2>U delta 39 tcmcc1d4-evG%qg~0}w2~Bf61$6C+v36H5lFZ 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 UFC*b-4FTGElz!ZzbBu*=0o#&K6951J diff --git a/recruitment/__pycache__/views.cpython-312.pyc b/recruitment/__pycache__/views.cpython-312.pyc index 2f473d0e7a775d66e21924fb4a1f302c923d7a9b..2b263c2bbe78377b9733cbabbd036e1d5bbcd115 100644 GIT binary patch delta 55952 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 z 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 delta 53939 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 diff --git a/recruitment/admin.py b/recruitment/admin.py index 140291a..55ccefa 100644 --- a/recruitment/admin.py +++ b/recruitment/admin.py @@ -5,7 +5,7 @@ from django.utils import timezone from .models import ( JobPosting, Application, TrainingMaterial, ZoomMeetingDetails, FormTemplate, FormStage, FormField, FormSubmission, FieldResponse, - SharedFormTemplate, Source, HiringAgency, IntegrationLog,InterviewSchedule,JobPostingImage,MeetingComment, + SharedFormTemplate, Source, HiringAgency, IntegrationLog,InterviewSchedule,JobPostingImage,InterviewNote, AgencyAccessLink, AgencyJobAssignment ) from django.contrib.auth import get_user_model diff --git a/recruitment/forms.py b/recruitment/forms.py index 491bf2d..90f5aaa 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -18,7 +18,7 @@ from .models import ( InterviewSchedule, BreakTime, JobPostingImage, - MeetingComment, + InterviewNote, ScheduledInterview, Source, HiringAgency, @@ -26,7 +26,7 @@ from .models import ( AgencyAccessLink, Participants, Message, - Person,OnsiteMeeting, + Person,OnsiteLocationDetails, Document ) @@ -725,7 +725,7 @@ class InterviewScheduleForm(forms.ModelForm): ) class Meta: - model = InterviewSchedule + model = InterviewSchedule fields = [ 'schedule_interview_type', "applications", diff --git a/recruitment/models.py b/recruitment/models.py index 0f7cc7e..e3c33cc 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -983,137 +983,326 @@ class TrainingMaterial(Base): return self.title -class OnsiteMeeting(Base): - class MeetingStatus(models.TextChoices): +class InterviewLocation(Base): + """ + Base model for all interview location/meeting details (remote or onsite) + using Multi-Table Inheritance. + """ + class LocationType(models.TextChoices): + REMOTE = 'Remote', _('Remote (e.g., Zoom, Google Meet)') + ONSITE = 'Onsite', _('In-Person (Physical Location)') + + class Status(models.TextChoices): + """Defines the possible real-time statuses for any interview location/meeting.""" WAITING = "waiting", _("Waiting") STARTED = "started", _("Started") ENDED = "ended", _("Ended") CANCELLED = "cancelled", _("Cancelled") - # Basic meeting details - topic = models.CharField(max_length=255, verbose_name=_("Topic")) - start_time = models.DateTimeField( - db_index=True, verbose_name=_("Start Time") - ) # Added index - duration = models.PositiveIntegerField( - verbose_name=_("Duration") - ) # Duration in minutes - timezone = models.CharField(max_length=50, verbose_name=_("Timezone")) - location = models.CharField(null=True, blank=True) - status = models.CharField( - db_index=True, - max_length=20, # Added index - null=True, + location_type = models.CharField( + max_length=10, + choices=LocationType.choices, + verbose_name=_("Location Type"), + db_index=True + ) + + details_url = models.URLField( + verbose_name=_("Meeting/Location URL"), + max_length=2048, blank=True, - verbose_name=_("Status"), - default=MeetingStatus.WAITING, + null=True + ) + + topic = models.CharField( # Renamed from 'description' to 'topic' to match your input + max_length=255, + verbose_name=_("Location/Meeting Topic"), + blank=True, + help_text=_("e.g., 'Zoom Topic: Software Interview' or 'Main Conference Room, 3rd Floor'") + ) + + timezone = models.CharField( + max_length=50, + verbose_name=_("Timezone"), + default='UTC' ) + def __str__(self): + # Use 'topic' instead of 'description' + return f"{self.get_location_type_display()} - {self.topic[:50]}" -class ZoomMeeting(Base): - class MeetingStatus(models.TextChoices): - WAITING = "waiting", _("Waiting") - STARTED = "started", _("Started") - ENDED = "ended", _("Ended") - CANCELLED = "cancelled", _("Cancelled") + class Meta: + verbose_name = _("Interview Location") + verbose_name_plural = _("Interview Locations") - # Basic meeting details - topic = models.CharField(max_length=255, verbose_name=_("Topic")) - meeting_id = models.CharField( + +class ZoomMeetingDetails(InterviewLocation): + """Concrete model for remote interviews (Zoom specifics).""" + + status = models.CharField( db_index=True, max_length=20, - unique=True, - verbose_name=_("Meeting ID"), # Added index - ) # Unique identifier for the meeting + choices=InterviewLocation.Status.choices, + default=InterviewLocation.Status.WAITING, + ) start_time = models.DateTimeField( db_index=True, verbose_name=_("Start Time") - ) # Added index + ) duration = models.PositiveIntegerField( - verbose_name=_("Duration") - ) # Duration in minutes - timezone = models.CharField(max_length=50, verbose_name=_("Timezone")) - join_url = models.URLField( - verbose_name=_("Join URL") - ) # URL for participants to join - participant_video = models.BooleanField( - default=True, verbose_name=_("Participant Video") + verbose_name=_("Duration (minutes)") + ) + meeting_id = models.CharField( + db_index=True, + max_length=50, + unique=True, + verbose_name=_("External Meeting ID") ) password = models.CharField( max_length=20, blank=True, null=True, verbose_name=_("Password") ) + zoom_gateway_response = models.JSONField( + blank=True, null=True, verbose_name=_("Zoom Gateway Response") + ) + participant_video = models.BooleanField( + default=True, verbose_name=_("Participant Video") + ) join_before_host = models.BooleanField( default=False, verbose_name=_("Join Before Host") ) + + host_email=models.CharField(null=True,blank=True) mute_upon_entry = models.BooleanField( default=False, verbose_name=_("Mute Upon Entry") ) waiting_room = models.BooleanField(default=False, verbose_name=_("Waiting Room")) - zoom_gateway_response = models.JSONField( - blank=True, null=True, verbose_name=_("Zoom Gateway Response") + # *** REVERTED TO @classmethod (Factory Method) for cleaner instantiation *** + # @classmethod + # def create(cls, **kwargs): + # """Factory method to ensure location_type is set to REMOTE.""" + # return cls(location_type=InterviewLocation.LocationType.REMOTE, **kwargs) + + class Meta: + verbose_name = _("Zoom Meeting Details") + verbose_name_plural = _("Zoom Meeting Details") + + +class OnsiteLocationDetails(InterviewLocation): + """Concrete model for onsite interviews (Room/Address specifics).""" + + physical_address = models.CharField( + max_length=255, + verbose_name=_("Physical Address"), + blank=True, + null=True + ) + room_number = models.CharField( + max_length=50, + verbose_name=_("Room Number/Name"), + blank=True, + null=True + ) + start_time = models.DateTimeField( + db_index=True, verbose_name=_("Start Time") + ) + duration = models.PositiveIntegerField( + verbose_name=_("Duration (minutes)") ) status = models.CharField( db_index=True, - max_length=20, # Added index + max_length=20, + choices=InterviewLocation.Status.choices, + default=InterviewLocation.Status.WAITING, + ) + + # *** REVERTED TO @classmethod (Factory Method) for cleaner instantiation *** + # @classmethod + # def create(cls, **kwargs): + # """Factory method to ensure location_type is set to ONSITE.""" + # return cls(location_type=InterviewLocation.LocationType.ONSITE, **kwargs) + + class Meta: + verbose_name = _("Onsite Location Details") + verbose_name_plural = _("Onsite Location Details") + + +# --- 2. Scheduling Models --- + +class InterviewSchedule(Base): + """Stores the TEMPLATE criteria for BULK interview generation.""" + + # We need a field to store the template location details linked to this bulk schedule. + # This location object contains the generic Zoom/Onsite info to be cloned. + template_location = models.ForeignKey( + InterviewLocation, + on_delete=models.SET_NULL, + related_name="schedule_templates", null=True, blank=True, - verbose_name=_("Status"), - default=MeetingStatus.WAITING, + verbose_name=_("Location Template (Zoom/Onsite)") + ) + + # NOTE: schedule_interview_type field is needed in the form, + # but not on the model itself if we use template_location. + # If you want to keep it: + schedule_interview_type = models.CharField( + max_length=10, + choices=InterviewLocation.LocationType.choices, + verbose_name=_("Interview Type"), + default=InterviewLocation.LocationType.REMOTE + ) + + job = models.ForeignKey( + JobPosting, + on_delete=models.CASCADE, + related_name="interview_schedules", + db_index=True, + ) + applications = models.ManyToManyField( + Application, related_name="interview_schedules", blank=True + ) + + start_date = models.DateField(db_index=True, verbose_name=_("Start Date")) + end_date = models.DateField(db_index=True, 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( + 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, db_index=True ) - # Timestamps def __str__(self): - return self.topic - - @property - def get_job(self): - return self.interview.job - - @property - def get_candidate(self): - return self.interview.application.person - - @property - def candidate_full_name(self): - return self.interview.application.person.full_name - - @property - def get_participants(self): - return self.interview.job.participants.all() - - @property - def get_users(self): - return self.interview.job.users.all() + return f"Schedule for {self.job.title}" -class MeetingComment(Base): - """ - Model for storing meeting comments/notes - """ +class ScheduledInterview(Base): + """Stores individual scheduled interviews (whether bulk or individually created).""" + + class InterviewStatus(models.TextChoices): + SCHEDULED = "scheduled", _("Scheduled") + CONFIRMED = "confirmed", _("Confirmed") + CANCELLED = "cancelled", _("Cancelled") + COMPLETED = "completed", _("Completed") - meeting = models.ForeignKey( - ZoomMeeting, + application = models.ForeignKey( + Application, on_delete=models.CASCADE, - related_name="comments", - verbose_name=_("Meeting"), + related_name="scheduled_interviews", + db_index=True, ) + job = models.ForeignKey( + JobPosting, + on_delete=models.CASCADE, + related_name="scheduled_interviews", + db_index=True, + ) + + # Links to the specific, individual location/meeting details for THIS interview + interview_location = models.OneToOneField( + InterviewLocation, + on_delete=models.SET_NULL, + related_name="scheduled_interview", + null=True, + blank=True, + db_index=True, + verbose_name=_("Meeting/Location Details") + ) + + # Link back to the bulk schedule template (optional if individually created) + schedule = models.ForeignKey( + InterviewSchedule, + on_delete=models.SET_NULL, + related_name="interviews", + null=True, + blank=True, + db_index=True, + ) + + participants = models.ManyToManyField('Participants', blank=True) + system_users = models.ManyToManyField(User, related_name="attended_interviews", blank=True) + + interview_date = models.DateField(db_index=True, verbose_name=_("Interview Date")) + interview_time = models.TimeField(verbose_name=_("Interview Time")) + + status = models.CharField( + db_index=True, + max_length=20, + choices=InterviewStatus.choices, + default=InterviewStatus.SCHEDULED, + ) + + def __str__(self): + return f"Interview with {self.application.person.full_name} for {self.job.title}" + + class Meta: + indexes = [ + models.Index(fields=["job", "status"]), + models.Index(fields=["interview_date", "interview_time"]), + models.Index(fields=["application", "job"]), + ] + + +# --- 3. Interview Notes Model (Fixed) --- + +class InterviewNote(Base): + """Model for storing notes, feedback, or comments related to a specific ScheduledInterview.""" + + class NoteType(models.TextChoices): + FEEDBACK = 'Feedback', _('Candidate Feedback') + LOGISTICS = 'Logistics', _('Logistical Note') + GENERAL = 'General', _('General Comment') + + 1 + interview = models.ForeignKey( + ScheduledInterview, + on_delete=models.CASCADE, + related_name="notes", + verbose_name=_("Scheduled Interview"), + db_index=True + ) + author = models.ForeignKey( User, on_delete=models.CASCADE, - related_name="meeting_comments", + related_name="interview_notes", verbose_name=_("Author"), + db_index=True ) - content = CKEditor5Field(verbose_name=_("Content"), config_name="extends") - # Inherited from Base: created_at, updated_at, slug - + + note_type = models.CharField( + max_length=50, + choices=NoteType.choices, + default=NoteType.FEEDBACK, + verbose_name=_("Note Type") + ) + + content = CKEditor5Field(verbose_name=_("Content/Feedback"), config_name="extends") + class Meta: - verbose_name = _("Meeting Comment") - verbose_name_plural = _("Meeting Comments") - ordering = ["-created_at"] + verbose_name = _("Interview Note") + verbose_name_plural = _("Interview Notes") + ordering = ["created_at"] def __str__(self): - return f"Comment by {self.author.get_username()} on {self.meeting.topic}" - + return f"{self.get_note_type_display()} by {self.author.get_username()} on {self.interview.id}" + class FormTemplate(Base): """ @@ -1926,143 +2115,6 @@ class BreakTime(models.Model): return f"{self.start_time} - {self.end_time}" -class InterviewSchedule(Base): - """Stores the scheduling criteria for interviews""" - - class InterviewType(models.TextChoices): - REMOTE = "Remote", "Remote Interview" - ONSITE = "Onsite", "In-Person Interview" - - interview_type = models.CharField( - max_length=10, - choices=InterviewType.choices, - default=InterviewType.REMOTE, - verbose_name="Interview Meeting Type", - ) - - job = models.ForeignKey( - JobPosting, - on_delete=models.CASCADE, - related_name="interview_schedules", - db_index=True, - ) - applications = models.ManyToManyField( - Application, related_name="interview_schedules", blank=True, null=True - ) - start_date = models.DateField( - db_index=True, verbose_name=_("Start Date") - ) # Added index - end_date = models.DateField( - db_index=True, verbose_name=_("End Date") - ) # Added index - 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, db_index=True - ) # Added index - - def __str__(self): - return f"Interview Schedule for {self.job.title}" - - class Meta: - indexes = [ - models.Index(fields=["start_date"]), - models.Index(fields=["end_date"]), - models.Index(fields=["created_by"]), - ] - - -class ScheduledInterview(Base): - """Stores individual scheduled interviews""" - - application = models.ForeignKey( - Application, - on_delete=models.CASCADE, - related_name="scheduled_interviews", - db_index=True, - ) - - participants = models.ManyToManyField("Participants", blank=True) - system_users = models.ManyToManyField(User, blank=True) - - job = models.ForeignKey( - "JobPosting", - on_delete=models.CASCADE, - related_name="scheduled_interviews", - db_index=True, - ) - zoom_meeting = models.OneToOneField( - ZoomMeeting, - on_delete=models.CASCADE, - related_name="interview", - db_index=True, - null=True, - blank=True, - ) - - onsite_meeting = models.OneToOneField( - OnsiteMeeting, - on_delete=models.CASCADE, - related_name="onsite_interview", - db_index=True, - null=True, - blank=True, - ) - schedule = models.ForeignKey( - InterviewSchedule, - on_delete=models.CASCADE, - related_name="interviews", - null=True, - blank=True, - db_index=True, - ) - - interview_date = models.DateField( - db_index=True, verbose_name=_("Interview Date") - ) # Added index - interview_time = models.TimeField(verbose_name=_("Interview Time")) - status = models.CharField( - db_index=True, - max_length=20, # Added index - choices=[ - ("scheduled", _("Scheduled")), - ("confirmed", _("Confirmed")), - ("cancelled", _("Cancelled")), - ("completed", _("Completed")), - ], - default="scheduled", - ) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - - def __str__(self): - return ( - f"Interview with {self.application.person.full_name} for {self.job.title}" - ) - - class Meta: - indexes = [ - models.Index(fields=["job", "status"]), - models.Index(fields=["interview_date", "interview_time"]), - models.Index(fields=["application", "job"]), - ] class Notification(models.Model): @@ -2101,7 +2153,7 @@ class Notification(models.Model): verbose_name=_("Status"), ) related_meeting = models.ForeignKey( - ZoomMeeting, + ZoomMeetingDetails, on_delete=models.CASCADE, related_name="notifications", null=True, -- 2.39.5 From 64e04a011d378a2d59bd4c6053d4b3458ca068d3 Mon Sep 17 00:00:00 2001 From: Faheed Date: Mon, 17 Nov 2025 13:49:50 +0300 Subject: [PATCH 4/5] scheduled interview --- .../__pycache__/models.cpython-312.pyc | Bin 107063 -> 107404 bytes recruitment/__pycache__/urls.cpython-312.pyc | Bin 21994 -> 23134 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 187287 -> 195534 bytes .../views_frontend.cpython-312.pyc | Bin 47019 -> 47114 bytes recruitment/migrations/0001_initial.py | 47 +- .../migrations/0002_jobposting_ai_parsed.py | 18 - .../0002_zoommeetingdetails_host_email.py | 18 - .../0003_add_agency_password_field.py | 18 - .../migrations/0004_alter_person_gender.py | 18 - recruitment/migrations/0005_person_gpa.py | 18 - .../0006_add_profile_fields_to_customuser.py | 24 - ...0007_migrate_profile_data_to_customuser.py | 60 -- .../migrations/0008_drop_profile_model.py | 16 - .../migrations/0009_alter_message_job.py | 20 - .../0010_add_document_review_stage.py | 18 - .../0011_add_document_review_stage.py | 13 - .../migrations/0012_application_exam_score.py | 18 - recruitment/models.py | 32 +- recruitment/urls.py | 117 ++-- recruitment/views.py | 547 +++++++++++++----- .../recruitment/candidate_interview_view.html | 21 +- 21 files changed, 529 insertions(+), 494 deletions(-) delete mode 100644 recruitment/migrations/0002_jobposting_ai_parsed.py delete mode 100644 recruitment/migrations/0002_zoommeetingdetails_host_email.py delete mode 100644 recruitment/migrations/0003_add_agency_password_field.py delete mode 100644 recruitment/migrations/0004_alter_person_gender.py delete mode 100644 recruitment/migrations/0005_person_gpa.py delete mode 100644 recruitment/migrations/0006_add_profile_fields_to_customuser.py delete mode 100644 recruitment/migrations/0007_migrate_profile_data_to_customuser.py delete mode 100644 recruitment/migrations/0008_drop_profile_model.py delete mode 100644 recruitment/migrations/0009_alter_message_job.py delete mode 100644 recruitment/migrations/0010_add_document_review_stage.py delete mode 100644 recruitment/migrations/0011_add_document_review_stage.py delete mode 100644 recruitment/migrations/0012_application_exam_score.py diff --git a/recruitment/__pycache__/models.cpython-312.pyc b/recruitment/__pycache__/models.cpython-312.pyc index 1edec8c535bfc54050e86b607375d8679008c1b8..e14024eb18ada80bc4f2e1818f1e1def2e1add50 100644 GIT binary patch delta 5137 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 IoA3<&1Kel2p8x;= delta 5081 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 delta 5088 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 diff --git a/recruitment/__pycache__/views.cpython-312.pyc b/recruitment/__pycache__/views.cpython-312.pyc index 2b263c2bbe78377b9733cbabbd036e1d5bbcd115..b69104f6a7cd26a8bacd076764ba478c9e689eea 100644 GIT binary patch delta 44652 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 LuwAT!@fY(yUJCc`26tQm3w)v| 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 delta 2211 zcmaJ?eQZ-z6z_fgZnti*bz`Eg`(V()J`_cCWM2WrzV4e4hVBZcYthjL1$*A|B|0ZRK5Md3QV4al^(jv@y77^eLnLSsMVME$pcg7i z&2YEfKqR!%MRoNGg@WFel%j@PMUqO=R_TI#3WcDM)KFoLhf8HT6ASQKxTqEeH^rBW zT2c3=a7rJhl{B+gQiujgD``aI5n)If^loO=icw)ovt7(pGR@NbrxY!k9-tJnpi*p@ zQp^ltxDu3kV&LeexMFdUxcC9|ar5atX)}akyrkWh4wG$h@IrljYxn@n^Y_gTAl4I} znXq7Huz|?T#QB-cORP!W%o5vnvBm+v)xRolZg3J32VXU=C|<`d2kmFIQV&`=2=xe8 z(5FIZ#AOqL3c-t@!GM#2RR@nX6@c3p2VG4`hE^6F78DBi2^en5t-PtycVv#M%=pgO zU52ma2eUh~$5lywt!eMh_MIOje6LOR8_n!(O!lW|c9f1srT9~`2Ui?lb#&FSY+NV% zqs#}(JIhaGonJa;-Oy1!9`&qT+AImJZCFb?!Y+gZSQYPsx9|@7b|bvYz^bSF(C$Lm zkI>D)YuwOetF>(Q*gW-aubwZ~+dK|>05c9E^dKl0SPe8%a7|D#G@y{;9^AAyxM{8| zc%_WW5dV9a`aS}|eEl4ephjr)ks1qh1=G@_t#j!4cIE%m^Fxhfrqg)53lB|S;-n7C zoH=11Ui~JQbGv0d^tB{t8nCBkS#F7s*7TuW0zEr2U}~S89D*%f7Gu~nVOLjL0YA0S zG$VTskY%C6q_gw&3ac!%1KB&_R@d3pVVvmXSHc~6FXk%1mHqiCNEk4ATy<5etEwH% zjV>y>1FCJTn;G`y-6`z5SlazW%28xKgm8{A2b9#+7*KC@I%>p#+HH4H2OQ~6H3o}f zS#C45*_Obs-H)ixvE`(!Jg`znMj)p*i(G&=dN-2u@KNv6W(gUOW3A`WqG*l4RBw)Y zl&xFj<$a^VlNT{`389F^%jwr>e#5|O2qf6qZ`>)e>s#e+-fpjQJ7|N`?x0s8?eJR7 zx0v}I*bXNYUS(!L<95|kyCV=4k$VlZE;Ddz8NVg?&@!y$I))H@@)w5%RU)QZwX_gp z7cj>6j=)%dF1ZL~Ad6groPk99IL2BrYa;^xn8% z1ihT+23m#a3rSuku)}AD3j>SQKe6zrd}E+TNq&H>#~#=Gg85%U|FLbxpV7RDFb;9P z{D=6wxsx;VdEdhD?@;Zts&6y%Z}~%CzDl!d zyoCG-dBa`baa-iEr*{&)qy$+RB%eijyFN+o}A^-pY diff --git a/recruitment/migrations/0001_initial.py b/recruitment/migrations/0001_initial.py index e11b731..db362f9 100644 --- a/recruitment/migrations/0001_initial.py +++ b/recruitment/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.7 on 2025-11-14 21:43 +# Generated by Django 5.2.7 on 2025-11-17 09:52 import django.contrib.auth.models import django.contrib.auth.validators @@ -127,6 +127,8 @@ class Migration(migrations.Migration): ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), ('user_type', models.CharField(choices=[('staff', 'Staff'), ('agency', 'Agency'), ('candidate', 'Candidate')], default='staff', max_length=20, verbose_name='User Type')), ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone')), + ('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/', validators=[recruitment.validators.validate_image_size], verbose_name='Profile Image')), + ('designation', models.CharField(blank=True, max_length=100, null=True, verbose_name='Designation')), ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), ], @@ -221,6 +223,7 @@ class Migration(migrations.Migration): ('notes', models.TextField(blank=True, help_text='Internal notes about the agency')), ('country', django_countries.fields.CountryField(blank=True, max_length=2, null=True)), ('address', models.TextField(blank=True, null=True)), + ('generated_password', models.CharField(blank=True, help_text='Generated password for agency user account', max_length=255, null=True)), ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='agency_profile', to=settings.AUTH_USER_MODEL, verbose_name='User')), ], options={ @@ -241,10 +244,11 @@ class Migration(migrations.Migration): ('is_resume_parsed', models.BooleanField(default=False, verbose_name='Resume Parsed')), ('parsed_summary', models.TextField(blank=True, verbose_name='Parsed Summary')), ('applied', models.BooleanField(default=False, verbose_name='Applied')), - ('stage', models.CharField(choices=[('Applied', 'Applied'), ('Exam', 'Exam'), ('Interview', 'Interview'), ('Offer', 'Offer'), ('Hired', 'Hired'), ('Rejected', 'Rejected')], db_index=True, default='Applied', max_length=20, verbose_name='Stage')), + ('stage', models.CharField(choices=[('Applied', 'Applied'), ('Exam', 'Exam'), ('Interview', 'Interview'), ('Document Review', 'Document Review'), ('Offer', 'Offer'), ('Hired', 'Hired'), ('Rejected', 'Rejected')], db_index=True, default='Applied', max_length=20, verbose_name='Stage')), ('applicant_status', models.CharField(blank=True, choices=[('Applicant', 'Applicant'), ('Candidate', 'Candidate')], default='Applicant', max_length=20, null=True, verbose_name='Applicant Status')), ('exam_date', models.DateTimeField(blank=True, null=True, verbose_name='Exam Date')), ('exam_status', models.CharField(blank=True, choices=[('Passed', 'Passed'), ('Failed', 'Failed')], max_length=20, null=True, verbose_name='Exam Status')), + ('exam_score', models.FloatField(blank=True, null=True, verbose_name='Exam Score')), ('interview_date', models.DateTimeField(blank=True, null=True, verbose_name='Interview Date')), ('interview_status', models.CharField(blank=True, choices=[('Passed', 'Passed'), ('Failed', 'Failed')], max_length=20, null=True, verbose_name='Interview Status')), ('offer_date', models.DateField(blank=True, null=True, verbose_name='Offer Date')), @@ -289,6 +293,7 @@ class Migration(migrations.Migration): ('zoom_gateway_response', models.JSONField(blank=True, null=True, verbose_name='Zoom Gateway Response')), ('participant_video', models.BooleanField(default=True, verbose_name='Participant Video')), ('join_before_host', models.BooleanField(default=False, verbose_name='Join Before Host')), + ('host_email', models.CharField(blank=True, null=True)), ('mute_upon_entry', models.BooleanField(default=False, verbose_name='Mute Upon Entry')), ('waiting_room', models.BooleanField(default=False, verbose_name='Waiting Room')), ], @@ -337,6 +342,7 @@ class Migration(migrations.Migration): ('cancel_reason', models.TextField(blank=True, help_text='Reason for canceling the job posting', verbose_name='Cancel Reason')), ('cancelled_by', models.CharField(blank=True, help_text='Name of person who cancelled this job', max_length=100, verbose_name='Cancelled By')), ('cancelled_at', models.DateTimeField(blank=True, null=True)), + ('ai_parsed', models.BooleanField(default=False, help_text='Whether the job posting has been parsed by AI', verbose_name='AI Parsed')), ('assigned_to', models.ForeignKey(blank=True, help_text='The user who has been assigned to this job', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_jobs', to=settings.AUTH_USER_MODEL, verbose_name='Assigned To')), ('hiring_agency', models.ManyToManyField(blank=True, help_text='External agency responsible for sourcing candidates for this role', related_name='jobs', to='recruitment.hiringagency', verbose_name='Hiring Agency')), ('source', models.ForeignKey(blank=True, help_text='The system or channel from which this job posting originated or was first published.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='job_postings', to='recruitment.source')), @@ -428,7 +434,7 @@ class Migration(migrations.Migration): ('message_type', models.CharField(choices=[('direct', 'Direct Message'), ('job_related', 'Job Related'), ('system', 'System Notification')], default='direct', max_length=20, verbose_name='Message Type')), ('is_read', models.BooleanField(default=False, verbose_name='Is Read')), ('read_at', models.DateTimeField(blank=True, null=True, verbose_name='Read At')), - ('job', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='recruitment.jobposting', verbose_name='Related Job')), + ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='recruitment.jobposting', verbose_name='Related Job')), ('recipient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='received_messages', to=settings.AUTH_USER_MODEL, verbose_name='Recipient')), ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sent_messages', to=settings.AUTH_USER_MODEL, verbose_name='Sender')), ], @@ -450,7 +456,6 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(auto_now=True)), ('attempts', models.PositiveIntegerField(default=0, verbose_name='Send Attempts')), ('last_error', models.TextField(blank=True, verbose_name='Last Error Message')), - ('inteview', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to='recruitment.interviewschedule', verbose_name='Related Interview')), ('recipient', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL, verbose_name='Recipient')), ], options={ @@ -472,7 +477,8 @@ class Migration(migrations.Migration): ('email', models.EmailField(db_index=True, help_text='Unique email address for the person', max_length=254, unique=True, verbose_name='Email')), ('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone')), ('date_of_birth', models.DateField(blank=True, null=True, verbose_name='Date of Birth')), - ('gender', models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female'), ('O', 'Other'), ('P', 'Prefer not to say')], max_length=1, null=True, verbose_name='Gender')), + ('gender', models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female')], max_length=1, null=True, verbose_name='Gender')), + ('gpa', models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True, verbose_name='GPA')), ('nationality', django_countries.fields.CountryField(blank=True, max_length=2, null=True, verbose_name='Nationality')), ('address', models.TextField(blank=True, null=True, verbose_name='Address')), ('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/', validators=[recruitment.validators.validate_image_size], verbose_name='Profile Image')), @@ -490,16 +496,6 @@ class Migration(migrations.Migration): name='person', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='applications', to='recruitment.person', verbose_name='Person'), ), - migrations.CreateModel( - name='Profile', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/', validators=[recruitment.validators.validate_image_size])), - ('designation', models.CharField(blank=True, max_length=100, null=True)), - ('phone', models.CharField(blank=True, max_length=12, null=True, verbose_name='Phone Number')), - ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), - ], - ), migrations.CreateModel( name='ScheduledInterview', fields=[ @@ -660,6 +656,11 @@ class Migration(migrations.Migration): model_name='formsubmission', index=models.Index(fields=['submitted_at'], name='recruitment_submitt_7946c8_idx'), ), + migrations.AddField( + model_name='notification', + name='related_meeting', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to='recruitment.zoommeetingdetails', verbose_name='Related Meeting'), + ), migrations.AddIndex( model_name='formtemplate', index=models.Index(fields=['created_at'], name='recruitment_created_c21775_idx'), @@ -704,14 +705,6 @@ class Migration(migrations.Migration): model_name='message', index=models.Index(fields=['message_type', 'created_at'], name='recruitment_message_f25659_idx'), ), - migrations.AddIndex( - model_name='notification', - index=models.Index(fields=['status', 'scheduled_for'], name='recruitment_status_0ebbe4_idx'), - ), - migrations.AddIndex( - model_name='notification', - index=models.Index(fields=['recipient'], name='recruitment_recipie_eadf4c_idx'), - ), migrations.AddIndex( model_name='person', index=models.Index(fields=['email'], name='recruitment_email_0b1ab1_idx'), @@ -764,4 +757,12 @@ class Migration(migrations.Migration): model_name='jobposting', index=models.Index(fields=['slug'], name='recruitment_slug_004045_idx'), ), + migrations.AddIndex( + model_name='notification', + index=models.Index(fields=['status', 'scheduled_for'], name='recruitment_status_0ebbe4_idx'), + ), + migrations.AddIndex( + model_name='notification', + index=models.Index(fields=['recipient'], name='recruitment_recipie_eadf4c_idx'), + ), ] diff --git a/recruitment/migrations/0002_jobposting_ai_parsed.py b/recruitment/migrations/0002_jobposting_ai_parsed.py deleted file mode 100644 index af9eade..0000000 --- a/recruitment/migrations/0002_jobposting_ai_parsed.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-13 13:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='jobposting', - name='ai_parsed', - field=models.BooleanField(default=False, help_text='Whether the job posting has been parsed by AI', verbose_name='AI Parsed'), - ), - ] diff --git a/recruitment/migrations/0002_zoommeetingdetails_host_email.py b/recruitment/migrations/0002_zoommeetingdetails_host_email.py deleted file mode 100644 index 6425f6a..0000000 --- a/recruitment/migrations/0002_zoommeetingdetails_host_email.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.7 on 2025-11-14 22:33 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='zoommeetingdetails', - name='host_email', - field=models.CharField(blank=True, null=True), - ), - ] diff --git a/recruitment/migrations/0003_add_agency_password_field.py b/recruitment/migrations/0003_add_agency_password_field.py deleted file mode 100644 index fca0d6b..0000000 --- a/recruitment/migrations/0003_add_agency_password_field.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-13 14:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0002_jobposting_ai_parsed'), - ] - - operations = [ - migrations.AddField( - model_name='hiringagency', - name='generated_password', - field=models.CharField(blank=True, help_text='Generated password for agency user account', max_length=255, null=True), - ), - ] diff --git a/recruitment/migrations/0004_alter_person_gender.py b/recruitment/migrations/0004_alter_person_gender.py deleted file mode 100644 index eee5da4..0000000 --- a/recruitment/migrations/0004_alter_person_gender.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-14 23:27 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0003_add_agency_password_field'), - ] - - operations = [ - migrations.AlterField( - model_name='person', - name='gender', - field=models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female')], max_length=1, null=True, verbose_name='Gender'), - ), - ] diff --git a/recruitment/migrations/0005_person_gpa.py b/recruitment/migrations/0005_person_gpa.py deleted file mode 100644 index 19dd0ad..0000000 --- a/recruitment/migrations/0005_person_gpa.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-15 20:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0004_alter_person_gender'), - ] - - operations = [ - migrations.AddField( - model_name='person', - name='gpa', - field=models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True, verbose_name='GPA'), - ), - ] diff --git a/recruitment/migrations/0006_add_profile_fields_to_customuser.py b/recruitment/migrations/0006_add_profile_fields_to_customuser.py deleted file mode 100644 index a8342d6..0000000 --- a/recruitment/migrations/0006_add_profile_fields_to_customuser.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-15 20:56 - -import recruitment.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0005_person_gpa'), - ] - - operations = [ - migrations.AddField( - model_name='customuser', - name='designation', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Designation'), - ), - migrations.AddField( - model_name='customuser', - name='profile_image', - field=models.ImageField(blank=True, null=True, upload_to='profile_pic/', validators=[recruitment.validators.validate_image_size], verbose_name='Profile Image'), - ), - ] diff --git a/recruitment/migrations/0007_migrate_profile_data_to_customuser.py b/recruitment/migrations/0007_migrate_profile_data_to_customuser.py deleted file mode 100644 index 475ef68..0000000 --- a/recruitment/migrations/0007_migrate_profile_data_to_customuser.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-15 20:57 - -from django.db import migrations - - -def migrate_profile_data_to_customuser(apps, schema_editor): - """ - Migrate data from Profile model to CustomUser model - """ - CustomUser = apps.get_model('recruitment', 'CustomUser') - Profile = apps.get_model('recruitment', 'Profile') - - # Get all profiles - profiles = Profile.objects.all() - - for profile in profiles: - if profile.user: - # Update CustomUser with Profile data - user = profile.user - if profile.profile_image: - user.profile_image = profile.profile_image - if profile.designation: - user.designation = profile.designation - user.save(update_fields=['profile_image', 'designation']) - - -def reverse_migrate_profile_data(apps, schema_editor): - """ - Reverse migration: move data from CustomUser back to Profile - """ - CustomUser = apps.get_model('recruitment', 'CustomUser') - Profile = apps.get_model('recruitment', 'Profile') - - # Get all users with profile data - users = CustomUser.objects.exclude(profile_image__isnull=True).exclude(profile_image='') - - for user in users: - # Get or create profile for this user - profile, created = Profile.objects.get_or_create(user=user) - - # Update Profile with CustomUser data - if user.profile_image: - profile.profile_image = user.profile_image - if user.designation: - profile.designation = user.designation - profile.save(update_fields=['profile_image', 'designation']) - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0006_add_profile_fields_to_customuser'), - ] - - operations = [ - migrations.RunPython( - migrate_profile_data_to_customuser, - reverse_migrate_profile_data, - ), - ] diff --git a/recruitment/migrations/0008_drop_profile_model.py b/recruitment/migrations/0008_drop_profile_model.py deleted file mode 100644 index 376ed4a..0000000 --- a/recruitment/migrations/0008_drop_profile_model.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated manually to drop the Profile model after migration to CustomUser - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0007_migrate_profile_data_to_customuser'), - ] - - operations = [ - migrations.DeleteModel( - name='Profile', - ), - ] diff --git a/recruitment/migrations/0009_alter_message_job.py b/recruitment/migrations/0009_alter_message_job.py deleted file mode 100644 index e93abc0..0000000 --- a/recruitment/migrations/0009_alter_message_job.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-16 10:00 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0008_drop_profile_model'), - ] - - operations = [ - migrations.AlterField( - model_name='message', - name='job', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='recruitment.jobposting', verbose_name='Related Job'), - preserve_default=False, - ), - ] diff --git a/recruitment/migrations/0010_add_document_review_stage.py b/recruitment/migrations/0010_add_document_review_stage.py deleted file mode 100644 index 30ffde1..0000000 --- a/recruitment/migrations/0010_add_document_review_stage.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-16 11:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0009_alter_message_job'), - ] - - operations = [ - migrations.AlterField( - model_name='application', - name='stage', - field=models.CharField(choices=[('Applied', 'Applied'), ('Exam', 'Exam'), ('Interview', 'Interview'), ('Document Review', 'Document Review'), ('Offer', 'Offer'), ('Hired', 'Hired'), ('Rejected', 'Rejected')], db_index=True, default='Applied', max_length=20, verbose_name='Stage'), - ), - ] diff --git a/recruitment/migrations/0011_add_document_review_stage.py b/recruitment/migrations/0011_add_document_review_stage.py deleted file mode 100644 index 6529b84..0000000 --- a/recruitment/migrations/0011_add_document_review_stage.py +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-16 12:08 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0010_add_document_review_stage'), - ] - - operations = [ - ] diff --git a/recruitment/migrations/0012_application_exam_score.py b/recruitment/migrations/0012_application_exam_score.py deleted file mode 100644 index 8a4b146..0000000 --- a/recruitment/migrations/0012_application_exam_score.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.6 on 2025-11-16 12:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('recruitment', '0011_add_document_review_stage'), - ] - - operations = [ - migrations.AddField( - model_name='application', - name='exam_score', - field=models.FloatField(blank=True, null=True, verbose_name='Exam Score'), - ), - ] diff --git a/recruitment/models.py b/recruitment/models.py index e3c33cc..84210f0 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -906,11 +906,35 @@ class Application(Base): @property def get_latest_meeting(self): - """Legacy compatibility - get latest meeting for this application""" + """ + Retrieves the most specific location details (subclass instance) + of the latest ScheduledInterview for this application, or None. + """ + # 1. Get the latest ScheduledInterview schedule = self.scheduled_interviews.order_by("-created_at").first() - if schedule: - return schedule.zoom_meeting - return None + + # Check if a schedule exists and if it has an interview location + if not schedule or not schedule.interview_location: + return None + + # Get the base location instance + interview_location = schedule.interview_location + + # 2. Safely retrieve the specific subclass details + + # Determine the expected subclass accessor name based on the location_type + if interview_location.location_type == 'Remote': + accessor_name = 'zoommeetingdetails' + else: # Assumes 'Onsite' or any other type defaults to Onsite + accessor_name = 'onsitelocationdetails' + + # Use getattr to safely retrieve the specific meeting object (subclass instance). + # If the accessor exists but points to None (because the subclass record was deleted), + # or if the accessor name is wrong for the object's true type, it will return None. + meeting_details = getattr(interview_location, accessor_name, None) + + return meeting_details + @property def has_future_meeting(self): diff --git a/recruitment/urls.py b/recruitment/urls.py index 1e10439..7e9fbf5 100644 --- a/recruitment/urls.py +++ b/recruitment/urls.py @@ -35,16 +35,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", - ), - path( - "jobs//confirm-schedule-interviews/", - views.confirm_schedule_interviews_view, - name="confirm_schedule_interviews_view", - ), + # Candidate URLs path( "candidates/", views_frontend.ApplicationListView.as_view(), name="candidate_list" @@ -299,38 +290,7 @@ urlpatterns = [ views.interview_detail_view, name="interview_detail", ), - # Candidate Meeting Scheduling/Rescheduling URLs - path( - "jobs//candidates//schedule-meeting/", - views.schedule_candidate_meeting, - name="schedule_candidate_meeting", - ), - path( - "api/jobs//candidates//schedule-meeting/", - views.api_schedule_candidate_meeting, - name="api_schedule_candidate_meeting", - ), - path( - "jobs//candidates//reschedule-meeting//", - views.reschedule_candidate_meeting, - name="reschedule_candidate_meeting", - ), - path( - "api/jobs//candidates//reschedule-meeting//", - views.api_reschedule_candidate_meeting, - name="api_reschedule_candidate_meeting", - ), - # New URL for simple page-based meeting scheduling - path( - "jobs//candidates//schedule-meeting-page/", - views.schedule_meeting_for_candidate, - name="schedule_meeting_for_candidate", - ), - path( - "jobs//candidates//delete_meeting_for_candidate//", - views.delete_meeting_for_candidate, - name="delete_meeting_for_candidate", - ), + # users urls path("user/", views.user_detail, name="user_detail"), path( @@ -623,4 +583,77 @@ urlpatterns = [ # path('interviews//', views.ScheduledInterviewDetailView.as_view(), name='scheduled_interview_detail'), # path('interviews//update/', views.ScheduledInterviewUpdateView.as_view(), name='update_scheduled_interview'), # path('interviews//delete/', views.ScheduledInterviewDeleteView.as_view(), name='delete_scheduled_interview'), + + #interview and meeting related urls + path( + "jobs//schedule-interviews/", + views.schedule_interviews_view, + name="schedule_interviews", + ), + path( + "jobs//confirm-schedule-interviews/", + views.confirm_schedule_interviews_view, + name="confirm_schedule_interviews_view", + ), + + # Candidate Meeting Scheduling/Rescheduling URLs + path( + "jobs//candidates//schedule-meeting/", + views.schedule_candidate_meeting, + name="schedule_candidate_meeting", + ), + path( + "api/jobs//candidates//schedule-meeting/", + views.api_schedule_candidate_meeting, + name="api_schedule_candidate_meeting", + ), + path( + "jobs//candidates//reschedule-meeting//", + views.reschedule_candidate_meeting, + name="reschedule_candidate_meeting", + ), + path( + "api/jobs//candidates//reschedule-meeting//", + views.api_reschedule_candidate_meeting, + name="api_reschedule_candidate_meeting", + ), + # New URL for simple page-based meeting scheduling + path( + "jobs//candidates//schedule-meeting-page/", + views.schedule_meeting_for_candidate, + name="schedule_meeting_for_candidate", + ), + path( + "jobs//candidates//delete_meeting_for_candidate//", + views.delete_meeting_for_candidate, + name="delete_meeting_for_candidate", + ), + + + path("interviews/meetings/", views.MeetingListView.as_view(), name="list_meetings"), + + # 1. Onsite Reschedule URL + path( + '/candidate//onsite/reschedule//', + views.reschedule_onsite_meeting, + name='reschedule_onsite_meeting' + ), + + # 2. Onsite Delete URL + + path( + 'job//candidates//delete-onsite-meeting//', + views.delete_onsite_meeting_for_candidate, + name='delete_onsite_meeting_for_candidate' + ), + + path( + 'job//candidate//schedule/onsite/', + views.schedule_onsite_meeting_for_candidate, + name='schedule_onsite_meeting_for_candidate' # This is the name used in the button + ), + + + # Detail View (assuming slug is on ScheduledInterview) + # path("interviews/meetings//", views.MeetingDetailView.as_view(), name="meeting_details"), ] diff --git a/recruitment/views.py b/recruitment/views.py index ebeb48e..63289b0 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -75,6 +75,10 @@ from .forms import ( PortalLoginForm, MessageForm, PersonForm, + OnsiteMeetingForm, + OnsiteReshuduleForm, + OnsiteScheduleForm, + InterviewEmailForm ) from easyaudit.models import CRUDEvent, LoginEvent, RequestEvent from rest_framework import viewsets @@ -116,7 +120,7 @@ from .models import ( JobPosting, ScheduledInterview, JobPostingImage, - MeetingComment, + HiringAgency, AgencyJobAssignment, AgencyAccessLink, @@ -127,6 +131,8 @@ from .models import ( OnsiteLocationDetails, InterviewLocation ) + + import logging from datastar_py.django import ( DatastarResponse, @@ -258,9 +264,7 @@ class ZoomMeetingListView(StaffRequiredMixin, ListView): queryset = queryset.prefetch_related( Prefetch( "interview", # related_name from ZoomMeeting to ScheduledInterview - queryset=ScheduledInterview.objects.select_related( - "application", "job" - ), + queryset=ScheduledInterview.objects.select_related("application", "job"), to_attr="interview_details", # Changed to not start with underscore ) ) @@ -298,6 +302,7 @@ class ZoomMeetingListView(StaffRequiredMixin, ListView): return context + # @login_required # def InterviewListView(request): # # interview_type=request.GET.get('interview_type','Remote') @@ -468,7 +473,6 @@ def ZoomMeetingDeleteView(request, slug): messages.error(request, str(e)) return redirect(reverse("list_meetings")) - # Job Posting # def job_list(request): # """Display the list of job postings order by creation date descending""" @@ -1504,6 +1508,7 @@ def _handle_get_request(request, slug, job): ) + def _handle_preview_submission(request, slug, job): """ Handles the initial POST request (Preview Schedule). @@ -1516,7 +1521,6 @@ def _handle_preview_submission(request, slug, job): if form.is_valid(): # Get the form data applications = form.cleaned_data["applications"] - interview_type = form.cleaned_data["interview_type"] start_date = form.cleaned_data["start_date"] end_date = form.cleaned_data["end_date"] working_days = form.cleaned_data["working_days"] @@ -1572,16 +1576,11 @@ def _handle_preview_submission(request, slug, job): for i, application in enumerate(applications): slot = available_slots[i] preview_schedule.append( - { - "applications": applications, - "date": slot["date"], - "time": slot["time"], - } + {"application": application, "date": slot["date"], "time": slot["time"]} ) # Save the form data to session for later use schedule_data = { - "interview_type": interview_type, "start_date": start_date.isoformat(), "end_date": end_date.isoformat(), "working_days": working_days, @@ -1604,7 +1603,6 @@ def _handle_preview_submission(request, slug, job): { "job": job, "schedule": preview_schedule, - "interview_type": interview_type, "start_date": start_date, "end_date": end_date, "working_days": working_days, @@ -1842,13 +1840,12 @@ def _handle_confirm_schedule(request, slug, job): # 3. Setup candidates and get slots candidates = Application.objects.filter(id__in=schedule_data["candidate_ids"]) - schedule.candidates.set(candidates) - available_slots = get_available_time_slots( - schedule - ) # This should still be synchronous and fast + schedule.applications.set(candidates) + available_slots = get_available_time_slots(schedule) - # 4. Queue scheduled interviews asynchronously (FAST RESPONSE) - if schedule.interview_type == "Remote": + # 4. Handle Remote/Onsite logic + if schedule_data.get("schedule_interview_type") == 'Remote': + # ... (Remote logic remains unchanged) queued_count = 0 for i, candidate in enumerate(candidates): if i < len(available_slots): @@ -1869,27 +1866,79 @@ def _handle_confirm_schedule(request, slug, job): if SESSION_ID_KEY in request.session: del request.session[SESSION_ID_KEY] return redirect("job_detail", slug=slug) - else: - for i, candidate in enumerate(candidates): - if i < len(available_slots): - slot = available_slots[i] - ScheduledInterview.objects.create( - candidate=candidate, - job=job, - # zoom_meeting=None, - schedule=schedule, - interview_date=slot["date"], - interview_time=slot["time"], - ) - messages.success(request, f"Onsite schedule Interview Create succesfully") + elif schedule_data.get("schedule_interview_type") == 'Onsite': + print("inside...") + + if request.method == 'POST': + form = OnsiteMeetingForm(request.POST) + + if form.is_valid(): + + if not available_slots: + messages.error(request, "No available slots found for the selected schedule range.") + return render(request, 'interviews/onsite_location_form.html', {'form': form, 'schedule': schedule, 'job': job}) + + # Extract common location data from the form + physical_address = form.cleaned_data['physical_address'] + room_number = form.cleaned_data['room_number'] + + try: + # 1. Iterate over candidates and create a NEW Location object for EACH + for i, candidate in enumerate(candidates): + if i < len(available_slots): + slot = available_slots[i] + + + location_start_dt = datetime.combine(slot['date'], schedule.start_time) + + # --- CORE FIX: Create a NEW Location object inside the loop --- + onsite_location = OnsiteLocationDetails.objects.create( + start_time=location_start_dt, + duration=schedule.interview_duration, + physical_address=physical_address, + room_number=room_number, + location_type="Onsite" + + ) + + # 2. Create the ScheduledInterview, linking the unique location + ScheduledInterview.objects.create( + application=candidate, + job=job, + schedule=schedule, + interview_date=slot['date'], + interview_time=slot['time'], + interview_location=onsite_location, + ) + + messages.success( + request, + f"Onsite schedule interviews created successfully for {len(candidates)} candidates." + ) + + # Clear session data keys upon successful completion + if SESSION_DATA_KEY in request.session: del request.session[SESSION_DATA_KEY] + if SESSION_ID_KEY in request.session: del request.session[SESSION_ID_KEY] + + return redirect('job_detail', slug=job.slug) + + except Exception as e: + messages.error(request, f"Error creating onsite location/interviews: {e}") + # On failure, re-render the form with the error and ensure 'job' is present + return render(request, 'interviews/onsite_location_form.html', {'form': form, 'schedule': schedule, 'job': job}) + + else: + # Form is invalid, re-render with errors + # Ensure 'job' is passed to prevent NoReverseMatch + return render(request, 'interviews/onsite_location_form.html', {'form': form, 'schedule': schedule, 'job': job}) + + else: + # For a GET request + form = OnsiteMeetingForm() + + return render(request, 'interviews/onsite_location_form.html', {'form': form, 'schedule': schedule, 'job': job}) - # Clear both session data keys upon successful completion - if SESSION_DATA_KEY in request.session: - del request.session[SESSION_DATA_KEY] - if SESSION_ID_KEY in request.session: - del request.session[SESSION_ID_KEY] - return redirect("schedule_interview_location_form", slug=schedule.slug) def schedule_interviews_view(request, slug): @@ -2135,41 +2184,18 @@ def candidate_update_status(request, slug): def candidate_interview_view(request, slug): job = get_object_or_404(JobPosting, slug=slug) - if request.method == "POST": - form = ParticipantsSelectForm(request.POST, instance=job) - - if form.is_valid(): - # Save the main instance (JobPosting) - job_instance = form.save(commit=False) - job_instance.save() - - # MANUALLY set the M2M relationships based on submitted data - job_instance.participants.set(form.cleaned_data["participants"]) - job_instance.users.set(form.cleaned_data["users"]) - - messages.success(request, "Interview participants updated successfully.") - return redirect("candidate_interview_view", slug=job.slug) - - else: - initial_data = { - "participants": job.participants.all(), - "users": job.users.all(), - } - form = ParticipantsSelectForm(instance=job, initial=initial_data) - - else: - form = ParticipantsSelectForm(instance=job) context = { "job": job, "candidates": job.interview_candidates, "current_stage": "Interview", - "form": form, - "participants_count": 0 #job.participants.count() + job.users.count(), + } return render(request, "recruitment/candidate_interview_view.html", context) + + @staff_user_required def candidate_document_review_view(request, slug): """ @@ -5332,77 +5358,39 @@ def compose_candidate_email(request, job_slug): from .email_service import send_bulk_email job = get_object_or_404(JobPosting, slug=job_slug) - candidate = get_object_or_404(Application, slug=candidate_slug, job=job) - if request.method == "POST": - form = CandidateEmailForm(job, candidate, request.POST) - candidate_ids = request.GET.getlist("candidate_ids") - candidates = Application.objects.filter(id__in=candidate_ids) + + # # candidate = get_object_or_404(Application, slug=candidate_slug, job=job) + # if request.method == "POST": + # form = CandidateEmailForm(job, candidate, request.POST) + candidate_ids=request.GET.getlist('candidate_ids') + candidates=Application.objects.filter(id__in=candidate_ids) - if request.method == "POST": - print( - "........................................................inside candidate conpose............." - ) - candidate_ids = request.POST.getlist("candidate_ids") - candidates = Application.objects.filter(id__in=candidate_ids) + + if request.method == 'POST': + print("........................................................inside candidate conpose.............") + candidate_ids = request.POST.getlist('candidate_ids') + candidates=Application.objects.filter(id__in=candidate_ids) form = CandidateEmailForm(job, candidates, request.POST) if form.is_valid(): print("form is valid ...") # Get email addresses email_addresses = form.get_email_addresses() - if not email_addresses: - messages.error( - request, "No valid email addresses found for selected recipients." - ) - return render( - request, - "includes/email_compose_form.html", - {"form": form, "job": job, "candidate": candidate}, - ) - - # Check if this is an interview invitation - subject = form.cleaned_data.get("subject", "").lower() - is_interview_invitation = "interview" in subject or "meeting" in subject - - if is_interview_invitation: - # Use HTML template for interview invitations - meeting_details = None - if form.cleaned_data.get("include_meeting_details"): - # Try to get meeting details from candidate - meeting_details = { - "topic": f"Interview for {job.title}", - "date_time": getattr( - candidate, "interview_date", "To be scheduled" - ), - "duration": "60 minutes", - "join_url": getattr(candidate, "meeting_url", ""), - } - - from .email_service import send_interview_invitation_email - - email_result = send_interview_invitation_email( - candidate=candidate, - job=job, - meeting_details=meeting_details, - recipient_list=email_addresses, - ) - else: - # Get formatted message for regular emails - message = form.get_formatted_message() - subject = form.cleaned_data.get("subject") - print(email_addresses) + if not email_addresses: - messages.error(request, "No email selected") - referer = request.META.get("HTTP_REFERER") + messages.error(request, 'No email selected') + referer = request.META.get('HTTP_REFERER') if referer: # Redirect back to the referring page return redirect(referer) else: - return redirect("dashboard") + + return redirect('dashboard') + message = form.get_formatted_message() - subject = form.cleaned_data.get("subject") + subject = form.cleaned_data.get('subject') # Send emails using email service (no attachments, synchronous to avoid pickle issues) @@ -5413,7 +5401,7 @@ def compose_candidate_email(request, job_slug): request=request, attachments=None, async_task_=True, # Changed to False to avoid pickle issues - from_interview=False, + from_interview=False ) if email_result["success"]: @@ -5441,34 +5429,17 @@ def compose_candidate_email(request, job_slug): } ) - return render( - request, - "includes/email_compose_form.html", - {"form": form, "job": job, "candidate": candidate}, - ) - return render( request, "includes/email_compose_form.html", {"form": form, "job": job, "candidate": candidates}, ) - # except Exception as e: - # logger.error(f"Error sending candidate email: {e}") - # messages.error(request, f'An error occurred while sending the email: {str(e)}') - - # # For HTMX requests, return error response - # if 'HX-Request' in request.headers: - # return JsonResponse({ - # 'success': False, - # 'error': f'An error occurred while sending the email: {str(e)}' - # }) - else: # Form validation errors - print("form is not valid") + print('form is not valid') print(form.errors) messages.error(request, "Please correct the errors below.") @@ -5484,9 +5455,8 @@ def compose_candidate_email(request, job_slug): return render( request, "includes/email_compose_form.html", - {"form": form, "job": job, "candidates": candidate}, - s, - ) + {"form": form, "job": job, "candidates": candidates}, + ) else: # GET request - show the form @@ -5500,6 +5470,7 @@ def compose_candidate_email(request, job_slug): ) + # Source CRUD Views @staff_user_required def source_list(request): @@ -5844,12 +5815,288 @@ def send_interview_email(request, slug): # return render(request,'interviews/schedule_interview_location_form.html',{'form':form,'schedule':schedule}) -def onsite_interview_list_view(request): - onsite_interviews = ScheduledInterview.objects.filter( - schedule__interview_type="Onsite" - ) - return render( - request, - "interviews/onsite_interview_list.html", - {"onsite_interviews": onsite_interviews}, +class MeetingListView(ListView): + """ + A unified view to list both Remote and Onsite Scheduled Interviews. + """ + model = ScheduledInterview + template_name = "meetings/list_meetings.html" + context_object_name = "meetings" + paginate_by = 100 + + def get_queryset(self): + # Start with a base queryset, ensuring an InterviewLocation link exists. + queryset = super().get_queryset().filter(interview_location__isnull=False).select_related( + 'interview_location', + 'job', + 'application__person', + 'application', + ).prefetch_related( + 'interview_location__zoommeetingdetails', + 'interview_location__onsitelocationdetails', + ) + # Note: Printing the queryset here can consume memory for large sets. + + # Get filters from GET request + search_query = self.request.GET.get("q") + status_filter = self.request.GET.get("status") + candidate_name_filter = self.request.GET.get("candidate_name") + type_filter = self.request.GET.get("type") + print(type_filter) + + # 2. Type Filter: Filter based on the base InterviewLocation's type + if type_filter: + # Use .title() to handle case variations from URL (e.g., 'remote' -> 'Remote') + normalized_type = type_filter.title() + print(normalized_type) + # Assuming InterviewLocation.LocationType is accessible/defined + if normalized_type in ['Remote', 'Onsite']: + queryset = queryset.filter(interview_location__location_type=normalized_type) + print(queryset) + + # 3. Search by Topic (stored on InterviewLocation) + if search_query: + queryset = queryset.filter(interview_location__topic__icontains=search_query) + + # 4. Status Filter + if status_filter: + queryset = queryset.filter(status=status_filter) + + # 5. Candidate Name Filter + if candidate_name_filter: + queryset = queryset.filter( + Q(application__person__first_name__icontains=candidate_name_filter) | + Q(application__person__last_name__icontains=candidate_name_filter) + ) + + return queryset.order_by("-interview_date", "-interview_time") + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + # Pass filters back to the template for retention + context["search_query"] = self.request.GET.get("q", "") + context["status_filter"] = self.request.GET.get("status", "") + context["candidate_name_filter"] = self.request.GET.get("candidate_name", "") + context["type_filter"] = self.request.GET.get("type", "") + + + # CORRECTED: Pass the status choices from the model class for the filter dropdown + context["status_choices"] = self.model.InterviewStatus.choices + + meetings_data = [] + + for interview in context.get(self.context_object_name, []): + location = interview.interview_location + details = None + + if not location: + continue + + # Determine and fetch the CONCRETE details object (prefetched) + if location.location_type == location.LocationType.REMOTE: + details = getattr(location, 'zoommeetingdetails', None) + elif location.location_type == location.LocationType.ONSITE: + details = getattr(location, 'onsitelocationdetails', None) + + # Combine date and time for template display/sorting + start_datetime = None + if interview.interview_date and interview.interview_time: + start_datetime = datetime.combine(interview.interview_date, interview.interview_time) + + # SUCCESS: Build the data dictionary + meetings_data.append({ + 'interview': interview, + 'location': location, + 'details': details, + 'type': location.location_type, + 'topic': location.topic, + 'slug': interview.slug, + 'start_time': start_datetime, # Combined datetime object + # Duration should ideally be on ScheduledInterview or fetched from details + 'duration': getattr(details, 'duration', 'N/A'), + # Use details.join_url and fallback to None, if Remote + 'join_url': getattr(details, 'join_url', None) if location.location_type == location.LocationType.REMOTE else None, + 'meeting_id': getattr(details, 'meeting_id', None), + # Use the primary status from the ScheduledInterview record + 'status': interview.status, + }) + + context["meetings_data"] = meetings_data + + return context + +def reschedule_onsite_meeting(request, slug, candidate_id, meeting_id): + """Handles the rescheduling of an Onsite Interview (updates OnsiteLocationDetails).""" + job = get_object_or_404(JobPosting, slug=slug) + candidate = get_object_or_404(Application, pk=candidate_id) + + # Fetch the OnsiteLocationDetails instance, ensuring it belongs to this candidate. + # We use the reverse relationship: onsitelocationdetails -> interviewlocation -> scheduledinterview -> application + # The 'interviewlocation_ptr' is the foreign key field name if OnsiteLocationDetails is a proxy/multi-table inheritance model. + onsite_meeting = get_object_or_404( + OnsiteLocationDetails, + pk=meeting_id, + # Correct filter: Use the reverse link through the ScheduledInterview model. + # This assumes your ScheduledInterview model links back to a generic InterviewLocation base. + interviewlocation_ptr__scheduled_interview__application=candidate ) + + if request.method == 'POST': + form = OnsiteReshuduleForm(request.POST, instance=onsite_meeting) + + if form.is_valid(): + instance = form.save(commit=False) + + if instance.start_time < timezone.now(): + messages.error(request, "Start time must be in the future for rescheduling.") + return render(request, "meetings/reschedule_onsite.html", {"form": form, "job": job, "candidate": candidate, "meeting": onsite_meeting}) + + # Update parent status + try: + # Retrieve the ScheduledInterview instance via the reverse relationship + scheduled_interview = ScheduledInterview.objects.get( + interview_location=instance.interviewlocation_ptr # Use the base model FK + ) + scheduled_interview.status = ScheduledInterview.InterviewStatus.SCHEDULED + scheduled_interview.save() + except ScheduledInterview.DoesNotExist: + messages.warning(request, "Parent schedule record not found. Status not updated.") + + instance.save() + messages.success(request, "Onsite meeting successfully rescheduled! ✅") + + return redirect(reverse("candidate_interview_view", kwargs={'slug': job.slug})) + + else: + form = OnsiteReshuduleForm(instance=onsite_meeting) + + context = { + "form": form, + "job": job, + "candidate": candidate, + "meeting": onsite_meeting + } + return render(request, "meetings/reschedule_onsite_meeting.html", context) + + +# recruitment/views.py + +@staff_user_required +def delete_onsite_meeting_for_candidate(request, slug, candidate_pk, meeting_id): + """ + Deletes a specific Onsite Location Details instance. + This does not require an external API call. + """ + job = get_object_or_404(JobPosting, slug=slug) + candidate = get_object_or_404(Application, pk=candidate_pk) + + # Target the specific Onsite meeting details instance + meeting = get_object_or_404(OnsiteLocationDetails, pk=meeting_id) + + if request.method == "POST": + # Delete the local Django object. + # This deletes the base InterviewLocation and updates the ScheduledInterview FK. + meeting.delete() + messages.success(request, f"Onsite meeting for {candidate.name} deleted successfully.") + + return redirect(reverse("candidate_interview_view", kwargs={"slug": job.slug})) + + context = { + "job": job, + "candidate": candidate, + "meeting": meeting, + "location_type": "Onsite", + "delete_url": reverse( + "delete_onsite_meeting_for_candidate", # Use the specific new URL name + kwargs={ + "slug": job.slug, + "candidate_pk": candidate_pk, + "meeting_id": meeting_id, + }, + ), + } + return render(request, "meetings/delete_meeting_form.html", context) + + + +def schedule_onsite_meeting_for_candidate(request, slug, candidate_pk): + """ + Handles scheduling a NEW Onsite Interview for a candidate using OnsiteScheduleForm. + """ + job = get_object_or_404(JobPosting, slug=slug) + candidate = get_object_or_404(Application, pk=candidate_pk) + + action_url = reverse('schedule_onsite_meeting_for_candidate', + kwargs={'slug': job.slug, 'candidate_pk': candidate.pk}) + + if request.method == 'POST': + # Use the new form + form = OnsiteScheduleForm(request.POST) + if form.is_valid(): + + cleaned_data = form.cleaned_data + + # 1. Create OnsiteLocationDetails + onsite_loc = OnsiteLocationDetails( + topic=cleaned_data['topic'], + physical_address=cleaned_data['physical_address'], + room_number=cleaned_data['room_number'], + start_time=cleaned_data['start_time'], + duration=cleaned_data['duration'], + status=OnsiteLocationDetails.Status.WAITING, + location_type=InterviewLocation.LocationType.ONSITE, + ) + onsite_loc.save() + + # 2. Extract Date and Time + interview_date = cleaned_data['start_time'].date() + interview_time = cleaned_data['start_time'].time() + + # 3. Create ScheduledInterview linked to the new location + # Use cleaned_data['application'] and cleaned_data['job'] from the form + ScheduledInterview.objects.create( + application=cleaned_data['application'], + job=cleaned_data['job'], + interview_location=onsite_loc, + interview_date=interview_date, + interview_time=interview_time, + status=ScheduledInterview.InterviewStatus.SCHEDULED, + ) + + messages.success(request, "Onsite interview scheduled successfully. ✅") + return redirect(reverse("candidate_interview_view", kwargs={'slug': job.slug})) + + else: + # GET Request: Initialize the hidden fields with the correct objects + initial_data = { + 'application': candidate, # Pass the object itself for ModelChoiceField + 'job': job, # Pass the object itself for ModelChoiceField + } + # Use the new form + form = OnsiteScheduleForm(initial=initial_data) + + context = { + "form": form, + "job": job, + "candidate": candidate, + "action_url": action_url, + } + + return render(request, "meetings/schedule_onsite_meeting_form.html", context) +# def meeting_list_view(request): +# queryset = ScheduledInterview.filter(interview_location__isnull=False).select_related( +# 'interview_location', +# 'job', +# 'application__person', +# 'application', +# ).prefetch_related( +# 'interview_location__zoommeetingdetails', +# 'interview_location__onsitelocationdetails', +# ) +# print(queryset) +# return render(request,) +# ========================================================================= +# 2. Simple Meeting Creation Views (Placeholders) +# ========================================================================= diff --git a/templates/recruitment/candidate_interview_view.html b/templates/recruitment/candidate_interview_view.html index 9152efc..fb6a4fa 100644 --- a/templates/recruitment/candidate_interview_view.html +++ b/templates/recruitment/candidate_interview_view.html @@ -206,14 +206,11 @@ {% csrf_token %} {# Select Input Group - No label needed for this one, so we just flex the select and button #} - +
+ -<<<<<<< HEAD {% else%}
-- 2.39.5 From f1499f7be0419f44a355d2599f45850b55cd1a86 Mon Sep 17 00:00:00 2001 From: Faheed Date: Tue, 18 Nov 2025 13:13:16 +0300 Subject: [PATCH 5/5] littele ui fix --- recruitment/__pycache__/forms.cpython-312.pyc | Bin 84205 -> 84207 bytes .../__pycache__/models.cpython-312.pyc | Bin 107404 -> 107404 bytes recruitment/__pycache__/urls.cpython-312.pyc | Bin 23134 -> 22793 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 195534 -> 193529 bytes recruitment/forms.py | 2 +- recruitment/models.py | 2 +- recruitment/urls.py | 43 +-- recruitment/views.py | 291 ++++------------- templates/applicant/career.html | 20 +- templates/recruitment/agency_detail.html | 301 ++++++++++++------ .../recruitment/candidate_interview_view.html | 4 +- 11 files changed, 299 insertions(+), 364 deletions(-) diff --git a/recruitment/__pycache__/forms.cpython-312.pyc b/recruitment/__pycache__/forms.cpython-312.pyc index 8e6cf04afb98379d8fd9937a98070d36091482b4..5cd8f9672e233cc441d1a80c73271b86bbc21678 100644 GIT binary patch delta 83 zcmaDmk@fvVR^HRRyj%=Gkj*Ha`MZ&KD=%X;2d9vKUU6ngs!#spcLw5<_0l+}Z{T2D g%r6cTPEIVz%+K4N$jK;S&nh}!ey05NIuFKt08_&no&W#< delta 92 zcmaDqk@f9FR^HRRyj%=GVE0Zc^H(G9R$j(x4k1DRyyDD~RNvIplFYnxxBQ~q$%<)W k)04OvXHNIxWaQ!#Ls76jnUhh%o|Sbz|4jbr4IYg70BuJdKmY&$ diff --git a/recruitment/__pycache__/models.cpython-312.pyc b/recruitment/__pycache__/models.cpython-312.pyc index e14024eb18ada80bc4f2e1818f1e1def2e1add50..d2c25700baa7b1d8440bb8eeb42cb7475de1f2d2 100644 GIT binary patch delta 104 zcmeA<&en6BjrTM!FBbz4{9%^PG}_2pa$)l1TO!=-DXbvK#E{BAdBFuyMuBM)7$q46 zCoAp|pZxqn6C?lRtc!+>{F~=obY&B?2Wl@8W&#pDAi|Du@~7)xnDr*=ZGL%U@hJd^ Caw0we delta 106 zcmeA<&en6BjrTM!FBbz4T>dVVX}poQewHrW6S?0f`=_$)B!&Vb-6hzxm~j G#iszq3nHTc diff --git a/recruitment/__pycache__/urls.cpython-312.pyc b/recruitment/__pycache__/urls.cpython-312.pyc index 30fcc8db63409eda72dd32b4dfa730a3ac9246ee..543d155672ba2bee9e9f9c9a4b4081e3e946f47a 100644 GIT binary patch delta 4839 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 Q96CClhmsfGCjX`RKaIH~od5s; delta 5362 zcmaKvdrVu`9mjFFz`cMm58GhO(?I+H41`b!5Wwb5Y=e1+@C})MA;fBv00XSgBP$R56 zP8rR3dT9I4wB1YFX)NjQM) zD9SB!4Z34I!_X6MT|*J%FeXRB8ECssMvxhNXn{VJTHWG zg_^DxBC2{3SG5&JqF0i#aJ-kpyZ%7Cz7yW1S5)BbKqnPO^5-k`Px@;S(O-ARdfuRW zD=L)Hv7R?+Tb8Vp#UgdG5!)tWcRa~XnfKkW1fizu-H4FCzy-f|0Qp`7`93CZA3)xY zAn#!E1LR6g8~7kX`z6*sJRr)45#+C)MDDznIweD;$^aTtn$RQVRlLJjRZ8Sjsqj*N z5*8f&T}8I;FJWDwrt7Z}`98(@J`E$$MK#&FzlC?*QD@-;b5%nw5BjzyCD!%89qoBQ zwjuqqh=>od_KWXQOegR+V#rl8ekr!_G6>dKvm-)+AZu&A1ejvVw**(UeCH z7+6X55~6F49-vnd9bJ!BX5e5?g##m7*JYd4hMJvcvd3dI+`QYpHn%XdT6RxJ+Ca(D0R8lrsmGBmesGGU7x8XrlIVfBBV})RCKO(e&-XNJ6+a-?$qQV ze_a~7T$j3ItlK=a^UiU*O!m^wqlSOT8q-D=7w7FzfemLLoO7SQrwZ$AUU5&YxoNjL zth)uOK-Dcr&}U7J=!9ilz0!`)?MeqRoy2qza{|3-IhyMr&2D0Ph;b6rOH3az{peqo zx6se5&#G58iGP8Zi^N3oRP`$}0pUkKsMVV^d%GE|Fd(=6mRkmWc!bH)Z&DwONUh zS~E1Zc*UVzhP{@0ZCsR_c)7`^6`12vv<)@3>hQ
-

@@ -252,6 +329,9 @@

-
-
@@ -302,7 +380,6 @@
-
@@ -310,7 +387,6 @@ {% trans "Contact Information" %} - {% if agency.phone %}
@@ -322,7 +398,6 @@
{% endif %} - {% if agency.email %}
@@ -334,7 +409,6 @@
{% endif %} - {% if agency.website %}
@@ -360,7 +434,6 @@ {% trans "Location Information" %} - {% if agency.address %}
@@ -372,7 +445,6 @@
{% endif %} - {% if agency.city %}
@@ -384,7 +456,6 @@
{% endif %} - {% if agency.country %}
@@ -400,7 +471,6 @@
- {% if agency.description %}
@@ -411,14 +481,12 @@
{% endif %} - {% if generated_password and request.user.is_staff %}
{% trans "Agency Login Information" %}
- -
@@ -437,9 +504,8 @@
{% trans "Username" %}
{{ agency.user.username }}
-
+
-
@@ -461,59 +527,138 @@
- -
-
-
-
- - {% trans "Recent Candidates" %} -
- {% comment %} - {% trans "View All Candidates" %} - - {% endcomment %} -
+
+ +
+
-
- {% if candidates %} - {% for candidate in candidates %} -
-
-
-
{{ candidate.name }}
-
- {{ candidate.email }} - {% if candidate.phone %} - {{ candidate.phone }} - {% endif %} + +
+ +
+ {% if candidates %} + {% for candidate in candidates %} +
+
+
+
{{ candidate.name }}
+
+ {{ candidate.email }} + {% if candidate.phone %} + {{ candidate.phone }} + {% endif %} +
-
-
- - {{ candidate.get_stage_display }} - -
- {{ candidate.created_at|date:"M d, Y" }} +
+ + {{ candidate.get_stage_display }} + +
+ {{ candidate.created_at|date:"M d, Y" }} +
+ {% endfor %} + {% else %} +
+ +
{% trans "No candidates yet" %}
+

{% trans "This agency hasn't submitted any candidates yet." %}

- {% endfor %} - {% else %} -
- -
{% trans "No candidates yet" %}
-

{% trans "This agency hasn't submitted any candidates yet." %}

-
- {% endif %} + {% endif %} +
+ +
+ {% comment %} + NOTE: You will need to pass an 'assigned_jobs' list + from your Django view context to populate this section. + {% endcomment %} + + {% if assigned_jobs %} + {% for assignment in assigned_jobs %} +
+
+
+ +
+ {{ assignment.job.location }} + {{ assignment.job.department.name }} +
+
+
+ + {% trans "Assigned" %} + +
+ {% trans "Assigned On:" %} {{ assignment.created_at|date:"M d, Y" }} +
+
+
+
+ {% endfor %} + {% else %} +
+ +
{% trans "No jobs assigned" %}
+

{% trans "There are no open job assignments for this agency." %}

+ + {% trans "Assign New Job" %} + +
+ {% endif %} +
+
-
+
-
-
@@ -551,40 +696,6 @@
- - {% comment %}
-
-
- - {% trans "Quick Actions" %} -
-
- -
{% endcomment %} - -
@@ -634,4 +745,4 @@ function copyPassword() { } -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/templates/recruitment/candidate_interview_view.html b/templates/recruitment/candidate_interview_view.html index fb6a4fa..e291a73 100644 --- a/templates/recruitment/candidate_interview_view.html +++ b/templates/recruitment/candidate_interview_view.html @@ -328,8 +328,8 @@ {% with latest_meeting=candidate.get_latest_meeting %} - {% if latest_meeting and latest_meeting.join_url %} - join -- 2.39.5

DB^lze?>7sQoRq4_b9vGWNbQ zDu%n3v!xO>MqXp|C6du98!Btd!Q&il88wtD#FU@Q+H#9IW9`Fk+6_2HO}jCca=qy1?b>+#!#E};R_epbbL~cKe@gAg)W&z@;hth@ zZPdm==pPNSE`?uo`lT+?26i|R67T_&old3E(&^|9Luf$5Q) z(NF+^f~+pc%0;$-XA4BOm}iUcvZX*Z~U4r4I+v{SPg)g&wl=LwA5Z>Ztkk6s1E){zooDFoPOT%q~V~s&KyE3@u7??*4 zy3>_mvV%7mLuUm$kk7OELAefU8UkRF;@&CnJb>5IT_9T(l$Qd227omH%7d&Lc0DLB z0AL+}D^CQx0CdFCik_koAVuLrFFnkip#u)YSxT6Ba##*Sjy?d!0jSy+f<~ACU>1NQ z6o9=9?Zg}aD*#N=dEykQI7b=eSOww|Dz<63%iy%dA-gSuYmb9V5{DMB=LByg4*9Tm z3OpC}ST}ep$ZylItKeKh_iY;QWpLV9x(ao)0CIbR@)F43&e9~a02ET7h-Zs}@_Yd1 z09XOQLIH9MgYw+a3;<~2aEfcWTSa1KF`rrND;1a~$!p^1ZF`bO9XkbODS(R=IbO^B_|<0K?$`oWjsaKMBBT0C263N0R|>$wX_)<=NbzJhZga04$-mdo=7aI2X`wdNkZca9R>k zxif=nO@uv4L<;P6gEtJ?N$^f5BBwKhod$0KEju;dMQ}C}>7qgYeP??U0IQq=uxR@( zU$Y!m^@)HTfTsxncdL@mtn}C7wdv7IGoa2A)z9VMtP%?v_<{z1EB>l5Ce4BBLFK&~ z_6#`Zkh53Go(E?G&G+J09UN;C`bIB))svv2BvgStJ9vXhi0{qt4uLnBM5hCn23|We z9OWqhJOCV{8&bjJTQ5HXz!?D60Dw>Qeb4?n09ObQ`s6b6TC;CLU|PMB7gVc)7I2it zH}R|~C@+Ti%?hX<0Q~0TQ@Ss{9e{BFiYc(~B1{0#mP}Km(-)m=naEb6KlLfN_GFr& zCmB8J%jcZnjU*#ue?EH(JQupuuVdZdED*=L2+jqFT0_&qBOCgpxd=d83Qh~R$H1!% z+xY84gVdfvQ+5z7ba^WH>u4 zg430X9t~!2CsOIw_ot$~p$zW;c&AhGR`0S7dWsAI*03u#!ttL5;4A>WaQp*o$?o2_ zs(Ap;0WeJgQ-C$??p>hs05ql16f+bs2Uzni{<;DmC6+X}VnB39=CA`W7#?C@jv)YC zX;HE9d^~;cs{^`fQP;@p8t>{XA1Q>GVaW}Y2f_^EJm~FVMfVx#z5v}5G<`*Yt=Qdr kVlD#EM*hdzW!ouG8DJ}SB8Ug6owcDu|$fAcBSWe9yDV?nb=7`+51}FwdEpGpEg&GiCGXMcbw0 zwiX|Sgan!B-!1*)i%%6j*dj)3eYvgGA{Ogemgw3=n*&g3GUdPR7_`ik|Bf@%8RHnd z%(U4+H~yc$jcbNnrDnThXnwt8SpE)&$uYd-U#0Knzbi~cWrVkF{(FvV^WS%jq!D&9 zol!Z{wlpbaZI54 zPaSy#_c$gJ-0PS`aG&!Y?(?ZbT(3{Hwzhxf>>y3fEXU-TVzV#=cTBko!ToxTHGWL~ z=iGbhRT_N3HPfzA^KaDfAo)In+_=o7-)N0(c7Xd8EYn*BMn`a~={~IrjaEaxbj%>` z-HsxHUpYHC?{zq?GSYvTmh&n#U!z7}5*S%~$QkOG>1~mJ&@qc>9(EKHJmR>S;8DkH zg5Nkw2p%J2min~*mcGk;zQ3dIa-Z+->AS+``?zBcQ8__a&A_tR^M4>jrBAby^j+oi z{Ud!>`+T3G@3}tTr|Em1&-YLCJ>Td1XZl{?^L>WCYxtYTH|3ut4c_9@;GAP2@%f8k zC2|JY=nRW|TV17ou}}SZM=epg;8;TNSDF$_OD>lFmj9bDIc_D)CC6>cOttx!9n0wB zcdEX<W-Ix>k4-WORp-~J17TkA z!*nFftA3a)!o22(=|mWpAEq;5UiZUf6Xp%V_}IS-q2BasltWs0%Ma6)l=rqDrW;}2 z@xyc{%r-wv55jEs!}KIfJuqJX&n46jzec@?p?~>ddK2bdKg>0b_t-3b9L*i?mn75N z?@Q+EOL1c-YJ8-$G(7EyKo^RTft{N0k>9Ruz|*)g^_ujIPVeNixf0CcV0Q zj=nxSEZJ=>pK-IZsLI{ExU9;l%`JA$(+<&i8jP@S{ne(j#4*s;ljx3vo(6+9g%*mfJz^l@q6DwU5vr$Q?*r)a}oG zTnM+W^`0S5oAiJ8E|R~S>Uv)@&tm-@RJKsR*uaY@UNq?k2jt3&rn>NfE(r-f9=s3# zJv}5xw5Z!ZWLJQ&>5pG~OeECRj@)Jr{tmrbQJ!!)I#rcDDxyWWUO2Y3h|m{}?VMwy z3T+^oYy^nJ=LVD}1MCHe0d6`4*rLN7m0XF%aNx$iaZ^OG%6T5IXFPuBG zpt7i3b86l6X;bIT>}}u!fv@UPtX)Ij#Y?UeCcAXEa?UR-EpQZ8ISUGkE6b`&O0=F- z?QY(PCyK#U#ih=I;<5rDwSES<5GL1%?Jx9BzqQq8Oq*sMLJhRRb?;9bE@Iuy$~A{m zE10psZ7C|RE~|1|Zz?V!)9Q%@sWz6|5Lq8tkP?}No=pYUmlnJ`awwQ;Syf(DSW-|} zQBhJ{R9IG}4M+PC0M`PH1Q-P{5nwdH5mK2u=;rbn1(j8WRn?W+RQ-YJLu}(vM=CIB zw*Vu52!+ zh`M&ObA{0BW|U|F!E;c>LXlmLR6H!Q_3AktyRoc;U_jKlEkj3)8ZyDh)aPl|;?cSsEyoOt&#KNL%1>1H@ztVw;cgM5|54pqOw?oMW{Jn^hRuCa z$Q1!<%Ou%dt!^WO^yBwL*7cr0R;aTNiYR^h{7C(y1)(bS4-u})r->l_k@q82#Wc}e z?RrZ@>OU_CiCbi?iX;~J-$LtVk`MocX`xUle~1V*d$Ffm$>N4?*)^F_KAi%+o$996 zydbPop`?y_=)x}IvOZ{GuGpe4T9_SDM`*jyUZ($k2-4qLcp%Q*qS9GH5ureHmXKW> z+7zmDn}-d_)7LD@kkRu^hW8J~C3k$1f6%-X}PN$~rrn*sPlc}=5{`le@wMSx- zp0+(|d%ESLE%&y|eZ9;6n7(@hB9BBQ9f)YRFQVPXxcw1b4@C6Y7t!bSoA*bII1n*$ zU&O?{lcw*TIeTx!#QhN^OGf`Ep!r=LKM#mG7?*w^E^A+0*4|G2_Q&-<5I169+=#u` z=I@WY;XvHXeQ`4nHj7zRb;fLJJxlyzlC7=Btu3OL&bsa9GZvF2=DgKp3ECT!@OePu zmw_?*ziQ96+SQ`f@I=!GiD@G&<_`nJ2#cB%AfxrKmaGp7g@gci>W3aksN1;okQ5#D zJC|is9C~9}inv_&)v_Q#4)y)*=@hww@7NF%ORen|Z5>p(27owNc0X$_~MwnzWy-up$p-tWg4U0WV4KGW}6-agEi;!!mFTHm=m z*YZ6Tch?2ncc&nhmfzpa`Z4N0(Rbb7)^dW1NA+Lsf3pEu_dtf_Bq5L29eQB67_bCQ z3y3>=fWhf$ATEI2Q&g(NPBoeSX{)H<4!)^eD=nB&U0gyjN&AT!oT{7oU~`LDqR)Ax zbq4ocO$|2*4TRl66`IrGys5a%=@?1_fTFfU-}*=nIqmn44D4VB;u5#Ksn}WKD5zRc z;ne;BmXdRm_6xvyfD1y;QzPVQp+Bu+0*L+|{S9T0WcE4Wok6R58e0q2FRG4lXHe7t z(gD^0aO4ls`>tve$gG|c`m9y)c5vag84Pf=bq5(Ah+i}^^}GUL(zmSYZV8pN2-Tff z)lORL30oxfz4IdK+CP3$)(%3e%K(tcM-Ha(D{vP9&JiGWaC4Rb2(1UPm^a2AXyBPa zR-(<}tSr)sE3oQo9O2oKAh2B;iyIVcj|$Olgp?HkXN11`smPmo2-@3Rog+gklE=_7 zv*OiO7%Cdab6c?n6g!AN_Gpg+c_;#QJ?ZIgmMH4dvu?`M^UUPjbF|C)foHO985sT* zfLHbKwKv+KHEmNPr_Z4@1-Nb~U5^sHPJ2&(Y;9UnGPppO(chavn=qrolu4{2kGI@r?zIwols-+L#Z=>U8t86XnArzAJ?iIA)X+WSJo2?OHAj3 z^ukYe=+|v|Qe^5sZy6X945E<8?$K0NP#{f>cp<}*OXXd4RWH0QMV8+2tb~LoNNO z^XGNux<$e=h>92MZhvKDv*?~w)K(KqY*t$FupZX5)knP?`_MaK6Ig4(thFjy^N>AJ z+Jpe3U4|Tz4eD-5Da}ku+$ce*z~V^qv92PCy4y0hu%z0H(w*;IBWm?$-f1UK3jO1E zZVVRSK?0bi-hEs5q&6sD1Hk6@PDYm0rr*0Qr^6)ZaxwvTXldd6hExnwyV96z9L%a9 zS)hJ$TPNEi=%4_y^tA0Ysj(>j2lYI+L+I1q(r-%Y_1n|BLk@Q{L*`TByh+kL$ZZjYwf067v9Fe(U>PXky}H}R85vzVmM z-fQod421@3L!grN0AR!&IMZ2GQe0W3eFoie2%V2gucCRIcgdvh-_J90G9RNa0H^_QgW4@9Ed*Euuo$3LAAhiSQ3Z-%%^iRp zkJgr&+s$s9XG6gY)KawJ3Y+#nQ%9dtfF=5ggFR~hv7f;U8hZI#f=|S53NfrNBhW)b zHvm*arc!`k0C!X6{&kDL?qH#CxA~iH;u-zuHzUPtz2mX__1a_6ff=#H z(4uhttz)s`5#4q)O}}((f;pmUup025>?{{X=u5wi4_z4keA~@dYKg{?RYSQ_|LWW5 zmXXi5Yp4*W<*Rh@U7J{YmECA+GA#^h*h4&Sai2=e6;AGuRXrf zIuD8{(fgk0QtOrK|5m{m4Mre;6-)J@Kg_2@d;1T|#BKWElWhlTUy_Wp5VQAwO=aytP<@Di zJEX*OUSgz{o|dxEi|^``bOBA}eMa9=jLZ@g(KMWE?)d{z@KcCa=|x{g~1=%7`*+ z(1JN#260+U7&2kPh_Pb|Mhq?(Ib@1ab8;RmDQ4n(!x7u9xS;J&END=cTM9dvo7EbL%L=9v&vrwO$6 zYSt-n)!6et^$5`?b^zw6? zjie9rPeb&holyH>Krtvlv<_Sa3FxCkfXK4$rjOeKUDE@^-9o&nPFh4AkqpwY`J?ADK|+dYAqRGG z7=}+#Xp6Rn3fGOB?u%0QVyV`q0W&4~kDr-NAJ zszyFFpJ7zzU=c$q91$!!M9smV9Atd619fk(7##X3>R4y@p!5(@sx0eQR9+eA3J(!4 zNGpr;w%XNFOcL8vVyNg~Jw)~22D-+D3X8PHqT^+CLzpOR1JOuo4p2NPwi3b}TJWJ~>9dgo*$Ra~P!yD)Ewt3p$QI0HLnfSh3I?$K3Hqd(e!7eRK2* zQZL5SWH_V_#Ea3ryu_QK(n^3*cyAP9tIY!iW_>0~%v!LzF+t=co%$zUJ%Yn&li3x!yIXjW`-0=BV^`LXT(7Oa^gQAPc>p$dK>H zsL$Jp+sCudurpzK)*eM$Oj_+>lr8{p2G9<*OoWp=CcFggkmk7qDhjJ+8Oh#cwb?Ex zteC0pC-tLUw6$JgQcCocF{*QW5oZmg$~&96#q7LsibB*sPI$P`<^0?*iMEJ5bd0uhVtYn{T~=gp1>%>wim~znan?nv6cY6Nouh`aA!Eym`$E=0dd?xv?ZmzZ$Y(Iq9v&7b47M%b|rMx z+JgyX>16(OD0?Zb#V0Go6DmH=74eod>Xqs`ohx+9G-iWi4bw^nK^|XAL9q=0?4gCA zk#+}svzh(0N1T)ynG@JljRY7RP@h%RW@a$-f63fgXBOagZR0(E1slK&M zW1Ru?c9jhfnYL!ArNwELS~E(-MM1BZTcl6vm|og3-I13*yjS{Y(#pP3qMg;?L0uUo z5);`%2}H&nTwGRMRZNEue5RU;0o$nFwD0iu_sY?tyUlAB0nZOtyGDzzM5J0fMhs8q zxzD_^GQEMEmBG^8DplxM5uI~YCx=ZtKqX%R@Z4Z7*$iftKUQ>@x)hCgezip-4lUkj z7K;cHIImDED=wR9sJ~TH|ICDdYtb3f8@lblCH2i%F-ioePUFP2Hak!N4>Wfz8z<^o zgtOZ=C>v~$FxM7{c&nilRZ<|bL)xL+Wuoqm*PQB;T+uqdJy7s(dvjyST8qJXpOc`D z7KreeD`+3uXohNyuaUJ>6+B(USUqbftGmy15oGNMf>~l~&SASv^@O zdgooudb|w5a9TD-osI$55U_{+v*irsp*h954l^iC>V}UTHGPI?AKD$|9ssawWf(S1 zk?O@6!Wz^ISb$cp?K4D4unab~SJ((Bk9MtH^LSdtN_g`(3&bw|1A-kFzIM3hZd z!-Q+W@5)B6WQQ~sH}qPmPL+%HnYk!8x`v;P*u#6H9$uhbqXtw6dj>+C76L5@w`Ep& zwN|P1qc*gycoD7E0#K-5Q6VDIc(U~e=AZ4PKBy4c{e9LC(B~P%>PIBk*jiYe?IAuJ zT)(9ycMd(R>R{%}L{&dWq*%uiS7(D<$LENP0m0rR>pPP=Iak~&+NjcbA}!KbI2u`0 zuy!P0=*m@6KRPxdlviTj+fRTlE~o*oQFOUDPqem9B1Eap6*FHrWQu>5sZE3&lL$}% zGe}9dFAE)TlC$0A0M{ zA78#{<1qxloi^7^w}_4b;#KuL?autS0j_#(NJTSiBWb|QVfP-P4UJc60B?h&KqlQQ131i zxz-Az`k~DwZx=TRakIMd4$)~iYn)}Bf{wB12p6O62qy~~WMD^TbwYTrF3V8~@RiN= z#T_C;hBUerogfFPW_Ob;+^9rl-z~1sfZhFU%`7wXEK4N_vbWi-hF#UycZ*ExT*7~E zbG5if{3OMP>d)mOw;AZ>)kG(&r29yfdH0ES16dd*#B}-AjV0m{uBMsEQ0sIE&4-!Q zYTJFZHJ(qT|FF4E-zVlsn;A_we;K2SSBOmGTqFQk3xHKUyFv`KETTTGT|cf6PIDUW z>NZJtv!e1+Y?&*yV;Er{0ZQapnY62_dRSx%n_B&_NC@?^#x2{ZPaYP@U6&F`tsY(3 z52sV9A%|N7EVl(YJVoM>u;p7R?3O#IXGhoAmExc|kTY!>FY8f}6NF7)O~N2*tuL*P zOL+ohYB3C7FD{`H%}x)8guPv@e^m6hE<=kp>eQnmp)0HRHXxcPm7~*o5abZ$%e?CI zm}uSV80v0EPme#TBf)govFI@oWm!(>Nv>6oiBHYqE;aKhk#F;1OMU#57+QWWy7J;| zHbiGy*gw(w!{LK>dv~Lm!7!k{{G*XUi!3%u=AkD8aS`CPznC; z2`2Z0I6zIXYunSpY6;|LHx%wadREL9x2hiNL>D7pWz8gjP!qjf0GFIaHeGVnnsp+a zv&6sOQmEbQXvgAKr`L(NZp5RGvEMSL4>aq2k{Vts-*-5u<@@|;jI4)@XS5bj5hqMTKQ#U;imUW9sS zi|8m~)S)dR+gM|VgOMhR_Qt~{D(M;8m5zB_+5)ww(e#3v_5v-DYiYa_!LDU5h&?hN zilCP#II(m$pFk(-PEJ*u95vBPH_!bTovr^HwrqzE&Bl8UoW}4qAKmx!ID9xWOKo{s z+%=dr#>!$9ZGmZ6PtASSbe~>CR(lSO@b*!A9)Q=8Xxq~$1N;^2dVH(6AR{r)wWoki zLN{&@q1L@Bvifm0xCT|v5U{r}rVd+^=f(e^x-=WJWlUo%|EWPQ60Jnaf-2usN8S)g zuH~oy-cy zP;@y4cUi#uagv&bY_0aZAp$M0(g;0VU%esjk-6)rYy>hs;)5NuslZ|Rr3HZ!Ly-z2X+yiU%RF??D5{8crT71a;*qTkJ4-WH<| zPe9%cuqSzE;ngOf=gt+hwQa;Bsg<5X%q%k&slUmBMcmc3Cq3sA?RL>Q(ry~~UoBk2cZtbn+j{yia_kJXdACRn z{SXMY(kCd*QeW>D6Vg~i^Ffd`hBlcM=_Y zD`O(ERe2)%s?zhIvblO;kFeT&bgH)R5s@~g=bet>iWC(dTwTHU%l{_oA+A1@iHc7`eY?H4gwJpQ%N%0I?X9+LIw7fo5|7u1XUMMuj)8Z5(gbiddl z#3$;3FT{X&wnG6Crt>S#FWD8moic(wf&FXhJHVCrZ_&vtgc|cDC6bZg{XI4BOHrB$ zCELTBYK)oXEwA@HE>E>|i(Z+$V`7(k4c*Hcpy<`s4a#;{w4r;OPKQN&XSlgGo(86?FBaRo zX<@5<4>FNpj9dPP-(#s2hv`V+BvndO<)s403V;+n> z9gSIhD4!N}=ECDK=3^qmdYZ;r-qO|SnE2KlcnbVb787?|q}ez}{sIK@)rjL_3g1z255ajivo{(YeD!hWxabn)LkoSFM8k?d>V#-vJxA!xEnU-3h~;LH zp-%rut1>4wlT^ehF`?EwD36y99=zEd&v5T<#v2zeVlZjtP77tj6t9) zZu=YRxzQz*IGbu_GN})qk}YjN0|julO|(fn2G4MT zize$@Goqvg0q_M>8!^;1@RAs8$u$E9{~MzPptu$!VZJ=t%<^9HV~``dCK7-r7_T#f z)%L$cy2w)B{UyeW!K&vKF-5KmRr(cCk`PLi#%Pa#R0I_((Ys;y5WVti*-5SsT{&8& zh?te-a#Si0Luu6i(Pu-bY9Zv*xb4J{I}E4)bDaggYxyj-OvqtYb|stICuG|ptklLC zLGz$kqib`XF)S(H@NmA!9eisWhZKN?p{|#tEDIE;R8o)}8OusVpfK(s-PQrahKw0BMO&|K3zDf6 zd)EiasdBqe0XCUFkax3Tpv#=IP|QAao=jwXj*b+jvv+T8N4NEAHqq(Mu0q_HG#$e5 zZ1H_T$1=4?2M&@vc^U$hn+RC5sP5HJmnB%fY0X9O^vUcp;d^b+ISpVnhRHyQmEe_C zYpZ?>lcTLY(LO?r43{HAz5uCAYHUx?K2w>UWkM|*tpoZ`1|<&TJf&F=9BoIUf}`!# zWab&nnNmkk;jL&odT=7ad*HSBVO$l_Zi|u^)h|K@8F`hDE{wb7(g>Lx)QyP# z8cNQ6McJ}trt4o3a=E#)4MSl%(TgVDoj1u>y=_H-CY-AWJ%Q;f=! z*!_CiNNU?FaBAsLK;&N>C3p z0=U-YN|eLQwO+L#K^Q~(A@989lz}PkrMiDGm{&+v!CJ`2lKz1b&p(#xZ_|jy$mB6t zEM80lsS}wL|BQp#o?sZ@&Q`9CsWQ?!wlgr^sRc9B`5CL8otgdJd)|xO!foM|h&B-p zhep;mp5*2bp_(Y;2XF7IG`q~`mkruo2;@-)$Rzyz;AOX6d<{82v01jqP@=VN8 zJTX}rtQ($*S7FLa%XorZi?FnTl?K4nm#A}gnK~p1qw?H7gevwh?{o#94Zj@Vrxxrq z>@Um(vv|aFfKu9CCRzs*y=Pjv9&9h8ERk2yr`BJ+-AUT5oxoC#`mvL2L+N(Q&a$;I zf=~CW$;e@Y&(DSueRrsLi$kk2e%;nlE$%E+Gx=GyC%^hfexpgH+7Tn;JwF_*>aqvH}2<*AA=wRp;W_K=`5q4%}}Yi<}50%D5eEU8ws_I0${J?$$y7>sJomv zurUUZoq6xy!ua`~Cl*v{yk;4@Vf=2!v)R@-f0#nN)u?^_WxN{FL$(`R4>j=y<5uwH z%``bh;fTii@&*9!wC5z5Cy33M_S?+r?H)3wBS!MZCVrXho%5U`jfZ5+r?LACng|4d z)s;rO(SXn<3dmHWuaVu7&>~M8P0$@k4?-OU^!Ac1eE{4~QERS|H}qkKxj*yITI6Z! z4R4^}bKQGAKG}csRc;@dB57e9Fj2;b@{wFV)#ip#(Ei?}N+-%V*E4-&YjY^GjBT;8 zpiWVr^q0epqtP+oh6m@#<6W?sE9Qmg$aJ)0uJYCB0W!`rZd@?Gc6Dku(#R8B4-Ak4 zEq_AiLMpk|0N+>G-~6Qs;)r)C{l7c%E)B$J~Wi zVm71aXk^TA+0yEu-m}A8MZ@JYW}DY1GF9j(*}aw59W*v!Cw2WOnHpFF@yt>!86_je zG?C?hbp*B#2dXqO(k9RTa*Fz96a|-=#MNVAu2!Sv0_n%q%CWL%7`PfbhP||bt;1tw z+GGz~q;Suxu76bc)tL19s6T7kP3nemGQ(C(qrL(!eU7~})8!f`TbX^_2CGd?wz_Yw zOjN&4kP+lNwmjLfQCt1;#@}EF;gACdUDM)Wbjh znGbnbD1{+z!zV}YK-JSJ?QuN!SR!VDPm5TnCF&NZye102;57R48q3@0MFITdlo)s8 zqtt@xijwj|hjuHqz8L1ZSY++qqZaE zGQE~J1&dL&8r(t&_9!FtF#DV}FF^fTs&6>TrB}99_L=H?;T_z-my!Ixy5YR=|>cIdnh~onurc zmlT)HPNp*|oE1O6NT%2t!{y+xjq-{|r|&+F;kzWwN`uwliUd)`WO;BIcbVRDWudN5*Ee{MS@|3?18gfAqx@;%YlnCe0CJ$bTj0`6V=2ui;qt>PfDe zbeHUBQN(7d>#@7!2CJ2yj^D3_Js>yPu;P!&8@ee_o34I;K-SRv=D92AK&Y=;wSwk` zP_M6$8Dh9Pyh29P(d)$(vfpIhQ6*#G1b2wDlx{)`D)Dzpik#YGM9zp3HLz(tHPZMg zI}7B^SlKi9xRx`Lcr=bw_dh7F9n3GsSeyLY8+JACCWO}{98=RakrxvV4?HY;5zF?Z zihoG96Vug@hvWdu^Tg9|*S!zPwE=$j&ACb@Cd4DKaK?^Jx^W5Sy>zZpvdat>g46D$ zV3UQYM~Rm>&b_aeaf8!_AaIOEaR*k?^DLYeHp#CW4tC;K$q?(y#B6OK^fqe2-i1H$+tXL#C1R?5i?vz$?(=S(mt4paX{gF;#a9r!#yz@fO-8N6p&_P zN}Q|mrENrvVF6kw`D$uAQEm}QG4xFp`kYL1J^GAnC2hIPXQVHE3H?rcOKkPxbtM5{?wqQjuE9%M{;y!ha zOEh;aT`z;A=%ki!Bo}x^)oqk_T6a+EnvN=Eoouac*d&uWu}Ut3&-bZH+X=7>-~)gr z!Ixh0?^#Sg4%@y-hJ>;h-cFu${>&!Yv42Q?d%JAU$raMdLA;Y%^Sq3o3I)~JQj=#D zRwmD&X9>v~-|IaAHF%c`C~PR_4ID8W-d%Yuc(rwbek8O-+R60>ZIRt9pAw0Qu0>nq z@_^c_oR7GzbSqDraks6EpTQQE6jv?aLlfiISYLpl;{+(v5?*dl59H7K`H4{nvcn&TJkG;K}`_4!sgxR!%qw8j?Liyj==iMESI4Dh5s!p~X$OH4= zl;JVi@Bh18IAHS8RU37pPNvyYS1<~o-g6?Xxx zctWsn=fRyJp^AN7ju*#`BibdeQ?mXgjk7k=weEGf$`bb|23?KjtZMG_JwB(a>$l0N zwNIj+UB6u>i1n&^yR@hCc>FsN?@-5>EWinXA57}q?J}Fzp9}P# z+#I0pOO#1!SiOw4o* zv{O!s=c}(hAR7(7FO$V7MsI}SSE$*$G0zr=_%hX2A}!}rWCBZ!ljKus^UOymj4q>;0$5H%QsX85$C6u#0aZrvnp1@oOracq!5@B2aMMKaFvO&X# z44yb@$YA3KRlF_DR)t^6w62^s^3Sx^qA%#XThQOKpuhP=hfq%XA@@w<)a)fxCqQ;S z2#ittzLfDn%`9|i4q;cT#8{Ewig3$q=B|xTacjbjzj>GJA!Y0?eum1M{90{=qTeXm zZ9k&wEPz$@Iwa$wcy99M&?mzYYVjK)I>R>!;Ropca%j*~LlP21jA{Veqg)>xk}n0& z?cRc8vdiSg-!&O}V<&hJ3_JwDk0ZY(I+V=)Q2s)#J6 z+IGV*x%fG94N41@^Ed_ngX;C;@@sk7>{2JBCBPbsx{2zUQ?g&&MKIa|hy;KXfC7LS zkDQiiacL;>UzS^jk`C}Fz~id#Y1*dmMmZF~4R9FXdw>%FCjou}2!#%#08#+($AGkU z0Nns`0kDW`g8&Kv@b^fxVt{IZ&#WX#jSBUI1eWxT7357naQ|&%z%r%yP~za`GRHs?^4z z#Uy~*@qkV=jw~!GDXgxVl~q{8$8TBqWpt%>6B^6}C27R58NxUcaZ z1y`KfTmU>i*A@ZX0k9l^-x;q!=?OFB$2(QyQRj;&y$XOwhZ-L0X?P&VZ_~7Yql9Nz z+SdSh)1=`+k#VbrgAIPhq6xU^GjI!BaA~;P*17@Unw4)6`DRYTbyBT{3mU$C(DG5b z5dbI8+DrhPtZF!{)G7dQ7N+5tNW-BDABkuPZNNCiKhmGa(tn;qb<(JgrHu8AXhY1E_HP~Blikf t6QH8c$s?8?!g_A5>yLBtbJ6@}^LQy1iE|~cFVD+&ggEC?zseq#{|91l2{Qly delta 24639 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 diff --git a/recruitment/forms.py b/recruitment/forms.py index 90f5aaa..677bdcb 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -1962,7 +1962,7 @@ Hi Team, # } #during bulk schedule -class OnsiteMeetingForm(forms.ModelForm): +class OnsiteLocationForm(forms.ModelForm): class Meta: model = OnsiteLocationDetails # Include 'room_number' and update the field list diff --git a/recruitment/models.py b/recruitment/models.py index 84210f0..f00cb80 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -1241,7 +1241,7 @@ class ScheduledInterview(Base): # Links to the specific, individual location/meeting details for THIS interview interview_location = models.OneToOneField( InterviewLocation, - on_delete=models.SET_NULL, + on_delete=models.CASCADE, related_name="scheduled_interview", null=True, blank=True, diff --git a/recruitment/urls.py b/recruitment/urls.py index 7e9fbf5..0e57def 100644 --- a/recruitment/urls.py +++ b/recruitment/urls.py @@ -108,27 +108,8 @@ urlpatterns = [ name="training_delete", ), # Meeting URLs - path("meetings/", views.ZoomMeetingListView.as_view(), name="list_meetings"), - path( - "meetings/create-meeting/", - views.ZoomMeetingCreateView.as_view(), - name="create_meeting", - ), - path( - "meetings/meeting-details//", - views.ZoomMeetingDetailsView.as_view(), - name="meeting_details", - ), - path( - "meetings/update-meeting//", - views.ZoomMeetingUpdateView.as_view(), - name="update_meeting", - ), - path( - "meetings/delete-meeting//", - views.ZoomMeetingDeleteView, - name="delete_meeting", - ), + # path("meetings/", views.ZoomMeetingListView.as_view(), name="list_meetings"), + # JobPosting functional views URLs (keeping for compatibility) path("api/create/", views.create_job, name="create_job_api"), path("api//edit/", views.edit_job, name="edit_job_api"), @@ -596,6 +577,26 @@ urlpatterns = [ name="confirm_schedule_interviews_view", ), + path( + "meetings/create-meeting/", + views.ZoomMeetingCreateView.as_view(), + name="create_meeting", + ), + # path( + # "meetings/meeting-details//", + # views.ZoomMeetingDetailsView.as_view(), + # name="meeting_details", + # ), + path( + "meetings/update-meeting//", + views.ZoomMeetingUpdateView.as_view(), + name="update_meeting", + ), + path( + "meetings/delete-meeting//", + views.ZoomMeetingDeleteView, + name="delete_meeting", + ), # Candidate Meeting Scheduling/Rescheduling URLs path( "jobs//candidates//schedule-meeting/", diff --git a/recruitment/views.py b/recruitment/views.py index 63289b0..8201e30 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -75,7 +75,7 @@ from .forms import ( PortalLoginForm, MessageForm, PersonForm, - OnsiteMeetingForm, + OnsiteLocationForm, OnsiteReshuduleForm, OnsiteScheduleForm, InterviewEmailForm @@ -250,56 +250,56 @@ class ZoomMeetingCreateView(StaffRequiredMixin, CreateView): return redirect(reverse("create_meeting", kwargs={"slug": instance.slug})) -class ZoomMeetingListView(StaffRequiredMixin, ListView): - model = ZoomMeetingDetails - template_name = "meetings/list_meetings.html" - context_object_name = "meetings" - paginate_by = 10 +# class ZoomMeetingListView(StaffRequiredMixin, ListView): +# model = ZoomMeetingDetails +# template_name = "meetings/list_meetings.html" +# context_object_name = "meetings" +# paginate_by = 10 - def get_queryset(self): - queryset = super().get_queryset().order_by("-start_time") +# def get_queryset(self): +# queryset = super().get_queryset().order_by("-start_time") - # Prefetch related interview data efficiently +# # Prefetch related interview data efficiently - queryset = queryset.prefetch_related( - Prefetch( - "interview", # related_name from ZoomMeeting to ScheduledInterview - queryset=ScheduledInterview.objects.select_related("application", "job"), - to_attr="interview_details", # Changed to not start with underscore - ) - ) +# queryset = queryset.prefetch_related( +# Prefetch( +# "interview", # related_name from ZoomMeeting to ScheduledInterview +# queryset=ScheduledInterview.objects.select_related("application", "job"), +# to_attr="interview_details", # Changed to not start with underscore +# ) +# ) - # Handle search by topic or meeting_id - search_query = self.request.GET.get( - "q", "" - ) # Renamed from 'search' to 'q' for consistency - if search_query: - queryset = queryset.filter( - Q(topic__icontains=search_query) | Q(meeting_id__icontains=search_query) - ) +# # Handle search by topic or meeting_id +# search_query = self.request.GET.get( +# "q", "" +# ) # Renamed from 'search' to 'q' for consistency +# if search_query: +# queryset = queryset.filter( +# Q(topic__icontains=search_query) | Q(meeting_id__icontains=search_query) +# ) - # Handle filter by status - status_filter = self.request.GET.get("status", "") - if status_filter: - queryset = queryset.filter(status=status_filter) +# # Handle filter by status +# status_filter = self.request.GET.get("status", "") +# if status_filter: +# queryset = queryset.filter(status=status_filter) - # Handle search by candidate name - candidate_name = self.request.GET.get("candidate_name", "") - if candidate_name: - # Filter based on the name of the candidate associated with the meeting's interview - queryset = queryset.filter( - Q(interview__application__first_name__icontains=candidate_name) - | Q(interview__application__last_name__icontains=candidate_name) - ) +# # Handle search by candidate name +# candidate_name = self.request.GET.get("candidate_name", "") +# if candidate_name: +# # Filter based on the name of the candidate associated with the meeting's interview +# queryset = queryset.filter( +# Q(interview__application__first_name__icontains=candidate_name) +# | Q(interview__application__last_name__icontains=candidate_name) +# ) - return queryset +# return queryset - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - context["search_query"] = self.request.GET.get("q", "") - context["status_filter"] = self.request.GET.get("status", "") - context["candidate_name_filter"] = self.request.GET.get("candidate_name", "") - return context +# def get_context_data(self, **kwargs): +# context = super().get_context_data(**kwargs) +# context["search_query"] = self.request.GET.get("q", "") +# context["status_filter"] = self.request.GET.get("status", "") +# context["candidate_name_filter"] = self.request.GET.get("candidate_name", "") +# return context @@ -857,13 +857,15 @@ def kaauh_career(request): if selected_department and selected_department in department_type_keys: active_jobs = active_jobs.filter(department=selected_department) selected_workplace_type = request.GET.get("workplace_type", "") - print(selected_workplace_type) + selected_job_type = request.GET.get("employment_type", "") - job_type_keys = active_jobs.values_list("job_type", flat=True).distinct() - workplace_type_keys = active_jobs.values_list( + job_type_keys = active_jobs.order_by("job_type").distinct("job_type").values_list("job_type", flat=True) + print(job_type_keys) + workplace_type_keys = active_jobs.order_by("workplace_type").distinct("workplace_type").values_list( "workplace_type", flat=True ).distinct() + print(workplace_type_keys) if selected_job_type and selected_job_type in job_type_keys: active_jobs = active_jobs.filter(job_type=selected_job_type) if selected_workplace_type and selected_workplace_type in workplace_type_keys: @@ -1613,7 +1615,7 @@ def _handle_preview_submission(request, slug, job): "interview_duration": interview_duration, "buffer_time": buffer_time, "schedule_interview_type":schedule_interview_type, - "form":OnsiteMeetingForm() + "form":OnsiteLocationForm() }, ) else: @@ -1625,174 +1627,6 @@ def _handle_preview_submission(request, slug, job): ) -# def _handle_confirm_schedule(request, slug, job): -# """ -# Handles the final POST request (Confirm Schedule). -# Creates the main schedule record and queues individual interviews asynchronously. -# """ - -# SESSION_DATA_KEY = "interview_schedule_data" -# SESSION_ID_KEY = f"schedule_candidate_ids_{slug}" - -# # 1. Get schedule data from session -# schedule_data = request.session.get(SESSION_DATA_KEY) - -# if not schedule_data: -# messages.error(request, "Session expired. Please try again.") -# return redirect("schedule_interviews", slug=slug) - -# # 2. Create the Interview Schedule (Parent Record) -# # NOTE: You MUST convert the time strings back to Python time objects here. -# try: -# schedule = InterviewSchedule.objects.create( -# job=job, -# created_by=request.user, -# start_date=datetime.fromisoformat(schedule_data["start_date"]).date(), -# end_date=datetime.fromisoformat(schedule_data["end_date"]).date(), -# working_days=schedule_data["working_days"], -# start_time=time.fromisoformat(schedule_data["start_time"]), -# end_time=time.fromisoformat(schedule_data["end_time"]), -# interview_duration=schedule_data["interview_duration"], -# buffer_time=schedule_data["buffer_time"], -# # Use the simple break times saved in the session -# # If the value is None (because required=False in form), handle it gracefully -# break_start_time=schedule_data.get("break_start_time"), -# break_end_time=schedule_data.get("break_end_time"), -# schedule_interview_type=schedule_data.get("schedule_interview_type") -# ) -# except Exception as e: -# # Handle database creation error -# messages.error(request, f"Error creating schedule: {e}") -# if SESSION_ID_KEY in request.session: -# del request.session[SESSION_ID_KEY] -# return redirect("schedule_interviews", slug=slug) - -# # 3. Setup candidates and get slots -# candidates = Application.objects.filter(id__in=schedule_data["candidate_ids"]) -# print(candidates) -# schedule.applications.set(candidates) -# available_slots = get_available_time_slots( -# schedule -# ) # This should still be synchronous and fast - -# # 4. Queue scheduled interviews asynchronously (FAST RESPONSE) -# if schedule_data.get("schedule_interview_type")=='Remote': -# print('....remote..') -# queued_count = 0 -# for i, candidate in enumerate(candidates): -# if i < len(available_slots): -# slot = available_slots[i] - -# # Dispatch the individual creation task to the background queue -# async_task( -# "recruitment.tasks.create_interview_and_meeting", -# candidate.pk, -# job.pk, -# schedule.pk, -# slot["date"], -# slot["time"], -# schedule.interview_duration, -# ) -# queued_count += 1 - -# messages.success( -# request, -# f"Schedule successfully created. Queued {queued_count} interviews to be booked asynchronously. Check back in a moment!", -# ) - -# # Clear both session data keys upon successful completion -# if SESSION_DATA_KEY in request.session: -# del request.session[SESSION_DATA_KEY] -# if SESSION_ID_KEY in request.session: -# del request.session[SESSION_ID_KEY] - -# return redirect("job_detail", slug=slug) - -# elif schedule_data.get("schedule_interview_type") == 'Onsite': -# # The form submission for Onsite details should happen here. -# # This block assumes the OnsiteMeetingForm is being submitted NOW. - -# # NOTE: start_time and duration must be passed through the form -# # for OnsiteLocationDetails creation. - -# if request.method == 'POST': - -# if available_slots: -# first_slot = available_slots[0] -# # Combine the first slot's date and the schedule's start time -# location_start_dt = datetime.combine(first_slot['date'], schedule.start_time) -# else: -# # Fallback if no slots (should not happen if candidates > 0) -# location_start_dt = datetime.now() - -# # Create a form using the submitted POST data -# form = OnsiteMeetingForm(request.POST) - -# if form.is_valid(): -# # 1. Extract location-specific data from the form -# topic = form.cleaned_data['topic'] -# physical_address = form.cleaned_data['physical_address'] -# room_number = form.cleaned_data['room_number'] - -# # 2. Create the OnsiteLocationDetails instance (The Location Template) -# # The duration comes from the parent InterviewSchedule -# try: -# onsite_location = OnsiteLocationDetails.create( -# start_time=location_start_dt, # Uses datetime derived from first slot date -# duration=schedule.interview_duration, # Uses duration from parent schedule -# physical_address=physical_address, -# room_number=room_number, -# ) -# onsite_location.save() - -# # 3. Create the ScheduledInterview entries, linking the location -# for i, candidate in enumerate(candidates): -# if i < len(available_slots): -# slot = available_slots[i] - -# # Combine date and time from the slot for the ScheduledInterview creation - -# ScheduledInterview.objects.create( -# application=candidate, -# job=job, -# schedule=schedule, -# interview_date=slot['date'], -# interview_time=slot['time'], - -# # CRITICAL: Link the location object -# interview_location=onsite_location, -# # Assuming 'topic' is stored on the ScheduledInterview model -# # topic=topic -# ) - -# messages.success( -# request, -# f"Onsite schedule Interview Create succesfully" -# ) - -# # Clear session data keys upon successful completion -# if SESSION_DATA_KEY in request.session: del request.session[SESSION_DATA_KEY] -# if SESSION_ID_KEY in request.session: del request.session[SESSION_ID_KEY] - -# # Redirect to a confirmation or job details page -# return redirect('job_detail', slug=job.slug) - -# except Exception as e: -# # Handle database creation error -# messages.error(request, f"Error creating onsite location/interviews: {e}") -# # Keep the form data for re-submission if possible, or redirect -# return render(request, 'interviews/onsite_location_form.html', {'form': form, 'schedule': schedule}) - -# else: -# # Form is invalid, re-render with errors -# return render(request, 'interviews/onsite_location_form.html', {'form': form, 'schedule': schedule,'job':job}) - -# else: -# # For a GET request (First time after InterviewSchedule is created) -# # Render the form to collect location details -# form = OnsiteMeetingForm() -# print(f"job:{job}") -# return render(request,'interviews/onsite_location_form.html',{'form': form, 'schedule': schedule,'job':job}) def _handle_confirm_schedule(request, slug, job): """ @@ -1871,7 +1705,7 @@ def _handle_confirm_schedule(request, slug, job): print("inside...") if request.method == 'POST': - form = OnsiteMeetingForm(request.POST) + form = OnsiteLocationForm(request.POST) if form.is_valid(): @@ -1882,6 +1716,8 @@ def _handle_confirm_schedule(request, slug, job): # Extract common location data from the form physical_address = form.cleaned_data['physical_address'] room_number = form.cleaned_data['room_number'] + topic=form.cleaned_data['topic'] + try: # 1. Iterate over candidates and create a NEW Location object for EACH @@ -1898,7 +1734,8 @@ def _handle_confirm_schedule(request, slug, job): duration=schedule.interview_duration, physical_address=physical_address, room_number=room_number, - location_type="Onsite" + location_type="Onsite", + topic=topic ) @@ -1935,7 +1772,7 @@ def _handle_confirm_schedule(request, slug, job): else: # For a GET request - form = OnsiteMeetingForm() + form = OnsiteLocationForm() return render(request, 'interviews/onsite_location_form.html', {'form': form, 'schedule': schedule, 'job': job}) @@ -3495,7 +3332,7 @@ def agency_detail(request, slug): candidates = Application.objects.filter(hiring_agency=agency).order_by( "-created_at" ) - + # Statistics total_candidates = candidates.count() active_candidates = candidates.filter( @@ -6085,18 +5922,4 @@ def schedule_onsite_meeting_for_candidate(request, slug, candidate_pk): } return render(request, "meetings/schedule_onsite_meeting_form.html", context) -# def meeting_list_view(request): -# queryset = ScheduledInterview.filter(interview_location__isnull=False).select_related( -# 'interview_location', -# 'job', -# 'application__person', -# 'application', -# ).prefetch_related( -# 'interview_location__zoommeetingdetails', -# 'interview_location__onsitelocationdetails', -# ) -# print(queryset) -# return render(request,) -# ========================================================================= -# 2. Simple Meeting Creation Views (Placeholders) -# ========================================================================= + diff --git a/templates/applicant/career.html b/templates/applicant/career.html index c18ab7f..7d103f8 100644 --- a/templates/applicant/career.html +++ b/templates/applicant/career.html @@ -143,12 +143,12 @@ {% trans "Type" %}: {# Map the key back to its human-readable translation #} - {% if selected_job_type == 'FULL_TIME' %}{% trans "Full-time" %} - {% elif selected_job_type == 'PART_TIME' %}{% trans "Part-time" %} - {% elif selected_job_type == 'CONTRACT' %}{% trans "Contract" %} - {% elif selected_job_type == 'INTERNSHIP' %}{% trans "Internship" %} - {% elif selected_job_type == 'FACULTY' %}{% trans "Faculty" %} - {% elif selected_job_type == 'TEMPORARY' %}{% trans "Temporary" %} + {% if selected_job_type == 'Full-time' %}{% trans "Full-time" %} + {% elif selected_job_type == 'Part-time' %}{% trans "Part-time" %} + {% elif selected_job_type == 'Contract' %}{% trans "Contract" %} + {% elif selected_job_type == 'Internship' %}{% trans "Internship" %} + {% elif selected_job_type == 'Faculty' %}{% trans "Faculty" %} + {% elif selected_job_type == 'Temporary' %}{% trans "Temporary" %} {% endif %} {# Link to clear this specific filter: use current URL but remove `employment_type` parameter #} @@ -159,15 +159,15 @@ {% endif %} - {# --- Active Workplace Type Filter Chip --- #} + {# --- Active Workplace Type Filter Chip --- #} {% if selected_workplace_type %} {% trans "Workplace" %}: {# Map the key back to its human-readable translation #} - {% if selected_workplace_type == 'ON_SITE' %}{% trans "On-site" %} - {% elif selected_workplace_type == 'REMOTE' %}{% trans "Remote" %} - {% elif selected_workplace_type == 'HYBRID' %}{% trans "Hybrid" %} + {% if selected_workplace_type == 'On-site' %}{% trans "On-site" %} + {% elif selected_workplace_type == 'Remote' %}{% trans "Remote" %} + {% elif selected_workplace_type == 'Hybrid' %}{% trans "Hybrid" %} {% endif %} {# Link to clear this specific filter: use current URL but remove `workplace_type` parameter #} diff --git a/templates/recruitment/agency_detail.html b/templates/recruitment/agency_detail.html index 83d5f3d..94882fa 100644 --- a/templates/recruitment/agency_detail.html +++ b/templates/recruitment/agency_detail.html @@ -175,6 +175,38 @@ color: #6c757d; } + /* Job List - Consistent with Candidate List */ + .job-item { + background-color: white; + border: 1px solid var(--kaauh-border); + border-radius: 0.5rem; + padding: 1rem; + margin-bottom: 0.75rem; + transition: all 0.2s ease; + } + .job-item:hover { + background-color: #f8f9fa; + border-color: var(--kaauh-teal); + } + .job-title { + font-weight: 600; + color: var(--kaauh-primary-text); + margin-bottom: 0.25rem; + } + .job-details { + font-size: 0.875rem; + color: #6c757d; + } + .job-status-badge { + font-size: 0.75rem; + padding: 0.25rem 0.6rem; + border-radius: 0.3rem; + font-weight: 600; + display: inline-block; + background-color: #e9ecef; + color: #495057; + } + /* Stage Badge */ .stage-badge { font-size: 0.75rem; @@ -200,7 +232,7 @@ } .empty-state i { - font-size: 3rem; + font-size: 1.5rem; margin-bottom: 1rem; opacity: 0.5; } @@ -235,12 +267,57 @@ .password-value:hover { background-color: #f8f9fa; } + + /* --- TAB OVERRIDES FOR TEAL THEME CONSISTENCY AND VISIBILITY --- */ + + /* Ensure card-header-tabs sit correctly, use kaauh-border */ + .card-header-tabs { + border-bottom: 1px solid var(--kaauh-border); /* Consistent thin bottom border for the entire row */ + } + + /* Default tab link styling */ + .nav-tabs .nav-link { + color: var(--kaauh-primary-text); /* Default text color */ + border: 1px solid var(--kaauh-border); /* Add border to all sides */ + border-bottom: none; /* Remove tab's own bottom border */ + border-radius: 0.5rem 0.5rem 0 0; /* Slightly smaller radius for tabs */ + margin-right: 0.25rem; + padding: 0.75rem 1.25rem; + transition: all 0.2s ease-in-out; + background-color: #f8f9fa; /* Visible light background for inactive tabs */ + } + + /* Tab link hover state */ + .nav-tabs .nav-link:hover:not(.active) { + color: var(--kaauh-teal); + background-color: #e9ecef; /* Slightly darker on hover */ + border-color: var(--kaauh-teal); /* Use teal border on hover */ + border-bottom: none; /* Keep the bottom flat */ + } + + /* Active tab link styling */ + .nav-tabs .nav-link.active { + color: var(--kaauh-teal-dark); + background-color: white; /* White background for active */ + border-color: var(--kaauh-border); /* Use border color for all three sides */ + border-bottom: 2px solid white; /* Override the tab strip border with white to lift the tab */ + margin-bottom: -1px; /* Overlap slightly with the card border for a cleaner look */ + font-weight: 600; + } + + /* Tab pane styling for border consistency */ + .tab-content .tab-pane { + border: 1px solid var(--kaauh-border); /* Consistent border for the content */ + border-top: none; /* The nav tabs handle the top border */ + border-radius: 0 0 0.75rem 0.75rem; + background-color: white; + } + {% endblock %} {% block content %}