|
1 import suds |
|
2 import cobalt |
|
3 |
|
4 suds_active = False |
|
5 btannounce_active = False |
|
6 btannounce_timeout = 0 |
|
7 |
|
8 def is_active(): |
|
9 return suds_active |
|
10 |
|
11 def init(): |
|
12 try: |
|
13 print 'Initializing MantisBT connection...' |
|
14 suds_import = suds.xsd.doctor.Import ('http://schemas.xmlsoap.org/soap/encoding/', 'http://schemas.xmlsoap.org/soap/encoding/') |
|
15 suds_client = suds.client.Client ('https://zandronum.com/tracker/api/soap/mantisconnect.php?wsdl', plugins=[suds.xsd.doctor.ImportDoctor (suds_import)]) |
|
16 suds_active = True |
|
17 except Exception as e: |
|
18 print 'Failed to establish MantisBT connection: ' + `e` |
|
19 pass |
|
20 |
|
21 if suds_active: |
|
22 sys.stdout.write ('Retrieving latest tracker ticket... ') |
|
23 user, password = bt_credentials() |
|
24 btannounce_id = suds_client.service.mc_issue_get_biggest_id (user, password, 0) |
|
25 btannounce_active = True |
|
26 bt_updatechecktimeout() |
|
27 print btannounce_id |
|
28 |
|
29 def update_checktimeout(): |
|
30 global btannounce_timeout |
|
31 btannounce_timeout = time.time() + (Config.get_node ('bt').get_value ('checkinterval', default=5) * 60) |
|
32 |
|
33 def credentials(): |
|
34 bt = Config.get_node ('bt') |
|
35 user = bt.get_value ('username', '') |
|
36 password = bt.get_value ('password', '') |
|
37 return [user, password] |
|
38 |
|
39 def get_issue(ticket): |
|
40 global suds_client |
|
41 user, password = bt_credentials() |
|
42 return suds_client.service.mc_issue_get (user, password, ticket) |
|
43 |
|
44 def poll(): |
|
45 global btannounce_timeout |
|
46 global btannounce_id |
|
47 |
|
48 if time.time() >= btannounce_timeout: |
|
49 bt_updatechecktimeout() |
|
50 newid = btannounce_id |
|
51 try: |
|
52 user, password = bt_credentials() |
|
53 newid = suds_client.service.mc_issue_get_biggest_id (user, password, 0) |
|
54 except Exception as e: |
|
55 pass |
|
56 |
|
57 while newid > btannounce_id: |
|
58 try: |
|
59 btannounce_id += 1 |
|
60 data = bt_getissue (btannounce_id) |
|
61 |
|
62 for client in cobalt.all_clients: |
|
63 announce_new_ticket (client, data) |
|
64 except Exception as e: |
|
65 pass |
|
66 |
|
67 def get_ticket_url (ticket): |
|
68 url = Config.get_node ('bt').get_value ('url') |
|
69 return 'https://%s/view.php?id=%s' % (url, ticket) |
|
70 |
|
71 |
|
72 # |
|
73 # Print a ticket announce to appropriate channels |
|
74 # |
|
75 def announce_new_issue (bot, data): |
|
76 idstring = "%d" % data.id |
|
77 while len(idstring) < 7: |
|
78 idstring = "0" + idstring |
|
79 |
|
80 isprivate = data['view_state']['name'] == 'private' |
|
81 reporter = data['reporter']['name'] if hasattr (data['reporter'], 'name') else '<nobody>' |
|
82 |
|
83 for channel in self.channels: |
|
84 if channel.get_value ('btannounce', False): |
|
85 if not isprivate or (channel.get_value ('btprivate', False)): |
|
86 self.write ("PRIVMSG %s :[%s] New issue %s, reported by %s: %s: %s" % \ |
|
87 (channel['name'], data['project']['name'], idstring, reporter, |
|
88 data['summary'], self.get_ticket_url (idstring))) |
|
89 #fi |
|
90 #fi |
|
91 #done |