From 302aa8d0bfa522bf8c252e2f278fd678bbdcddcb Mon Sep 17 00:00:00 2001 From: ismail Date: Tue, 14 Oct 2025 15:55:53 +0300 Subject: [PATCH] update the bulk button to select --- recruitment/__pycache__/forms.cpython-313.pyc | Bin 23612 -> 23612 bytes .../linkedin_service.cpython-313.pyc | Bin 11109 -> 16380 bytes .../__pycache__/models.cpython-313.pyc | Bin 47831 -> 45158 bytes .../__pycache__/signals.cpython-313.pyc | Bin 6803 -> 6466 bytes recruitment/__pycache__/urls.cpython-313.pyc | Bin 8954 -> 8956 bytes recruitment/__pycache__/utils.cpython-313.pyc | Bin 18670 -> 18670 bytes recruitment/__pycache__/views.cpython-313.pyc | Bin 68868 -> 70640 bytes .../migrations/0012_merge_20251014_1403.py | 14 ++ .../0013_alter_formtemplate_created_by.py | 21 +++ recruitment/models.py | 80 ++++----- recruitment/signals.py | 8 +- recruitment/urls.py | 5 +- recruitment/views.py | 53 +++--- templates/base.html | 32 ++-- .../recruitment/candidate_exam_view.html | 147 ++++++++++------ .../recruitment/candidate_screening_view.html | 161 ++++++++++++------ 16 files changed, 328 insertions(+), 193 deletions(-) create mode 100644 recruitment/migrations/0012_merge_20251014_1403.py create mode 100644 recruitment/migrations/0013_alter_formtemplate_created_by.py diff --git a/recruitment/__pycache__/forms.cpython-313.pyc b/recruitment/__pycache__/forms.cpython-313.pyc index 4b8d6957cbe2cbcbd02fd817e33bf803f9289fd1..4fbce267b203c37d43e2db56ca6e4c7c4e9904df 100644 GIT binary patch delta 22 ccmdn9gK^IeM()qNyj%=GP^J5BBe!7;09Vik>i_@% delta 22 ccmdn9gK^IeM()qNyj%=GAfxqmBe!7;097Xji2wiq diff --git a/recruitment/__pycache__/linkedin_service.cpython-313.pyc b/recruitment/__pycache__/linkedin_service.cpython-313.pyc index 5e09bbbc3c6fb1f0fe4db8dfaa16a6251c63750a..4e6d02ae2460c110588277bc99024d3c8b795a42 100644 GIT binary patch literal 16380 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 O*K{iTLke>;!2bdI{XN3~ delta 5010 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 XVB`_+Der$Pl<@uZgD=g;p)&ptP95KI diff --git a/recruitment/__pycache__/signals.cpython-313.pyc b/recruitment/__pycache__/signals.cpython-313.pyc index 61b103c42804167a2245f63c3d30536c3898e748..fc601be53b0495bef0b3c2911021a8d1a360c910 100644 GIT binary patch delta 321 zcmbPiddP_PGcPX}0}#wMewT4_BCjOlhKcGejJy-qNQ(0Wb67G3b4f9nf)oHjk#IVr zCilc|Q#b!(Qe$M)oNUFEE-6-=oL`h0pPZPNl9`fNk{Vx>T3ni&S|mO>kj0JZGsEVY zEXG`Hw^;HLb5kc@)M- z{G_bZAVPGqvCvFLvB_tJq!~RnzZ42%V-%U} zAUR8403<68B0PY^N`@i{5L*mL+~Tmw%}*)KNwq5q0&*FFxHxGtpOh}sN1n+MQsyim Fl>jX(OcVeB delta 564 zcmX?PG})B*GcPX}0}zNwzRfr|kyn!O)I{|bM!tz_Bn^3kIV_oixuh6OK?;DNNH~T? zi6Mp~h6gOejU*$I&Zx;V@y=9fHlR9gApV>NB&ITiGHC#55J=RT+{>)M6vR5YkV|y( zK}K=6U?xju1%`AW)MWMx(PX~GoRyz+i!-x0J~6o@vn=%%OI~7bswPVj$bq-m^OLet zlS_(ku_YI!CYGe$VlBxm$w^%~c?MH@fG|WXJ}ti}7evGZO)8QCY6EF4)&vp_4A0p4 z?r?})=a9L`A#+p?rxW>;p3c2mfcFVusBrjK++@MWP_x zEI>j52#O?ujLH9)BpDSaOE9}J6-jSSU^eDrEfNHY&*b%IQvouHR42dVZIx07F+pB0 z0$E<91tK8Qn|t{J81cwY{?7kMsYnQZN$-Ogdh2sUJ$npirxPBY@eP#BA{I#7H?e2GW)+?p$<>Jj{>ef#i(7xDI54JIi0WJKhih4^`c5i>j!-BCJ;1m@fgo zgnnZT$T;^2=NHaj&9Oid0!cli0h#4jgbN85s|8tn65^Bk+(RHA^G@Nq=$CG#`>LqB zMNT<6VCoR4Lrg7zS~yon^{EPwWgZcsD1GVnH1&u&M*lYIUQx$sUh!D_%2ZJTCGq5% zXcszdVc|T4|C_RRg?mr9Xsw0CG>B>XooygH9OrA$a7V7=HRecwBf%U4;21b}q|QDu zzbGY!r|A!hY8$c$$WU&;FhZ6NdQ@8u;id_ZJi?g8?EBV{#^eylAtpybj-Jc0+M&5% z;~1KtUl_x0BTUj42E30jMPC{)jW9$1@i@{N!h&e5oHVlbFtmsDo)nNYUqpGwlzOwb z8hjRg8m%1wxye67Ri>KiwcSIg(0$cuTSmBV!r=pi73|>G0|^!wgTRRN z>W-5Hb49=vsZ9VG<{KzCQC>aOSR@6J)Y%#kjc=jcHsw+Kae~>q!QQR+jQ}a|9h9G1 zXx!Uo`wVH9-u60tdk9aksn}1W5I45R10XAW-#9L}yb5mH4E@%t*oLiQfwJ^RuM)~3 zj9A5l^wturPlG;V>34zb@dDag^s>*);^<|dH}ky$WR6c`eg9P6Kl{&~H4_*#-0hphYq3@nr| zaihM>21_tl;*zv#8L^tFf|V~~Y8^wt>JID7LT6SV6~}u6?IzmHS&n6kkS*%>9|3vH zx6nSKoqmt)F~Tk#H((Fp3ElFCn)eY7tn?dy&~}KFp+EUO@^FJWIiJ6|Suy^O{{qxh Brz!vd delta 1299 zcmaKsO-vg{6vwd{3qxvB2^$Q{`eSWFoceQ7@5etcZ#~kBg~zK8R|};zeS2qbO)u@}Yx{-m z_&e!;>_L!9PMPXX+jlKaTa)EC`o7fOS+rcY{zB|0-KR&aV-Pw9&yzsLd1H~LB}J;+ ztCj{^^NHuo#X7^#8LqttB*m{4=?h8f628^+MsuK|y;*s^avrI-UoXL z5o#Bq+vf?EoP*??vAhf9OWq-zyS_lzsmh!^;Owb>0wl@B#;$y#D_SkHxC(LAxU&L8 z=YG+p&~&$}7!Y+(R&sqfK=ufgYt|E+CM4zt` zV@ej3EK{aHnYvV_jkz@->wFwz6Ex%T+9we{7BGb{OE)~S{Vu|%^ec}yeh*;|NB34; zEUZFUW#MTEPhW;-jQI^9n_R=#Jbh=5&Lb>Pi?`jrh_FJvUROXzc<}E=LvLcQW3?k7 zW4wTBo#wqh`v$@$J@$6kA0m7q;1R+W{lVLDyp2%8ah+!gCPhJt*39dX{_S~`3n-K48cQufYRM>wwHDDXq3y4!Y;XYv7YzOQs-eL)V&%&ixKDrd%el`G zo?tpuDYM=j^yZ8y9moUz6m1FZ=!MF1I^=X?eILkkUPgOB!-~g#i132WnD7$eh?bR} f=3|6RBmG7R*+&}xx%Z%W9IAj<*Pg7Jf5E>2Yw(^d diff --git a/recruitment/__pycache__/utils.cpython-313.pyc b/recruitment/__pycache__/utils.cpython-313.pyc index 4c58b5f813753fab607be1195bd50d8fa3166732..56997da8f0c060ea9aaf882ce44884eacbf13b50 100644 GIT binary patch delta 22 ccmaDik@4L`M()qNyj%=GP^J5BBllwu09!E!p8x;= delta 22 ccmaDik@4L`M()qNyj%=Gpy>W~Bllwu09jcFUjP6A diff --git a/recruitment/__pycache__/views.cpython-313.pyc b/recruitment/__pycache__/views.cpython-313.pyc index eceab8e74ef4014ead39d2e9ed15e0247644ddb4..251fa3edc1ed46e09f8c353604415554a0566b55 100644 GIT binary patch delta 15398 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%0DR8pkOX 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 Q{cQH=br$gk`r`1v05Pd*wg3PC delta 14040 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 diff --git a/recruitment/migrations/0012_merge_20251014_1403.py b/recruitment/migrations/0012_merge_20251014_1403.py new file mode 100644 index 0000000..2827f2a --- /dev/null +++ b/recruitment/migrations/0012_merge_20251014_1403.py @@ -0,0 +1,14 @@ +# Generated by Django 5.2.6 on 2025-10-14 11:03 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0010_alter_scheduledinterview_schedule'), + ('recruitment', '0011_alter_jobpostingimage_job_and_more'), + ] + + operations = [ + ] diff --git a/recruitment/migrations/0013_alter_formtemplate_created_by.py b/recruitment/migrations/0013_alter_formtemplate_created_by.py new file mode 100644 index 0000000..cbdb0fb --- /dev/null +++ b/recruitment/migrations/0013_alter_formtemplate_created_by.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2.6 on 2025-10-14 11:24 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0012_merge_20251014_1403'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterField( + model_name='formtemplate', + name='created_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='form_templates', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/recruitment/models.py b/recruitment/models.py index 91b82dc..3efe497 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -273,12 +273,12 @@ class Candidate(Base): CANDIDATE = "Candidate", _("Candidate") # Stage transition validation constants - STAGE_SEQUENCE = { - "Applied": ["Exam", "Interview", "Offer"], - "Exam": ["Interview", "Offer"], - "Interview": ["Offer"], - "Offer": [], # Final stage - no further transitions - } + # STAGE_SEQUENCE = { + # "Applied": ["Exam", "Interview", "Offer"], + # "Exam": ["Interview", "Offer"], + # "Interview": ["Offer"], + # "Offer": [], # Final stage - no further transitions + # } job = models.ForeignKey( JobPosting, @@ -375,50 +375,50 @@ class Candidate(Base): return self.resume.size return 0 - def clean(self): - """Validate stage transitions""" - # Only validate if this is an existing record (not being created) - if self.pk and self.stage != self.__class__.objects.get(pk=self.pk).stage: - old_stage = self.__class__.objects.get(pk=self.pk).stage - allowed_next_stages = self.STAGE_SEQUENCE.get(old_stage, []) + # def clean(self): + # """Validate stage transitions""" + # # Only validate if this is an existing record (not being created) + # if self.pk and self.stage != self.__class__.objects.get(pk=self.pk).stage: + # old_stage = self.__class__.objects.get(pk=self.pk).stage + # allowed_next_stages = self.STAGE_SEQUENCE.get(old_stage, []) - if self.stage not in allowed_next_stages: - raise ValidationError( - { - "stage": f'Cannot transition from "{old_stage}" to "{self.stage}". ' - f"Allowed transitions: {', '.join(allowed_next_stages) or 'None (final stage)'}" - } - ) + # if self.stage not in allowed_next_stages: + # raise ValidationError( + # { + # "stage": f'Cannot transition from "{old_stage}" to "{self.stage}". ' + # f"Allowed transitions: {', '.join(allowed_next_stages) or 'None (final stage)'}" + # } + # ) - # Validate that the stage is a valid choice - if self.stage not in [choice[0] for choice in self.Stage.choices]: - raise ValidationError( - { - "stage": f"Invalid stage. Must be one of: {', '.join(choice[0] for choice in self.Stage.choices)}" - } - ) + # # Validate that the stage is a valid choice + # if self.stage not in [choice[0] for choice in self.Stage.choices]: + # raise ValidationError( + # { + # "stage": f"Invalid stage. Must be one of: {', '.join(choice[0] for choice in self.Stage.choices)}" + # } + # ) def save(self, *args, **kwargs): """Override save to ensure validation is called""" self.clean() # Call validation before saving super().save(*args, **kwargs) - def can_transition_to(self, new_stage): - """Check if a stage transition is allowed""" - if not self.pk: # New record - can be in Applied stage - return new_stage == "Applied" + # def can_transition_to(self, new_stage): + # """Check if a stage transition is allowed""" + # if not self.pk: # New record - can be in Applied stage + # return new_stage == "Applied" - old_stage = self.__class__.objects.get(pk=self.pk).stage - allowed_next_stages = self.STAGE_SEQUENCE.get(old_stage, []) - return new_stage in allowed_next_stages + # old_stage = self.__class__.objects.get(pk=self.pk).stage + # allowed_next_stages = self.STAGE_SEQUENCE.get(old_stage, []) + # return new_stage in allowed_next_stages - def get_available_stages(self): - """Get list of stages this candidate can transition to""" - if not self.pk: # New record - return ["Applied"] + # def get_available_stages(self): + # """Get list of stages this candidate can transition to""" + # if not self.pk: # New record + # return ["Applied"] - old_stage = self.__class__.objects.get(pk=self.pk).stage - return self.STAGE_SEQUENCE.get(old_stage, []) + # old_stage = self.__class__.objects.get(pk=self.pk).stage + # return self.STAGE_SEQUENCE.get(old_stage, []) @property def submission(self): @@ -544,7 +544,7 @@ class FormTemplate(Base): blank=True, help_text="Description of the form template" ) created_by = models.ForeignKey( - User, on_delete=models.CASCADE, related_name="form_templates" + User, on_delete=models.CASCADE, related_name="form_templates",null=True,blank=True ) is_active = models.BooleanField( default=False, help_text="Whether this template is active" diff --git a/recruitment/signals.py b/recruitment/signals.py index 2420f64..3795b13 100644 --- a/recruitment/signals.py +++ b/recruitment/signals.py @@ -7,10 +7,10 @@ from .models import FormField,FormStage,FormTemplate,Candidate,JobPosting logger = logging.getLogger(__name__) -@receiver(post_save, sender=JobPosting) -def create_form_for_job(sender, instance, created, **kwargs): - if created: - FormTemplate.objects.create(job=instance, is_active=True, name=instance.title) +# @receiver(post_save, sender=JobPosting) +# def create_form_for_job(sender, instance, created, **kwargs): +# if created: +# FormTemplate.objects.create(job=instance, is_active=True, name=instance.title) @receiver(post_save, sender=Candidate) def score_candidate_resume(sender, instance, created, **kwargs): if not instance.is_resume_parsed: diff --git a/recruitment/urls.py b/recruitment/urls.py index c75a741..2ed3d74 100644 --- a/recruitment/urls.py +++ b/recruitment/urls.py @@ -17,7 +17,6 @@ urlpatterns = [ path('jobs//candidate/application/success', views.application_success, name='application_success'), path('careers/',views.kaauh_career,name='kaauh_career'), - # LinkedIn Integration URLs path('jobs//post-to-linkedin/', views.post_to_linkedin, name='post_to_linkedin'), path('jobs/linkedin/login/', views.linkedin_login, name='linkedin_login'), @@ -34,7 +33,6 @@ urlpatterns = [ path('candidate//view/', views_frontend.candidate_detail, name='candidate_detail'), path('candidate//update-stage/', views_frontend.candidate_update_stage, name='candidate_update_stage'), - # Training URLs path('training/', views_frontend.TrainingListView.as_view(), name='training_list'), path('training/create/', views_frontend.TrainingCreateView.as_view(), name='training_create'), @@ -75,7 +73,8 @@ urlpatterns = [ path('htmx//candidate_criteria_view/', views.candidate_criteria_view_htmx, name='candidate_criteria_view_htmx'), path('htmx//candidate_set_exam_date/', views.candidate_set_exam_date, name='candidate_set_exam_date'), - path('htmx/bulk_candidate_move_to_exam/', views.bulk_candidate_move_to_exam, name='bulk_candidate_move_to_exam'), + + path('htmx//candidate_update_status/', views.candidate_update_status, name='candidate_update_status'), path('forms/form//submit/', views.submit_form, name='submit_form'), path('forms/form//', views.form_wizard_view, name='form_wizard'), diff --git a/recruitment/views.py b/recruitment/views.py index 9d30f3b..1564c97 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -5,7 +5,7 @@ from rich import print from django.template.loader import render_to_string from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_http_methods -from django.http import JsonResponse +from django.http import HttpResponse, JsonResponse from datetime import datetime,time,timedelta from django.views import View from django.db.models import Q @@ -262,12 +262,13 @@ def create_job(request): else: job.created_by = request.POST.get("created_by", "").strip() if not job.created_by: - job.created_by = "University Administrator" + job.created_by = request.user.username job.save() job_apply_url_relative=reverse('job_detail_candidate',kwargs={'slug':job.slug}) job_apply_url_absolute=request.build_absolute_uri(job_apply_url_relative) job.application_url=job_apply_url_absolute + FormTemplate.objects.create(job=job, is_active=True, name=job.title,created_by=request.user) job.save() messages.success(request, f'Job "{job.title}" created successfully!') return redirect("job_list") @@ -328,15 +329,15 @@ def job_detail(request, slug): # Count candidates by stage for summary statistics total_applicant = applicants.count() - + applied_count = applicants.filter(stage="Applied").count() exam_count=applicants.filter(stage="Exam").count - + interview_count = applicants.filter(stage="Interview").count() - + offer_count = applicants.filter(stage="Offer").count() - + status_form = JobPostingStatusForm(instance=job) image_upload_form=JobPostingImageForm(instance=job) @@ -1521,7 +1522,7 @@ def candidate_screening_view(request, slug): offer_count=job.candidates.filter(stage='Offer').count() # Get all candidates for this job, ordered by match score (descending) candidates = job.candidates.filter(stage="Applied").order_by("-match_score") - + # Get tier categorization parameters @@ -1629,33 +1630,31 @@ def candidate_screening_view(request, slug): min_ai_score_str = request.GET.get('min_ai_score') tier1_count_str = request.GET.get('tier1_count') - + try: # Check if the string value exists and is not an empty string before conversion if min_ai_score_str: min_ai_score = int(min_ai_score_str) else: min_ai_score = 0 - + if tier1_count_str: tier1_count = int(tier1_count_str) else: tier1_count = 0 - + except ValueError: # This catches if the user enters non-numeric text (e.g., "abc") min_ai_score = 0 tier1_count = 0 - print(min_ai_score) - print(tier1_count) + # You can now safely use min_ai_score and tier1_count as integers (0 or greater) if min_ai_score > 0: candidates = candidates.filter(match_score__gte=min_ai_score) - print(candidates) - + if tier1_count > 0: candidates = candidates[:tier1_count] - + context = { "job": job, "candidates": candidates, @@ -1697,7 +1696,6 @@ def update_candidate_exam_status(request, slug): def bulk_update_candidate_exam_status(request,slug): job = get_object_or_404(JobPosting, slug=slug) status = request.headers.get('status') - if status: for candidate in get_candidates_from_request(request): try: @@ -1724,19 +1722,18 @@ def candidate_set_exam_date(request, slug): messages.success(request, f"Set exam date for {candidate.name} to {candidate.exam_date}") return redirect("candidate_screening_view", slug=candidate.job.slug) -def bulk_candidate_move_to_exam(request): - for candidate in get_candidates_from_request(request): - candidate.stage = "Exam" - candidate.applicant_status = "Candidate" - candidate.exam_date = timezone.now() - candidate.save() +def candidate_update_status(request, slug): + job = get_object_or_404(JobPosting, slug=slug) + mark_as = request.POST.get('mark_as') + candidate_ids = request.POST.getlist("candidate_ids") - messages.success(request, f"Candidates Moved to Exam stage") - return redirect("candidate_screening_view", slug=candidate.job.slug) - # def response(): - # yield SSE.patch_elements("","") - # yield SSE.execute_script("console.log('hello world');") - # return DatastarResponse(response()) + if c := Candidate.objects.filter(pk__in = candidate_ids): + c.update(stage=mark_as,exam_date=timezone.now(),applicant_status="Candidate" if mark_as in ["Exam","Interview","Offer"] else "Applicant") + + messages.success(request, f"Candidates Updated") + response = HttpResponse(redirect("candidate_screening_view", slug=job.slug)) + response.headers["HX-Refresh"] = "true" + return response def candidate_interview_view(request,slug): job = get_object_or_404(JobPosting,slug=slug) diff --git a/templates/base.html b/templates/base.html index dc0738e..bd2fa28 100644 --- a/templates/base.html +++ b/templates/base.html @@ -30,7 +30,7 @@ padding-right: var(--bs-gutter-x, 0.75rem); /* Add Bootstrap padding for responsiveness */ padding-left: var(--bs-gutter-x, 0.75rem); } - + /* === Top Bar === */ .top-bar { background-color: white; @@ -77,7 +77,7 @@ box-shadow: 0 2px 6px rgba(0,0,0,0.12); } /* Change the outer navbar container to fluid, rely on inner max-width */ - .navbar-dark > .container { + .navbar-dark > .container { max-width: 100%; /* Override default container width */ } .nav-link { @@ -276,7 +276,7 @@
Princess Nourah bint Abdulrahman University
King Abdullah bin Abdulaziz University Hospital
- + KAAUH Logo @@ -325,7 +325,7 @@ {% trans "Form Templates" %} - +
{% endcomment %} @@ -349,8 +349,8 @@ - - + + - + - + +
  • @@ -518,13 +518,13 @@ {% block content %} {% endblock %} - +