Skip to content

Modules

Report

This class is used to interact with the Appier Campaign Report API.

Source code in appier_report/cost_api.py
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
class Report:
    """
    This class is used to interact with the Appier Campaign Report API.
    """

    ENDPOINTS = {
        "campaign": "https://mmp.appier.org/campaign_report",
        "inventory": "https://mmp.appier.org/inventory_report",
    }

    def __init__(self, api_type: str = "campaign", access_token: str = ""):
        """
        Args:
            api_type: "campaign" or "inventory"
            access_token: The access token for the Appier API.
        Returns:
            Nothing

        Doc Author:
            minhpc@ikameglobal.com
        """
        self.access_token = access_token
        self.endpoint = Report.ENDPOINTS.get(api_type, None)

        if not self.endpoint:
            raise Exception(f"Invalid type: {api_type}")

    def _get_report(
        self,
        start_date: str = None,
        end_date: str = None,
        timezone: int = 0,
        max_retries: int = 3,
        **kwargs,
    ) -> list[dict]:
        """
        Get campaign report data from Appier Cost API.

        Args:
            start_date: Format YYYY-MM-DD
            end_date: Format YYYY-MM-DD
            timezone: Timezone offset in hours.
            max_retries: Number of retries before giving up.
            retry_interval: Time to wait between retries.
            **kwargs: Other parameters

        Note:
            The **start_date** and **end_date** should be near each other (about 5 days apart),
            otherwise the request will fail.

        Returns:
            Report data in JSON format.
        Doc Author:
            minhpc@ikameglobal.com
        """
        params = {
            "access_token": self.access_token,
            "start_date": start_date,
            "end_date": end_date,
            "timezone": timezone,
            **kwargs,
        }
        adapter = HTTPAdapter(max_retries=max_retries)
        with requests.Session() as session:
            session.mount(self.endpoint, adapter)
            response = session.get(url=self.endpoint, params=params)
            if response.status_code == 200:
                return response.json()
            else:
                raise Exception(f"Error: {response.status_code}")

    def get_report(
        self,
        start_date: str = None,
        end_date: str = None,
        date_interval: int = 5,
        timezone: int = 0,
        max_retries: int = 3,
        **kwargs,
    ) -> list[dict]:
        """
        Wrapper for _get_report() to get report data from Appier Cost API.

        Args:
            start_date: Format YYYY-MM-DD
            end_date: Format YYYY-MM-DD
            date_interval: Number of days between each request.
            timezone: Timezone offset in hours.
            max_retries: Number of retries before giving up.
            **kwargs: Other parameters

        Returns:
            Report data in JSON format.
        Doc Author:
            minhpc@ikameglobal.com
        """
        if not start_date or not end_date:
            start_date = (datetime.now() - timedelta(days=2)).strftime("%Y-%m-%d")
            end_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")

        date_ranges = DateUtils.get_date_ranges(start_date=start_date, end_date=end_date, date_interval=date_interval)

        result = []
        for start, end in date_ranges:
            result.extend(
                self._get_report(
                    start_date=start,
                    end_date=end,
                    timezone=timezone,
                    max_retries=max_retries,
                    **kwargs,
                )
            )

        return result

__init__(api_type='campaign', access_token='')

Parameters:

Name Type Description Default
api_type str

"campaign" or "inventory"

'campaign'
access_token str

The access token for the Appier API.

''

Returns:

Type Description

Nothing

Doc Author

minhpc@ikameglobal.com

Source code in appier_report/cost_api.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def __init__(self, api_type: str = "campaign", access_token: str = ""):
    """
    Args:
        api_type: "campaign" or "inventory"
        access_token: The access token for the Appier API.
    Returns:
        Nothing

    Doc Author:
        minhpc@ikameglobal.com
    """
    self.access_token = access_token
    self.endpoint = Report.ENDPOINTS.get(api_type, None)

    if not self.endpoint:
        raise Exception(f"Invalid type: {api_type}")

get_report(start_date=None, end_date=None, date_interval=5, timezone=0, max_retries=3, **kwargs)

Wrapper for _get_report() to get report data from Appier Cost API.

Parameters:

Name Type Description Default
start_date str

Format YYYY-MM-DD

None
end_date str

Format YYYY-MM-DD

None
date_interval int

Number of days between each request.

5
timezone int

Timezone offset in hours.

0
max_retries int

Number of retries before giving up.

3
**kwargs

Other parameters

{}

Returns:

Type Description
list[dict]

Report data in JSON format.

Doc Author

minhpc@ikameglobal.com

Source code in appier_report/cost_api.py
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
def get_report(
    self,
    start_date: str = None,
    end_date: str = None,
    date_interval: int = 5,
    timezone: int = 0,
    max_retries: int = 3,
    **kwargs,
) -> list[dict]:
    """
    Wrapper for _get_report() to get report data from Appier Cost API.

    Args:
        start_date: Format YYYY-MM-DD
        end_date: Format YYYY-MM-DD
        date_interval: Number of days between each request.
        timezone: Timezone offset in hours.
        max_retries: Number of retries before giving up.
        **kwargs: Other parameters

    Returns:
        Report data in JSON format.
    Doc Author:
        minhpc@ikameglobal.com
    """
    if not start_date or not end_date:
        start_date = (datetime.now() - timedelta(days=2)).strftime("%Y-%m-%d")
        end_date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")

    date_ranges = DateUtils.get_date_ranges(start_date=start_date, end_date=end_date, date_interval=date_interval)

    result = []
    for start, end in date_ranges:
        result.extend(
            self._get_report(
                start_date=start,
                end_date=end,
                timezone=timezone,
                max_retries=max_retries,
                **kwargs,
            )
        )

    return result