Ejemplo n.º 1
0
def logout():
    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    #create a ticket
    content = {'content': {}}

    try:
        response = resource.post(
            path='logout/',
            payload=content,
        )
        logger.info(response.parsed)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
    redirect("/")
Ejemplo n.º 2
0
def modifyTicket(ticketID):
    global emailGlobal
    dic = {"email": emailGlobal}
    lst = []

    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    try:
        response = resource.get(path='ticket/' + ticketID)
        for r in response.parsed:
            for t in r:
                logger.info(t)
                lst.append(t)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)

    lst = dict(lst)

    return template("ticketDetails", lst=lst, ticketID=ticketID, dic=dic)
Ejemplo n.º 3
0
def stats_update_json_file(number_of_days=1):
    """
    Reads old json file, if it exists, get new information, update statistics, write back to file
    There is a known bug: the number_of_days MUST not overlap a month If it does, there will be a problem ;)

    :param number_of_days: Number of days to analyze
    :return: time took to execute
    """
    # TODO: guarantee that the data is written in the correct filename, if number_of_days overlap a month
    start_time = time()

    config = DITICConfig()
    system = config.get_system()
    rt_object = RTApi(system['server'], system['username'], system['password'])

    # result = read_statistics_file(config)
    for this_day in range(0, number_of_days):
        current_date = get_date(this_day)
        current_year_month = current_date[:7]
        result = stats_read_json_file(current_year_month[:4],
                                      current_year_month[5:7])
        result[get_date(this_day)] = full_list_of_tickets_on_a_date(
            rt_object, config, current_date)
        write_statistics_file(config, result, current_year_month[:4],
                              current_year_month[5:7])

    return '%0.2f seconds' % (time() - start_time)
Ejemplo n.º 4
0
def generate_summary_file():
    """
    We need this function in order to test the real generate_summary_file function. Its name has been changed to __...

    :return: the time necessary to execute this function
    """
    start_time = time()

    # Read configuration
    config = DITICConfig()

    # List of emails
    list_emails = set(config.get_email_to_user().keys())

    # List of possible status
    list_status = config.get_list_status()

    # Let use system config list
    system = config.get_system()

    rt_object = RTApi(system['server'], system['username'], system['password'])

    summary = __generate_summary_file(rt_object, list_emails, list_status)

    # The summary of all files will be flushed to this file.
    try:
        with open(
                summary_filename(system['working_dir'],
                                 system['summary_file']), 'w') as file_handler:
            dump(summary, file_handler)
    except IOError as e:
        raise IOError('Error:' + str(e))

    return '%0.2f seconds' % (time() - start_time)
Ejemplo n.º 5
0
 def __init__(self):
     self.config = DITICConfig()
     self.ids = {
         # Only used for tests...
         # u'10': {
         #     'email': '*****@*****.**',
         #     'rt_object':  RTApi('server_address', 'username', 'password'),
         # }
     }
Ejemplo n.º 6
0
def createTicket():
    global emailGlobal

    priority = ''

    priority = int(request.forms.get('priority'))

    if priority >= 200:
        setUrgent = 'yes'
    else:
        setUrgent = ''

    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    #create a ticket
    content = {
        'content': {
            'Queue': request.forms.get(
                "queue"
            ),  #General - unassigned is the name of the desired queue
            'Requestors': emailGlobal,
            'Subject':
            request.forms.get("subject"),  #text to go into subject field
            'Text': request.forms.get("content"),
            'Priority': request.forms.get('priority'),
            'CF.{servico}': request.forms.get("servico"),
            'CF.{IS - Informatica e Sistemas}':
            request.forms.get("inforsistemas"),
            'CF.{DITIC - Interrupted}': '',
            'CF.{DITIC - Urgent}': setUrgent,
        }
    }

    try:
        response = resource.post(
            path='ticket/new',
            payload=content,
        )
        logger.info(response.parsed)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
Ejemplo n.º 7
0
def create_default_result():
    # Default header configuration
    result = {
        'title': 'Still testing...'
    }

    # Summary information
    result.update({'summary': get_summary_info()})

    # Mapping email do uer alias
    config = DITICConfig()
    result.update({'alias': config.get_email_to_user()})

    return result
Ejemplo n.º 8
0
def create_default_result():
    # Default header configuration
    result = {'title': 'Dashboard'}

    call(['update_statistics'])
    call(["generate_summary_file"])

    # Summary information
    result.update({'summary': get_summary_info()})

    # Mapping email do uer alias
    config = DITICConfig()
    result.update({'alias': config.get_email_to_user()})

    return result
