Esempio n. 1
0
def get_tutoring_sessions(qle: QueueLoginEvent, queue: Queue, grader: User,
                          start_date: datetime = None):
    """
    Gets all the tutoring sessions of a grader within a given time frame.
    Sessions include info about start/end time, duration, time helping,
    utilization rate, and number of tickets accepted/resolved.
    Inputs:
    qle --> QueueLoginEvent object used to access the database
    queue --> queue on which the grader worked
    grader --> grader bing queried
    start_date --> (optional) start time of week being queried
    Return:
    List of sessions
    """
    if start_date is None:
        events = qle.find_event_in_range(queue, datetime.min, datetime.now(),
                                         grader)
    else:
        end_date = (start_date.convert_str_to_datetime()
                    + datetime.timedelta(days=7)).isoformat()
        events = qle.find_event_in_range(queue, start_date, end_date, grader)

    sessions = []
    for i in range(0, len(events), 2):
        start = events[i].timestamp
        end = (datetime.now() if i == len(events) - 1
               else events[i + 1].timestamp)
        duration = end - start

        tickets = Ticket.find_tickets_in_range(queue, start, end, grader)

        time_accepted = datetime.min()
        total_time_helping = 0
        accepted = 0
        resolved = 0

        for ticket in tickets:
            for e in events:
                if e.is_accepted():
                    accepted += 1
                    time_accepted = e.timestamp

                if e.is_resolved():
                    resolved += 1

                if (time_accepted != datetime.min and
                   (e.is_resolved() or e.is_deferred() or e.is_canceled)):
                    time_helping = e.timestamp - time_accepted
                    total_time_helping += time_helping.seconds
                    time_accepted = datetime.min()

        utilization = time_helping / duration

    sessions.append(TutoringSession(start, end, duration, total_time_helping,
                                    utilization, accepted, resolved))

    return sessions
Esempio n. 2
0
def get_total_time_spent_resolving_tickets(queue: Queue, grader: User,
                                           start_date: datetime = None):
    """
    Gets the amount of time a tutor has spent resolving tickets within a given
    time frame.
    Inputs:
    queue --> queue on which the grader worked
    grader --> grader bing queried
    start_date --> (optional) start time of week being queried
    Return:
    Amount of time (in seconds) that grader spent resolving tickets during the
    week that starts at start_date (if it was passed in) or during the whole
    quarter (if it was not).
    """
    if start_date is None:
        tickets = Ticket.find_all_tickets_in_range(queue, grader)
    else:
        end_date = (start_date.convert_str_to_datetime()
                    + datetime.timedelta(days=7)).isoformat()
        tickets = Ticket.find_tickets_in_range(queue, start_date, end_date,
                                               grader)

    for ticket in tickets:
        events = TicketEvent.find_all_events_for_ticket(ticket)
        events = [event for event in events if event.user_id == grader.id]

        total_time = 0
        time_accepted = datetime.min()

        for e in events:
            if e.is_accepted():
                time_accepted = e.timestamp

            if (time_accepted != datetime.min and
               (e.is_resolved() or e.is_deferred() or e.is_canceled)):
                time_helping = e.timestamp - time_accepted
                total_time += time_helping.seconds
                time_accepted = datetime.min()

    return total_time
Esempio n. 3
0
def get_num_tickets_handled(queue: Queue, grader: User,
                            start_date: datetime = None):
    """
    Gets the number of tickets handled by a grader within a given time frame.
    Inputs:
    queue --> queue on which the grader worked
    grader --> grader bing queried
    start_date --> (optional) start time of week being queried
    Return:
    Number of tickets handled by grader during the week that starts at
    start_date (if it was passed in) or during the whole quarter (if it was
    not).
    """
    if start_date is None:
        tickets = Ticket.find_all_tickets_in_range(queue, grader)
    else:
        end_date = (start_date.convert_str_to_datetime()
                    + datetime.timedelta(days=7)).isoformat()
        tickets = Ticket.find_tickets_in_range(queue, start_date, end_date,
                                               grader)

    return len(tickets)