Files
ihrm/onboarding/cbv/onboarding_view.py

263 lines
9.8 KiB
Python

"""
This page handles the cbv methods for onboarding view
"""
import contextlib
from typing import Any
from django import forms
from django.contrib import messages
from django.http import HttpResponse
from django.shortcuts import render
from django.urls import reverse
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from employee.models import Employee
from horilla_views.cbv_methods import login_required
from horilla_views.generic.cbv.views import HorillaDetailedView, HorillaFormView
from notifications.signals import notify
from onboarding.cbv_decorators import (
recruitment_manager_can_enter,
stage_manager_can_enter,
)
from onboarding.forms import (
OnboardingTaskForm,
OnboardingViewStageForm,
OnboardingViewTaskForm,
)
from onboarding.models import CandidateTask, OnboardingStage, OnboardingTask
from recruitment.models import Candidate
@method_decorator(login_required, name="dispatch")
@method_decorator(
recruitment_manager_can_enter("onboarding.add_onboardingstage"), name="dispatch"
)
class StageCreateForm(HorillaFormView):
"""
Form view for create and update stage
"""
form_class = OnboardingViewStageForm
model = OnboardingStage
new_display_title = _("Create Stage")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
obj_id = self.kwargs.get("obj_id")
self.form.fields["recruitment_id"].widget = forms.HiddenInput()
self.form.fields["recruitment_id"].initial = obj_id
if self.form.instance.pk:
self.form_class.verbose_name = _("Update Stage")
return context
def form_valid(self, form: OnboardingViewStageForm) -> HttpResponse:
if form.is_valid():
if form.instance.pk:
message = _("Stage Updated Successfully")
else:
message = _("New stage created successfully")
stage = form.save()
stage.employee_id.set(
Employee.objects.filter(id__in=form.data.getlist("employee_id"))
)
users = [employee.employee_user_id for employee in stage.employee_id.all()]
messages.success(self.request, _(message))
with contextlib.suppress(Exception):
notify.send(
self.request.user.employee_get,
recipient=users,
verb="You are chosen as onboarding stage manager",
verb_ar="لقد تم اختيارك كمدير مرحلة التدريب.",
verb_de="Sie wurden als Onboarding-Stage-Manager ausgewählt.",
verb_es="Ha sido seleccionado/a como responsable de etapa de incorporación.",
verb_fr="Vous avez été choisi(e) en tant que responsable de l'étape d'intégration.",
icon="people-circle",
redirect=reverse("onboarding-view"),
)
return self.HttpResponse("<script>window.location.reload();</script>")
return super().form_valid(form)
@method_decorator(login_required, name="dispatch")
@method_decorator(
stage_manager_can_enter("onboarding.add_onboardingtask"), name="dispatch"
)
class TaskCreateForm(HorillaFormView):
"""
form view for create tasks
"""
model = CandidateTask
form_class = OnboardingViewTaskForm
new_display_title = _("Create Task")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.form.fields["stage_id"].widget = forms.HiddenInput()
obj_id = self.kwargs.get("obj_id")
stage = OnboardingStage.objects.get(id=obj_id)
self.form.fields["stage_id"].initial = obj_id
candidate_ids = stage.candidate.all().values_list("candidate_id", flat=True)
cand_queryset = Candidate.objects.filter(id__in=candidate_ids)
self.form.fields["candidates"].queryset = cand_queryset
self.form.fields["candidates"].initial = cand_queryset
context["form"] = self.form
return context
def form_invalid(self, form: Any) -> HttpResponse:
if self.form.instance.pk:
self.form_class.verbose_name = _("Update Request")
if not form.is_valid():
errors = form.errors.as_data()
return render(
self.request, self.template_name, {"form": form, "errors": errors}
)
return super().form_invalid(form)
def form_valid(self, form: OnboardingTaskForm) -> HttpResponse:
if form.is_valid():
message = _("New Task Created Successfully")
candidates = self.form.cleaned_data["candidates"]
stage_id = self.form.cleaned_data["stage_id"]
managers = self.request.POST.getlist("managers")
title = self.form.cleaned_data["task_title"]
onboarding_task = OnboardingTask(task_title=title, stage_id=stage_id)
onboarding_task.save()
onboarding_task.employee_id.set(managers)
onboarding_task.candidates.set(candidates)
if candidates:
for cand in candidates:
task = CandidateTask(
candidate_id=cand,
stage_id=stage_id,
onboarding_task_id=onboarding_task,
)
task.save()
users = [
manager.employee_user_id
for manager in onboarding_task.employee_id.all()
]
notify.send(
self.request.user.employee_get,
recipient=users,
verb="You are chosen as an onboarding task manager",
verb_ar="لقد تم اختيارك كمدير مهام التدريب.",
verb_de="Sie wurden als Onboarding-Aufgabenmanager ausgewählt.",
verb_es="Ha sido seleccionado/a como responsable de tareas de incorporación.",
verb_fr="Vous avez été choisi(e) en tant que responsable des tâches d'intégration.",
icon="people-circle",
redirect=reverse("onboarding-view"),
)
messages.success(self.request, _(message))
return self.HttpResponse()
return super().form_valid(form)
@method_decorator(login_required, name="dispatch")
@method_decorator(
stage_manager_can_enter("onboarding.change_onboardingtask"), name="dispatch"
)
class TaskUpdateFormView(HorillaFormView):
"""
form view for update tasks
"""
model = OnboardingTask
form_class = OnboardingTaskForm
new_display_title = _("Update Task")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.form.fields["stage_id"].widget = forms.HiddenInput()
context["form"] = self.form
# onboarding_task = OnboardingTask.objects.get(id=self.form.instance.pk)
return context
def form_valid(self, form: OnboardingTaskForm) -> HttpResponse:
if form.is_valid():
if form.instance.pk:
onboarding_task = OnboardingTask.objects.get(id=self.form.instance.pk)
task = form.save()
task.employee_id.set(
Employee.objects.filter(id__in=form.data.getlist("employee_id"))
)
for cand_task in onboarding_task.candidatetask_set.all():
if cand_task.candidate_id not in task.candidates.all():
cand_task.delete()
else:
cand_task.stage_id = task.stage_id
messages.success(self.request, _("Task updated successfully.."))
users = [
employee.employee_user_id for employee in task.employee_id.all()
]
notify.send(
self.request.user.employee_get,
recipient=users,
verb="You are chosen as an onboarding task manager",
verb_ar="لقد تم اختيارك كمدير مهام التدريب.",
verb_de="Sie wurden als Onboarding-Aufgabenmanager ausgewählt.",
verb_es="Ha sido seleccionado/a como responsable de tareas de incorporación.",
verb_fr="Vous avez été choisi(e) en tant que responsable des tâches d'intégration.",
icon="people-circle",
redirect=reverse("onboarding-view"),
)
form.save()
return self.HttpResponse()
return super().form_valid(form)
class OnboardingCandidateDetailView(HorillaDetailedView):
"""
detail view of onboarding view
"""
def __init__(self, **kwargs: Any) -> None:
super().__init__(**kwargs)
self.body = [
(_("Job Position"), "get_job_position"),
(_("Contact"), "mobile"),
(_("Joining Date"), "joining_date"),
(_("Onboarding Portal Stage"), "onboarding_portal_html"),
(_("Status"), "onboarding_status_col"),
(_("Tasks"), "onboarding_task_col"),
]
template_name = "cbv/onboarding_view/detail_view.html"
model = Candidate
title = _("Details")
header = {
"title": "name",
"subtitle": "email",
"avatar": "get_avatar",
}
cols = {"onboarding_task_col": 12}
actions = [
{
"action": "View",
"icon": "eye-outline",
"attrs": """
class="oh-btn oh-btn--light w-50"
href="{get_individual_url}"
""",
},
{
"action": "Edit",
"icon": "create-outline",
"attrs": """
class="oh-btn oh-btn--info w-50"
href ="{get_update_url}"
""",
},
]