[ADD] SETTINGS: Department managers for helpdesk
This commit is contained in:
@@ -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"]
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'),
|
||||
|
||||
]
|
||||
|
||||
@@ -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", "/"))
|
||||
|
||||
Reference in New Issue
Block a user