[ADD] DASHBOARD: Feedback table and asset request approve table

This commit is contained in:
Horilla
2024-01-16 14:25:06 +05:30
parent c57f5ff183
commit 155b170b67
10 changed files with 253 additions and 19 deletions

View File

@@ -114,7 +114,8 @@
hx-target="#addAssetReportForm"
data-toggle="oh-modal-toggle"
data-target="#addAssetReport"
id="oh-btn-asset-update-modal">
id="oh-btn-asset-update-modal"
title='{% trans "Asset Report" %}'>
<ion-icon name="document-attach-outline"></ion-icon>
</a>
{% endif %}

View File

@@ -1,6 +1,6 @@
{% load i18n %}
<h5 >{% trans "Asset Approve" %}</h5>
<form hx-post="{%url 'asset-request-approve' req_id=id %}" hx-target="#asset-request-allocation-modal-target">
<form hx-post="{%url 'asset-request-approve' req_id=id %}">
{% csrf_token %}
<div class=" m-3">
<!-- <div class="oh-input__group ">

View File

@@ -2,8 +2,8 @@
<div class="oh-modal__dialog oh-modal__dialog--navigation m-0 p-0">
<button
hx-get="{% url 'asset-request-individual-view' previous %}?requests_ids={{requests_ids}}"
hx-target="#singleRequest"
hx-get="{% url 'asset-request-individual-view' previous %}?requests_ids={{requests_ids}}&dashboard={{dashboard}}"
hx-target="{% if dashboard == 'true' %}#smallModalTarget {% else %}#singleRequest{% endif %}"
class="oh-modal__diaglog-nav oh-modal__nav-prev"
>
<ion-icon
@@ -15,8 +15,8 @@
</button>
<button
hx-get="{% url 'asset-request-individual-view' next %}?requests_ids={{requests_ids}}"
hx-target="#singleRequest"
hx-get="{% url 'asset-request-individual-view' next %}?requests_ids={{requests_ids}}&dashboard={{dashboard}}"
hx-target="{% if dashboard == 'true' %}#smallModalTarget {% else %}#singleRequest{% endif %}"
class="oh-modal__diaglog-nav oh-modal__nav-next"
>
<ion-icon
@@ -89,9 +89,9 @@
class="oh-btn oh-btn--success w-100"
role="button"
data-toggle="oh-modal-toggle"
data-target="#asset-request-allocation-modal"
data-target="{% if dashboard == 'true' %}#editModal{% else %}#asset-request-allocation-modal{% endif %}"
hx-get="{% url 'asset-request-approve' req_id=asset_request.id %}"
hx-target="#asset-request-allocation-modal-target"
hx-target="{% if dashboard == 'true' %}#editModalForm {% else %}#asset-request-allocation-modal-target{% endif %}"
>
<ion-icon name="checkmark-outline"></ion-icon>{% trans 'Approve' %}
</a>

View File

@@ -17,7 +17,7 @@ from base.methods import closest_numbers, get_key_instances
from base.models import Company
from employee.models import EmployeeWorkInformation
from notifications.signals import notify
from horilla.decorators import login_required, hx_request_required
from horilla.decorators import login_required, hx_request_required, manager_can_enter
from horilla.decorators import permission_required
from asset.models import (
Asset,
@@ -516,7 +516,7 @@ def asset_request_creation(request):
@login_required
@permission_required(perm="asset.add_asset")
@manager_can_enter(perm="asset.add_asset")
def asset_request_approve(request, req_id):
"""
Approves an asset request with the given ID and updates the corresponding asset record
@@ -565,16 +565,15 @@ def asset_request_approve(request, req_id):
"request_allocation/asset_approve.html",
{"asset_allocation_form": form, "id": req_id},
)
return HttpResponse(
response.content.decode("utf-8") + "<script>location.reload();</script>"
)
return HttpResponse("<script>window.location.reload()</script>")
context["asset_allocation_form"] = form
return render(request, "request_allocation/asset_approve.html", context)
@login_required
@permission_required(perm="asset.add_asset")
@manager_can_enter(perm="asset.add_asset")
def asset_request_reject(request, req_id):
"""
View function to reject an asset request.
@@ -903,7 +902,7 @@ def asset_request_alloaction_view_search_filter(request):
def asset_request_individual_view(request, id):
asset_request = AssetRequest.objects.get(id=id)
context = {"asset_request": asset_request}
context = {"asset_request": asset_request,'dashboard': request.GET.get('dashboard'),}
requests_ids_json = request.GET.get("requests_ids")
if requests_ids_json:
requests_ids = json.loads(requests_ids_json)

View File

@@ -17,14 +17,21 @@ from horilla.decorators import login_required
from leave.models import LeaveRequest, LeaveRequestConditionApproval
def filtersubordinates(request, queryset, perm=None):
def filtersubordinates(request, queryset, perm=None,field=None):
"""
This method is used to filter out subordinates queryset element.
"""
user = request.user
if user.has_perm(perm):
return queryset
manager = Employee.objects.filter(employee_user_id=user).first()
if field:
filter_expression = f"{field}__employee_work_info__reporting_manager_id"
queryset = queryset.filter(**{filter_expression: manager})
return queryset
queryset = queryset.filter(
employee_id__employee_work_info__reporting_manager_id=manager
)

View File

@@ -7,6 +7,7 @@ This module is used to map url patterns with request and approve methods in Dash
from datetime import date
import json
from django.shortcuts import render
from asset.models import AssetRequest
from attendance.models import Attendance, AttendanceValidationCondition
from attendance.views.views import strtime_seconds
from base.methods import filtersubordinates
@@ -14,6 +15,8 @@ from base.models import ShiftRequest, WorkTypeRequest
from employee.not_in_out_dashboard import paginator_qry
from horilla.decorators import login_required
from leave.models import LeaveAllocationRequest, LeaveRequest
from pms.models import Feedback
from django.db.models import Q
@login_required
@@ -136,3 +139,26 @@ def leave_allocation_approve(request):
# "current_date":date.today(),
}
)
@login_required
def dashboard_feedback_answer(request):
employee = request.user.employee_get
feedback_requested = 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)
).distinct()
feedbacks = feedback_requested.exclude(feedback_answer__employee_id = employee)
return render(request, "request_and_approve/feedback_answer.html",{'feedbacks': feedbacks,'current_date':date.today()})
@login_required
def dashboard_asset_request_approve(request):
asset_requests = AssetRequest.objects.filter(asset_request_status='Requested')
asset_requests = filtersubordinates(
request, asset_requests, "asset.change_assetrequest", field="requested_employee_id"
)
requests_ids = json.dumps([instance.id for instance in asset_requests])
return render(request, "request_and_approve/asset_requests_approve.html",{'asset_requests': asset_requests,'requests_ids': requests_ids,})

