[FIX] PMS: Feedback create and update form issue

This commit is contained in:
Horilla
2024-09-26 15:50:49 +05:30
parent 05740fa689
commit 1e4907a329
6 changed files with 106 additions and 110 deletions

View File

@@ -696,8 +696,7 @@ class FeedbackForm(ModelForm):
),
"employee_id": forms.Select(
attrs={
"class": " oh-select--employee-change",
"style": "width:100%; display:none;",
"class": "oh-select oh-select-2",
"required": "false",
},
),
@@ -720,6 +719,7 @@ class FeedbackForm(ModelForm):
"class": "oh-select oh-select-2 w-100",
"multiple": "multiple",
"style": "width:100%; display:none;",
"required": "false",
}
),
"question_template_id": forms.Select(
@@ -752,13 +752,21 @@ class FeedbackForm(ModelForm):
Initializes the feedback form instance.
If an instance is provided, sets the initial value for the form's date fields.
"""
# fetch request
request = getattr(horilla_middlewares._thread_locals, "request", None)
# get instance
instance = kwargs.get("instance")
employee = kwargs.pop("employee", None)
# set employee
if instance:
employee = instance.employee_id
else:
employee = request.user.employee_get
if instance:
kwargs["initial"] = set_date_field_initial(instance)
super().__init__(*args, **kwargs)
# Horilla multi select filter for employee
self.fields["subordinate_id"] = HorillaMultiSelectField(
queryset=Employee.objects.all(),
widget=HorillaMultiSelectWidget(
@@ -767,30 +775,34 @@ class FeedbackForm(ModelForm):
filter_instance_contex_name="f",
filter_template_path="employee_filters.html",
instance=self.instance,
required=False,
),
label="Subordinates",
)
reload_queryset(self.fields)
# check the request user has permission to add period
if request.user.has_perm("pms.add_period") or is_reportingmanager(request):
# add dyanamic period creation as choice
self.fields["period"].choices = list(self.fields["period"].choices)
self.fields["period"].choices.append(
("create_new_period", "Create new period")
)
# add onchange function to get employee data
self.fields["employee_id"].widget.attrs.update(
{"onchange": "get_collegues($(this))"}
)
# filtering employees accordig to the request user
if request.user.has_perm("pms.add_feedback") or is_reportingmanager(request):
# Queryset of subordinate employees
employees = filtersubordinatesemployeemodel(
request, Employee.objects.all(), perm="pms.add_feedback"
)
# managers queryset
managers = Employee.objects.filter(id=employee.id)
self.fields["manager_id"].queryset = managers
self.fields["employee_id"].queryset = employees | Employee.objects.filter(
employee_user_id=request.user
)
if not instance:
self.fields["employee_id"].initial = employee
def clean(self):
"""
@@ -798,9 +810,7 @@ class FeedbackForm(ModelForm):
Ensures that the start date is before the end date and validates the start date.
"""
super().clean()
emps = self.data.getlist("subordinate_id")
if emps:
self.errors.pop("subordinate_id", None)
self.errors.pop("subordinate_id", None)
cleaned_data = super().clean()
start_date = cleaned_data.get("start_date")
end_date = cleaned_data.get("end_date")

View File

@@ -1,72 +1,4 @@
$(document).ready(function () {
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== "") {
const cookies = document.cookie.split(";");
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === name + "=") {
cookieValue = decodeURIComponent(
cookie.substring(name.length + 1)
);
break;
}
}
}
return cookieValue;
}
var csrf_token = getCookie("csrftoken");
var employee_id = $("#id_employee_id").val();
// this function is used to populate key-result in feedback form
var $select = $("#id_employee_id")
.select2({})
.on("change", function (e) {
const employee_id = $(this).val();
userKeyResults(employee_id, csrf_token);
});
$select.data("select2").$selection.addClass("oh-select--lg--custom"); //adding css class for the select
// this condition is used when the form is returned with an errror
if (employee_id) {
userKeyResults(employee_id, csrf_token);
}
// this section is ajax passing of employee id passing
function userKeyResults(employee_id, csrf_token) {
$.ajax({
url: "/pms/feedback-creation-ajax",
type: "POST",
dataType: "json",
data: { employee_id: employee_id, csrfmiddlewaretoken: csrf_token },
headers: {
"X-Requested-With": "XMLHttpRequest",
},
success: (data) => {
// data is a dictionary containt a list of key results object
// this condition is used assign key result of this employee
$("#id_employee_key_results_id").find("option").remove();
$("#id_employee_key_results_id").removeAttr("required");
var key_results = data.key_results;
var reporting_manager = data.reporting_manager;
$.each(key_results, function (key, value) {
// looping all key_results
var options = $(`<option value=" ${value.id}">`).text(
value.key_result
);
$("#id_employee_key_results_id")
.append(options)
.trigger("change");
});
},
error: (error) => {
console.log(error);
},
});
}
$("#id_period").on("change", function () {
period_id = $(this).val();

View File

@@ -188,7 +188,12 @@
<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>
<button id="keyresultButtton" hx-get="{% url 'get-collegues' %}" hx-target="#id_employee_key_results_id" hidden > </button>
<script>
$(document).ready(function(){
get_collegues($('#id_employee_id'))
});
function get_collegues(element) {
var employee_id = $(element).val();
@@ -200,6 +205,8 @@
$('#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();
// Dynamically set the hx-vals attribute for the keyresult button
$('#keyresultButtton').attr('hx-vals', JSON.stringify({ employee_id: employee_id, data: 'keyresults' })).click();
} else {
console.error('Invalid employee_id');
}

View File

@@ -108,17 +108,19 @@
{% endfor %}
</select>
<div class="oh-btn-group m-2">
{% if perms.pms.change_feedback and not feedback_started %}
<div class="d-flex flex-row-reverse">
<button
data-toggle="oh-modal-toggle"
class="oh-btn oh-btn--light-bkg w-100"
data-target="#feedbackModalPopup"
hx-get="{% url 'feedback-update' id=feedback.id %}"
hx-target="#feedbackModalTarget">
<ion-icon name="create-outline" class="me-1" ></ion-icon>
</button>
</div>
{% if not feedback_started %}
{% if perms.pms.change_feedback or request.user|is_reportingmanager %}
<div class="d-flex flex-row-reverse">
<button
data-toggle="oh-modal-toggle"
class="oh-btn oh-btn--light-bkg w-100"
data-target="#feedbackModalPopup"
hx-get="{% url 'feedback-update' id=feedback.id %}"
hx-target="#feedbackModalTarget">
<ion-icon name="create-outline" class="me-1" ></ion-icon>
</button>
</div>
{% endif %}
{% endif %}
<form action="{% url 'feedback-archive' id=feedback.id %}" method="post" onsubmit="return confirm('{% trans "Do you want archive this Feedback ?" %}')" >
<button class="oh-btn w-100 " title="{% trans 'Archive' %}" style="background-color: white;!important">
@@ -478,6 +480,24 @@
$("#closanswer").click(function (e) {
$("#answerViewAccordion").removeClass("oh-activity-sidebar--show");
});
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();
// Dynamically set the hx-vals attribute for the keyresult button
$('#keyresultButtton').attr('hx-vals', JSON.stringify({ employee_id: employee_id, data: 'keyresults' })).click();
} else {
console.error('Invalid employee_id');
}
}
</script>
{% endblock %}

View File

@@ -1,6 +1,7 @@
<!-- form non field errors -->
{% load i18n %}
{% load static %}
{% load widget_tweaks %}
{% if feedback_form.errors %}
<div class="oh-wrapper">
@@ -130,6 +131,11 @@
</div>
</form>
<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>
<button id="keyresultButtton" hx-get="{% url 'get-collegues' %}" hx-target="#id_employee_key_results_id" hidden > </button>
<script>
$(document).ready(function() {
if ($("#id_cyclic_feedback").prop("checked")){

View File

@@ -1491,9 +1491,7 @@ def feedback_creation(request):
Returns:
it will return feedback creation html.
"""
employee = request.user.employee_get
# if employe
form = FeedbackForm(employee=employee)
form = FeedbackForm()
context = {
"feedback_form": form,
}
@@ -1690,13 +1688,19 @@ def feedback_list_search(request):
requested_feedback = Feedback.objects.filter(pk__in=requested_feedback_ids).filter(
review_cycle__icontains=feedback
)
all_feedback = Feedback.objects.filter(
Q(
manager_id=employee_id,
manager_id__is_active=True,
archive=False,
if request.user.has_perm("pms.view_feedback"):
all_feedback = Feedback.objects.filter(archive=False).filter(
review_cycle__icontains=feedback
)
).filter(review_cycle__icontains=feedback)
else:
# feedbacks to review if employee is a manager
all_feedback = Feedback.objects.filter(
Q(
manager_id=employee_id,
manager_id__is_active=True,
archive=False,
)
).filter(review_cycle__icontains=feedback)
anonymous_feedback = (
AnonymousFeedback.objects.filter(employee_id=employee_id)
if not request.user.has_perm("pms.view_feedback")
@@ -1745,8 +1749,11 @@ def feedback_list_view(request):
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))
if user.has_perm("pms.view_feedback"):
feedback_all = Feedback.objects.filter(archive=False)
else:
# feedbacks to review if employee is a manager
feedback_all = Feedback.objects.filter(manager_id=employee, archive=False)
# Anonymous feedbacks
anonymous_feedback = (
AnonymousFeedback.objects.filter(employee_id=employee, archive=False)
@@ -1778,7 +1785,7 @@ def feedback_detailed_view(request, id, **kwargs):
"""
feedback = Feedback.objects.get(id=id)
is_have_perm = check_permission_feedback_detailed_view(
request, feedback, "pms.view_Feedback"
request, feedback, "pms.view_feedback"
)
if is_have_perm:
feedback_started = Answer.objects.filter(feedback_id=id)
@@ -1824,7 +1831,7 @@ def feedback_detailed_view_answer(request, id, emp_id):
employee = Employee.objects.filter(id=emp_id).first()
feedback = Feedback.objects.filter(id=id).first()
is_have_perm = check_permission_feedback_detailed_view(
request, feedback, "pms.view_Feedback"
request, feedback, "pms.view_feedback"
)
if is_have_perm:
answers = Answer.objects.filter(employee_id=employee, feedback_id=feedback)
@@ -2101,18 +2108,28 @@ def get_collegues(request):
if employee:
employees_queryset = []
reporting_manager = (
employee.employee_work_info.reporting_manager_id
if employee.employee_work_info
else None
)
if request.GET.get("data") == "colleagues":
department = employee.get_department()
# employee ids to exclude from collegue list
exclude_ids = [employee.id]
if reporting_manager:
exclude_ids.append(reporting_manager.id)
# 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(
is_active=True, employee_work_info__department_id=department
)
.exclude(id__in=exclude_ids)
.values_list("id", "employee_first_name")
)
elif request.GET.get("data") == "manager":
if reporting_manager:
employees_queryset = Employee.objects.filter(
id=reporting_manager.id
@@ -2121,6 +2138,10 @@ def get_collegues(request):
employees_queryset = Employee.objects.filter(
is_active=True, employee_work_info__reporting_manager_id=employee
).values_list("id", "employee_first_name")
elif request.GET.get("data") == "keyresults":
employees_queryset = EmployeeKeyResult.objects.filter(
employee_objective_id__employee_id=employee
).values_list("id", "key_result_id__title")
# Convert QuerySets to a list
employees = list(employees_queryset)
context = {"employees": employees}