From e0b88f8b22da3a2fdd0a210cdb862f15ba17da7e Mon Sep 17 00:00:00 2001 From: Faheed Date: Thu, 9 Oct 2025 16:59:09 +0300 Subject: [PATCH] modal for job status update --- db.sqlite3 | Bin 761856 -> 761856 bytes recruitment/__pycache__/forms.cpython-312.pyc | Bin 21056 -> 21457 bytes recruitment/__pycache__/urls.cpython-312.pyc | Bin 6767 -> 6754 bytes recruitment/__pycache__/views.cpython-312.pyc | Bin 32433 -> 33407 bytes .../views_frontend.cpython-312.pyc | Bin 19177 -> 18864 bytes recruitment/forms.py | 10 ++- recruitment/urls.py | 3 +- recruitment/views.py | 32 ++++++- recruitment/views_frontend.py | 14 +-- templates/forms/form_wizard.html | 4 +- templates/jobs/application_success.html | 12 +-- templates/jobs/job_detail.html | 80 +++++++++++++----- templates/jobs/job_detail_candidate.html | 4 +- templates/jobs/partials/job_status_form.html | 0 14 files changed, 120 insertions(+), 39 deletions(-) create mode 100644 templates/jobs/partials/job_status_form.html diff --git a/db.sqlite3 b/db.sqlite3 index feeaaa27f46162ece01545369ffeb01f7e9a9579..f69db19633eafb190e79f455029aa4c7acdbb3f7 100644 GIT binary patch delta 201 zcmV;)05<=Cz%GEmE|41mh>;va0f>QMg3;1BGA&g+z*#Q)(OA2>D&tN0hf?r3o*Cp@(S$?FF7DFGdeRiIx#XX zHZe6fG&EskZE0>qQb9&kb687EVQy4;Q(<*vX&^yzVPa`vr!hbZaJJA21R%FHKnna1 zmS6@21qIRo1=6!YAjky_v?B*16Ad3587t*om+asQ8K?XO3ksJY<_ZM_0001{rVtB| D!udnr delta 185 zcmV;q07n0Sz%GEmE|41mhLIdY0fvEKg3;1BGA&gKnfcHt+xSS3jc4n5MT<~AGXj61R$3o0}8~q>D&tN0hf?r3o*Afun8sz zw+dSd#{`$RUkVQ;I5A;lZE0?ESW8S{Zd7?wVRd9_AVG3rVrgLw000011=j!t*Rw$& n%>@p$9tR>54IdjBE9G4c4VPik3KysM1q%uU00026rVtB|@9R7S diff --git a/recruitment/__pycache__/forms.cpython-312.pyc b/recruitment/__pycache__/forms.cpython-312.pyc index 3921c265924bba91a46c69d844d6dc8badcaa13d..676af2be137b65a61a8817c5bbc328ea835d66d6 100644 GIT binary patch delta 387 zcmX@Ggz@5XM!wU$yj%=G(7OD2hL!h3J_*J<8`U>6axpQuGo(ngFr-LMp1>&2s$40h zDZTj~W2N8Ziz;Hw3JeUBUogqnS2Am|+!FT6PYNzcEGaDxEl5c$Np;IF%1s8D2?LB! z#%D1gV>&}BLlk2QLljdga}-MoV>)9LYbBE=^DhZ3#_0K`mLwJ}2Ws=vWGm7J(nUHT zLKj2`F-&gI<(*vQB~s4?wBi~N7YhR=S{QEdNp!G&U}NAF{lLs5z}3lCWDe3`2_*b9 zS69bTdC|ma;iEK#q}# wgK=_2pbVD?P#B09idRpb7dS)u3xhGE(U&YnHb$-)s`K?{>VIVbGQlPQ01S6lt^fc4 delta 79 zcmcb(obkXCM!wU$yj%=G@H6^Z#(J-bd=iYCHmYxCWT}+Ul-$h0RO!d;r>VU8YM>(H gf6491K`Mdm;O0N245EC2ui diff --git a/recruitment/__pycache__/urls.cpython-312.pyc b/recruitment/__pycache__/urls.cpython-312.pyc index 68d94c0c109627b39f27f77333b04b6dfe47750f..f89276b91bb555853b864ac0e197b3ec9ba5bbfa 100644 GIT binary patch delta 1076 zcmZ|POH30%90qV(rdmJ{vE5QiyF6O5JlgWu)sR~IvQ(t32vib4PyrtiQ4lmyp)v7* zH_2RjtS6gzS>r*DJ(_r#31dbt9=v#TxNG8ehIlZs$tLsd@0;zv)22Vw?`qwry1JSp z=4nF_kez-AVt;v}yi+Mf#0(TvfTeqCBeg*cOmRH-<95xHp)Ns#^-n)EC0OkTFLKY}I~L?Q1hbOQ8rI>i*o z23&AE^P3_(63w=vMmwUoBZ|)RgLo|TiBP2!pxtrY9WQTHp7T`TGl5~lN&AzyKl#y1 zz%<(uxGgYNcGAQ=PRyfa^Puu9FEnZO@~?@HuVRmiBI5*HW+^NGEu4o9&5}JW!Y~Xq gOFbD8E?D`#0V7RS9jiLZ@k1Hm`n-01()=g*1C_&8D*ylh delta 1093 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 delta 6408 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 OZ=aEW_wn!ZJ@G$_xAa&5 diff --git a/recruitment/__pycache__/views_frontend.cpython-312.pyc b/recruitment/__pycache__/views_frontend.cpython-312.pyc index 6d78c620d625688338cce9d3cc9630d9b8faff0c..1b05fc2c5d67f80a35da76e105456569195b8592 100644 GIT binary patch delta 4309 zcmbVPeQZ!?j6B zv|>={#w1p$9H8n{wVhP0P}G&m|7@xzbyY=$HpY-P6+LOIm^MxQqf@0#>ZEGg&bcqK zN#vAmNc?i%IrpA(?z!jw?)7I^*iB&GUwOSQ3IE-F@2^LXzvK-S4p}7WWl50~rb#-J znQoCSx>dF^(pfZ{UL{uv*{a!fhwMPvrc`Owx>I%vy&xZkOtMHjBxTuoNvTuo)y5k(TC*g{D}=rt z^$n=^tHHvJsyS1;F!|9G5T;Pck`R_gv;>7ET(WcsO9(CD1!0mx--P<+1^P~*Z$W)T zcnaPq%!gkoOi?t&gsB{Um9Vs;rA=7M;a96ZC4OGIVXi=uyOibUCAnK!fw)G@YR6fL z1u3i*`VQ15$y-JZmR8dvOr2<2xhREo!m29A{ZLhF*9pK?=dJY3a#{>r&FrlhEx946h=~YJx5TYVzwg-h+P(`|;^CpU4@G z@$6(?J)P(4QJbTdh{a-O`34mDCWP7Mk?a^0{2`Wtx14*}M)=a%$(+#U8n$PY>1LRHy9`www!iqVt3NV9}$y$ev@Dq zff<~n-2{6O3?F$KJ;k+AQ98aTtGzUkfad1bBAl1*L&DPtZ+U}el6yq~{^*@%JK=yY zdg$9YXm`^6h}0_N!uR3K#R=>u9lAY$3p8^J~S@wY0&*E8HZQ=2cD*uy6&l1{v+g8bfYN$Hu~I7VD>yo zI|zmmau4ZBx?!Gg{a ziB9LJc%}Je_AE6rmkFpr=bFNBV*`w4CNud=TH~U97q)bAjszX^V`y@vdd$GZ$a3~$ zcrUV>ZM+n{cf1rYSzXDoQJtC0<&m=rg+}@{ZqG7l%)ub&){HAu`0Ln6j=yzcBh($R zC;k|lh70i(UrVaxB>r1ceV(Ec{0yp=uQ8)OPjm_&uDHsg@KpQSgT$0Z?UOu>-84C| z3)zuV-_h|itZ7XX$Bz@yB`qdZeGlavzA=&c1o0W({M_tOEtAXhAE4HWm|! zBtu5r+i}27f%p-4rz7Dmkt^PopLRqC1Tl!_yhww7Nbn*;j-FD;uk(Rw$LAS*R6&x= zXdH0B-C}?8a+N(nvt;tlAN_@T z_$U=)4~lP2 zT_l|n+~{p(tKm-XPmmt-o36$=&CC&0x_D4O+Y0aY`r)GAQ|M!Cu_#-Yr*ln`GyF#B$5~R>|=# za!hatTDG>EYq}*kZEWk?J1bFrc`d@TpB$8)sEc2Ox5-NI3>+NlG~M48Z^1W)PFM

