MediaMath / t1-python

Python SDK for MediaMath Platform APIs
https://developer.mediamath.com/
Apache License 2.0
18 stars 30 forks source link

'Unexpected error' when calling save_supplies on strategy instance #132

Closed robrechtdr closed 7 years ago

robrechtdr commented 7 years ago

Using version with latest commit https://github.com/MediaMath/t1-python/commit/09cdf1a6742b9a26ed07a40e39b96a3d0571f063.

The following previously (on commit state https://github.com/MediaMath/t1-python/commit/052c260eacf9111eab45ff4c3d3551e4f10fc04b) worked:

strat = t1.get('strategies', strategy['t1_id'], child='deals')

deals = {'deal.1.id': 151415}
strat.save_supplies(deals)

Traceback (most recent call last):
  File "/Users/rrouck/pi-automation-api/automation_api/runners.py", line 1110, in link_deals
    strat.save_supplies(deals)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 208, in save_supplies
    self._save_related(data, url)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 215, in _save_related
    entity, _ = super(Strategy, self)._post(self._get_service_path(), url, data)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/connection.py", line 202, in _post
    return self._parse_response(response)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/connection.py", line 216, in _parse_response
    result = parser(response_body)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/jsonparser.py", line 45, in __init__
    self.get_status(parsed_data, body)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/jsonparser.py", line 98, in get_status
    raise exc(code=status_code, content=message)
APIError: 'error: Sorry, but an unexpected error has occurred.\n'

    {'strategy_id': 1970367, 'deal_id': 151415}
robrechtdr commented 7 years ago

Ah, I'm guessing I should now use save_deals instead as this seems to corresponds to the new api endpoint.

With save_deals:

Traceback (most recent call last):
  File "/Users/rrouck/pi-automation-api/automation_api/runners.py", line 1111, in link_deals
    strat.save_deals(deals)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 212, in save_deals
    self._save_related(data, url)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 216, in _save_related
    self._update_self(entity)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/entity.py", line 192, in _update_self
    setattr(self, key, value)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/entity.py", line 88, in __setattr__
    .format(attribute, self._pull[attribute]))
ClientError: 'key updated_on is invalid: must be of type <function strpt at 0x1066462a8>'

    {'strategy_id': 1970367, 'deal_id': 151415}

I'll just pass on an updated_on datetime value (but would make sense to be passed on from the SDK (or from T1 even ...)).

FodT commented 7 years ago

Thanks for following up on this - I'll definitely investigate both the errors which seem quite unintuitive.

robrechtdr commented 7 years ago

Tried {'updated_on': '2017-02-23T13:39:17', 'strategy_id': 19787, 'deal_id': 151415} (updated_on = datetime.datetime.now().strformat('%Y-%m-%dT%H:%M:%S')).

(just like in updated_on here: https://developer.mediamath.com/docs/read/execution_and_management_api/Using_Deals_With_Strategy_Entities)

Traceback (most recent call last):
  File "/Users/rrouck/pi-automation-api/automation_api/runners.py", line 1114, in link_deals
    strat.save_deals(deals)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 212, in save_deals
    self._save_related(data, url)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 216, in _save_related
    self._update_self(entity)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/entity.py", line 192, in _update_self
    setattr(self, key, value)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/entity.py", line 88, in __setattr__
    .format(attribute, self._pull[attribute]))
ClientError: 'key updated_on is invalid: must be of type <function strpt at 0x10d9bb2a8>'

{'updated_on': '2017-02-23T13:39:17', 'strategy_id': 1970367, 'deal_id': 151415}

Failed, so tried {'updated_on': datetime.datetime.now(), 'strategy_id': 19787, 'deal_id': 151415}

Traceback (most recent call last):
  File "/Users/rrouck/pi-automation-api/automation_api/runners.py", line 1115, in link_deals
    strat.save_deals(deals)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 212, in save_deals
    self._save_related(data, url)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/models/strategy.py", line 216, in _save_related
    self._update_self(entity)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/entity.py", line 192, in _update_self
    setattr(self, key, value)
  File "/Users/rrouck/.virtualenvs/pi-automation-api-t1lastw/lib/python2.7/site-packages/terminalone/entity.py", line 88, in __setattr__
    .format(attribute, self._pull[attribute]))
ClientError: 'key updated_on is invalid: must be of type <function strpt at 0x110b972a8>'

    {'updated_on': datetime.datetime(2017, 2, 23, 13, 45, 39, 983603), 'strategy_id': 1970367, 'deal_id': 151415}
robrechtdr commented 7 years ago

Found problem:

strat.save_deals() -> _save_related() -> _post()

Problem arises in _post on the following line https://github.com/MediaMath/t1-python/blob/09cdf1a6742b9a26ed07a40e39b96a3d0571f063/terminalone/connection.py#L201:

> response.json()
{u'meta': {u'called_on': u'2017-02-23T15:35:06+0000', u'status': u'ok', u'etag': u'e97184918561177f97ff5cde14635a270c81854f'}, u'data': {u'site_selectiveness': u'REDUCED', u'impression_pacing_type':u'no-limit', u'site_restriction_transparent_urls': True, u'campaign_id': 334965, u'budget': [{u'value': 417.07, u'currency_code': u'EUR'}], u'created_on': u'2017-02-23T12:34:07+0000', u'goal_value':[{
u'value': 10, u'currency_code': u'EUR'}], u'bid_price_is_media_only': True, u'zone_name': u'America/New_York', u'frequency_interval': u'day', u'id': 1970367, u'pacing_amount': [{u'value': 23.17, u'cu
rrency_code': u'EUR'}], u'deals': [{u'id': u'151415', u'entity_type': u'deal'}], u'entity_type': u'strategy', u'min_bid': [{u'value': 0, u'currency_code': u'EUR'}], u'version': 2, u'frequency_type':
u'asap', u'use_mm_freq': False, u'media_type': u'VIDEO', u'supply_type': u'RTB', u'impression_pacing_interval': u'day', u'goal_type': u'spend', u'targeting_segment_exclude_op': u'OR', u'status': True
, u'use_optimization': False, u'targeting_segment_include_op': u'OR', u'pixel_target_expr': u'', u'run_on_display': True, u'run_on_all_exchanges': False, u'effective_goal_value': [{u'value': u'10.000
0', u'currency_code': u'EUR'}], u'run_on_streaming': False, u'use_campaign_end': True, u'name': u'NATIONAL', u'audience_segment_exclude_op': u'OR', u'use_campaign_start': True, u'run_on_all_pmp': Fal
se, u'bid_aggressiveness': 50, u'type': u'AUD', u'pacing_interval': u'day', u'frequency_amount': 4, u'max_bid': [{u'value': 2.09, u'currency_code': u'EUR'}], u'frequency_optimization': False, u'audience_segment_include_op': u'OR', u'pacing_type': u'asap', u'updated_on': u'now', u'run_on_mobile': True, u'currency_code': u'EUR'}}

Value for updated_on is now instead of a datetime string.

FodT commented 7 years ago

Resolved by #134