[UPDT] OFFBOARDING: Updated models in offboarding by adding abstract class

This commit is contained in:
Horilla
2024-04-15 13:27:41 +05:30
parent 58eca9b049
commit 46d34f2d83
4 changed files with 72 additions and 76 deletions

View File

@@ -35,6 +35,7 @@ class OffboardingForm(ModelForm):
class Meta:
model = Offboarding
fields = "__all__"
exclude = ["is_active"]
def as_p(self):
"""
@@ -55,9 +56,7 @@ class OffboardingStageForm(ModelForm):
class Meta:
model = OffboardingStage
fields = "__all__"
exclude = [
"offboarding_id",
]
exclude = ["offboarding_id", "is_active"]
def as_p(self):
"""
@@ -78,7 +77,7 @@ class OffboardingEmployeeForm(ModelForm):
class Meta:
model = OffboardingEmployee
fields = "__all__"
exclude = ["notice_period", "unit"]
exclude = ["notice_period", "unit" , "is_active"]
widgets = {
"notice_period_starts": forms.DateInput(attrs={"type": "date"}),
"notice_period_ends": forms.DateInput(attrs={"type": "date"}),
@@ -95,7 +94,7 @@ class OffboardingEmployeeForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
attrs = self.fields["employee_id"].widget.attrs
attrs["onchange"] = "intialNoticePeriod($(this))"
attrs["onchange"] = "initialNoticePeriod($(this))"
self.fields["employee_id"].widget.attrs.update(attrs)
attrs = self.fields["notice_period_starts"].widget.attrs
attrs["onchange"] = "noticePeriodUpdate($(this))"
@@ -145,6 +144,7 @@ class NoteForm(ModelForm):
class Meta:
model = OffboardingNote
fields = "__all__"
exclude = ["is_active"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -161,20 +161,20 @@ class NoteForm(ModelForm):
def save(self, commit: bool = ...) -> Any:
multiple_attachment_ids = []
attachemnts = None
attachments = None
if self.files.getlist("attachment"):
attachemnts = self.files.getlist("attachment")
self.instance.attachemnt = attachemnts[0]
attachments = self.files.getlist("attachment")
self.instance.attachment = attachments[0]
multiple_attachment_ids = []
for attachemnt in attachemnts:
for attachment in attachments:
file_instance = OffboardingStageMultipleFile()
file_instance.attachment = attachemnt
file_instance.attachment = attachment
file_instance.save()
multiple_attachment_ids.append(file_instance.pk)
instance = super().save(commit)
if commit:
instance.attachments.add(*multiple_attachment_ids)
return instance, attachemnts
return instance, attachments
class TaskForm(ModelForm):
@@ -191,9 +191,7 @@ class TaskForm(ModelForm):
class Meta:
model = OffboardingTask
fields = "__all__"
exclude = [
"status",
]
exclude = ["status", "is_active"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -222,7 +220,7 @@ class TaskForm(ModelForm):
if commit:
employees = self.cleaned_data["tasks_to"]
for employee in employees:
assinged_task = EmployeeTask.objects.get_or_create(
assigned_task = EmployeeTask.objects.get_or_create(
employee_id=employee,
task_id=self.instance,
)
@@ -242,6 +240,7 @@ class ResignationLetterForm(ModelForm):
class Meta:
model = ResignationLetter
fields = "__all__"
exclude = ["is_active"]
def as_p(self):
"""

View File

@@ -3,6 +3,8 @@ from datetime import date, timedelta
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _
from horilla.models import HorillaModel
from base import thread_local_middleware
from base.horilla_company_manager import HorillaCompanyManager
from base.models import Company
@@ -16,18 +18,16 @@ from payroll.models.models import Contract
# Create your models here.
class Offboarding(models.Model):
class Offboarding(HorillaModel):
"""
Offboarding model
"""
statuses = [("ongoing", "Ongoing"), ("completed", "Completed")]
statuses = [("ongoing", _("Ongoing")), ("completed", _("Completed"))]
title = models.CharField(max_length=20)
description = models.TextField(max_length=255)
managers = models.ManyToManyField(Employee)
created_at = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=10, default="ongoing", choices=statuses)
is_active = models.BooleanField(default=True)
company_id = models.ForeignKey(
Company, on_delete=models.CASCADE, null=True, editable=False
)
@@ -57,18 +57,18 @@ class Offboarding(models.Model):
return
class OffboardingStage(models.Model):
class OffboardingStage(HorillaModel):
"""
Offboarding model
"""
types = [
("notice_period", "Notice period"),
("fnf", "FnF Settlement"),
("other", "Other"),
("interview", "Interview"),
("handover", "Work handover"),
("archived", "Archived"),
("notice_period", _("Notice period")),
("fnf", _("FnF Settlement")),
("other", _("Other")),
("interview", _("Interview")),
("handover", _("Work handover")),
("archived", _("Archived")),
]
title = models.CharField(max_length=20)
@@ -76,7 +76,6 @@ class OffboardingStage(models.Model):
offboarding_id = models.ForeignKey(Offboarding, on_delete=models.CASCADE)
managers = models.ManyToManyField(Employee)
sequence = models.IntegerField(default=0, editable=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self) -> str:
return str(self.title)
@@ -101,16 +100,15 @@ def create_initial_stage(sender, instance, created, **kwargs):
initial_stage.save()
class OffboardingStageMultipleFile(models.Model):
class OffboardingStageMultipleFile(HorillaModel):
"""
OffboardingStageMultipleFile
"""
attachment = models.FileField(upload_to="offboarding/attachments")
created_at = models.DateTimeField(auto_now_add=True)
class OffboardingEmployee(models.Model):
class OffboardingEmployee(HorillaModel):
"""
OffboardingEmployee model / Employee on stage
"""
@@ -126,7 +124,6 @@ class OffboardingEmployee(models.Model):
unit = models.CharField(max_length=10, choices=units, default="month", null=True)
notice_period_starts = models.DateField(null=True)
notice_period_ends = models.DateField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
objects = HorillaCompanyManager(
related_company_field="employee_id__employee_work_info__company_id"
)
@@ -135,15 +132,15 @@ class OffboardingEmployee(models.Model):
return self.employee_id.get_full_name()
class ResignationLetter(models.Model):
class ResignationLetter(HorillaModel):
"""
Resignation Request Employee model
"""
statuses = [
("requested", "Requested"),
("approved", "Approved"),
("rejected", "Rejected"),
("requested", _("Requested")),
("approved", _("Approved")),
("rejected", _("Rejected")),
]
employee_id = models.ForeignKey(
Employee, on_delete=models.CASCADE, verbose_name="Employee"
@@ -155,8 +152,6 @@ class ResignationLetter(models.Model):
offboarding_employee_id = models.ForeignKey(
OffboardingEmployee, on_delete=models.CASCADE, editable=False, null=True
)
created_at = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
objects = HorillaCompanyManager(
related_company_field="employee_id__employee_work_info__company_id"
)
@@ -191,7 +186,8 @@ class ResignationLetter(models.Model):
).first()
try:
notice_period_ends = (
notice_period_starts + timedelta (contract_notice_end_date.notice_period_in_days)
notice_period_starts
+ timedelta(contract_notice_end_date.notice_period_in_days)
if contract_notice_end_date
else notice_period_ends
)
@@ -221,7 +217,7 @@ class ResignationLetter(models.Model):
offboarding_employee.save()
class OffboardingTask(models.Model):
class OffboardingTask(HorillaModel):
"""
OffboardingTask model
"""
@@ -239,22 +235,20 @@ class OffboardingTask(models.Model):
class Meta:
unique_together = ["title", "stage_id"]
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self) -> str:
return self.title
class EmployeeTask(models.Model):
class EmployeeTask(HorillaModel):
"""
EmployeeTask model
"""
statuses = [
("todo", "Todo"),
("inprogress", "In progress"),
("stuck", "Stuck"),
("completed", "Completed"),
("todo", _("Todo")),
("in_progress", _("In progress")),
("stuck", _("Stuck")),
("completed", _("Completed")),
]
employee_id = models.ForeignKey(
OffboardingEmployee,
@@ -262,7 +256,7 @@ class EmployeeTask(models.Model):
verbose_name="Employee",
null=True,
)
status = models.CharField(max_length=10, choices=statuses, default="todo")
status = models.CharField(max_length=20, choices=statuses, default="todo")
task_id = models.ForeignKey(OffboardingTask, on_delete=models.CASCADE)
description = models.TextField(null=True, editable=False, max_length=255)
history = HorillaAuditLog(
@@ -271,7 +265,6 @@ class EmployeeTask(models.Model):
HorillaAuditInfo,
],
)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ["employee_id", "task_id"]
@@ -282,7 +275,7 @@ class EmployeeTask(models.Model):
notify.send(
request.user.employee_get,
recipient=self.employee_id.employee_id.employee_user_id,
verb=f'Offboarding task "{self.task_id.title}" has been assiged',
verb=f'Offboarding task "{self.task_id.title}" has been assigned',
verb_ar=f"",
verb_de=f"",
verb_es=f"",
@@ -292,7 +285,7 @@ class EmployeeTask(models.Model):
)
class ExitReason(models.Model):
class ExitReason(HorillaModel):
"""
ExitReason model
"""
@@ -302,10 +295,10 @@ class ExitReason(models.Model):
offboarding_employee_id = models.ForeignKey(
OffboardingEmployee, on_delete=models.PROTECT
)
attacments = models.ManyToManyField(OffboardingStageMultipleFile)
attachments = models.ManyToManyField(OffboardingStageMultipleFile)
class OffboardingNote(models.Model):
class OffboardingNote(HorillaModel):
"""
OffboardingNote
"""
@@ -323,7 +316,6 @@ class OffboardingNote(models.Model):
stage_id = models.ForeignKey(
OffboardingStage, on_delete=models.PROTECT, null=True, editable=False
)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ["-created_at"]
@@ -338,7 +330,7 @@ class OffboardingNote(models.Model):
return super().save(*args, **kwargs)
class OffboardingGeneralSetting(models.Model):
class OffboardingGeneralSetting(HorillaModel):
"""
OffboardingGeneralSettings
"""

View File

@@ -13,7 +13,7 @@
<script>
// intial select notice period starts and end
function intialNoticePeriod($element) {
function initialNoticePeriod($element) {
let employeeId = $element.val()
$.ajax({
type: 'get',

View File

@@ -111,7 +111,7 @@ def pipeline_grouper(filters={}, offboardings=[]):
)
def pipeline(request):
"""
Offboarding pipleine view
Offboarding pipeline view
"""
offboardings = PipelineFilter().qs
groups = pipeline_grouper({}, offboardings)
@@ -280,21 +280,24 @@ def delete_employee(request):
"""
employee_ids = request.GET.getlist("employee_ids")
instances = OffboardingEmployee.objects.filter(id__in=employee_ids)
OffboardingEmployee.objects.filter(id__in=employee_ids).delete()
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",
)
if instances:
instances.delete()
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",
)
else:
messages.error(request, _("Employees note found"))
return redirect(pipeline)
@@ -556,10 +559,10 @@ def task_assign(request):
task = OffboardingTask.objects.get(id=task_id)
for employee in employees:
try:
assinged_task = EmployeeTask()
assinged_task.employee_id = employee
assinged_task.task_id = task
assinged_task.save()
assigned_task = EmployeeTask()
assigned_task.employee_id = employee
assigned_task.task_id = task
assigned_task.save()
except:
pass
offboarding = employees.first().stage_id.offboarding_id
@@ -739,7 +742,9 @@ def delete_resignation_request(request):
ids = request.GET.getlist("letter_ids")
ResignationLetter.objects.filter(id__in=ids).delete()
messages.success(request, _("Resignation letter deleted"))
if request.META.get("HTTP_REFERER") and request.META.get("HTTP_REFERER").endswith("employee-profile/"):
if request.META.get("HTTP_REFERER") and request.META.get("HTTP_REFERER").endswith(
"employee-profile/"
):
return redirect("/employee/employee-profile/")
else:
return redirect(request_view)