[FIX] PMS: Feedback create and update form issue
This commit is contained in:
30
pms/forms.py
30
pms/forms.py
@@ -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")
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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")){
|
||||
|
||||
63
pms/views.py
63
pms/views.py
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user