Ejemplo n.º 9
0
def user_closed_tickets(rt_object, email):
    """
    Get the closed tickets on the last X days. (X = 60)

    :param rt_object: RTApi object
    :param email: the user email (it must exist in the config)
    :return:
    """
    config = DITICConfig()

    # Check if user is known...
    if not config.check_if_email_exist(email):
        raise ValueError('Unknown email/user:'******'Owner = "%s" AND Queue = "general" AND  Status = "resolved" AND LastUpdated > "%s"' % (
        email, previous_date)

    # Get the information from the server.
    try:
        response = get_list_of_tickets(rt_object, query)

    except NameError as e:
        raise ValueError('Error: ' + str(e))

    number_tickets_per_status = {email: len(response)}
    for line in response:
        try:
            auxiliary_date = strptime(line['lastupdated'])
            auxiliary_date = '%02d/%02d' % (auxiliary_date.tm_mon,
                                            auxiliary_date.tm_mday)
        except ValueError:
            auxiliary_date = 0
        line['auxiliary_date'] = auxiliary_date
        create_ticket_possible_actions(config, line, email,
                                       number_tickets_per_status)
    result = group_result_by(response, 'auxiliary_date')

    email_limit = config.get_email_limits(email)

    return {
        'tickets': result,
        'number_tickets_per_status': number_tickets_per_status,
        'email_limit': email_limit,
    }
Ejemplo n.º 10
0
def get_summary_info():
    """
    returns a dictionary with the following format
        {
            'email':
                {
                    'status': 'value',
                    ...
                }
            ...
        }
    :return:
    """
    #generate_summary_file() #retirar o comando generate_summary_file
    #stats_update_json_file() # retirar o comando update_statistics

    # Read configuration
    config = DITICConfig()

    # List of known emails
    list_emails = config.get_email_to_user().keys()

    # List of known status
    list_status = config.get_list_status()

    # Let use system config list
    system = config.get_system()

    # Get the file information
    try:
        with open(
                summary_filename(system['working_dir'],
                                 system['summary_file']), 'r') as file_handler:
            summary = load(file_handler)
    except IOError:
        # If there is an error, then return everything zeroed
        summary = {
            email: {status: 0
                    for status in list_status}
            for email in list_emails
        }
        summary['dir'] = {status: 0 for status in list_status}
        summary['dir-inbox'] = {status: 0 for status in list_status}
        summary['unknown'] = {status: 0 for status in list_status}

    return summary
Ejemplo n.º 11
0
def test_user_closed_tickets_unknown_email():
    rt_object = RTApiMock()
    rt_object.set_return([
        u'id: ticket/887677',
        u'owner: [email protected]',
        u'subject: create rt dashboard',
        u'status: open',
        u'priority: 26',
        u'cf.{servico}: csc-gsiic',
        u'cf.{is - informatica e sistemas}: dir-inbox',
    ])
    test_config = DITICConfig()
    test_config.email_to_user = {
        '*****@*****.**': 'Vapi',
        '*****@*****.**': 'Alex',
    }
    with pytest.raises(ValueError) as value_error:
        user_closed_tickets(rt_object, '*****@*****.**')
    assert 'Unknown email/user:' in str(value_error)
Ejemplo n.º 12
0
def stats_read_json_file(desired_year, desired_month):
    """
    Just read the JSON file for the request year and month.
    It will return everything on this file.

    :param desired_month:
    :return:
    """
    system = DITICConfig().get_system()
    filename = '%s/%s%s-%s' % (system['working_dir'], desired_year,
                               desired_month, system['statistics_file'])

    # Get the file information
    try:
        with open(filename, 'r') as file_handler:
            return load(file_handler)
    except IOError:
        return {}
    except ValueError:
        return {}
Ejemplo n.º 13
0
def updateTicket(ticketID):
    global emailGlobal

    priority = int(request.forms.get('priority'))

    if priority > 255:
        priority = 255

    if priority >= 200:
        setUrgent = 'yes'
    else:
        setUrgent = ''

    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    #create a ticket
    content = {
        'content': {
            'Priority': str(priority),
            'cf.{ditic - urgent}': setUrgent,
        }
    }

    try:
        response = resource.post(
            path='ticket/' + ticketID,
            payload=content,
        )
        logger.info(response.parsed)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
Ejemplo n.º 14
0
def addComment(ticketID):
    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    try:
        params = {
            'content': {
                'Action': 'comment',
                'Text': request.forms.get("content"),
            },
        }

        params2 = {
            'content': {
                'status': 'resolved',
            }
        }
        response = resource.post(
            path='ticket/' + ticketID + '/comment',
            payload=params,
        )
        response = resource.post(path='ticket/' + ticketID, payload=params2)
        for r in response.parsed:
            for t in r:
                logger.info(t)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
Ejemplo n.º 15
0
def user_tickets_details(rt_object, email):

    query = 'Owner = "' + email + '" AND Queue = "general" '

    config = DITICConfig()

    # If the user is dir, then build the search
    if email == 'dir':
        query = 'Queue = "general" AND "CF.{IS - Informatica e Sistemas}" = "DIR" AND Owner = "Nobody"  AND ' \
                'Status != "deleted" '

    # If the user is dir-inbox, then search for it
    elif email == 'dir-inbox':
        query = 'Queue = "general" AND "CF.{IS - Informatica e Sistemas}" = "DIR-INBOX" AND Owner = "Nobody"  AND ' \
                'Status != "deleted" '

    # If the user is unknown, then search all users but those that we already know
    elif email == 'unknown':
        query = 'Queue = "general" AND "CF.{IS - Informatica e Sistemas}" LIKE "DIR%"  AND ' \
                'Status != "deleted" '
        for user in config.get_email_to_user().keys():
            query += 'AND Owner != "' + user + '" '
        query += 'AND Owner != "Nobody"'

    # Otherwise, check if user is not known...
    elif not config.check_if_email_exist(email):
        raise ValueError('Unknown email/user:'******' AND Status != "deleted" '

    # Get the information from the server.
    try:
        response = get_list_of_tickets(rt_object, query)
    except ValueError as e:
        response = []

    if email == 'dir' or email == 'dir-inbox' or email == 'unknown':
        number_tickets_per_status = {email: len(response)}
        result = group_result_by(response, 'priority')
        for priority in result:
            for line in result[priority]:
                create_ticket_possible_actions(config, line, email,
                                               number_tickets_per_status)
    else:
        # Get some statistics
        response_grouped_by_status = group_result_by(response, 'status')
        number_tickets_per_status = {}
        for status in response_grouped_by_status:
            number_tickets_per_status[status] = len(
                response_grouped_by_status[status])

        result = {}
        for status in response_grouped_by_status:
            grouped_by_priority = group_result_by(
                response_grouped_by_status[status], 'priority')
            result[status] = grouped_by_priority
            for priority in grouped_by_priority:
                for line in grouped_by_priority[priority]:
                    create_ticket_possible_actions(config, line, email,
                                                   number_tickets_per_status)

    # The user limits...
    email_limit = config.get_email_limits(email)

    return {
        'tickets': result,
        'number_tickets_per_status': number_tickets_per_status,
        'email_limit': email_limit,
    }
Ejemplo n.º 16
0
def search_tickets(rt_object, search):
    """
    Search for tickets that match those criteria.
    The search will focus on those fields:
        - Requestors.EmailAddress
        - Subject
        - cf{servico}
        - cc
        - admincc
        - Requestor.Name
        - Requestor.RealName

    The tickets must be under the following restrictions:
        - Belongs to Queue General
        - Must have "CF.{IS - Informatica e Sistemas}" equal to DIR or DIR-INBOX
        - Must be created or updated on the last 90 days

    :param rt_object: RTApi object
    :param search: the search criteria
    :return:
    """
    config = DITICConfig()

    # Search last 30 days.
    previous_date = (date.today() - timedelta(90)).isoformat()

    # The search string
    query = 'Queue = "General" AND ( "CF.{IS - Informatica e Sistemas}" = "DIR" ' \
            'OR "CF.{IS - Informatica e Sistemas}" = "DIR-INBOX" ) AND ' \
            '( Lastupdated > "'+previous_date+'" OR Created > "'+previous_date+'") ' \
            'AND ( Requestor.EmailAddress LIKE "%'+search+'%" '
    for query_items in [
            'Subject', 'cf.{servico}', 'cc', 'admincc', 'Requestor.Name',
            'Requestor.RealName'
    ]:
        query += ' OR %s LIKE "%%%s%%" ' % (query_items, search)
    query += ')'

    # Get the information from the server.
    try:
        response = get_list_of_tickets(rt_object, query)
    except NameError as e:
        raise ValueError('Error: ' + str(e))
    except ValueError:
        return {
            'no_result': True,
            'number_tickets': 'No results...',
            'tickets': {},
        }

    number_tickets = len(response)
    for line in response:
        try:
            auxiliary_date = strptime(line['lastupdated'])
            auxiliary_date = '%02d/%02d' % (auxiliary_date.tm_mon,
                                            auxiliary_date.tm_mday)
        except ValueError:
            auxiliary_date = 0
        line['auxiliary_date'] = auxiliary_date
    result = group_result_by(response, 'auxiliary_date')

    email_limit = config.get_email_limits(search)

    return {
        'no_result': False,
        'tickets': result,
        'number_tickets': number_tickets,
        'email_limit': email_limit,
    }
Ejemplo n.º 17
0
#!/usr/bin/env python

from ditic_kanban.config import DITICConfig
from ditic_kanban.rt_api import get_list_of_tickets
from ditic_kanban.rt_api import RTApi

myconfig = DITICConfig()
system = myconfig.get_system()

email_rt_api = RTApi(system['server'], system['username'], system['password'])

#query = 'Owner = "*****@*****.**" and Status = "rejected"'
query = '"cf.{is - informatica e sistemas}" not like "dir" and "cf.{is - informatica e sistemas}" not like "dir-inbox"'

response = get_list_of_tickets(email_rt_api, query)

print response
print len(response)
Ejemplo n.º 18
0
from ditic_kanban.tools import ticket_actions
from ditic_kanban.tools import user_closed_tickets
from ditic_kanban.tools import search_tickets
from ditic_kanban.tools import get_urgent_tickets
from ditic_kanban.rt_api import RTApi, modify_ticket
from ditic_kanban.statistics import get_date
from ditic_kanban.statistics import get_statistics
from subprocess import call

emailGlobal = ''

# My first global variable...
user_auth = UserAuth()

# Only used by the URGENT tickets search
my_config = DITICConfig()
system = my_config.get_system()
rt_object = RTApi(system['server'], system['username'], system['password'])

# This part is necessary in order to get access to sound files
# Static dir is in the parent directory
STATIC_PATH = os.path.abspath(
    os.path.join(os.path.dirname(__file__), "../static"))

print STATIC_PATH


def create_default_result():
    # Default header configuration
    result = {'title': 'Dashboard'}
Ejemplo n.º 19
0
def __generate_summary_file(rt_object, list_emails, list_status):
    """
    This function will search all tickets and generate a summary to be used by the summary report.

    :param rt_object: the rt_object for accessing get_list_of_tickets
    :param list_emails: A set with the known emails. It is a set to optimize the search
    :param list_status: A list of available status
    :return: summary (TODO: how it is done!)
    """
    # Get the date from which we start searching tickets.
    previous_date = (date.today() - timedelta(0)).isoformat()

    # First step: search for all tickets of known emails
    known_email_query = ''
    for email in DITICConfig().get_email_to_user().keys():
        if known_email_query:
            known_email_query += ' OR '
        known_email_query += ' Owner = "%s" ' % email
    email_query = ' AND (' + known_email_query + ') '

    # Get the information from the server.
    try:
        response = get_list_of_tickets(
            rt_object, r'Queue = "general" AND ( Resolved > "%s" '
            r'OR ( Status != "resolved" '
            r'AND Status != "deleted" ) ) %s' % (previous_date, email_query))
    except ValueError as e:
        raise ValueError('Error1:' + str(e))

    # Second step: search for all tickets of DIR and DIR-INBOX
    try:
        response += get_list_of_tickets(
            rt_object,
            r'Queue = "general" AND ( "CF.{IS - Informatica e Sistemas}" = "INBOX"'
            r'OR "CF.{IS - Informatica e Sistemas}" = "INBOX" )'
            r'AND Owner = "nobody" AND Status != "resolved" '
            r'AND Status != "deleted" ')
    except ValueError as e:
        #raise ValueError('Error:2' + str(e))
        pass

    # Third step: search for all tickets of unknown emails
    known_email_query = ''
    for email in DITICConfig().get_email_to_user().keys():
        known_email_query += ' AND Owner != "%s" ' % email
    email_query = known_email_query + ' AND Owner != "nobody" '

    # Get the information from the server.
    try:
        response += get_list_of_tickets(
            rt_object, '''
                                        Queue = "general" AND Status != "resolved" AND Status != "deleted"
                                        AND ( "CF.{IS - Informatica e Sistemas}" = "INBOX"'
                                        OR "CF.{IS - Informatica e Sistemas}" = "INBOX" )
                                        %s
                                        ''' % email_query)
    except ValueError as e:
        if str(e) != 'no matching results.':
            raise ValueError('Error:3' + str(e))

    # Lets create summary dictionary
    summary = dict()
    summary['unknown'] = {status: 0 for status in list_status}
    summary['inbox'] = {status: 0 for status in list_status}
    #summary['dir-inbox'] = {status: 0 for status in list_status}

    group_by_email = group_result_by(response, 'owner')
    for email in sorted(group_by_email.keys()):
        group_by_status = group_result_by(group_by_email[email], 'status')

        # If this email is known, then identify it
        # If user is nobody, then it can be DIR or DIR-INBOX
        # Otherwise, it is unknown!
        if email in list_emails:
            summary[email] = {status: 0 for status in list_status}
        elif email == 'nobody':
            pass
        else:
            email = 'unknown'

        # Count the number of tickets in every status for this email
        for status in sorted(group_by_status.keys()):
            if email == 'nobody':
                group_by_cf = group_result_by(
                    group_by_status[status],
                    'cf.{is - informatica e sistemas}')
                #summary['dir'][status] += len(group_by_cf.get('dir', ''))
                summary['inbox'][status] += len(group_by_cf.get('inbox', ''))
            else:
                summary[email][status] += len(group_by_status[status])

    return summary