Files
ihrm/onboarding/filters.py

431 lines
14 KiB
Python

"""
filters.py
Used to register filter for onboarding models
"""
import django_filters
from django import forms
from django_filters import filters
from base.filters import FilterSet
from base.models import Company
from employee.models import Employee
from horilla.filters import HorillaFilterSet
from onboarding.models import (
CandidateStage,
CandidateTask,
OnboardingCandidate,
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()
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()
class CandidateFilter(FilterSet):
"""
FilterSet class for Candidate model
"""
name = filters.CharFilter(field_name="name", lookup_expr="icontains")
class Meta:
"""
Meta class to add some additional options
"""
model = Candidate
fields = {}
class OnboardingStageFilter(HorillaFilterSet):
"""
OnboardingStageFilter
"""
search_onboarding = filters.CharFilter(
field_name="stage_title", method="pipeline_search"
)
search = filters.CharFilter(
method="search_method",
)
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",
)
class Meta:
model = OnboardingStage
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()
def pipeline_search(self, queryset, _, value):
"""
This method is used to search recruitment
"""
queryset = queryset.filter(stage_title__icontains=value) | queryset.filter(
candidate__candidate_id__name__icontains=value
)
return queryset.distinct()
class OnboardingCandidateFilter(FilterSet):
"""
OnboardingStageFilter
"""
search_onboarding = filters.CharFilter(
field_name="candidate_id__name", lookup_expr="icontains"
)
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(),
)
class Meta:
model = CandidateStage
fields = "__all__"
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__"