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

1#!/usr/bin/env python3 

2""" 

3List all JSM service desks. 

4 

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

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_service_desks(start: int = 0, limit: int = 50, profile: str = None) -> dict: 

26 """ 

27 List all JSM service desks. 

28 

29 Args: 

30 start: Starting index for pagination 

31 limit: Maximum results per page 

32 profile: JIRA profile to use 

33 

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

40 

41 return service_desks 

42 

43 

44def filter_service_desks(service_desks: dict, project_key_filter: str = None) -> dict: 

45 """ 

46 Filter service desks by project key pattern. 

47 

48 Args: 

49 service_desks: Service desks data 

50 project_key_filter: Project key pattern to filter by 

51 

52 Returns: 

53 Filtered service desks data 

54 """ 

55 if not project_key_filter: 

56 return service_desks 

57 

58 filtered_values = [ 

59 sd for sd in service_desks.get('values', []) 

60 if project_key_filter.upper() in sd.get('projectKey', '').upper() 

61 ] 

62 

63 return { 

64 **service_desks, 

65 'values': filtered_values, 

66 'size': len(filtered_values) 

67 } 

68 

69 

70def format_service_desks_text(service_desks: dict) -> None: 

71 """ 

72 Format service desks as human-readable text. 

73 

74 Args: 

75 service_desks: Service desks data 

76 """ 

77 values = service_desks.get('values', []) 

78 

79 if not values: 

80 print("No service desks found.") 

81 print("\nNote: Ensure Jira Service Management is enabled for this instance.") 

82 return 

83 

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

88 

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

94 

95 print(f"{sd_id:<4} {project_key:<15} {project_name:<30} {project_id:<10}") 

96 

97 print() 

98 print(f"Total: {len(values)} service desk{'s' if len(values) != 1 else ''}") 

99 

100 

101def format_service_desks_json(service_desks: dict) -> str: 

102 """ 

103 Format service desks as JSON. 

104 

105 Args: 

106 service_desks: Service desks data 

107 

108 Returns: 

109 JSON string 

110 """ 

111 return format_json(service_desks) 

112 

113 

114def main(): 

115 parser = argparse.ArgumentParser( 

116 description='List all JSM service desks', 

117 epilog='Example: python list_service_desks.py --filter IT' 

118 ) 

119 

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

138 

139 args = parser.parse_args() 

140 

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 ) 

148 

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) 

154 

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) 

160 

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) 

167 

168 

169if __name__ == '__main__': 

170 main()