diff --git a/helpdesk/templates/helpdesk/ticket/ticket_filter.html b/helpdesk/templates/helpdesk/ticket/ticket_filter.html index 4040ce129..4ee3d897c 100644 --- a/helpdesk/templates/helpdesk/ticket/ticket_filter.html +++ b/helpdesk/templates/helpdesk/ticket/ticket_filter.html @@ -1,8 +1,14 @@ {% load i18n %}
diff --git a/helpdesk/templates/helpdesk/ticket/ticket_group.html b/helpdesk/templates/helpdesk/ticket/ticket_group.html index 23dad7c6f..9f560078d 100644 --- a/helpdesk/templates/helpdesk/ticket/ticket_group.html +++ b/helpdesk/templates/helpdesk/ticket/ticket_group.html @@ -8,8 +8,7 @@
{% if my_tickets %}
- {% dynamic_regroup my_tickets by field as my_ticket_grouper %} - {% for my_ticket_list in my_ticket_grouper %} + {% for my_ticket_list in my_tickets %}
@@ -18,7 +17,7 @@ - {{my_ticket_list.list|length}} + {{my_ticket_list.list.paginator.count}} {{my_ticket_list.grouper}}
@@ -147,74 +146,145 @@
- -
- {% trans "Page" %} {{ my_tickets.number }} {% trans "of" %} {{ my_tickets.paginator.num_pages }}. + {% trans "Page" %} {{ my_ticket_list.list.number }} + {%trans "of" %} {{my_ticket_list.list.paginator.num_pages }}. -
- +
{% endfor %} + +
+ + +
{% else %}
@@ -228,8 +298,7 @@
{% if allocated_tickets %}
- {% dynamic_regroup allocated_tickets by field as allocated_tickets_grouper %} - {% for allocated_tickets_list in allocated_tickets_grouper %} + {% for allocated_tickets_list in allocated_tickets %}
@@ -238,7 +307,7 @@ - {{allocated_tickets_list.list|length}} + {{allocated_tickets_list.list.paginator.count}} {{allocated_tickets_list.grouper}}
@@ -369,72 +438,143 @@
-
- {% trans "Page" %} {{ allocated_tickets.number }} {% trans "of" %} {{ allocated_tickets.paginator.num_pages }}. + {% trans "Page" %} {{ allocated_tickets_list.list.number }} + {%trans "of" %} {{allocated_tickets_list.list.paginator.num_pages }}.
-
{% endfor %}
+
+ + +
{% else %}
@@ -447,8 +587,7 @@
{% if all_tickets %}
- {% dynamic_regroup all_tickets by field as all_tickets_grouper %} - {% for all_tickets_list in all_tickets_grouper %} + {% for all_tickets_list in all_tickets %}
@@ -457,7 +596,7 @@ - {{all_tickets_list.list|length}} + {{all_tickets_list.list.paginator.count}} {{all_tickets_list.grouper}}
@@ -586,74 +725,147 @@
- - - +
- {% trans "Page" %} {{ all_tickets.number }} {% trans "of" %} {{ all_tickets.paginator.num_pages }}. + {% trans "Page" %} {{ all_tickets_list.list.number }} + {%trans "of" %} {{all_tickets_list.list.paginator.num_pages }}.
- + +
{% endfor %} + +
+ + +
{% else %}
diff --git a/helpdesk/views.py b/helpdesk/views.py index 29625101d..09f7fb94d 100644 --- a/helpdesk/views.py +++ b/helpdesk/views.py @@ -4,12 +4,24 @@ from operator import itemgetter from urllib.parse import parse_qs from django.http import HttpResponse, JsonResponse, HttpResponseRedirect from django.shortcuts import redirect, render +from attendance.methods.group_by import group_by_queryset from base.forms import TagsForm from base.methods import filtersubordinates, get_key_instances, get_pagination 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, DepartmentManagerCreateForm, FAQCategoryForm, FAQForm,TicketForm, TicketRaisedOnForm, TicketTagForm ,TicketAssigneesForm, TicketTypeForm +from helpdesk.filter import FAQCategoryFilter, FAQFilter, TicketFilter, TicketReGroup +from helpdesk.forms import ( + AttachmentForm, + CommentForm, + DepartmentManagerCreateForm, + FAQCategoryForm, + FAQForm, + TicketForm, + TicketRaisedOnForm, + TicketTagForm, + TicketAssigneesForm, + TicketTypeForm, +) from django.utils.translation import gettext as _ from django.contrib import messages from django.db.models import ProtectedError @@ -19,11 +31,26 @@ from django.core.paginator import Paginator from helpdesk.threading import AddAssigneeThread, RemoveAssigneeThread, TicketSendThread 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, DepartmentManager, FAQCategory,Ticket,TicketType +from horilla.decorators import ( + login_required, + manager_can_enter, + owner_can_enter, + permission_required, +) +from helpdesk.models import ( + FAQ, + TICKET_STATUS, + Attachment, + Comment, + DepartmentManager, + FAQCategory, + Ticket, + TicketType, +) # Create your views here. + def paginator_qry(qryset, page_number): """ This method is used to paginate query set @@ -44,7 +71,7 @@ def faq_category_view(request): faq_categories = FAQCategory.objects.all() context = { - "faq_categories" : faq_categories, + "faq_categories": faq_categories, "f": FAQFilter(request.GET), } @@ -70,19 +97,17 @@ def faq_category_create(request): form = FAQCategoryForm(request.POST) if form.is_valid(): form.save() - messages.success( - request, _('The FAQ Category created successfully.') - ) + messages.success(request, _("The FAQ Category created successfully.")) return HttpResponse("") context = { - 'form': form, + "form": form, } return render(request, "helpdesk/faq/faq_category_create.html", context) @login_required @permission_required("helpdesk_changefaqcategory") -def faq_category_update(request,id): +def faq_category_update(request, id): """ This function is responsible for updating the FAQ. @@ -96,17 +121,15 @@ def faq_category_update(request,id): """ faq_category = FAQCategory.objects.get(id=id) - form = FAQCategoryForm(instance = faq_category) + form = FAQCategoryForm(instance=faq_category) if request.method == "POST": - form = FAQCategoryForm(request.POST,instance = faq_category) + form = FAQCategoryForm(request.POST, instance=faq_category) if form.is_valid(): form.save() - messages.info( - request, _('The FAQ category updated successfully.') - ) + messages.info(request, _("The FAQ category updated successfully.")) return HttpResponse("") context = { - 'form': form, + "form": form, "faq_category": faq_category, } return render(request, "helpdesk/faq/faq_category_create.html", context) @@ -118,9 +141,7 @@ def faq_category_delete(request, id): try: faq = FAQCategory.objects.get(id=id) faq.delete() - messages.success( - request, _('The FAQ category has been deleted successfully.') - ) + messages.success(request, _("The FAQ category has been deleted successfully.")) except ProtectedError: messages.error(request, _("You cannot delete this FAQ category.")) return redirect(faq_category_view) @@ -138,11 +159,11 @@ def faq_category_search(request): GET : return faq filter form template POST : return faq view """ - + previous_data = request.GET.urlencode() faq_categories = FAQCategoryFilter(request.GET).qs data_dict = parse_qs(previous_data) - get_key_instances(FAQCategory, data_dict) + get_key_instances(FAQCategory, data_dict) context = { "faq_categories": faq_categories, "f": FAQCategoryFilter(request.GET), @@ -153,7 +174,7 @@ def faq_category_search(request): @login_required -def faq_view(request,cat_id,**kwargs): +def faq_view(request, cat_id, **kwargs): """ This function is responsible for rendering the FAQ view. @@ -164,10 +185,10 @@ def faq_view(request,cat_id,**kwargs): faqs = FAQ.objects.filter(category=cat_id) context = { - "faqs" : faqs, + "faqs": faqs, "f": FAQFilter(request.GET), - 'cat_id':cat_id, - 'create_tag_f':TagsForm() + "cat_id": cat_id, + "create_tag_f": TagsForm(), } return render(request, "helpdesk/faq/faq_list_view.html", context=context) @@ -175,7 +196,7 @@ def faq_view(request,cat_id,**kwargs): @login_required @permission_required("helpdesk_addfaq") -def create_faq(request,cat_id): +def create_faq(request, cat_id): """ This function is responsible for creating the FAQ. @@ -187,25 +208,23 @@ def create_faq(request,cat_id): POST : return faq view """ - form = FAQForm(initial={'category':cat_id}) + form = FAQForm(initial={"category": cat_id}) if request.method == "POST": form = FAQForm(request.POST) if form.is_valid(): form.save() - messages.success( - request, _('The FAQ created successfully.') - ) + messages.success(request, _("The FAQ created successfully.")) return HttpResponse("") context = { - 'form': form, - 'cat_id':cat_id, + "form": form, + "cat_id": cat_id, } return render(request, "helpdesk/faq/faq_create.html", context) @login_required @permission_required("helpdesk_changefaq") -def faq_update(request,id): +def faq_update(request, id): """ This function is responsible for updating the FAQ. @@ -219,24 +238,20 @@ def faq_update(request,id): """ faq = FAQ.objects.get(id=id) - form = FAQForm(instance = faq) + form = FAQForm(instance=faq) if request.method == "POST": - form = FAQForm(request.POST,instance = faq) + form = FAQForm(request.POST, instance=faq) if form.is_valid(): form.save() - messages.info( - request, _('The FAQ updated successfully.') - ) + messages.info(request, _("The FAQ updated successfully.")) return HttpResponse("") context = { - 'form': form, + "form": form, "faq": faq, } return render(request, "helpdesk/faq/faq_create.html", context) - - @login_required def faq_search(request): """ @@ -249,27 +264,31 @@ def faq_search(request): GET : return faq filter form template POST : return faq view """ - id = request.GET.get('cat_id', '') - category = request.GET.get('category', '') + id = request.GET.get("cat_id", "") + category = request.GET.get("category", "") previous_data = request.GET.urlencode() - query = request.GET.get('search', '') + query = request.GET.get("search", "") faqs = FAQ.objects.filter(is_active=True) data_dict = parse_qs(previous_data) get_key_instances(FAQ, data_dict) - + if query: - results_list = SearchQuerySet().filter(Q(question__icontains=query) | Q(answer__icontains=query)).using("default") + results_list = ( + SearchQuerySet() + .filter(Q(question__icontains=query) | Q(answer__icontains=query)) + .using("default") + ) result_pks = [result.pk for result in results_list] faqs = FAQ.objects.filter(pk__in=result_pks) - + else: faqs = FAQ.objects.filter(is_active=True) if category: return redirect(faq_category_search) - + if id: data_dict.pop("cat_id") - faqs = faqs.filter(category = id) + faqs = faqs.filter(category=id) if category: data_dict.pop("category") context = { @@ -277,13 +296,13 @@ def faq_search(request): "f": FAQFilter(request.GET), "pd": previous_data, "filter_dict": data_dict, - 'query': query, + "query": query, } return render(request, "helpdesk/faq/faq_list.html", context) @login_required -def faq_filter(request,id): +def faq_filter(request, id): """ This function is responsible for filter the FAQ. @@ -294,12 +313,12 @@ def faq_filter(request,id): GET : return faq filter form template POST : return faq view """ - + previous_data = request.GET.urlencode() faqs = FAQFilter(request.GET).qs - faqs =faqs.filter(category = id) + faqs = faqs.filter(category=id) data_dict = parse_qs(previous_data) - get_key_instances(FAQ, data_dict) + get_key_instances(FAQ, data_dict) context = { "faqs": faqs, "f": FAQFilter(request.GET), @@ -314,10 +333,11 @@ def faq_suggestion(request): faqs = FAQFilter(request.GET).qs data_list = list(faqs.values()) response = { - "faqs" :data_list, + "faqs": data_list, } return JsonResponse(response) + @login_required @permission_required("helpdesk_deletefaq") def faq_delete(request, id): @@ -330,7 +350,7 @@ def faq_delete(request, id): ) except ProtectedError: messages.error(request, _("You cannot delete this FAQ.")) - return redirect(faq_view,cat_id=cat_id) + return redirect(faq_view, cat_id=cat_id) @login_required @@ -341,49 +361,53 @@ def ticket_view(request): Parameters: request (HttpRequest): The HTTP request object. """ - tickets =Ticket.objects.filter(is_active=True) - + tickets = Ticket.objects.filter(is_active=True) + previous_data = request.GET.urlencode() - if request.method =='GET': + if request.method == "GET": tickets = TicketFilter(request.GET).qs my_page_number = request.GET.get("my_page") all_page_number = request.GET.get("all_page") allocated_page_number = request.GET.get("allocated_page") - my_tickets = tickets.filter(is_active=True, employee_id = request.user.employee_get).order_by("-created_date") - + my_tickets = tickets.filter( + is_active=True, employee_id=request.user.employee_get + ).order_by("-created_date") all_tickets = tickets.filter(is_active=True).order_by("-created_date") all_tickets = filtersubordinates(request, all_tickets, "helpdesk.add_tickets") - - allocated_tickets=[] + allocated_tickets = [] ticket_list = tickets.filter(is_active=True) user = request.user.employee_get - if hasattr(user, 'employee_work_info'): + if hasattr(user, "employee_work_info"): department = user.employee_work_info.department_id job_position = user.employee_work_info.job_position_id if department: - tickets_items = ticket_list.filter(raised_on = department.id,assigning_type = "department" ) + tickets_items = ticket_list.filter( + raised_on=department.id, assigning_type="department" + ) allocated_tickets += tickets_items if job_position: - tickets_items = ticket_list.filter(raised_on = job_position.id,assigning_type = "job_position" ) + tickets_items = ticket_list.filter( + raised_on=job_position.id, assigning_type="job_position" + ) allocated_tickets += tickets_items - - tickets_items = ticket_list.filter(raised_on = user.id,assigning_type = "individual" ) + + tickets_items = ticket_list.filter(raised_on=user.id, assigning_type="individual") allocated_tickets += tickets_items - + data_dict = parse_qs(previous_data) - get_key_instances(Ticket, data_dict) + get_key_instances(Ticket, data_dict) template = "helpdesk/ticket/ticket_view.html" context = { "my_tickets": paginator_qry(my_tickets, my_page_number), "all_tickets": paginator_qry(all_tickets, all_page_number), "allocated_tickets": paginator_qry(allocated_tickets, allocated_page_number), "f": TicketFilter(request.GET), - "gp_fields":TicketReGroup.fields, - "ticket_status":TICKET_STATUS, - "view": request.GET.get('view'), + "gp_fields": TicketReGroup.fields, + "ticket_status": TICKET_STATUS, + "view": request.GET.get("view"), "today": datetime.today().date(), "filter_dict": data_dict, } @@ -404,30 +428,30 @@ def ticket_create(request): POST : return Ticket view """ - form = TicketForm(initial={'employee_id':request.user}) - if request.GET.get('status'): - status = request.GET.get('status') - form = TicketForm(initial={'status':status,'employee_id':request.user}) + form = TicketForm(initial={"employee_id": request.user}) + if request.GET.get("status"): + status = request.GET.get("status") + form = TicketForm(initial={"status": status, "employee_id": request.user}) if request.method == "POST": - form = TicketForm(request.POST,request.FILES) - if form.is_valid(): + form = TicketForm(request.POST, request.FILES) + if form.is_valid(): ticket = form.save() - attachments = form.files.getlist('attachment') + attachments = form.files.getlist("attachment") for attachment in attachments: - attachment_instance= Attachment(file=attachment,ticket=ticket) + attachment_instance = Attachment(file=attachment, ticket=ticket) attachment_instance.save() mail_thread = TicketSendThread(request, ticket, type="create") mail_thread.start() - messages.success( - request, _('The Ticket created successfully.') - ) + messages.success(request, _("The Ticket created successfully.")) employees = ticket.assigned_to.all() assignees = [employee.employee_user_id for employee in employees] - assignees.append(ticket.employee_id.employee_user_id) - if hasattr(ticket.get_raised_on_object(), 'dept_manager'): + assignees.append(ticket.employee_id.employee_user_id) + if hasattr(ticket.get_raised_on_object(), "dept_manager"): if ticket.get_raised_on_object().dept_manager.all(): - manager = ticket.get_raised_on_object().dept_manager.all().first().manager - assignees.append(manager.employee_user_id) + manager = ( + ticket.get_raised_on_object().dept_manager.all().first().manager + ) + assignees.append(manager.employee_user_id) notify.send( request.user.employee_get, recipient=assignees, @@ -441,15 +465,15 @@ def ticket_create(request): ) return HttpResponse("") context = { - 'form': form, - 't_type_form':TicketTypeForm(), + "form": form, + "t_type_form": TicketTypeForm(), } return render(request, "helpdesk/ticket/ticket_form.html", context) @login_required @owner_can_enter("perms.helpdesk.helpdesk_changeticket", Ticket) -def ticket_update(request,ticket_id): +def ticket_update(request, ticket_id): """ This function is responsible for updating the Ticket. @@ -464,29 +488,26 @@ def ticket_update(request,ticket_id): ticket = Ticket.objects.get(id=ticket_id) form = TicketForm(instance=ticket) if request.method == "POST": - form = TicketForm(request.POST,request.FILES,instance=ticket) + form = TicketForm(request.POST, request.FILES, instance=ticket) if form.is_valid(): ticket = form.save() - attachments = form.files.getlist('attachment') + attachments = form.files.getlist("attachment") for attachment in attachments: - attachment_instance= Attachment(file=attachment,ticket=ticket) + attachment_instance = Attachment(file=attachment, ticket=ticket) attachment_instance.save() - messages.success( - request, _('The Ticket updated successfully.') - ) + messages.success(request, _("The Ticket updated successfully.")) return HttpResponse("") context = { - 'form': form, - 'ticket_id':ticket_id, - 't_type_form':TicketTypeForm(), - + "form": form, + "ticket_id": ticket_id, + "t_type_form": TicketTypeForm(), } return render(request, "helpdesk/ticket/ticket_form.html", context) @login_required @permission_required("helpdesk_changeticket") -def ticket_archive(request,ticket_id): +def ticket_archive(request, ticket_id): """ This function is responsible for archiving the Ticket. @@ -505,21 +526,19 @@ def ticket_archive(request,ticket_id): ticket.is_active = True ticket.save() - messages.success( - request, _('The Ticket updated successfully.') - ) - return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + messages.success(request, _("The Ticket updated successfully.")) + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) @login_required -def change_ticket_status(request,ticket_id): +def change_ticket_status(request, ticket_id): """ This function is responsible for changing the Ticket status. - + Parameters: request (HttpRequest): The HTTP request object. ticket_id (int): The ID of the Ticket - + Returns: return Ticket view """ @@ -528,25 +547,31 @@ def change_ticket_status(request,ticket_id): status = request.POST.get("status") user = request.user.employee_get if ticket.status != status: - if user == ticket.employee_id or user in ticket.assigned_to.all() or request.user.has_perm("helpdesk_changeticket"): + if ( + user == ticket.employee_id + or user in ticket.assigned_to.all() + or request.user.has_perm("helpdesk_changeticket") + ): ticket.status = status ticket.save() - time =datetime.now() + time = datetime.now() time = time.strftime("%b. %d, %Y, %I:%M %p") response = { - "type" :"success", - "message": _('The Ticket status updated successfully.'), - "user":user.get_full_name(), - 'pre_status':pre_status, - 'cur_status':ticket.get_status_display(), - 'time':time, + "type": "success", + "message": _("The Ticket status updated successfully."), + "user": user.get_full_name(), + "pre_status": pre_status, + "cur_status": ticket.get_status_display(), + "time": time, } employees = ticket.assigned_to.all() assignees = [employee.employee_user_id for employee in employees] assignees.append(ticket.employee_id.employee_user_id) - if hasattr(ticket.get_raised_on_object(), 'dept_manager'): + if hasattr(ticket.get_raised_on_object(), "dept_manager"): if ticket.get_raised_on_object().dept_manager.all(): - manager = ticket.get_raised_on_object().dept_manager.all().first().manager + manager = ( + ticket.get_raised_on_object().dept_manager.all().first().manager + ) assignees.append(manager.employee_user_id) notify.send( request.user.employee_get, @@ -559,11 +584,15 @@ def change_ticket_status(request,ticket_id): icon="infinite", redirect=f"/helpdesk/ticket-detail/{ticket.id}", ) - mail_thread = TicketSendThread(request, ticket, type="status_change",) + mail_thread = TicketSendThread( + request, + ticket, + type="status_change", + ) mail_thread.start() else: response = { - "type" :"danger", + "type": "danger", "message": _("You Don't have the permission."), } @@ -577,26 +606,32 @@ def change_ticket_status(request,ticket_id): def ticket_delete(request, ticket_id): """ This function is responsible for deleting the Ticket. - + Parameters: request (HttpRequest): The HTTP request object. ticket_id (int): The ID of the Ticket - + Returns: return Ticket view """ try: ticket = Ticket.objects.get(id=ticket_id) - - mail_thread = TicketSendThread(request, ticket, type="delete",) + + mail_thread = TicketSendThread( + request, + ticket, + type="delete", + ) mail_thread.start() employees = ticket.assigned_to.all() assignees = [employee.employee_user_id for employee in employees] assignees.append(ticket.employee_id.employee_user_id) - if hasattr(ticket.get_raised_on_object(), 'dept_manager'): + if hasattr(ticket.get_raised_on_object(), "dept_manager"): if ticket.get_raised_on_object().dept_manager.all(): - manager = ticket.get_raised_on_object().dept_manager.all().first().manager - assignees.append(manager.employee_user_id) + manager = ( + ticket.get_raised_on_object().dept_manager.all().first().manager + ) + assignees.append(manager.employee_user_id) notify.send( request.user.employee_get, recipient=assignees, @@ -614,18 +649,25 @@ def ticket_delete(request, ticket_id): ) except ProtectedError: messages.error(request, _("You cannot delete this Ticket.")) - return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + def get_allocated_tickets(request): user = request.user.employee_get department = user.employee_work_info.department_id job_position = user.employee_work_info.job_position_id - tickets_items1 = Ticket.objects.filter(is_active=True,raised_on = department.id,assigning_type = "department" ) + tickets_items1 = Ticket.objects.filter( + is_active=True, raised_on=department.id, assigning_type="department" + ) # allocated_tickets += tickets_items - tickets_items2 = Ticket.objects.filter(is_active=True,raised_on = job_position.id,assigning_type = "job_position" ) + tickets_items2 = Ticket.objects.filter( + is_active=True, raised_on=job_position.id, assigning_type="job_position" + ) # allocated_tickets += tickets_items - tickets_items3 = Ticket.objects.filter(is_active=True,raised_on = user.id,assigning_type = "individual" ) + tickets_items3 = Ticket.objects.filter( + is_active=True, raised_on=user.id, assigning_type="individual" + ) # allocated_tickets += tickets_items allocated_tickets = tickets_items1 | tickets_items2 | tickets_items3 return allocated_tickets @@ -648,79 +690,112 @@ def ticket_filter(request): my_page_number = request.GET.get("my_page") all_page_number = request.GET.get("all_page") allocated_page_number = request.GET.get("allocated_page") - tickets_items1 =[] - tickets_items2 =[] + tickets_items1 = [] + tickets_items2 = [] - my_tickets = tickets.filter(is_active=True, employee_id = request.user.employee_get).order_by("-created_date") + my_tickets = tickets.filter( + is_active=True, employee_id=request.user.employee_get + ).order_by("-created_date") all_tickets = tickets.filter(is_active=True).order_by("-created_date") all_tickets = filtersubordinates(request, tickets, "helpdesk.add_tickets") - allocated_tickets=[] + allocated_tickets = [] user = request.user.employee_get department = user.employee_work_info.department_id job_position = user.employee_work_info.job_position_id ticket_list = tickets.filter(is_active=True) - if hasattr(user, 'employee_work_info'): + if hasattr(user, "employee_work_info"): department = user.employee_work_info.department_id job_position = user.employee_work_info.job_position_id if department: - tickets_items1 = ticket_list.filter(raised_on = department.id,assigning_type = "department" ) + tickets_items1 = ticket_list.filter( + raised_on=department.id, assigning_type="department" + ) if job_position: - tickets_items2 = ticket_list.filter(raised_on = job_position.id,assigning_type = "job_position" ) + tickets_items2 = ticket_list.filter( + raised_on=job_position.id, assigning_type="job_position" + ) - tickets_items3 = ticket_list.filter(raised_on = user.id,assigning_type = "individual" ) + tickets_items3 = ticket_list.filter(raised_on=user.id, assigning_type="individual") template = "helpdesk/ticket/ticket_list.html" - if request.GET.get('view') == 'card': + if request.GET.get("view") == "card": template = "helpdesk/ticket/ticket_card.html" - + allocated_tickets = ( + list(tickets_items1) + list(tickets_items2) + list(tickets_items3) + ) field = request.GET.get("field") if field != "" and field is not None: - field_copy = field.replace(".", "__") - my_tickets = my_tickets.order_by(field_copy) - all_tickets = all_tickets.order_by(field_copy) - tickets_items1 = tickets_items1.order_by(field_copy) - tickets_items2 = tickets_items2.order_by(field_copy) - tickets_items3 = tickets_items3.order_by(field_copy) - template = 'helpdesk/ticket/ticket_group.html' - allocated_tickets = list(tickets_items1)+list(tickets_items2)+list(tickets_items3) + my_tickets = group_by_queryset( + my_tickets, field, request.GET.get("my_page"), "my_page" + ) + all_tickets = group_by_queryset( + all_tickets, field, request.GET.get("all_page"), "all_page" + ) + tickets_items1 = group_by_queryset( + tickets_items1, field, request.GET.get("allocated_page"), "allocated_page" + ) + tickets_items2 = group_by_queryset( + tickets_items2, field, request.GET.get("allocated_page"), "allocated_page" + ) + tickets_items3 = group_by_queryset( + tickets_items3, field, request.GET.get("allocated_page"), "allocated_page" + ) + template = "helpdesk/ticket/ticket_group.html" + allocated_tickets = ( + list(tickets_items1) + list(tickets_items2) + list(tickets_items3) + ) + else: + my_tickets = paginator_qry(my_tickets, my_page_number) + all_tickets = paginator_qry(all_tickets, all_page_number) + allocated_tickets = paginator_qry(allocated_tickets, allocated_page_number) + data_dict = parse_qs(previous_data) - get_key_instances(Ticket, data_dict) + get_key_instances(Ticket, data_dict) context = { - "my_tickets": paginator_qry(my_tickets, my_page_number), - "all_tickets": paginator_qry(all_tickets, all_page_number), - "allocated_tickets": paginator_qry(allocated_tickets, allocated_page_number), + "my_tickets": my_tickets, + "all_tickets": all_tickets, + "allocated_tickets": allocated_tickets, "f": TicketFilter(request.GET), "pd": previous_data, - "ticket_status":TICKET_STATUS, + "ticket_status": TICKET_STATUS, "filter_dict": data_dict, - "field":field, + "field": field, "today": datetime.today().date(), } - + return render(request, template, context) + @login_required -def ticket_detail(request,ticket_id,**kwargs): +def ticket_detail(request, ticket_id, **kwargs): today = datetime.now().date() ticket = Ticket.objects.get(id=ticket_id) c_form = CommentForm() f_form = AttachmentForm() attachments = ticket.ticket_attachment.all() - activity_list =[] + activity_list = [] comments = ticket.comment.all() trackings = ticket.tracking() - for comment in comments : - activity_list.append({"type" :"comment", "comment": comment,"date": comment.date}) + for comment in comments: + activity_list.append( + {"type": "comment", "comment": comment, "date": comment.date} + ) for history in trackings: - activity_list.append({"type" :"history","history": history,"date": history['pair'][0].history_date}) + activity_list.append( + { + "type": "history", + "history": history, + "date": history["pair"][0].history_date, + } + ) sorted_activity_list = sorted(activity_list, key=itemgetter("date")) - color="success" + color = "success" remaining_days = ticket.deadline - today remaining = f"Due in {remaining_days.days} days" if remaining_days.days < 0: @@ -730,23 +805,21 @@ def ticket_detail(request,ticket_id,**kwargs): remaining = "Due Today" color = "warning" - context={ - 'ticket':ticket, - 'c_form':c_form, - 'f_form':f_form, - 'attachments':attachments, - "ticket_status":TICKET_STATUS, - 'tag_form':TicketTagForm(instance=ticket), - "sorted_activity_list":sorted_activity_list, - 'create_tag_f':TagsForm(), - 'color':color, - 'remaining':remaining, - } - return render( - request, - 'helpdesk/ticket/ticket_detail.html', - context=context - ) + context = { + "ticket": ticket, + "c_form": c_form, + "f_form": f_form, + "attachments": attachments, + "ticket_status": TICKET_STATUS, + "tag_form": TicketTagForm(instance=ticket), + "sorted_activity_list": sorted_activity_list, + "create_tag_f": TagsForm(), + "color": color, + "remaining": remaining, + } + return render(request, "helpdesk/ticket/ticket_detail.html", context=context) + + @login_required # @owner_can_enter("perms.helpdesk.helpdesk_changeticket", Ticket) def ticket_update_tag(request): @@ -754,73 +827,79 @@ def ticket_update_tag(request): method to update the tags of ticket """ data = request.GET - ticket = Ticket.objects.get(id=data['ticketId']) - tagids = data.getlist('selectedValues[]') + ticket = Ticket.objects.get(id=data["ticketId"]) + tagids = data.getlist("selectedValues[]") ticket.tags.clear() for tagId in tagids: tag = Tags.objects.get(id=tagId) ticket.tags.add(tag) response = { - "type" :"success", - "message": _('The Ticket tag updated successfully.'), - } + "type": "success", + "message": _("The Ticket tag updated successfully."), + } return JsonResponse(response) + @login_required @owner_can_enter("perms.helpdesk.helpdesk_changeticket", Ticket) -def ticket_change_raised_on(request,ticket_id): +def ticket_change_raised_on(request, ticket_id): ticket = Ticket.objects.get(id=ticket_id) form = TicketRaisedOnForm(instance=ticket) - if request.method == 'POST': - form = TicketRaisedOnForm(request.POST,instance=ticket) + if request.method == "POST": + form = TicketRaisedOnForm(request.POST, instance=ticket) if form.is_valid(): form.save() - messages.success(request,_("Responsibility updated for the Ticket")) - return redirect(ticket_detail,ticket_id=ticket_id) + messages.success(request, _("Responsibility updated for the Ticket")) + return redirect(ticket_detail, ticket_id=ticket_id) return render( request, - 'helpdesk/ticket/forms/change_raised_on.html', - { - 'form':form, - 'ticket_id':ticket_id - } + "helpdesk/ticket/forms/change_raised_on.html", + {"form": form, "ticket_id": ticket_id}, ) + @login_required @manager_can_enter("helpdesk_changeticket") -def ticket_change_assignees(request,ticket_id): +def ticket_change_assignees(request, ticket_id): ticket = Ticket.objects.get(id=ticket_id) - prev_assignee_ids = ticket.assigned_to.values_list('id', flat=True) + prev_assignee_ids = ticket.assigned_to.values_list("id", flat=True) form = TicketAssigneesForm(instance=ticket) - if request.method == 'POST': - form = TicketAssigneesForm(request.POST,instance=ticket) + if request.method == "POST": + form = TicketAssigneesForm(request.POST, instance=ticket) if form.is_valid(): form.save(commit=False) - new_assignee_ids =form.cleaned_data['assigned_to'].values_list('id',flat=True) + new_assignee_ids = form.cleaned_data["assigned_to"].values_list( + "id", flat=True + ) added_assignee_ids = set(new_assignee_ids) - set(prev_assignee_ids) removed_assignee_ids = set(prev_assignee_ids) - set(new_assignee_ids) added_assignees = Employee.objects.filter(id__in=added_assignee_ids) removed_assignees = Employee.objects.filter(id__in=removed_assignee_ids) form.save() - - mail_thread = AddAssigneeThread(request, ticket,added_assignees,) + + mail_thread = AddAssigneeThread( + request, + ticket, + added_assignees, + ) mail_thread.start() - mail_thread = RemoveAssigneeThread(request, ticket,removed_assignees,) + mail_thread = RemoveAssigneeThread( + request, + ticket, + removed_assignees, + ) mail_thread.start() - messages.success(request,_("Assinees updated for the Ticket")) + messages.success(request, _("Assinees updated for the Ticket")) + + return redirect(ticket_detail, ticket_id=ticket_id) - return redirect(ticket_detail,ticket_id=ticket_id) - return render( request, - 'helpdesk/ticket/forms/change_assinees.html', - { - 'form':form, - 'ticket_id':ticket_id - } + "helpdesk/ticket/forms/change_assinees.html", + {"form": form, "ticket_id": ticket_id}, ) @@ -835,41 +914,42 @@ def create_tag(request): if form.is_valid(): instance = form.save() - response= { - "errors": 'no_error', - "tag_id": instance.id, - "title": instance.title, - } + response = { + "errors": "no_error", + "tag_id": instance.id, + "title": instance.title, + } return JsonResponse(response) - + errors = form.errors.as_json() return JsonResponse({"errors": errors}) - + @login_required def remove_tag(request): """ This is an ajax method to remove tag from a ticket. """ - + data = request.GET - ticket_id = data['ticket_id'] - tag_id = data['tag_id'] + ticket_id = data["ticket_id"] + tag_id = data["tag_id"] try: ticket = Ticket.objects.get(id=ticket_id) tag = Tags.objects.get(id=tag_id) ticket.tags.remove(tag) # message = messages.success(request,_("Success")) - message = _('success') - type = "success" + message = _("success") + type = "success" except: - message = messages.error(request,_("Failed")) - - return JsonResponse({'message':message,'type':type}) + message = messages.error(request, _("Failed")) + + return JsonResponse({"message": message, "type": type}) + @login_required -def comment_create(request,ticket_id): - """" +def comment_create(request, ticket_id): + """ " This method is used to create comment to a ticket """ if request.method == "POST": @@ -881,72 +961,89 @@ def comment_create(request,ticket_id): comment.ticket = ticket comment.save() if request.FILES: - f_form = AttachmentForm(request.FILES) + f_form = AttachmentForm(request.FILES) if f_form.is_valid(): - files = request.FILES.getlist('file') + files = request.FILES.getlist("file") for file in files: - a_form =AttachmentForm({"file":file,'comment':comment,"ticket":ticket}) - a_form.save() - messages.success(request,_("A new comment has been created.")) - return redirect(ticket_detail,ticket_id=ticket_id) - - + a_form = AttachmentForm( + {"file": file, "comment": comment, "ticket": ticket} + ) + a_form.save() + messages.success(request, _("A new comment has been created.")) + return redirect(ticket_detail, ticket_id=ticket_id) + + @login_required def comment_edit(request): - comment_id = request.POST.get('comment_id') - new_comment = request.POST.get('new_comment') - if len(new_comment)>1: + comment_id = request.POST.get("comment_id") + new_comment = request.POST.get("new_comment") + if len(new_comment) > 1: comment = Comment.objects.get(id=comment_id) comment.comment = new_comment comment.save() - messages.success(request,_('The comment updated successfully.')) + messages.success(request, _("The comment updated successfully.")) else: - messages.error(request,_('The comment needs to be atleast 2 charactors.')) - response= { - "errors": 'no_error', + messages.error(request, _("The comment needs to be atleast 2 charactors.")) + response = { + "errors": "no_error", } return JsonResponse(response) @login_required -def comment_delete(request,comment_id): +def comment_delete(request, comment_id): comment = Comment.objects.get(id=comment_id) comment.delete() - messages.success(request,_('The comment "{}" has been deleted successfully.').format(comment)) + messages.success( + request, _('The comment "{}" has been deleted successfully.').format(comment) + ) + + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + - return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) - @login_required def get_raised_on(request): """ This is an ajax method to return list for raised on field. """ - data = request.GET - assigning_type = data['assigning_type'] - - if assigning_type == 'department': + data = request.GET + assigning_type = data["assigning_type"] + + if assigning_type == "department": # Retrieve data from the Department model and format it as a list of dictionaries - departments = Department.objects.values('id', 'department') - raised_on = [{'id': dept['id'], 'name': dept['department']} for dept in departments] - elif assigning_type == 'job_position': - jobpositions = JobPosition.objects.values('id','job_position') - raised_on = [{'id': job['id'], 'name': job['job_position']} for job in jobpositions] - elif assigning_type == 'individual': - employees = Employee.objects.values('id','employee_first_name','employee_last_name') - raised_on = [{'id': employee['id'], 'name': f"{employee['employee_first_name']} {employee['employee_last_name']}"} for employee in employees] - response={ - 'raised_on': list(raised_on) - } + departments = Department.objects.values("id", "department") + raised_on = [ + {"id": dept["id"], "name": dept["department"]} for dept in departments + ] + elif assigning_type == "job_position": + jobpositions = JobPosition.objects.values("id", "job_position") + raised_on = [ + {"id": job["id"], "name": job["job_position"]} for job in jobpositions + ] + elif assigning_type == "individual": + employees = Employee.objects.values( + "id", "employee_first_name", "employee_last_name" + ) + raised_on = [ + { + "id": employee["id"], + "name": f"{employee['employee_first_name']} {employee['employee_last_name']}", + } + for employee in employees + ] + response = {"raised_on": list(raised_on)} return JsonResponse(response) + @login_required -def claim_ticket(request,id): +def claim_ticket(request, id): ticket = Ticket.objects.get(id=id) if ticket.employee_id != request.user.employee_get: ticket.assigned_to.set([request.user.employee_get]) ticket.save() - return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + @login_required def tickets_select_filter(request): @@ -959,22 +1056,20 @@ def tickets_select_filter(request): table = request.GET.get("tableName") user = request.user.employee_get - tickets_filter = TicketFilter(filters, queryset=Ticket.objects.filter(is_active=True)) + tickets_filter = TicketFilter( + filters, queryset=Ticket.objects.filter(is_active=True) + ) if page_number == "all": if table == "all": - tickets_filter = TicketFilter( - filters, queryset=Ticket.objects.all() - ) - elif table == 'my': + tickets_filter = TicketFilter(filters, queryset=Ticket.objects.all()) + elif table == "my": tickets_filter = TicketFilter( filters, queryset=Ticket.objects.filter(employee_id=user) - ) + ) else: allocated_tickets = get_allocated_tickets(request) - tickets_filter = TicketFilter( - filters, queryset= allocated_tickets - ) - + tickets_filter = TicketFilter(filters, queryset=allocated_tickets) + # Get the filtered queryset filtered_tickets = tickets_filter.qs @@ -984,7 +1079,7 @@ def tickets_select_filter(request): context = {"ticket_ids": ticket_ids, "total_count": total_count} return JsonResponse(context) - + @login_required @permission_required("helpdesk_changeticket") @@ -1001,10 +1096,9 @@ def tickets_bulk_archive(request): ticket = Ticket.objects.get(id=ticket_id) ticket.is_active = is_active ticket.save() - messages.success( - request, _('The Ticket updated successfully.') - ) - return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + messages.success(request, _("The Ticket updated successfully.")) + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + @login_required # @owner_can_enter("perms.helpdesk.helpdesk_changeticket", Ticket) @@ -1017,15 +1111,21 @@ def tickets_bulk_delete(request): for ticket_id in ids: try: ticket = Ticket.objects.get(id=ticket_id) - mail_thread = TicketSendThread(request, ticket, type="delete",) + mail_thread = TicketSendThread( + request, + ticket, + type="delete", + ) mail_thread.start() employees = ticket.assigned_to.all() assignees = [employee.employee_user_id for employee in employees] assignees.append(ticket.employee_id.employee_user_id) - if hasattr(ticket.get_raised_on_object(), 'dept_manager'): + if hasattr(ticket.get_raised_on_object(), "dept_manager"): if ticket.get_raised_on_object().dept_manager.all(): - manager = ticket.get_raised_on_object().dept_manager.all().first().manager - assignees.append(manager.employee_user_id) + manager = ( + ticket.get_raised_on_object().dept_manager.all().first().manager + ) + assignees.append(manager.employee_user_id) notify.send( request.user.employee_get, recipient=assignees, @@ -1039,11 +1139,13 @@ def tickets_bulk_delete(request): ) ticket.delete() messages.success( - request, _('The Ticket "{}" has been deleted successfully.').format(ticket) + request, + _('The Ticket "{}" has been deleted successfully.').format(ticket), ) 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): @@ -1052,10 +1154,10 @@ def add_department_manager(request): form = DepartmentManagerCreateForm(request.POST, request.FILES) if form.is_valid(): form.save() - + return HttpResponse("") context = { - 'form': form, + "form": form, } return render(request, "helpdesk/faq/department_managers_form.html", context) @@ -1067,46 +1169,46 @@ def create_department_manager(request): form = DepartmentManagerCreateForm(request.POST, request.FILES) if form.is_valid(): form.save() - messages.success(request, _('The department manager created successfully.')) - + messages.success(request, _("The department manager created successfully.")) + return HttpResponse("") context = { - 'form': form, + "form": form, } return render(request, "department_managers/department_managers_form.html", context) @login_required -def update_department_manager(request,dep_id): +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.')) + messages.success(request, _("The department manager updated successfully.")) return HttpResponse("") context = { - 'form': form, - 'dep_id':dep_id, + "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, + "department_managers": department_managers, } return render(request, "department_managers/department_managers.html", context) @login_required -def delete_department_manager(request,dep_id): +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", "/")) - \ No newline at end of file + messages.error(request, _("The department manager has been deleted successfully")) + + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))