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

1#!/usr/bin/env python3 

2""" 

3List request types for a JSM service desk. 

4 

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""" 

11 

12import sys 

13import os 

14import argparse 

15import json 

16from pathlib import Path 

17 

18sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / 'shared' / 'scripts' / 'lib')) 

19 

20from config_manager import get_jira_client 

21from error_handler import print_error, JiraError 

22from formatters import format_json 

23 

24 

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. 

28 

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 

34 

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() 

41 

42 return request_types 

43 

44 

45def filter_request_types(request_types: dict, name_filter: str = None) -> dict: 

46 """ 

47 Filter request types by name pattern. 

48 

49 Args: 

50 request_types: Request types data 

51 name_filter: Name pattern to filter by 

52 

53 Returns: 

54 Filtered request types data 

55 """ 

56 if not name_filter: 

57 return request_types 

58 

59 filtered_values = [ 

60 rt for rt in request_types.get('values', []) 

61 if name_filter.lower() in rt.get('name', '').lower() 

62 ] 

63 

64 return { 

65 **request_types, 

66 'values': filtered_values, 

67 'size': len(filtered_values) 

68 } 

69 

70 

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. 

74 

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', []) 

81 

82 if not values: 

83 print(f"No request types found for {service_desk_name}.") 

84 return 

85 

86 print(f"Request Types for {service_desk_name}:") 

87 print() 

88 

89 if show_issue_types: 

90 print(f"{'ID':<4} {'Name':<30} {'Description':<40} {'Issue Type':<15}") 

91 print(f"{'──':<4} {'────':<30} {'───────────':<40} {'──────────':<15}") 

92 

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', '') 

98 

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}") 

103 

104 for rt in values: 

105 rt_id = rt.get('id', '') 

106 name = rt.get('name', '')[:28] 

107 description = rt.get('description', '')[:48] 

108 

109 print(f"{rt_id:<4} {name:<30} {description:<50}") 

110 

111 print() 

112 print(f"Total: {len(values)} request type{'s' if len(values) != 1 else ''}") 

113 

114 

115def format_request_types_json(request_types: dict) -> str: 

116 """ 

117 Format request types as JSON. 

118 

119 Args: 

120 request_types: Request types data 

121 

122 Returns: 

123 JSON string 

124 """ 

125 return format_json(request_types) 

126 

127 

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 ) 

133 

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)') 

155 

156 args = parser.parse_args() 

157 

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 ) 

166 

167 # Apply filters 

168 if args.filter: 

169 request_types = filter_request_types(request_types, args.filter) 

170 

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() 

176 

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) 

182 

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) 

189 

190 

191if __name__ == '__main__': 

192 main()