annotate bugzilla.py @ 22:97b3eb038314

made bzpatch.py executable
author Atul Varma <avarma@mozilla.com>
date Tue, 13 Apr 2010 22:33:53 -0700
parents f6efd07c8356
children 96f841399b40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
1 #! /usr/bin/env python
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
2
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
3 import os
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
4 import sys
5
7745feb7ca9c Added BugzillaApi.post_attachment()
Atul Varma <avarma@mozilla.com>
parents: 4
diff changeset
5 import base64
0
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
6 import httplib
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
7 import urllib
5
7745feb7ca9c Added BugzillaApi.post_attachment()
Atul Varma <avarma@mozilla.com>
parents: 4
diff changeset
8 import mimetypes
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
9 import datetime
0
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
10 from urlparse import urlparse
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
11 from getpass import getpass
0
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
12
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
13 try:
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
14 import json
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
15 except ImportError:
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
16 import simplejson as json
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
17
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
18 DEFAULT_CONFIG = {
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
19 'api_server': 'https://api-dev.bugzilla.mozilla.org/latest',
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
20 'server': 'https://bugzilla.mozilla.org'
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
21 }
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
22
0
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
23 def json_request(method, url, query_args=None, body=None):
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
24 if query_args is None:
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
25 query_args = {}
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
26
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
27 headers = {'Accept': 'application/json',
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
28 'Content-Type': 'application/json'}
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
29
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
30 urlparts = urlparse(url)
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
31 if urlparts.scheme == 'https':
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
32 connclass = httplib.HTTPSConnection
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
33 elif urlparts.scheme == 'http':
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
34 connclass = httplib.HTTPConnection
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
35 else:
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
36 raise ValueError('unknown scheme "%s"' % urlparts.scheme)
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
37 conn = connclass(urlparts.netloc)
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
38 path = urlparts.path
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
39 if query_args:
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
40 path += '?%s' % urllib.urlencode(query_args)
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
41 if body is not None:
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
42 body = json.dumps(body)
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
43 conn.request(method, path, body, headers)
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
44 response = conn.getresponse()
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
45 status, reason = response.status, response.reason
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
46 mimetype = response.msg.gettype()
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
47 data = response.read()
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
48 conn.close()
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
49
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
50 if mimetype == 'application/json':
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
51 data = json.loads(data)
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
52
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
53 return {'status': response.status,
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
54 'reason': response.reason,
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
55 'content_type': mimetype,
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
56 'body': data}
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
57
3
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
58 def make_caching_json_request(cache, json_request=json_request):
2
04f5ad537f36 use sha1 instead of sha512
Atul Varma <avarma@mozilla.com>
parents: 1
diff changeset
59 from hashlib import sha1 as hashfunc
1
aca76355e4d8 Added make_caching_json_request() and .hgignore
Atul Varma <avarma@mozilla.com>
parents: 0
diff changeset
60
aca76355e4d8 Added make_caching_json_request() and .hgignore
Atul Varma <avarma@mozilla.com>
parents: 0
diff changeset
61 def caching_json_request(method, url, query_args=None, body=None):
3
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
62 key = hashfunc(repr((method, url, query_args, body))).hexdigest()
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
63 if not key in cache:
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
64 cache[key] = json_request(method=method,
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
65 url=url,
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
66 query_args=query_args,
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
67 body=body)
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
68 return cache[key]
1
aca76355e4d8 Added make_caching_json_request() and .hgignore
Atul Varma <avarma@mozilla.com>
parents: 0
diff changeset
69
aca76355e4d8 Added make_caching_json_request() and .hgignore
Atul Varma <avarma@mozilla.com>
parents: 0
diff changeset
70 return caching_json_request
aca76355e4d8 Added make_caching_json_request() and .hgignore
Atul Varma <avarma@mozilla.com>
parents: 0
diff changeset
71
3
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
72 class JsonBlobCache(object):
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
73 def __init__(self, cachedir):
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
74 self.cachedir = cachedir
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
75
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
76 def __pathforkey(self, key):
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
77 if not isinstance(key, basestring):
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
78 raise ValueError('key must be a string')
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
79 return os.path.join(self.cachedir, '%s.json' % key)
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
80
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
81 def __getitem__(self, key):
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
82 if not key in self:
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
83 raise KeyError(key)
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
84 return json.loads(open(self.__pathforkey(key)).read())
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
85
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
86 def __setitem__(self, key, value):
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
87 open(self.__pathforkey(key), 'w').write(json.dumps(value))
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
88
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
89 def __contains__(self, key):
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
90 return os.path.exists(self.__pathforkey(key))
85016bf54034 Added JsonBlobCache class
Atul Varma <avarma@mozilla.com>
parents: 2
diff changeset
91
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
92 def getpass_or_die(prompt, getpass=getpass):
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
93 try:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
94 password = getpass(prompt)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
95 except KeyboardInterrupt:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
96 password = None
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
97
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
98 if not password:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
99 print "Aborted."
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
100 sys.exit(1)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
101
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
102 return password
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
103
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
104 def load_config(filename=None, getpass=None):
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
105 config = {}
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
106 config.update(DEFAULT_CONFIG)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
107
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
108 if not filename:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
109 filename = os.path.join('~', '.bugzilla-config.json')
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
110 filename = os.path.expanduser(filename)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
111 if not os.path.exists(filename):
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
112 return config
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
113
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
114 config.update(json.loads(open(filename).read()))
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
115
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
116 if getpass and 'username' in config and 'password' not in config:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
117 config['password'] = getpass('Enter password for %s: ' %
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
118 config['username'])
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
119 return config
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
120
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
121 class BugzillaApi(object):
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
122 def __init__(self, config=None, jsonreq=None,
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
123 getpass=getpass_or_die):
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
124 if config is None:
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
125 config = load_config(getpass=getpass)
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
126
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
127 if jsonreq is None:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
128 if 'cache_dir' in config:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
129 cache = JsonBlobCache(os.path.expanduser(config['cache_dir']))
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
130 jsonreq = make_caching_json_request(cache)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
131 else:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
132 jsonreq = json_request
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
133
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
134 self.config = config
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
135 self.__jsonreq = jsonreq
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
136 self.users = LazyMapping(self, User, keytype=unicode)
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
137 self.bugs = LazyMapping(self, Bug, keytype=int)
17
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
138 self.attachments = Attachments(self)
5
7745feb7ca9c Added BugzillaApi.post_attachment()
Atul Varma <avarma@mozilla.com>
parents: 4
diff changeset
139
20
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
140 @property
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
141 def current_user(self):
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
142 # TODO: Deal more gracefully w/ case where user isn't
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
143 # logged-in.
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
144 return self.users.get(self.config['username'])
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
145
4
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
146 def request(self, method, path, query_args=None, body=None):
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
147 if query_args is None:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
148 query_args = {}
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
149
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
150 if 'username' in self.config and 'password' in self.config:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
151 for name in ['username', 'password']:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
152 query_args[name] = self.config[name]
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
153
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
154 url = '%s%s' % (self.config['api_server'], path)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
155
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
156 response = self.__jsonreq(method=method,
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
157 url=url,
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
158 query_args=query_args,
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
159 body=body)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
160
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
161 if response['content_type'] == 'application/json':
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
162 json_response = response['body']
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
163 if 'error' in json_response and json_response['error']:
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
164 raise BugzillaApiError(response)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
165 return json_response
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
166 raise BugzillaApiError(response)
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
167
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
168 class BugzillaApiError(Exception):
4e31f7aeb1b8 Made BugzillaAPI
Atul Varma <avarma@mozilla.com>
parents: 3
diff changeset
169 pass
0
349a78c460e2 Origination.
Atul Varma <avarma@mozilla.com>
parents:
diff changeset
170
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
171 def iso8601_to_datetime(timestamp):
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
172 """
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
173 >>> iso8601_to_datetime('2010-04-11T19:16:59Z')
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
174 datetime.datetime(2010, 4, 11, 19, 16, 59)
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
175 """
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
176
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
177 return datetime.datetime.strptime(timestamp,
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
178 "%Y-%m-%dT%H:%M:%SZ")
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
179
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
180 class BugzillaObject(object):
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
181 __bzprops__ = {}
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
182
12
d8db9b733a12 added superclass constructor for BugzillaObject
Atul Varma <avarma@mozilla.com>
parents: 11
diff changeset
183 def __init__(self, jsonobj, bzapi):
d8db9b733a12 added superclass constructor for BugzillaObject
Atul Varma <avarma@mozilla.com>
parents: 11
diff changeset
184 self._set_bzprops(jsonobj)
d8db9b733a12 added superclass constructor for BugzillaObject
Atul Varma <avarma@mozilla.com>
parents: 11
diff changeset
185 self.bzapi = bzapi
d8db9b733a12 added superclass constructor for BugzillaObject
Atul Varma <avarma@mozilla.com>
parents: 11
diff changeset
186
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
187 def _set_bzprops(self, jsonobj):
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
188 for name, proptype in self.__bzprops__.items():
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
189 if name not in jsonobj:
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
190 raise KeyError("key '%s' not found in JSON "
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
191 "%s object" % (name,
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
192 self.__class__.__name__))
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
193 if proptype == bool:
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
194 if jsonobj[name] == '0':
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
195 setattr(self, name, False)
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
196 elif jsonobj[name] == '1':
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
197 setattr(self, name, True)
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
198 else:
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
199 raise ValueError('bad boolean value: %s' %
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
200 repr(jsonobj[name]))
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
201 elif proptype in [int, unicode, str]:
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
202 setattr(self, name, proptype(jsonobj[name]))
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
203 elif proptype == datetime.datetime:
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
204 setattr(self, name,
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
205 iso8601_to_datetime(jsonobj[name]))
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
206 else:
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
207 raise ValueError("bad proptype for '%s': %s" %
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
208 name, repr(proptype))
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
209
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
210 class LazyMapping(object):
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
211 def __init__(self, bzapi, klass, keytype):
17
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
212 self.bzapi = bzapi
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
213 self.__klass = klass
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
214 self.__keytype = keytype
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
215 self.__mapping = {}
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
216
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
217 def get(self, name, jsonobj=None):
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
218 name = self.__keytype(name)
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
219 if name not in self.__mapping:
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
220 if jsonobj:
17
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
221 obj = self.__klass(jsonobj, self.bzapi)
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
222 else:
17
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
223 obj = self.__klass.fetch(self.bzapi, name)
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
224 self.__mapping[name] = obj
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
225
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
226 return self.__mapping[name]
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
227
17
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
228 class Attachments(LazyMapping):
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
229 def __init__(self, bzapi):
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
230 LazyMapping.__init__(self, bzapi, Attachment, int)
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
231
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
232 def post(self, bug_id, contents, filename, description,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
233 content_type=None, is_patch=False, is_private=False,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
234 is_obsolete=False,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
235 guess_mime_type=mimetypes.guess_type):
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
236 """
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
237 >>> jsonreq = Mock('jsonreq')
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
238 >>> jsonreq.mock_returns = {
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
239 ... "status": 201,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
240 ... "body": {"ref": "http://foo/latest/attachment/1"},
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
241 ... "reason": "Created",
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
242 ... "content_type": "application/json"
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
243 ... }
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
244 >>> bzapi = BugzillaApi(config=TEST_CFG_WITH_LOGIN,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
245 ... jsonreq=jsonreq)
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
246 >>> bzapi.attachments.post(bug_id=536619,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
247 ... contents="testing!",
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
248 ... filename="contents.txt",
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
249 ... description="test upload")
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
250 Called jsonreq(
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
251 body={'is_obsolete': False, 'flags': [],
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
252 'description': 'test upload',
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
253 'content_type': 'text/plain', 'encoding': 'base64',
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
254 'file_name': 'contents.txt', 'is_patch': False,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
255 'data': 'dGVzdGluZyE=', 'is_private': False,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
256 'size': 8},
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
257 method='POST',
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
258 query_args={'username': 'bar', 'password': 'baz'},
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
259 url='http://foo/latest/bug/536619/attachment')
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
260 {'ref': 'http://foo/latest/attachment/1'}
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
261 """
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
262
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
263 if content_type is None:
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
264 content_type = guess_mime_type(filename)[0]
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
265 if not content_type:
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
266 raise ValueError('could not guess content type for "%s"' %
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
267 filename)
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
268
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
269 attachment = {
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
270 'data': base64.b64encode(contents),
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
271 'description': description,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
272 'encoding': 'base64',
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
273 'file_name': filename,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
274 'flags': [],
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
275 'is_obsolete': is_obsolete,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
276 'is_patch': is_patch,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
277 'is_private': is_private,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
278 'size': len(contents),
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
279 'content_type': content_type
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
280 }
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
281
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
282 return self.bzapi.request('POST', '/bug/%d/attachment' % bug_id,
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
283 body=attachment)
a6b33ad7db1d Moved BugzillaApi.post_attachment() to BugzillaApi.attachments.post().
Atul Varma <avarma@mozilla.com>
parents: 15
diff changeset
284
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
285 class User(BugzillaObject):
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
286 """
13
d5f43c3aeb29 made passing bzapi into constructors of User, Bug, Attachment objects mandatory
Atul Varma <avarma@mozilla.com>
parents: 12
diff changeset
287 >>> u = User(TEST_USER, bzapi=None)
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
288 >>> u.name
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
289 u'avarma@mozilla.com'
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
290 >>> u.real_name
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
291 u'Atul Varma [:atul]'
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
292 >>> u.email
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
293 u'avarma@mozilla.com'
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
294
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
295 >>> bzapi = Mock('bzapi')
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
296 >>> bzapi.request.mock_returns = TEST_USER_SEARCH_RESULT
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
297 >>> u = User({'name': 'avarma@mozilla.com'}, bzapi)
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
298 >>> u.real_name
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
299 Called bzapi.request(
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
300 'GET',
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
301 '/user',
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
302 query_args={'match': u'avarma@mozilla.com'})
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
303 u'Atul Varma [:atul]'
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
304 """
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
305
20
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
306 # TODO: This class currently assumes that the bzapi is
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
307 # authenticated (i.e., a user is logged-in).
f6efd07c8356 Implemented 'bzpatch.py post'
Atul Varma <avarma@mozilla.com>
parents: 17
diff changeset
308
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
309 __bzprops__ = {
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
310 'name': unicode
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
311 }
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
312
13
d5f43c3aeb29 made passing bzapi into constructors of User, Bug, Attachment objects mandatory
Atul Varma <avarma@mozilla.com>
parents: 12
diff changeset
313 def __init__(self, jsonobj, bzapi):
12
d8db9b733a12 added superclass constructor for BugzillaObject
Atul Varma <avarma@mozilla.com>
parents: 11
diff changeset
314 BugzillaObject.__init__(self, jsonobj, bzapi)
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
315 self.__email = jsonobj.get('email')
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
316 self.__real_name = jsonobj.get('real_name')
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
317
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
318 def __fulfill(self):
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
319 user = self.__get_user(self.bzapi, self.name)
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
320 self.__email = user['email']
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
321 self.__real_name = user['real_name']
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
322
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
323 @property
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
324 def email(self):
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
325 if self.__email is None:
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
326 self.__fulfill()
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
327 return self.__email
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
328
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
329 @property
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
330 def real_name(self):
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
331 if self.__real_name is None:
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
332 self.__fulfill()
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
333 return self.__real_name
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
334
14
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
335 def __repr__(self):
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
336 return '<User %s>' % repr(self.name)
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
337
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
338 @staticmethod
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
339 def __get_user(bzapi, name):
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
340 response = bzapi.request('GET', '/user',
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
341 query_args={'match': name})
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
342 users = response['users']
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
343 if len(users) > 1:
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
344 raise BugzillaApiError("more than one user found for "
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
345 "name '%s'" % name)
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
346 elif not users:
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
347 raise BugzillaApiError("no users found for "
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
348 "name '%s'" % name)
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
349 return users[0]
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
350
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
351 @classmethod
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
352 def fetch(klass, bzapi, name):
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
353 """
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
354 >>> bzapi = Mock('bzapi')
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
355 >>> bzapi.request.mock_returns = TEST_USER_SEARCH_RESULT
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
356 >>> User.fetch(bzapi, 'avarma@mozilla.com')
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
357 Called bzapi.request('GET', '/user',
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
358 query_args={'match': 'avarma@mozilla.com'})
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
359 <User u'avarma@mozilla.com'>
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
360 """
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
361
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
362 return klass(klass.__get_user(bzapi, name), bzapi)
0910577d08fa Added LazyMapping and User.fetch
Atul Varma <avarma@mozilla.com>
parents: 13
diff changeset
363
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
364 class Attachment(BugzillaObject):
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
365 """
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
366 >>> bzapi = MockBugzillaApi()
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
367 >>> bzapi.request.mock_returns = TEST_ATTACHMENT_WITH_DATA
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
368 >>> a = Attachment(TEST_ATTACHMENT_WITHOUT_DATA, bzapi)
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
369 >>> a.data
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
370 Called bzapi.request(
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
371 'GET',
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
372 '/attachment/438797',
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
373 query_args={'attachmentdata': '1'})
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
374 'testing!'
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
375 """
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
376
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
377 __bzprops__ = {
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
378 'id': int,
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
379 'bug_id': int,
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
380 'last_change_time': datetime.datetime,
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
381 'creation_time': datetime.datetime,
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
382 'description': unicode,
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
383 'content_type': str,
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
384 'is_patch': bool,
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
385 'is_obsolete': bool
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
386 }
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
387
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
388 def __init__(self, jsonobj, bzapi):
12
d8db9b733a12 added superclass constructor for BugzillaObject
Atul Varma <avarma@mozilla.com>
parents: 11
diff changeset
389 BugzillaObject.__init__(self, jsonobj, bzapi)
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
390 if 'data' in jsonobj:
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
391 self.__data = self.__decode_data(jsonobj)
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
392 else:
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
393 self.__data = None
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
394 self.attacher = self.bzapi.users.get(jsonobj['attacher']['name'],
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
395 jsonobj['attacher'])
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
396
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
397 @property
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
398 def bug(self):
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
399 return self.bzapi.bugs.get(self.bug_id)
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
400
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
401 @property
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
402 def data(self):
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
403 if self.__data is None:
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
404 jsonobj = self.__get_full_attachment(self.bzapi, self.id)
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
405 self.__data = self.__decode_data(jsonobj)
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
406 return self.__data
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
407
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
408 def __decode_data(self, jsonobj):
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
409 if jsonobj['encoding'] != 'base64':
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
410 raise NotImplementedError("unrecognized encoding: %s" %
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
411 jsonobj['encoding'])
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
412 return base64.b64decode(jsonobj['data'])
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
413
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
414 def __repr__(self):
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
415 return '<Attachment %d - %s>' % (self.id, repr(self.description))
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
416
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
417 @staticmethod
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
418 def __get_full_attachment(bzapi, attach_id):
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
419 return bzapi.request('GET', '/attachment/%d' % attach_id,
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
420 query_args={'attachmentdata': '1'})
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
421
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
422 @classmethod
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
423 def fetch(klass, bzapi, attach_id):
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
424 """
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
425 >>> bzapi = MockBugzillaApi()
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
426 >>> bzapi.request.mock_returns = TEST_ATTACHMENT_WITH_DATA
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
427 >>> Attachment.fetch(bzapi, 438797)
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
428 Called bzapi.request(
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
429 'GET',
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
430 '/attachment/438797',
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
431 query_args={'attachmentdata': '1'})
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
432 <Attachment 438797 - u'test upload'>
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
433 """
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
434
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
435 return klass(klass.__get_full_attachment(bzapi, attach_id),
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
436 bzapi)
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
437
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
438 class Bug(BugzillaObject):
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
439 """
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
440 >>> Bug(TEST_BUG, MockBugzillaApi())
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
441 <Bug 558680 - u'Here is a summary'>
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
442 """
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
443
10
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
444 __bzprops__ = {
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
445 'id': int,
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
446 'summary': unicode
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
447 }
b85bd0fc50e4 Added BugzillaObject superclass to make translating properties from JSON easier
Atul Varma <avarma@mozilla.com>
parents: 9
diff changeset
448
13
d5f43c3aeb29 made passing bzapi into constructors of User, Bug, Attachment objects mandatory
Atul Varma <avarma@mozilla.com>
parents: 12
diff changeset
449 def __init__(self, jsonobj, bzapi):
12
d8db9b733a12 added superclass constructor for BugzillaObject
Atul Varma <avarma@mozilla.com>
parents: 11
diff changeset
450 BugzillaObject.__init__(self, jsonobj, bzapi)
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
451 self.attachments = [bzapi.attachments.get(attach['id'], attach)
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
452 for attach in jsonobj['attachments']]
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
453
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
454 def __repr__(self):
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
455 return '<Bug %d - %s>' % (self.id, repr(self.summary))
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
456
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
457 @classmethod
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
458 def fetch(klass, bzapi, bug_id):
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
459 """
15
798f8f33c418 added bzapi.users, bzapi.attachments, and bzapi.bugs as primary accessors of bugzilla information.
Atul Varma <avarma@mozilla.com>
parents: 14
diff changeset
460 >>> bzapi = MockBugzillaApi()
9
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
461 >>> bzapi.request.mock_returns = TEST_BUG
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
462 >>> Bug.fetch(bzapi, 558680)
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
463 Called bzapi.request('GET', '/bug/558680')
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
464 <Bug 558680 - u'Here is a summary'>
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
465 """
295c54288dd1 Added Bug and Attachment classes.
Atul Varma <avarma@mozilla.com>
parents: 6
diff changeset
466
11
29efa19d959a Added bzgetpatch.py and bugzilla.User class
Atul Varma <avarma@mozilla.com>
parents: 10
diff changeset
467 return klass(bzapi.request('GET', '/bug/%d' % bug_id), bzapi)