diff --git a/recruitment/filters.py b/recruitment/filters.py index 361a55ca5..000ab4406 100644 --- a/recruitment/filters.py +++ b/recruitment/filters.py @@ -9,6 +9,7 @@ import uuid import django_filters from django import forms +from django.utils.translation import gettext_lazy as _ from base.filters import FilterSet from recruitment.models import ( @@ -169,9 +170,57 @@ class CandidateFilter(FilterSet): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.form.fields["is_active"].initial = True - for field in self.form.fields.keys(): - self.form.fields[field].widget.attrs["id"] = f"{uuid.uuid4()}" + + form_fields = self.form.fields + form_fields["is_active"].initial = True + + for field in form_fields: + form_fields[field].widget.attrs["id"] = str(uuid.uuid4()) + + self._update_field_labels(form_fields) + + def _update_field_labels(self, form_fields): + """Helper method to update field labels from model verbose names""" + + models = { + "recruitment": Recruitment(), + "interview": InterviewSchedule(), + "skill_zone": SkillZoneCandidate(), + } + + interview_date_label = ( + models["interview"]._meta.get_field("interview_date").verbose_name + ) + + field_label_map = { + "interview_date": interview_date_label, + "scheduled_from": f"{interview_date_label} From", + "scheduled_till": f"{interview_date_label} Till", + "rejected_candidate__reject_reason_id": _("Reject Reason"), + "job_position_id__department_id": _("Department"), + "stage_id__stage_type": _("Stage Type"), + "stage_id__stage_managers": _("Stage Managers"), + "skillzonecandidate_set__skill_zone_id": models["skill_zone"] + ._meta.get_field("skill_zone_id") + .verbose_name, + "start_date": models["recruitment"] + ._meta.get_field("start_date") + .verbose_name, + "end_date": models["recruitment"]._meta.get_field("end_date").verbose_name, + "recruitment_id__company_id": models["recruitment"] + ._meta.get_field("company_id") + .verbose_name, + "recruitment_id__closed": models["recruitment"] + ._meta.get_field("closed") + .verbose_name, + "recruitment_id__recruitment_managers": models["recruitment"] + ._meta.get_field("recruitment_managers") + .verbose_name, + } + + for field_name, label in field_label_map.items(): + if field_name in form_fields: + form_fields[field_name].label = label def filter_mail_sent(self, queryset, name, value): return queryset.filter(onboarding_portal__isnull=(not value)) @@ -246,6 +295,13 @@ class RecruitmentFilter(FilterSet): "open_positions", ] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + start_date_verbose = self.Meta.model._meta.get_field("start_date").verbose_name + end_date_verbose = self.Meta.model._meta.get_field("end_date").verbose_name + self.form.fields["start_from"].label = f"{start_date_verbose} From" + self.form.fields["end_till"].label = f"{end_date_verbose} Till" + def filter_by_name(self, queryset, _, value): """ Filter queryset by first name or last name. @@ -474,6 +530,7 @@ class SkillZoneCandFilter(FilterSet): field_name="candidate__id__joining_date", lookup_expr="gte", widget=forms.DateInput(attrs={"type": "date"}), + label=_("Joining From"), ) probation_end = django_filters.DateFilter( field_name="candidate__id__probation_end", @@ -483,11 +540,13 @@ class SkillZoneCandFilter(FilterSet): field_name="candidate__id__probation_end", lookup_expr="lte", widget=forms.DateInput(attrs={"type": "date"}), + label=_("Probation Till"), ) probation_end_from = django_filters.DateFilter( field_name="candidate__id__probation_end", lookup_expr="gte", widget=forms.DateInput(attrs={"type": "date"}), + label=_("Probation From"), ) schedule_date = django_filters.DateFilter( field_name="candidate__id__schedule_date", @@ -497,6 +556,7 @@ class SkillZoneCandFilter(FilterSet): field_name="candidate__id__joining_date", lookup_expr="lte", widget=forms.DateInput(attrs={"type": "date"}), + label=_("Joining Till"), ) recruitment = django_filters.CharFilter( field_name="candidate__id__recruitment_id__title", lookup_expr="icontains" @@ -506,11 +566,13 @@ class SkillZoneCandFilter(FilterSet): field_name="candidate__id__onboarding_portal", method="filter_mail_sent", widget=django_filters.widgets.BooleanWidget(), + label=_("Portal Sent"), ) joining_set = django_filters.BooleanFilter( field_name="candidate__id__joining_date", method="filter_joining_set", widget=django_filters.widgets.BooleanWidget(), + label=_("Joining Set"), ) class Meta: @@ -583,10 +645,6 @@ class InterviewFilter(FilterSet): lookup_expr="gte", widget=forms.DateInput(attrs={"type": "date"}), ) - # schedule_date = django_filters.DateFilter( - # field_name="interview_date", - # widget=forms.DateInput(attrs={"type": "date"}), - # ) scheduled_till = django_filters.DateFilter( field_name="interview_date", lookup_expr="lte", @@ -603,40 +661,17 @@ class InterviewFilter(FilterSet): "candidate_id", "employee_id", "interview_date", - # "recruitment", - # "recruitment_id", - # "stage_id", - # "schedule_date", - # "email", - # "mobile", - # "country", - # "state", - # "city", - # "zip", - # "gender", - # "start_onboard", - # "hired", - # "canceled", - # "is_active", - # "recruitment_id__company_id", - # "job_position_id", - # "recruitment_id__closed", - # "recruitment_id__is_active", - # "job_position_id__department_id", - # "recruitment_id__recruitment_managers", - # "stage_id__stage_managers", - # "stage_id__stage_type", - # "joining_date", - # "skillzonecandidate_set__skill_zone_id", - # "skillzonecandidate_set__candidate_id", - # "portal_sent", - # "joining_set", - # "rejected_candidate__reject_reason_id", - # "offer_letter_status", - # "candidate_rating__rating", - # "candidate_interview__employee_id", ] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.form["scheduled_from"].label = ( + f"{self.Meta.model()._meta.get_field('interview_date').verbose_name} From" + ) + self.form["scheduled_till"].label = ( + f"{self.Meta.model()._meta.get_field('interview_date').verbose_name} Till" + ) + class LinkedInAccountFilter(FilterSet): """LinkedInAccount filter""" diff --git a/recruitment/models.py b/recruitment/models.py index a7b9c74e2..d63485d64 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -134,6 +134,7 @@ class Recruitment(HorillaModel): help_text=_( "To close the recruitment, If closed then not visible on pipeline view." ), + verbose_name=_("Closed"), ) is_published = models.BooleanField( default=True, @@ -143,13 +144,6 @@ class Recruitment(HorillaModel): ), verbose_name=_("Is Published"), ) - is_active = models.BooleanField( - default=True, - help_text=_( - "To archive and un-archive a recruitment, if active is false then it \ - will not appear on recruitment list view." - ), - ) open_positions = models.ManyToManyField( JobPosition, related_name="open_positions", @@ -178,8 +172,10 @@ class Recruitment(HorillaModel): blank=True, verbose_name=_("Company"), ) - start_date = models.DateField(default=django.utils.timezone.now) - end_date = models.DateField(blank=True, null=True) + start_date = models.DateField( + default=django.utils.timezone.now, verbose_name=_("Start Date") + ) + end_date = models.DateField(blank=True, null=True, verbose_name=_("End Date")) skills = models.ManyToManyField(Skill, blank=True, verbose_name=_("Skills")) linkedin_account_id = models.ForeignKey( "recruitment.LinkedInAccount", @@ -335,6 +331,9 @@ class Stage(HorillaModel): verbose_name = _("Stage") verbose_name_plural = _("Stages") + def __str__(self): + return f"{self.stage} - ({self.recruitment_id.title})" + def active_candidates(self): """ This method is used to get all the active candidate like related objects @@ -472,6 +471,7 @@ class Candidate(HorillaModel): choices=offer_letter_statuses, default="not_sent", editable=False, + verbose_name=_("Offer Letter Status"), ) objects = HorillaCompanyManager(related_company_field="recruitment_id__company_id") last_updated = models.DateField(null=True, auto_now=True) diff --git a/recruitment/templates/candidate/candidate_nav.html b/recruitment/templates/candidate/candidate_nav.html index 407d42233..c4e375d37 100644 --- a/recruitment/templates/candidate/candidate_nav.html +++ b/recruitment/templates/candidate/candidate_nav.html @@ -104,11 +104,11 @@ x-data="{searchShow: false}" style="display: none" >
- +
- +
diff --git a/recruitment/templates/candidate/export_filter.html b/recruitment/templates/candidate/export_filter.html index ceb06421c..3a90059a5 100644 --- a/recruitment/templates/candidate/export_filter.html +++ b/recruitment/templates/candidate/export_filter.html @@ -1,205 +1,252 @@ {% load static %} {% load i18n %}
-

