2024-01-23 15:21:53 +05:30
|
|
|
from django.http import HttpResponse, JsonResponse
|
|
|
|
|
from django.shortcuts import redirect, render
|
|
|
|
|
from django.contrib import messages
|
2024-01-24 12:27:28 +05:30
|
|
|
from django.contrib.auth.models import User
|
2024-01-23 15:21:53 +05:30
|
|
|
from employee.models import Employee
|
|
|
|
|
from horilla.decorators import login_required, permission_required
|
2024-01-24 12:27:28 +05:30
|
|
|
from offboarding.decorators import (
|
|
|
|
|
any_manager_can_enter,
|
|
|
|
|
offboarding_manager_can_enter,
|
|
|
|
|
offboarding_or_stage_manager_can_enter,
|
|
|
|
|
)
|
2024-01-23 15:21:53 +05:30
|
|
|
from offboarding.forms import (
|
|
|
|
|
NoteForm,
|
|
|
|
|
OffboardingEmployeeForm,
|
|
|
|
|
OffboardingForm,
|
|
|
|
|
OffboardingStageForm,
|
|
|
|
|
StageSelectForm,
|
|
|
|
|
TaskForm,
|
|
|
|
|
)
|
|
|
|
|
from offboarding.models import (
|
|
|
|
|
EmployeeTask,
|
|
|
|
|
Offboarding,
|
|
|
|
|
OffboardingEmployee,
|
|
|
|
|
OffboardingNote,
|
|
|
|
|
OffboardingStage,
|
|
|
|
|
OffboardingStageMultipleFile,
|
|
|
|
|
OffboardingTask,
|
|
|
|
|
)
|
2024-01-24 12:27:28 +05:30
|
|
|
from notifications.signals import notify
|
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
2024-01-23 15:21:53 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create your views here.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-01-24 12:27:28 +05:30
|
|
|
@any_manager_can_enter(
|
|
|
|
|
"offboarding.view_offboarding", offboarding_employee_can_enter=True
|
|
|
|
|
)
|
2024-01-23 15:21:53 +05:30
|
|
|
def pipeline(request):
|
|
|
|
|
"""
|
|
|
|
|
Offboarding pipleine view
|
|
|
|
|
"""
|
|
|
|
|
offboardings = Offboarding.objects.all()
|
|
|
|
|
stage_forms = {}
|
|
|
|
|
for offboarding in offboardings:
|
|
|
|
|
stage_forms[str(offboarding.id)] = StageSelectForm(offboarding=offboarding)
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"offboarding/pipeline/pipeline.html",
|
|
|
|
|
{"offboardings": offboardings, "stage_forms": stage_forms},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@permission_required("offboarding.add_offboarding")
|
|
|
|
|
def create_offboarding(request):
|
|
|
|
|
"""
|
|
|
|
|
Create offboarding view
|
|
|
|
|
"""
|
|
|
|
|
instance_id = eval(str(request.GET.get("instance_id")))
|
|
|
|
|
instance = None
|
|
|
|
|
if instance_id and isinstance(instance_id, int):
|
|
|
|
|
instance = Offboarding.objects.filter(id=instance_id).first()
|
|
|
|
|
form = OffboardingForm(instance=instance)
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
form = OffboardingForm(request.POST, instance=instance)
|
|
|
|
|
if form.is_valid():
|
|
|
|
|
form.save()
|
2024-01-24 12:27:28 +05:30
|
|
|
messages.success(request, _("Offboarding saved"))
|
2024-01-23 15:21:53 +05:30
|
|
|
return HttpResponse("<script>window.location.reload()</script>")
|
|
|
|
|
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"offboarding/pipeline/form.html",
|
|
|
|
|
{
|
|
|
|
|
"form": form,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@permission_required("offboarding.delete_offboarding")
|
|
|
|
|
def delete_offboarding(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to delete offboardings
|
|
|
|
|
"""
|
|
|
|
|
ids = request.GET.getlits("id")
|
|
|
|
|
Offboarding.objects.filter(id__in=ids).delete()
|
2024-01-24 12:27:28 +05:30
|
|
|
messages.success(request, _("Offboarding deleted"))
|
2024-01-23 15:21:53 +05:30
|
|
|
return redirect(pipeline)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@offboarding_manager_can_enter("offboarding.add_offboardingstage")
|
|
|
|
|
def create_stage(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to create stages for offboardings
|
|
|
|
|
"""
|
|
|
|
|
offboarding_id = request.GET["offboarding_id"]
|
|
|
|
|
instance_id = eval(str(request.GET.get("instance_id")))
|
|
|
|
|
instance = None
|
|
|
|
|
if instance_id and isinstance(instance_id, int):
|
|
|
|
|
instance = OffboardingStage.objects.get(id=instance_id)
|
|
|
|
|
offboarding = Offboarding.objects.get(id=offboarding_id)
|
|
|
|
|
form = OffboardingStageForm(instance=instance)
|
|
|
|
|
form.instance.offboarding_id = offboarding
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
form = OffboardingStageForm(request.POST, instance=instance)
|
|
|
|
|
if form.is_valid():
|
|
|
|
|
instance = form.save(commit=False)
|
|
|
|
|
instance.offboarding_id = offboarding
|
|
|
|
|
instance.save()
|
|
|
|
|
instance.managers.set(form.data.getlist("managers"))
|
2024-01-24 12:27:28 +05:30
|
|
|
messages.success(request, _("Stage saved"))
|
2024-01-23 15:21:53 +05:30
|
|
|
return HttpResponse("<script>window.location.reload()</script>")
|
|
|
|
|
return render(request, "offboarding/stage/form.html", {"form": form})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@any_manager_can_enter("offboarding.add_offboardingemployee")
|
|
|
|
|
def add_employee(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to add employee to the stage
|
|
|
|
|
"""
|
|
|
|
|
stage_id = request.GET["stage_id"]
|
|
|
|
|
instance_id = eval(str(request.GET.get("instance_id")))
|
|
|
|
|
instance = None
|
|
|
|
|
if instance_id and isinstance(instance_id, int):
|
|
|
|
|
instance = OffboardingEmployee.objects.get(id=instance_id)
|
|
|
|
|
stage = OffboardingStage.objects.get(id=stage_id)
|
|
|
|
|
form = OffboardingEmployeeForm(initial={"stage_id": stage}, instance=instance)
|
|
|
|
|
form.instance.stage_id = stage
|
|
|
|
|
if request.method == "POST":
|
2024-01-24 12:27:28 +05:30
|
|
|
form = OffboardingEmployeeForm(request.POST, instance=instance)
|
2024-01-23 15:21:53 +05:30
|
|
|
if form.is_valid():
|
|
|
|
|
instance = form.save(commit=False)
|
|
|
|
|
instance.stage_id = stage
|
|
|
|
|
instance.save()
|
2024-01-24 12:27:28 +05:30
|
|
|
messages.success(request, _("Employee added to the stage"))
|
|
|
|
|
if not instance_id:
|
|
|
|
|
notify.send(
|
|
|
|
|
request.user.employee_get,
|
|
|
|
|
recipient=instance.employee_id.employee_user_id,
|
|
|
|
|
verb=f"You have been added to the {stage} of {stage.offboarding_id}",
|
|
|
|
|
verb_ar=f"",
|
|
|
|
|
verb_de=f"",
|
|
|
|
|
verb_es=f"",
|
|
|
|
|
verb_fr=f"",
|
|
|
|
|
redirect="offboarding/offboarding-pipeline",
|
|
|
|
|
icon="information",
|
|
|
|
|
)
|
2024-01-23 15:21:53 +05:30
|
|
|
return HttpResponse("<script>window.location.reload()</script>")
|
|
|
|
|
return render(request, "offboarding/employee/form.html", {"form": form})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@permission_required("offboarding.delete_offboardingemployee")
|
|
|
|
|
def delete_employee(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to delete the offboarding employee
|
|
|
|
|
"""
|
|
|
|
|
employee_ids = request.GET.getlist("employee_ids")
|
2024-01-24 12:27:28 +05:30
|
|
|
instances = OffboardingEmployee.objects.filter(id__in=employee_ids)
|
2024-01-23 15:21:53 +05:30
|
|
|
OffboardingEmployee.objects.filter(id__in=employee_ids).delete()
|
2024-01-24 12:27:28 +05:30
|
|
|
messages.success(request, _("Offboarding employee deleted"))
|
|
|
|
|
notify.send(
|
|
|
|
|
request.user.employee_get,
|
|
|
|
|
recipient=User.objects.filter(id__in=instances.values_list("employee_id__employee_user_id",flat=True)),
|
|
|
|
|
verb=f"You have been removed from the offboarding",
|
|
|
|
|
verb_ar=f"",
|
|
|
|
|
verb_de=f"",
|
|
|
|
|
verb_es=f"",
|
|
|
|
|
verb_fr=f"",
|
|
|
|
|
redirect="offboarding/offboarding-pipeline",
|
|
|
|
|
icon="information",
|
|
|
|
|
)
|
2024-01-23 15:21:53 +05:30
|
|
|
return redirect(pipeline)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@permission_required("offboarding.delete_offboardingstage")
|
|
|
|
|
def delete_stage(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to delete the offboarding stage
|
|
|
|
|
"""
|
|
|
|
|
ids = request.GET.getlist("ids")
|
|
|
|
|
OffboardingStage.objects.filter(id__in=ids).delete()
|
2024-01-24 12:27:28 +05:30
|
|
|
messages.success(request, _("Stage deleted"))
|
2024-01-23 15:21:53 +05:30
|
|
|
return redirect(pipeline)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@any_manager_can_enter("offboarding.change_offboarding")
|
|
|
|
|
def change_stage(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to update the stages of the employee
|
|
|
|
|
"""
|
|
|
|
|
employee_ids = request.GET.getlist("employee_ids")
|
|
|
|
|
stage_id = request.GET["stage_id"]
|
|
|
|
|
employees = OffboardingEmployee.objects.filter(id__in=employee_ids)
|
|
|
|
|
stage = OffboardingStage.objects.get(id=stage_id)
|
|
|
|
|
# This wont trigger the save method inside the offboarding employee
|
|
|
|
|
# employees.update(stage_id=stage)
|
|
|
|
|
for employee in employees:
|
|
|
|
|
employee.stage_id = stage
|
|
|
|
|
employee.save()
|
|
|
|
|
if stage.type == "archived":
|
|
|
|
|
Employee.objects.filter(
|
|
|
|
|
id__in=employees.values_list("employee_id__id", flat=True)
|
|
|
|
|
).update(is_active=False)
|
|
|
|
|
stage_forms = {}
|
|
|
|
|
stage_forms[str(stage.offboarding_id.id)] = StageSelectForm(
|
|
|
|
|
offboarding=stage.offboarding_id
|
|
|
|
|
)
|
2024-01-24 12:27:28 +05:30
|
|
|
notify.send(
|
|
|
|
|
request.user.employee_get,
|
|
|
|
|
recipient=User.objects.filter(id__in=employees.values_list("employee_id__employee_user_id",flat=True)),
|
|
|
|
|
verb=f"Offboarding stage has been changed",
|
|
|
|
|
verb_ar=f"",
|
|
|
|
|
verb_de=f"",
|
|
|
|
|
verb_es=f"",
|
|
|
|
|
verb_fr=f"",
|
|
|
|
|
redirect="offboarding/offboarding-pipeline",
|
|
|
|
|
icon="information",
|
|
|
|
|
)
|
2024-01-23 15:21:53 +05:30
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"offboarding/stage/offboarding_body.html",
|
2024-01-24 12:27:28 +05:30
|
|
|
{"offboarding": stage.offboarding_id, "stage_forms": stage_forms,"response_message":_("stage changed successfully.")},
|
2024-01-23 15:21:53 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-01-24 12:27:28 +05:30
|
|
|
@any_manager_can_enter("offboarding.view_offboardingnote",offboarding_employee_can_enter=True)
|
2024-01-23 15:21:53 +05:30
|
|
|
def view_notes(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to render all the notes of the employee
|
|
|
|
|
"""
|
|
|
|
|
if request.FILES:
|
|
|
|
|
files = request.FILES.getlist("files")
|
|
|
|
|
note_id = request.GET["note_id"]
|
|
|
|
|
note = OffboardingNote.objects.get(id=note_id)
|
|
|
|
|
attachments = []
|
|
|
|
|
for file in files:
|
|
|
|
|
attachment = OffboardingStageMultipleFile()
|
|
|
|
|
attachment.attachment = file
|
|
|
|
|
attachment.save()
|
|
|
|
|
attachments.append(attachment)
|
|
|
|
|
note.attachments.add(*attachments)
|
|
|
|
|
offboarding_employee_id = request.GET["employee_id"]
|
|
|
|
|
employee = OffboardingEmployee.objects.get(id=offboarding_employee_id)
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"offboarding/note/view_notes.html",
|
|
|
|
|
{
|
|
|
|
|
"employee": employee,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@any_manager_can_enter("offboarding.add_offboardingnote")
|
|
|
|
|
def add_note(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to create note for the offboarding employee
|
|
|
|
|
"""
|
|
|
|
|
employee_id = request.GET["employee_id"]
|
|
|
|
|
employee = OffboardingEmployee.objects.get(id=employee_id)
|
|
|
|
|
form = NoteForm()
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
form = NoteForm(request.POST, request.FILES)
|
|
|
|
|
form.instance.employee_id = employee
|
|
|
|
|
if form.is_valid():
|
|
|
|
|
form.save()
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
f"""
|
|
|
|
|
<div id="asfdoiioe09092u09un320" hx-get="/offboarding/view-offboarding-note?employee_id={employee.pk}"
|
|
|
|
|
hx-target="#noteContainer"
|
|
|
|
|
>
|
|
|
|
|
</div>
|
|
|
|
|
<script>
|
|
|
|
|
$("#asfdoiioe09092u09un320").click()
|
|
|
|
|
$(".oh-modal--show").removeClass("oh-modal--show")
|
|
|
|
|
</script>
|
|
|
|
|
"""
|
|
|
|
|
)
|
|
|
|
|
return render(
|
|
|
|
|
request, "offboarding/note/form.html", {"form": form, "employee": employee}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@permission_required("offboarding.delete_offboardingnote")
|
|
|
|
|
def delete_attachment(request):
|
|
|
|
|
"""
|
|
|
|
|
Used to delete attachment
|
|
|
|
|
"""
|
|
|
|
|
ids = request.GET.getlist("ids")
|
|
|
|
|
OffboardingStageMultipleFile.objects.filter(id__in=ids).delete()
|
|
|
|
|
offboarding_employee_id = request.GET["employee_id"]
|
|
|
|
|
employee = OffboardingEmployee.objects.get(id=offboarding_employee_id)
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"offboarding/note/view_notes.html",
|
|
|
|
|
{
|
|
|
|
|
"employee": employee,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@offboarding_or_stage_manager_can_enter("offboarding.add_offboardingtask")
|
|
|
|
|
def add_task(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to add offboarding tasks
|
|
|
|
|
"""
|
|
|
|
|
stage_id = request.GET.get("stage_id")
|
|
|
|
|
instance_id = eval(str(request.GET.get("instance_id")))
|
|
|
|
|
employees = OffboardingEmployee.objects.filter(stage_id=stage_id)
|
|
|
|
|
instance = None
|
|
|
|
|
if instance_id:
|
|
|
|
|
instance = OffboardingTask.objects.filter(id=instance_id).first()
|
|
|
|
|
form = TaskForm(
|
|
|
|
|
initial={
|
|
|
|
|
"stage_id": stage_id,
|
|
|
|
|
"tasks_to": employees,
|
|
|
|
|
},
|
|
|
|
|
instance=instance,
|
|
|
|
|
)
|
|
|
|
|
if request.method == "POST":
|
2024-01-24 12:27:28 +05:30
|
|
|
form = TaskForm(request.POST, instance=instance,initial={
|
|
|
|
|
"stage_id": stage_id,
|
|
|
|
|
})
|
2024-01-23 15:21:53 +05:30
|
|
|
if form.is_valid():
|
|
|
|
|
form.save()
|
|
|
|
|
messages.success(request, "Task Added")
|
|
|
|
|
return HttpResponse("<script>window.location.reload()</script>")
|
2024-01-24 12:27:28 +05:30
|
|
|
return render(request, "offboarding/task/form.html", {"form": form,})
|
2024-01-23 15:21:53 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-01-24 12:27:28 +05:30
|
|
|
@any_manager_can_enter(
|
|
|
|
|
"offboarding.change_employeetask", offboarding_employee_can_enter=True
|
|
|
|
|
)
|
|
|
|
|
def update_task_status(request,*args, **kwargs):
|
2024-01-23 15:21:53 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to update the assigned tasks status
|
|
|
|
|
"""
|
|
|
|
|
stage_id = request.GET["stage_id"]
|
|
|
|
|
employee_ids = request.GET.getlist("employee_ids")
|
|
|
|
|
task_id = request.GET["task_id"]
|
|
|
|
|
status = request.GET["task_status"]
|
2024-01-24 12:27:28 +05:30
|
|
|
employee_task = EmployeeTask.objects.filter(
|
2024-01-23 15:21:53 +05:30
|
|
|
employee_id__id__in=employee_ids, task_id__id=task_id
|
2024-01-24 12:27:28 +05:30
|
|
|
)
|
|
|
|
|
employee_task.update(status=status)
|
|
|
|
|
notify.send(
|
|
|
|
|
request.user.employee_get,
|
|
|
|
|
recipient=User.objects.filter(id__in=employee_task.values_list("task_id__managers__employee_user_id",flat=True)),
|
|
|
|
|
verb=f"Offboarding Task status has been updated",
|
|
|
|
|
verb_ar=f"",
|
|
|
|
|
verb_de=f"",
|
|
|
|
|
verb_es=f"",
|
|
|
|
|
verb_fr=f"",
|
|
|
|
|
redirect="offboarding/offboarding-pipeline",
|
|
|
|
|
icon="information",
|
|
|
|
|
)
|
2024-01-23 15:21:53 +05:30
|
|
|
stage = OffboardingStage.objects.get(id=stage_id)
|
|
|
|
|
stage_forms = {}
|
|
|
|
|
stage_forms[str(stage.offboarding_id.id)] = StageSelectForm(
|
|
|
|
|
offboarding=stage.offboarding_id
|
|
|
|
|
)
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"offboarding/stage/offboarding_body.html",
|
2024-01-24 12:27:28 +05:30
|
|
|
{"offboarding": stage.offboarding_id, "stage_forms": stage_forms,"response_message": _("Task status changed successfully.")},
|
2024-01-23 15:21:53 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@any_manager_can_enter("offboarding.add_employeetask")
|
|
|
|
|
def task_assign(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to assign task to employees
|
|
|
|
|
"""
|
|
|
|
|
employee_ids = request.GET.getlist("employee_ids")
|
|
|
|
|
task_id = request.GET["task_id"]
|
|
|
|
|
employees = OffboardingEmployee.objects.filter(id__in=employee_ids)
|
|
|
|
|
task = OffboardingTask.objects.get(id=task_id)
|
|
|
|
|
for employee in employees:
|
|
|
|
|
assinged_task = EmployeeTask()
|
|
|
|
|
assinged_task.employee_id = employee
|
|
|
|
|
assinged_task.task_id = task
|
|
|
|
|
assinged_task.save()
|
|
|
|
|
offboarding = employees.first().stage_id.offboarding_id
|
|
|
|
|
stage_forms = {}
|
|
|
|
|
stage_forms[str(offboarding.id)] = StageSelectForm(offboarding=offboarding)
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"offboarding/stage/offboarding_body.html",
|
|
|
|
|
{"offboarding": offboarding, "stage_forms": stage_forms},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@permission_required("offboarding.delete_offboardingtask")
|
|
|
|
|
def delete_task(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to delete the task
|
|
|
|
|
"""
|
|
|
|
|
task_ids = request.GET.getlist("task_ids")
|
|
|
|
|
OffboardingTask.objects.filter(id__in=task_ids).delete()
|
|
|
|
|
messages.success(request, "Task deleted")
|
|
|
|
|
return redirect(pipeline)
|
2024-01-24 16:37:52 +05:30
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def offboarding_individual_view(request,emp_id):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to get the individual view of the offboarding employees
|
|
|
|
|
parameters:
|
|
|
|
|
emp_id(int): the id of the offboarding employee
|
|
|
|
|
"""
|
|
|
|
|
employee = OffboardingEmployee.objects.get(id=emp_id)
|
|
|
|
|
tasks = EmployeeTask.objects.filter(employee_id=emp_id)
|
|
|
|
|
stage_forms = {}
|
|
|
|
|
offboarding_stages = OffboardingStage.objects.filter(offboarding_id = employee.stage_id.offboarding_id)
|
|
|
|
|
stage_forms[str(employee.stage_id.offboarding_id.id)] = StageSelectForm(offboarding=employee.stage_id.offboarding_id)
|
|
|
|
|
context = {
|
|
|
|
|
'employee':employee,
|
|
|
|
|
"tasks":tasks,
|
|
|
|
|
"choices": EmployeeTask.statuses,
|
|
|
|
|
"offboarding_stages":offboarding_stages,
|
|
|
|
|
"stage_forms":stage_forms
|
|
|
|
|
}
|
|
|
|
|
return render(request, 'offboarding/pipeline/individual_view.html', context)
|