templates/python/facebook_business/adobjects/objectparser.py (59 lines of code) (raw):
# Copyright 2014 Facebook, Inc.
# You are hereby granted a non-exclusive, worldwide, royalty-free license to
# use, copy, modify, and distribute this software in source code or binary
# form for use in connection with the web services and APIs provided by
# Facebook.
# As with any software that integrates with the Facebook platform, your use
# of this software is subject to the Facebook Developer Principles and
# Policies [http://developers.facebook.com/policy/]. This copyright notice
# shall be included in all copies or substantial portions of the software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
from facebook_business.exceptions import (
FacebookBadObjectError,
)
from facebook_business.adobjects.abstractobject import AbstractObject
class ObjectParser:
"""
Parser for API response
"""
def __init__(
self,
api=None,
target_class=None,
reuse_object=None,
custom_parse_method=None,
):
""" Initialize an ObjectParser.
To Initialize, you need to provide either a resuse_object, target_class,
or an custom_parse_method.
Args:
api: FacebookAdsApi object.
target_class (optional): The expected return object type.
reuse_object (optional): Reuse existing object to populate response.
custom_parse_method (optional): Custom parsing method.
"""
if not any([target_class, reuse_object is not None, custom_parse_method]):
raise FacebookBadObjectError(
'Must specify either target class calling object' +
'or custom parse method for parser')
self._reuse_object = reuse_object
self._target_class = target_class
self._custom_parse_method = custom_parse_method
self._api = api
def parse_single(self, response):
if self._custom_parse_method is not None:
return self._custom_parse_method(response, self._api)
data = response
if 'data' in response and isinstance(response['data'], dict):
data = response['data']
elif 'images' in response and not isinstance(data['images'], list):
_, data = data['images'].popitem()
if 'campaigns' in data:
_, data = data['campaigns'].popitem()
elif 'adsets' in data:
_, data = data['adsets'].popitem()
elif 'ads' in data:
_, data = data['ads'].popitem()
if 'success' in data:
del data['success']
if self._reuse_object is not None:
self._reuse_object._set_data(data)
return self._reuse_object
elif self._target_class is not None:
return AbstractObject.create_object(self._api, data,
self._target_class)
else:
raise FacebookBadObjectError(
'Must specify either target class calling object' +
'or custom parse method for parser')
def parse_multiple(self, response):
if 'data' in response and isinstance(response['data'], list):
ret = []
if isinstance(response['data'], list):
for json_obj in response['data']:
ret.append(self.parse_single(json_obj))
else:
ret.append(self.parse_single(response['data']))
else:
data = response['data'] if 'data' in response else response
ret = [AbstractObject.create_object(self._api, data,
self._target_class)]
return ret