Get JSM Customer With Python

Read all customers from Jira Service Management and store the response in Microsoft Excel. In this example we utilize the great Data Science Tool Python Pandas.

#!/usr/bin/env python3
# File: get_customers.py
# Example: ./get_customers.py -u user.1@atlassian-demo-users.de -p wsafAewcfAfarfacrthejt42 --url https://demo12-company-de.atlassian.net --portalid 1

import requests
from requests.auth import HTTPBasicAuth
import json
import sys
import pandas as pd
import csv
import argparse

def main():
    arg_parser = argparse.ArgumentParser()
    arg_parser.add_argument('-u', help='username like first.last@example.com', required=True)
    arg_parser.add_argument('-p', help='password like a personal access token', required=True)
    arg_parser.add_argument('--url', help='like https://site.atlassian.net', required=True)
    arg_parser.add_argument('--portalid', help='e.g. displayed in the browser\'s url field when entering a Service Management portal', required=True)
    arg_parser.add_argument('-o', help='Microsoft Excel output filename', required=True)
    args = arg_parser.parse_args()

    output_structure = {}
    output_structure['data'] = []
    account_ids = []

    ### Get all organizations

    organizations = requests.get(
        url = args.url + '/rest/servicedeskapi/organization',
        headers = {"Content-type":"application/json"},
        auth = HTTPBasicAuth(args.u, args.p),
        params = {"limit":100})
    organizations = organizations.json()

    ### Get all customers of any organizations

    for organization in organizations['values']:
        customers = requests.get(
            url = args.url + '/rest/servicedeskapi/organization/' + organization['id'] + '/user',
            headers = {"Content-type":"application/json"},
            auth = HTTPBasicAuth(args.u, args.p),
            params = {"limit":1000})
        customers = customers.json()
        account_ids += [x['accountId'] for x in customers['values']]
        organization['customers'] = {'values': customers['values']}
        output_structure['data'].append(organization)

    ### Get all not organized customers

    customers = requests.get(
        url = args.url + '/rest/servicedeskapi/servicedesk/' + args.portalid + '/customer',
        headers = {"Content-type": "application/json", "X-ExperimentalApi": "opt-in"},
        auth = HTTPBasicAuth(args.u, args.p),
        params = {"limit": 5000})
    customers = customers.json()
    output_structure['data'].append({
        "id": "",
        "name": "",
        "customers": {'values': [x for x in customers['values'] if x['accountId'] not in account_ids]}})

    ### Output

    filter_fields = ["id","name","accountId","emailAddress","displayName"]
    df = pd.json_normalize(output_structure, record_path=['data'])
    df = df.apply(lambda x: x.explode()).reset_index(drop=True)
    df['customers.values'].fillna({x: {} for x in df.index}, inplace=True)
    df_cv = pd.json_normalize(df['customers.values'], sep='_', errors='ignore')
    df = pd.concat([df] + [df_cv], axis=1).drop(columns=['customers.values'])[filter_fields]

    df.to_excel(args.o, index=False)

if __name__ == "__main__":
    main()

Reach out to me for professional support!

Contact