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

Add scripts for fetching/extracting contacts from RapidPro, and uploading to Turn #521

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
50 changes: 50 additions & 0 deletions scripts/rapidpro_to_turn/extract_rapidpro_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import argparse
from urllib.parse import urlencode, urljoin

import requests


def get_arguments():
parser = argparse.ArgumentParser(
description="Fetches all the whatsapp IDs of a group of contacts"
)
parser.add_argument(
"--url",
help="The base URL for the rapidpro instance",
default="https://rapidpro.prd.momconnect.co.za/",
)
parser.add_argument("token", help="Authorization token for RapidPro")
parser.add_argument("group", help="The group to fetch contacts for")
return parser.parse_args()


def format_urn(urn: str):
_, path = urn.split(":")
return path


def fetch_contacts(url, token, group):
url = urljoin(url, "/api/v2/contacts.json")
query = urlencode({"group": group})
next_ = f"{url}?{query}"

while next_:
response = requests.get(
next_,
headers={"Authorization": f"Token {token}", "Accept": "application/json"},
)
response.raise_for_status()
result = response.json()
next_ = result["next"]
for contact in result["results"]:
if contact["urns"]:
print(format_urn(contact["urns"][0]))


def main():
args = get_arguments()
fetch_contacts(args.url, args.token, args.group)


if __name__ == "__main__":
main()
31 changes: 31 additions & 0 deletions scripts/rapidpro_to_turn/extract_whatsapp_id_from_excel_export.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import argparse

from openpyxl import load_workbook


def get_arguments():
parser = argparse.ArgumentParser(
description="Extracts the whatsapp IDs from a rapidpro contacts export"
)
parser.add_argument("filename", help="Excel file to extract from")
return parser.parse_args()


def main():
args = get_arguments()
wb = load_workbook(args.filename, read_only=True)
ws = wb.active
for row in ws.iter_rows(min_row=1, max_row=1):
for cell in row:
if cell.value == "URN:Whatsapp":
urn_col = cell.column
break
break
for row in ws.iter_rows(min_row=2):
whatsapp_id = row[urn_col - 1].value
if whatsapp_id and whatsapp_id.isnumeric():
print(whatsapp_id)


if __name__ == "__main__":
main()
48 changes: 48 additions & 0 deletions scripts/rapidpro_to_turn/set_turn_contact_field.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import argparse
import sys
from urllib.parse import urljoin

import requests


def get_arguments():
parser = argparse.ArgumentParser(
description="Updates a contact field in Turn for all whatsapp IDs on stdin"
)
parser.add_argument(
"--url",
help="The base URL for the Turn instance",
default="https://whatsapp-praekelt-cloud.turn.io/",
)
parser.add_argument("token", help="Authorization token for Turn")
parser.add_argument("field", help="The contact field to set")
parser.add_argument("value", help="The value to set the contact field to")
return parser.parse_args()


def update_contact(url, token, field, value, whatsapp_id):
url = urljoin(url, f"/v1/contacts/{whatsapp_id}/profile")
response = requests.patch(
url,
json={field: value},
headers={
"Accept": "application/vnd.v1+json",
"Authorization": f"Bearer {token}",
},
)
if not response.ok:
print(f"Error updating {whatsapp_id}")
print(response.status_code)
print(response.text)
else:
print(f"Updated {whatsapp_id}")


def main():
args = get_arguments()
for line in sys.stdin:
update_contact(args.url, args.token, args.field, args.value, line.strip())


if __name__ == "__main__":
main()