There are 2 dicts of params:
fb_config = {
"page_likes" : {
"page_id": "1111",
"metric": "page_fans",
"since": "2019-01-01 00:00:00",
"until": "2019-01-01 00:00:00",
"date_preset" : "yesterday",
"period": "day"},
"page_impressions" : {"page_id": "1111",
"metric": "page_impressions",
"since": "yesterday",
"until": "yesterday",
"date_preset" : "yesterday",
"period": "day"},
"page_engaged_users" : {"page_id": "1111",
"metric": "page_engaged_users",
"since": "today",
"until": "today",
"date_preset" : "yesterday",
"period": "day"}}
and
ga_config =
{
'view_id_123': {'view_id': '123',
'start_date': "2019-01-01 00:00:00",
'end_date': "2019-01-01 00:00:00",
'metrics': [{'expression': 'ga:sessions'}, {'expression':'ga:pageviews'}, {'expression':'ga:users'}, {'expression':'ga:bounces'},
{'expression':'ga:avgSessionDuration'}],
'dimensions': [{'name': 'ga:year'}, {'name': 'ga:userType'}, {'name': 'ga:sessionCount'}, {'name': 'ga:browser'},
{'name': 'ga:source'}]},
'view_id_456': {'view_id': '456',
'start_date': "today",
'end_date': "today",
'metrics': [{'expression': 'ga:bounces'}, {'expression':'ga:users'}],
'dimensions': [{'name': 'ga:mobileDeviceModel'}, {'name': 'ga:dataSource'}]},
'view_id_789': {'view_id': '789',
'start_date': "yesterday",
'end_date': "yesterday",
'metrics': [{'expression': 'ga:bounces'}, {'expression':'ga:users'}],
'dimensions': [{'name': 'ga:mobileDeviceModel'}, {'name': 'ga:dataSource'}]}
}
In the code I can't keep the params and want to pull them from a json file. After loading the file all the dates have to be converted from str to datetime format.
This process is accomlished through several loops:
for values in params.values():
if 'since' in values:
if values['since'] == 'today':
values['since'] = datetime.now()
elif values['since'] == 'yesterday':
values['since'] = datetime.now() - timedelta(1)
else:
values['since'] = dt.datetime.strptime(values['since'], '%Y-%m-%d %H:%M:%S')
for values in params.values():
if 'until' in y:
if values['until'] == 'today':
values['until'] = datetime.now()
elif values['until'] == 'yesterday':
values['until'] = datetime.now() - timedelta(1)
else:
values['until'] = dt.datetime.strptime(y['until'], '%Y-%m-%d %H:%M:%S')
for values in params.values():
if 'start_date' in values:
if values['start_date'] == 'today':
values['start_date'] = datetime.now()
elif values['start_date'] == 'yesterday':
values['start_date'] = datetime.now() - timedelta(1)
else:
values['start_date'] = dt.datetime.strptime(values['start_date'], '%Y-%m-%d %H:%M:%S')
for values in params.values():
if 'end_date' in values:
if values['end_date'] == 'today':
values['end_date'] = datetime.now()
elif values['end_date'] == 'yesterday':
values['end_date'] = datetime.now() - timedelta(1)
else:
values['end_date'] = dt.datetime.strptime(values['end_date'], '%Y-%m-%d %H:%M:%S')
But the code is really ugly and DRY is violated. Are there better ways to iterate through nested dics and change the values of the certain keys?