[UPDT] ATTENDANCE: Updated models in attendance app by adding abstract class
This commit is contained in:
@@ -13,7 +13,7 @@ from .models import (
|
||||
AttendanceValidationCondition,
|
||||
GraceTime,
|
||||
PenaltyAccount,
|
||||
AttendancerequestComment,
|
||||
AttendanceRequestComment,
|
||||
)
|
||||
|
||||
# Register your models here.
|
||||
@@ -24,4 +24,4 @@ admin.site.register(AttendanceLateComeEarlyOut)
|
||||
admin.site.register(AttendanceValidationCondition)
|
||||
admin.site.register(PenaltyAccount)
|
||||
admin.site.register(GraceTime)
|
||||
admin.site.register(AttendancerequestComment)
|
||||
admin.site.register(AttendanceRequestComment)
|
||||
|
||||
@@ -45,8 +45,8 @@ from attendance.models import (
|
||||
AttendanceActivity,
|
||||
AttendanceLateComeEarlyOut,
|
||||
AttendanceValidationCondition,
|
||||
AttendancerequestComment,
|
||||
AttendancerequestFile,
|
||||
AttendanceRequestComment,
|
||||
AttendanceRequestFile,
|
||||
GraceTime,
|
||||
PenaltyAccount,
|
||||
strtime_seconds,
|
||||
@@ -152,6 +152,7 @@ class AttendanceUpdateForm(ModelForm):
|
||||
"is_validate_request",
|
||||
"is_validate_request_approved",
|
||||
"attendance_overtime",
|
||||
"is_active",
|
||||
]
|
||||
model = Attendance
|
||||
widgets = {
|
||||
@@ -242,7 +243,7 @@ class AttendanceForm(ModelForm):
|
||||
|
||||
model = Attendance
|
||||
fields = "__all__"
|
||||
exclude = (
|
||||
exclude = [
|
||||
"attendance_overtime_approve",
|
||||
"attendance_overtime_calculation",
|
||||
"at_work_second",
|
||||
@@ -255,7 +256,8 @@ class AttendanceForm(ModelForm):
|
||||
"is_validate_request",
|
||||
"is_validate_request_approved",
|
||||
"attendance_overtime",
|
||||
)
|
||||
"is_active",
|
||||
]
|
||||
widgets = {
|
||||
"attendance_clock_in": DateTimeInput(attrs={"type": "time"}),
|
||||
"attendance_clock_out": DateTimeInput(attrs={"type": "time"}),
|
||||
@@ -435,6 +437,7 @@ class AttendanceOverTimeForm(ModelForm):
|
||||
"overtime_second",
|
||||
"month_sequence",
|
||||
"hour_pending_second",
|
||||
"is_active",
|
||||
]
|
||||
labels = {
|
||||
"employee_id": _("Employee"),
|
||||
@@ -505,6 +508,7 @@ class AttendanceValidationConditionForm(forms.ModelForm):
|
||||
"overtime_cutoff": _("Maximum Allowed Overtime Per Day"),
|
||||
}
|
||||
fields = "__all__"
|
||||
exclude = ["is_active"]
|
||||
|
||||
|
||||
class AttendanceRequestForm(ModelForm):
|
||||
@@ -806,12 +810,12 @@ class GraceTimeForm(ModelForm):
|
||||
"allowed_time": forms.TextInput(attrs={"placeholder": "00:00 minutes"}),
|
||||
}
|
||||
|
||||
exclude = ["objects", "allowed_time_in_secs"]
|
||||
exclude = ["objects", "allowed_time_in_secs", "is_active"]
|
||||
|
||||
|
||||
class AttendancerequestCommentForm(ModelForm):
|
||||
class AttendanceRequestCommentForm(ModelForm):
|
||||
"""
|
||||
AttendancerequestComment form
|
||||
AttendanceRequestComment form
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
@@ -819,47 +823,5 @@ class AttendancerequestCommentForm(ModelForm):
|
||||
Meta class for additional options
|
||||
"""
|
||||
|
||||
model = AttendancerequestComment
|
||||
model = AttendanceRequestComment
|
||||
fields = ("comment",)
|
||||
|
||||
|
||||
class AttendanceCommentForm(ModelForm):
|
||||
"""
|
||||
Leave request comment model form
|
||||
"""
|
||||
|
||||
verbose_name = "Add Comment"
|
||||
|
||||
class Meta:
|
||||
model = AttendancerequestComment
|
||||
fields = "__all__"
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields["files"] = MultipleFileField(label="files")
|
||||
self.fields["files"].required = False
|
||||
|
||||
def as_p(self):
|
||||
"""
|
||||
Render the form fields as HTML table rows with Bootstrap styling.
|
||||
"""
|
||||
context = {"form": self}
|
||||
table_html = render_to_string("common_form.html", context)
|
||||
return table_html
|
||||
|
||||
def save(self, commit: bool = ...) -> Any:
|
||||
multiple_files_ids = []
|
||||
files = None
|
||||
if self.files.getlist("files"):
|
||||
files = self.files.getlist("files")
|
||||
self.instance.attachemnt = files[0]
|
||||
multiple_files_ids = []
|
||||
for attachemnt in files:
|
||||
file_instance = AttendancerequestFile()
|
||||
file_instance.file = attachemnt
|
||||
file_instance.save()
|
||||
multiple_files_ids.append(file_instance.pk)
|
||||
instance = super().save(commit)
|
||||
if commit:
|
||||
instance.files.add(*multiple_files_ids)
|
||||
return instance, files
|
||||
|
||||
@@ -20,6 +20,7 @@ import pandas as pd
|
||||
from base.models import Company, EmployeeShift, EmployeeShiftDay, WorkType
|
||||
from base.horilla_company_manager import HorillaCompanyManager
|
||||
from employee.models import Employee
|
||||
from horilla.models import HorillaModel
|
||||
from horilla_audit.models import HorillaAuditInfo, HorillaAuditLog
|
||||
from leave.models import (
|
||||
WEEK_DAYS,
|
||||
@@ -120,7 +121,7 @@ month_mapping = {
|
||||
}
|
||||
|
||||
|
||||
class AttendanceActivity(models.Model):
|
||||
class AttendanceActivity(HorillaModel):
|
||||
"""
|
||||
AttendanceActivity model
|
||||
"""
|
||||
@@ -160,7 +161,7 @@ class AttendanceActivity(models.Model):
|
||||
ordering = ["-attendance_date", "employee_id__employee_first_name", "clock_in"]
|
||||
|
||||
|
||||
class Attendance(models.Model):
|
||||
class Attendance(HorillaModel):
|
||||
"""
|
||||
Attendance model
|
||||
"""
|
||||
@@ -259,7 +260,6 @@ class Attendance(models.Model):
|
||||
objects = HorillaCompanyManager(
|
||||
related_company_field="employee_id__employee_work_info__company_id"
|
||||
)
|
||||
created_at = models.DateTimeField(auto_now_add=True, null=True)
|
||||
history = HorillaAuditLog(
|
||||
related_name="history_set",
|
||||
bases=[
|
||||
@@ -582,30 +582,25 @@ class Attendance(models.Model):
|
||||
)
|
||||
|
||||
|
||||
class AttendancerequestFile(models.Model):
|
||||
class AttendanceRequestFile(HorillaModel):
|
||||
file = models.FileField(upload_to="attendance/request_files")
|
||||
|
||||
|
||||
class AttendancerequestComment(models.Model):
|
||||
class AttendanceRequestComment(HorillaModel):
|
||||
"""
|
||||
AttendancerequestComment Model
|
||||
AttendanceRequestComment Model
|
||||
"""
|
||||
|
||||
request_id = models.ForeignKey(Attendance, on_delete=models.CASCADE)
|
||||
employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE)
|
||||
files = models.ManyToManyField(AttendancerequestFile, blank=True)
|
||||
files = models.ManyToManyField(AttendanceRequestFile, blank=True)
|
||||
comment = models.TextField(null=True, verbose_name=_("Comment"), max_length=255)
|
||||
created_at = models.DateTimeField(
|
||||
auto_now_add=True,
|
||||
verbose_name=_("Created At"),
|
||||
null=True,
|
||||
)
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"{self.comment}"
|
||||
|
||||
|
||||
class AttendanceOverTime(models.Model):
|
||||
class AttendanceOverTime(HorillaModel):
|
||||
"""
|
||||
AttendanceOverTime model
|
||||
"""
|
||||
@@ -759,7 +754,7 @@ class AttendanceOverTime(models.Model):
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
class AttendanceLateComeEarlyOut(models.Model):
|
||||
class AttendanceLateComeEarlyOut(HorillaModel):
|
||||
"""
|
||||
AttendanceLateComeEarlyOut model
|
||||
"""
|
||||
@@ -813,7 +808,7 @@ class AttendanceLateComeEarlyOut(models.Model):
|
||||
{self.attendance_id.employee_id.employee_last_name} - {self.type}"
|
||||
|
||||
|
||||
class AttendanceValidationCondition(models.Model):
|
||||
class AttendanceValidationCondition(HorillaModel):
|
||||
"""
|
||||
AttendanceValidationCondition model
|
||||
"""
|
||||
@@ -855,7 +850,7 @@ months = [
|
||||
]
|
||||
|
||||
|
||||
class PenaltyAccount(models.Model):
|
||||
class PenaltyAccount(HorillaModel):
|
||||
"""
|
||||
LateComeEarlyOutPenaltyAccount
|
||||
"""
|
||||
@@ -884,7 +879,6 @@ class PenaltyAccount(models.Model):
|
||||
minus_leaves = models.FloatField(default=0.0, null=True)
|
||||
deduct_from_carry_forward = models.BooleanField(default=False)
|
||||
penalty_amount = models.FloatField(default=0.0, null=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True, null=True)
|
||||
|
||||
def clean(self) -> None:
|
||||
super().clean()
|
||||
@@ -966,7 +960,7 @@ def create_initial_stage(sender, instance, created, **kwargs):
|
||||
available.save()
|
||||
|
||||
|
||||
class GraceTime(models.Model):
|
||||
class GraceTime(HorillaModel):
|
||||
"""
|
||||
Model for saving Grace time
|
||||
"""
|
||||
@@ -979,7 +973,6 @@ class GraceTime(models.Model):
|
||||
)
|
||||
allowed_time_in_secs = models.IntegerField()
|
||||
is_default = models.BooleanField(default=False)
|
||||
is_active = models.BooleanField(default=True)
|
||||
company_id = models.ManyToManyField(Company, blank=True, verbose_name=_("Company"))
|
||||
objects = HorillaCompanyManager()
|
||||
|
||||
@@ -1023,7 +1016,7 @@ class GraceTime(models.Model):
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
class AttendanceGeneralSetting(models.Model):
|
||||
class AttendanceGeneralSetting(HorillaModel):
|
||||
"""
|
||||
AttendanceGeneralSettings
|
||||
"""
|
||||
|
||||
@@ -55,7 +55,7 @@ from attendance.forms import (
|
||||
AttendanceValidationConditionForm,
|
||||
AttendanceUpdateForm,
|
||||
AttendanceExportForm,
|
||||
AttendancerequestCommentForm,
|
||||
AttendanceRequestCommentForm,
|
||||
GraceTimeForm,
|
||||
LateComeEarlyOutExportForm,
|
||||
)
|
||||
@@ -67,8 +67,8 @@ from attendance.models import (
|
||||
AttendanceOverTime,
|
||||
AttendanceLateComeEarlyOut,
|
||||
AttendanceValidationCondition,
|
||||
AttendancerequestComment,
|
||||
AttendancerequestFile,
|
||||
AttendanceRequestComment,
|
||||
AttendanceRequestFile,
|
||||
GraceTime,
|
||||
)
|
||||
from attendance.filters import (
|
||||
@@ -1681,6 +1681,9 @@ def update_grace_time(request, grace_id):
|
||||
GET : return grace time form template
|
||||
"""
|
||||
grace_time = GraceTime.objects.get(id=grace_id)
|
||||
print('_______________________________________________________________________')
|
||||
print(grace_time.__dict__)
|
||||
print('_______________________________________________________________________')
|
||||
form = GraceTimeForm(instance=grace_time)
|
||||
if request.method == "POST":
|
||||
form = GraceTimeForm(request.POST, instance=grace_time)
|
||||
@@ -1760,23 +1763,23 @@ def create_attendancerequest_comment(request, attendance_id):
|
||||
previous_data = request.GET.urlencode()
|
||||
attendance = Attendance.objects.filter(id=attendance_id).first()
|
||||
emp = request.user.employee_get
|
||||
form = AttendancerequestCommentForm(
|
||||
form = AttendanceRequestCommentForm(
|
||||
initial={"employee_id": emp.id, "request_id": attendance_id}
|
||||
)
|
||||
|
||||
if request.method == "POST":
|
||||
form = AttendancerequestCommentForm(request.POST)
|
||||
form = AttendanceRequestCommentForm(request.POST)
|
||||
if form.is_valid():
|
||||
form.instance.employee_id = emp
|
||||
form.instance.request_id = attendance
|
||||
form.save()
|
||||
comments = AttendancerequestComment.objects.filter(
|
||||
comments = AttendanceRequestComment.objects.filter(
|
||||
request_id=attendance_id
|
||||
).order_by("-created_at")
|
||||
no_comments = False
|
||||
if not comments.exists():
|
||||
no_comments = True
|
||||
form = AttendancerequestCommentForm(
|
||||
form = AttendanceRequestCommentForm(
|
||||
initial={"employee_id": emp.id, "request_id": attendance_id}
|
||||
)
|
||||
messages.success(request, _("Comment added successfully!"))
|
||||
@@ -1869,7 +1872,7 @@ def view_attendancerequest_comment(request, attendance_id):
|
||||
"""
|
||||
This method is used to show Attendance request comments
|
||||
"""
|
||||
comments = AttendancerequestComment.objects.filter(
|
||||
comments = AttendanceRequestComment.objects.filter(
|
||||
request_id=attendance_id
|
||||
).order_by("-created_at")
|
||||
no_comments = False
|
||||
@@ -1879,10 +1882,10 @@ def view_attendancerequest_comment(request, attendance_id):
|
||||
if request.FILES:
|
||||
files = request.FILES.getlist("files")
|
||||
comment_id = request.GET["comment_id"]
|
||||
comment = AttendancerequestComment.objects.get(id=comment_id)
|
||||
comment = AttendanceRequestComment.objects.get(id=comment_id)
|
||||
attachments = []
|
||||
for file in files:
|
||||
file_instance = AttendancerequestFile()
|
||||
file_instance = AttendanceRequestFile()
|
||||
file_instance.file = file
|
||||
file_instance.save()
|
||||
attachments.append(file_instance)
|
||||
@@ -1901,7 +1904,7 @@ def delete_attendancerequest_comment(request, comment_id):
|
||||
This method is used to delete Attendance request comments
|
||||
"""
|
||||
|
||||
comment = AttendancerequestComment.objects.get(id=comment_id)
|
||||
comment = AttendanceRequestComment.objects.get(id=comment_id)
|
||||
attendance_id = comment.request_id.id
|
||||
comment.delete()
|
||||
messages.success(request, _("Comment deleted successfully!"))
|
||||
@@ -1914,9 +1917,9 @@ def delete_comment_file(request):
|
||||
Used to delete attachment
|
||||
"""
|
||||
ids = request.GET.getlist("ids")
|
||||
AttendancerequestFile.objects.filter(id__in=ids).delete()
|
||||
AttendanceRequestFile.objects.filter(id__in=ids).delete()
|
||||
leave_id = request.GET["leave_id"]
|
||||
comments = AttendancerequestComment.objects.filter(request_id=leave_id).order_by(
|
||||
comments = AttendanceRequestComment.objects.filter(request_id=leave_id).order_by(
|
||||
"-created_at"
|
||||
)
|
||||
return render(
|
||||
|
||||
Reference in New Issue
Block a user