def get(self, **kwargs): """ Args: campaign (int) website (int) limit (int) offset (int) order_by (list of str) """ ordering = { 'order_by': kwargs.get('order_by', []), 'available': self.ORDERING } filtering = { 'filter_by': kwargs, 'available': { 'campaign': lambda x: Item.sanitize_integer_value( x, 'campaign', blank=True), 'website': lambda x: Item.sanitize_integer_value( x, 'campaign', blank=True), } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_ordering(ordering) \ .set_filtering(filtering) \ .request(url=self.URL)
class ActionOptCodesManager(BaseOptCodesManager): CREATE_URL = Item.prepare_url('opt_codes/action/create') UPDATE_URL = Item.prepare_url('opt_codes/action/update/%(optcode_id)s') CREATE_FIELDS = { 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True), 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), 'desc_mode': lambda x: Item.sanitize_integer_value(x, 'desc_mode'), 'url': lambda x: Item.sanitize_string_value(x, 'url'), 'method': lambda x: Item.sanitize_integer_value(x, 'method'), 'action_type': lambda x: Item.sanitize_integer_value(x, 'action_type'), 'status': lambda x: Item.sanitize_integer_value(x, 'status'), } UPDATE_FIELDS = { 'desc_mode': lambda x: Item.sanitize_integer_value(x, 'desc_mode', blank=True), 'url': lambda x: Item.sanitize_string_value(x, 'url', blank=True), 'method': lambda x: Item.sanitize_integer_value(x, 'method', blank=True), 'action_type': lambda x: Item.sanitize_integer_value(x, 'action_type', blank=True), 'status': lambda x: Item.sanitize_integer_value(x, 'status', blank=True), }
def get(self, **kwargs): """ Args: campaign (id) website (id) status (string) start_date (date) end_date (date) appeal_id (string) appeal_status (string) limit (int) offset (int) """ filtering = { 'filter_by': kwargs, 'available': { 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True), 'status': lambda x: Item.sanitize_string_value(x, 'status', blank=True), 'start_date': lambda x: Item.sanitize_string_value(x, 'start_date', blank=True), 'end_date': lambda x: Item.sanitize_string_value(x, 'end_date', blank=True), 'appeal_id': lambda x: Item.sanitize_string_value(x, 'appeal_id', blank=True), 'appeal_status': lambda x: Item.sanitize_string_value(x, 'appeal_status', blank=True), } } return self.transport.get() \ .set_filtering(filtering) \ .set_pagination(**kwargs) \ .request(url=self.URL)
def get(self, **kwargs): """ Args: campaign (int) website (int) limit (int) offset (int) order_by (list of str) """ ordering = { 'order_by': kwargs.get('order_by', []), 'available': self.ORDERING } filtering = { 'filter_by': kwargs, 'available': { 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), 'website': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_ordering(ordering) \ .set_filtering(filtering) \ .request(url=self.URL)
class StatisticKeywords(StatisticBase): """ Statistics by keywords """ SCOPE = 'statistics' ORDERING = ( 'actions', 'clicks', 'cr', 'ecpc', 'keyword', 'leads', 'payment_sum', 'payment_sum_approved', 'payment_sum_declined', 'payment_sum_open', 'sales', 'source', ) FILTERING = { 'date_start': lambda x: Item.sanitize_date(x, 'date_start', blank=True), 'date_end': lambda x: Item.sanitize_date(x, 'date_end', blank=True), 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True), 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), 'source': StatisticBase.check_sources, } URL = Item.prepare_url('statistics/keywords') def get(self, **kwargs): """ Args: date_start (date) date_end (date) website (int) campaign (int) source (str) limit (int) offset (int) order_by (list of str) """ return super(StatisticKeywords, self).get(self.URL, **kwargs)
class TicketsManager(Item): SCOPE = 'manage_tickets' CREATE_URL = Item.prepare_url('tickets/create') COMMENT_URL = Item.prepare_url('tickets/%(ticket_id)s/create') CREATE_FIELDS = { 'subject': lambda x: Item.sanitize_string_value(x, 'subject'), 'text': lambda x: Item.sanitize_string_value(x, 'text'), 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign'), 'category': lambda x: Item.sanitize_integer_value(x, 'category'), 'priority': lambda x: Item.sanitize_integer_value(x, 'priority'), } COMMENT_FIELDS = { 'text': lambda x: Item.sanitize_string_value(x, 'text'), } def create(self, **kwargs): """ Args: subject (str) text (str) campaign (int) category (int) priority (int) """ data = Item.sanitize_fields(self.CREATE_FIELDS, **kwargs) return self.transport.post().set_data(data).request(url=self.CREATE_URL) def comment(self, ticket_id, **kwargs): """ Args: ticket_id (int) text (str) """ request_data = { 'url': self.COMMENT_URL, 'ticket_id': Item.sanitize_id(ticket_id) } data = Item.sanitize_fields(self.COMMENT_FIELDS, **kwargs) return self.transport.post().set_data(data).request(**request_data)
def get(self, **kwargs): """ Args: website (list of int) campaign (list of int) search (str) reason (int) date_start (date) date_end (date) limit (int) offset (int) """ filtering = { 'filter_by': kwargs, 'available': { 'website': lambda x: Item.sanitize_integer_array(x, 'website', blank=True), 'campaign': lambda x: Item.sanitize_integer_array(x, 'campaign', blank=True), 'search': lambda x: Item.sanitize_string_value(x, 'search', blank=True), 'reason': lambda x: Item.sanitize_integer_value(x, 'reason', blank=True), 'date_start': lambda x: Item.sanitize_date(x, 'date_start', blank=True), 'date_end': lambda x: Item.sanitize_date(x, 'date_end', blank=True), } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_filtering(filtering) \ .request(url=self.URL)
def get(self, _id, w_id, **kwargs): """ Here _id is an id of advertising campaign and w_id is a id of website Args: _id (int) w_id (int) mobile_content (bool) landing (int) uri_scheme (str) limit (int) offset (int) """ request_data = { 'url': self.URL, 'campaign_id': Item.sanitize_id(_id), 'website_id': Item.sanitize_id(w_id) } filtering = { 'filter_by': kwargs, 'available': { 'mobile_content': lambda x: Item.sanitize_bool_value(x, blank=True), 'landing': lambda x: Item.sanitize_integer_value(x, 'landing', blank=True), 'uri_scheme': lambda x: Item.sanitize_string_value(x, 'uri_scheme', blank=True) } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_filtering(filtering) \ .request(**request_data)
def get(self, **kwargs): """ Args: website (int) has_tool (list of str) limit (int) offset (int) language (str) """ filtering = { 'filter_by': kwargs, 'available': { 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True ), 'has_tool': lambda x: Item.sanitize_string_array(x, 'has_tool', blank=True ), 'language': lambda x: Item.sanitize_string_value(x, 'language', blank=True ), } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_filtering(filtering) \ .request(url=self.URL)
def get(self, **kwargs): """ Args: website (int) active (bool) limit (int) offset (int) """ filtering = { 'filter_by': kwargs, 'available': { 'website': lambda x: Item.sanitize_integer_value(x, 'website', True), 'active': lambda x: Item.sanitize_bool_integer_value(x, 'active', True) } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_filtering(filtering) \ .request(url=self.URL)
def test_sanitize_fields(self): fields = { 'field1': lambda x: Item.sanitize_non_blank_value(x, ''), 'field2': lambda x: Item.sanitize_integer_value(x, ''), 'field3': lambda x: Item.sanitize_string_value(x, '', blank=True), } data = Item.sanitize_fields(fields, field1='foobarbaz', field2=42, field3='') self.assertDictEqual(data, { 'field1': 'foobarbaz', 'field2': 42, 'field3': '' }) data = Item.sanitize_fields(fields, field1='foobarbaz', field2=42, field3='', field4='another') self.assertDictEqual(data, { 'field1': 'foobarbaz', 'field2': 42, 'field3': '' })
def get(self, **kwargs): """ Args: date_start (date) date_end (date) status (int) limit (int) offset (int) """ filtering = { 'filter_by': kwargs, 'available': { 'date_start': lambda x: Item.sanitize_date(x, 'date_start', True), 'date_end': lambda x: Item.sanitize_date(x, 'date_end', True), 'status': lambda x: Item.sanitize_integer_value(x, 'status', True), } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_filtering(filtering) \ .request(url=self.URL)
def get(self, **kwargs): """ Args: website (int) has_tool (list of str) limit (int) offset (int) language (str) """ filtering = { 'filter_by': kwargs, 'available': { 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True), 'has_tool': lambda x: Item.sanitize_string_array(x, 'has_tool', blank=True), 'language': lambda x: Item.sanitize_string_value(x, 'language', blank=True), } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_filtering(filtering) \ .request(url=self.URL)
def get(self, **kwargs): """ Args: website (list of int) campaign (list of int) search (str) reason (int) date_start (date) date_end (date) limit (int) offset (int) """ filtering = { 'filter_by': kwargs, 'available': { 'website': lambda x: Item.sanitize_integer_array(x, 'website', blank=True ), 'campaign': lambda x: Item.sanitize_integer_array( x, 'campaign', blank=True), 'search': lambda x: Item.sanitize_string_value(x, 'search', blank=True), 'reason': lambda x: Item.sanitize_integer_value(x, 'reason', blank=True), 'date_start': lambda x: Item.sanitize_date(x, 'date_start', blank=True), 'date_end': lambda x: Item.sanitize_date(x, 'date_end', blank=True), } } return self.transport.get() \ .set_pagination(**kwargs) \ .set_filtering(filtering) \ .request(url=self.URL)
class LostOrdersManager(Item): SCOPE = 'manage_lost_orders' DELETE_URL = Item.prepare_url('lost_orders/%(lost_order_id)s/decline') CREATE_URL = Item.prepare_url('lost_orders/create') UPDATE_URL = Item.prepare_url('lost_orders/%(lost_order_id)s/update') CREATE_FIELDS = { 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign'), 'website': lambda x: Item.sanitize_integer_value(x, 'website'), 'order_id': lambda x: Item.sanitize_string_value(x, 'order_id'), 'order_date': lambda x: Item.sanitize_date(x, 'order_date'), 'order_price': lambda x: Item.sanitize_float_value(x, 'order_price'), 'comment': lambda x: Item.sanitize_string_value(x, 'comment'), 'appeal_id': lambda x: Item.sanitize_string_value(x, 'appeal_id'), } def delete(self, lost_order_id): """ Args: lost_order_id (int) """ request_data = { 'url': self.DELETE_URL, 'lost_order_id': Item.sanitize_id(lost_order_id), } return self.transport.delete().request(**request_data) def create(self, attachments, **kwargs): """ Args: attachments (list of str) campaign (int) website (int) order_id (str) order_date (date) order_price (float) appeal_id (str) comment (str) """ data = Item.sanitize_fields(self.CREATE_FIELDS, **kwargs) files = [('attachment', open(item, 'rb')) for item in Item.sanitize_string_array(attachments, 'attachments')] return self.transport.post().set_data(data).set_files(files).request(url=self.CREATE_URL) def update(self, lost_order_id, appeal_status): """ Args: lost_order_id (int) appeal_status (str) """ request_data = { 'url': self.UPDATE_URL, 'lost_order_id': Item.sanitize_id(lost_order_id), } data = { 'appeal_status': self.sanitize_string_value(appeal_status, 'appeal_status'), } return self.transport.put().set_data(data).request(**request_data)
def test_sanitize_integer_value(self): self.assertEqual(Item.sanitize_integer_value(2, '', False), 2) self.assertEqual(Item.sanitize_integer_value(0, '', False), 0) self.assertEqual(Item.sanitize_integer_value(None, '', True), None) self.assertEqual(Item.sanitize_integer_value(2**64, '', False), 2**64) self.assertEqual(Item.sanitize_integer_value('64', '', False), '64') with self.assertRaises(ValueError): Item.sanitize_integer_value(None, '', False) Item.sanitize_integer_value(3.14, '', False) Item.sanitize_integer_value('foo', '', False)
class WebsitesManage(Item): """ Manage websites """ SCOPE = 'manage_websites' CREATE_URL = Item.prepare_url('website/create') UPDATE_URL = Item.prepare_url('website/update/%(website_id)s') VERIFY_URL = Item.prepare_url('website/verify/%(website_id)s') DELETE_URL = Item.prepare_url('website/delete/%(website_id)s') CREATE_FIELDS = { 'name': lambda x: Item.sanitize_string_value( x, 'name', max_length=200), 'kind': lambda x: Item.sanitize_string_value( x, 'kind', max_length=20), 'language': lambda x: Item.sanitize_string_value( x, 'language', max_length=2), 'adservice': lambda x: Item.sanitize_integer_value( x, 'adservice', blank=True), 'site_url': lambda x: Item.sanitize_string_value( x, 'site_url', max_length=255), 'description': lambda x: Item.sanitize_string_value( x, 'description', max_length=20000, min_length=100), 'categories': lambda x: Item.sanitize_integer_array( x, 'categories'), 'regions': lambda x: Item.sanitize_string_array( x, 'regions', max_length=2), 'mailing_targeting': lambda x: Item.sanitize_bool_integer_value( x, 'mailing_targeting', blank=True) } UPDATE_FIELDS = { 'name': lambda x: Item.sanitize_string_value( x, 'name', max_length=200, blank=True), 'kind': lambda x: Item.sanitize_string_value( x, 'kind', max_length=20, blank=True), 'language': lambda x: Item.sanitize_string_value( x, 'language', max_length=2, blank=True), 'adservice': lambda x: Item.sanitize_integer_value( x, 'adservice', blank=True), 'site_url': lambda x: Item.sanitize_string_value( x, 'site_url', max_length=255, blank=True), 'description': lambda x: Item.sanitize_string_value( x, 'description', max_length=20000, min_length=100, blank=True), 'categories': lambda x: Item.sanitize_integer_array( x, 'categories', blank=True), 'regions': lambda x: Item.sanitize_string_array( x, 'regions', max_length=2, blank=True), 'mailing_targeting': lambda x: Item.sanitize_bool_integer_value( x, 'mailing_targeting', blank=True) } def create(self, **kwargs): """ Args: name (str) kind (str) language (str) adservice (int) site_url (str) description (str) categories (list of int) regions (list of str) mailing_targeting (bool) """ data = Item.sanitize_fields(self.CREATE_FIELDS, **kwargs) return self.transport.post().set_data(data).request(url=self.CREATE_URL) def update(self, _id, **kwargs): """ Args: _id (int) name (str) kind (str) language (str) adservice (int) site_url (str) description (str) categories (list of int) regions (list of str) mailing_targeting (bool) """ data = Item.sanitize_fields(self.UPDATE_FIELDS, **kwargs) request_data = { 'url': self.UPDATE_URL, 'website_id': Item.sanitize_id(_id) } return self.transport.post().set_data(data).request(**request_data) def verify(self, _id): """ Args: _id (int) """ request_data = { 'url': self.VERIFY_URL, 'website_id': Item.sanitize_id(_id) } return self.transport.post().request(**request_data) def delete(self, _id): """ Args: _id (int) """ request_data = { 'url': self.DELETE_URL, 'website_id': Item.sanitize_id(_id) } return self.transport.post().request(**request_data)
class RetagManager(Item): SCOPE = 'manage_webmaster_retag' CREATE_URL = Item.prepare_url('retag/create') UPDATE_URL = Item.prepare_url('retag/update/%(retag_id)s') DELETE_URL = Item.prepare_url('retag/delete/%(retag_id)s') CREATE_FIELDS = { 'website': lambda x: Item.sanitize_integer_value(x, 'website'), 'level': lambda x: Item.sanitize_integer_value(x, 'level'), 'active': lambda x: Item.sanitize_bool_integer_value(x, 'active', blank=True), 'script': lambda x: Item.sanitize_string_value(x, 'script'), 'comment': lambda x: Item.sanitize_string_value(x, 'comment', blank=True), } UPDATE_FIELDS = { 'level': lambda x: Item.sanitize_integer_value(x, 'level', blank=True), 'active': lambda x: Item.sanitize_bool_integer_value(x, 'active', blank=True), 'script': lambda x: Item.sanitize_string_value(x, 'script', blank=True), 'comment': lambda x: Item.sanitize_string_value(x, 'comment', blank=True), } def create(self, **kwargs): """ Args: website (int) level (int) active (bool) script (str) comment (str) """ data = Item.sanitize_fields(self.CREATE_FIELDS, **kwargs) return self.transport.post().set_data(data).request(url=self.CREATE_URL) def update(self, retag_id, **kwargs): """ Args: retag_id (int) level (int) active (bool) script (str) comment (str) """ request_data = { 'url': self.UPDATE_URL, 'retag_id': Item.sanitize_id(retag_id) } data = Item.sanitize_fields(self.UPDATE_FIELDS, **kwargs) return self.transport.post().set_data(data).request(**request_data) def delete(self, retag_id): """ Args: retag_id (int) """ request_data = { 'url': self.DELETE_URL, 'retag_id': Item.sanitize_id(retag_id) } return self.transport.post().request(**request_data)
class StatisticSubIds(StatisticBase): """ Statistics by sub-ids """ SCOPE = 'statistics' SUB_ID_NUMBERS = range(0, 5) ORDERING = ('actions', 'clicks', 'cr', 'ecpc', 'leads', 'payment_sum', 'payment_sum_approved', 'payment_sum_declined', 'payment_sum_open', 'sales') FILTERING = { 'date_start': lambda x: Item.sanitize_date(x, 'date_start', blank=True), 'date_end': lambda x: Item.sanitize_date(x, 'date_end', blank=True), 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True), 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), } URL = Item.prepare_url('statistics/sub_ids%(subid_number)s') def sanitize_sub_id_number(self, number): if number not in self.SUB_ID_NUMBERS: raise ValueError("Invalid subid number. '%s': %s" % (number, self.SUB_ID_NUMBERS)) def prepare_filtering(self, sub_id_number): params = copy(self.FILTERING) subid_params = dict([ ('subid%s' % (val or ''), StatisticBase.check_sub_id) for val in self.SUB_ID_NUMBERS if val != sub_id_number ]) params.update(subid_params) return params def prepare_ordering(self, sub_id_number): sub_id_name = 'subid%s' % (sub_id_number or '') return self.ORDERING + (sub_id_name, ) def get(self, sub_id_number=0, **kwargs): """ Here sub_id_number is subid number. It is allowed from 0 to 5 excluding. It just will send request to sub_ids, sub_ids1, sub_ids2, sub_ids3, sub_ids4 urls correspondingly. res = client.StatisticSubIds.get() res = client.StatisticSubIds.get(date_start='01.01.2013') res = client.StatisticSubIds.get(subid="ADS778") res = client.StatisticSubIds.get(subid1="ADS778", sub_id_number=2) res = client.StatisticSubIds.get(limit=2) """ self.sanitize_sub_id_number(sub_id_number) kwargs['url'] = self.URL % {'subid_number': sub_id_number or ''} ordering = { 'order_by': kwargs.get('order_by', []), 'available': self.prepare_ordering(sub_id_number) } filtering = { 'filter_by': kwargs, 'available': self.prepare_filtering(sub_id_number) } return self.transport.get() \ .set_pagination(**kwargs) \ .set_ordering(ordering) \ .set_filtering(filtering) \ .request(**kwargs)
class StatisticActions(StatisticBase): """ Statistics by actions """ SCOPE = 'statistics' ORDERING = ('action', 'banner', 'banner_id', 'campaign', 'cart', 'click_date', 'conv_time', 'datetime', 'payment', 'status', 'subid', 'subid1', 'subid2', 'subid3', 'subid4', 'website') FILTERING = { 'date_start': lambda x: Item.sanitize_date(x, 'date_start', blank=True), 'date_end': lambda x: Item.sanitize_date(x, 'date_end', blank=True), 'closing_date_start': lambda x: Item.sanitize_date(x, 'closing_date_start', blank=True), 'closing_date_end': lambda x: Item.sanitize_date(x, 'closing_date_end', blank=True), 'status_updated_start': lambda x: Item.sanitize_long_date( x, 'status_updated_start', blank=True), 'status_updated_end': lambda x: Item.sanitize_long_date(x, 'status_updated_end', blank=True), 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True), 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), 'subid': lambda x: StatisticBase.check_sub_id(x), 'subid1': lambda x: StatisticBase.check_sub_id(x), 'subid2': lambda x: StatisticBase.check_sub_id(x), 'subid3': lambda x: StatisticBase.check_sub_id(x), 'subid4': lambda x: StatisticBase.check_sub_id(x), 'source': lambda x: StatisticBase.check_sources(x), 'status': lambda x: StatisticBase.check_status(x), 'keyword': lambda x: Item.sanitize_string_value(x, 'keyword', blank=True), 'action': lambda x: Item.sanitize_string_value(x, 'action', blank=True), 'action_type': lambda x: StatisticBase.check_actions_type(x), 'action_id': lambda x: Item.sanitize_integer_value(x, 'action_id', blank=True), } URL = Item.prepare_url('statistics/actions') def get(self, **kwargs): """ Args: date_start (date) date_end (date) closing_date_start (date) closing_date_end (date) status_updated_start (date) status_updated_end (date) website (int) campaign (int) subid (str) subid1 (str) subid2 (str) subid3 (str) subid4 (str) source (str) status (int) keyword (str) action (str) action_type (str) action_id (int) limit (int) offset (int) order_by (list of int) """ return super(StatisticActions, self).get(self.URL, **kwargs)
class StatisticBase(Item): STATUSES = (1, 2, 3) SOURCES = ('g', 'y') ACTION_TYPES = ('lead', 'sale') ORDERING = ( 'action', 'clicks', 'cr', 'ctr', 'ecpc', 'ecpm', 'leads', 'name', 'payment_sum', 'payment_sum_approved', 'payment_sum_declined', 'payment_sum_open', 'sales', 'views', ) @staticmethod def check_sub_id(sub_id): return sub_id if len(sub_id) <= MAX_SUB_ID_LENGTH else None @staticmethod def check_sources(source): return source if source in StatisticBase.SOURCES else None, @staticmethod def check_status(status): return status if status in StatisticBase.STATUSES else None, @staticmethod def check_actions_type(action_type): return action_type if action_type in StatisticBase.ACTION_TYPES else None, FILTERING = { 'date_start': lambda x: Item.sanitize_date(x, 'date_start', blank=True), 'date_end': lambda x: Item.sanitize_date(x, 'date_end', blank=True), 'website': lambda x: Item.sanitize_integer_value(x, 'website', blank=True), 'campaign': lambda x: Item.sanitize_integer_value(x, 'campaign', blank=True), 'total': lambda x: Item.sanitize_integer_value(x, 'total', blank=True), 'subid': lambda x: StatisticBase.check_sub_id(x) } def get(self, url, **kwargs): """Base GET method""" kwargs['url'] = url ordering = { 'order_by': kwargs.get('order_by', []), 'available': self.ORDERING } filtering = { 'filter_by': kwargs, 'available': self.FILTERING, } return self.transport.get() \ .set_pagination(**kwargs) \ .set_ordering(ordering) \ .set_filtering(filtering) \ .request(**kwargs)