def call(self, api_operation, api_request): try: API_OPERATIONS.index(api_operation) except ValueError: raise RuntimeError("Invalid API operation. Please refer to" "Adaptive Payments API Operations:" "https://www.x.com/docs/DOC-1408#id099BG0B005Z") url = "%s/%s" % (self._endpoint, api_operation) req = http_request(url) # Authentication req.add_header('X-PAYPAL-SECURITY-USERID', self._api_username) req.add_header('X-PAYPAL-SECURITY-PASSWORD', self._api_password) req.add_header('X-PAYPAL-SECURITY-SIGNATURE', self._api_signature) # Specifying data formats req.add_header('X-PAYPAL-REQUEST-DATA-FORMAT', 'JSON') req.add_header('X-PAYPAL-RESPONSE-DATA-FORMAT', 'JSON') # Specifying application information req.add_header('X-PAYPAL-APPLICATION-ID', self._app_id) json_request = json_encode(api_request) try: openurl = urlopen(req, json_request) except URLError: raise RuntimeError("API request failed.") return json_decode(openurl.read())
def run(self, property_operator, values, hasher=sha1): if not isinstance(values, (list, tuple)): raise ValueError( "The values for for a ParallelQuery run need to be a list." ) model_class = self.model_class keys_only = self.keys_only query_key = self.query_key limit = self.limit offset = self.offset deadline = self.deadline on_complete = self.on_complete ops = self.ops results = self.results set_result = results.__setitem__ callbacks = self.callbacks add_callback = callbacks.append if query_key: key_prefix = '%s-%s-%s' % ( hasher(query_key).hexdigest(), limit, offset ) cache = memcache.get_multi(values, key_prefix, self.namespace) else: cache = {} for value in values: if value in cache: continue if limit == 0: set_result(value, []) continue query = BaseQuery(model_class, keys_only) for op, args in ops: if op == 0: query.filter(*args) elif op == 1: query.order(*args) elif op == 2: query.ancestor(*args) query.filter(property_operator, value) query.execute( limit, offset, value, set_result, add_callback, deadline, on_complete ) try: while callbacks: callback = callbacks.pop() callback() if query_key: unset_keys = memcache.set_multi( results, cache_duration, key_prefix, self.namespace ) if notify: set_keys = set(results).difference(set(unset_keys)) if set_keys: rpc = urlfetch.create_rpc(deadline=10) urlfetch.make_fetch_call( rpc, notify, method='POST', payload=json_encode({ 'key_prefix': key_prefix, 'keys': set_keys }) ) for key in cache: results[key] = cache[key] return self finally: del callbacks[:]