~O><>*Dx*&G-{Tk+-rW8rR`}H&&FeUEm*G>6;g6bZ z7yVA*nK5oBrF%|!G@n1g9jGyBzzO$uMBFa=7B^u8whT9bZ`jQ|5FT!2Ug#T+F&{iV z9A`CfZa7@1rLoHh>Imuy8W2hm@V%eoRA!@gE~YZprDqit)%5Z*>hL+7#yg*no|x$} zhww&n6C`+zAVknaFha1GU_Ze@k*ZGO6eOS6lv?@UNT)P)GyfBg!LuyoWW+D5 djImFpfqT-xAEY>3dg6}di#C`TIb)+E_#gS1Yjpqs delta 4486 zcmbVPYiv}<6~42(-q&5*i@gu8AM5pVy#~LqAu+~a4A>?FJJcy9H$t1mcVmq2wPAK0 zz&KgAaoR*}qRs-!Ya(wV|^ zlVW1jH)&?wqFAtPRxMhdZdI&8o~PM#yJ8n|E6N>;L&$BKQf+F@h@xYgr)>Fffa7*g}fByWh>-iAumUHg|L)$-yk%>Ib46G zP-WdmgeruSs)Q!%zEQ27la%#wS*@9qE*cAwlnrVvN}JR=#AY$K9_NNv1kxhp4JePS z3?!iI0@-STR z23R{>a}2Rf;CD7M8}vE{tPNriyz2CpirEbNJ;u}ksR;b=j&rkhljy>kssMQ8H!8cS zyNzHwfsLStU zp^mAsWISz~JbW}hl1%U>(yl5r56PMdT4Sky zJ#dIhYTlJI{VJIi)hNwpUPZLnKm(F@N z+qn)oIhhV-HWn$jZkpU)dyst~eDEF;oCpSNcEb7%cVS=b6V`|~dN zrMI*3R-y030^>}Nk69h(?S zj>R-Cs&-{1N0zwHmKj5nbLHd&Tng5*@55qn5YrHZ%)Qo2fiHsqFF)6+*-=4WB91L%W$4rqRxJpta%uNc%!E73+Xc(#D7blUnQ>uKY_a1)+$Q7 z=#H4MmHE+4MU3_N*ChCJVUvxi?2_rC85}M3aJAN+de)qjGh=7)4LD<(!FS;6IK+?+ zOA$Ozwb+T61PSwcY)^ZThZ8LbQ5BhMOlv-p)HNI->T`xhTUV2^1Eof8$u!m%@kGk7 zxjZeyeFnXzommh3c^v)@{v|pQW~JNCve)}=mNzYyH(lO!wd{A!eX~1n%kG)eIgIuundY5JVN{@e(B8AtAs%+S;5|R zj?KV@w%5YhxM;oi?Iu-f+N#HsMY)_+y|ew z`mFp4w*Ro zOhBxedBf1TG%gR?(d9?;X*keb&HCU}_r`j$kiwkYon43n7Q0Kk*JQ}GiTWx9K(HMe zw)Gf1c@=r`B;47iej!EQ=bUW(ieSwEa#8fJX$HYwcx(F>-0Z(>KRak#3XTUXH@k1S z48KQ)2_A=!d+Lofy(hTev*XRZxh}!%T7>0dGO+w;U;RdYpR@!DIC>im^Y4q-@t1m! znNl`V_Yeq<${U%Snn-dwq5MUJbY5~Ssl_?H;nH~=m1^3Yn9>aja~Kr%A&tIHP)Z=U z_#/delete/', views., name='job_delete'), path('jobs//', views.job_detail, name='job_detail'), path('jobs//candidate/', views.job_detail_candidate, name='job_detail_candidate'), - path('jobs//candidate/application/success', views.application_sucess, name='application_success'), + path('jobs//candidate/application/success', views.application_success, name='application_success'), + # LinkedIn Integration URLs path('jobs//post-to-linkedin/', views.post_to_linkedin, name='post_to_linkedin'), diff --git a/recruitment/views.py b/recruitment/views.py index 95a2b40..78dc2d7 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -10,7 +10,7 @@ from django.db.models import Q from django.urls import reverse from django.conf import settings from django.utils import timezone -from .forms import ZoomMeetingForm,JobPostingForm,FormTemplateForm,InterviewScheduleForm +from .forms import ZoomMeetingForm,JobPostingForm,FormTemplateForm,InterviewScheduleForm,JobStatusUpdateForm from rest_framework import viewsets from django.contrib import messages from django.core.paginator import Paginator @@ -225,6 +225,7 @@ def edit_job(request,slug): def job_detail(request, slug): """View details of a specific job""" job = get_object_or_404(JobPosting, slug=slug) + # Get all candidates for this job, ordered by most recent candidates = job.candidates.all().order_by('-created_at') @@ -235,6 +236,27 @@ def job_detail(request, slug): interview_count = candidates.filter(stage='Interview').count() offer_count = candidates.filter(stage='Offer').count() + status_form = JobStatusUpdateForm(instance=job) + + # 2. Check for POST request (Status Update Submission) + if request.method == 'POST': + + status_form = JobStatusUpdateForm(request.POST, instance=job) + + if status_form.is_valid(): + status_form.save() + + # Add a success message + messages.success(request, f"Status for '{job.title}' updated to '{job.get_status_display()}' successfully!") + + + return redirect('job_detail', slug=slug) + else: + + messages.error(request, "Failed to update status due to validation errors.") + + + context = { 'job': job, 'candidates': candidates, @@ -242,6 +264,7 @@ def job_detail(request, slug): 'applied_count': applied_count, 'interview_count': interview_count, 'offer_count': offer_count, + 'status_form':status_form } return render(request, 'jobs/job_detail.html', context) @@ -345,6 +368,13 @@ def applicant_job_detail(request,slug): job=get_object_or_404(JobPosting,slug=slug,status='ACTIVE') return render(request,'jobs/applicant_job_detail.html',{'job':job}) +def application_success(request,slug): + job=get_object_or_404(JobPosting,slug=slug) + return render(request,'jobs/application_success.html',{'job':job}) + + + + # Form Preview Views # from django.http import JsonResponse diff --git a/recruitment/views_frontend.py b/recruitment/views_frontend.py index f323882..54a79d2 100644 --- a/recruitment/views_frontend.py +++ b/recruitment/views_frontend.py @@ -1,4 +1,5 @@ -from django.shortcuts import render, get_object_or_404 +from django.shortcuts import render, get_object_or_404,redirect +from django.contrib import messages from django.http import JsonResponse from . import models from django.utils.translation import get_language @@ -188,10 +189,13 @@ class CandidateDeleteView(LoginRequiredMixin, SuccessMessageMixin, DeleteView): slug_url_kwarg = 'slug' -def job_detail(request, slug): - job = get_object_or_404(models.JobPosting, slug=slug, status='Published') - form = forms.CandidateForm() - return render(request, 'jobs/job_detail.html', {'job': job, 'form': form}) +# def job_detail(request, slug): +# job = get_object_or_404(models.JobPosting, slug=slug, status='Published') +# form = forms.CandidateForm() + +# return render(request, 'jobs/job_detail.html', {'job': job, 'form': form}) + + @login_required diff --git a/templates/forms/form_wizard.html b/templates/forms/form_wizard.html index 8aedf54..01f99c4 100644 --- a/templates/forms/form_wizard.html +++ b/templates/forms/form_wizard.html @@ -460,9 +460,9 @@

-
+
@@ -168,7 +168,7 @@

{% translate "Thank You!" %}

{% translate "Your application has been submitted successfully" %}

- {# JOB INFO BLOCK #} + {% comment %} {# JOB INFO BLOCK #}

{% translate "Position" %}: {{ job.title }}

{% translate "Job ID" %}: {{ job.internal_job_id }}

@@ -176,14 +176,14 @@ {% if job.application_deadline %}

{% translate "Application Deadline" %}: {{ job.application_deadline|date:"F j, Y" }}

{% endif %} -
+
{% endcomment %}

{% translate "We appreciate your interest in joining our team. Our hiring team will review your application and contact you if there's a potential match for this position." %}

- + {% translate "Return to Job Listings" %} {# You can add a link to view the saved application here if applicable #} diff --git a/templates/jobs/job_detail.html b/templates/jobs/job_detail.html index 7acfd11..56f7a5f 100644 --- a/templates/jobs/job_detail.html +++ b/templates/jobs/job_detail.html @@ -36,6 +36,8 @@ font-weight: 700; text-transform: uppercase; letter-spacing: 0.7px; + display: inline-flex; + align-items: center; } /* Mapped color classes for status badges */ @@ -109,7 +111,6 @@ /* ==================================== */ .right-column-tabs { - /* Use the .card wrapper for the main structure */ padding: 0; margin-bottom: 0; border-bottom: 1px solid var(--kaauh-border); @@ -119,41 +120,38 @@ margin-bottom: 0; border-bottom: none; background-color: transparent; - display: flex; /* Ensure the nav-items take up equal space */ + display: flex; } .right-column-tabs .nav-item { flex-grow: 1; text-align: center; } .right-column-tabs .nav-link { - /* Base style for all right column tabs */ - padding: 0.9rem 1rem; /* Slightly larger padding for better spacing */ + padding: 0.9rem 1rem; font-size: 0.95rem; font-weight: 600; color: var(--kaauh-primary-text); border-radius: 0; border-right: 1px solid var(--kaauh-border); - border-bottom: 1px solid var(--kaauh-border); /* Separator line */ - background-color: #f8f9fa; /* Subtle background for non-active tabs */ + border-bottom: 1px solid var(--kaauh-border); + background-color: #f8f9fa; } .right-column-tabs .nav-item:last-child .nav-link { border-right: none; } - /* Active Tab */ .right-column-tabs .nav-link.active { - background-color: white; /* Lift the active tab */ + background-color: white; color: var(--kaauh-teal-dark); - border-bottom: 3px solid var(--kaauh-teal); /* Strong accent */ - border-right-color: transparent; /* Clean up border next to it */ - margin-bottom: -1px; /* Overlap the border for a cleaner look */ + border-bottom: 3px solid var(--kaauh-teal); + border-right-color: transparent; + margin-bottom: -1px; } - /* Hover state for non-active tabs */ .right-column-tabs .nav-link:not(.active):hover { - background-color: #f0f4f7; /* Darken slightly on hover */ + background-color: #f0f4f7; color: var(--kaauh-teal); } .right-column-tabs .tab-content { - padding: 1.5rem 1.25rem; /* Increased padding inside the content for breathing room */ + padding: 1.5rem 1.25rem; background-color: white; } @@ -229,13 +227,11 @@ /* Table styling for the Applicant preview */ .table-applicants tbody tr:hover { - background-color: #f3f9f9; /* Light teal hover for rows */ + background-color: #f3f9f9; } .table-applicants td { border-top: 1px solid var(--kaauh-border); } - - {% endblock %} @@ -249,10 +245,19 @@ {# HEADER SECTION #}
-

{{job}}

- - {{ job.get_status_display }} - +
+

{{ job.title }}

+ {{ job.internal_job_id }} +
+ +
+ + {{ job.get_status_display }} + + +
{# LEFT TABS NAVIGATION #} @@ -566,4 +571,37 @@
{% include "jobs/partials/image_upload.html" %} + + + + {% endblock %} \ No newline at end of file diff --git a/templates/jobs/job_detail_candidate.html b/templates/jobs/job_detail_candidate.html index ae369e4..5d752fc 100644 --- a/templates/jobs/job_detail_candidate.html +++ b/templates/jobs/job_detail_candidate.html @@ -135,9 +135,9 @@