[ADD] SETTINGS: Department managers for helpdesk

This commit is contained in:
Horilla
2024-01-09 10:32:18 +05:30
parent 44171526f6
commit b8267b7f50
9 changed files with 261 additions and 15 deletions

View File

@@ -23,7 +23,7 @@ class YourForm(forms.Form):
from base.forms import ModelForm
from base.models import Department, JobPosition
from employee.models import Employee
from helpdesk.models import Attachment, TicketType, FAQ,Ticket, FAQCategory, Comment
from helpdesk.models import Attachment, DepartmentManager, TicketType, FAQ,Ticket, FAQCategory, Comment
from django import forms
from django.template.loader import render_to_string
@@ -162,4 +162,10 @@ class AttachmentForm(forms.ModelForm):
}), label = "")
class Meta:
model = Attachment
fields = ['file','comment','ticket']
fields = ['file','comment','ticket']
class DepartmentManagerCreateForm(ModelForm):
class Meta:
model = DepartmentManager
fields = ["department", "manager"]

View File

@@ -0,0 +1,58 @@
{% extends 'settings.html' %}
{% load i18n %}
{% block settings %}
<div class="oh-inner-sidebar-content">
{% if perms.base.add_tags %}
<div class="oh-inner-sidebar-content__header d-flex justify-content-between align-items-center">
<h2 class="oh-inner-sidebar-content__title">{% trans "Department managers" %}</h2>
<button
class="oh-btn oh-btn--secondary oh-btn--shadow"
data-toggle="oh-modal-toggle"
data-target="#deparmentManagersModal"
hx-get="{% url 'department-manager-create' %}"
hx-target="#deparmentManagersModal"
>
<ion-icon name="add-outline" class="me-1"></ion-icon>
{% trans "Create" %}
</button>
</div>
{% include 'department_managers/department_managers_view.html' %}
{% endif %}
</div>
<!-- start of modals -->
<!-- start of create modal -->
<div
class="oh-modal"
id="deparmentManagersModal"
role="dialog"
aria-labelledby="deparmentManagersModal"
aria-hidden="true"
>
</div>
<!-- end of create modal -->
<!-- start of edit modal -->
<div
class="oh-modal"
id="depatmentManagerEditModal"
role="dialog"
aria-labelledby="depatmentManagerEditModal"
aria-hidden="true"
>
<div class="oh-modal__dialog">
<div class="oh-modal__dialog-header">
<h2 class="oh-modal__dialog-title" id="editModaltitle">
{% trans "mDepartment Manager Update" %}
</h2>
<button class="oh-modal__close" aria-label="Close">
<ion-icon name="close-outline"></ion-icon>
</button>
</div>
<div class="oh-modal__dialog-body" id="departmentManagerEditForm"></div>
</div>
</div>
<!-- end of edit modal -->
<!-- end of modals -->
{% endblock settings %}

View File

@@ -0,0 +1,48 @@
{% load i18n %}
<div class="oh-modal__dialog">
<div class="oh-modal__dialog-header">
<h2 class="oh-modal__dialog-title" id="createModalTitle">
{% if dep_id %}
{% trans "update Tag" %}
{% else %}
{% trans "Create Tag" %}
{% endif %}
</h2>
<button class="oh-modal__close" aria-label="Close">
<ion-icon name="close-outline"></ion-icon>
</button>
</div>
<div class="oh-modal__dialog-body" id="deparmentManagersForm">
{% if form.errors %}
<!-- form errors -->
<div class="oh-wrapper">
<div class="oh-alert-container">
{% for error in form.non_field_errors %}
<div class="oh-alert oh-alert--animated oh-alert--danger">
{{ error }}
</div>
{% endfor %}
</div>
</div>
{% endif %}
<form
{% if dep_id %}
hx-post="{% url 'department-manager-update' dep_id %}"
{% else %}
hx-post="{% url 'department-manager-create' %}"
{% endif %}
hx-target="#deparmentManagersForm"
method="post"
hx-encoding="multipart/form-data">
{% csrf_token %}
{{form.as_p}}
<button
type="submit"
class="oh-btn oh-btn--secondary mt-2 mr-0 oh-btn--w-100-resp"
>
{% trans "Save" %}
</button>
</form>
</div>
</div>

View File

