Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/boto/mws/connection.py @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
| author | guerler |
|---|---|
| date | Fri, 31 Jul 2020 00:18:57 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d30785e31577 |
|---|---|
| 1 # Copyright (c) 2012-2014 Andy Davidoff http://www.disruptek.com/ | |
| 2 # | |
| 3 # Permission is hereby granted, free of charge, to any person obtaining a | |
| 4 # copy of this software and associated documentation files (the | |
| 5 # "Software"), to deal in the Software without restriction, including | |
| 6 # without limitation the rights to use, copy, modify, merge, publish, dis- | |
| 7 # tribute, sublicense, and/or sell copies of the Software, and to permit | |
| 8 # persons to whom the Software is furnished to do so, subject to the fol- | |
| 9 # lowing conditions: | |
| 10 # | |
| 11 # The above copyright notice and this permission notice shall be included | |
| 12 # in all copies or substantial portions of the Software. | |
| 13 # | |
| 14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
| 15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | |
| 16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | |
| 17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
| 18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
| 20 # IN THE SOFTWARE. | |
| 21 import xml.sax | |
| 22 import hashlib | |
| 23 import string | |
| 24 import collections | |
| 25 from boto.connection import AWSQueryConnection | |
| 26 from boto.exception import BotoServerError | |
| 27 import boto.mws.exception | |
| 28 import boto.mws.response | |
| 29 from boto.handler import XmlHandler | |
| 30 from boto.compat import filter, map, six, encodebytes | |
| 31 | |
| 32 __all__ = ['MWSConnection'] | |
| 33 | |
| 34 api_version_path = { | |
| 35 'Feeds': ('2009-01-01', 'Merchant', '/'), | |
| 36 'Reports': ('2009-01-01', 'Merchant', '/'), | |
| 37 'Orders': ('2013-09-01', 'SellerId', '/Orders/2013-09-01'), | |
| 38 'Products': ('2011-10-01', 'SellerId', '/Products/2011-10-01'), | |
| 39 'Sellers': ('2011-07-01', 'SellerId', '/Sellers/2011-07-01'), | |
| 40 'Inbound': ('2010-10-01', 'SellerId', | |
| 41 '/FulfillmentInboundShipment/2010-10-01'), | |
| 42 'Outbound': ('2010-10-01', 'SellerId', | |
| 43 '/FulfillmentOutboundShipment/2010-10-01'), | |
| 44 'Inventory': ('2010-10-01', 'SellerId', | |
| 45 '/FulfillmentInventory/2010-10-01'), | |
| 46 'Recommendations': ('2013-04-01', 'SellerId', | |
| 47 '/Recommendations/2013-04-01'), | |
| 48 'CustomerInfo': ('2014-03-01', 'SellerId', | |
| 49 '/CustomerInformation/2014-03-01'), | |
| 50 'CartInfo': ('2014-03-01', 'SellerId', | |
| 51 '/CartInformation/2014-03-01'), | |
| 52 'Subscriptions': ('2013-07-01', 'SellerId', | |
| 53 '/Subscriptions/2013-07-01'), | |
| 54 'OffAmazonPayments': ('2013-01-01', 'SellerId', | |
| 55 '/OffAmazonPayments/2013-01-01'), | |
| 56 } | |
| 57 content_md5 = lambda c: encodebytes(hashlib.md5(c).digest()).strip() | |
| 58 decorated_attrs = ('action', 'response', 'section', | |
| 59 'quota', 'restore', 'version') | |
| 60 api_call_map = {} | |
| 61 | |
| 62 | |
| 63 def add_attrs_from(func, to): | |
| 64 for attr in decorated_attrs: | |
| 65 setattr(to, attr, getattr(func, attr, None)) | |
| 66 to.__wrapped__ = func | |
| 67 return to | |
| 68 | |
| 69 | |
| 70 def structured_lists(*fields): | |
| 71 | |
| 72 def decorator(func): | |
| 73 | |
| 74 def wrapper(self, *args, **kw): | |
| 75 for key, acc in [f.split('.') for f in fields]: | |
| 76 if key in kw: | |
| 77 newkey = key + '.' + acc + (acc and '.' or '') | |
| 78 for i in range(len(kw[key])): | |
| 79 kw[newkey + str(i + 1)] = kw[key][i] | |
| 80 kw.pop(key) | |
| 81 return func(self, *args, **kw) | |
| 82 wrapper.__doc__ = "{0}\nLists: {1}".format(func.__doc__, | |
| 83 ', '.join(fields)) | |
| 84 return add_attrs_from(func, to=wrapper) | |
| 85 return decorator | |
| 86 | |
| 87 | |
| 88 def http_body(field): | |
| 89 | |
| 90 def decorator(func): | |
| 91 | |
| 92 def wrapper(*args, **kw): | |
| 93 if any([f not in kw for f in (field, 'content_type')]): | |
| 94 message = "{0} requires {1} and content_type arguments for " \ | |
| 95 "building HTTP body".format(func.action, field) | |
| 96 raise KeyError(message) | |
| 97 kw['body'] = kw.pop(field) | |
| 98 kw['headers'] = { | |
| 99 'Content-Type': kw.pop('content_type'), | |
| 100 'Content-MD5': content_md5(kw['body']), | |
| 101 } | |
| 102 return func(*args, **kw) | |
| 103 wrapper.__doc__ = "{0}\nRequired HTTP Body: " \ | |
| 104 "{1}".format(func.__doc__, field) | |
| 105 return add_attrs_from(func, to=wrapper) | |
| 106 return decorator | |
| 107 | |
| 108 | |
| 109 def destructure_object(value, into, prefix, members=False): | |
| 110 if isinstance(value, boto.mws.response.ResponseElement): | |
| 111 destructure_object(value.__dict__, into, prefix, members=members) | |
| 112 elif isinstance(value, collections.Mapping): | |
| 113 for name in value: | |
| 114 if name.startswith('_'): | |
| 115 continue | |
| 116 destructure_object(value[name], into, prefix + '.' + name, | |
| 117 members=members) | |
| 118 elif isinstance(value, six.string_types): | |
| 119 into[prefix] = value | |
| 120 elif isinstance(value, collections.Iterable): | |
| 121 for index, element in enumerate(value): | |
| 122 suffix = (members and '.member.' or '.') + str(index + 1) | |
| 123 destructure_object(element, into, prefix + suffix, | |
| 124 members=members) | |
| 125 elif isinstance(value, bool): | |
| 126 into[prefix] = str(value).lower() | |
| 127 else: | |
| 128 into[prefix] = value | |
| 129 | |
| 130 | |
| 131 def structured_objects(*fields, **kwargs): | |
| 132 | |
| 133 def decorator(func): | |
| 134 | |
| 135 def wrapper(*args, **kw): | |
| 136 members = kwargs.get('members', False) | |
| 137 for field in filter(lambda i: i in kw, fields): | |
| 138 destructure_object(kw.pop(field), kw, field, members=members) | |
| 139 return func(*args, **kw) | |
| 140 wrapper.__doc__ = "{0}\nElement|Iter|Map: {1}\n" \ | |
| 141 "(ResponseElement or anything iterable/dict-like)" \ | |
| 142 .format(func.__doc__, ', '.join(fields)) | |
| 143 return add_attrs_from(func, to=wrapper) | |
| 144 return decorator | |
| 145 | |
| 146 | |
| 147 def requires(*groups): | |
| 148 | |
| 149 def decorator(func): | |
| 150 | |
| 151 def requires(*args, **kw): | |
| 152 hasgroup = lambda group: all(key in kw for key in group) | |
| 153 if 1 != len(list(filter(hasgroup, groups))): | |
| 154 message = ' OR '.join(['+'.join(g) for g in groups]) | |
| 155 message = "{0} requires {1} argument(s)" \ | |
| 156 "".format(func.action, message) | |
| 157 raise KeyError(message) | |
| 158 return func(*args, **kw) | |
| 159 message = ' OR '.join(['+'.join(g) for g in groups]) | |
| 160 requires.__doc__ = "{0}\nRequired: {1}".format(func.__doc__, | |
| 161 message) | |
| 162 return add_attrs_from(func, to=requires) | |
| 163 return decorator | |
| 164 | |
| 165 | |
| 166 def exclusive(*groups): | |
| 167 | |
| 168 def decorator(func): | |
| 169 | |
| 170 def wrapper(*args, **kw): | |
| 171 hasgroup = lambda group: all(key in kw for key in group) | |
| 172 if len(list(filter(hasgroup, groups))) not in (0, 1): | |
| 173 message = ' OR '.join(['+'.join(g) for g in groups]) | |
| 174 message = "{0} requires either {1}" \ | |
| 175 "".format(func.action, message) | |
| 176 raise KeyError(message) | |
| 177 return func(*args, **kw) | |
| 178 message = ' OR '.join(['+'.join(g) for g in groups]) | |
| 179 wrapper.__doc__ = "{0}\nEither: {1}".format(func.__doc__, | |
| 180 message) | |
| 181 return add_attrs_from(func, to=wrapper) | |
| 182 return decorator | |
| 183 | |
| 184 | |
| 185 def dependent(field, *groups): | |
| 186 | |
| 187 def decorator(func): | |
| 188 | |
| 189 def wrapper(*args, **kw): | |
| 190 hasgroup = lambda group: all(key in kw for key in group) | |
| 191 if field in kw and not any(hasgroup(g) for g in groups): | |
| 192 message = ' OR '.join(['+'.join(g) for g in groups]) | |
| 193 message = "{0} argument {1} requires {2}" \ | |
| 194 "".format(func.action, field, message) | |
| 195 raise KeyError(message) | |
| 196 return func(*args, **kw) | |
| 197 message = ' OR '.join(['+'.join(g) for g in groups]) | |
| 198 wrapper.__doc__ = "{0}\n{1} requires: {2}".format(func.__doc__, | |
| 199 field, | |
| 200 message) | |
| 201 return add_attrs_from(func, to=wrapper) | |
| 202 return decorator | |
| 203 | |
| 204 | |
| 205 def requires_some_of(*fields): | |
| 206 | |
| 207 def decorator(func): | |
| 208 | |
| 209 def requires(*args, **kw): | |
| 210 if not any(i in kw for i in fields): | |
| 211 message = "{0} requires at least one of {1} argument(s)" \ | |
| 212 "".format(func.action, ', '.join(fields)) | |
| 213 raise KeyError(message) | |
| 214 return func(*args, **kw) | |
| 215 requires.__doc__ = "{0}\nSome Required: {1}".format(func.__doc__, | |
| 216 ', '.join(fields)) | |
| 217 return add_attrs_from(func, to=requires) | |
| 218 return decorator | |
| 219 | |
| 220 | |
| 221 def boolean_arguments(*fields): | |
| 222 | |
| 223 def decorator(func): | |
| 224 | |
| 225 def wrapper(*args, **kw): | |
| 226 for field in [f for f in fields if isinstance(kw.get(f), bool)]: | |
| 227 kw[field] = str(kw[field]).lower() | |
| 228 return func(*args, **kw) | |
| 229 wrapper.__doc__ = "{0}\nBooleans: {1}".format(func.__doc__, | |
| 230 ', '.join(fields)) | |
| 231 return add_attrs_from(func, to=wrapper) | |
| 232 return decorator | |
| 233 | |
| 234 | |
| 235 def api_action(section, quota, restore, *api): | |
| 236 | |
| 237 def decorator(func, quota=int(quota), restore=float(restore)): | |
| 238 version, accesskey, path = api_version_path[section] | |
| 239 action = ''.join(api or map(str.capitalize, func.__name__.split('_'))) | |
| 240 | |
| 241 def wrapper(self, *args, **kw): | |
| 242 kw.setdefault(accesskey, getattr(self, accesskey, None)) | |
| 243 if kw[accesskey] is None: | |
| 244 message = "{0} requires {1} argument. Set the " \ | |
| 245 "MWSConnection.{2} attribute?" \ | |
| 246 "".format(action, accesskey, accesskey) | |
| 247 raise KeyError(message) | |
| 248 kw['Action'] = action | |
| 249 kw['Version'] = version | |
| 250 response = self._response_factory(action, connection=self) | |
| 251 request = dict(path=path, quota=quota, restore=restore) | |
| 252 return func(self, request, response, *args, **kw) | |
| 253 for attr in decorated_attrs: | |
| 254 setattr(wrapper, attr, locals().get(attr)) | |
| 255 wrapper.__doc__ = "MWS {0}/{1} API call; quota={2} restore={3:.2f}\n" \ | |
| 256 "{4}".format(action, version, quota, restore, | |
| 257 func.__doc__) | |
| 258 api_call_map[action] = func.__name__ | |
| 259 return wrapper | |
| 260 return decorator | |
| 261 | |
| 262 | |
| 263 class MWSConnection(AWSQueryConnection): | |
| 264 | |
| 265 ResponseFactory = boto.mws.response.ResponseFactory | |
| 266 ResponseErrorFactory = boto.mws.exception.ResponseErrorFactory | |
| 267 | |
| 268 def __init__(self, *args, **kw): | |
| 269 kw.setdefault('host', 'mws.amazonservices.com') | |
| 270 self._sandboxed = kw.pop('sandbox', False) | |
| 271 self.Merchant = kw.pop('Merchant', None) or kw.get('SellerId') | |
| 272 self.SellerId = kw.pop('SellerId', None) or self.Merchant | |
| 273 kw = self._setup_factories(kw.pop('factory_scopes', []), **kw) | |
| 274 super(MWSConnection, self).__init__(*args, **kw) | |
| 275 | |
| 276 def _setup_factories(self, extrascopes, **kw): | |
| 277 for factory, (scope, Default) in { | |
| 278 'response_factory': | |
| 279 (boto.mws.response, self.ResponseFactory), | |
| 280 'response_error_factory': | |
| 281 (boto.mws.exception, self.ResponseErrorFactory), | |
| 282 }.items(): | |
| 283 if factory in kw: | |
| 284 setattr(self, '_' + factory, kw.pop(factory)) | |
| 285 else: | |
| 286 scopes = extrascopes + [scope] | |
| 287 setattr(self, '_' + factory, Default(scopes=scopes)) | |
| 288 return kw | |
| 289 | |
| 290 def _sandboxify(self, path): | |
| 291 if not self._sandboxed: | |
| 292 return path | |
| 293 splat = path.split('/') | |
| 294 splat[-2] += '_Sandbox' | |
| 295 return '/'.join(splat) | |
| 296 | |
| 297 def _required_auth_capability(self): | |
| 298 return ['mws'] | |
| 299 | |
| 300 def _post_request(self, request, params, parser, body='', headers=None): | |
| 301 """Make a POST request, optionally with a content body, | |
| 302 and return the response, optionally as raw text. | |
| 303 """ | |
| 304 headers = headers or {} | |
| 305 path = self._sandboxify(request['path']) | |
| 306 request = self.build_base_http_request('POST', path, None, data=body, | |
| 307 params=params, headers=headers, | |
| 308 host=self.host) | |
| 309 try: | |
| 310 response = self._mexe(request, override_num_retries=None) | |
| 311 except BotoServerError as bs: | |
| 312 raise self._response_error_factory(bs.status, bs.reason, bs.body) | |
| 313 body = response.read() | |
| 314 boto.log.debug(body) | |
| 315 if not body: | |
| 316 boto.log.error('Null body %s' % body) | |
| 317 raise self._response_error_factory(response.status, | |
| 318 response.reason, body) | |
| 319 if response.status != 200: | |
| 320 boto.log.error('%s %s' % (response.status, response.reason)) | |
| 321 boto.log.error('%s' % body) | |
| 322 raise self._response_error_factory(response.status, | |
| 323 response.reason, body) | |
| 324 digest = response.getheader('Content-MD5') | |
| 325 if digest is not None: | |
| 326 assert content_md5(body) == digest | |
| 327 contenttype = response.getheader('Content-Type') | |
| 328 return self._parse_response(parser, contenttype, body) | |
| 329 | |
| 330 def _parse_response(self, parser, contenttype, body): | |
| 331 if not contenttype.startswith('text/xml'): | |
| 332 return body | |
| 333 handler = XmlHandler(parser, self) | |
| 334 xml.sax.parseString(body, handler) | |
| 335 return parser | |
| 336 | |
| 337 def method_for(self, name): | |
| 338 """Return the MWS API method referred to in the argument. | |
| 339 The named method can be in CamelCase or underlined_lower_case. | |
| 340 This is the complement to MWSConnection.any_call.action | |
| 341 """ | |
| 342 action = '_' in name and string.capwords(name, '_') or name | |
| 343 if action in api_call_map: | |
| 344 return getattr(self, api_call_map[action]) | |
| 345 return None | |
| 346 | |
| 347 def iter_call(self, call, *args, **kw): | |
| 348 """Pass a call name as the first argument and a generator | |
| 349 is returned for the initial response and any continuation | |
| 350 call responses made using the NextToken. | |
| 351 """ | |
| 352 method = self.method_for(call) | |
| 353 assert method, 'No call named "{0}"'.format(call) | |
| 354 return self.iter_response(method(*args, **kw)) | |
| 355 | |
| 356 def iter_response(self, response): | |
| 357 """Pass a call's response as the initial argument and a | |
| 358 generator is returned for the initial response and any | |
| 359 continuation call responses made using the NextToken. | |
| 360 """ | |
| 361 yield response | |
| 362 more = self.method_for(response._action + 'ByNextToken') | |
| 363 while more and response._result.HasNext == 'true': | |
| 364 response = more(NextToken=response._result.NextToken) | |
| 365 yield response | |
| 366 | |
| 367 @requires(['FeedType']) | |
| 368 @boolean_arguments('PurgeAndReplace') | |
| 369 @http_body('FeedContent') | |
| 370 @structured_lists('MarketplaceIdList.Id') | |
| 371 @api_action('Feeds', 15, 120) | |
| 372 def submit_feed(self, request, response, headers=None, body='', **kw): | |
| 373 """Uploads a feed for processing by Amazon MWS. | |
| 374 """ | |
| 375 headers = headers or {} | |
| 376 return self._post_request(request, kw, response, body=body, | |
| 377 headers=headers) | |
| 378 | |
| 379 @structured_lists('FeedSubmissionIdList.Id', 'FeedTypeList.Type', | |
| 380 'FeedProcessingStatusList.Status') | |
| 381 @api_action('Feeds', 10, 45) | |
| 382 def get_feed_submission_list(self, request, response, **kw): | |
| 383 """Returns a list of all feed submissions submitted in the | |
| 384 previous 90 days. | |
| 385 """ | |
| 386 return self._post_request(request, kw, response) | |
| 387 | |
| 388 @requires(['NextToken']) | |
| 389 @api_action('Feeds', 0, 0) | |
| 390 def get_feed_submission_list_by_next_token(self, request, response, **kw): | |
| 391 """Returns a list of feed submissions using the NextToken parameter. | |
| 392 """ | |
| 393 return self._post_request(request, kw, response) | |
| 394 | |
| 395 @structured_lists('FeedTypeList.Type', 'FeedProcessingStatusList.Status') | |
| 396 @api_action('Feeds', 10, 45) | |
| 397 def get_feed_submission_count(self, request, response, **kw): | |
| 398 """Returns a count of the feeds submitted in the previous 90 days. | |
| 399 """ | |
| 400 return self._post_request(request, kw, response) | |
| 401 | |
| 402 @structured_lists('FeedSubmissionIdList.Id', 'FeedTypeList.Type') | |
| 403 @api_action('Feeds', 10, 45) | |
| 404 def cancel_feed_submissions(self, request, response, **kw): | |
| 405 """Cancels one or more feed submissions and returns a | |
| 406 count of the feed submissions that were canceled. | |
| 407 """ | |
| 408 return self._post_request(request, kw, response) | |
| 409 | |
| 410 @requires(['FeedSubmissionId']) | |
| 411 @api_action('Feeds', 15, 60) | |
| 412 def get_feed_submission_result(self, request, response, **kw): | |
| 413 """Returns the feed processing report. | |
| 414 """ | |
| 415 return self._post_request(request, kw, response) | |
| 416 | |
| 417 def get_service_status(self, **kw): | |
| 418 """Instruct the user on how to get service status. | |
| 419 """ | |
| 420 sections = ', '.join(map(str.lower, api_version_path.keys())) | |
| 421 message = "Use {0}.get_(section)_service_status(), " \ | |
| 422 "where (section) is one of the following: " \ | |
| 423 "{1}".format(self.__class__.__name__, sections) | |
| 424 raise AttributeError(message) | |
| 425 | |
| 426 @requires(['ReportType']) | |
| 427 @structured_lists('MarketplaceIdList.Id') | |
| 428 @boolean_arguments('ReportOptions=ShowSalesChannel') | |
| 429 @api_action('Reports', 15, 60) | |
| 430 def request_report(self, request, response, **kw): | |
| 431 """Creates a report request and submits the request to Amazon MWS. | |
| 432 """ | |
| 433 return self._post_request(request, kw, response) | |
| 434 | |
| 435 @structured_lists('ReportRequestIdList.Id', 'ReportTypeList.Type', | |
| 436 'ReportProcessingStatusList.Status') | |
| 437 @api_action('Reports', 10, 45) | |
| 438 def get_report_request_list(self, request, response, **kw): | |
| 439 """Returns a list of report requests that you can use to get the | |
| 440 ReportRequestId for a report. | |
| 441 """ | |
| 442 return self._post_request(request, kw, response) | |
| 443 | |
| 444 @requires(['NextToken']) | |
| 445 @api_action('Reports', 0, 0) | |
| 446 def get_report_request_list_by_next_token(self, request, response, **kw): | |
| 447 """Returns a list of report requests using the NextToken, | |
| 448 which was supplied by a previous request to either | |
| 449 GetReportRequestListByNextToken or GetReportRequestList, where | |
| 450 the value of HasNext was true in that previous request. | |
| 451 """ | |
| 452 return self._post_request(request, kw, response) | |
| 453 | |
| 454 @structured_lists('ReportTypeList.Type', | |
| 455 'ReportProcessingStatusList.Status') | |
| 456 @api_action('Reports', 10, 45) | |
| 457 def get_report_request_count(self, request, response, **kw): | |
| 458 """Returns a count of report requests that have been submitted | |
| 459 to Amazon MWS for processing. | |
| 460 """ | |
| 461 return self._post_request(request, kw, response) | |
| 462 | |
| 463 @api_action('Reports', 10, 45) | |
| 464 def cancel_report_requests(self, request, response, **kw): | |
| 465 """Cancel one or more report requests, returning the count of the | |
| 466 canceled report requests and the report request information. | |
| 467 """ | |
| 468 return self._post_request(request, kw, response) | |
| 469 | |
| 470 @boolean_arguments('Acknowledged') | |
| 471 @structured_lists('ReportRequestIdList.Id', 'ReportTypeList.Type') | |
| 472 @api_action('Reports', 10, 60) | |
| 473 def get_report_list(self, request, response, **kw): | |
| 474 """Returns a list of reports that were created in the previous | |
| 475 90 days that match the query parameters. | |
| 476 """ | |
| 477 return self._post_request(request, kw, response) | |
| 478 | |
| 479 @requires(['NextToken']) | |
| 480 @api_action('Reports', 0, 0) | |
| 481 def get_report_list_by_next_token(self, request, response, **kw): | |
| 482 """Returns a list of reports using the NextToken, which | |
| 483 was supplied by a previous request to either | |
| 484 GetReportListByNextToken or GetReportList, where the | |
| 485 value of HasNext was true in the previous call. | |
| 486 """ | |
| 487 return self._post_request(request, kw, response) | |
| 488 | |
| 489 @boolean_arguments('Acknowledged') | |
| 490 @structured_lists('ReportTypeList.Type') | |
| 491 @api_action('Reports', 10, 45) | |
| 492 def get_report_count(self, request, response, **kw): | |
| 493 """Returns a count of the reports, created in the previous 90 days, | |
| 494 with a status of _DONE_ and that are available for download. | |
| 495 """ | |
| 496 return self._post_request(request, kw, response) | |
| 497 | |
| 498 @requires(['ReportId']) | |
| 499 @api_action('Reports', 15, 60) | |
| 500 def get_report(self, request, response, **kw): | |
| 501 """Returns the contents of a report. | |
| 502 """ | |
| 503 return self._post_request(request, kw, response) | |
| 504 | |
| 505 @requires(['ReportType', 'Schedule']) | |
| 506 @api_action('Reports', 10, 45) | |
| 507 def manage_report_schedule(self, request, response, **kw): | |
| 508 """Creates, updates, or deletes a report request schedule for | |
| 509 a specified report type. | |
| 510 """ | |
| 511 return self._post_request(request, kw, response) | |
| 512 | |
| 513 @structured_lists('ReportTypeList.Type') | |
| 514 @api_action('Reports', 10, 45) | |
| 515 def get_report_schedule_list(self, request, response, **kw): | |
| 516 """Returns a list of order report requests that are scheduled | |
| 517 to be submitted to Amazon MWS for processing. | |
| 518 """ | |
| 519 return self._post_request(request, kw, response) | |
| 520 | |
| 521 @requires(['NextToken']) | |
| 522 @api_action('Reports', 0, 0) | |
| 523 def get_report_schedule_list_by_next_token(self, request, response, **kw): | |
| 524 """Returns a list of report requests using the NextToken, | |
| 525 which was supplied by a previous request to either | |
| 526 GetReportScheduleListByNextToken or GetReportScheduleList, | |
| 527 where the value of HasNext was true in that previous request. | |
| 528 """ | |
| 529 return self._post_request(request, kw, response) | |
| 530 | |
| 531 @structured_lists('ReportTypeList.Type') | |
| 532 @api_action('Reports', 10, 45) | |
| 533 def get_report_schedule_count(self, request, response, **kw): | |
| 534 """Returns a count of order report requests that are scheduled | |
| 535 to be submitted to Amazon MWS. | |
| 536 """ | |
| 537 return self._post_request(request, kw, response) | |
| 538 | |
| 539 @requires(['ReportIdList']) | |
| 540 @boolean_arguments('Acknowledged') | |
| 541 @structured_lists('ReportIdList.Id') | |
| 542 @api_action('Reports', 10, 45) | |
| 543 def update_report_acknowledgements(self, request, response, **kw): | |
| 544 """Updates the acknowledged status of one or more reports. | |
| 545 """ | |
| 546 return self._post_request(request, kw, response) | |
| 547 | |
| 548 @requires(['ShipFromAddress', 'InboundShipmentPlanRequestItems']) | |
| 549 @structured_objects('ShipFromAddress', 'InboundShipmentPlanRequestItems') | |
| 550 @api_action('Inbound', 30, 0.5) | |
| 551 def create_inbound_shipment_plan(self, request, response, **kw): | |
| 552 """Returns the information required to create an inbound shipment. | |
| 553 """ | |
| 554 return self._post_request(request, kw, response) | |
| 555 | |
| 556 @requires(['ShipmentId', 'InboundShipmentHeader', 'InboundShipmentItems']) | |
| 557 @structured_objects('InboundShipmentHeader', 'InboundShipmentItems') | |
| 558 @api_action('Inbound', 30, 0.5) | |
| 559 def create_inbound_shipment(self, request, response, **kw): | |
| 560 """Creates an inbound shipment. | |
| 561 """ | |
| 562 return self._post_request(request, kw, response) | |
| 563 | |
| 564 @requires(['ShipmentId']) | |
| 565 @structured_objects('InboundShipmentHeader', 'InboundShipmentItems') | |
| 566 @api_action('Inbound', 30, 0.5) | |
| 567 def update_inbound_shipment(self, request, response, **kw): | |
| 568 """Updates an existing inbound shipment. Amazon documentation | |
| 569 is ambiguous as to whether the InboundShipmentHeader and | |
| 570 InboundShipmentItems arguments are required. | |
| 571 """ | |
| 572 return self._post_request(request, kw, response) | |
| 573 | |
| 574 @requires_some_of('ShipmentIdList', 'ShipmentStatusList') | |
| 575 @structured_lists('ShipmentIdList.Id', 'ShipmentStatusList.Status') | |
| 576 @api_action('Inbound', 30, 0.5) | |
| 577 def list_inbound_shipments(self, request, response, **kw): | |
| 578 """Returns a list of inbound shipments based on criteria that | |
| 579 you specify. | |
| 580 """ | |
| 581 return self._post_request(request, kw, response) | |
| 582 | |
| 583 @requires(['NextToken']) | |
| 584 @api_action('Inbound', 30, 0.5) | |
| 585 def list_inbound_shipments_by_next_token(self, request, response, **kw): | |
| 586 """Returns the next page of inbound shipments using the NextToken | |
| 587 parameter. | |
| 588 """ | |
| 589 return self._post_request(request, kw, response) | |
| 590 | |
| 591 @requires(['ShipmentId'], ['LastUpdatedAfter', 'LastUpdatedBefore']) | |
| 592 @api_action('Inbound', 30, 0.5) | |
| 593 def list_inbound_shipment_items(self, request, response, **kw): | |
| 594 """Returns a list of items in a specified inbound shipment, or a | |
| 595 list of items that were updated within a specified time frame. | |
| 596 """ | |
| 597 return self._post_request(request, kw, response) | |
| 598 | |
| 599 @requires(['NextToken']) | |
| 600 @api_action('Inbound', 30, 0.5) | |
| 601 def list_inbound_shipment_items_by_next_token(self, request, response, **kw): | |
| 602 """Returns the next page of inbound shipment items using the | |
| 603 NextToken parameter. | |
| 604 """ | |
| 605 return self._post_request(request, kw, response) | |
| 606 | |
| 607 @api_action('Inbound', 2, 300, 'GetServiceStatus') | |
| 608 def get_inbound_service_status(self, request, response, **kw): | |
| 609 """Returns the operational status of the Fulfillment Inbound | |
| 610 Shipment API section. | |
| 611 """ | |
| 612 return self._post_request(request, kw, response) | |
| 613 | |
| 614 @requires(['SellerSkus'], ['QueryStartDateTime']) | |
| 615 @structured_lists('SellerSkus.member') | |
| 616 @api_action('Inventory', 30, 0.5) | |
| 617 def list_inventory_supply(self, request, response, **kw): | |
| 618 """Returns information about the availability of a seller's | |
| 619 inventory. | |
| 620 """ | |
| 621 return self._post_request(request, kw, response) | |
| 622 | |
| 623 @requires(['NextToken']) | |
| 624 @api_action('Inventory', 30, 0.5) | |
| 625 def list_inventory_supply_by_next_token(self, request, response, **kw): | |
| 626 """Returns the next page of information about the availability | |
| 627 of a seller's inventory using the NextToken parameter. | |
| 628 """ | |
| 629 return self._post_request(request, kw, response) | |
| 630 | |
| 631 @api_action('Inventory', 2, 300, 'GetServiceStatus') | |
| 632 def get_inventory_service_status(self, request, response, **kw): | |
| 633 """Returns the operational status of the Fulfillment Inventory | |
| 634 API section. | |
| 635 """ | |
| 636 return self._post_request(request, kw, response) | |
| 637 | |
| 638 @requires(['PackageNumber']) | |
| 639 @api_action('Outbound', 30, 0.5) | |
| 640 def get_package_tracking_details(self, request, response, **kw): | |
| 641 """Returns delivery tracking information for a package in | |
| 642 an outbound shipment for a Multi-Channel Fulfillment order. | |
| 643 """ | |
| 644 return self._post_request(request, kw, response) | |
| 645 | |
| 646 @requires(['Address', 'Items']) | |
| 647 @structured_objects('Address', 'Items') | |
| 648 @api_action('Outbound', 30, 0.5) | |
| 649 def get_fulfillment_preview(self, request, response, **kw): | |
| 650 """Returns a list of fulfillment order previews based on items | |
| 651 and shipping speed categories that you specify. | |
| 652 """ | |
| 653 return self._post_request(request, kw, response) | |
| 654 | |
| 655 @requires(['SellerFulfillmentOrderId', 'DisplayableOrderId', | |
| 656 'ShippingSpeedCategory', 'DisplayableOrderDateTime', | |
| 657 'DestinationAddress', 'DisplayableOrderComment', | |
| 658 'Items']) | |
| 659 @structured_objects('DestinationAddress', 'Items') | |
| 660 @api_action('Outbound', 30, 0.5) | |
| 661 def create_fulfillment_order(self, request, response, **kw): | |
| 662 """Requests that Amazon ship items from the seller's inventory | |
| 663 to a destination address. | |
| 664 """ | |
| 665 return self._post_request(request, kw, response) | |
| 666 | |
| 667 @requires(['SellerFulfillmentOrderId']) | |
| 668 @api_action('Outbound', 30, 0.5) | |
| 669 def get_fulfillment_order(self, request, response, **kw): | |
| 670 """Returns a fulfillment order based on a specified | |
| 671 SellerFulfillmentOrderId. | |
| 672 """ | |
| 673 return self._post_request(request, kw, response) | |
| 674 | |
| 675 @api_action('Outbound', 30, 0.5) | |
| 676 def list_all_fulfillment_orders(self, request, response, **kw): | |
| 677 """Returns a list of fulfillment orders fulfilled after (or | |
| 678 at) a specified date or by fulfillment method. | |
| 679 """ | |
| 680 return self._post_request(request, kw, response) | |
| 681 | |
| 682 @requires(['NextToken']) | |
| 683 @api_action('Outbound', 30, 0.5) | |
| 684 def list_all_fulfillment_orders_by_next_token(self, request, response, **kw): | |
| 685 """Returns the next page of inbound shipment items using the | |
| 686 NextToken parameter. | |
| 687 """ | |
| 688 return self._post_request(request, kw, response) | |
| 689 | |
| 690 @requires(['SellerFulfillmentOrderId']) | |
| 691 @api_action('Outbound', 30, 0.5) | |
| 692 def cancel_fulfillment_order(self, request, response, **kw): | |
| 693 """Requests that Amazon stop attempting to fulfill an existing | |
| 694 fulfillment order. | |
| 695 """ | |
| 696 return self._post_request(request, kw, response) | |
| 697 | |
| 698 @api_action('Outbound', 2, 300, 'GetServiceStatus') | |
| 699 def get_outbound_service_status(self, request, response, **kw): | |
| 700 """Returns the operational status of the Fulfillment Outbound | |
| 701 API section. | |
| 702 """ | |
| 703 return self._post_request(request, kw, response) | |
| 704 | |
| 705 @requires(['CreatedAfter'], ['LastUpdatedAfter']) | |
| 706 @requires(['MarketplaceId']) | |
| 707 @exclusive(['CreatedAfter'], ['LastUpdatedAfter']) | |
| 708 @dependent('CreatedBefore', ['CreatedAfter']) | |
| 709 @exclusive(['LastUpdatedAfter'], ['BuyerEmail'], ['SellerOrderId']) | |
| 710 @dependent('LastUpdatedBefore', ['LastUpdatedAfter']) | |
| 711 @exclusive(['CreatedAfter'], ['LastUpdatedBefore']) | |
| 712 @structured_objects('OrderTotal', 'ShippingAddress', | |
| 713 'PaymentExecutionDetail') | |
| 714 @structured_lists('MarketplaceId.Id', 'OrderStatus.Status', | |
| 715 'FulfillmentChannel.Channel', 'PaymentMethod.') | |
| 716 @api_action('Orders', 6, 60) | |
| 717 def list_orders(self, request, response, **kw): | |
| 718 """Returns a list of orders created or updated during a time | |
| 719 frame that you specify. | |
| 720 """ | |
| 721 toggle = set(('FulfillmentChannel.Channel.1', | |
| 722 'OrderStatus.Status.1', 'PaymentMethod.1', | |
| 723 'LastUpdatedAfter', 'LastUpdatedBefore')) | |
| 724 for do, dont in { | |
| 725 'BuyerEmail': toggle.union(['SellerOrderId']), | |
| 726 'SellerOrderId': toggle.union(['BuyerEmail']), | |
| 727 }.items(): | |
| 728 if do in kw and any(i in dont for i in kw): | |
| 729 message = "Don't include {0} when specifying " \ | |
| 730 "{1}".format(' or '.join(dont), do) | |
| 731 raise AssertionError(message) | |
| 732 return self._post_request(request, kw, response) | |
| 733 | |
| 734 @requires(['NextToken']) | |
| 735 @api_action('Orders', 6, 60) | |
| 736 def list_orders_by_next_token(self, request, response, **kw): | |
| 737 """Returns the next page of orders using the NextToken value | |
| 738 that was returned by your previous request to either | |
| 739 ListOrders or ListOrdersByNextToken. | |
| 740 """ | |
| 741 return self._post_request(request, kw, response) | |
| 742 | |
| 743 @requires(['AmazonOrderId']) | |
| 744 @structured_lists('AmazonOrderId.Id') | |
| 745 @api_action('Orders', 6, 60) | |
| 746 def get_order(self, request, response, **kw): | |
| 747 """Returns an order for each AmazonOrderId that you specify. | |
| 748 """ | |
| 749 return self._post_request(request, kw, response) | |
| 750 | |
| 751 @requires(['AmazonOrderId']) | |
| 752 @api_action('Orders', 30, 2) | |
| 753 def list_order_items(self, request, response, **kw): | |
| 754 """Returns order item information for an AmazonOrderId that | |
| 755 you specify. | |
| 756 """ | |
| 757 return self._post_request(request, kw, response) | |
| 758 | |
| 759 @requires(['NextToken']) | |
| 760 @api_action('Orders', 30, 2) | |
| 761 def list_order_items_by_next_token(self, request, response, **kw): | |
| 762 """Returns the next page of order items using the NextToken | |
| 763 value that was returned by your previous request to either | |
| 764 ListOrderItems or ListOrderItemsByNextToken. | |
| 765 """ | |
| 766 return self._post_request(request, kw, response) | |
| 767 | |
| 768 @api_action('Orders', 2, 300, 'GetServiceStatus') | |
| 769 def get_orders_service_status(self, request, response, **kw): | |
| 770 """Returns the operational status of the Orders API section. | |
| 771 """ | |
| 772 return self._post_request(request, kw, response) | |
| 773 | |
| 774 @requires(['MarketplaceId', 'Query']) | |
| 775 @api_action('Products', 20, 20) | |
| 776 def list_matching_products(self, request, response, **kw): | |
| 777 """Returns a list of products and their attributes, ordered | |
| 778 by relevancy, based on a search query that you specify. | |
| 779 """ | |
| 780 return self._post_request(request, kw, response) | |
| 781 | |
| 782 @requires(['MarketplaceId', 'ASINList']) | |
| 783 @structured_lists('ASINList.ASIN') | |
| 784 @api_action('Products', 20, 20) | |
| 785 def get_matching_product(self, request, response, **kw): | |
| 786 """Returns a list of products and their attributes, based on | |
| 787 a list of ASIN values that you specify. | |
| 788 """ | |
| 789 return self._post_request(request, kw, response) | |
| 790 | |
| 791 @requires(['MarketplaceId', 'IdType', 'IdList']) | |
| 792 @structured_lists('IdList.Id') | |
| 793 @api_action('Products', 20, 20) | |
| 794 def get_matching_product_for_id(self, request, response, **kw): | |
| 795 """Returns a list of products and their attributes, based on | |
| 796 a list of Product IDs that you specify. | |
| 797 """ | |
| 798 return self._post_request(request, kw, response) | |
| 799 | |
| 800 @requires(['MarketplaceId', 'SellerSKUList']) | |
| 801 @structured_lists('SellerSKUList.SellerSKU') | |
| 802 @api_action('Products', 20, 10, 'GetCompetitivePricingForSKU') | |
| 803 def get_competitive_pricing_for_sku(self, request, response, **kw): | |
| 804 """Returns the current competitive pricing of a product, | |
| 805 based on the SellerSKUs and MarketplaceId that you specify. | |
| 806 """ | |
| 807 return self._post_request(request, kw, response) | |
| 808 | |
| 809 @requires(['MarketplaceId', 'ASINList']) | |
| 810 @structured_lists('ASINList.ASIN') | |
| 811 @api_action('Products', 20, 10, 'GetCompetitivePricingForASIN') | |
| 812 def get_competitive_pricing_for_asin(self, request, response, **kw): | |
| 813 """Returns the current competitive pricing of a product, | |
| 814 based on the ASINs and MarketplaceId that you specify. | |
| 815 """ | |
| 816 return self._post_request(request, kw, response) | |
| 817 | |
| 818 @requires(['MarketplaceId', 'SellerSKUList']) | |
| 819 @structured_lists('SellerSKUList.SellerSKU') | |
| 820 @api_action('Products', 20, 5, 'GetLowestOfferListingsForSKU') | |
| 821 def get_lowest_offer_listings_for_sku(self, request, response, **kw): | |
| 822 """Returns the lowest price offer listings for a specific | |
| 823 product by item condition and SellerSKUs. | |
| 824 """ | |
| 825 return self._post_request(request, kw, response) | |
| 826 | |
| 827 @requires(['MarketplaceId', 'ASINList']) | |
| 828 @structured_lists('ASINList.ASIN') | |
| 829 @api_action('Products', 20, 5, 'GetLowestOfferListingsForASIN') | |
| 830 def get_lowest_offer_listings_for_asin(self, request, response, **kw): | |
| 831 """Returns the lowest price offer listings for a specific | |
| 832 product by item condition and ASINs. | |
| 833 """ | |
| 834 return self._post_request(request, kw, response) | |
| 835 | |
| 836 @requires(['MarketplaceId', 'SellerSKU']) | |
| 837 @api_action('Products', 20, 20, 'GetProductCategoriesForSKU') | |
| 838 def get_product_categories_for_sku(self, request, response, **kw): | |
| 839 """Returns the product categories that a SellerSKU belongs to. | |
| 840 """ | |
| 841 return self._post_request(request, kw, response) | |
| 842 | |
| 843 @requires(['MarketplaceId', 'ASIN']) | |
| 844 @api_action('Products', 20, 20, 'GetProductCategoriesForASIN') | |
| 845 def get_product_categories_for_asin(self, request, response, **kw): | |
| 846 """Returns the product categories that an ASIN belongs to. | |
| 847 """ | |
| 848 return self._post_request(request, kw, response) | |
| 849 | |
| 850 @api_action('Products', 2, 300, 'GetServiceStatus') | |
| 851 def get_products_service_status(self, request, response, **kw): | |
| 852 """Returns the operational status of the Products API section. | |
| 853 """ | |
| 854 return self._post_request(request, kw, response) | |
| 855 | |
| 856 @requires(['MarketplaceId', 'SellerSKUList']) | |
| 857 @structured_lists('SellerSKUList.SellerSKU') | |
| 858 @api_action('Products', 20, 10, 'GetMyPriceForSKU') | |
| 859 def get_my_price_for_sku(self, request, response, **kw): | |
| 860 """Returns pricing information for your own offer listings, based on SellerSKU. | |
| 861 """ | |
| 862 return self._post_request(request, kw, response) | |
| 863 | |
| 864 @requires(['MarketplaceId', 'ASINList']) | |
| 865 @structured_lists('ASINList.ASIN') | |
| 866 @api_action('Products', 20, 10, 'GetMyPriceForASIN') | |
| 867 def get_my_price_for_asin(self, request, response, **kw): | |
| 868 """Returns pricing information for your own offer listings, based on ASIN. | |
| 869 """ | |
| 870 return self._post_request(request, kw, response) | |
| 871 | |
| 872 @api_action('Sellers', 15, 60) | |
| 873 def list_marketplace_participations(self, request, response, **kw): | |
| 874 """Returns a list of marketplaces that the seller submitting | |
| 875 the request can sell in, and a list of participations that | |
| 876 include seller-specific information in that marketplace. | |
| 877 """ | |
| 878 return self._post_request(request, kw, response) | |
| 879 | |
| 880 @requires(['NextToken']) | |
| 881 @api_action('Sellers', 15, 60) | |
| 882 def list_marketplace_participations_by_next_token(self, request, response, | |
| 883 **kw): | |
| 884 """Returns the next page of marketplaces and participations | |
| 885 using the NextToken value that was returned by your | |
| 886 previous request to either ListMarketplaceParticipations | |
| 887 or ListMarketplaceParticipationsByNextToken. | |
| 888 """ | |
| 889 return self._post_request(request, kw, response) | |
| 890 | |
| 891 @requires(['MarketplaceId']) | |
| 892 @api_action('Recommendations', 5, 2) | |
| 893 def get_last_updated_time_for_recommendations(self, request, response, | |
| 894 **kw): | |
| 895 """Checks whether there are active recommendations for each category | |
| 896 for the given marketplace, and if there are, returns the time when | |
| 897 recommendations were last updated for each category. | |
| 898 """ | |
| 899 return self._post_request(request, kw, response) | |
| 900 | |
| 901 @requires(['MarketplaceId']) | |
| 902 @structured_lists('CategoryQueryList.CategoryQuery') | |
| 903 @api_action('Recommendations', 5, 2) | |
| 904 def list_recommendations(self, request, response, **kw): | |
| 905 """Returns your active recommendations for a specific category or for | |
| 906 all categories for a specific marketplace. | |
| 907 """ | |
| 908 return self._post_request(request, kw, response) | |
| 909 | |
| 910 @requires(['NextToken']) | |
| 911 @api_action('Recommendations', 5, 2) | |
| 912 def list_recommendations_by_next_token(self, request, response, **kw): | |
| 913 """Returns the next page of recommendations using the NextToken | |
| 914 parameter. | |
| 915 """ | |
| 916 return self._post_request(request, kw, response) | |
| 917 | |
| 918 @api_action('Recommendations', 2, 300, 'GetServiceStatus') | |
| 919 def get_recommendations_service_status(self, request, response, **kw): | |
| 920 """Returns the operational status of the Recommendations API section. | |
| 921 """ | |
| 922 return self._post_request(request, kw, response) | |
| 923 | |
| 924 @api_action('CustomerInfo', 15, 12) | |
| 925 def list_customers(self, request, response, **kw): | |
| 926 """Returns a list of customer accounts based on search criteria that | |
| 927 you specify. | |
| 928 """ | |
| 929 return self._post_request(request, kw, response) | |
| 930 | |
| 931 @requires(['NextToken']) | |
| 932 @api_action('CustomerInfo', 50, 3) | |
| 933 def list_customers_by_next_token(self, request, response, **kw): | |
| 934 """Returns the next page of customers using the NextToken parameter. | |
| 935 """ | |
| 936 return self._post_request(request, kw, response) | |
| 937 | |
| 938 @requires(['CustomerIdList']) | |
| 939 @structured_lists('CustomerIdList.CustomerId') | |
| 940 @api_action('CustomerInfo', 15, 12) | |
| 941 def get_customers_for_customer_id(self, request, response, **kw): | |
| 942 """Returns a list of customer accounts based on search criteria that | |
| 943 you specify. | |
| 944 """ | |
| 945 return self._post_request(request, kw, response) | |
| 946 | |
| 947 @api_action('CustomerInfo', 2, 300, 'GetServiceStatus') | |
| 948 def get_customerinfo_service_status(self, request, response, **kw): | |
| 949 """Returns the operational status of the Customer Information API | |
| 950 section. | |
| 951 """ | |
| 952 return self._post_request(request, kw, response) | |
| 953 | |
| 954 @requires(['DateRangeStart']) | |
| 955 @api_action('CartInfo', 15, 12) | |
| 956 def list_carts(self, request, response, **kw): | |
| 957 """Returns a list of shopping carts in your Webstore that were last | |
| 958 updated during the time range that you specify. | |
| 959 """ | |
| 960 return self._post_request(request, kw, response) | |
| 961 | |
| 962 @requires(['NextToken']) | |
| 963 @api_action('CartInfo', 50, 3) | |
| 964 def list_carts_by_next_token(self, request, response, **kw): | |
| 965 """Returns the next page of shopping carts using the NextToken | |
| 966 parameter. | |
| 967 """ | |
| 968 return self._post_request(request, kw, response) | |
| 969 | |
| 970 @requires(['CartIdList']) | |
| 971 @structured_lists('CartIdList.CartId') | |
| 972 @api_action('CartInfo', 15, 12) | |
| 973 def get_carts(self, request, response, **kw): | |
| 974 """Returns shopping carts based on the CartId values that you specify. | |
| 975 """ | |
| 976 return self._post_request(request, kw, response) | |
| 977 | |
| 978 @api_action('CartInfo', 2, 300, 'GetServiceStatus') | |
| 979 def get_cartinfo_service_status(self, request, response, **kw): | |
| 980 """Returns the operational status of the Cart Information API section. | |
| 981 """ | |
| 982 return self._post_request(request, kw, response) | |
| 983 | |
| 984 @requires(['MarketplaceId', 'Destination']) | |
| 985 @structured_objects('Destination', members=True) | |
| 986 @api_action('Subscriptions', 25, 0.5) | |
| 987 def register_destination(self, request, response, **kw): | |
| 988 """Specifies a new destination where you want to receive notifications. | |
| 989 """ | |
| 990 return self._post_request(request, kw, response) | |
| 991 | |
| 992 @requires(['MarketplaceId', 'Destination']) | |
| 993 @structured_objects('Destination', members=True) | |
| 994 @api_action('Subscriptions', 25, 0.5) | |
| 995 def deregister_destination(self, request, response, **kw): | |
| 996 """Removes an existing destination from the list of registered | |
| 997 destinations. | |
| 998 """ | |
| 999 return self._post_request(request, kw, response) | |
| 1000 | |
| 1001 @requires(['MarketplaceId']) | |
| 1002 @api_action('Subscriptions', 25, 0.5) | |
| 1003 def list_registered_destinations(self, request, response, **kw): | |
| 1004 """Lists all current destinations that you have registered. | |
| 1005 """ | |
| 1006 return self._post_request(request, kw, response) | |
| 1007 | |
| 1008 @requires(['MarketplaceId', 'Destination']) | |
| 1009 @structured_objects('Destination', members=True) | |
| 1010 @api_action('Subscriptions', 25, 0.5) | |
| 1011 def send_test_notification_to_destination(self, request, response, **kw): | |
| 1012 """Sends a test notification to an existing destination. | |
| 1013 """ | |
| 1014 return self._post_request(request, kw, response) | |
| 1015 | |
| 1016 @requires(['MarketplaceId', 'Subscription']) | |
| 1017 @structured_objects('Subscription', members=True) | |
| 1018 @api_action('Subscriptions', 25, 0.5) | |
| 1019 def create_subscription(self, request, response, **kw): | |
| 1020 """Creates a new subscription for the specified notification type | |
| 1021 and destination. | |
| 1022 """ | |
| 1023 return self._post_request(request, kw, response) | |
| 1024 | |
| 1025 @requires(['MarketplaceId', 'NotificationType', 'Destination']) | |
| 1026 @structured_objects('Destination', members=True) | |
| 1027 @api_action('Subscriptions', 25, 0.5) | |
| 1028 def get_subscription(self, request, response, **kw): | |
| 1029 """Gets the subscription for the specified notification type and | |
| 1030 destination. | |
| 1031 """ | |
| 1032 return self._post_request(request, kw, response) | |
| 1033 | |
| 1034 @requires(['MarketplaceId', 'NotificationType', 'Destination']) | |
| 1035 @structured_objects('Destination', members=True) | |
| 1036 @api_action('Subscriptions', 25, 0.5) | |
| 1037 def delete_subscription(self, request, response, **kw): | |
| 1038 """Deletes the subscription for the specified notification type and | |
| 1039 destination. | |
| 1040 """ | |
| 1041 return self._post_request(request, kw, response) | |
| 1042 | |
| 1043 @requires(['MarketplaceId']) | |
| 1044 @api_action('Subscriptions', 25, 0.5) | |
| 1045 def list_subscriptions(self, request, response, **kw): | |
| 1046 """Returns a list of all your current subscriptions. | |
| 1047 """ | |
| 1048 return self._post_request(request, kw, response) | |
| 1049 | |
| 1050 @requires(['MarketplaceId', 'Subscription']) | |
| 1051 @structured_objects('Subscription', members=True) | |
| 1052 @api_action('Subscriptions', 25, 0.5) | |
| 1053 def update_subscription(self, request, response, **kw): | |
| 1054 """Updates the subscription for the specified notification type and | |
| 1055 destination. | |
| 1056 """ | |
| 1057 return self._post_request(request, kw, response) | |
| 1058 | |
| 1059 @api_action('Subscriptions', 2, 300, 'GetServiceStatus') | |
| 1060 def get_subscriptions_service_status(self, request, response, **kw): | |
| 1061 """Returns the operational status of the Subscriptions API section. | |
| 1062 """ | |
| 1063 return self._post_request(request, kw, response) | |
| 1064 | |
| 1065 @requires(['AmazonOrderReferenceId', 'OrderReferenceAttributes']) | |
| 1066 @structured_objects('OrderReferenceAttributes') | |
| 1067 @api_action('OffAmazonPayments', 10, 1) | |
| 1068 def set_order_reference_details(self, request, response, **kw): | |
| 1069 """Sets order reference details such as the order total and a | |
| 1070 description for the order. | |
| 1071 """ | |
| 1072 return self._post_request(request, kw, response) | |
| 1073 | |
| 1074 @requires(['AmazonOrderReferenceId']) | |
| 1075 @api_action('OffAmazonPayments', 20, 2) | |
| 1076 def get_order_reference_details(self, request, response, **kw): | |
| 1077 """Returns details about the Order Reference object and its current | |
| 1078 state. | |
| 1079 """ | |
| 1080 return self._post_request(request, kw, response) | |
| 1081 | |
| 1082 @requires(['AmazonOrderReferenceId']) | |
| 1083 @api_action('OffAmazonPayments', 10, 1) | |
| 1084 def confirm_order_reference(self, request, response, **kw): | |
| 1085 """Confirms that the order reference is free of constraints and all | |
| 1086 required information has been set on the order reference. | |
| 1087 """ | |
| 1088 return self._post_request(request, kw, response) | |
| 1089 | |
| 1090 @requires(['AmazonOrderReferenceId']) | |
| 1091 @api_action('OffAmazonPayments', 10, 1) | |
| 1092 def cancel_order_reference(self, request, response, **kw): | |
| 1093 """Cancel an order reference; all authorizations associated with | |
| 1094 this order reference are also closed. | |
| 1095 """ | |
| 1096 return self._post_request(request, kw, response) | |
| 1097 | |
| 1098 @requires(['AmazonOrderReferenceId']) | |
| 1099 @api_action('OffAmazonPayments', 10, 1) | |
| 1100 def close_order_reference(self, request, response, **kw): | |
| 1101 """Confirms that an order reference has been fulfilled (fully | |
| 1102 or partially) and that you do not expect to create any new | |
| 1103 authorizations on this order reference. | |
| 1104 """ | |
| 1105 return self._post_request(request, kw, response) | |
| 1106 | |
| 1107 @requires(['AmazonOrderReferenceId', 'AuthorizationReferenceId', | |
| 1108 'AuthorizationAmount']) | |
| 1109 @structured_objects('AuthorizationAmount') | |
| 1110 @api_action('OffAmazonPayments', 10, 1) | |
| 1111 def authorize(self, request, response, **kw): | |
| 1112 """Reserves a specified amount against the payment method(s) stored in | |
| 1113 the order reference. | |
| 1114 """ | |
| 1115 return self._post_request(request, kw, response) | |
| 1116 | |
| 1117 @requires(['AmazonAuthorizationId']) | |
| 1118 @api_action('OffAmazonPayments', 20, 2) | |
| 1119 def get_authorization_details(self, request, response, **kw): | |
| 1120 """Returns the status of a particular authorization and the total | |
| 1121 amount captured on the authorization. | |
| 1122 """ | |
| 1123 return self._post_request(request, kw, response) | |
| 1124 | |
| 1125 @requires(['AmazonAuthorizationId', 'CaptureReferenceId', 'CaptureAmount']) | |
| 1126 @structured_objects('CaptureAmount') | |
| 1127 @api_action('OffAmazonPayments', 10, 1) | |
| 1128 def capture(self, request, response, **kw): | |
| 1129 """Captures funds from an authorized payment instrument. | |
| 1130 """ | |
| 1131 return self._post_request(request, kw, response) | |
| 1132 | |
| 1133 @requires(['AmazonCaptureId']) | |
| 1134 @api_action('OffAmazonPayments', 20, 2) | |
| 1135 def get_capture_details(self, request, response, **kw): | |
| 1136 """Returns the status of a particular capture and the total amount | |
| 1137 refunded on the capture. | |
| 1138 """ | |
| 1139 return self._post_request(request, kw, response) | |
| 1140 | |
| 1141 @requires(['AmazonAuthorizationId']) | |
| 1142 @api_action('OffAmazonPayments', 10, 1) | |
| 1143 def close_authorization(self, request, response, **kw): | |
| 1144 """Closes an authorization. | |
| 1145 """ | |
| 1146 return self._post_request(request, kw, response) | |
| 1147 | |
| 1148 @requires(['AmazonCaptureId', 'RefundReferenceId', 'RefundAmount']) | |
| 1149 @structured_objects('RefundAmount') | |
| 1150 @api_action('OffAmazonPayments', 10, 1) | |
| 1151 def refund(self, request, response, **kw): | |
| 1152 """Refunds a previously captured amount. | |
| 1153 """ | |
| 1154 return self._post_request(request, kw, response) | |
| 1155 | |
| 1156 @requires(['AmazonRefundId']) | |
| 1157 @api_action('OffAmazonPayments', 20, 2) | |
| 1158 def get_refund_details(self, request, response, **kw): | |
| 1159 """Returns the status of a particular refund. | |
| 1160 """ | |
| 1161 return self._post_request(request, kw, response) | |
| 1162 | |
| 1163 @api_action('OffAmazonPayments', 2, 300, 'GetServiceStatus') | |
| 1164 def get_offamazonpayments_service_status(self, request, response, **kw): | |
| 1165 """Returns the operational status of the Off-Amazon Payments API | |
| 1166 section. | |
| 1167 """ | |
| 1168 return self._post_request(request, kw, response) |
