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

View File

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

View File

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

View File

@@ -111,7 +111,7 @@ def pipeline_grouper(filters={}, offboardings=[]):
) )
def pipeline(request): def pipeline(request):
""" """
Offboarding pipleine view Offboarding pipeline view
""" """
offboardings = PipelineFilter().qs offboardings = PipelineFilter().qs
groups = pipeline_grouper({}, offboardings) groups = pipeline_grouper({}, offboardings)
@@ -280,21 +280,24 @@ def delete_employee(request):
""" """
employee_ids = request.GET.getlist("employee_ids") employee_ids = request.GET.getlist("employee_ids")
instances = OffboardingEmployee.objects.filter(id__in=employee_ids) instances = OffboardingEmployee.objects.filter(id__in=employee_ids)
OffboardingEmployee.objects.filter(id__in=employee_ids).delete() if instances:
messages.success(request, _("Offboarding employee deleted")) instances.delete()
notify.send( messages.success(request, _("Offboarding employee deleted"))
request.user.employee_get, notify.send(
recipient=User.objects.filter( request.user.employee_get,
id__in=instances.values_list("employee_id__employee_user_id", flat=True) 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=f"You have been removed from the offboarding",
verb_de=f"", verb_ar=f"",
verb_es=f"", verb_de=f"",
verb_fr=f"", verb_es=f"",
redirect="offboarding/offboarding-pipeline", verb_fr=f"",
icon="information", redirect="offboarding/offboarding-pipeline",
) icon="information",
)
else:
messages.error(request, _("Employees note found"))
return redirect(pipeline) return redirect(pipeline)
@@ -556,10 +559,10 @@ def task_assign(request):
task = OffboardingTask.objects.get(id=task_id) task = OffboardingTask.objects.get(id=task_id)
for employee in employees: for employee in employees:
try: try:
assinged_task = EmployeeTask() assigned_task = EmployeeTask()
assinged_task.employee_id = employee assigned_task.employee_id = employee
assinged_task.task_id = task assigned_task.task_id = task
assinged_task.save() assigned_task.save()
except: except:
pass pass
offboarding = employees.first().stage_id.offboarding_id offboarding = employees.first().stage_id.offboarding_id
@@ -739,7 +742,9 @@ def delete_resignation_request(request):
ids = request.GET.getlist("letter_ids") ids = request.GET.getlist("letter_ids")
ResignationLetter.objects.filter(id__in=ids).delete() ResignationLetter.objects.filter(id__in=ids).delete()
messages.success(request, _("Resignation letter deleted")) 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/") return redirect("/employee/employee-profile/")
else: else:
return redirect(request_view) return redirect(request_view)