def print_submitted_tickets_report(start_date, end_date=datetime.now()): print "Producing EMI support summary report for period %s-%s. Please be patient..." % (start_date.strftime(date_format_str),end_date.strftime(date_format_str)) print "EMI SUs covered (%d): \n%s" % (len(emi_support_units),"\n".join(sorted(emi_support_units.keys()))) tickets = get_tickets(emi_submitted_tickets_in_period(start_date,end_date)) status_classification = classify_status(tickets) priority_classification = classify_priority(tickets) su_classification = classify_su(tickets, sus=emi_support_units.keys()) report_template = Template("""${numTickets} tickets were submitted in period ${startDate}-${endDate}. The status for these tickets is currently: ${numAssigned} assigned, ${numInProgress} in progress, ${numOnHold} on hold, ${numReopened} reopened, ${numWaitingForReply} waiting for reply, ${numSolved} solved, ${numUnsolved} unsolved, ${numClosed} closed, ${numVerified} verified. The current priority classification of the above tickets is: ${numTopPriority} top priority, ${numVeryUrgent} very urgent, ${numUrgent} urgent, ${numLessUrgent} less urgent.""") keys = {'numTickets': len(tickets), 'startDate': start_date.strftime(date_format_str), 'endDate': end_date.strftime(date_format_str), 'numAssigned': len(status_classification['assigned']), 'numInProgress': len(status_classification['in progress']), 'numOnHold': len(status_classification['on hold']), 'numReopened': len(status_classification['reopened']), 'numSolved': len(status_classification['solved']), 'numUnsolved': len(status_classification['unsolved']), 'numClosed' : len(status_classification['closed']), 'numVerified': len(status_classification['verified']), 'numWaitingForReply': len(status_classification['waiting for reply']), 'numTopPriority': len(priority_classification['top priority']), 'numVeryUrgent': len(priority_classification['very urgent']), 'numUrgent': len(priority_classification['urgent']), 'numLessUrgent': len(priority_classification['less urgent']) } print report_template.safe_substitute(keys) sus = sorted(su_classification.keys()) print print "The above tickets are currently assigned to the following SUs:" for su in sus: print "\n%s: %d" % (su, len(su_classification[su])) for t in su_classification[su]: print "\thttps://ggus.eu/tech/ticket_show.php?ticket=%s (%s) %s " % (ticket_id(t), ticket_priority(t), ticket_status(t))
def print_all_tickets_report(start=0,limit=-1): print >> sys.stderr, "Producing all tickets stats for EMI SUs. Please be patient..." try: start_time = time.time() tickets = get_tickets(emi_all_tickets(), start, limit) query_time = time.time() - start_time print "The query completed in %d seconds returning %d tickets." % (query_time, len(tickets)) except WebFault, e: print >>stderr, "Error query for all EMI tickets: %s" % e exit(-1)
def print_on_hold_report(): print "Producing on-hold tickets status report. Please be patient..." print "As of %s the following tickets are in on-hold status but don't have a related issue registered in GGUS." % datetime.now() tickets = get_tickets(open_on_hold_tickets()) for t in filter(lambda x:ticket_related_issue(x) is None, sorted(tickets, key=ticket_su)): ggus_t = get_ggus_ticket(ticket_id(t)) assigned_time = ggus_t.get_sla_compliance_values()[ticket_su(t)].assigned_time print "%-22s: https://ggus.eu/tech/ticket_show.php?ticket=%s ( %-3d days old ) %-15s %-15s \"%s\"" %(ticket_su(t), ticket_id(t), (datetime.now()-assigned_time).days, ticket_priority(t), ticket_status(t), ticket_short_description(t))
def print_eta_status_report(): print "Producing ETA status report. Please be patient..." tickets = get_tickets(open_very_urgent_and_top_priority_tickets()) print "As of %s there are %d very urgent and top priority tickets which have ETA not set." % (datetime.now(), len(tickets)) print for t in filter(lambda x:ticket_eta(x) is None, sorted(tickets, key=ticket_priority)): ggus_t = get_ggus_ticket(ticket_id(t)) assigned_time = ggus_t.get_sla_compliance_values()[ticket_su(t)].assigned_time print "%-22s: https://ggus.eu/tech/ticket_show.php?ticket=%s ( %-3d days old ) %-15s %-18s \"%s\"" %(ticket_su(t), ticket_id(t), (datetime.now()-assigned_time).days, ticket_priority(t), ticket_status(t), ticket_short_description(t))
def print_assigned_tickets_report(assigned_priority_classification=None): now = datetime.now() if assigned_priority_classification is None: assigned_priority_classification = {} for i in priorities: assigned_priority_classification[i] = [] for t in get_tickets(emi_third_level_assigned_tickets()): assigned_priority_classification[ticket_priority(t)].append(t) for p in priorities: if len(assigned_priority_classification[p]) == 0: continue else: print p, ":" num_violations = 0 for t in assigned_priority_classification[p]: ggus_ticket = get_ggus_ticket(ticket_id(t)) assigned_time = ggus_ticket.get_sla_compliance_values()[ticket_su(t)].assigned_time bc = BusinessCalendar(assigned_time) resolution_date = bc.add_business_time(sla_constraints[p]) if resolution_date >= now: sla_violation_string = "SLA check: OK (Assigned on: %s. To be taken in charge before %s)" % (assigned_time, resolution_date) else: if now.day != resolution_date.day: bd_delay = BusinessCalendar(resolution_date).count_business_days(now) delay = "%s work days" % bd_delay else: delay = "%s hours" % (now - resolution_date) sla_violation_string = "SLA VIOLATION: Delay: %s (Assigned on: %s. Had to be taken in charge before %s)" % (delay, assigned_time, resolution_date) num_violations = num_violations + 1 print "\t(%s) \"%s\" https://ggus.eu/tech/ticket_show.php?ticket=%s\n\t%s" % (ticket_su(t), ticket_short_description(t), ticket_id(t), sla_violation_string) print print "Of the %d %s tickets, %d violate the SLA " % (len(assigned_priority_classification[p]), p, num_violations) print
def print_ksa_1_1(start_date,end_date=datetime.now()): print >>sys.stderr, "Producing KSA1.1 kpi csv file for period %s-%s. Please be patient..." % (start_date.strftime(date_format_str),end_date.strftime(date_format_str)) csv_header = "su,%s" % ','.join(priorities) tickets = get_tickets(emi_submitted_tickets_in_period(start_date, end_date)) su_classification = classify_su(tickets, sus=emi_support_units.keys()) sus = sorted(su_classification.keys(), key=str.lower) print csv_header for su in sus: prios = classify_priority(su_classification[su]) print "%s,%d,%d,%d,%d" % (su, len(prios[priorities[0]]), len(prios[priorities[1]]), len(prios[priorities[2]]), len(prios[priorities[3]]))
def print_sla_stats(start_date, end_date=datetime.now()): print >> stderr, "Producing SLA compliance report for period: %s -> %s . Be patient..." % (start_date, end_date) try: tickets = get_tickets(emi_third_level_open_tickets_in_period(start_date, end_date)) except WebFault: print >> stderr, "No open tickets found in period (%s,%s)" % (start_date, end_date) return print >>stderr, "Found %d matching tickets" % len(tickets) accum = timedelta() for t in tickets: delay = ticket_resolution_delay(t) # print "%s,%s,%s" % (ticket_su(t), ticket_status(t), ticket_resolution_delay(t)) accum = accum + delay avg_delay = accum / len(tickets) print "start_date,end_date,avg_delay" print "%s,%s,%s" % (start_date,end_date,avg_delay)
def print_su_report(): sus = sorted(emi_support_units.keys(), key=str.lower) first_line = "su,%s,%s" % (','.join(statuses), ','.join(priorities)) template_line = "%s,%s" % ('%s', ','.join(['%d' for i in range(len(priorities) + len(statuses))])) zero_template = "%s,%s" % ('%s', ','.join(['0' for i in range(len(priorities) + len(statuses))])) print first_line for su in sus: tickets = [] try: tickets = get_tickets(open_tickets_for_su(su)) except WebFault: print >> stderr, "No open tickets found for SU %s" % su print zero_template % su continue status_classification = {} priority_classification = {} for i in statuses: status_classification[i] = [] for i in priorities: priority_classification[i] = [] for t in tickets: status = ticket_status(t) status_classification[status].append(t) for t in tickets: prio = ticket_priority(t) priority_classification[prio].append(t) print template_line % (su, len(status_classification[statuses[0]]), len(status_classification[statuses[1]]), len(status_classification[statuses[2]]), len(status_classification[statuses[3]]), len(status_classification[statuses[4]]), len(priority_classification[priorities[0]]), len(priority_classification[priorities[1]]), len(priority_classification[priorities[2]]), len(priority_classification[priorities[3]]))
def print_assigned_ticket_status_report(twiki_format=False): tickets = get_tickets(emi_third_level_open_tickets()) status_classification = classify_status(tickets) assigned_priority_classification = classify_priority(status_classification['assigned']) keys = {'now': datetime.now(), 'numOpen': len(tickets), 'numAssigned': len(status_classification['assigned']), 'numInProgress': len(status_classification['in progress']), 'numOnHold': len(status_classification['on hold']), 'numReopened': len(status_classification['reopened']), 'numWaitingForReply': len(status_classification['waiting for reply']), 'numTopPriority': len(assigned_priority_classification['top priority']), 'numVeryUrgent': len(assigned_priority_classification['very urgent']), 'numUrgent': len(assigned_priority_classification['urgent']), 'numLessUrgent': len(assigned_priority_classification['less urgent']) } now = datetime.now() if twiki_format: print "---+ Support status report %d-%d-%d" % (now.day, now.month, now.year) print "<verbatim>" print print report_template.safe_substitute(keys) print "Assigned ticket detail (per priority):" print print_assigned_tickets_report(assigned_priority_classification) print "\n\n" print_eta_status_report() print "\n\n" print_on_hold_report() if twiki_format: print "</verbatim>"
def print_ksa_1_2(start_date,end_date=datetime.now()): print >>sys.stderr, "Producing KSA1.2 kpi csv file for period %s-%s. Please be patient..." % (format_date(start_date),format_date(end_date)) csv_header = "su,%s" % ','.join(priorities) try: tickets = get_tickets(third_level_closed_tickets_in_period(start_date,end_date)) except WebFault: print >> stderr, "No closed tickets found in period %s-%s" % (format_date(start_date), format_date(end_date)) return su_classification = classify_su(tickets) sus = sorted(su_classification.keys(), key=str.lower) print csv_header for su in sus: prios = classify_priority(su_classification[su]) print "%s,%d,%d,%d,%d" % (su, average_solution_time([get_ggus_ticket(ticket_id(t)) for t in prios[priorities[0]]]).days, average_solution_time([get_ggus_ticket(ticket_id(t)) for t in prios[priorities[1]]]).days, average_solution_time([get_ggus_ticket(ticket_id(t)) for t in prios[priorities[2]]]).days, average_solution_time([get_ggus_ticket(ticket_id(t)) for t in prios[priorities[3]]]).days)
def print_sla_report(start_date, end_date=datetime.now(), su_list=None, print_seconds=False): print >> stderr, "Print SLA status report for period %s -> %s. " % (start_date, end_date) print >> stderr, "The report prints the average SLA violation delay in seconds per SU and ticket priority." if su_list: sus = sorted(su_list, key=str.lower) else: sus = sorted(emi_3rd_level_su.keys(), key=str.lower) first_line = "su,%s" % ','.join(priorities) template_line = "%s,%s" % ('%s', ','.join(['%s' for i in range(len(priorities))])) tickets_total = 0 print first_line for su in sus: tickets = [] try: tickets = get_tickets(open_tickets_for_su_in_period(su, start_date, end_date)) except WebFault: print >> stderr, "No open tickets found for SU %s in period (%s,%s)" % (su, start_date, end_date) continue tickets_total = tickets_total + len(tickets) priority_classification = {} priority_averages = {} for i in priorities: priority_classification[i] = [] priority_averages[i] = timedelta(hours=0) for t in tickets: prio = ticket_priority(t) priority_classification[prio].append(ticket_resolution_delay(t)) for i in priorities: accum = timedelta(hours=0) for d in priority_classification[prio]: accum = accum + d if len(priority_classification[prio]) > 0: accum = accum / len(priority_classification[prio]) priority_averages[prio] = accum if print_seconds: print template_line % (su, td_seconds(priority_averages[priorities[0]]), td_seconds(priority_averages[priorities[1]]), td_seconds(priority_averages[priorities[2]]), td_seconds(priority_averages[priorities[3]]) ) else: print template_line % (su, priority_averages[priorities[0]], priority_averages[priorities[1]], priority_averages[priorities[2]], priority_averages[priorities[3]] )
def testAllTicketsQuery(self): tickets = get_tickets(emi_all_tickets()) print len(tickets)