Coverage for scripts / list_request_types.py: 0%
75 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 request types for a JSM service desk.
5Usage:
6 python list_request_types.py 1
7 python list_request_types.py 1 --output json
8 python list_request_types.py 1 --filter "incident"
9 python list_request_types.py 1 --show-issue-types
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_request_types(service_desk_id: str, start: int = 0, limit: int = 50, profile: str = None) -> dict:
26 """
27 List request types for a service desk.
29 Args:
30 service_desk_id: Service desk ID
31 start: Starting index for pagination
32 limit: Maximum results per page
33 profile: JIRA profile to use
35 Returns:
36 Request types data
37 """
38 client = get_jira_client(profile)
39 request_types = client.get_request_types(service_desk_id, start=start, limit=limit)
40 client.close()
42 return request_types
45def filter_request_types(request_types: dict, name_filter: str = None) -> dict:
46 """
47 Filter request types by name pattern.
49 Args:
50 request_types: Request types data
51 name_filter: Name pattern to filter by
53 Returns:
54 Filtered request types data
55 """
56 if not name_filter:
57 return request_types
59 filtered_values = [
60 rt for rt in request_types.get('values', [])
61 if name_filter.lower() in rt.get('name', '').lower()
62 ]
64 return {
65 **request_types,
66 'values': filtered_values,
67 'size': len(filtered_values)
68 }
71def format_request_types_text(request_types: dict, service_desk_name: str = "Service Desk", show_issue_types: bool = False) -> None:
72 """
73 Format request types as human-readable text.
75 Args:
76 request_types: Request types data
77 service_desk_name: Service desk name for display
78 show_issue_types: Show issue type IDs
79 """
80 values = request_types.get('values', [])
82 if not values:
83 print(f"No request types found for {service_desk_name}.")
84 return
86 print(f"Request Types for {service_desk_name}:")
87 print()
89 if show_issue_types:
90 print(f"{'ID':<4} {'Name':<30} {'Description':<40} {'Issue Type':<15}")
91 print(f"{'──':<4} {'────':<30} {'───────────':<40} {'──────────':<15}")
93 for rt in values:
94 rt_id = rt.get('id', '')
95 name = rt.get('name', '')[:28]
96 description = rt.get('description', '')[:38]
97 issue_type_id = rt.get('issueTypeId', '')
99 print(f"{rt_id:<4} {name:<30} {description:<40} {issue_type_id:<15}")
100 else:
101 print(f"{'ID':<4} {'Name':<30} {'Description':<50}")
102 print(f"{'──':<4} {'────':<30} {'───────────':<50}")
104 for rt in values:
105 rt_id = rt.get('id', '')
106 name = rt.get('name', '')[:28]
107 description = rt.get('description', '')[:48]
109 print(f"{rt_id:<4} {name:<30} {description:<50}")
111 print()
112 print(f"Total: {len(values)} request type{'s' if len(values) != 1 else ''}")
115def format_request_types_json(request_types: dict) -> str:
116 """
117 Format request types as JSON.
119 Args:
120 request_types: Request types data
122 Returns:
123 JSON string
124 """
125 return format_json(request_types)
128def main():
129 parser = argparse.ArgumentParser(
130 description='List request types for a JSM service desk',
131 epilog='Example: python list_request_types.py 1'
132 )
134 parser.add_argument('service_desk_id',
135 help='Service desk ID')
136 parser.add_argument('--output', '-o',
137 choices=['text', 'json'],
138 default='text',
139 help='Output format (default: text)')
140 parser.add_argument('--filter', '-f',
141 help='Filter by name pattern')
142 parser.add_argument('--show-issue-types', '-i',
143 action='store_true',
144 help='Show underlying JIRA issue types')
145 parser.add_argument('--limit', '-l',
146 type=int,
147 default=50,
148 help='Maximum results to return (default: 50)')
149 parser.add_argument('--start', '-s',
150 type=int,
151 default=0,
152 help='Starting index for pagination (default: 0)')
153 parser.add_argument('--profile',
154 help='JIRA profile to use (default: from config)')
156 args = parser.parse_args()
158 try:
159 # Fetch request types
160 request_types = list_request_types(
161 args.service_desk_id,
162 start=args.start,
163 limit=args.limit,
164 profile=args.profile
165 )
167 # Apply filters
168 if args.filter:
169 request_types = filter_request_types(request_types, args.filter)
171 # Get service desk name for display
172 client = get_jira_client(args.profile)
173 service_desk = client.get_service_desk(args.service_desk_id)
174 service_desk_name = f"{service_desk.get('projectName', '')} ({service_desk.get('projectKey', '')})"
175 client.close()
177 # Output results
178 if args.output == 'json':
179 print(format_request_types_json(request_types))
180 else:
181 format_request_types_text(request_types, service_desk_name, args.show_issue_types)
183 except JiraError as e:
184 print_error(e)
185 sys.exit(1)
186 except Exception as e:
187 print_error(e, debug=True)
188 sys.exit(1)
191if __name__ == '__main__':
192 main()