Ejemplo n.º 1
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.º 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 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.º 5
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.º 6
0
def test_get_system():
    test_config = DITICConfig()
    test_config.system = {
        'server': 'server_address',
        'username': '******',
    }
    response = test_config.get_system()
    assert response == {
        'server': 'server_address',
        'username': '******',
    }
Ejemplo n.º 7
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.º 8
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.º 9
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.º 10
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.º 11
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.º 12
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.º 13
0
class UserAuth:
    def __init__(self):
        self.config = DITICConfig()
        self.ids = {
            # Only used for tests...
            # u'10': {
            #     'email': '*****@*****.**',
            #     'rt_object':  RTApi('server_address', 'username', 'password'),
            # }
        }

    def __get_new_id(self):
        while True:
            new_id = unicode(randint(0, 1000))
            if new_id not in self.ids:
                return new_id

    # noinspection PyTypeChecker
    def get_email_id(self, email):
        if email not in self.config.get_email_to_user().keys():
            raise ValueError('Unknown email')

        for uid in self.ids:
            if email == self.ids[uid]['email']:
                return uid

        raise ValueError('Unknown error! This should not be like this...')

    # noinspection PyTypeChecker
    def get_email_from_id(self, uid):
        if 'email' not in self.ids[uid]:
            raise ValueError('Unauthenticated user')
        return self.ids[uid]['email']

    # noinspection PyTypeChecker,PyTypeChecker
    def get_rt_object_from_email(self, email):
        if email not in self.config.get_email_to_user().keys():
            raise ValueError('Unknown email')

        for uid in self.ids:
            if email == self.ids[uid]['email']:
                return self.ids[uid]['rt_object']

        raise ValueError('Unknown error! This should not be like this...')

    def check_id(self, uid):
        """
        This function will check if id exists.
        It is important to say that id MUST be a unicode value!

        :param uid: unicode with id value
        :return: True or False, depending if ID exists or not
        """
        if uid in self.ids:
            return True
        return False

    def check_password(self, email, pwd):
        if email not in self.config.get_email_to_user().keys():
            raise ValueError('Unknown email')

        # Get system configurations
        system = self.config.get_system()

        # To check the password, we will try to check if user has any new ticket
        email_rt_api = RTApi(system['server'], email, pwd)

        data_dict = {'query': 'Owner = "%s" and Status = "new"' % email}
        response = email_rt_api.get_data_from_rest('/search/ticket', data_dict)
        if 'your username or password is incorrect' in response:
            raise ValueError('Password is incorrect')

        self.ids[self.__get_new_id()] = {
            'email': email,
            'rt_object': email_rt_api,
        }
        return True
Ejemplo n.º 14
0
from ditic_kanban.tools import archive_tickets
from ditic_kanban.rt_api import RTApi
from ditic_kanban.rt_api import get_list_of_tickets
from ditic_kanban.rt_api import 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

@get('/static/<filename>')
def fileget(filename):
    return static_file(filename, root='views')

@route('/getUrgentNumber')
def get_urgent_number():
    return str(len(get_urgent_tickets(rt_object)))
Ejemplo n.º 15
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.º 16
0
#!/usr/bin/env python
from pprint import pprint

from ditic_kanban.config import DITICConfig
from ditic_kanban.rt_api import RTApi
#from ditic_kanban.statistics import stats_read_json_file
#from ditic_kanban.statistics import get_statistics
#from ditic_kanban.statistics import full_list_of_tickets_on_a_date
from ditic_kanban.rt_projects import get_project_tree
from ditic_kanban.rt_projects import ManageProjectElements

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

#for aux in range(0, 30):
#    print get_date(aux),
#    print stats_number_of_tickets_of_an_user(rt_object, '*****@*****.**', get_date(aux))
#print stats_update_json_file(28)
#result = stats_read_json_file('2015', '07')
#for day in sorted(result):
#    print day,
#    print 'Created:', result[day]['created_tickets'],
#    print 'Resolved:', result[day]['team']['resolved'],
#    print 'Open:', result[day]['team']['open']
#    print 'Mean time: %0.2f' % result[day]['team']['mean_time_to_resolve']
#pprint(get_statistics('2015-05-01', '2015-07-30'))
#result = full_list_of_tickets_on_a_date(rt_object, config, '2015-07-25')
#pprint(result)

# Project examples:
Ejemplo n.º 17
0
class UserAuth:
    
    def __init__(self):
        self.config = DITICConfig()
        self.ids = {
            # Only used for tests...
            # u'10': {
            #     'email': '*****@*****.**',
            #     'rt_object':  RTApi('server_address', 'username', 'password'),
            # }
        }

    def __get_new_id(self):
        while True:
            new_id = unicode(randint(0, 1000))
            if new_id not in self.ids:
                return new_id

    # noinspection PyTypeChecker
    def get_email_id(self, email):
        if email not in self.config.get_email_to_user().keys():
            raise ValueError('Unknown email')

        for uid in self.ids:
            if email == self.ids[uid]['email']:
                return uid

        raise ValueError('Unknown error! This should not be like this...')

    # noinspection PyTypeChecker
    def get_email_from_id(self, uid):
        if 'email' not in self.ids[uid]:
            raise ValueError('Unauthenticated user')
        return self.ids[uid]['email']

    # noinspection PyTypeChecker,PyTypeChecker
    def get_rt_object_from_email(self, email):
        if email not in self.config.get_email_to_user().keys():
            raise ValueError('Unknown email')

        for uid in self.ids:
            if email == self.ids[uid]['email']:
                return self.ids[uid]['rt_object']

        raise ValueError('Unknown error! This should not be like this...')

    def check_id(self, uid):
        """
        This function will check if id exists.
        It is important to say that id MUST be a unicode value!

        :param uid: unicode with id value
        :return: True or False, depending if ID exists or not
        """
        if uid in self.ids:
            return True
        return False

    def check_password(self, email, pwd):
        if email not in self.config.get_email_to_user().keys():
            raise ValueError('Unknown email')

        # Get system configurations
        system = self.config.get_system()

        # To check the password, we will try to check if user has any new ticket
        email_rt_api = RTApi(system['server'], email, pwd)

        data_dict = {'query': 'Owner = "%s" and Status = "new"' % email}
        response = email_rt_api.get_data_from_rest('/search/ticket', data_dict)
        if 'your username or password is incorrect' in response:
            raise ValueError('Password is incorrect')

        self.ids[self.__get_new_id()] = {
            'email': email,
            'rt_object': email_rt_api,
        }
        return True