- {% trans "Export Candidates" %} -

- +

+ {% trans "Export Candidates" %} +

+
-
- {% csrf_token %} -
-
-
{% trans "Excel columns" %}
-
-
-
-
- -
+ + {% csrf_token %} +
+
+
{% trans "Excel columns" %}
+
+
+
+
+ +
+
+
+
+ {% for field in export_column.selected_fields %} +
+
+ +
+
+ {% endfor %} +
+
-
-
- {% for field in export_column.selected_fields %} -
-
- -
+
+
+
{% trans "Candidates" %}
+
+
+
+
+ + {{export_filter.form.candidate}} +
+
+
+
+
+
+ + {{ export_filter.form.mobile }} +
+
+ + {{ export_filter.form.interview_date }} +
+
+ + {{export_filter.form.country}} +
+
+ + {{ export_filter.form.hired }} +
+
+
+ + {{export_filter.form.rejected_candidate__reject_reason_id}} +
+
+ + {{ export_filter.form.converted }} +
+
+
+
+
+ + {{ export_filter.form.email }} +
+ +
+ + {{ export_filter.form.gender }} +
+ +
+ + {{export_filter.form.state}} +
+ +
+ + {{ export_filter.form.canceled }} +
+
+
+ + {{export_filter.form.offer_letter_status}} +
+
+
+
+
+
+ +
+
+ {% trans 'Recruitment' %} +
+
+
+
+
+ + {{ export_filter.form.recruitment_id }} +
+ +
+ + {{ export_filter.form.job_position_id__department_id }} +
+
+ + {{ export_filter.form.recruitment_id__recruitment_managers }} +
+ +
+ + {{ export_filter.form.stage_id }} +
+ +
+ + {{ export_filter.form.stage_id__stage_type }} +
+ +
+ + {{ export_filter.form.start_date }} +
+
+
+
+ + {{ export_filter.form.recruitment_id__company_id }} +
+ +
+ + {{ export_filter.form.job_position_id }} +
+ +
+ + {{ export_filter.form.skillzonecandidate_set__skill_zone_id }} +
+ +
+ + {{ export_filter.form.stage_id__stage_managers }} +
+ +
+ + {{ export_filter.form.recruitment_id__closed }} +
+ +
+ + {{ export_filter.form.end_date }} +
+
+
+
+
+ +
+
+ {% trans 'Advanced' %} +
+
+
+
+
+ + {{ export_filter.form.scheduled_from }} +
+
+ + {{ export_filter.form.is_active }} +
+
+
+
+ + {{ export_filter.form.scheduled_till }} +
+
+
+
+
- {% endfor %} -
-
-
-
-
-
{% trans "Candidates" %}
-
-
-
-
- - {{export_filter.form.candidate}} -
-
-
-
-
-
- - {{export_filter.form.mobile}} -
-
- - {{export_filter.form.interview_date}} -
-
- - {{export_filter.form.country}} -
-
- - {{export_filter.form.hired}} -
-
-
- - {{export_filter.form.rejected_candidate__reject_reason_id}} -
-
-
-
-
- - {{export_filter.form.email}} -
- -
- - {{export_filter.form.gender}} -
- -
- - {{export_filter.form.state}} -
- -
- - {{export_filter.form.canceled}} -
-
-
- - {{export_filter.form.offer_letter_status}} -
-
-
-
-
-
-
-
{% trans "Recruitment" %}
-
-
-
-
- - {{export_filter.form.recruitment_id}} -
- -
- - {{export_filter.form.job_position_id}} -
- -
- - {{export_filter.form.start_date}} -
-
- - {{export_filter.form.recruitment_id__closed}} -
- -
- - {{export_filter.form.stage_id__stage_type}} -
-
- - {{export_filter.form.stage_id__stage_managers}} -
-
-
-
- - {{export_filter.form.stage_id}} -
-
- - {{export_filter.form.job_position_id__department_id}} -
- -
- - {{export_filter.form.recruitment_id__company_id}} -
- -
- - {{export_filter.form.recruitment_id__recruitment_managers}} -
-
- - {{export_filter.form.end_date}} -
-
-
-
-
-
{% trans "Advanced" %}
-
-
-
-
- - {{export_filter.form.scheduled_from}} -
-
- - {{export_filter.form.is_active}} -
-
-
-
- - {{export_filter.form.scheduled_till}} -
-
-
-
+ -
-
- - - +
diff --git a/recruitment/templates/candidate/filters.html b/recruitment/templates/candidate/filters.html index 13b7dbfb1..6441c7374 100644 --- a/recruitment/templates/candidate/filters.html +++ b/recruitment/templates/candidate/filters.html @@ -2,169 +2,200 @@ {% load static %}
-
-
- {% trans 'Candidates' %} -
-
-
-
-
- - {{ f.form.mobile }} -
-
- - {{ f.form.interview_date }} -
-
- - -
-
- - {{ f.form.hired }} -
-
-
- - {{f.form.rejected_candidate__reject_reason_id}} +
+
+ {% trans 'Candidates' %} +
+
+
+
+
+ + {{ f.form.mobile }} +
+
+ + {{ f.form.interview_date }} +
+
+ + +
+
+ + {{ f.form.hired }} +
+
+
+ + {{f.form.rejected_candidate__reject_reason_id}} +
+
+ + {{ f.form.converted }} +
+
+
+
+
+ + {{ f.form.email }} +
+ +
+ + {{ f.form.gender }} +
+ +
+ + +
+ +
+ + {{ f.form.canceled }} +
+
+
+ + {{f.form.offer_letter_status}} +
+
+
-
- - {{ f.form.converted }} +
+
+
+
+ {% trans 'Recruitment' %} +
+
+
+
+
+ + {{ f.form.recruitment_id }} +
+ +
+ + {{ f.form.job_position_id__department_id }} +
+
+ + {{ f.form.recruitment_id__recruitment_managers }} +
+ +
+ + {{ f.form.stage_id }} +
+ +
+ + {{ f.form.stage_id__stage_type }} +
+ +
+ + {{ f.form.start_date }} +
+
+
+
+ + {{ f.form.recruitment_id__company_id }} +
+ +
+ + {{ f.form.job_position_id }} +
+ +
+ + {{ f.form.skillzonecandidate_set__skill_zone_id }} +
+ +
+ + {{ f.form.stage_id__stage_managers }} +
+ +
+ + {{ f.form.recruitment_id__closed }} +
+ +
+ + {{ f.form.end_date }} +
+
-
-
-
- - {{ f.form.email }} -
+
-
- - {{ f.form.gender }} -
- -
- - -
- -
- - {{ f.form.canceled }} -
-
-
- - {{f.form.offer_letter_status}} +
+
+ {% trans 'Advanced' %} +
+
+
+
+
+ + {{ f.form.scheduled_from }} +
+
+ + {{ f.form.is_active }} +
+
+
+
+ + {{ f.form.scheduled_till }} +
+
-
-
-
-
-
- {% trans 'Recruitment' %} -
-
-
-
-
- - {{ f.form.recruitment_id }} -
- -
- - {{ f.form.job_position_id }} -
- -
- - {{ f.form.start_date }} -
-
- - {{ f.form.recruitment_id__closed }} -
- -
- - {{ f.form.stage_id__stage_type }} -
-
- - {{ f.form.stage_id__stage_managers }} -
-
-
-
- - {{ f.form.stage_id }} -
-
- - {{ f.form.job_position_id__department_id }} -
- -
- - {{ f.form.recruitment_id__company_id }} -
- -
- - {{ f.form.recruitment_id__recruitment_managers }} -
-
- - {{ f.form.end_date }} -
-
- - {{ f.form.skillzonecandidate_set__skill_zone_id }} -
-
-
-
-
- -
-
- {% trans 'Advanced' %} -
-
-
-
-
- - {{ f.form.scheduled_from }} -
-
- - {{ f.form.is_active }} -
-
-
-
- - {{ f.form.scheduled_till }} -
-
-
-
-
+ + {% include "country.js" %} + diff --git a/recruitment/templates/candidate/interview_list.html b/recruitment/templates/candidate/interview_list.html index ca0ad407e..b5c940392 100644 --- a/recruitment/templates/candidate/interview_list.html +++ b/recruitment/templates/candidate/interview_list.html @@ -86,7 +86,7 @@ {% if perms.recruitment.change_interviewschedule or request.user.employee_get in interview.employee_id.all %} diff --git a/recruitment/templates/candidate/interview_nav.html b/recruitment/templates/candidate/interview_nav.html index 2e2fff9f7..15a01aeb2 100644 --- a/recruitment/templates/candidate/interview_nav.html +++ b/recruitment/templates/candidate/interview_nav.html @@ -1,155 +1,133 @@ {% load i18n %}{% load static recruitmentfilters %} -
-
-

