From b65fbe865860d1ed9c05ec6077cdbaa3b2fdb05d Mon Sep 17 00:00:00 2001 From: Horilla Date: Thu, 19 Sep 2024 10:26:41 +0530 Subject: [PATCH] [ADD] PMS: Feedback overview --- pms/models.py | 20 + .../feedback/feedback_detailed_view.html | 708 ++++++++++-------- pms/templates/feedback/feedback_overview.html | 155 ++++ pms/urls.py | 5 + pms/views.py | 48 +- 5 files changed, 639 insertions(+), 297 deletions(-) create mode 100644 pms/templates/feedback/feedback_overview.html diff --git a/pms/models.py b/pms/models.py index aaae6cc29..6085c02cb 100644 --- a/pms/models.py +++ b/pms/models.py @@ -546,6 +546,26 @@ class Feedback(HorillaModel): def __str__(self): return f"{self.employee_id.employee_first_name} - {self.review_cycle}" + def requested_employees(self): + manager = self.manager_id + colleagues = self.colleague_id.all() + subordinates = self.subordinate_id.all() + owner = self.employee_id + + employees = [employee for employee in subordinates] + + for employee in colleagues: + if employee not in employees: + employees.append(employee) + + if manager not in employees: + employees.append(manager) + + if owner not in employees: + employees.append(owner) + + return employees + class AnonymousFeedback(models.Model): """feedback model for creating feedback""" diff --git a/pms/templates/feedback/feedback_detailed_view.html b/pms/templates/feedback/feedback_detailed_view.html index 86c9756df..ad6f5ea26 100644 --- a/pms/templates/feedback/feedback_detailed_view.html +++ b/pms/templates/feedback/feedback_detailed_view.html @@ -3,314 +3,432 @@ {% load static i18n %} {% load i18n %} {% load basefilters %} +{% load mathfilters %} +
-
-
-

{% trans "Feedback" %}: {{feedback.review_cycle}}

-
-
-
- . -
- {{feedback.employee_id}} -
- +
+
+
+

{% trans "Feedback" %}: {{feedback}}

-
- - {% if perms.pms.delete_feedback or request.user|filtersubordinates %} -
-
-
-
- -
- {% if perms.pms.delete_feedback %} -
- {% csrf_token %} - -
+ +
+
+ {% trans "Owner: " %} + +
+ . +
+ {{feedback.employee_id}} +
+ {% if perms.pms.delete_feedback or request.user|filtersubordinates %} +
+ +
+
+ +
+ {% if perms.pms.delete_feedback %} +
+ {% csrf_token %} + +
+ {% endif %} +
+
{% endif %}
+
+
+ {% trans "Due on: " %} + {{feedback.end_date}} + + + + + + +
+
+ {% trans "Answered employees: " %} +
+
+ {% for employee in employee_statics.yes %} + + {% endfor %} +
+
+
+
+ {% trans "Employees not answerd yet: " %} +
+
+ {% for employee in employee_statics.no %} + + {% endfor %} +
+
+
+
+ +
- {% endif %} -
+ +
-
- {% if perms.pms.change_feedback and not feedback_started %} -
- +
+ {% endif %} +
+
+
+
+
+
+
+
+
{% trans "Employee" %}
+
{% trans "Status" %}
+
+
+
+
+
+
+
    +
  • +
    +
    + {{feedback.employee_id}} +
    + {{feedback.employee_id}} +
    +
  • +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+
+
+
+
+
{% trans "Manager" %}
+
{% trans "Status" %}
+
+
+
+
+
+
+
    +
  • +
    +
    + {{feedback.employee_id}} +
    + {{feedback.manager_id}} +
    +
  • +
+
+
+
+ +
+
+
+
+ +
+
+ + {% trans "Answers" %} +
+
+
    + {% for answer in manager_answers %} + {% include 'feedback/feedback_detailed_view_answer.html' %} + {%endfor %} +
+
+
+ +
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
{% trans "Subordinates" %}
+
{% trans "Status" %}
+
+
+
+
+ {% for employee in feedback.subordinate_id.all %} +
+
+
    +
  • +
    +
    + +
    + {{employee}} +
    +
  • +
+
+
+
+ +
+
+
+
+ {% endfor %} +
+
+
+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+
{% trans "Colleague" %}
+
{% trans "Status" %}
+
+
+
+
+ {% for employee in feedback.colleague_id.all %} +
+
+
    +
  • +
    +
    + +
    + {{employee}} +
    +
  • +
+
+
+
+ +
+
+
+
+ {% endfor %} +
+
+
+
+
+
+
+
+
+ + +
+
+ -
- {% endif %} -
-
-
-
-
-
-
-
-
{% trans "Employee" %}
-
{% trans "Status" %}
-
{% trans "Due" %}
-
-
-
-
-
-
-
    -
  • -
    -
    - {{feedback.employee_id}} -
    - {{feedback.employee_id}} -
    -
  • -
-
-
-
- -
-
-
-
- {{ current_date|timesince:feedback.end_date }} -
-
-
-
-
-
-
-
-
- -
+
- - - -
-
-
-
-
-
-
-
-
{% trans "Manager" %}
-
{% trans "Status" %}
-
{% trans "Due" %}
-
-
-
-
-
-
-
    -
  • -
    -
    - {{feedback.employee_id}} -
    - {{feedback.manager_id}} -
    -
  • -