View File

@@ -0,0 +1,87 @@
{% load i18n %}
{% if asset_requests %}
<div class="oh-sticky-table">
<div class="oh-sticky-table__table">
<div class="oh-sticky-table__thead">
<div class="oh-sticky-table__tr">
<div class="oh-sticky-table__th">{% trans "Request User" %}</div>
<div class="oh-sticky-table__th">{% trans "Asset Category" %}</div>
<div class="oh-sticky-table__th">{% trans "Request Date" %}</div>
<div class="oh-sticky-table__th"></div>
</div>
</div>
<div class="oh-sticky-table__tbody">
<div id="assetRequestAllocationTarget"></div>
{% for asset_request in asset_requests %}
<!-- asset request looping -->
<div
class="oh-sticky-table__tr"
draggable="true"
data-toggle="oh-modal-toggle"
data-target="#smallModal"
hx-get="{% url 'asset-request-individual-view' asset_request.id %}?requests_ids={{requests_ids}}&dashboard=true"
hx-target="#smallModalTarget"
>
<div class="oh-sticky-table__sd">
<div class="oh-profile oh-profile--md">
<div class="oh-profile__avatar mr-1">
<img
src="{{asset_request.requested_employee_id.get_avatar}}"
class="oh-profile__image"
alt="Mary Magdalene"
/>
</div>
<span class="oh-profile__name oh-text--dark"
>{{asset_request.requested_employee_id}}
</span>
</div>
</div>
<div class="oh-sticky-table__td">
{{asset_request.asset_category_id}}
</div>
<div class="oh-sticky-table__td dateformat_changer">
{{ asset_request.asset_request_date }}
</div>
{% if asset_request.asset_request_status == 'Requested' %}
<div class="oh-sticky-table__td">
<div class="oh-btn-group">
<a
class="oh-btn oh-btn--success w-50"
role="button"
onclick="event.stopPropagation()"
data-toggle="oh-modal-toggle"
data-target="#bigModal"
hx-get="{% url 'asset-request-approve' req_id=asset_request.id %}"
hx-target="#bigModalTarget"
title="Approve request"
>
<ion-icon name="checkmark-outline"></ion-icon>
</a>
<form
action="{% url 'asset-request-reject' req_id=asset_request.id %}"
method="post"
onclick="event.stopPropagation()"
title="Reject request"
class="w-50"
>
{% csrf_token %}
<button class="oh-btn oh-btn--danger w-100">
<ion-icon name="close-outline"></ion-icon>
</button>
</form>
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
</div>
</div>
{% else %}
<div style="height: 380px; display:flex;align-items: center;justify-content: center;" class="">
<div style="" class="">
<img style="display: block;width: 70px;margin: 20px auto ;" src="/static/images/ui/joiningchart.png" class="" alt=""/>
<h3 style="font-size:16px" class="oh-404__subtitle">{% trans "No data Found..." %}</h3>
</div>
</div>
{% endif %}

View File

