Exemple #1
0
    def api_update(self, fields=None, params=None, batch=None, pending=False):
        param_types = {
            'applinks': 'Object',
            'base_price': 'float',
            'currency': 'string',
            'description': 'string',
            'images': 'list<Object>',
            'margin_level': 'unsigned int',
            'name': 'string',
            'pricing_variables': 'list<Object>',
            'sale_price': 'float',
            'url': 'string',
        }
        enums = {
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=HotelRoom,
            api_type='NODE',
            response_parser=ObjectParser(reuse_object=self),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
Exemple #2
0
    def delete_ad_labels(self,
                         fields=None,
                         params=None,
                         batch=None,
                         pending=False):
        from facebookads.adobjects.adlabel import AdLabel
        param_types = {
            'adlabels': 'list<Object>',
            'execution_options': 'list<execution_options_enum>',
        }
        enums = {
            'execution_options_enum':
            AdLabel.ExecutionOptions.__dict__.values(),
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='DELETE',
            endpoint='/adlabels',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AbstractCrudObject,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=AbstractCrudObject,
                                         api=self._api),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
Exemple #3
0
    def get_previews(self,
                     fields=None,
                     params=None,
                     batch=None,
                     pending=False):
        from facebookads.adobjects.adpreview import AdPreview
        self.assure_call()
        param_types = {
            'ad_format': 'ad_format_enum',
            'height': 'unsigned int',
            'locale': 'string',
            'post': 'Object',
            'product_item_ids': 'list<string>',
            'width': 'unsigned int',
        }
        enums = {
            'ad_format_enum': AdPreview.AdFormat.__dict__.values(),
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='GET',
            endpoint='/previews',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AdPreview,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=AdPreview),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request

        return request if pending else request.execute()
    def create_ad_accounts(self,
                           fields=None,
                           params=None,
                           batch=None,
                           pending=False):
        from facebookads.adobjects.adaccount import AdAccount
        param_types = {
            'access_type': 'access_type_enum',
            'adaccount_id': 'string',
            'permitted_roles': 'list<permitted_roles_enum>',
        }
        enums = {
            'access_type_enum': AdAccount.AccessType.__dict__.values(),
            'permitted_roles_enum': AdAccount.PermittedRoles.__dict__.values(),
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/adaccounts',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AdAccount,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=AdAccount),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
    def create_upload(self,
                      fields=None,
                      params=None,
                      batch=None,
                      pending=False):
        from facebookads.adobjects.productfeedupload import ProductFeedUpload
        param_types = {
            'file': 'file',
            'password': '******',
            'update_only': 'bool',
            'url': 'string',
            'username': '******',
        }
        enums = {}
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/uploads',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=ProductFeedUpload,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=ProductFeedUpload,
                                         api=self._api),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
    def create_objective(self, fields=None, params=None, batch=None, pending=False):
        from facebookads.adobjects.adstudyobjective import AdStudyObjective
        param_types = {
            'adspixels': 'list<Object>',
            'applications': 'list<Object>',
            'customconversions': 'list<Object>',
            'is_primary': 'bool',
            'name': 'string',
            'offline_conversion_data_sets': 'list<Object>',
            'offsitepixels': 'list<Object>',
            'type': 'type_enum',
        }
        enums = {
            'type_enum': AdStudyObjective.Type.__dict__.values(),
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/objectives',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AdStudyObjective,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=AdStudyObjective, api=self._api),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
Exemple #7
0
    def api_delete(self, fields=None, params=None, batch=None, pending=False):
        self.assure_call()
        param_types = {
            'id': 'string',
        }
        enums = {}
        request = FacebookRequest(
            node_id=self['id'],
            method='DELETE',
            endpoint='/',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AbstractCrudObject,
            api_type='NODE',
            response_parser=ObjectParser(reuse_object=self),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request

        return request if pending else request.execute()
Exemple #8
0
    def api_update(self, fields=None, params=None, batch=None, pending=False):
        param_types = {'name': 'string'}
        enums = {}
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=Project,
            api_type='NODE',
            response_parser=ObjectParser(reuse_object=self),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
Exemple #9
0
    def get_samples(self, fields=None, params=None, batch=None, pending=False):
        from facebookads.adobjects.productfeeduploaderrorsample import ProductFeedUploadErrorSample
        self.assure_call()
        param_types = {}
        enums = {}
        request = FacebookRequest(
            node_id=self['id'],
            method='GET',
            endpoint='/samples',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=ProductFeedUploadErrorSample,
            api_type='EDGE',
            response_parser=ObjectParser(
                target_class=ProductFeedUploadErrorSample),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request

        return request if pending else request.execute()
    def api_get(self, fields=None, params=None, batch=None, pending=False):
        self.assure_call()
        param_types = {
        }
        enums = {
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='GET',
            endpoint='/',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=ProductFeedUploadErrorSample,
            api_type='NODE',
            response_parser=ObjectParser(reuse_object=self),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request

        return request if pending else request.execute()
            AdsInsights.Breakdowns.__dict__.values(),
            'date_preset_enum':
            AdsInsights.DatePreset.__dict__.values(),
            'summary_enum':
            AdsInsights.Summary.__dict__.values(),
            'level_enum':
            AdsInsights.Level.__dict__.values(),
            'summary_action_breakdowns_enum':
            AdsInsights.SummaryActionBreakdowns.__dict__.values(),
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='GET',
            endpoint='/insights',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AdsInsights,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=AdsInsights),
            include_summary=False,
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request

        return request if pending else request.execute()

    def get_insights_async(self,
    def create_video(self,
                     fields=None,
                     params=None,
                     batch=None,
                     pending=False):
        param_types = {
            'content_category': 'content_category_enum',
            'description': 'string',
            'embeddable': 'bool',
            'file_size': 'unsigned int',
            'file_url': 'string',
            'fov': 'unsigned int',
            'guide': 'list<list<unsigned int>>',
            'guide_enabled': 'bool',
            'initial_heading': 'unsigned int',
            'initial_pitch': 'unsigned int',
            'original_fov': 'unsigned int',
            'original_projection_type': 'original_projection_type_enum',
            'referenced_sticker_id': 'string',
            'replace_video_id': 'string',
            'slideshow_spec': 'map',
            'source': 'string',
            'spherical': 'bool',
            'start_offset': 'unsigned int',
            'swap_mode': 'swap_mode_enum',
            'thumb': 'file',
            'title': 'string',
            'unpublished_content_type': 'unpublished_content_type_enum',
            'upload_phase': 'upload_phase_enum',
            'upload_session_id': 'string',
            'video_file_chunk': 'string',
        }
        enums = {
            'content_category_enum': [
                'BEAUTY_FASHION',
                'BUSINESS',
                'CARS_TRUCKS',
                'COMEDY',
                'CUTE_ANIMALS',
                'ENTERTAINMENT',
                'FAMILY',
                'FOOD_HEALTH',
                'HOME',
                'LIFESTYLE',
                'MUSIC',
                'NEWS',
                'POLITICS',
                'SCIENCE',
                'SPORTS',
                'TECHNOLOGY',
                'VIDEO_GAMING',
                'OTHER',
            ],
            'original_projection_type_enum': [
                'equirectangular',
                'cubemap',
                'equiangular_cubemap',
            ],
            'swap_mode_enum': [
                'replace',
            ],
            'unpublished_content_type_enum': [
                'SCHEDULED',
                'DRAFT',
                'ADS_POST',
            ],
            'upload_phase_enum': [
                'start',
                'transfer',
                'finish',
                'cancel',
            ],
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/videos',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AbstractCrudObject,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=AbstractCrudObject,
                                         api=self._api),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
 def __init__(self):
   self._data = {}
   self._field_checker = TypeChecker(self._field_types,
     self._get_field_enum_info())
class AbstractObject(collections.MutableMapping):

  """
  Represents an abstract object (may or may not have explicitly be a node of
  the Graph) as a MutableMapping of its data.
  """

  _default_read_fields = []
  _field_types = {}

  class Field:
    pass

  def __init__(self):
    self._data = {}
    self._field_checker = TypeChecker(self._field_types,
      self._get_field_enum_info())

  def __getitem__(self, key):
    return self._data[str(key)]

  def __setitem__(self, key, value):
    if key.startswith('_'):
      self.__setattr__(key, value)
    else:
      self._data[key] = self._field_checker.get_typed_value(key, value)
    return self

  def __eq__(self, other):
    return other is not None and 'export_all_data' in other and \
      self.export_all_data() == other.export_all_data()

  def __delitem__(self, key):
    del self._data[key]

  def __iter__(self):
    return iter(self._data)

  def __len__(self):
    return len(self._data)

  def __contains__(self, key):
    return key in self._data

  def __unicode__(self):
    return unicode(self._data)

  def __repr__(self):
    return "<%s> %s" % (
      self.__class__.__name__,
      json.dumps(
        self.export_value(self._data),
        sort_keys=True,
        indent=4,
        separators=(',', ': '),
      ),
    )

  #reads in data from json object
  def _set_data(self, data):
    if hasattr(data, 'items'):
      for key, value in data.items():
        self[key] = value
    else:
      raise FacebookBadObjectError("Bad data to set object data")
    self._json = data

  @classmethod
  def _get_field_enum_info(cls):
    """Returns info for fields that use enum values
    Should be implemented in subclasses
    """
    return {}

  # @deprecated get_endpoint function is deprecated
  @classmethod
  def get_endpoint(cls):
    """Returns the endpoint name.
    Raises:
      NotImplementedError if the method is not implemented in a class
        that derives from this abstract class.
    """
    raise NotImplementedError(
      "%s must have implemented get_endpoint." % cls.__name__,
    )

  @classmethod
  def get_default_read_fields(cls):
    """Returns the class's list of default fields to read."""
    return cls._default_read_fields

  @classmethod
  def set_default_read_fields(cls, fields):
    """Sets the class's list of default fields to read.
    Args:
      fields: list of field names to read by default without specifying
        them explicitly during a read operation either via EdgeIterator
        or via AbstractCrudObject.read.
    """
    cls._default_read_fields = fields

  @classmethod
  def _assign_fields_to_params(cls, fields, params):
    """Applies fields to params in a consistent manner."""
    if fields is None:
      fields = cls.get_default_read_fields()
    if fields:
      params['fields'] = ','.join(fields)

  def set_data(self, data):
    """
    For an AbstractObject, we do not need to keep history.
    """
    self._set_data(data)

  def export_value(self, data):
    if isinstance(data, AbstractObject):
      data = data.export_all_data()
    elif isinstance(data, dict):
      data = dict((k, self.export_value(v))
            for k, v in data.items()
            if v is not None)
    elif isinstance(data, list):
      data = [self.export_value(v) for v in data]
    return data

  def export_data(self):
    """
    Deprecated. Use export_all_data() instead.
    """
    return self.export_all_data()

  def export_all_data(self):
    return self.export_value(self._data)

  @classmethod
  def create_object(cls, api, data, target_class):
    new_object = target_class(api=api)
    new_object._set_data(data)
    return new_object
 def __init__(self):
     self._data = {}
     self._field_checker = TypeChecker(self._field_types,
         self._get_field_enum_info())
class AbstractObject(collections.MutableMapping):

    """
    Represents an abstract object (may or may not have explicitly be a node of
    the Graph) as a MutableMapping of its data.
    """

    _default_read_fields = []
    _field_types = {}

    class Field:
        pass

    def __init__(self):
        self._data = {}
        self._field_checker = TypeChecker(self._field_types,
            self._get_field_enum_info())

    def __getitem__(self, key):
        return self._data[str(key)]

    def __setitem__(self, key, value):
        if key.startswith('_'):
            self.__setattr__(key, value)
        else:
            self._data[key] = self._field_checker.get_typed_value(key, value)
        return self

    def __eq__(self, other):
        return other is not None and 'export_all_data' in other and \
            self.export_all_data() == other.export_all_data()

    def __delitem__(self, key):
        del self._data[key]

    def __iter__(self):
        return iter(self._data)

    def __len__(self):
        return len(self._data)

    def __contains__(self, key):
        return key in self._data

    def __unicode__(self):
        return unicode(self._data)

    def __repr__(self):
        return "<%s> %s" % (
            self.__class__.__name__,
            json.dumps(
                self.export_value(self._data),
                sort_keys=True,
                indent=4,
                separators=(',', ': '),
            ),
        )

    #reads in data from json object
    def _set_data(self, data):
        if hasattr(data, 'items'):
            for key, value in data.items():
                self[key] = value
        else:
            raise FacebookBadObjectError("Bad data to set object data")
        self._json = data

    @classmethod
    def _get_field_enum_info(cls):
        """Returns info for fields that use enum values
        Should be implemented in subclasses
        """
        return {}

    # @deprecated get_endpoint function is deprecated
    @classmethod
    def get_endpoint(cls):
        """Returns the endpoint name.
        Raises:
            NotImplementedError if the method is not implemented in a class
                that derives from this abstract class.
        """
        raise NotImplementedError(
            "%s must have implemented get_endpoint." % cls.__name__,
        )

    @classmethod
    def get_default_read_fields(cls):
        """Returns the class's list of default fields to read."""
        return cls._default_read_fields

    @classmethod
    def set_default_read_fields(cls, fields):
        """Sets the class's list of default fields to read.
        Args:
            fields: list of field names to read by default without specifying
                them explicitly during a read operation either via EdgeIterator
                or via AbstractCrudObject.read.
        """
        cls._default_read_fields = fields

    @classmethod
    def _assign_fields_to_params(cls, fields, params):
        """Applies fields to params in a consistent manner."""
        if fields is None:
            fields = cls.get_default_read_fields()
        if fields:
            params['fields'] = ','.join(fields)

    def set_data(self, data):
        """
        For an AbstractObject, we do not need to keep history.
        """
        self._set_data(data)

    def export_value(self, data):
        if isinstance(data, AbstractObject):
            data = data.export_all_data()
        elif isinstance(data, dict):
            data = dict((k, self.export_value(v))
                        for k, v in data.items()
                        if v is not None)
        elif isinstance(data, list):
            data = [self.export_value(v) for v in data]
        return data

    def export_data(self):
        """
        Deprecated. Use export_all_data() instead.
        """
        return self.export_all_data()

    def export_all_data(self):
        return self.export_value(self._data)

    @classmethod
    def create_object(cls, api, data, target_class):
        new_object = target_class(api=api)
        new_object._set_data(data)
        return new_object
Exemple #17
0
 def __init__(self):
     self._data = dict.fromkeys(self.Field.__dict__.values())
     self._field_checker = TypeChecker(self._field_types,
                                       self._get_field_enum_info())
    def get_insights_async(self,
                           fields=None,
                           params=None,
                           batch=None,
                           pending=False):
        from facebookads.adobjects.adreportrun import AdReportRun
        from facebookads.adobjects.adsinsights import AdsInsights
        self.assure_call()
        param_types = {
            'action_attribution_windows':
            'list<action_attribution_windows_enum>',
            'action_breakdowns': 'list<action_breakdowns_enum>',
            'action_report_time': 'action_report_time_enum',
            'breakdowns': 'list<breakdowns_enum>',
            'date_preset': 'date_preset_enum',
            'default_summary': 'bool',
            'fields': 'list<fields_enum>',
            'filtering': 'list<Object>',
            'level': 'level_enum',
            'product_id_limit': 'int',
            'sort': 'list<string>',
            'summary': 'list<summary_enum>',
            'summary_action_breakdowns':
            'list<summary_action_breakdowns_enum>',
            'time_increment': 'string',
            'time_range': 'map',
            'time_ranges': 'list<map>',
        }
        enums = {
            'action_attribution_windows_enum':
            AdsInsights.ActionAttributionWindows.__dict__.values(),
            'action_breakdowns_enum':
            AdsInsights.ActionBreakdowns.__dict__.values(),
            'action_report_time_enum':
            AdsInsights.ActionReportTime.__dict__.values(),
            'breakdowns_enum':
            AdsInsights.Breakdowns.__dict__.values(),
            'date_preset_enum':
            AdsInsights.DatePreset.__dict__.values(),
            'summary_enum':
            AdsInsights.Summary.__dict__.values(),
            'level_enum':
            AdsInsights.Level.__dict__.values(),
            'summary_action_breakdowns_enum':
            AdsInsights.SummaryActionBreakdowns.__dict__.values(),
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/insights',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=AdReportRun,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=AdReportRun),
            include_summary=False,
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request

        return request if pending else request.execute()
    def create_product(self,
                       fields=None,
                       params=None,
                       batch=None,
                       pending=False):
        from facebookads.adobjects.productitem import ProductItem
        param_types = {
            'additional_image_urls': 'list<string>',
            'android_app_name': 'string',
            'android_class': 'string',
            'android_package': 'string',
            'android_url': 'string',
            'availability': 'availability_enum',
            'brand': 'string',
            'category': 'string',
            'checkout_url': 'string',
            'color': 'string',
            'condition': 'condition_enum',
            'currency': 'string',
            'custom_data': 'map',
            'custom_label_0': 'string',
            'custom_label_1': 'string',
            'custom_label_2': 'string',
            'custom_label_3': 'string',
            'custom_label_4': 'string',
            'description': 'string',
            'expiration_date': 'string',
            'gender': 'gender_enum',
            'gtin': 'string',
            'image_url': 'string',
            'inventory': 'unsigned int',
            'ios_app_name': 'string',
            'ios_app_store_id': 'unsigned int',
            'ios_url': 'string',
            'ipad_app_name': 'string',
            'ipad_app_store_id': 'unsigned int',
            'ipad_url': 'string',
            'iphone_app_name': 'string',
            'iphone_app_store_id': 'unsigned int',
            'iphone_url': 'string',
            'manufacturer_part_number': 'string',
            'name': 'string',
            'ordering_index': 'unsigned int',
            'pattern': 'string',
            'price': 'unsigned int',
            'product_type': 'string',
            'retailer_id': 'string',
            'sale_price': 'unsigned int',
            'sale_price_end_date': 'datetime',
            'sale_price_start_date': 'datetime',
            'short_description': 'string',
            'size': 'string',
            'start_date': 'string',
            'url': 'string',
            'visibility': 'visibility_enum',
            'windows_phone_app_id': 'unsigned int',
            'windows_phone_app_name': 'string',
            'windows_phone_url': 'string',
        }
        enums = {
            'availability_enum': ProductItem.Availability.__dict__.values(),
            'condition_enum': ProductItem.Condition.__dict__.values(),
            'gender_enum': ProductItem.Gender.__dict__.values(),
            'visibility_enum': ProductItem.Visibility.__dict__.values(),
        }
        request = FacebookRequest(
            node_id=self['id'],
            method='POST',
            endpoint='/products',
            api=self._api,
            param_checker=TypeChecker(param_types, enums),
            target_class=ProductItem,
            api_type='EDGE',
            response_parser=ObjectParser(target_class=ProductItem),
        )
        request.add_params(params)
        request.add_fields(fields)

        if batch is not None:
            request.add_to_batch(batch)
            return request
        elif pending:
            return request
        else:
            self.assure_call()
            return request.execute()
 def __init__(self):
     self._data = dict.fromkeys(self.Field.__dict__.values())
     self._field_checker = TypeChecker(self._field_types,
         self._get_field_enum_info())