Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Edit wms datasets #66

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions clone_dataset/clone_dataset_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
def create_headers():
return {
'content-type': "application/json",
'authorization': "{}".format(os.getenv('apiToken')),
'authorization': f'Bearer {API_TOKEN}',
}

def clone_ds(self, token=None, enviro='preproduction', clone_server=None, dataset_params=None, clone_children=True, clone_first_layer_only=True, clone_default_widget_only=True, published = False):
Expand Down Expand Up @@ -265,4 +265,11 @@ def clone_ds(self, token=None, enviro='preproduction', clone_server=None, datase
}
# Clone dataset
new_dataset_id = clone_ds(dataset_to_copy, token=API_TOKEN, enviro='production', dataset_params=clone_attributes, clone_children=True, clone_first_layer_only=clone_first_layer_only, clone_default_widget_only=clone_default_widget_only)
print('new dataset API ID:' + new_dataset_id)
print('new dataset API ID:' + new_dataset_id)


# Delete dataset and all its layers/widgets (By default this will delete the new dataset you just created)
#delete_dataset_id = new_dataset_id
#dataset_to_delete = LMIPy.Dataset(delete_dataset_id)
#delete_url = f'{dataset_to_delete.server}/v1/dataset/{dataset_to_delete.id}'
#requests.delete(delete_url, headers=create_headers())
124 changes: 124 additions & 0 deletions edit_datasets/edit_wms_dataset.py
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This edit_dataset script is not on the same level as the other edit_layer scripts. It should be the same for WMS/GEE/Carto to update any dataset fields. The differences are in the layer fields. I'm thinking about creating two scripts, one for updating dataset fields (could be used for all datasets), and the other for updating WMS layer fields. What do you think?

Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import os
import requests
import json

API_TOKEN = os.getenv('RW_API_KEY')

def create_headers():
return {
'content-type': "application/json",
'authorization': "{}".format(os.getenv('apiToken')),
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use the same format as the other update? 'authorization': f'Bearer {API_TOKEN}'

}

# Start with a dataset you cloned to make sure everything works
cloned_dataset = ['']
cloned_layer = ['']

# Add your real datasets here. Don't uncomment until you have tested.
datasets = ['', '']

# Choose the field you want to find and replace in, the value to fine, and what to replace it with
dataset_field = 'connectorUrl'
layer_field = 'layerConfig'
find = ''
replace = ''

# Don't actually to anything yet
dry_run = True

# Use test dataset
test_run = True

if test_run:
datasets = cloned_dataset

# Print out what we are doing
print(f'Replacing "{find}" with "{replace}" in `{dataset_field}`.')


# Loop through datasets to find and replace values
for dataset_id in datasets:
current_url = f'https://api.resourcewatch.org/v1/dataset/{dataset_id}/?includes=layer'
print(f'DATASET URL: {current_url}')
with requests.get(current_url) as r:
if r.ok:
ds = json.loads(r.content)
else:
raise ValueError(f'API request failed: {current_url}')
assert 'data' in ds

name = ds['data']['attributes']['name']
print(f'DATASET NAME: {name}')

old_value = ds['data']['attributes'][dataset_field]
new_value = old_value.replace(find, replace)

find_count = old_value.count(find)
replace_count = new_value.count(replace)

print(f'\nOLD VALUE: {old_value}')
print(f'\nNEW VALUE: {new_value}')

print(f'\nStarted with {find_count} instances of "{find}" and ended up with {replace_count} instances of "{replace}".')

update = json.dumps({dataset_field: new_value})

if dry_run == False:
with requests.patch(current_url, headers=create_headers(), data=update) as r:
if r.ok:
print('\nDONE')
else:
raise ValueError(f'API request failed: {current_url}')
assert 'data' in ds
else:
print('\nDRY RUN')




# Layers
layers = [item["id"] for item in ds['data']['attributes']['layer']]
if test_run:
layers = cloned_layer

for layer_id in layers:
current_url = f'https://api.resourcewatch.org/v1/dataset/{dataset_id}/layer/{layer_id}'
print(f'LAYER URL: {current_url}')
with requests.get(current_url) as r:
if r.ok:
ly = json.loads(r.content)
else:
raise ValueError(f'API request failed: {current_url}')
assert 'data' in ly

name = ly['data']['attributes']['name']
print(f'LAYER NAME: {name}')

old_value = ly['data']['attributes']['layerConfig']
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace ['layerConfig'] with [layer_field]?


#Convert to string and replace
old_str = json.dumps(old_value)
find_count = old_str.count(find)

new_str = old_str.replace(find, replace)
replace_count = new_str.count(replace)

#Get obj back with replacement
new_value = json.loads(new_str)

print(f'\nOLD VALUE: {old_value}')
print(f'\nNEW VALUE: {new_value}')

print(f'\nStarted with {find_count} instances of "{find}" and ended up with {replace_count} instances of "{replace}".')

update = json.dumps({layer_field: new_value})

if dry_run == False:
with requests.patch(current_url, headers=create_headers(), data=update) as r:
if r.ok:
print('\nDONE')
else:
raise ValueError(f'API request failed: {current_url}')
assert 'data' in ds
else:
print('\nDRY RUN')