2023-06-06 12:27:41 +05:30
|
|
|
"""
|
|
|
|
|
filters.py
|
|
|
|
|
Used to register filter for onboarding models
|
|
|
|
|
"""
|
2024-02-15 12:12:23 +05:30
|
|
|
|
2025-06-11 14:36:06 +05:30
|
|
|
import django_filters
|
2023-05-10 15:06:57 +05:30
|
|
|
from django import forms
|
2024-02-15 12:12:23 +05:30
|
|
|
from django_filters import filters
|
2024-05-07 12:23:36 +05:30
|
|
|
|
2023-12-01 15:36:51 +05:30
|
|
|
from base.filters import FilterSet
|
2025-05-19 16:51:04 +05:30
|
|
|
from base.models import Company
|
|
|
|
|
from employee.models import Employee
|
2025-06-11 14:36:06 +05:30
|
|
|
from horilla.filters import HorillaFilterSet
|
|
|
|
|
from onboarding.models import (
|
|
|
|
|
CandidateStage,
|
|
|
|
|
CandidateTask,
|
2025-08-19 16:19:28 +05:30
|
|
|
OnboardingCandidate,
|
2025-06-11 14:36:06 +05:30
|
|
|
OnboardingStage,
|
|
|
|
|
OnboardingTask,
|
|
|
|
|
)
|
|
|
|
|
from recruitment.filters import RecruitmentFilter as rec_filter
|
|
|
|
|
from recruitment.models import Candidate, Recruitment
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CandidateTaskFilter(HorillaFilterSet):
|
|
|
|
|
"""
|
|
|
|
|
Task filter class
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
"""
|
|
|
|
|
Meta
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
model = CandidateTask
|
|
|
|
|
fields = "__all__"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RecruitmentFilter(rec_filter):
|
|
|
|
|
"""
|
|
|
|
|
RecruitmentFilter
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
search = django_filters.CharFilter(method="filter_by_name")
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
"""
|
|
|
|
|
Meta
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
model = Recruitment
|
|
|
|
|
fields = "__all__"
|
|
|
|
|
|
|
|
|
|
def filter_by_name(self, queryset, _, value):
|
|
|
|
|
"""
|
|
|
|
|
Filter queryset by first name or last name.
|
|
|
|
|
"""
|
|
|
|
|
# Split the search value into first name and last name
|
|
|
|
|
parts = value.split()
|
|
|
|
|
first_name = parts[0]
|
|
|
|
|
last_name = " ".join(parts[1:]) if len(parts) > 1 else ""
|
|
|
|
|
|
|
|
|
|
job_queryset = (
|
|
|
|
|
queryset.filter(open_positions__job_position__icontains=value)
|
|
|
|
|
| queryset.filter(title__icontains=value)
|
|
|
|
|
| queryset.filter(onboarding_stage__stage_title__icontains=value)
|
|
|
|
|
| queryset.filter(
|
|
|
|
|
onboarding_stage__candidate__candidate_id__name__icontains=value
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
if first_name and last_name:
|
|
|
|
|
queryset = queryset.filter(
|
|
|
|
|
recruitment_managers__employee_first_name__icontains=first_name,
|
|
|
|
|
recruitment_managers__employee_last_name__icontains=last_name,
|
|
|
|
|
)
|
|
|
|
|
elif first_name:
|
|
|
|
|
queryset = queryset.filter(
|
|
|
|
|
recruitment_managers__employee_first_name__icontains=first_name
|
|
|
|
|
)
|
|
|
|
|
elif last_name:
|
|
|
|
|
queryset = queryset.filter(
|
|
|
|
|
recruitment_managers__employee_last_name__icontains=last_name
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
queryset = queryset | job_queryset
|
|
|
|
|
return queryset.distinct()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PipelineCandidateFilter(FilterSet):
|
|
|
|
|
"""
|
|
|
|
|
FilterSet class for Candidate model
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
search = django_filters.CharFilter(method="search_by_name", lookup_expr="icontains")
|
|
|
|
|
tasks = filters.ModelMultipleChoiceFilter(
|
|
|
|
|
field_name="candidate_id__candidate_task__onboarding_task_id",
|
|
|
|
|
queryset=OnboardingTask.objects.all(),
|
|
|
|
|
)
|
|
|
|
|
task_status = filters.ChoiceFilter(
|
|
|
|
|
field_name="candidate_id__candidate_task__onboarding_task_id__status",
|
|
|
|
|
choices=CandidateTask.choice,
|
|
|
|
|
)
|
|
|
|
|
candidate = django_filters.ModelMultipleChoiceFilter(
|
|
|
|
|
queryset=Candidate.objects.all(),
|
|
|
|
|
field_name="name",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
start_date = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__recruitment_id__start_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
end_date = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__recruitment_id__end_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
scheduled_from = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__candidate_interview__interview_date",
|
|
|
|
|
lookup_expr="gte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
probation_end = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__probation_end",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
probation_end_till = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__probation_end",
|
|
|
|
|
lookup_expr="lte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
probation_end_from = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__probation_end",
|
|
|
|
|
lookup_expr="gte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
schedule_date = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__schedule_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
interview_date = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__candidate_interview__interview_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
scheduled_till = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_id__candidate_interview__interview_date",
|
|
|
|
|
lookup_expr="lte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
recruitment = django_filters.CharFilter(
|
|
|
|
|
field_name="candidate_id__recruitment_id__title", lookup_expr="icontains"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
portal_sent = django_filters.BooleanFilter(
|
|
|
|
|
field_name="onboarding_portal",
|
|
|
|
|
method="filter_mail_sent",
|
|
|
|
|
widget=django_filters.widgets.BooleanWidget(),
|
|
|
|
|
)
|
|
|
|
|
joining_set = django_filters.BooleanFilter(
|
|
|
|
|
field_name="joining_date",
|
|
|
|
|
method="filter_joining_set",
|
|
|
|
|
widget=django_filters.widgets.BooleanWidget(),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
"""
|
|
|
|
|
Meta class to add some additional options
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
model = CandidateStage
|
|
|
|
|
fields = "__all__"
|
|
|
|
|
|
|
|
|
|
def search_by_name(self, queryset, _, value):
|
|
|
|
|
"""
|
|
|
|
|
Search by name
|
|
|
|
|
"""
|
|
|
|
|
queryset = (
|
|
|
|
|
queryset.filter(candidate_id__name__icontains=value)
|
|
|
|
|
| queryset.filter(onboarding_stage_id__stage_title__icontains=value)
|
|
|
|
|
| queryset.filter(candidate_id__recruitment_id__title__icontains=value)
|
|
|
|
|
)
|
|
|
|
|
return queryset.distinct()
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
2025-08-19 16:19:28 +05:30
|
|
|
class KanbanCandidateFilter(FilterSet):
|
|
|
|
|
"""
|
|
|
|
|
FilterSet class for Candidate model
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
search = django_filters.CharFilter(method="search_by_name", lookup_expr="icontains")
|
|
|
|
|
tasks = filters.ModelMultipleChoiceFilter(
|
|
|
|
|
field_name="candidate_task__onboarding_task_id",
|
|
|
|
|
queryset=OnboardingTask.objects.all(),
|
|
|
|
|
)
|
|
|
|
|
task_status = filters.ChoiceFilter(
|
|
|
|
|
field_name="candidate_task__onboarding_task_id__status",
|
|
|
|
|
choices=CandidateTask.choice,
|
|
|
|
|
)
|
|
|
|
|
candidate = django_filters.ModelMultipleChoiceFilter(
|
|
|
|
|
queryset=Candidate.objects.all(),
|
|
|
|
|
field_name="name",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
start_date = django_filters.DateFilter(
|
|
|
|
|
field_name="recruitment_id__start_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
end_date = django_filters.DateFilter(
|
|
|
|
|
field_name="recruitment_id__end_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
scheduled_from = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_interview__interview_date",
|
|
|
|
|
lookup_expr="gte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
probation_end = django_filters.DateFilter(
|
|
|
|
|
field_name="probation_end",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
probation_end_till = django_filters.DateFilter(
|
|
|
|
|
field_name="probation_end",
|
|
|
|
|
lookup_expr="lte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
probation_end_from = django_filters.DateFilter(
|
|
|
|
|
field_name="probation_end",
|
|
|
|
|
lookup_expr="gte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
schedule_date = django_filters.DateFilter(
|
|
|
|
|
field_name="schedule_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
interview_date = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_interview__interview_date",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
scheduled_till = django_filters.DateFilter(
|
|
|
|
|
field_name="candidate_interview__interview_date",
|
|
|
|
|
lookup_expr="lte",
|
|
|
|
|
widget=forms.DateInput(attrs={"type": "date"}),
|
|
|
|
|
)
|
|
|
|
|
recruitment = django_filters.CharFilter(
|
|
|
|
|
field_name="recruitment_id__title", lookup_expr="icontains"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
portal_sent = django_filters.BooleanFilter(
|
|
|
|
|
field_name="onboarding_portal",
|
|
|
|
|
method="filter_mail_sent",
|
|
|
|
|
widget=django_filters.widgets.BooleanWidget(),
|
|
|
|
|
)
|
|
|
|
|
joining_set = django_filters.BooleanFilter(
|
|
|
|
|
field_name="joining_date",
|
|
|
|
|
method="filter_joining_set",
|
|
|
|
|
widget=django_filters.widgets.BooleanWidget(),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
"""
|
|
|
|
|
Meta class to add some additional options
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
model = OnboardingCandidate
|
|
|
|
|
fields = [
|
|
|
|
|
field.name
|
|
|
|
|
for field in OnboardingCandidate._meta.fields
|
|
|
|
|
if field.name not in ["profile", "resume"]
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def search_by_name(self, queryset, _, value):
|
|
|
|
|
"""
|
|
|
|
|
Search by name
|
|
|
|
|
"""
|
|
|
|
|
queryset = (
|
|
|
|
|
queryset.filter(name__icontains=value)
|
|
|
|
|
| queryset.filter(
|
|
|
|
|
onboarding_stage__onboarding_stage_id__stage_title__icontains=value
|
|
|
|
|
)
|
|
|
|
|
| queryset.filter(recruitment_id__title__icontains=value)
|
|
|
|
|
)
|
|
|
|
|
return queryset.distinct()
|
|
|
|
|
|
|
|
|
|
|
2023-05-10 15:06:57 +05:30
|
|
|
class CandidateFilter(FilterSet):
|
2023-06-06 12:27:41 +05:30
|
|
|
"""
|
|
|
|
|
FilterSet class for Candidate model
|
|
|
|
|
"""
|
2023-05-10 15:06:57 +05:30
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
name = filters.CharFilter(field_name="name", lookup_expr="icontains")
|
2023-05-10 15:06:57 +05:30
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
class Meta:
|
|
|
|
|
"""
|
|
|
|
|
Meta class to add some additional options
|
|
|
|
|
"""
|
2023-05-10 15:06:57 +05:30
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
model = Candidate
|
|
|
|
|
fields = {}
|
2024-02-15 12:12:23 +05:30
|
|
|
|
|
|
|
|
|
2025-06-11 14:36:06 +05:30
|
|
|
class OnboardingStageFilter(HorillaFilterSet):
|
2024-02-15 12:12:23 +05:30
|
|
|
"""
|
|
|
|
|
OnboardingStageFilter
|
|
|
|
|
"""
|
|
|
|
|
|
2024-03-10 19:37:46 +05:30
|
|
|
search_onboarding = filters.CharFilter(
|
|
|
|
|
field_name="stage_title", method="pipeline_search"
|
|
|
|
|
)
|
2025-06-11 14:36:06 +05:30
|
|
|
search = filters.CharFilter(
|
|
|
|
|
method="search_method",
|
|
|
|
|
)
|
2024-02-15 12:12:23 +05:30
|
|
|
|
2025-05-19 16:51:04 +05:30
|
|
|
employee_id = filters.ModelChoiceFilter(
|
|
|
|
|
queryset=Employee.objects.all(), label="Stage Manager"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
onboarding_task__task_title = filters.CharFilter(
|
|
|
|
|
field_name="onboarding_task__task_title", lookup_expr="icontains", label="Task"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
onboarding_task__employee_id = filters.ModelChoiceFilter(
|
|
|
|
|
field_name="onboarding_task__employee_id",
|
|
|
|
|
queryset=Employee.objects.all(),
|
|
|
|
|
label="Task Manager",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
recruitment_id__company_id = filters.ModelChoiceFilter(
|
|
|
|
|
field_name="recruitment_id__company_id",
|
|
|
|
|
queryset=Company.objects.all(),
|
|
|
|
|
label="Company",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
onboarding_task__candidates = filters.ModelChoiceFilter(
|
|
|
|
|
field_name="onboarding_task__candidates",
|
|
|
|
|
queryset=Candidate.objects.all(),
|
|
|
|
|
label="Candidates",
|
|
|
|
|
)
|
|
|
|
|
|
2024-02-15 12:12:23 +05:30
|
|
|
class Meta:
|
|
|
|
|
model = OnboardingStage
|
2025-06-11 14:36:06 +05:30
|
|
|
fields = [
|
|
|
|
|
"recruitment_id",
|
|
|
|
|
"stage_title",
|
|
|
|
|
"employee_id",
|
|
|
|
|
"sequence",
|
|
|
|
|
"is_final_stage",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
self.form.fields["employee_id"].widget.attrs.update({"style": "width:100%;"})
|
|
|
|
|
|
|
|
|
|
def search_method(self, queryset, _, value):
|
|
|
|
|
"""
|
|
|
|
|
Search by name
|
|
|
|
|
"""
|
|
|
|
|
parts = value.split()
|
|
|
|
|
first_name = parts[0]
|
|
|
|
|
last_name = " ".join(parts[1:]) if len(parts) > 1 else ""
|
|
|
|
|
recruitment_query = (
|
|
|
|
|
queryset.filter(recruitment_id__title__icontains=value)
|
|
|
|
|
| queryset.filter(candidate__candidate_id__name__icontains=value)
|
|
|
|
|
| queryset.filter(
|
|
|
|
|
recruitment_id__onboarding_stage__candidate__candidate_id__name__icontains=value
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
# Filter the queryset by first name and last name
|
|
|
|
|
stage_queryset = queryset.filter(stage_title__icontains=value)
|
|
|
|
|
if first_name and last_name:
|
|
|
|
|
queryset = queryset.filter(
|
|
|
|
|
employee_id__employee_first_name__icontains=first_name,
|
|
|
|
|
employee_id__employee_last_name__icontains=last_name,
|
|
|
|
|
)
|
|
|
|
|
elif first_name:
|
|
|
|
|
queryset = queryset.filter(
|
|
|
|
|
employee_id__employee_first_name__icontains=first_name
|
|
|
|
|
)
|
|
|
|
|
elif last_name:
|
|
|
|
|
queryset = queryset.filter(
|
|
|
|
|
employee_id__employee_last_name__icontains=last_name
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
queryset = queryset | stage_queryset | recruitment_query
|
|
|
|
|
return queryset.distinct()
|
2024-02-15 12:12:23 +05:30
|
|
|
|
|
|
|
|
def pipeline_search(self, queryset, _, value):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to search recruitment
|
|
|
|
|
"""
|
2024-03-10 19:37:46 +05:30
|
|
|
queryset = queryset.filter(stage_title__icontains=value) | queryset.filter(
|
|
|
|
|
candidate__candidate_id__name__icontains=value
|
2024-02-15 12:12:23 +05:30
|
|
|
)
|
|
|
|
|
return queryset.distinct()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OnboardingCandidateFilter(FilterSet):
|
|
|
|
|
"""
|
|
|
|
|
OnboardingStageFilter
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
search_onboarding = filters.CharFilter(
|
|
|
|
|
field_name="candidate_id__name", lookup_expr="icontains"
|
|
|
|
|
)
|
2025-06-11 14:36:06 +05:30
|
|
|
stage_id = filters.CharFilter(field_name="onboarding_stage_id")
|
|
|
|
|
country = filters.CharFilter(field_name="candidate_id___country")
|
|
|
|
|
state = filters.CharFilter(field_name="candidate_id___state")
|
|
|
|
|
tasks = filters.ModelMultipleChoiceFilter(
|
|
|
|
|
field_name="candidate_id__candidate_task__onboarding_task_id",
|
|
|
|
|
queryset=OnboardingTask.objects.all(),
|
|
|
|
|
)
|
2024-02-15 12:12:23 +05:30
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = CandidateStage
|
|
|
|
|
fields = "__all__"
|
2025-06-11 14:36:06 +05:30
|
|
|
|
|
|
|
|
def __init__(self, data=None, queryset=None, *, request=None, prefix=None):
|
|
|
|
|
super().__init__(data, queryset, request=request, prefix=prefix)
|
|
|
|
|
self.form.fields["tasks"].widget.attrs.update({"style": "width:100%;"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OnboardingTaskFilter(FilterSet):
|
|
|
|
|
"""
|
|
|
|
|
Onboarding task filter
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
search_onboarding = filters.CharFilter(
|
|
|
|
|
field_name="task_title", lookup_expr="icontains"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = OnboardingTask
|
|
|
|
|
fields = "__all__"
|