- {% trans "Scheduled Interviews" %} -

-
-
-
+
+
+

+ {% trans "Scheduled Interviews" %} +

+
+ +
-
-
- - -
-
- -
diff --git a/recruitment/templates/pipeline/pipeline_components/schedule_interview_update.html b/recruitment/templates/pipeline/pipeline_components/schedule_interview_update.html index f5499936f..8ff52241d 100644 --- a/recruitment/templates/pipeline/pipeline_components/schedule_interview_update.html +++ b/recruitment/templates/pipeline/pipeline_components/schedule_interview_update.html @@ -9,72 +9,42 @@ diff --git a/recruitment/templates/recruitment/filters.html b/recruitment/templates/recruitment/filters.html index 5e4411e28..ab7eaa42a 100644 --- a/recruitment/templates/recruitment/filters.html +++ b/recruitment/templates/recruitment/filters.html @@ -1,73 +1,69 @@ {% load i18n %}{% load static %} -
+
-
{% trans "Recruitment" %}
-
-
-
-
- - {{f.form.recruitment_managers}} -
-
- - {{f.form.start_date}} -
-
- - {% comment %} {{f.form.closed}} {% endcomment %} - -
+
{% trans "Recruitment" %}
+
+
+
+
+ + {{f.form.recruitment_managers}} +
+
+ + {{f.form.start_date}} +
+
+ + {% comment %} {{f.form.closed}} {% endcomment %} + {{f.form.closed}} +
+
+
+
+ + {{f.form.company_id}} +
+
+ + {{f.form.end_date}} +
+
+ + {{f.form.is_published}} +
+
+
-
-
- - {{f.form.company_id}} -
-
- - {{f.form.end_date}} -
-
- - {{f.form.is_published}} -
-
-
-
-
-
{% trans "Advanced" %}
-
-
-
-
- - {{f.form.start_from}} -
-
- - {{f.form.is_active}} -
+
+
{% trans "Advanced" %}
+
+
+
+
+ + {{f.form.start_from}} +
+
+ + {{f.form.is_active}} +
+
+
+
+ + {{f.form.end_till}} +
+
+
-
-
- - {{f.form.end_till}} -
-
-
-
- + diff --git a/recruitment/templates/skill_zone/skill_zone_nav.html b/recruitment/templates/skill_zone/skill_zone_nav.html index d3ff27357..046a9caf7 100644 --- a/recruitment/templates/skill_zone/skill_zone_nav.html +++ b/recruitment/templates/skill_zone/skill_zone_nav.html @@ -18,8 +18,7 @@ + onkeyup="$('.filterButton').click()" />
@@ -28,7 +27,8 @@ {% trans "Filter" %}
-