From 55438579ee1e78f5875ecdb6da5084bb451b27ad Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 5 Feb 2026 14:51:08 +0000 Subject: [PATCH] Autosave: 20260205-145107 --- core/__pycache__/urls.cpython-311.pyc | Bin 11244 -> 11488 bytes core/__pycache__/views.cpython-311.pyc | Bin 134414 -> 139040 bytes core/templates/core/settings.html | 50 +++++++++++++ core/urls.py | 6 +- core/views.py | 93 +++++++++++++++++++++++- hr/__pycache__/admin.cpython-311.pyc | Bin 2780 -> 2849 bytes hr/__pycache__/forms.cpython-311.pyc | Bin 0 -> 2105 bytes hr/__pycache__/views.cpython-311.pyc | Bin 10129 -> 10185 bytes hr/admin.py | 7 +- hr/forms.py | 29 ++++++++ hr/templates/hr/employee_form.html | 97 ++++++++++++++++++++++++- hr/templates/hr/employee_list.html | 6 +- hr/views.py | 7 +- 13 files changed, 281 insertions(+), 14 deletions(-) create mode 100644 hr/__pycache__/forms.cpython-311.pyc create mode 100644 hr/forms.py diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index ee499aeeb0e76d75d84a76662177727a992b9a52..93ff41b20831fde553613652a09cde1afe73826f 100644 GIT binary patch delta 1201 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 E4>#e7;Q#;t diff --git a/core/templates/core/settings.html b/core/templates/core/settings.html index f62b8d0..676c63a 100644 --- a/core/templates/core/settings.html +++ b/core/templates/core/settings.html @@ -50,6 +50,12 @@ {% trans "WhatsApp Gateway" %} + +
@@ -625,6 +631,50 @@
+ +
+
+
+
+
+
{% trans "Backup Database" %}
+
+
+

{% trans "Download a complete SQL dump of your database. Keep this file safe." %}

+ + {% trans "Download Backup" %} + +
+
+
+ +
+
+
+
{% trans "Restore Database" %}
+
+
+
+ + {% trans "Warning:" %} {% trans "This will overwrite all current data. This action cannot be undone." %} +
+
+ {% csrf_token %} +
+ + +
+ +
+
+
+
+
+
+ + -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/hr/templates/hr/employee_list.html b/hr/templates/hr/employee_list.html index 893ee45..75a0621 100644 --- a/hr/templates/hr/employee_list.html +++ b/hr/templates/hr/employee_list.html @@ -17,6 +17,7 @@ {% trans "Name" %} + {% trans "Biometric ID" %} {% trans "Department" %} {% trans "Position" %} {% trans "Email" %} @@ -33,6 +34,7 @@ {{ employee.first_name }} {{ employee.last_name }} + {{ employee.biometric_id|default:"-" }} {{ employee.department.name_en }} / {{ employee.department.name_ar }} {{ employee.job_position.title_en }} / {{ employee.job_position.title_ar }} {{ employee.email }} @@ -50,7 +52,7 @@ {% empty %} - {% trans "No employees found." %} + {% trans "No employees found." %} {% endfor %} @@ -59,4 +61,4 @@ -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/hr/views.py b/hr/views.py index ea4703d..0ff4346 100644 --- a/hr/views.py +++ b/hr/views.py @@ -3,6 +3,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from .models import Employee, Department, Attendance, LeaveRequest, JobPosition, BiometricDevice +from .forms import EmployeeForm from django.db.models import Count from django.shortcuts import get_object_or_404, redirect from django.contrib import messages @@ -27,7 +28,7 @@ class EmployeeListView(LoginRequiredMixin, ListView): class EmployeeCreateView(LoginRequiredMixin, CreateView): model = Employee - fields = '__all__' + form_class = EmployeeForm template_name = 'hr/employee_form.html' success_url = reverse_lazy('hr:employee_list') @@ -38,7 +39,7 @@ class EmployeeCreateView(LoginRequiredMixin, CreateView): class EmployeeUpdateView(LoginRequiredMixin, UpdateView): model = Employee - fields = '__all__' + form_class = EmployeeForm template_name = 'hr/employee_form.html' success_url = reverse_lazy('hr:employee_list') @@ -141,4 +142,4 @@ def sync_device_logs(request, pk): else: messages.success(request, _("Sync Successful! Fetched %(total)s records, %(new)s new.") % {'total': result['total'], 'new': result['new']}) - return redirect('hr:device_list') + return redirect('hr:device_list') \ No newline at end of file