diff --git a/attendance/admin.py b/attendance/admin.py index 498af32ec..a5b6421ac 100644 --- a/attendance/admin.py +++ b/attendance/admin.py @@ -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) diff --git a/attendance/forms.py b/attendance/forms.py index 82dae03b7..cebd97b0c 100644 --- a/attendance/forms.py +++ b/attendance/forms.py @@ -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 diff --git a/attendance/models.py b/attendance/models.py index e46382a0e..8ea78f2a2 100644 --- a/attendance/models.py +++ b/attendance/models.py @@ -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 """ diff --git a/attendance/views/views.py b/attendance/views/views.py index 8205c6e28..ccc0c2482 100644 --- a/attendance/views/views.py +++ b/attendance/views/views.py @@ -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(