[ADD] DASHBOARD: Feedback table and asset request approve table
This commit is contained in:
@@ -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 %}
|
||||
|
||||
@@ -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 ">
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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,})
|
||||
@@ -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 %}
|
||||
56
base/templates/request_and_approve/feedback_answer.html
Normal file
56
base/templates/request_and_approve/feedback_answer.html
Normal 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 %}
|
||||
10
base/urls.py
10
base/urls.py
@@ -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",
|
||||
),
|
||||
]
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user