@@ -0,0 +1,55 @@
{% load i18n %}
<div class="oh-sticky-table">
<div class="oh-sticky-table__table oh-table--sortable">
<div class="oh-sticky-table__thead">
<div class="oh-sticky-table__tr">
<div class="oh-sticky-table__th">{% trans "department" %}</div>
<div class="oh-sticky-table__th">{% trans "manager" %}</div>
<div class="oh-sticky-table__th">{% trans "Actions" %}</div>
</div>
</div>
<div class="oh-sticky-table__tbody">
{% for manager in department_managers %}
<div class="oh-sticky-table__tr" draggable="true">
<div class="oh-sticky-table__td">{{manager.department}}</div>
<div class="oh-sticky-table__td">
{{manager.manager}}
</div>
<div class="oh-sticky-table__td">
<div class="oh-btn-group">
{% if perms.helpdesk.change_departmentmanager %}
<a
hx-get="{% url 'department-manager-update' manager.id %}"
hx-target="#deparmentManagersModal"
data-toggle="oh-modal-toggle"
data-target="#deparmentManagersModal"
type="button"
class="oh-btn oh-btn--light-bkg w-50"
title="{% trans 'Edit' %}"
>
<ion-icon name="create-outline"></ion-icon
></a>
{% endif %}
{% if perms.helpdesk.delete_departmentmanager %}
<form
action="{% url 'department-manager-delete' manager.id %}"
class="w-50"
onsubmit="return confirm('{% trans "Are you sure you want to delete this ticket type?" %}');"
method='post'>
{% csrf_token %}
<button
type="submit"
class="oh-btn oh-btn--danger-outline oh-btn--light-bkg w-100"
title="{% trans 'Remove' %}"
>
<ion-icon name="trash-outline"></ion-icon>
</button>
</form>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>

View File

@@ -305,7 +305,7 @@
</div>
</div>
<div class="oh-sticky-table__td">
{% if ticket.assigned_to.all %}
{% if ticket.assigned_to.all request.user.employee_get == ticket.employee_id %}
<a
type="submit"
class="oh-btn oh-btn--info w-100 oh-btn--disabled"

View File

@@ -30,7 +30,10 @@ class TicketSendThread(Thread):
self.protocol = "https" if request.is_secure() else "http"
raised_on = ticket.get_raised_on_object()
if isinstance(raised_on,Department):
self.department_manager = raised_on.dept_manager.all().first().manager
if raised_on.dept_manager.all():
self.department_manager = raised_on.dept_manager.all().first().manager
else:
self.department_manager = None
def send_email(self, subject, content, recipients, ticket_id="#"):
host = self.host

View File