@@ -0,0 +1,56 @@
{% load i18n %}
{% if feedbacks %}
<div class="oh-sticky-table">
<div class="oh-sticky-table__table">
<div class="oh-sticky-table__thead">
<div class="oh-sticky-table__tr">
<div class="oh-sticky-table__th">{% trans "Employee" %}</div>
<div class="oh-sticky-table__th">{% trans "Title" %}</div>
<div class="oh-sticky-table__th">{% trans "Due Date" %}</div>
<div class="oh-sticky-table__th"></div>
</div>
</div>
<div class="oh-sticky-table__tbody">
{% for feedback in feedbacks %}
<div class="oh-sticky-table__tr">
<div class="oh-sticky-table__sd">
<div class="oh-profile oh-profile--md">
<div class="oh-profile__avatar mr-1">
<img
src="{{feedback.employee_id.get_avatar}}"
class="oh-profile__image"
/>
</div>
<span class="oh-profile__name oh-text--dark"
>{{feedback.employee_id}}</span
>
</div>
</div>
<div class="oh-sticky-table__td">
{{feedback.review_cycle | title}}
</div>
<div class="oh-sticky-table__td">
{{ current_date|timesince:feedback.end_date }}
</div>
<div class="oh-sticky-table__td">
<div class="oh-btn-group">
<a
class="oh-btn oh-btn--info w-100"
href="{% url 'feedback-answer-get' id=feedback.id %}"
title="{% trans 'Answer' %}"
>{% trans "Answer" %}</a>
</div>
</div>
</div>
{% endfor%}
</div>
</div>
</div>
{% else %}
<div style="height: 380px; display:flex;align-items: center;justify-content: center;" class="">
<div style="" class="">
<img style="display: block;width: 70px;margin: 20px auto ;" src="/static/images/ui/joiningchart.png" class="" alt=""/>
<h3 style="font-size:16px" class="oh-404__subtitle">{% trans "No data Found..." %}</h3>
</div>
</div>
{% endif %}

View File

@@ -696,4 +696,14 @@ urlpatterns = [
request_and_approve.leave_allocation_approve,
name="leave-allocation-approve",
),
path(
"dashboard-feedback-answer",
request_and_approve.dashboard_feedback_answer,
name="dashboard-feedback-answer",
),
path(
"dashboard-asset-request-approve",
request_and_approve.dashboard_asset_request_approve,
name="dashboard-asset-request-approve",
),
]

View File

@@ -555,7 +555,7 @@
</div>
</div>
{% endif %}
{% if perms.attendance.change_leaverequest or request.user|is_reportingmanager %}
{% if perms.leave.change_leaverequest or request.user|is_reportingmanager %}
<div
class="col-12 col-sm-12 col-md-12 col-lg-6 oh-card-dashboard--moveable" id="LeaveApprove"
>
@@ -579,7 +579,7 @@
</div>
</div>
{% endif %}
{% if perms.attendance.change_leaveallocationrequest or request.user|is_reportingmanager %}
{% if perms.leave.change_leaveallocationrequest or request.user|is_reportingmanager %}
<div
class="col-12 col-sm-12 col-md-12 col-lg-6 oh-card-dashboard--moveable" id="LeaveAllocationApprove"
>
@@ -604,6 +604,54 @@
</div>
</div>
{% endif %}
<div
class="col-12 col-sm-12 col-md-12 col-lg-6 oh-card-dashboard--moveable" id="feedbackAnswer"
>
<div
class="oh-card-dashboard oh-card-dashboard--no-scale oh-card-dashboard--transparent" style="height:425px"
>
<div
class="oh-card-dashboard__header oh-card-dashboard__header--divider"
>
<span class="oh-card-dashboard__title"
>{% trans "Feedback Answer" %}</span
>
</div>
<div class="oh-card-dashboard__body"
id="feedbackAnswerBody"
hx-get='{% url "dashboard-feedback-answer" %}'
hx-trigger="load"
style="height:80%"
>
{% include "request_and_approve/feedback_answer.html" %}
</div>
</div>
</div>
{% if perms.asset.change_assetrequest or request.user|is_reportingmanager %}
<div
class="col-12 col-sm-12 col-md-12 col-lg-6 oh-card-dashboard--moveable" id="assetRequestApprove"
>
<div
class="oh-card-dashboard oh-card-dashboard--no-scale oh-card-dashboard--transparent" style="height:425px"
>
<div
class="oh-card-dashboard__header oh-card-dashboard__header--divider"
>
<span class="oh-card-dashboard__title"
>{% trans "Asset Request Approve" %}</span
>
</div>
<div class="oh-card-dashboard__body"
id="assetRequestApproveBody"
hx-get='{% url "dashboard-asset-request-approve" %}'
hx-trigger="load"
style="height:80%"
>
{% include "request_and_approve/asset_requests_approve.html" %}
</div>
</div>
</div>
{% endif %}
</div>
</div>
</div>
@@ -708,7 +756,7 @@
</button>
</div>
<div
class="oh-modal__dialog-body oh-modal__dialog-relative"
class="oh-modal__dialog-body oh-modal__dialog-relative oh-timeoff-modal__body"
id="smallModalTarget"
></div>
{% comment %} <div id="smallModalBody">