diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index 63086987..fa3ec6ff 100644 Binary files a/osinaweb/db.sqlite3 and b/osinaweb/db.sqlite3 differ diff --git a/osinaweb/osinacore/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/__pycache__/views.cpython-310.pyc index a1fa5e8a..c00748e1 100644 Binary files a/osinaweb/osinacore/__pycache__/views.cpython-310.pyc and b/osinaweb/osinacore/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osinacore/templates/details_templates/ticket-details.html b/osinaweb/osinacore/templates/details_templates/ticket-details.html index 4b28e4ae..62778329 100644 --- a/osinaweb/osinacore/templates/details_templates/ticket-details.html +++ b/osinaweb/osinacore/templates/details_templates/ticket-details.html @@ -4,15 +4,51 @@
-

Ticket: {{ticket.ticket_number}}

+

Ticket #{{ticket.ticket_number}}

+ + {% if last_ticket_status.status == 'Open' %} +
+
+

Opened by {{last_ticket_status.added_by.first_name}} at {{last_ticket_status.date_added}}

+
+ {% elif last_ticket_status.status == 'Working On' %} +
+
+

Updated to 'Working On' by {{last_ticket_status.added_by.first_name}} at {{last_ticket_status.date_added}}

+
+ {% elif last_ticket_status.status == 'Closed' %}
-

Closed by Linode at 20-4-24 16:30

+

Closed by {{last_ticket_status.added_by.first_name}} at {{last_ticket_status.date_added}}

+
+ {% endif %} + + +
+

{{ticket.description}} +

+
+ + {% if ticket.ticketattachment_set.all %} + + {% endif %} +
+
{% for update in ticket_updates %} @@ -67,6 +103,22 @@ {{update.description}}

+ + {% if update.ticketattachment_set.all %} + + {% endif %} +
@@ -112,7 +164,7 @@
- + diff --git a/osinaweb/osinacore/templates/listing_pages/tickets.html b/osinaweb/osinacore/templates/listing_pages/tickets.html index 159b3385..c34b4e79 100644 --- a/osinaweb/osinacore/templates/listing_pages/tickets.html +++ b/osinaweb/osinacore/templates/listing_pages/tickets.html @@ -26,13 +26,16 @@
-

Open Tickets

-

Closed Tickets

+ +
-
+ + + +
@@ -65,28 +68,112 @@ + + {% for ticket in open_tickets %} + + + + + {% endfor %} +
-

My - Account Balance

+

{{ticket.title}}

-

22666766

+

{{ticket.ticket_number}}

-

Django

+

{{ticket.regarding}}

-

20-2-2024

+

{{ticket.last_update_date_added}}

-

Ositcom Ltd

+

{{ticket.last_update_added_by}}

+
+ +
+
+ + + + + + + + +
+ + + {% endblock %} \ No newline at end of file diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index 4e740c20..0835181d 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -245,14 +245,6 @@ def customers(request, *args, **kwargs): return render(request, 'listing_pages/customers.html', context) -@staff_login_required -def tickets(request, *args, **kwargs): - - context = { - - } - - return render(request, 'listing_pages/tickets.html', context) @staff_login_required @@ -334,6 +326,53 @@ def my_tasks(request, *args, **kwargs): return render(request, 'listing_pages/tasks.html', context) +@staff_login_required +def tickets(request, *args, **kwargs): + if request.user.is_superuser: + open_tickets = Ticket.objects.filter(status__in=['Open', 'Working On']) + closed_tickets = Ticket.objects.filter(status__in=['Closed']) + else: + open_tickets = Ticket.objects.filter(status__in=['Open', 'Working On'], department=request.user.staffprofile.staff_position.department) + closed_tickets = Ticket.objects.filter(status__in=['Closed'], department=request.user.staffprofile.staff_position.department) + + for ticket in open_tickets: + unread_updates_count = 0 + last_update = ticket.ticketupdate_set.exclude(added_by=request.user).order_by('-date_added').first() + if last_update: + last_update_added_by = last_update.added_by.first_name + last_update_date_added = last_update.date_added + else: + last_update_added_by = None + last_update_date_added = None + + for ticket_update in ticket.ticketupdate_set.exclude(added_by=request.user): + if not TicketRead.objects.filter(ticket_update=ticket_update, user=request.user, read=True).exists(): + unread_updates_count += 1 + + ticket.unread_updates_count = unread_updates_count + ticket.last_update_added_by = last_update_added_by + ticket.last_update_date_added = last_update_date_added + + for ticket in closed_tickets: + last_update = ticket.ticketupdate_set.order_by('-date_added').first() + if last_update: + last_update_added_by = last_update.added_by + last_update_date_added = last_update.date_added + else: + last_update_added_by = None + last_update_date_added = None + + ticket.last_update_added_by = last_update_added_by + ticket.last_update_date_added = last_update_date_added + + context = { + 'open_tickets': open_tickets, + 'closed_tickets': closed_tickets + + } + + return render(request, 'listing_pages/tickets.html', context) + @staff_login_required def my_notes(request): @@ -444,13 +483,16 @@ def customerdetails(request, customer_id): def ticket_details(request, ticket_number): ticket = get_object_or_404(Ticket, ticket_number=ticket_number) ticket_updates = TicketUpdate.objects.filter(ticket=ticket).order_by('id') - for update in ticket_updates: + for update in TicketUpdate.objects.filter(ticket=ticket).exclude(added_by=request.user).order_by('id'): if not TicketRead.objects.filter(ticket_update=update, user=request.user).exists(): TicketRead.objects.create(ticket_update=update, user=request.user, read=True) + last_ticket_status = TicketStatusUpdate.objects.all().last() + context = { 'ticket' : ticket, 'ticket_updates': ticket_updates, + 'last_ticket_status': last_ticket_status } diff --git a/osinaweb/static/images/f_invoice_invoice.invoice_number.pdf_ b/osinaweb/static/images/f_invoice_invoice.invoice_number.pdf_ new file mode 100644 index 00000000..18ff943e Binary files /dev/null and b/osinaweb/static/images/f_invoice_invoice.invoice_number.pdf_ differ diff --git a/osinaweb/static/js/tickets-filtering.js b/osinaweb/static/js/tickets-filtering.js new file mode 100644 index 00000000..56537dd5 --- /dev/null +++ b/osinaweb/static/js/tickets-filtering.js @@ -0,0 +1,28 @@ +function showOpenTickets() { + openTicketsContainer.classList.remove('hidden'); + closedTicketsContainer.classList.add('hidden'); + openTicketsLink.classList.add('text-secondosiblue', 'font-semibold'); + closedTicketsLink.classList.remove('text-secondosiblue', 'font-semibold'); + closedTicketsLink.classList.add('text-gray-500'); +} + + +function showClosedTickets() { + openTicketsContainer.classList.add('hidden'); + closedTicketsContainer.classList.remove('hidden'); + closedTicketsLink.classList.add('text-secondosiblue', 'font-semibold'); + openTicketsLink.classList.remove('text-secondosiblue', 'font-semibold'); + openTicketsLink.classList.add('text-gray-500'); +} + +const openTicketsLink = document.getElementById('openTicketsLink'); +const closedTicketsLink = document.getElementById('closedTicketsLink'); +const openTicketsContainer = document.getElementById('openTickets'); +const closedTicketsContainer = document.getElementById('closedTickets'); + + +openTicketsLink.addEventListener('click', showOpenTickets); +closedTicketsLink.addEventListener('click', showClosedTickets); + + +showOpenTickets(); \ No newline at end of file