-
-
-
- -
-
-
-
- {{ current_date|timesince:feedback.end_date }} -
-
-
-
- -
-
- - {% trans "Answers" %} -
-
-
    - {% for answer in manager_answers %} - {% include 'feedback/feedback_detailed_view_answer.html' %} - {%endfor %} -
-
-
- -
-
-
-
-
-
-
- - - -
-
-
-
-
-
-
-
-
{% trans "Subordinates" %}
-
{% trans "Status" %}
-
{% trans "Due" %}
-
-
-
-
- {% for employee in feedback.subordinate_id.all %} -
-
-
    -
  • -
    -
    - -
    - {{employee}} -
    -
  • -
-
-
-
- -
-
-
-
- {{ current_date|timesince:feedback.end_date }} -
-
-
-
- {% endfor %} -
-
-
-
-
-
-
- - - - -
-
-
-
-
-
-
-
-
{% trans "Colleague" %}
-
{% trans "Status" %}
-
{% trans "Due" %}
-
-
-
-
- {% for employee in feedback.colleague_id.all %} -
-
-
    -
  • -
    -
    - -
    - {{employee}} -
    -
  • -
-
-
-
- -
-
-
-
- {{feedback.end_date|timeuntil}} -
-
-
-
- {% endfor %} -
-
-
-
-
-
-
- - - +
diff --git a/pms/templates/feedback/feedback_overview.html b/pms/templates/feedback/feedback_overview.html new file mode 100644 index 000000000..8428fa702 --- /dev/null +++ b/pms/templates/feedback/feedback_overview.html @@ -0,0 +1,155 @@ + +{% load i18n %} +
+
+ {% for question,answers in feedback_overview.items %} +
+
+ +
+ + {{question}} + +
+
+
+
+
+
+
+
+
+
{% trans "Employee" %}
+
{% trans "Answer" %}
+
+
+
+ {% for answer in answers %} + {% for key,value in answer.items %} +
+
+
+
+ +
+ {{key}} +
+
+
+ {% if value.1.type == '1' %} + {{ value.0.answer}} + {% endif %} + + {% if value.1.type == '2' %} +
+
+ + + + + + + + + + +
+
+ {% endif %} + + {% if value.1.type == '3' %} +
+
+
+ {{value.0.answer}} + +
+
+
+ {% endif %} + + {% if value.1.type == '4' %} +
+ +
+ {% endif %} + + {% if value.1.type == '5' %} +
+
+
+ {{value.0.answer}} +
+
+
+ {% endif %} + +
+
+ {% endfor %} + + {% endfor %} + +
+
+
+
+
+
+ {% endfor %} +
+
+ + diff --git a/pms/urls.py b/pms/urls.py index 64b84fc25..211f7c499 100644 --- a/pms/urls.py +++ b/pms/urls.py @@ -167,6 +167,11 @@ urlpatterns = [ views.feedback_detailed_view_status, name="feedback-detailed-view-status", ), + path( + "get-feedback-overview/", + views.get_feedback_overview, + name="get-feedback-overview", + ), path("feedback-status", views.feedback_status, name="feedback-status"), path( "question-creation/", views.question_creation, name="question-creation" diff --git a/pms/views.py b/pms/views.py index 8dbd0107e..4bdf7fa4d 100644 --- a/pms/views.py +++ b/pms/views.py @@ -1782,12 +1782,23 @@ def feedback_detailed_view(request, id, **kwargs): ) if is_have_perm: feedback_started = Answer.objects.filter(feedback_id=id) - current_date = datetime.datetime.now() + employees = feedback.requested_employees() + yes = [] + no = [] + for employee in employees: + if Answer.objects.filter( + feedback_id=feedback, employee_id=employee + ).exists(): + yes.append(employee) + else: + no.append(employee) + employee_statics = {"yes": yes, "no": no} context = { "feedback": feedback, "feedback_started": feedback_started, "feedback_status": Feedback.STATUS_CHOICES, - "current_date": current_date, + "employee_statics": employee_statics, + "today": datetime.datetime.today().date(), } return render(request, "feedback/feedback_detailed_view.html", context) else: @@ -2026,6 +2037,39 @@ def feedback_detailed_view_status(request, id): return render(request, "message.html") +@login_required +def get_feedback_overview(request, obj_id): + """ + overview of feedback + """ + feedback = Feedback.objects.filter(id=obj_id).first() if obj_id else None + if feedback and check_permission_feedback_detailed_view( + request, feedback, perm="pms.view_feedback" + ): + question_template = feedback.question_template_id + questions = question_template.question.all() + feedback_answers = feedback.feedback_answer.all() + feedback_overview = {} + for question in questions: + answer_list = [] + for answer in feedback_answers: + if answer.question_id == question: + answer_list.append( + { + answer.employee_id: [ + answer.answer, + {"type": answer.question_id.question_type}, + ] + } + ) + feedback_overview[question] = answer_list + return render( + request, + "feedback/feedback_overview.html", + context={"feedback_overview": feedback_overview}, + ) + + @login_required def feedback_archive(request, id): """