@@ -7,7 +7,7 @@ from django.urls import path
from base.views import object_delete
from helpdesk import views
from helpdesk.models import FAQ
from helpdesk.models import FAQ, FAQCategory, Ticket
urlpatterns = [
path("faq-category-view/", views.faq_category_view, name="faq-category-view"),
@@ -20,7 +20,7 @@ urlpatterns = [
),
path("faq-category-search/", views.faq_category_search, name="faq-category-search"),
path("faq-view/<int:cat_id>/", views.faq_view, name="faq-view"),
path("faq-view/<int:cat_id>/", views.faq_view, name="faq-view",kwargs={'model':FAQCategory}),
path("faq-create/<int:cat_id>/", views.create_faq, name="faq-create"),
path("faq-update/<int:id>", views.faq_update, name="faq-update"),
path("faq-search/", views.faq_search, name="faq-search"),
@@ -39,13 +39,13 @@ urlpatterns = [
path("change-ticket-status/<int:ticket_id>/", views.change_ticket_status, name="change-ticket-status"),
path("ticket-delete/<int:ticket_id>", views.ticket_delete, name="ticket-delete"),
path('ticket-filter',views.ticket_filter,name='ticket-filter'),
path("ticket-detail/<int:ticket_id>/", views.ticket_detail, name="ticket-detail"),
path("ticket-detail/<int:ticket_id>/", views.ticket_detail, name="ticket-detail",kwargs={'model':Ticket}),
path('ticket-change-tag',views.ticket_update_tag,name='ticket-change-tag'),
path('ticket-change-raised-on/<int:ticket_id>',views.ticket_change_raised_on,name='ticket-change-raised-on'),
path('ticket-change-assignees/<int:ticket_id>',views.ticket_change_assignees,name='ticket-change-assignees'),
path('ticket-create-tag',views.create_tag,name='ticket-create-tag'),
path('remove-tag',views.remove_tag,name='remove-tag'),
path('commemt-create/<int:ticket_id>',views.comment_create,name='comment-create'),
path('comment-create/<int:ticket_id>',views.comment_create,name='comment-create'),
path('comment-edit/',views.comment_edit,name='comment-edit'),
path('comment-delete/<int:comment_id>/',views.comment_delete,name='comment-delete'),
path('get-raised-on',views.get_raised_on,name='get-raised-on'),
@@ -53,7 +53,9 @@ urlpatterns = [
path('tickets-select-filter',views.tickets_select_filter,name='tickets-select-filter'),
path('tickets-bulk-archive',views.tickets_bulk_archive,name='tickets-bulk-archive'),
path('tickets-bulk-delete',views.tickets_bulk_delete,name='tickets-bulk-delete'),
path('department-manager-view/',views.view_department_managers,name='department-manager-view'),
path('department-manager-create/',views.create_department_manager,name='department-manager-create'),
path('department-manager-update/<int:dep_id>',views.update_department_manager,name='department-manager-update'),
path('department-manager-delete/<int:dep_id>',views.delete_department_manager,name='department-manager-delete'),
]

View File

@@ -9,7 +9,7 @@ from base.methods import filtersubordinates, get_key_instances
from base.models import Department, JobPosition, Tags
from employee.models import Employee
from helpdesk.filter import FAQCategoryFilter, FAQFilter,TicketFilter, TicketReGroup
from helpdesk.forms import AttachmentForm, CommentForm, FAQCategoryForm, FAQForm,TicketForm, TicketRaisedOnForm, TicketTagForm ,TicketAssigneesForm
from helpdesk.forms import AttachmentForm, CommentForm, DepartmentManagerCreateForm, FAQCategoryForm, FAQForm,TicketForm, TicketRaisedOnForm, TicketTagForm ,TicketAssigneesForm
from django.utils.translation import gettext as _
from django.contrib import messages
from django.db.models import ProtectedError
@@ -20,7 +20,7 @@ from helpdesk.threading import AddAssigneeThread, RemoveAssigneeThread, TicketSe
from notifications.signals import notify
from horilla.decorators import login_required, manager_can_enter, owner_can_enter, permission_required
from helpdesk.models import FAQ, TICKET_STATUS, Attachment, Comment, FAQCategory,Ticket,TicketType
from helpdesk.models import FAQ, TICKET_STATUS, Attachment, Comment, DepartmentManager, FAQCategory,Ticket,TicketType
# Create your views here.
@@ -153,7 +153,7 @@ def faq_category_search(request):
@login_required
def faq_view(request,cat_id):
def faq_view(request,cat_id,**kwargs):
"""
This function is responsible for rendering the FAQ view.
@@ -681,7 +681,7 @@ def ticket_filter(request):
return render(request, template, context)
@login_required
def ticket_detail(request,ticket_id):
def ticket_detail(request,ticket_id,**kwargs):
today = datetime.now().date()
ticket = Ticket.objects.get(id=ticket_id)
c_form = CommentForm()
@@ -1016,4 +1016,70 @@ def tickets_bulk_delete(request):
)
except ProtectedError:
messages.error(request, _("You cannot delete this Ticket."))
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
@login_required
def add_department_manager(request):
form = DepartmentManagerCreateForm()
if request.method == "POST":
form = DepartmentManagerCreateForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponse("<script>window.location.reload()</script>")
context = {
'form': form,
}
return render(request, "helpdesk/faq/department_managers_form.html", context)
@login_required
def create_department_manager(request):
form = DepartmentManagerCreateForm()
if request.method == "POST":
form = DepartmentManagerCreateForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, _('The department manager created successfully.'))
return HttpResponse("<script>window.location.reload()</script>")
context = {
'form': form,
}
return render(request, "department_managers/department_managers_form.html", context)
@login_required
def update_department_manager(request,dep_id):
department_manager = DepartmentManager.objects.get(id=dep_id)
form = DepartmentManagerCreateForm(instance=department_manager)
if request.method == "POST":
form = DepartmentManagerCreateForm(request.POST, request.FILES)
if form.is_valid():
form.save()
messages.success(request, _('The department manager updated successfully.'))
return HttpResponse("<script>window.location.reload()</script>")
context = {
'form': form,
'dep_id':dep_id,
}
return render(request, "department_managers/department_managers_form.html", context)
@login_required
def view_department_managers(request):
department_managers = DepartmentManager.objects.all()
context = {
'department_managers': department_managers,
}
return render(request, "department_managers/department_managers.html", context)
@login_required
def delete_department_manager(request,dep_id):
department_manager = DepartmentManager.objects.get(id=dep_id)
department_manager.delete()
messages.error(request,_("The department manager has been deleted successfully"))
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))