Exemplo n.º 1
0
from twitter_ads.resource import resource_property, Resource, Persistence, Analytics
from twitter_ads.http import Request


class PromotedAccount(Resource, Persistence):

    PROPERTIES = {}

    RESOURCE_COLLECTION = "/0/accounts/{account_id}/promoted_accounts"
    RESOURCE_STATS = "/0/stats/accounts/{account_id}/promoted_accounts"
    RESOURCE = "/0/accounts/{account_id}/promoted_accounts/{id}"


# promoted account properties
# read-only
resource_property(PromotedAccount, "id", readonly=True)
resource_property(PromotedAccount, "approval_status", readonly=True)
resource_property(PromotedAccount, "created_at", readonly=True, transform=TRANSFORM.TIME)
resource_property(PromotedAccount, "updated_at", readonly=True, transform=TRANSFORM.TIME)
resource_property(PromotedAccount, "deleted", readonly=True, transform=TRANSFORM.BOOL)
# writable
resource_property(PromotedAccount, "line_item_id")
resource_property(PromotedAccount, "user_id")
resource_property(PromotedAccount, "paused", transform=TRANSFORM.BOOL)


class PromotedTweet(Resource, Persistence, Analytics):

    PROPERTIES = {}

    RESOURCE_COLLECTION = "/0/accounts/{account_id}/promoted_tweets"
Exemplo n.º 2
0
    def __update_audience__(self, location, list_type, operation):
        params = {
            'tailored_audience_id': self.id,
            'input_file_path': location,
            'list_type': list_type,
            'operation': operation
        }

        resource = self.RESOURCE_UPDATE.format(account_id=self.account.id)
        return Request(self.account.client, 'post', resource, params=params).perform()


# tailored audience properties
# read-only
resource_property(TailoredAudience, 'id', readonly=True)
resource_property(TailoredAudience, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TailoredAudience, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TailoredAudience, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(TailoredAudience, 'audience_size', readonly=True)
resource_property(TailoredAudience, 'audience_type', readonly=True)
resource_property(TailoredAudience, 'metadata', readonly=True)
resource_property(TailoredAudience, 'partner_source', readonly=True)
resource_property(TailoredAudience, 'reasons_not_targetable', readonly=True)
resource_property(TailoredAudience, 'targetable', readonly=True)
resource_property(TailoredAudience, 'targetable_types', readonly=True)
# writable
resource_property(TailoredAudience, 'name')
resource_property(TailoredAudience, 'list_type')

Exemplo n.º 3
0
    @classmethod
    def all(klass, account, line_item_id, **kwargs):
        """Returns a Cursor instance for a given resource."""
        params = {"line_item_id": line_item_id}
        params.update(kwargs)

        resource = klass.RESOURCE_COLLECTION.format(account_id=account.id)
        request = Request(account.client, "get", resource, params=params)

        return Cursor(klass, request, init_with=[account])


# targeting criteria properties
# read-only
resource_property(TargetingCriteria, "id", readonly=True)
resource_property(TargetingCriteria, "localized_name", readonly=True)
resource_property(TargetingCriteria, "created_at", readonly=True, transform=TRANSFORM.TIME)
resource_property(TargetingCriteria, "updated_at", readonly=True, transform=TRANSFORM.TIME)
resource_property(TargetingCriteria, "deleted", readonly=True, transform=TRANSFORM.BOOL)
# writable
resource_property(TargetingCriteria, "line_item_id")
resource_property(TargetingCriteria, "targeting_type")
resource_property(TargetingCriteria, "targeting_value")
resource_property(TargetingCriteria, "tailored_audience_expansion")
resource_property(TargetingCriteria, "tailored_audience_type")


class FundingInstrument(Resource, Persistence):

    PROPERTIES = {}
# Copyright (C) 2015 Twitter, Inc.

"""Container for all targeting related logic used by the Ads API SDK."""

from twitter_ads.http import Request
from twitter_ads.resource import resource_property, Resource, Persistence
from twitter_ads import API_VERSION
from twitter_ads.utils import FlattenParams
import json


class AudienceSummary(Resource, Persistence):
    PROPERTIES = {}

    RESOURCE = '/' + API_VERSION + '/accounts/{account_id}/audience_summary'

    @classmethod
    @FlattenParams
    def load(klass, account, params):
        resource = klass.RESOURCE.format(account_id=account.id)
        headers = {'Content-Type': 'application/json'}
        response = Request(account.client,
                           'post',
                           resource,
                           headers=headers,
                           body=json.dumps(params)).perform()
        return klass(account).from_response(response.body['data'])


resource_property(AudienceSummary, 'audience_size')
Exemplo n.º 5
0
        self._validate_loaded()
        return TailoredAudiencePermission.all(self.account, self.id, **kwargs)

    def __create_audience__(self, name):
        params = {'name': name}
        resource = self.RESOURCE_COLLECTION.format(account_id=self.account.id)
        response = Request(self.account.client,
                           'post',
                           resource,
                           params=params).perform()
        return self.from_response(response.body['data'])


# tailored audience properties
# read-only
resource_property(TailoredAudience, 'id', readonly=True)
resource_property(TailoredAudience,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TailoredAudience,
                  'updated_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TailoredAudience,
                  'deleted',
                  readonly=True,
                  transform=TRANSFORM.BOOL)
resource_property(TailoredAudience, 'audience_size', readonly=True)
resource_property(TailoredAudience, 'audience_type', readonly=True)
resource_property(TailoredAudience, 'metadata', readonly=True)
Exemplo n.º 6
0
from twitter_ads.enum import TRANSFORM
from twitter_ads.http import Request
from twitter_ads.resource import resource_property, Resource, Persistence, Analytics


class PromotedAccount(Resource, Persistence):

    PROPERTIES = {}

    RESOURCE_COLLECTION = '/' + API_VERSION + '/accounts/{account_id}/promoted_accounts'
    RESOURCE = '/' + API_VERSION + '/accounts/{account_id}/promoted_accounts/{id}'


# promoted account properties
# read-only
resource_property(PromotedAccount, 'approval_status', readonly=True)
resource_property(PromotedAccount, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(PromotedAccount, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(PromotedAccount, 'entity_status', readonly=True)
resource_property(PromotedAccount, 'id', readonly=True)
resource_property(PromotedAccount, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
# writable
resource_property(PromotedAccount, 'line_item_id')
resource_property(PromotedAccount, 'user_id')


class PromotedTweet(Resource, Persistence, Analytics):

    PROPERTIES = {}

    RESOURCE_COLLECTION = '/' + API_VERSION + '/accounts/{account_id}/promoted_tweets'
Exemplo n.º 7
0
        """Returns a list of supported TV markets"""
        resource = klass.RESOURCE_OPTIONS + 'tv_markets'
        request = Request(account.client, 'get', resource, params=kwargs)
        return Cursor(None, request)

    @classmethod
    def tv_shows(klass, account, **kwargs):
        """Returns a list of supported TV shows"""
        resource = klass.RESOURCE_OPTIONS + 'tv_shows'
        request = Request(account.client, 'get', resource, params=kwargs)
        return Cursor(None, request)


# targeting criteria properties
# read-only
resource_property(TargetingCriteria, 'id', readonly=True)
resource_property(TargetingCriteria, 'name', readonly=True)
resource_property(TargetingCriteria, 'localized_name', readonly=True)
resource_property(TargetingCriteria,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TargetingCriteria,
                  'updated_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TargetingCriteria,
                  'deleted',
                  readonly=True,
                  transform=TRANSFORM.BOOL)
# writable
        """
        return self._load_resource(Video, id, **kwargs)

    def scoped_timeline(self, *ids, **kwargs):
        """
        Returns the most recent promotable Tweets created by one or more
        specified Twitter users.
        """
        self._validate_loaded()

        if isinstance(ids, list):
            ids = ','.join(map(str, ids))

        params = {'user_ids': ids}
        params.update(kwargs)

        resource = self.SCOPED_TIMELINE.format(id=self.id)
        response = Request(self.client, 'get', resource, params=params).perform()

        return response.body['data']

# account properties
resource_property(Account, 'id', readonly=True)
resource_property(Account, 'name', readonly=True)
resource_property(Account, 'salt', readonly=True)
resource_property(Account, 'timezone', readonly=True)
resource_property(Account, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(Account, 'timezone_switch_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(Account, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(Account, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
# Copyright (C) 2015 Twitter, Inc.
"""Container for all targeting related logic used by the Ads API SDK."""

from twitter_ads.http import Request
from twitter_ads.resource import resource_property, Resource, Persistence
from twitter_ads import API_VERSION
from twitter_ads.utils import FlattenParams
import json


class AudienceEstimate(Resource, Persistence):
    PROPERTIES = {}

    RESOURCE = '/' + API_VERSION + '/accounts/{account_id}/audience_estimate'

    @classmethod
    @FlattenParams
    def load(klass, account, params):
        resource = klass.RESOURCE.format(account_id=account.id)
        headers = {'Content-Type': 'application/json'}
        response = Request(account.client,
                           'post',
                           resource,
                           headers=headers,
                           body=json.dumps(params)).perform()
        return klass(account).from_response(response.body['data'])


resource_property(AudienceEstimate, 'audience_size')
Exemplo n.º 10
0
from twitter_ads.enum import TRANSFORM
from twitter_ads.resource import resource_property, Resource, Persistence, Analytics
from twitter_ads.http import Request


class PromotedAccount(Resource, Persistence):

    PROPERTIES = {}

    RESOURCE_COLLECTION = '/1/accounts/{account_id}/promoted_accounts'
    RESOURCE = '/1/accounts/{account_id}/promoted_accounts/{id}'

# promoted account properties
# read-only
resource_property(PromotedAccount, 'id', readonly=True)
resource_property(PromotedAccount, 'approval_status', readonly=True)
resource_property(PromotedAccount, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(PromotedAccount, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(PromotedAccount, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
# writable
resource_property(PromotedAccount, 'line_item_id')
resource_property(PromotedAccount, 'user_id')
resource_property(PromotedAccount, 'paused', transform=TRANSFORM.BOOL)


class PromotedTweet(Resource, Persistence, Analytics):

    PROPERTIES = {}

    RESOURCE_COLLECTION = '/1/accounts/{account_id}/promoted_tweets'
Exemplo n.º 11
0
        """
        Returns a collection of media creatives available to the current account.
        """
        return self._load_resource(MediaCreative, id, **kwargs)

    def scoped_timeline(self, *id, **kwargs):
        """
        Returns the most recent promotable Tweets created by the specified Twitter user.
        """
        self._validate_loaded()

        params = {"user_id": id}
        params.update(kwargs)

        resource = self.SCOPED_TIMELINE.format(id=self.id)
        response = Request(self.client, "get", resource, params=params).perform()

        return response.body["data"]


# account properties
resource_property(Account, "id", readonly=True)
resource_property(Account, "name", readonly=True)
resource_property(Account, "salt", readonly=True)
resource_property(Account, "timezone", readonly=True)
resource_property(Account, "approval_status", readonly=True)
resource_property(Account, "deleted", readonly=True, transform=TRANSFORM.BOOL)
resource_property(Account, "timezone_switch_at", readonly=True, transform=TRANSFORM.TIME)
resource_property(Account, "created_at", readonly=True, transform=TRANSFORM.TIME)
resource_property(Account, "updated_at", readonly=True, transform=TRANSFORM.TIME)
Exemplo n.º 12
0
        """
        Returns a collection of permissions for the curent tailored audience.
        """
        self._validate_loaded()
        return TailoredAudiencePermission.all(self.account, self.id, **kwargs)

    def __create_audience__(self, name):
        params = {'name': name}
        resource = self.RESOURCE_COLLECTION.format(account_id=self.account.id)
        response = Request(self.account.client, 'post', resource, params=params).perform()
        return self.from_response(response.body['data'])


# tailored audience properties
# read-only
resource_property(TailoredAudience, 'id', readonly=True)
resource_property(TailoredAudience, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TailoredAudience, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TailoredAudience, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(TailoredAudience, 'audience_size', readonly=True)
resource_property(TailoredAudience, 'audience_type', readonly=True)
resource_property(TailoredAudience, 'metadata', readonly=True)
resource_property(TailoredAudience, 'partner_source', readonly=True)
resource_property(TailoredAudience, 'reasons_not_targetable', readonly=True)
resource_property(TailoredAudience, 'targetable', readonly=True)
resource_property(TailoredAudience, 'targetable_types', readonly=True)
# writable
resource_property(TailoredAudience, 'name')
resource_property(TailoredAudience, 'list_type')

Exemplo n.º 13
0
from twitter_ads.enum import TRANSFORM
from twitter_ads.http import Request
from twitter_ads.resource import resource_property, Resource, Persistence, Analytics


class PromotedAccount(Resource, Persistence):

    PROPERTIES = {}

    RESOURCE_COLLECTION = '/' + API_VERSION + '/accounts/{account_id}/promoted_accounts'
    RESOURCE = '/' + API_VERSION + '/accounts/{account_id}/promoted_accounts/{id}'


# promoted account properties
# read-only
resource_property(PromotedAccount, 'approval_status', readonly=True)
resource_property(PromotedAccount, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(PromotedAccount, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(PromotedAccount, 'entity_status', readonly=True)
resource_property(PromotedAccount, 'id', readonly=True)
resource_property(PromotedAccount, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
# writable
resource_property(PromotedAccount, 'line_item_id')
resource_property(PromotedAccount, 'user_id')


class PromotedTweet(Resource, Persistence, Analytics):

    PROPERTIES = {}

    RESOURCE_COLLECTION = '/' + API_VERSION + '/accounts/{account_id}/promoted_tweets'
Exemplo n.º 14
0
        """Returns a list of supported TV markets"""
        resource = klass.RESOURCE_OPTIONS + 'tv_markets'
        request = Request(account.client, 'get', resource, params=kwargs)
        return Cursor(None, request)

    @classmethod
    def tv_shows(klass, account, **kwargs):
        """Returns a list of supported TV shows"""
        resource = klass.RESOURCE_OPTIONS + 'tv_shows'
        request = Request(account.client, 'get', resource, params=kwargs)
        return Cursor(None, request)


# targeting criteria properties
# read-only
resource_property(TargetingCriteria, 'id', readonly=True)
resource_property(TargetingCriteria, 'localized_name', readonly=True)
resource_property(TargetingCriteria, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TargetingCriteria, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TargetingCriteria, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
# writable
resource_property(TargetingCriteria, 'line_item_id')
resource_property(TargetingCriteria, 'operator_type')
resource_property(TargetingCriteria, 'targeting_type')
resource_property(TargetingCriteria, 'targeting_value')
resource_property(TargetingCriteria, 'tailored_audience_expansion')
resource_property(TargetingCriteria, 'tailored_audience_type')
# sdk-only
resource_property(TargetingCriteria, 'to_delete', transform=TRANSFORM.BOOL)

Exemplo n.º 15
0
    @classmethod
    def all(klass, account, line_item_id, **kwargs):
        """Returns a Cursor instance for a given resource."""
        params = {'line_item_id': line_item_id}
        params.update(kwargs)

        resource = klass.RESOURCE_COLLECTION.format(account_id=account.id)
        request = Request(account.client, 'get', resource, params=params)

        return Cursor(klass, request, init_with=[account])


# targeting criteria properties
# read-only
resource_property(TargetingCriteria, 'id', readonly=True)
resource_property(TargetingCriteria, 'localized_name', readonly=True)
resource_property(TargetingCriteria,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TargetingCriteria,
                  'updated_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TargetingCriteria,
                  'deleted',
                  readonly=True,
                  transform=TRANSFORM.BOOL)
# writable
resource_property(TargetingCriteria, 'line_item_id')
Exemplo n.º 16
0
    @classmethod
    def all(klass, account, line_item_id, **kwargs):
        """Returns a Cursor instance for a given resource."""
        params = {'line_item_id': line_item_id}
        params.update(kwargs)

        resource = klass.RESOURCE_COLLECTION.format(account_id=account.id)
        request = Request(account.client, 'get', resource, params=params)

        return Cursor(klass, request, init_with=[account])


# targeting criteria properties
# read-only
resource_property(TargetingCriteria, 'id', readonly=True)
resource_property(TargetingCriteria, 'localized_name', readonly=True)
resource_property(TargetingCriteria, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TargetingCriteria, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(TargetingCriteria, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
# writable
resource_property(TargetingCriteria, 'line_item_id')
resource_property(TargetingCriteria, 'operator_type')
resource_property(TargetingCriteria, 'targeting_type')
resource_property(TargetingCriteria, 'targeting_value')
resource_property(TargetingCriteria, 'tailored_audience_expansion')
resource_property(TargetingCriteria, 'tailored_audience_type')
# sdk-only
resource_property(TargetingCriteria, 'to_delete', transform=TRANSFORM.BOOL)

Exemplo n.º 17
0
        Returns the most recent promotable Tweets created by the specified Twitter user.
        """
        self._validate_loaded()

        params = {'user_id': id}
        params.update(kwargs)

        resource = self.SCOPED_TIMELINE.format(id=self.id)
        response = Request(self.client, 'get', resource,
                           params=params).perform()

        return response.body['data']


# account properties
resource_property(Account, 'id', readonly=True)
resource_property(Account, 'name', readonly=True)
resource_property(Account, 'salt', readonly=True)
resource_property(Account, 'timezone', readonly=True)
resource_property(Account, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(Account,
                  'timezone_switch_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(Account,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(Account,
                  'updated_at',
                  readonly=True,
Exemplo n.º 18
0
        return self._load_resource(VideoWebsiteCard, id, **kwargs)

    def scoped_timeline(self, *id, **kwargs):
        """
        Returns the most recent promotable Tweets created by the specified Twitter user.
        """
        self._validate_loaded()

        params = {'user_id': id}
        params.update(kwargs)

        resource = self.SCOPED_TIMELINE.format(id=self.id)
        response = Request(self.client, 'get', resource, params=params).perform()

        return response.body['data']


# account properties
resource_property(Account, 'id', readonly=True)
resource_property(Account, 'name', readonly=True)
resource_property(Account, 'salt', readonly=True)
resource_property(Account, 'timezone', readonly=True)
resource_property(Account, 'approval_status', readonly=True)
resource_property(Account, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(Account, 'timezone_switch_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(Account, 'created_at', readonly=True, transform=TRANSFORM.TIME)
resource_property(Account, 'updated_at', readonly=True, transform=TRANSFORM.TIME)
# writable
resource_property(Account, 'account_name')
resource_property(Account, 'industry_type')
Exemplo n.º 19
0
    def scheduled_promoted_tweets(self, id=None, **kwargs):
        """
        Returns a collection of Scheduled Promoted Tweets available to the current account.
        """
        return self._load_resource(ScheduledPromotedTweet, id, **kwargs)

    def cards(self, id=None, **kwargs):
        """
        Returns a collection of Cards available to the current account.
        """
        return self._load_resource(Card, id, **kwargs)


# account properties
resource_property(Account, 'id', readonly=True)
resource_property(Account, 'name', readonly=True)
resource_property(Account, 'salt', readonly=True)
resource_property(Account, 'timezone', readonly=True)
resource_property(Account, 'approval_status', readonly=True)
resource_property(Account, 'deleted', readonly=True, transform=TRANSFORM.BOOL)
resource_property(Account,
                  'timezone_switch_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(Account,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(Account,
                  'updated_at',
        self._validate_loaded()
        return TailoredAudienceTargeted.all(self.account, self.id, **kwargs)

    def __create_audience__(self, name):
        params = {'name': name}
        resource = self.RESOURCE_COLLECTION.format(account_id=self.account.id)
        response = Request(self.account.client,
                           'post',
                           resource,
                           params=params).perform()
        return self.from_response(response.body['data'])


# tailored audience properties
# read-only
resource_property(TailoredAudience, 'id', readonly=True)
resource_property(TailoredAudience,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TailoredAudience,
                  'updated_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(TailoredAudience,
                  'deleted',
                  readonly=True,
                  transform=TRANSFORM.BOOL)
resource_property(TailoredAudience, 'audience_size', readonly=True)
resource_property(TailoredAudience, 'audience_type', readonly=True)
resource_property(TailoredAudience, 'partner_source', readonly=True)
Exemplo n.º 21
0
from twitter_ads.enum import TRANSFORM
from twitter_ads.resource import resource_property, Resource, Persistence, Analytics
from twitter_ads.http import Request


class PromotedAccount(Resource, Persistence):

    PROPERTIES = {}

    RESOURCE_COLLECTION = '/1/accounts/{account_id}/promoted_accounts'
    RESOURCE = '/1/accounts/{account_id}/promoted_accounts/{id}'


# promoted account properties
# read-only
resource_property(PromotedAccount, 'id', readonly=True)
resource_property(PromotedAccount, 'approval_status', readonly=True)
resource_property(PromotedAccount,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(PromotedAccount,
                  'updated_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(PromotedAccount,
                  'deleted',
                  readonly=True,
                  transform=TRANSFORM.BOOL)
# writable
resource_property(PromotedAccount, 'line_item_id')
Exemplo n.º 22
0
        params = {
            'entity': entity,
            'start_time': to_time(start_time, None),
            'end_time': to_time(end_time, None)
        }
        params.update(kwargs)

        resource = klass.RESOURCE_ACTIVE_ENTITIES.format(account_id=account.id)
        response = Request(account.client, 'get', resource,
                           params=params).perform()
        return response.body['data']


# Analytics properties
# read-only
resource_property(Analytics, 'id', readonly=True)
resource_property(Analytics, 'id_str', readonly=True)
resource_property(Analytics, 'status', readonly=True)
resource_property(Analytics, 'url', readonly=True)
resource_property(Analytics,
                  'created_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(Analytics,
                  'expires_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)
resource_property(Analytics,
                  'updated_at',
                  readonly=True,
                  transform=TRANSFORM.TIME)