def dashboard(request): """ A quick summary overview for users: A list of their own tickets, a table showing ticket counts by queue/status, and a list of unassigned tickets with options for them to 'Take' ownership of said tickets. """ tickets = Ticket.objects.filter( assigned_to=request.user, ).exclude( status=Ticket.CLOSED_STATUS, ) ticket_table = UnpagedTicketTable(tickets) table_to_report = RequestConfig(request, paginate=False ).configure(ticket_table) if table_to_report: return create_report_http_response(table_to_report, request) unassigned_tickets = Ticket.objects.filter( assigned_to__isnull=True, ).exclude( status=Ticket.CLOSED_STATUS, ) unassigned_ticket_table = UnassignedTicketTable(unassigned_tickets) table_to_report = RequestConfig(request, paginate=False ).configure(unassigned_ticket_table) if table_to_report: return create_report_http_response(table_to_report, request) # The following query builds a grid of queues & ticket statuses, # to be displayed to the user. EG: # Open Resolved # Queue 1 10 4 # Queue 2 4 12 cursor = connection.cursor() cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved FROM helpdesk_ticket t, helpdesk_queue q WHERE q.id = t.queue_id GROUP BY queue, name ORDER BY q.id; """) dash_tickets = query_to_dict(cursor.fetchall(), cursor.description) return render_to_response('helpdesk/dashboard.html', RequestContext(request, { 'user_tickets': tickets, 'unassigned_tickets': unassigned_tickets, 'dash_tickets': dash_tickets, 'ticket_table': ticket_table, 'unassigned_ticket_table': unassigned_ticket_table }))
def dashboard(request): """ A quick summary overview for users: A list of their own tickets, a table showing ticket counts by queue/status, and a list of unassigned tickets with options for them to 'Take' ownership of said tickets. """ tickets = Ticket.objects.filter(assigned_to=request.user, ).exclude( status=Ticket.CLOSED_STATUS, ) ticket_table = UnpagedTicketTable(tickets) table_to_report = RequestConfig(request, paginate=False).configure(ticket_table) if table_to_report: return create_report_http_response(table_to_report, request) unassigned_tickets = Ticket.objects.filter( assigned_to__isnull=True, ).exclude(status=Ticket.CLOSED_STATUS, ) unassigned_ticket_table = UnassignedTicketTable(unassigned_tickets) table_to_report = RequestConfig( request, paginate=False).configure(unassigned_ticket_table) if table_to_report: return create_report_http_response(table_to_report, request) # The following query builds a grid of queues & ticket statuses, # to be displayed to the user. EG: # Open Resolved # Queue 1 10 4 # Queue 2 4 12 cursor = connection.cursor() cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved FROM helpdesk_ticket t, helpdesk_queue q WHERE q.id = t.queue_id GROUP BY queue, name ORDER BY q.id; """) dash_tickets = query_to_dict(cursor.fetchall(), cursor.description) return render_to_response( 'helpdesk/dashboard.html', RequestContext( request, { 'user_tickets': tickets, 'unassigned_tickets': unassigned_tickets, 'dash_tickets': dash_tickets, 'ticket_table': ticket_table, 'unassigned_ticket_table': unassigned_ticket_table }))
def dashboard(request): """ A quick summary overview for users: A list of their own tickets, a table showing ticket counts by queue/status, and a list of unassigned tickets with options for them to 'Take' ownership of said tickets. """ tickets = Ticket.objects.filter( assigned_to=request.user, ).exclude( status=Ticket.CLOSED_STATUS, ) unassigned_tickets = Ticket.objects.filter( assigned_to__isnull=True, ).exclude( status=Ticket.CLOSED_STATUS, ) # The following query builds a grid of queues & ticket statuses, # to be displayed to the user. EG: # Open Resolved # Queue 1 10 4 # Queue 2 4 12 condition = '' if not request.user.is_superuser: user_queues = Queue.objects.filter(users__in=[request.user]).values_list('pk', flat=True) queues_pk = ','.join(map(lambda x: str(x), user_queues)) condition = 'AND q.id IN(%s)' % queues_pk cursor = connection.cursor() cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved FROM helpdesk_ticket t, helpdesk_queue q WHERE q.id = t.queue_id %s GROUP BY queue, name ORDER BY q.id; """ % condition) dash_tickets = query_to_dict(cursor.fetchall(), cursor.description) return render_to_response('helpdesk/dashboard.html', RequestContext(request, { 'user_tickets': tickets, 'unassigned_tickets': unassigned_tickets, 'dash_tickets': dash_tickets, }))
def run_report(request, report): priority_sql = [] priority_columns = [] for p in Ticket.PRIORITY_CHOICES: priority_sql.append("COUNT(CASE t.priority WHEN '%s' THEN t.id END) AS \"%s\"" % (p[0], p[1]._proxy____unicode_cast())) priority_columns.append("%s" % p[1]._proxy____unicode_cast()) priority_sql = ", ".join(priority_sql) status_sql = [] status_columns = [] for s in Ticket.STATUS_CHOICES: status_sql.append("COUNT(CASE t.status WHEN '%s' THEN t.id END) AS \"%s\"" % (s[0], s[1]._proxy____unicode_cast())) status_columns.append("%s" % s[1]._proxy____unicode_cast()) status_sql = ", ".join(status_sql) queue_sql = [] queue_columns = [] for q in Queue.objects.all(): queue_sql.append("COUNT(CASE t.queue_id WHEN '%s' THEN t.id END) AS \"%s\"" % (q.id, q.title)) queue_columns.append(q.title) queue_sql = ", ".join(queue_sql) month_sql = [] months = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', ) month_columns = [] # Throw an error if there are no tickets first_ticket = Ticket.objects.all().order_by('created')[0] first_month = first_ticket.created.month first_year = first_ticket.created.year last_ticket = Ticket.objects.all().order_by('-created')[0] last_month = last_ticket.created.month last_year = last_ticket.created.year periods = [] year, month = first_year, first_month working = True while working: temp = (year, month) month += 1 if month > 12: year += 1 month = 1 if (year > last_year) or (month > last_month and year >= last_year): working = False periods.append((temp, (year, month))) for (low_bound, upper_bound) in periods: low_sqlmonth = '%s-%02i-01' % (low_bound[0], low_bound[1]) upper_sqlmonth = '%s-%02i-01' % (upper_bound[0], upper_bound[1]) desc = '%s %s' % (months[low_bound[1]-1], low_bound[0]) month_sql.append(""" COUNT( CASE 1 = 1 WHEN (date(t.created) >= date('%s') AND date(t.created) < date('%s')) THEN t.id END) AS "%s" """ % (low_sqlmonth, upper_sqlmonth, desc)) month_columns.append(desc) month_sql = ", ".join(month_sql) queue_base_sql = """ SELECT q.title as queue, %s FROM helpdesk_ticket t, helpdesk_queue q WHERE q.id = t.queue_id GROUP BY queue ORDER BY queue; """ user_base_sql = """ SELECT u.username as username, %s FROM helpdesk_ticket t, auth_user u WHERE u.id = t.assigned_to_id GROUP BY u.username ORDER BY u.username; """ if report == 'userpriority': sql = user_base_sql % priority_sql columns = ['username'] + priority_columns title = 'User by Priority' elif report == 'userqueue': sql = user_base_sql % queue_sql columns = ['username'] + queue_columns title = 'User by Queue' elif report == 'userstatus': sql = user_base_sql % status_sql columns = ['username'] + status_columns title = 'User by Status' elif report == 'usermonth': sql = user_base_sql % month_sql columns = ['username'] + month_columns title = 'User by Month' elif report == 'queuepriority': sql = queue_base_sql % priority_sql columns = ['queue'] + priority_columns title = 'Queue by Priority' elif report == 'queuestatus': sql = queue_base_sql % status_sql columns = ['queue'] + status_columns title = 'Queue by Status' elif report == 'queuemonth': sql = queue_base_sql % month_sql columns = ['queue'] + month_columns title = 'Queue by Month' cursor = connection.cursor() cursor.execute(sql) report_output = query_to_dict(cursor.fetchall(), cursor.description) data = [] for record in report_output: line = [] for c in columns: c = c.encode('utf-8') line.append(record[c]) data.append(line) if report in ('queuemonth', 'usermonth'): chart_url = line_chart([columns] + data) elif report in ('queuestatus', 'queuepriority', 'userstatus', 'userpriority'): chart_url = bar_chart([columns] + data) else: chart_url = '' return render_to_response('helpdesk/report_output.html', RequestContext(request, { 'headings': columns, 'data': data, 'chart': chart_url, 'title': title, }))
def dashboard(request): """ A quick summary overview for users: A list of their own tickets, a table showing ticket counts by queue/status, and a list of unassigned tickets with options for them to 'Take' ownership of said tickets. """ # open & reopened tickets, assigned to current user tickets = Ticket.objects.filter( assigned_to=request.user, ).exclude( status__in = [Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS], ) # closed & resolved tickets, assigned to current user tickets_closed_resolved = Ticket.objects.filter( assigned_to=request.user, status__in = [Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS]) unassigned_tickets = Ticket.objects.filter( assigned_to__isnull=True, ).exclude( status=Ticket.CLOSED_STATUS, ) # all tickets, reported by current user all_tickets_reported_by_current_user = '' email_current_user = request.user.email if email_current_user: all_tickets_reported_by_current_user = Ticket.objects.filter( submitter_email=email_current_user, ).order_by('status') # The following query builds a grid of queues & ticket statuses, # to be displayed to the user. EG: # Open Resolved # Queue 1 10 4 # Queue 2 4 12 cursor = connection.cursor() if helpdesk_settings.HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES: cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved, COUNT(CASE t.status WHEN '4' THEN t.id END) AS closed FROM helpdesk_ticket t, helpdesk_queue q WHERE q.id = t.queue_id GROUP BY queue, name ORDER BY q.id; """) else: cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved, COUNT(CASE t.status WHEN '4' THEN t.id END) AS closed FROM helpdesk_queue q LEFT OUTER JOIN helpdesk_ticket t ON q.id = t.queue_id GROUP BY queue, name ORDER BY q.id; """) dash_tickets = query_to_dict(cursor.fetchall(), cursor.description) return render_to_response('helpdesk/dashboard.html', RequestContext(request, { 'user_tickets': tickets, 'user_tickets_closed_resolved': tickets_closed_resolved, 'unassigned_tickets': unassigned_tickets, 'all_tickets_reported_by_current_user': all_tickets_reported_by_current_user, 'dash_tickets': dash_tickets, }))
def dashboard(request): """ A quick summary overview for users: A list of their own tickets, a table showing ticket counts by queue/status, and a list of unassigned tickets with options for them to 'Take' ownership of said tickets. """ # open & reopened tickets, assigned to current user tickets = Ticket.objects.filter(assigned_to=request.user, ).exclude( status__in=[Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS], ) # closed & resolved tickets, assigned to current user tickets_closed_resolved = Ticket.objects.filter( assigned_to=request.user, status__in=[Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS]) unassigned_tickets = Ticket.objects.filter( assigned_to__isnull=True, ).exclude(status=Ticket.CLOSED_STATUS, ) # all tickets, reported by current user all_tickets_reported_by_current_user = '' email_current_user = request.user.email if email_current_user: all_tickets_reported_by_current_user = Ticket.objects.filter( submitter_email=email_current_user, ).order_by('status') # The following query builds a grid of queues & ticket statuses, # to be displayed to the user. EG: # Open Resolved # Queue 1 10 4 # Queue 2 4 12 cursor = connection.cursor() if helpdesk_settings.HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES: cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved, COUNT(CASE t.status WHEN '4' THEN t.id END) AS closed FROM helpdesk_ticket t, helpdesk_queue q WHERE q.id = t.queue_id GROUP BY queue, name ORDER BY q.id; """) else: cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved, COUNT(CASE t.status WHEN '4' THEN t.id END) AS closed FROM helpdesk_queue q LEFT OUTER JOIN helpdesk_ticket t ON q.id = t.queue_id GROUP BY queue, name ORDER BY q.id; """) dash_tickets = query_to_dict(cursor.fetchall(), cursor.description) return render_to_response( 'helpdesk/dashboard.html', RequestContext( request, { 'user_tickets': tickets, 'user_tickets_closed_resolved': tickets_closed_resolved, 'unassigned_tickets': unassigned_tickets, 'all_tickets_reported_by_current_user': all_tickets_reported_by_current_user, 'dash_tickets': dash_tickets, }))
def run_report(request, report): priority_sql = [] priority_columns = [] for p in Ticket.PRIORITY_CHOICES: print dir(p[1]) priority_sql.append( "COUNT(CASE t.priority WHEN '%s' THEN t.id END) AS \"%s\"" % (p[0], p[1]._proxy____cast())) priority_columns.append("%s" % p[1]._proxy____cast()) priority_sql = ", ".join(priority_sql) status_sql = [] status_columns = [] for s in Ticket.STATUS_CHOICES: status_sql.append( "COUNT(CASE t.status WHEN '%s' THEN t.id END) AS \"%s\"" % (s[0], s[1]._proxy____cast())) status_columns.append("%s" % s[1]._proxy____cast()) status_sql = ", ".join(status_sql) queue_sql = [] queue_columns = [] for q in Queue.objects.all(): queue_sql.append( "COUNT(CASE t.queue_id WHEN '%s' THEN t.id END) AS \"%s\"" % (q.id, q.title)) queue_columns.append(q.title) queue_sql = ", ".join(queue_sql) month_sql = [] months = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', ) month_columns = [] first_ticket = Ticket.objects.all().order_by('created')[0] first_month = first_ticket.created.month first_year = first_ticket.created.year last_ticket = Ticket.objects.all().order_by('-created')[0] last_month = last_ticket.created.month last_year = last_ticket.created.year periods = [] year, month = first_year, first_month working = True while working: temp = (year, month) month += 1 if month > 12: year += 1 month = 1 if (year > last_year) or (month > last_month and year >= last_year): working = False periods.append((temp, (year, month))) for (low_bound, upper_bound) in periods: low_sqlmonth = '%s-%02i-01' % (low_bound[0], low_bound[1]) upper_sqlmonth = '%s-%02i-01' % (upper_bound[0], upper_bound[1]) desc = '%s %s' % (months[low_bound[1] - 1], low_bound[0]) month_sql.append(""" COUNT( CASE 1 = 1 WHEN (date(t.created) >= date('%s') AND date(t.created) < date('%s')) THEN t.id END) AS "%s" """ % (low_sqlmonth, upper_sqlmonth, desc)) month_columns.append(desc) month_sql = ", ".join(month_sql) queue_base_sql = """ SELECT q.title as queue, %s FROM helpdesk_ticket t, helpdesk_queue q WHERE q.id = t.queue_id GROUP BY queue ORDER BY queue; """ user_base_sql = """ SELECT u.username as username, %s FROM helpdesk_ticket t, auth_user u WHERE u.id = t.assigned_to_id GROUP BY u.username ORDER BY u.username; """ if report == 'userpriority': sql = user_base_sql % priority_sql columns = ['username'] + priority_columns title = _(u'User by priority') elif report == 'userqueue': sql = user_base_sql % queue_sql columns = ['username'] + queue_columns title = _(u'User by queue') elif report == 'userstatus': sql = user_base_sql % status_sql columns = ['username'] + status_columns title = _(u'User by status') elif report == 'usermonth': sql = user_base_sql % month_sql columns = ['username'] + month_columns title = _(u'User by month') elif report == 'queuepriority': sql = queue_base_sql % priority_sql columns = ['queue'] + priority_columns title = _(u'Queue by priority') elif report == 'queuestatus': sql = queue_base_sql % status_sql columns = ['queue'] + status_columns title = _(u'Queue by status') elif report == 'queuemonth': sql = queue_base_sql % month_sql columns = ['queue'] + month_columns title = _(u'Queue by month') cursor = connection.cursor() cursor.execute(sql) report_output = query_to_dict(cursor.fetchall(), cursor.description) data = [] for record in report_output: line = [] for c in columns: c = c.encode('utf-8') line.append(record[c]) data.append(line) if report in ('queuemonth', 'usermonth'): chart_url = line_chart([columns] + data) elif report in ('queuestatus', 'queuepriority', 'userstatus', 'userpriority'): chart_url = bar_chart([columns] + data) else: chart_url = '' return render_to_response( 'helpdesk/report_output.html', RequestContext( request, { 'headings': columns, 'data': data, 'chart': chart_url, 'title': title, }))
def dashboard(request): """ A quick summary overview for users: A list of their own tickets, a table showing ticket counts by queue/status, and a list of unassigned tickets with options for them to 'Take' ownership of said tickets. """ # open & reopened tickets, assigned to current user tickets = Ticket.objects.filter( assigned_to=request.user, ).exclude( status__in = [Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS, Ticket.DUPLICATE_STATUS], ) # closed & resolved tickets, assigned to current user tickets_closed_resolved = Ticket.objects.filter( assigned_to=request.user, status__in = [Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS, Ticket.DUPLICATE_STATUS]) unassigned_tickets = Ticket.objects.filter( assigned_to__isnull=True, ).exclude( status__in = [Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS, Ticket.DUPLICATE_STATUS] ) # all tickets, reported by current user all_tickets_reported_by_current_user = '' email_current_user = request.user.email if email_current_user: all_tickets_reported_by_current_user = Ticket.objects.filter( submitter_email=email_current_user, ).order_by('status') # The following query builds a grid of queues & ticket statuses, # to be displayed to the user. EG: # Open Resolved # Queue 1 10 4 # Queue 2 4 12 # Determine whether to remove hidden queues if request.user.is_superuser: where = '' else: where = 'WHERE q.allow_public_access IS true' # Sqlite doesn't like this / Postgres needs true cursor = connection.cursor() # Removed a second query here that didn't list empty queues. Not very relevant, so is removed cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved, COUNT(CASE t.status WHEN '4' THEN t.id END) AS closed FROM helpdesk_queue q LEFT OUTER JOIN helpdesk_ticket t ON q.id = t.queue_id %s GROUP BY queue, name ORDER BY q.id; """ % where) dash_tickets = query_to_dict(cursor.fetchall(), cursor.description) return render_to_response('helpdesk/dashboard.html', RequestContext(request, { 'user_tickets': tickets, 'user_tickets_closed_resolved': tickets_closed_resolved, 'unassigned_tickets': unassigned_tickets, 'all_tickets_reported_by_current_user': all_tickets_reported_by_current_user, 'dash_tickets': dash_tickets, }))
def get_context_data(self, **kwargs): data = super(Dashboard, self).get_context_data(**kwargs) """ A quick summary overview for users: A list of their own tickets, a table showing ticket counts by queue/status, and a list of unassigned tickets with options for them to 'Take' ownership of said tickets. """ # open & reopened tickets, assigned to current user tickets = Ticket.objects.select_related('queue').filter( assigned_to=self.request.user, ).exclude( status__in = [Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS], ) # closed & resolved tickets, assigned to current user tickets_closed_resolved = Ticket.objects.select_related('queue').filter( assigned_to=self.request.user, status__in = [Ticket.CLOSED_STATUS, Ticket.RESOLVED_STATUS]) user_queues = _get_user_queues(self.request.user) unassigned_tickets = Ticket.objects.select_related('queue').filter( assigned_to__isnull=True, queue__in=user_queues ).exclude( status=Ticket.CLOSED_STATUS, ) # all tickets, reported by current user all_tickets_reported_by_current_user = '' email_current_user = self.request.user.email if email_current_user: all_tickets_reported_by_current_user = Ticket.objects.select_related('queue').filter( submitter_email=email_current_user, ).order_by('status') Tickets = Ticket.objects.filter( queue__in=user_queues, ) basic_ticket_stats = calc_basic_ticket_stats(Tickets) # The following query builds a grid of queues & ticket statuses, # to be displayed to the user. EG: # Open Resolved # Queue 1 10 4 # Queue 2 4 12 queues = _get_user_queues(self.request.user).values_list('id', flat=True) from_clause = """FROM helpdesk_ticket t, helpdesk_queue q""" where_clause = """WHERE q.id = t.queue_id AND q.id IN (%s)""" % (",".join(("%d" % pk for pk in queues))) cursor = connection.cursor() cursor.execute(""" SELECT q.id as queue, q.title AS name, COUNT(CASE t.status WHEN '1' THEN t.id WHEN '2' THEN t.id END) AS open, COUNT(CASE t.status WHEN '3' THEN t.id END) AS resolved, COUNT(CASE t.status WHEN '4' THEN t.id END) AS closed %s %s GROUP BY queue, name ORDER BY q.id; """ % (from_clause, where_clause)) dash_tickets = query_to_dict(cursor.fetchall(), cursor.description) data.update({ 'user_tickets': tickets, 'user_tickets_closed_resolved': tickets_closed_resolved, 'unassigned_tickets': unassigned_tickets, 'all_tickets_reported_by_current_user': all_tickets_reported_by_current_user, 'dash_tickets': dash_tickets, 'basic_ticket_stats': basic_ticket_stats, }) return data