diff --git a/base/middleware.py b/base/middleware.py index a8847e976..49c7346e8 100644 --- a/base/middleware.py +++ b/base/middleware.py @@ -6,7 +6,7 @@ from django.apps import apps from django.db.models import Q from django.http import HttpResponse, HttpResponseNotAllowed from django.shortcuts import render - +from django.shortcuts import redirect from asset.models import AssetAssignment, AssetRequest from attendance.models import ( Attendance, @@ -181,3 +181,22 @@ class CompanyMiddleware: response = self.get_response(request) return response + + +#MIDDLEWARE TO CHECK IF EMPLOYEE IS NEW USER OR NOT +class ForcePasswordChangeMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + # Exclude specific paths from redirection + excluded_paths = ['/change-password', '/login', '/logout'] + if request.path.rstrip('/') in excluded_paths: + return self.get_response(request) + + # Check if employee is a new employee + if hasattr(request, 'user') and request.user.is_authenticated: + if getattr(request.user, 'is_new_employee', True): + return redirect('change-password') # Adjust to match your URL name + + return self.get_response(request) \ No newline at end of file diff --git a/base/models.py b/base/models.py index 5774a1883..58c2e1644 100644 --- a/base/models.py +++ b/base/models.py @@ -8,6 +8,7 @@ import ipaddress from datetime import date, datetime, timedelta from typing import Iterable +from django.contrib.auth.models import AbstractUser import django from django.apps import apps from django.contrib import messages @@ -1794,3 +1795,6 @@ def create_deduction_cutleave_from_penalty(sender, instance, created, **kwargs): ) available.save() + + +User.add_to_class('is_new_employee', models.BooleanField(default=False)) \ No newline at end of file diff --git a/base/urls.py b/base/urls.py index d9088d259..684ea0239 100644 --- a/base/urls.py +++ b/base/urls.py @@ -93,6 +93,7 @@ urlpatterns = [ ), path("reset-send-success", views.reset_send_success, name="reset-send-success"), path("change-password", views.change_password, name="change-password"), + path("logout", views.logout_user, name="logout"), path("settings", views.common_settings, name="settings"), path( diff --git a/base/views.py b/base/views.py index 063d75aaf..9a84c7d94 100644 --- a/base/views.py +++ b/base/views.py @@ -738,7 +738,11 @@ def change_password(request): if form.is_valid(): new_password = form.cleaned_data["new_password"] user.set_password(new_password) + + if user.is_new_employee: # Ensure this only affects new employees + user.is_new_employee = False user.save() + user = authenticate(request, username=user.username, password=new_password) login(request, user) messages.success(request, _("Password changed successfully")) @@ -748,6 +752,14 @@ def change_password(request): return render(request, "base/auth/password_change.html", {"form": form}) + + + + + + + + def logout_user(request): """ This method used to logout the user diff --git a/employee/models.py b/employee/models.py index e3a55730f..9b519c789 100644 --- a/employee/models.py +++ b/employee/models.py @@ -498,12 +498,19 @@ class Employee(models.Model): if employee.employee_user_id is None: # Create user if no corresponding user exists username = self.email + password = self.phone + + is_new_employee_flag = not employee.employee_user_id.is_new_employee if employee.employee_user_id else True + user = User.objects.create_user( + username=username, email=username, password=password, is_new_employee=is_new_employee_flag + ) user = User.objects.filter(username=username).first() if not user: user = User.objects.create_user( username=username, email=username, password=password ) + self.employee_user_id = user # default permissions change_ownprofile = Permission.objects.get(codename="change_ownprofile") diff --git a/horilla/horilla_middlewares.py b/horilla/horilla_middlewares.py index 92808ca55..cf106fff9 100644 --- a/horilla/horilla_middlewares.py +++ b/horilla/horilla_middlewares.py @@ -15,6 +15,8 @@ MIDDLEWARE.append("base.middleware.CompanyMiddleware") MIDDLEWARE.append("horilla.horilla_middlewares.MethodNotAllowedMiddleware") MIDDLEWARE.append("horilla.horilla_middlewares.ThreadLocalMiddleware") MIDDLEWARE.append("accessibility.middlewares.AccessibilityMiddleware") +MIDDLEWARE.append("accessibility.middlewares.AccessibilityMiddleware") +MIDDLEWARE.append("base.middleware.ForcePasswordChangeMiddleware") _thread_locals = threading.local() diff --git a/horilla/settings.py b/horilla/settings.py index 443e37365..1b5e75c6b 100755 --- a/horilla/settings.py +++ b/horilla/settings.py @@ -80,12 +80,15 @@ MIDDLEWARE = [ "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "corsheaders.middleware.CorsMiddleware", + + "simple_history.middleware.HistoryRequestMiddleware", "django.middleware.locale.LocaleMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "base.middleware.ForcePasswordChangeMiddleware", ] ROOT_URLCONF = "horilla.urls" diff --git a/leave/templates/leave/leave_type/leave_type_creation.html b/leave/templates/leave/leave_type/leave_type_creation.html index d8b81e34b..920769665 100644 --- a/leave/templates/leave/leave_type/leave_type_creation.html +++ b/leave/templates/leave/leave_type/leave_type_creation.html @@ -231,6 +231,25 @@ + +
+
+ + + + +
+ + +
+
+ + {{form.employee_id}} + {{form.employee_id.errors}} +
+ {% if perms.leave.add_availableleave %}
@@ -241,6 +260,7 @@ {{form.employee_id.errors}}
{% endif %} + @@ -434,6 +454,34 @@ $('.yesOrNo').change(function(){ checkYesOrNoFields() }) + + $(document).ready(function() { + // Select All Employees Functionality + $('#select-all-employees').change(function() { + var isChecked = $(this).prop('checked'); + + + if ($('#id_employee_id').is('select')) { + + $('#id_employee_id option').prop('selected', isChecked); + } + + else if ($('#id_employee_id input[type="checkbox"]').length > 0) { + + $('#id_employee_id input[type="checkbox"]').each(function() { + + $(this).prop('checked', false); + + if (isChecked) { + $(this).prop('checked', true); + } + }); + } + + $('#id_employee_id').trigger('change'); + }); +}); + {% endblock %}