facebook_business/adobjects/serverside/event.py (189 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. import pprint import six from facebook_business.adobjects.serverside.action_source import ActionSource from facebook_business.adobjects.serverside.custom_data import CustomData from facebook_business.adobjects.serverside.user_data import UserData class Event(object): param_types = { 'event_name': 'str', 'event_time': 'int', 'event_source_url': 'str', 'opt_out': 'bool', 'event_id': 'str', 'user_data': 'UserData', 'custom_data': 'CustomData', 'data_processing_options': 'list[str]', 'data_processing_options_country': 'int', 'data_processing_options_state': 'int', 'action_source': 'ActionSource', } def __init__(self, event_name = None, event_time = None, event_source_url = None, opt_out = None, event_id = None, user_data = None, custom_data = None, data_processing_options = None, data_processing_options_country = None, data_processing_options_state = None, action_source = None): # type: (str, int, str, bool, str, UserData, CustomData, list[str], int, int, ActionSource) -> None """Conversions API Event""" self._event_name = None self._event_time = None self._event_source_url = None self._opt_out = None self._event_id = None self._user_data = None self._custom_data = None self._data_processing_options = None self._data_processing_options_country = None self._data_processing_options_state = None self._action_source = None self.event_name = event_name self.event_time = event_time if event_source_url is not None: self.event_source_url = event_source_url if opt_out is not None: self.opt_out = opt_out if event_id is not None: self.event_id = event_id if user_data is not None: self.user_data = user_data if custom_data is not None: self.custom_data = custom_data if data_processing_options is not None: self.data_processing_options = data_processing_options if data_processing_options_country is not None: self.data_processing_options_country = data_processing_options_country if data_processing_options_state is not None: self.data_processing_options_state = data_processing_options_state if action_source is not None: self.action_source = action_source @property def event_name(self): """Gets the event_name of this Event. A Facebook pixel Standard Event or Custom Event name. :return: The event_name of this Event. :rtype: str """ return self._event_name @event_name.setter def event_name(self, event_name): """Sets the event_name of this Event. A Facebook pixel Standard Event or Custom Event name. :param event_name: The event_name of this Event. :type: str :return self """ if event_name is None: raise ValueError("Invalid value for `event_name`, must not be `None`") self._event_name = event_name @property def event_time(self): """Gets the event_time of this Event. A Unix timestamp in seconds indicating when the actual event occurred. :return: The event_time of this Event. :rtype: int """ return self._event_time @event_time.setter def event_time(self, event_time): """Sets the event_time of this Event. A Unix timestamp in seconds indicating when the actual event occurred. :param event_time: The event_time of this Event. :type: int """ if event_time is None: raise ValueError("Invalid value for `event_time`, must not be `None`") if not isinstance(event_time, int): raise TypeError('Event.event_time must be an int') self._event_time = event_time @property def event_source_url(self): """Gets the event_source_url of this Event. The browser URL where the event happened. :return: The event_source_url of this Event. :rtype: str """ return self._event_source_url @event_source_url.setter def event_source_url(self, event_source_url): """Sets the event_source_url of this Event. The browser URL where the event happened. :param event_source_url: The event_source_url of this Event. :type: str """ self._event_source_url = event_source_url @property def opt_out(self): """Gets the opt_out of this Event. A flag that indicates we should not use this event for ads delivery optimization. If set to true, we only use the event for attribution. :return: The opt_out of this Event. :rtype: bool """ return self._opt_out @opt_out.setter def opt_out(self, opt_out): """Sets the opt_out of this Event. A flag that indicates we should not use this event for ads delivery optimization. If set to true, we only use the event for attribution. :param opt_out: The opt_out of this Event. :type: bool """ if not isinstance(opt_out, bool): raise TypeError('Event.opt_out must be a bool') self._opt_out = opt_out @property def event_id(self): """Gets the event_id of this Event. This ID can be any string chosen by the advertiser. This is used with event_name to determine if events sent from both server and browser are identical. :return: The event_id of this Event. :rtype: str """ return self._event_id @event_id.setter def event_id(self, event_id): """Sets the event_id of this Event. This ID can be any string chosen by the advertiser. This is used with event_name to determine if events sent from both server and browser are identical. :param event_id: The event_id of this Event. :type: str """ self._event_id = event_id @property def user_data(self): """Gets the user_data of this Event. :return: The user_data of this Event. :rtype: UserData """ return self._user_data @user_data.setter def user_data(self, user_data): """Sets the user_data of this Event. :param user_data: The user_data of this Event. :type: UserData """ if user_data is None: raise ValueError("Invalid value for `user_data`, must not be `None`") if not isinstance(user_data, UserData): raise TypeError('Event.user_Data must be of type UserData') self._user_data = user_data @property def custom_data(self): """Gets the custom_data of this Event. :return: The custom_data of this Event. :rtype: CustomData """ return self._custom_data @custom_data.setter def custom_data(self, custom_data): """Sets the custom_data of this Event. :param custom_data: The custom_data of this Event. :type: CustomData """ if not isinstance(custom_data, CustomData): raise TypeError('Event.custom_data must be of type CustomData') self._custom_data = custom_data @property def data_processing_options(self): """Gets the data_processing_options of this Event. :return: The data_processing_options of this Event. :rtype: list[str] """ return self._data_processing_options @data_processing_options.setter def data_processing_options(self, data_processing_options): """Sets the data_processing_options of this Event. Processing options you would like to enable for a specific event. For more details see https://developers.facebook.com/docs/marketing-apis/data-processing-options :param data_processing_options: The data_processing_options of this Event. :type: list[str] """ self._data_processing_options = data_processing_options @property def data_processing_options_country(self): """Gets the data_processing_options_country of this Event. :return: The data_processing_options_country of this Event. :rtype: int """ return self._data_processing_options_country @data_processing_options_country.setter def data_processing_options_country(self, data_processing_options_country): """Sets the data_processing_options_country of this Event. A country that you want to associate to this data processing option. For more details: https://developers.intern.facebook.com/docs/marketing-apis/data-processing-options :param data_processing_options_country: The data_processing_options_country of this Event. :type: int """ if not isinstance(data_processing_options_country, int): raise TypeError('Event.data_processing_options_country must be an int') self._data_processing_options_country = data_processing_options_country @property def data_processing_options_state(self): """Gets the data_processing_options_state of this Event. :return: The data_processing_options_state of this Event. :rtype: int """ return self._data_processing_options_state @data_processing_options_state.setter def data_processing_options_state(self, data_processing_options_state): """Sets the data_processing_options_state of this Event. A state that you want to associate with this data processing option. For more details: https://developers.facebook.com/docs/marketing-apis/data-processing-options :param data_processing_options: The data_processing_options of this Event. :type: int """ self._data_processing_options_state = data_processing_options_state @property def action_source(self): """Gets the action_source. Allows you to specify where the conversion occurred. :return: The action_source. :rtype: ActionSource """ return self._action_source @action_source.setter def action_source(self, action_source): """Sets the action_source. Allows you to specify where the conversion occurred. :param action_source: The action_source. :type: ActionSource """ self._action_source = action_source def normalize(self): normalized_payload = {'event_name': self.event_name, 'event_time': self.event_time, 'event_source_url': self.event_source_url, 'opt_out': self.opt_out, 'event_id': self.event_id, 'data_processing_options': self.data_processing_options, 'data_processing_options_country' : self.data_processing_options_country, 'data_processing_options_state': self.data_processing_options_state } if self.user_data is not None: normalized_payload['user_data'] = self.user_data.normalize() if self.custom_data is not None: normalized_payload['custom_data'] = self.custom_data.normalize() if self.action_source is not None: self.validate_action_source(self.action_source) normalized_payload['action_source'] = self.action_source.value normalized_payload = {k: v for k, v in normalized_payload.items() if v is not None} return normalized_payload def validate_action_source(self, action_source): if not type(action_source) == ActionSource: raise TypeError( 'action_source must be an ActionSource. TypeError on value: %s' % action_source ) def to_dict(self): """Returns the model properties as a dict""" result = {} for attr, _ in six.iteritems(self.param_types): value = getattr(self, attr) if isinstance(value, list): result[attr] = list(map( lambda x: x.to_dict() if hasattr(x, "to_dict") else x, value )) elif hasattr(value, "to_dict"): result[attr] = value.to_dict() elif isinstance(value, dict): result[attr] = dict(map( lambda item: (item[0], item[1].to_dict()) if hasattr(item[1], "to_dict") else item, value.items() )) else: result[attr] = value if issubclass(Event, dict): for key, value in self.items(): result[key] = value return result def to_str(self): """Returns the string representation of the model""" return pprint.pformat(self.to_dict()) def __repr__(self): """For `print` and `pprint`""" return self.to_str() def __eq__(self, other): """Returns true if both objects are equal""" if not isinstance(other, Event): return False return self.__dict__ == other.__dict__ def __ne__(self, other): """Returns true if both objects are not equal""" return not self == other