diff --git a/attendance/templates/attendance/late_come_early_out/group_by.html b/attendance/templates/attendance/late_come_early_out/group_by.html
index db0123d6b..2885802e1 100644
--- a/attendance/templates/attendance/late_come_early_out/group_by.html
+++ b/attendance/templates/attendance/late_come_early_out/group_by.html
@@ -55,7 +55,10 @@
{% for late_in_early_out in attendance_list.list %}
-
+
diff --git a/attendance/templates/attendance/late_come_early_out/report_list.html b/attendance/templates/attendance/late_come_early_out/report_list.html
index ec51ab796..63e250cc2 100644
--- a/attendance/templates/attendance/late_come_early_out/report_list.html
+++ b/attendance/templates/attendance/late_come_early_out/report_list.html
@@ -50,7 +50,10 @@
{% for late_in_early_out in data %}
-
+
- {% if late_in_early_out.type == 'late_come' %}
- {% trans "Late Come" %}
- {% else %}
- {% trans "Early Out" %}
- {% endif %}
+ {{late_in_early_out.get_type_display}}
{{late_in_early_out.attendance_id.attendance_date}}
{{late_in_early_out.attendance_id.attendance_clock_in}}
@@ -84,7 +83,7 @@
{{laXte_in_early_out.attendance_id.attendance_clock_out_date}}
{{late_in_early_out.attendance_id.minimum_hour}}
{{late_in_early_out.attendance_id.attendance_worked_hour}}
-
+
{% if late_in_early_out.get_penalties_count %}
Penalties :{{late_in_early_out.get_penalties_count}}
{% endif %}
@@ -124,7 +123,7 @@
- `
+
+
@@ -29,9 +38,11 @@
diff --git a/attendance/templates/attendance/late_come_early_out/single_report.html b/attendance/templates/attendance/late_come_early_out/single_report.html
new file mode 100644
index 000000000..cfd398e6f
--- /dev/null
+++ b/attendance/templates/attendance/late_come_early_out/single_report.html
@@ -0,0 +1,234 @@
+{% load static %} {% load i18n %} {% load basefilters %} {% load yes_no %}
+{% if messages %}
+
+ {% for message in messages %}
+
+ {% endfor %}
+
+{% endif %}
+
+
+
+
+
+
+
+
+ {% if late_in_early_out %}
+
+ {% else %}
+
+

+
{% trans "Attendance not found." %}
+
+ {% endif %}
+
+
diff --git a/attendance/urls.py b/attendance/urls.py
index 8e5b37d51..8b5b2c455 100644
--- a/attendance/urls.py
+++ b/attendance/urls.py
@@ -127,6 +127,11 @@ urlpatterns = [
views.late_come_early_out_view,
name="late-come-early-out-view",
),
+ path(
+ "late-in-early-out-single-view/
/",
+ views.late_in_early_out_single_view,
+ name="late-in-early-out-single-view",
+ ),
path(
"late-come-early-out-search",
attendance.views.search.late_come_early_out_search,
diff --git a/attendance/views/search.py b/attendance/views/search.py
index 0500046c0..1b5a3882d 100644
--- a/attendance/views/search.py
+++ b/attendance/views/search.py
@@ -263,8 +263,18 @@ def late_come_early_out_search(request):
if field != "" and field is not None:
template = "attendance/late_come_early_out/group_by.html"
reports = group_by_queryset(reports, field, request.GET.get("page"), "page")
+ list_values = [entry["list"] for entry in reports]
+ id_list = []
+ for value in list_values:
+ for instance in value.object_list:
+ id_list.append(instance.id)
+ late_in_early_out_ids = json.dumps(list(id_list))
else:
reports = paginator_qry(reports, request.GET.get("page"))
+ late_in_early_out_ids = json.dumps(
+ [instance.id for instance in reports.object_list]
+ )
+
data_dict = parse_qs(previous_data)
get_key_instances(AttendanceLateComeEarlyOut, data_dict)
keys_to_remove = [key for key, value in data_dict.items() if value == ["unknown"]]
@@ -279,6 +289,7 @@ def late_come_early_out_search(request):
"pd": previous_data,
"field": field,
"filter_dict": data_dict,
+ "late_in_early_out_ids": late_in_early_out_ids,
},
)
diff --git a/attendance/views/views.py b/attendance/views/views.py
index 1b8bd04a6..37f941258 100644
--- a/attendance/views/views.py
+++ b/attendance/views/views.py
@@ -770,20 +770,23 @@ def attendance_activity_view(request):
),
"gp_fields": AttendanceActivityReGroup.fields,
"export_form": export_form,
- "activity_ids":activity_ids,
+ "activity_ids": activity_ids,
},
)
+@login_required
def activity_single_view(request, obj_id):
activity = AttendanceActivity.objects.get(id=obj_id)
- attendance = Attendance.objects.filter(attendance_date = activity.attendance_date).first()
+ attendance = Attendance.objects.filter(
+ attendance_date=activity.attendance_date
+ ).first()
instance_ids_json = request.GET["instances_ids"]
instance_ids = json.loads(instance_ids_json) if instance_ids_json else []
previous_instance, next_instance = closest_numbers(instance_ids, obj_id)
context = {
"activity": activity,
- "attendance":attendance,
+ "attendance": attendance,
"previous_instance": previous_instance,
"next_instance": next_instance,
"instance_ids_json": instance_ids_json,
@@ -961,6 +964,9 @@ def late_come_early_out_view(request):
reports = reports | self_reports
reports = reports.distinct()
+ late_in_early_out_ids = json.dumps(
+ [instance.id for instance in paginator_qry(reports, None)]
+ )
previous_data = request.GET.urlencode()
export_form = LateComeEarlyOutExportForm()
data_dict = parse_qs(previous_data)
@@ -977,10 +983,29 @@ def late_come_early_out_view(request):
),
"filter_dict": data_dict,
"export_form": export_form,
+ "late_in_early_out_ids": late_in_early_out_ids,
},
)
+def late_in_early_out_single_view(request, obj_id):
+ previous_data = request.GET.urlencode()
+ late_in_early_out = AttendanceLateComeEarlyOut.objects.filter(id=obj_id).first()
+ instance_ids_json = request.GET["instances_ids"]
+ instance_ids = json.loads(instance_ids_json) if instance_ids_json else []
+ previous_instance, next_instance = closest_numbers(instance_ids, obj_id)
+ context = {
+ "late_in_early_out": late_in_early_out,
+ "previous_instance": previous_instance,
+ "next_instance": next_instance,
+ "instance_ids_json": instance_ids_json,
+ "pd":previous_data,
+ }
+ return render(
+ request, "attendance/late_come_early_out/single_report.html", context=context
+ )
+
+
@login_required
@permission_required("attendance.delete_attendancelatecomeearlyout")
@require_http_methods(["POST"])
@@ -995,11 +1020,22 @@ def late_come_early_out_delete(request, obj_id):
AttendanceLateComeEarlyOut.objects.get(id=obj_id).delete()
messages.success(request, _("Late-in early-out deleted"))
except AttendanceLateComeEarlyOut.DoesNotExist:
- messages.error(request, _("Late-in early-out Does not exists.."))
+ messages.error(request, _("Late-in early-out does not exists.."))
except ProtectedError:
messages.error(request, _("You cannot delete this Late-in early-out"))
-
- return redirect(f"/attendance/late-come-early-out-search?{pd}")
+ if not request.GET.get("instances_ids"):
+ return redirect(f"/attendance/late-come-early-out-search?{pd}")
+ else:
+ instances_ids = request.GET.get("instances_ids")
+ instances_list = json.loads(instances_ids)
+ if obj_id in instances_list:
+ instances_list.remove(obj_id)
+ previous_instance, next_instance = closest_numbers(
+ json.loads(instances_ids), obj_id
+ )
+ return redirect(
+ f"/attendance/late-in-early-out-single-view/{next_instance}/?{pd}&instances_ids={instances_list}"
+ )
@login_required
diff --git a/base/methods.py b/base/methods.py
index fe8f525d9..1b68604b3 100644
--- a/base/methods.py
+++ b/base/methods.py
@@ -321,7 +321,7 @@ def get_key_instances(model, data_dict):
key
for key, value in data_dict.items()
if value == ["unknown"]
- or key in ["sortby", "orderby", "view", "page", "group_by", "target",'rpage']
+ or key in ["sortby", "orderby", "view", "page", "group_by", "target",'rpage',"instances_ids"]
or "dynamic_page" in key
]