diff --git a/attendance/forms.py b/attendance/forms.py
index 19af54f96..e3edb7929 100644
--- a/attendance/forms.py
+++ b/attendance/forms.py
@@ -412,7 +412,7 @@ class AttendanceValidationConditionForm(forms.ModelForm):
overtime_cutoff = forms.DurationField()
company_id = forms.ModelMultipleChoiceField(
queryset=Company.objects.all(),
- widget=forms.SelectMultiple(attrs={"class": "oh-select oh-select-2 w-100"})
+ widget=forms.SelectMultiple(attrs={"class": "oh-select oh-select-2 w-100"}),
)
widgets = {
"validation_at_work": forms.TextInput(
@@ -424,15 +424,15 @@ class AttendanceValidationConditionForm(forms.ModelForm):
"overtime_cutoff": forms.TextInput(
attrs={"class": "oh-input w-100", "placeholder": "02:00"}
),
- "company_id": forms.SelectMultiple(
- attrs={"class": "oh-select w-100"}
- ),
+ "company_id": forms.SelectMultiple(attrs={"class": "oh-select w-100"}),
}
labels = {
"validation_at_work": format_html(
- _("{}"),
- _("Maximum Allowed working hours")
+ _(
+ "{}"
+ ),
+ _("Maximum Allowed working hours"),
),
"minimum_overtime_to_approve": _("Minimum Hour to Approve Overtime"),
"overtime_cutoff": _("Maximum Allowed Overtime Per Day"),
@@ -465,6 +465,8 @@ class AttendanceRequestForm(ModelForm):
] = instance.attendance_clock_out_date.strftime("%Y-%m-%d")
kwargs["initial"] = initial
super().__init__(*args, **kwargs)
+ self.fields["attendance_clock_out_date"].required = False
+ self.fields["attendance_clock_out"].required = False
class Meta:
"""
@@ -554,8 +556,16 @@ class NewRequestForm(AttendanceRequestForm):
data["attendance_date"] = str(attendance_date)
data["attendance_clock_in_date"] = self.data["attendance_clock_in_date"]
data["attendance_clock_in"] = self.data["attendance_clock_in"]
- data["attendance_clock_out"] = self.data["attendance_clock_out"]
- data["attendance_clock_out_date"] = self.data["attendance_clock_out_date"]
+ data["attendance_clock_out"] = (
+ None
+ if data["attendance_clock_out"] == "None"
+ else data["attendance_clock_out"]
+ )
+ data["attendance_clock_out_date"] = (
+ None
+ if data["attendance_clock_out_date"] == "None"
+ else data["attendance_clock_out_date"]
+ )
data["work_type_id"] = self.data["work_type_id"]
data["shift_id"] = self.data["shift_id"]
attendance = attendances.first()
diff --git a/attendance/models.py b/attendance/models.py
index c0cc9270d..42179ade6 100644
--- a/attendance/models.py
+++ b/attendance/models.py
@@ -423,13 +423,13 @@ class Attendance(models.Model):
"attendance_clock_in_date": "Attendance check-in date never smaller than attendance date"
}
)
- if self.attendance_clock_out_date < self.attendance_clock_in_date:
+ if self.attendance_clock_out_date and self.attendance_clock_out_date < self.attendance_clock_in_date:
raise ValidationError(
{
"attendance_clock_out_date": "Attendance check-out date never smaller than attendance check-in date"
}
)
- if self.attendance_clock_out_date >= today:
+ if self.attendance_clock_out_date and self.attendance_clock_out_date >= today:
if out_time > now:
raise ValidationError(
{"attendance_clock_out": "Check out time not allow in the future"}
diff --git a/attendance/views/requests.py b/attendance/views/requests.py
index 8db6fd93f..43de7fb8f 100644
--- a/attendance/views/requests.py
+++ b/attendance/views/requests.py
@@ -88,8 +88,12 @@ def request_attendance_view(request):
template = "requests/attendance/view-requests.html"
else:
template = "requests/attendance/requests_empty.html"
- requests_ids = json.dumps([instance.id for instance in paginator_qry(requests, None).object_list])
- attendances_ids = json.dumps([instance.id for instance in paginator_qry(attendances, None).object_list])
+ requests_ids = json.dumps(
+ [instance.id for instance in paginator_qry(requests, None).object_list]
+ )
+ attendances_ids = json.dumps(
+ [instance.id for instance in paginator_qry(attendances, None).object_list]
+ )
return render(
request,
template,
@@ -153,18 +157,38 @@ def attendance_request_changes(request, attendance_id):
"""
attendance = Attendance.objects.get(id=attendance_id)
form = AttendanceRequestForm(instance=attendance)
- form.fields["work_type_id"].widget.attrs.update({"class":"w-100","style":"height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)"})
- form.fields["shift_id"].widget.attrs.update({"class":"w-100","style":"height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)"})
+ form.fields["work_type_id"].widget.attrs.update(
+ {
+ "class": "w-100",
+ "style": "height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)",
+ }
+ )
+ form.fields["shift_id"].widget.attrs.update(
+ {
+ "class": "w-100",
+ "style": "height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)",
+ }
+ )
if request.method == "POST":
form = AttendanceRequestForm(request.POST, instance=copy.copy(attendance))
- form.fields["work_type_id"].widget.attrs.update({"class":"w-100","style":"height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)"})
- form.fields["shift_id"].widget.attrs.update({"class":"w-100","style":"height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)"})
+ form.fields["work_type_id"].widget.attrs.update(
+ {
+ "class": "w-100",
+ "style": "height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)",
+ }
+ )
+ form.fields["shift_id"].widget.attrs.update(
+ {
+ "class": "w-100",
+ "style": "height:50px;border-radius:0;border:1px solid hsl(213deg,22%,84%)",
+ }
+ )
work_type_id = form.data["work_type_id"]
shift_id = form.data["shift_id"]
if work_type_id is None or not len(work_type_id):
- form.add_error("work_type_id","This field is required")
+ form.add_error("work_type_id", "This field is required")
if shift_id is None or not len(shift_id):
- form.add_error("shift_id","This field is required")
+ form.add_error("shift_id", "This field is required")
if form.is_valid():
# commit already set to False
# so the changes not affected to the db
@@ -252,7 +276,7 @@ def validate_attendance_request(request, attendance_id):
"attendance": attendance,
"previous": previous_instance_id,
"next": next_instance_id,
- "requests_ids":requests_ids_json,
+ "requests_ids": requests_ids_json,
},
)
@@ -271,8 +295,18 @@ def approve_validate_attendance_request(request, attendance_id):
attendance.save()
if attendance.requested_data is not None:
requested_data = json.loads(attendance.requested_data)
+ requested_data["attendance_clock_out"] = (
+ None
+ if requested_data["attendance_clock_out"] == "None"
+ else requested_data["attendance_clock_out"]
+ )
+ requested_data["attendance_clock_out_date"] = (
+ None
+ if requested_data["attendance_clock_out_date"] == "None"
+ else requested_data["attendance_clock_out_date"]
+ )
Attendance.objects.filter(id=attendance_id).update(**requested_data)
- #DUE TO AFFECT THE OVERTIME CALCULATION ON SAVE METHOD, SAVE THE INSTANCE ONCE MORE
+ # DUE TO AFFECT THE OVERTIME CALCULATION ON SAVE METHOD, SAVE THE INSTANCE ONCE MORE
attendance = Attendance.objects.get(id=attendance_id)
attendance.save()
messages.success(request, "Attendance request has been approved")
@@ -384,7 +418,8 @@ def edit_validate_attendance(request, attendance_id):
instance.is_validate_request_approved = False
instance.is_validate_request = True
instance.save()
- return HttpResponse(f"""
+ return HttpResponse(
+ f"""
- """)
+ """
+ )
return render(request, "requests/attendance/update_form.html", {"form": form})