Coverage for scripts / list_service_desks.py: 0%
65 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-25 18:08 -0500
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-25 18:08 -0500
1#!/usr/bin/env python3
2"""
3List all JSM service desks.
5Usage:
6 python list_service_desks.py
7 python list_service_desks.py --output json
8 python list_service_desks.py --filter "IT"
9 python list_service_desks.py --project-key ITS
10"""
12import sys
13import os
14import argparse
15import json
16from pathlib import Path
18sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / 'shared' / 'scripts' / 'lib'))
20from config_manager import get_jira_client
21from error_handler import print_error, JiraError
22from formatters import format_json
25def list_service_desks(start: int = 0, limit: int = 50, profile: str = None) -> dict:
26 """
27 List all JSM service desks.
29 Args:
30 start: Starting index for pagination
31 limit: Maximum results per page
32 profile: JIRA profile to use
34 Returns:
35 Service desks data with values, size, start, limit, isLastPage
36 """
37 client = get_jira_client(profile)
38 service_desks = client.get_service_desks(start=start, limit=limit)
39 client.close()
41 return service_desks
44def filter_service_desks(service_desks: dict, project_key_filter: str = None) -> dict:
45 """
46 Filter service desks by project key pattern.
48 Args:
49 service_desks: Service desks data
50 project_key_filter: Project key pattern to filter by
52 Returns:
53 Filtered service desks data
54 """
55 if not project_key_filter:
56 return service_desks
58 filtered_values = [
59 sd for sd in service_desks.get('values', [])
60 if project_key_filter.upper() in sd.get('projectKey', '').upper()
61 ]
63 return {
64 **service_desks,
65 'values': filtered_values,
66 'size': len(filtered_values)
67 }
70def format_service_desks_text(service_desks: dict) -> None:
71 """
72 Format service desks as human-readable text.
74 Args:
75 service_desks: Service desks data
76 """
77 values = service_desks.get('values', [])
79 if not values:
80 print("No service desks found.")
81 print("\nNote: Ensure Jira Service Management is enabled for this instance.")
82 return
84 print("Available Service Desks:")
85 print()
86 print(f"{'ID':<4} {'Project Key':<15} {'Project Name':<30} {'Project ID':<10}")
87 print(f"{'──':<4} {'───────────':<15} {'────────────':<30} {'──────────':<10}")
89 for sd in values:
90 sd_id = sd.get('id', '')
91 project_key = sd.get('projectKey', '')
92 project_name = sd.get('projectName', '')
93 project_id = sd.get('projectId', '')
95 print(f"{sd_id:<4} {project_key:<15} {project_name:<30} {project_id:<10}")
97 print()
98 print(f"Total: {len(values)} service desk{'s' if len(values) != 1 else ''}")
101def format_service_desks_json(service_desks: dict) -> str:
102 """
103 Format service desks as JSON.
105 Args:
106 service_desks: Service desks data
108 Returns:
109 JSON string
110 """
111 return format_json(service_desks)
114def main():
115 parser = argparse.ArgumentParser(
116 description='List all JSM service desks',
117 epilog='Example: python list_service_desks.py --filter IT'
118 )
120 parser.add_argument('--output', '-o',
121 choices=['text', 'json'],
122 default='text',
123 help='Output format (default: text)')
124 parser.add_argument('--filter', '-f',
125 help='Filter by project name or key')
126 parser.add_argument('--project-key', '-k',
127 help='Filter by exact project key')
128 parser.add_argument('--limit', '-l',
129 type=int,
130 default=50,
131 help='Maximum results to return (default: 50)')
132 parser.add_argument('--start', '-s',
133 type=int,
134 default=0,
135 help='Starting index for pagination (default: 0)')
136 parser.add_argument('--profile',
137 help='JIRA profile to use (default: from config)')
139 args = parser.parse_args()
141 try:
142 # Fetch service desks
143 service_desks = list_service_desks(
144 start=args.start,
145 limit=args.limit,
146 profile=args.profile
147 )
149 # Apply filters
150 if args.project_key:
151 service_desks = filter_service_desks(service_desks, args.project_key)
152 elif args.filter:
153 service_desks = filter_service_desks(service_desks, args.filter)
155 # Output results
156 if args.output == 'json':
157 print(format_service_desks_json(service_desks))
158 else:
159 format_service_desks_text(service_desks)
161 except JiraError as e:
162 print_error(e)
163 sys.exit(1)
164 except Exception as e:
165 print_error(e, debug=True)
166 sys.exit(1)
169if __name__ == '__main__':
170 main()