Advertisement
Guest User

Untitled

a guest
May 9th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.85 KB | None | 0 0
  1. ''#!/usr/bin/python
  2. # coding=utf-8
  3. import pandas as pd
  4. import datetime as dt
  5. import getpass
  6. import requests
  7.  
  8.  
  9. def main():
  10.     '''
  11.    Main function
  12.  
  13.    '''
  14.  
  15.  
  16.     def get_from_snow(pwd,user,url):
  17.         '''
  18.        Function to get data via Service-Now API. Results in Pandas DataFrame.
  19.  
  20.        '''
  21.  
  22.         headers = {'Accept':'application/json'}
  23.         response = requests.get(url, auth=(user, pwd), headers=headers)
  24.  
  25.         if response.status_code == 401:
  26.  
  27.             print ('Error in API call:' + str(response.status_code))
  28.             print ('Invalid credentials.')
  29.  
  30.             input('Press enter to exit.')
  31.             exit()
  32.  
  33.         if response.status_code == 403:
  34.  
  35.             return('Security category')
  36.  
  37.         if response.status_code != 200:
  38.  
  39.             print ('Error in API call: ' + str(response.status_code))
  40.  
  41.             input('Press enter to exit.')
  42.             exit()
  43.  
  44.         json = response.json()
  45.         data = pd.DataFrame(json['result'])
  46.  
  47.         return data
  48.  
  49.  
  50.     def get_json_from_snow(pwd,user,url):
  51.         '''
  52.        Function to get data via Service-Now API. Results in JSON.
  53.  
  54.        '''
  55.  
  56.         headers = {'Accept':'application/json'}
  57.         response = requests.get(url, auth=(user, pwd), headers=headers)
  58.  
  59.         if response.status_code == 401:
  60.  
  61.             print ('Error in API call:' + str(response.status_code))
  62.             print ('Invalid credentials.')
  63.  
  64.             input('Press enter to exit.')
  65.             exit()
  66.  
  67.         if response.status_code == 403:
  68.  
  69.             return('Security category')
  70.  
  71.         if response.status_code != 200:
  72.  
  73.             print ('Error in API call: ' + str(response.status_code))
  74.  
  75.             input('Press enter to exit.')
  76.             exit()
  77.  
  78.         json = response.json()
  79.         data = json['result']
  80.  
  81.         return data
  82.  
  83.  
  84.     def close_inc(pwd,user,sysid):
  85.         '''
  86.        Function to close incident from dynamo
  87.  
  88.        '''
  89.  
  90.         url = ('https://dynamo.appelsiini.com/api/now/v2/table/incident/'
  91.             + sysid
  92.             + '?sysparm_fields=number,incident_state,close_notes')
  93.         headers = {'Content-Type':'application/json','Accept':'application/json'}
  94.  
  95.         response = requests.put(
  96.             url,
  97.             auth=(user, pwd),
  98.             headers=headers,
  99.             data="{'incident_state':6,'close_code':'Cancelled','close_notes':'Suljettu massana 29.1.2018 liittyen ongelmaan PRBYLE0041311. Ratkaisuviesti Tiksussa.'}")
  100.  
  101.         if response.status_code != 200:
  102.  
  103.             print(
  104.                 'Status:',
  105.                 response.status_code,
  106.                 'Headers:',
  107.                 response.headers,
  108.                 'Error Response:',
  109.                 response.json()
  110.             )
  111.  
  112.             exit()
  113.  
  114.         json = response.json()
  115.         data = json['result']
  116.  
  117.         print('Incident ' + data['number'] + ' resolved!')
  118.  
  119.  
  120.     def get_false_open_valionow_incidents(dynamo_list,valionow_list):
  121.         '''
  122.        Function to get open Tiksu incidents that are not open in Dynamo
  123.  
  124.        '''
  125.  
  126.         false_open = valionow_list[
  127.             ~valionow_list['Dynamo numero'].isin(dynamo_list['Dynamo numero'])
  128.         ]
  129.  
  130.         return false_open
  131.  
  132.  
  133.     def get_false_open_dynamo_incidents(dynamo_list,valionow_list):
  134.         '''
  135.        Function to get open Tiksu incidents that are not open in Dynamo
  136.  
  137.        '''
  138.  
  139.         false_open = dynamo_list[
  140.             ~dynamo_list['Dynamo numero'].isin(valionow_list['Dynamo numero'])
  141.         ]
  142.  
  143.         return false_open
  144.  
  145.  
  146.     def sysid_to_name(group):
  147.         '''
  148.        Function to convert Assignment group sys_id to name
  149.  
  150.        '''
  151.  
  152.         if group:
  153.  
  154.             group = group['display_value']
  155.  
  156.             return group
  157.  
  158.         else:
  159.  
  160.             pass
  161.  
  162.  
  163.     def validate_close_note(inc_number):
  164.         '''
  165.        Function to check if close note has XML escape character
  166.  
  167.        '''
  168.  
  169.         url = ('https://yle.service-now.com/api/now/v2/table/'
  170.             + 'incident?'
  171.             + 'sysparm_query='
  172.             + 'number='
  173.             + inc_number
  174.             + '&sysparm_fields='
  175.             + 'close_notes')
  176.  
  177.         close_note = get_json_from_snow(tiksu_pwd,tiksu_user,url)
  178.  
  179.         if close_note:
  180.  
  181.             data = close_note[0]['close_notes']
  182.  
  183.             if '&' in data:
  184.  
  185.                 return('&')
  186.  
  187.             elif '<' and '>' in data:
  188.  
  189.                 return('<>')
  190.  
  191.             else:
  192.  
  193.                 return('')
  194.  
  195.         else:
  196.  
  197.             pass
  198.  
  199.  
  200.     def get_dynamo_duplicate(row):
  201.         '''
  202.        Function to check if false open Dynamo incident has duplicate
  203.  
  204.        '''
  205.  
  206.         url = ('https://valio.service-now.com/api/now/v2/table/'
  207.             + 'incident?'
  208.             + 'sysparm_query='
  209.             + 'number='
  210.             + row.loc['Valio NOW numero']
  211.             + '&sysparm_fields='
  212.             + 'u_external_id')
  213.  
  214.         valionow_dynamo_id = get_json_from_snow(valionow_pwd,valionow_user,url)
  215.  
  216.         if valionow_dynamo_id == 'Security category':
  217.  
  218.             return('Security category')
  219.  
  220.         else:
  221.  
  222.             if valionow_dynamo_id[0]['correlation_id'] != row.loc['Dynamo numero']:
  223.  
  224.                 return valionow_dynamo_id[0]['correlation_id']
  225.  
  226.             else:
  227.  
  228.                 return('')
  229.  
  230.  
  231.     def get_tiksu_duplicate(row):
  232.         '''
  233.        Function to check if false open Tiksu incident has duplicate
  234.  
  235.        '''
  236.  
  237.         url = ('https://dynamo.appelsiini.com/api/now/v2/table/'
  238.             + 'incident?'
  239.             + 'sysparm_query='
  240.             + 'number='
  241.             + row.loc['Dynamo numero']
  242.             + '&sysparm_fields='
  243.             + 'u_tiksu_id')
  244.  
  245.         dynamo_valionow_id = get_json_from_snow(dynamo_pwd,dynamo_user,url)
  246.  
  247.         if dynamo_valionow_id == 'Security category':
  248.  
  249.             return('Security category')
  250.  
  251.         else:
  252.  
  253.             if dynamo_valionow_id[0]['correlation_id'] != row.loc['Valio NOW numero']:
  254.  
  255.                 return dynamo_valionow_id[0]['correlation_id']
  256.  
  257.             else:
  258.  
  259.                 return('')
  260.  
  261.  
  262.     def save_to_excel (all_incs,false_tiksu_incs,false_dynamo_incs,filename,datestamp):
  263.         '''
  264.        Function to save to .xlsx file
  265.  
  266.        '''
  267.  
  268.  
  269.         writer = pd.ExcelWriter(
  270.             filename,
  271.             engine='xlsxwriter',
  272.             # datetime_format='dd.mm.yyyy hh:mm:ss'
  273.         )
  274.  
  275.  
  276.         all_incs.to_excel(
  277.             writer,
  278.             sheet_name='Tiksu ja Valio NOW avoimet',
  279.             columns=[
  280.                 'Valio NOW palvelujono',
  281.                 'Valio NOW tila',
  282.                 'Valio NOW numero',
  283.                 'Valio NOW prioriteetti',
  284.                 'Valio NOW luotu',
  285.                 'Dynamo numero',
  286.                 'Dynamo palvelujono',
  287.                 'Dynamo tila',
  288.                 'Dynamo prioriteetti',
  289.                 'Dynamo luotu'
  290.             ]
  291.         )
  292.  
  293.  
  294.         false_tiksu_incs.to_excel(
  295.             writer,
  296.             sheet_name='Valio NOW virheellisesti avoimet',
  297.             columns=[
  298.                 'Valio NOW palvelujono',
  299.                 'Valio NOW tila',
  300.                 'Valio NOW numero',
  301.                 'Valio NOW SysID',
  302.                 'Valio NOW prioriteetti',
  303.                 'Valio NOW luotu',
  304.                 'Dynamo numero',
  305.                 'Duplikaatti'
  306.             ]
  307.         )
  308.  
  309.  
  310.         false_dynamo_incs.to_excel(
  311.             writer,
  312.             sheet_name='Dynamo virheellisesti avoimet',
  313.             columns=[
  314.                 'Dynamo palvelujono',
  315.                 'Dynamo tila',
  316.                 'Dynamo numero',
  317.                 'Dynamo SysID',
  318.                 'Dynamo prioriteetti',
  319.                 'Dynamo luotu',
  320.                 'Valio NOW numero',
  321.                 'Duplikaatti'
  322.             ]
  323.         )
  324.  
  325.  
  326.         try:
  327.  
  328.             writer.save()
  329.  
  330.             print('List saved to file: ' + filename)
  331.  
  332.  
  333.         except IOError:
  334.  
  335.             print('Error: Permission denied when saving.')
  336.  
  337.  
  338.     '''
  339.    SCRIPT AND USER INPUT START
  340.  
  341.    '''
  342.  
  343.  
  344.     # Get open incidents from dynamo
  345.     print('Enter Dynamo username and password:')
  346.  
  347.     dynamo_user = input('Username: ')
  348.     dynamo_pwd = getpass.getpass()
  349.     dynamo_inc_query = (
  350.         'https://dynamo.appelsiini.com/api/now/v2/table/'
  351.         + 'incident?'
  352.         + 'sysparm_query='
  353.         + 'company=90a01e350ac8960e002782f991785d0a'
  354.         + '^incident_stateNOT IN6,7'
  355.         + '^correlation_idISNOTEMPTY'
  356.         + '&sysparm_fields='
  357.         + 'number,'
  358.         + 'correlation_id,'
  359.         + 'assignment_group,'
  360.         + 'incident_state,'
  361.         + 'sys_created_on,'
  362.         + 'sys_id,'
  363.         + 'priority'
  364.         + '&sysparm_display_value=true'
  365.     )
  366.  
  367.     print('Loading open incidents from dynamo...')
  368.  
  369.     dynamo_inc_list = get_from_snow(dynamo_pwd,dynamo_user,dynamo_inc_query)
  370.  
  371.     print(str(len(dynamo_inc_list.index)) + ' open incidents loaded from Dynamo.')
  372.  
  373.  
  374.     # Get open incidents from Tiksu
  375.     print('Enter Valio NOW username and password:')
  376.  
  377.     valionow_user = input('Username: ')
  378.     valionow_pwd = getpass.getpass()
  379.     valionow_inc_query = (
  380.         'https://valio.service-now.com/api/now/v2/table/'
  381.         + 'incident?'
  382.         + 'sysparm_query='
  383.         + 'incident_stateNOT IN6,7'
  384.         + '^elisa_correlation_idISNOTEMPTY'
  385.         + '&sysparm_fields='
  386.         + 'number,'
  387.         + 'elisa_correlation_id,'
  388.         + 'incident_state,'
  389.         + 'assignment_group,'
  390.         + 'sys_created_on,'
  391.         + 'sys_id,'
  392.         + 'priority'
  393.         + '&sysparm_display_value=true'
  394.     )
  395.  
  396.     print('Loading open incidents from Valio NOW...')
  397.  
  398.     valionow_inc_list = get_from_snow(valionow_pwd,valionow_user,valionow_inc_query)
  399.  
  400.     print(str(len(valionow_inc_list.index)) + ' open incidents loaded from Valio NOW.')
  401.  
  402.  
  403.     # Convert Assignment groups sysids to names
  404.     print('Converting assignment groups to text...')
  405.  
  406.     dynamo_inc_list['assignment_group'] = dynamo_inc_list['assignment_group'].apply(sysid_to_name)
  407.     valionow_inc_list['assignment_group'] = valionow_inc_list['assignment_group'].apply(sysid_to_name)
  408.  
  409.     print('Converting assignment group names done.')
  410.  
  411.  
  412.     # Rename column headers
  413.     dynamo_inc_list.columns = [
  414.         'Dynamo palvelujono',
  415.         'Dynamo tila',
  416.         'Dynamo numero',
  417.         'Dynamo prioriteetti',
  418.         'Dynamo luotu',
  419.         'Dynamo SysID',
  420.         'Valio NOW numero'
  421.     ]
  422.  
  423.     valionow_inc_list.columns = [
  424.         'Valio NOW palvelujono',
  425.         'Valio NOW tila',
  426.         'Valio NOW numero',
  427.         'Valio NOW prioriteetti',
  428.         'Valio NOW luotu',
  429.         'Valio NOW SysID',
  430.         'Dynamo numero'
  431.     ]
  432.  
  433.  
  434.     # Convert date fields to date type
  435.     dynamo_inc_list['Dynamo luotu'] = pd.to_datetime(
  436.         dynamo_inc_list['Dynamo luotu'],
  437.         dayfirst=True
  438.     )
  439.  
  440.     valionow_inc_list['Valio NOW luotu'] = pd.to_datetime(
  441.         valionow_inc_list['Valio NOW luotu'],
  442.         dayfirst=True
  443.     )
  444.  
  445.  
  446.     # Merge Dynamo and Tiksu open inc lists
  447.     open_inc_list = pd.merge(
  448.         valionow_inc_list, dynamo_inc_list,
  449.         on=['Dynamo numero', 'Valio NOW numero']
  450.     )
  451.  
  452.  
  453.     # Get open Tiksu incidents that are not open in Dynamo
  454.     false_open_valionow_list = get_false_open_valionow_incidents(
  455.         dynamo_inc_list,
  456.         valionow_inc_list
  457.     )
  458.  
  459.  
  460.     # Get open Dynamo incidents that are not open in Tiksu
  461.     false_open_dynamo_list = get_false_open_dynamo_incidents(
  462.         dynamo_inc_list,
  463.         valionow_inc_list
  464.     )
  465.  
  466.  
  467.     # # Close false open out dated Dynamo incidents
  468.     # print('Resloving out dated incidents...')
  469.     # resolved_counter = 0
  470.     # for index, row in false_open_dynamo_list.iterrows():
  471.     #     sys_id = row['Dynamo SysID']
  472.     #     close_inc(dynamo_pwd,dynamo_user,sys_id)
  473.     #     resolved_counter += 1
  474.     # print(str(resolved_counter) + ' incidents resolved.')
  475.  
  476.  
  477.     # # Add column to indicate if incident was closed in Tiksu with sepacial characters
  478.     # print('Checking for special characters in close notes..')
  479.     # false_open_dynamo_list['Sulkuviestissä erikoismerkki'] = false_open_dynamo_list['Tiksu numero'].apply(validate_close_note)
  480.     #
  481.     #
  482.     # # Close false open Dynamo incidents closed in Tiksu with special characters
  483.     # print("Resloving incidents closed in Tiksu with special characters '&' or '< >'...")
  484.     # resolved_counter = 0
  485.     # for index, row in false_open_dynamo_list.iterrows():
  486.     #     if row['Sulkuviestissä erikoismerkki']:
  487.     #         sys_id = row['Dynamo SysID']
  488.     #         close_inc(dynamo_pwd,dynamo_user,sys_id)
  489.     #         resolved_counter += 1
  490.     # print(str(resolved_counter) + ' incidents resolved.')
  491.  
  492.  
  493.     # Add column to indicate if false open Dynamo incident has duplicate
  494.  
  495.     if len(false_open_dynamo_list.index) > 0:
  496.  
  497.         print('Checking for duplicates in false open Dynamo incidents...')
  498.  
  499.         false_open_dynamo_list['Duplikaatti'] = false_open_dynamo_list.apply(
  500.             get_dynamo_duplicate,
  501.             axis=1
  502.         )
  503.  
  504.  
  505.     # Add column to indicate if false open Tiksu incident has duplicate
  506.  
  507.     if len(false_open_valionow_list.index) > 0:
  508.  
  509.         print('Checking for duplicates in false open Valio NOW incidents...')
  510.  
  511.         false_open_valionow_list['Duplikaatti'] = false_open_valionow_list.apply(
  512.             get_valionow_duplicate,
  513.             axis=1
  514.         )
  515.  
  516.  
  517.     # Save lists to .xlsx file
  518.     print('Saving incident lists to excel file...')
  519.  
  520.     datestamp = pd.datetime.today().strftime('%y%m%d_%H%M')
  521.     filename = 'reports\{}_open_inc_report.xlsx'.format(datestamp)
  522.  
  523.     save_to_excel(
  524.         open_inc_list,
  525.         false_open_valionow_list,
  526.         false_open_dynamo_list,
  527.         filename,
  528.         datestamp
  529.     )
  530.  
  531.  
  532. # Run main function only if called directly
  533. if __name__ == '__main__':
  534.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement