class Stats(object):
"""
Object for building query params for a global email statistics request
"""
def __init__(
self, start_date=None):
"""Create a Stats object
:param start_date: Date of when stats should begin in YYYY-MM-DD format, defaults to None
:type start_date: string, optional
"""
self._start_date = None
self._end_date = None
self._aggregated_by = None
self._sort_by_metric = None
self._sort_by_direction = None
self._limit = None
self._offset = None
# Minimum required for stats
if start_date:
self.start_date = start_date
def __str__(self):
"""Get a JSON representation of this object.
:rtype: string
"""
return str(self.get())
def get(self):
"""
Get a JSON-ready representation of Stats
:returns: This GlobalStats, ready for use in a request body.
:rtype: response stats dict
"""
stats = {}
if self.start_date is not None:
stats["start_date"] = self.start_date
if self.end_date is not None:
stats["end_date"] = self.end_date
if self.aggregated_by is not None:
stats["aggregated_by"] = self.aggregated_by
if self.sort_by_metric is not None:
stats["sort_by_metric"] = self.sort_by_metric
if self.sort_by_direction is not None:
stats["sort_by_direction"] = self.sort_by_direction
if self.limit is not None:
stats["limit"] = self.limit
if self.offset is not None:
stats["offset"] = self.offset
return stats
@property
def start_date(self):
"""Date of when stats should begin in YYYY-MM-DD format
:rtype: string
"""
return self._start_date
@start_date.setter
def start_date(self, value):
"""Date of when stats should begin in YYYY-MM-DD format
:param value: Date representing when stats should begin
:type value: string
"""
self._start_date = value
@property
def end_date(self):
"""Date of when stats should end in YYYY-MM-DD format
:rtype: string
"""
return self._end_date
@end_date.setter
def end_date(self, value):
"""Date of when stats should end in YYYY-MM-DD format
:param value: Date representing when stats should end
:type value: string
"""
self._end_date = value
@property
def aggregated_by(self):
"""Chosen period (e.g. 'day', 'week', 'month') for how stats get grouped
:rtype: string
"""
return self._aggregated_by
@aggregated_by.setter
def aggregated_by(self, value):
"""Chosen period (e.g. 'day', 'week', 'month') for how stats get grouped
:param value: Period for how keys will get formatted
:type value: string
"""
self._aggregated_by = value
@property
def sort_by_metric(self):
"""Metric to sort stats by
:rtype: string
"""
return self._sort_by_metric
@sort_by_metric.setter
def sort_by_metric(self, value):
"""Metric to sort stats by
:param value: Chosen metric stats will by sorted by
:type value: string
"""
self._sort_by_metric = value
@property
def sort_by_direction(self):
"""Direction data will be sorted, either 'asc' or 'desc'
:rtype: string
"""
return self._sort_by_direction
@sort_by_direction.setter
def sort_by_direction(self, value):
"""Direction data will be sorted, either 'asc' or 'desc'
:param value: Direction of data, either 'asc' or 'desc'
:type value: string
"""
self._sort_by_direction = value
@property
def limit(self):
"""Max amount of results to be returned
:rtype: int
"""
return self._limit
@limit.setter
def limit(self, value):
"""Max amount of results to be returned
:param value: Max amount of results
:type value: int
"""
self._limit = value
@property
def offset(self):
"""Number of places a starting point of a data set will move
:rtype: int
"""
return self._offset
@offset.setter
def offset(self, value):
"""Number of places a starting point of a data set will move
:param value: Number of positions to move from starting point
:type value: int
"""
self._offset = value
class CategoryStats(Stats):
"""
object for building query params for a category statistics request
"""
def __init__(self, start_date=None, categories=None):
"""Create a CategoryStats object
:param start_date: Date of when stats should begin in YYYY-MM-DD format, defaults to None
:type start_date: string, optional
:param categories: list of categories to get results of, defaults to None
:type categories: list(string), optional
"""
self._categories = None
super(CategoryStats, self).__init__()
# Minimum required for category stats
if start_date and categories:
self.start_date = start_date
for cat_name in categories:
self.add_category(Category(cat_name))
def get(self):
"""
Get a JSON-ready representation of this CategoryStats.
:return: response category stats dict
"""
stats = {}
if self.start_date is not None:
stats["start_date"] = self.start_date
if self.end_date is not None:
stats["end_date"] = self.end_date
if self.aggregated_by is not None:
stats["aggregated_by"] = self.aggregated_by
if self.sort_by_metric is not None:
stats["sort_by_metric"] = self.sort_by_metric
if self.sort_by_direction is not None:
stats["sort_by_direction"] = self.sort_by_direction
if self.limit is not None:
stats["limit"] = self.limit
if self.offset is not None:
stats["offset"] = self.offset
if self.categories is not None:
stats['categories'] = [category.get() for category in
self.categories]
return stats
@property
def categories(self):
"""List of categories
:rtype: list(Category)
"""
return self._categories
def add_category(self, category):
"""Appends a category to this object's category list
:param category: Category to append to CategoryStats
:type category: Category
"""
if self._categories is None:
self._categories = []
self._categories.append(category)
class SubuserStats(Stats):
"""
object of building query params for a subuser statistics request
"""
def __init__(self, start_date=None, subusers=None):
"""Create a SubuserStats object
:param start_date: Date of when stats should begin in YYYY-MM-DD format, defaults to None
:type start_date: string, optional
:param subusers: list of subusers to get results of, defaults to None
:type subusers: list(string), optional
"""
self._subusers = None
super(SubuserStats, self).__init__()
# Minimum required for subusers stats
if start_date and subusers:
self.start_date = start_date
for subuser_name in subusers:
self.add_subuser(Subuser(subuser_name))
def get(self):
"""
Get a JSON-ready representation of this SubuserStats.
:return: response subuser stats dict
"""
stats = {}
if self.start_date is not None:
stats["start_date"] = self.start_date
if self.end_date is not None:
stats["end_date"] = self.end_date
if self.aggregated_by is not None:
stats["aggregated_by"] = self.aggregated_by
if self.sort_by_metric is not None:
stats["sort_by_metric"] = self.sort_by_metric
if self.sort_by_direction is not None:
stats["sort_by_direction"] = self.sort_by_direction
if self.limit is not None:
stats["limit"] = self.limit
if self.offset is not None:
stats["offset"] = self.offset
if self.subusers is not None:
stats['subusers'] = [subuser.get() for subuser in
self.subusers]
return stats
@property
def subusers(self):
"""List of subusers
:rtype: list(Subuser)
"""
return self._subusers
def add_subuser(self, subuser):
"""Appends a subuser to this object's subuser list
:param subuser: Subuser to append to SubuserStats
:type subuser: Subuser
"""
if self._subusers is None:
self._subusers = []
self._subusers.append(subuser)
class Category(object):
"""
Represents a searchable statistics category to be used in a CategoryStats object
"""
def __init__(self, name=None):
"""Create a Category object
:param name: name of category, defaults to None
:type name: string, optional
"""
self._name = None
if name is not None:
self._name = name
@property
def name(self):
"""Get name of category
:rtype: string
"""
return self._name
@name.setter
def name(self, value):
"""Set name of category
:param value: name of the statistical category
:type value: string
"""
self._name = value
def get(self):
"""
Get a string representation of Category.
:return: string of the category's name
"""
return self.name
class Subuser(object):
"""
Represents a searchable subuser to be used in a SubuserStats object
"""
def __init__(self, name=None):
"""Create a Subuser object
:param name: name of subuser, defaults to None
:type name: string, optional
"""
self._name = None
if name is not None:
self._name = name
@property
def name(self):
"""Get name of the subuser
:rtype: string
"""
return self._name
@name.setter
def name(self, value):
"""Set name of the subuser
:param value: name of the subuser
:type value: string
"""
self._name = value
def get(self):
"""
Get a string representation of Subuser.
:return: string of the subuser's name
"""
return self.name