[UPDT] PMS: Subbordinates,collegue,manager change according to the employee selected

This commit is contained in:
Horilla
2024-09-10 13:50:14 +05:30
parent 8203ba97d4
commit 053ed3c641
6 changed files with 106 additions and 74 deletions

View File

@@ -19,9 +19,13 @@ from django.utils.translation import gettext_lazy as _
from base.forms import ModelForm as BaseForm
from base.forms import ModelForm as MF
from base.methods import reload_queryset
from base.methods import (
filtersubordinatesemployeemodel,
is_reportingmanager,
reload_queryset,
)
from employee.filters import EmployeeFilter
from employee.models import Department, JobPosition
from horilla import horilla_middlewares
from horilla_widgets.widgets.horilla_multi_select_field import HorillaMultiSelectField
from horilla_widgets.widgets.select_widgets import HorillaMultiSelectWidget
from pms.models import (
@@ -734,11 +738,10 @@ class FeedbackForm(ModelForm):
Initializes the feedback form instance.
If an instance is provided, sets the initial value for the form's date fields.
"""
request = getattr(horilla_middlewares._thread_locals, "request", None)
instance = kwargs.get("instance")
employee = kwargs.pop(
"employee", None
) # access the logged-in user's information
employee = kwargs.pop("employee", None)
if instance:
kwargs["initial"] = set_date_field_initial(instance)
super().__init__(*args, **kwargs)
@@ -757,23 +760,19 @@ class FeedbackForm(ModelForm):
self.fields["period"].choices = list(self.fields["period"].choices)
self.fields["period"].choices.append(("create_new_period", "Create new period"))
if instance:
self.fields["employee_id"].widget.attrs.update(
{"class": "oh-select oh-select-2"}
)
employees = Employee.objects.filter(
is_active=True, employee_work_info__reporting_manager_id=employee
self.fields["employee_id"].widget.attrs.update(
{"onchange": "get_collegues($(this))"}
)
if employee and employees:
department = employee.employee_work_info.department_id
employees = Employee.objects.filter(
is_active=True, employee_work_info__department_id=department
)
# manager level access
self.fields["employee_id"].queryset = employees
self.fields["manager_id"].queryset = employees
self.fields["colleague_id"].queryset = employees
self.fields["subordinate_id"].queryset = employees
if request.user.has_perm("pms.add_period"):
employees = Employee.objects.all()
elif is_reportingmanager(request):
# Queryset of subordinate employees
employees = filtersubordinatesemployeemodel(request, Employee.objects.all())
# managers queryset
managers = Employee.objects.filter(id=employee.id)
self.fields["manager_id"].queryset = managers
self.fields["employee_id"].queryset = employees
def clean(self):
"""

View File

@@ -61,20 +61,6 @@ $(document).ready(function () {
.trigger("change");
});
if (reporting_manager) {
// assigning the reporting manager of the employee
var options = $(
`<option value=" ${reporting_manager.id}" selected="selected">`
).text(
`${reporting_manager.employee_first_name}${reporting_manager.employee_last_name}`
);
$("#id_manager_id").append(options).trigger("change");
} else {
var options = $(
`<option value=" " selected="selected">`
).text(`---------`);
$("#id_manager_id").append(options).trigger("change");
}
},
error: (error) => {
console.log(error);

View File

@@ -0,0 +1,4 @@
{% for employee in employees %}
<option value="{{ employee.0 }}">{{ employee.1 }}</option>
{% endfor %}

View File

@@ -185,7 +185,26 @@
<!-- end of period modal -->
</main>
<button id="colleguesButton" hx-get="{% url 'get-collegues' %}" hx-target="#id_colleague_id" hidden > </button>
<button id="managerButton" hx-get="{% url 'get-collegues' %}" hx-target="#id_manager_id" hidden > </button>
<button id="subordinatesButton" hx-get="{% url 'get-collegues' %}" hx-target="#id_subordinate_id" hidden > </button>
<script>
function get_collegues(element) {
var employee_id = $(element).val();
// Check if the employee_id is valid
if (employee_id) {
// Dynamically set the hx-vals attribute for the manager button
$('#managerButton').attr('hx-vals', JSON.stringify({ employee_id: employee_id, data: 'manager' })).click();
// Dynamically set the hx-vals attribute for the colleagues button
$('#colleguesButton').attr('hx-vals', JSON.stringify({ employee_id: employee_id, data: 'colleagues' })).click();
// Dynamically set the hx-vals attribute for the subordinates button
$('#subordinatesButton').attr('hx-vals', JSON.stringify({ employee_id: employee_id, data: 'subordinates' })).click();
} else {
console.error('Invalid employee_id');
}
}
</script>
<script src="{% static 'src/feedback/feedback_creation.js' %}"></script>
<script src="{% static 'src/period/period.js' %}"></script>

View File

@@ -133,6 +133,7 @@ urlpatterns = [
path("feedback-update/<int:id>", views.feedback_update, name="feedback-update"),
path("feedback-delete/<int:id>", views.feedback_delete, name="feedback-delete"),
path("feedback-archive/<int:id>", views.feedback_archive, name="feedback-archive"),
path("get-collegues", views.get_collegues, name="get-collegues"),
path(
"feedback-answer-get/<int:id>",
views.feedback_answer_get,

View File

@@ -19,6 +19,7 @@ from django.db.utils import IntegrityError
from django.forms import modelformset_factory
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.template.loader import render_to_string
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
@@ -1733,25 +1734,20 @@ def feedback_list_view(request):
it will return the filtered and searched object.
"""
user = request.user
employee = Employee.objects.filter(employee_user_id=user).first()
feedback_requested_ids = Feedback.objects.filter(
Q(manager_id=employee, manager_id__is_active=True)
| Q(colleague_id=employee, colleague_id__is_active=True)
| Q(subordinate_id=employee, subordinate_id__is_active=True)
).values_list("id", flat=True)
feedback_own = Feedback.objects.filter(employee_id=employee).filter(
archive=False, employee_id__is_active=True
)
feedback_requested = Feedback.objects.filter(pk__in=feedback_requested_ids).filter(
archive=False, employee_id__is_active=True
)
feedback_all = Feedback.objects.all().filter(
Q(
manager_id=employee,
manager_id__is_active=True,
archive=False,
)
employee = user.employee_get
# filter own feedbacks (self feedbacks)
feedback_own = Feedback.objects.filter(
employee_id=employee,
archive=False,
)
# feedbacks to answer
feedback_requested = Feedback.objects.filter(
Q(manager_id=employee) | Q(colleague_id=employee) | Q(subordinate_id=employee)
).distinct()
# feedbacks to review if employee is a manager
feedback_all = Feedback.objects.all().filter(Q(manager_id=employee, archive=False))
# Anonymous feedbacks
anonymous_feedback = (
AnonymousFeedback.objects.filter(employee_id=employee, archive=False)
if not request.user.has_perm("pms.view_feedback")
@@ -1760,26 +1756,11 @@ def feedback_list_view(request):
anonymous_feedback = anonymous_feedback | AnonymousFeedback.objects.filter(
anonymous_feedback_id=request.user.id, archive=False
)
employees = Employee.objects.filter(
employee_work_info__reporting_manager_id=employee, is_active=True
) # checking the user is reporting manager or not
feedback_available = Feedback.objects.all()
if request.user.has_perm("pms.view_feedback"):
context = filter_pagination_feedback(
request, feedback_own, feedback_requested, feedback_all, anonymous_feedback
)
elif employees:
# based on the reporting manager
feedback_all = Feedback.objects.filter(employee_id__in=employees)
context = filter_pagination_feedback(
request, feedback_own, feedback_requested, feedback_all, anonymous_feedback
)
else:
feedback_all = Feedback.objects.none()
context = filter_pagination_feedback(
request, feedback_own, feedback_requested, feedback_all, anonymous_feedback
)
if feedback_available.exists():
context = filter_pagination_feedback(
request, feedback_own, feedback_requested, feedback_all, anonymous_feedback
)
# checking condition for empty page
if Feedback.objects.all().exists():
template = "feedback/feedback_list_view.html"
else:
template = "feedback/feedback_empty.html"
@@ -2065,6 +2046,48 @@ def feedback_archive(request, id):
return redirect(feedback_list_view)
@login_required
def get_collegues(request):
"""
Get collegues and subordinates for the manager.
"""
try:
employee_id = request.GET.get("employee_id")
employee = Employee.objects.get(id=int(employee_id)) if employee_id else None
if employee:
if request.GET.get("data") == "colleagues":
department = employee.get_department()
# Get employees in the same department as the employee
employees_queryset = Employee.objects.filter(
is_active=True, employee_work_info__department_id=department
).values_list("id", "employee_first_name")
elif request.GET.get("data") == "manager":
reporting_manager = (
employee.employee_work_info.reporting_manager_id
if employee.employee_work_info
else None
)
employees_queryset = Employee.objects.filter(
id=reporting_manager.id
).values_list("id", "employee_first_name")
elif request.GET.get("data") == "subordinates":
employees_queryset = Employee.objects.filter(
is_active=True, employee_work_info__reporting_manager_id=employee
).values_list("id", "employee_first_name")
# Convert QuerySets to a list
employees = list(employees_queryset)
context = {"employees": employees}
employee_html = render_to_string("feedback/employees_select.html", context)
return HttpResponse(employee_html)
else:
return JsonResponse({"error": "Employee not found"}, status=404)
except Employee.DoesNotExist:
return JsonResponse({"error": "Invalid Employee ID"}, status=400)
except Exception as e:
return JsonResponse({"error": str(e)}, status=500)
@login_required
def feedback_status(request):
"""this function is used to un-archive the feedback