From 61673efc3653e8ad9076b42c4aaed7c5fd3bc3da Mon Sep 17 00:00:00 2001 From: Norm Rasmussen Date: Tue, 3 Jun 2025 14:29:23 -0400 Subject: [PATCH] Anthology script needs some reworking. --- "Scripts/API_Tests/\\" | 149 ++++++++++++++++++ Scripts/API_Tests/bulk_invite_and_props.py | 2 +- ...nowledgestate_removegroups_enrollgroups.py | 100 +----------- 3 files changed, 158 insertions(+), 93 deletions(-) create mode 100644 "Scripts/API_Tests/\\" diff --git "a/Scripts/API_Tests/\\" "b/Scripts/API_Tests/\\" new file mode 100644 index 00000000..8f233032 --- /dev/null +++ "b/Scripts/API_Tests/\\" @@ -0,0 +1,149 @@ +import requests +import pprint +import pandas as pd +import Apikeys +import time + +pp = pprint.PrettyPrinter(indent=4) +APIKEY = Apikeys.CHUBB +HEADERS = { + "accept": "application/json", + "X-Api-Key": APIKEY, +} +BASEURL = "https://api.northpass.com/v2/" +IMPORTFILE = "/Users/normrasmussen/Downloads/cisa-060225.csv" + + +def bulk_invite_and_group(): + """ + Bulk endpoint which invites new people and adds them to a group via this structure: + { + "email": "me@mac.com" + "groups": "GroupA" + } + + This function looks for the group in the CSV as well. + """ + df = pd.DataFrame() + data = pd.read_csv(IMPORTFILE) + groups = data["Group"].unique() + groups = list(groups) + print(groups) + for group in groups: + payload = "" + print(group) + tmp_group = data[data.Group == group] + people = list(tmp_group["Email"]) + group = str(tmp_group["Group"].unique())[2:-2] + print(f"Group --> {group} ... Amount of People --> {len(people)}") + url = f"{BASEURL}bulk/people" + if len(people) > 1500: + for chunk in range(0, len(people), 1500): + i = chunk + payload_1 = [] + i_to_add = people[i : i + 1500] + for person in i_to_add: + miniload = {"email": person, "groups": group} + payload_1.append(miniload) + print(f"The long length {group} payload has {len(payload_1)}") + payload = {"data": {"attributes": {"people": payload_1}}} + response = requests.post(url, headers=HEADERS, json=payload) + print(f"Completed. Status code is {response.status_code}") + else: + payload_1 = [] + for person in people: + miniload = {"email": person, "groups": group} + payload_1.append(miniload) + print(f"The {group} payload has {len(payload_1)}") + payload = {"data": {"attributes": {"people": payload_1}}} + response = requests.post(url, headers=HEADERS, json=payload) + print(f"Completed. Status code is {response.status_code}") + print(response.text) + print("Running add props from func...") + time.sleep(3) + add_props_from_func(people, data, group) + + +def add_props_from_func(people, data, group): + errorlist = [] + for learner_email in people: + agency_name = data.loc[data["Email"] == learner_email, "AgencyName"] + agname = str(agency_name.values)[2:-2] + print(f"Learner: {learner_email} --> Agency: {agname} from Group: {group}") + ppl_search = f"{BASEURL}people?filter[email][eq]={learner_email}" + ppl_response = requests.get(ppl_search, headers=HEADERS) + try: + ppl_data = ppl_response.json() + nextlink = ppl_data["links"] + learner_uuid = ppl_data["data"][0]["id"] + + # Now update the props + prop_url = f"{BASEURL}properties/people/bulk" + payload = { + "data": [ + { + "attributes": {"properties": {"agency_name": agname}}, + "id": learner_uuid, + "type": "person_properties", + } + ] + } + propresponse = requests.post(prop_url, json=payload, headers=HEADERS) + print(propresponse.status_code) + if propresponse.status_code != 200: + error_tupe = (learner_uuid, learner_email, agname) + errorlist.append(error_tupe) + else: + print(f"Looks like {learner_email} and {agname} was successful.") + except (TypeError, IndexError) as e: + error_tupe = (0, learner_email, agency_name) + errorlist.append(error_tupe) + print(f"{e} has occurred with {learner_email}") + finally: + pass + print(f"Error list: {errorlist}") + + +def add_props_from_csv(): + errorlist = [] + df = pd.DataFrame() + data = pd.read_csv(IMPORTFILE) + for dat in data.iterrows(): + agency_name = dat[1][3] + # agency_name = "EMPLOYEE" + learner_email = dat[1][2] + # print(learner_email) + ppl_search = f"{BASEURL}people?filter[email][eq]={learner_email}" + ppl_response = requests.get(ppl_search, headers=HEADERS) + try: + ppl_data = ppl_response.json() + nextlink = ppl_data["links"] + learner_uuid = ppl_data["data"][0]["id"] + + # Now update the props + prop_url = f"{BASEURL}properties/people/bulk" + payload = { + "data": [ + { + "attributes": {"properties": {"agency_name": agency_name}}, + "id": learner_uuid, + "type": "person_properties", + } + ] + } + propresponse = requests.post(prop_url, json=payload, headers=HEADERS) + print(propresponse.status_code) + if propresponse.status_code != 200: + error_tupe = (learner_uuid, learner_email, agency_name) + errorlist.append(error_tupe) + else: + print(f"Looks like {learner_email} and {agency_name} was successful.") + except TypeError as e: + print(e) + pass + finally: + print(f"Error list: {errorlist}") + + +if __name__ == "__main__": + bulk_invite_and_group() diff --git a/Scripts/API_Tests/bulk_invite_and_props.py b/Scripts/API_Tests/bulk_invite_and_props.py index a95a2523..8f233032 100644 --- a/Scripts/API_Tests/bulk_invite_and_props.py +++ b/Scripts/API_Tests/bulk_invite_and_props.py @@ -11,7 +11,7 @@ HEADERS = { "X-Api-Key": APIKEY, } BASEURL = "https://api.northpass.com/v2/" -IMPORTFILE = "/Users/normrasmussen/Downloads/cisa-51325.csv" +IMPORTFILE = "/Users/normrasmussen/Downloads/cisa-060225.csv" def bulk_invite_and_group(): diff --git a/Scripts/API_Tests/bulk_knowledgestate_removegroups_enrollgroups.py b/Scripts/API_Tests/bulk_knowledgestate_removegroups_enrollgroups.py index 51a84650..a3d81a19 100644 --- a/Scripts/API_Tests/bulk_knowledgestate_removegroups_enrollgroups.py +++ b/Scripts/API_Tests/bulk_knowledgestate_removegroups_enrollgroups.py @@ -76,94 +76,6 @@ KNOWLEDGEGROUPS = [ ] PERSON_IDS = [ - # THIS LIST IS OUTDATED. I WOULDN'T USE IT. - # NOT SURE WHY I DON'T JUST DELETE IT - "f44363ca-eff8-4cc9-b67f-d49fcbd1f20d", - "07fd80f8-3fe8-4386-84dc-280dade1ed5f", - "8bffdf96-3947-4f14-8041-c25e4a488b80", - "a68a6120-067e-477d-89d5-d1da1a96d09f", - "03c65c74-2cb8-4c65-a712-6f0f48939d8b", - "56919b58-7be1-4c1b-912f-54887303eefb", - "b7e51667-d26f-4851-8878-d54bb4ce8a51", - "45fb5c92-2c3d-4c49-9f3e-949ab66b06e5", - "ea3706d8-c312-4830-8c18-0b7dcc0285d8", - "10edf9db-3bec-4beb-9047-44da8e3047ab", - "3c976bca-3f07-438b-9b8c-953782236666", - "b36d7d59-fc3c-480a-8d6a-9025e6ee4cbb", - "5718e19a-82d4-4855-af92-45c5cf8e670f", - "a3cdfd66-76dc-4e11-89ca-8a7fa32d2a47", - "123ef7cc-9a29-4a70-9e2c-86567ca02ab8", - "55498b66-5616-4f7c-a29c-9506e3d537cf", - "781d706e-3a9f-44dd-acca-2d0570b41544", - "58028ff3-4fb3-453b-8cc3-14c831977da4", - "56d52d1f-7eee-4f32-ac89-7bbf6c668cdd", - "baf1c792-3a87-4357-a93b-871eaabc0ab0", - "00969b3e-de91-4133-aa05-421a75651508", - "87c4fed6-166e-447a-b542-fb0403188fba", - "c84a13e9-950f-4109-a7e4-a2412fb6889b", - "fd6bc3ff-5416-418f-928c-4d1a5e96c651", - "43a20d23-69bd-4307-ad60-d2832ab81b39", - "1d579f1e-cae7-4866-9669-19074dfe8793", - "7723fe1b-bd33-4b89-84fc-7218303e2bad", - "3a8a77c0-eb96-4148-bdb8-6854c4b55129", - "f8410b69-f5e7-4fbe-b89c-a405173570ac", - "82adc395-7141-4de2-9b5f-a9c128bdd00f", - "8522f536-b77a-4c4b-8025-d6a10410f20a", - "eb857569-7fde-47f0-b404-db1a3ace1a19", - "daf7691c-5391-4f79-9da6-3ec383f955f0", - "242df255-14d0-41b8-ad57-afa4e788bdcf", - "1d8ffc86-80f5-4d42-8d3f-c705ee2e1482", - "23da9e58-b7fc-40cc-bacb-5ec98b9da3df", - "f4da7725-9c24-4d63-ba9b-fd1962f1fd4e", - "e6954ff8-2fcb-4044-bc8f-423de5b0911d", - "f7ec7cf5-bf70-4af6-b4bb-09891362df3f", - "d0648191-211e-4800-8526-91b2e8019b49", - "e4c08d0e-df51-432a-bc6a-648e0cfcb31f", - "415515be-c141-4002-83b1-6a6466507278", - "998508ee-fc6e-4770-a7b7-19b34eab3f0b", - "d790b773-2ceb-4cc7-8011-05d1f3a83b1f", - "33921abd-474a-469b-a114-a8f5bfec8a1a", - "4b7f75e4-d708-45d6-82e8-17e6ab98ba69", - "07f30e75-5a77-4b29-897b-caf9833b526b", - "303fccc3-cf87-4890-987a-4c246514a4cb", - "e0c85f8e-e03d-43b0-94dc-1aaf573a09b0", - "2197fdea-28c7-40f2-80d3-067617511c7f", - "cd844391-f786-4ea1-bccb-80b1b3a88eba", - "9206f9d4-6a43-4418-bfa4-fdc2e80cb601", - "222f8edc-cdca-4638-b93b-57b62cca9bc9", - "2ee1c1d9-d332-49c0-b186-50dbdffcc5da", - "a30b533d-c1b6-44ce-a67f-31a1f20a2bf6", - "603be042-5434-4482-a1a5-ba3f4f351b0b", - "53a70521-9bab-4177-9ec7-21d38ec52da3", - "8aa5d835-2a94-437e-9482-8cefbc7f73c5", - "5f8c5f02-722c-46a6-b6cd-7fc991ba91fe", - "9a69f913-d065-4bd1-8c8f-306b99253077", - "6eeacf18-15c7-46c4-98c9-e4cc38d4d927", - "f8e2668e-da42-426d-bfd7-7302958acaa8", - "575ba093-7bf8-4702-a46d-27a3783310ea", - "f6f2f233-24db-4541-ab55-813c547b3132", - "05e5d881-3896-4ba1-9a78-7eac2518d89c", - "3d73474f-5b7e-443a-9a9e-be33333d4a82", - "c2bae366-64c9-4bd0-a7d1-251971b65c61", - "32db9bd3-30aa-4b7f-add3-27adc42db1be", - "01514376-77b2-4432-8ee4-6f303969318d", - "3f3e16ac-28da-4d5d-803a-97f3bc4cda8f", - "d56bbe1d-2d58-4fea-a84e-3eab4d30f665", - "044fb66b-2232-415d-bc47-1c309419ff4a", - "f528c291-d2e6-4fd3-9253-24fd9a2a04b3", - "117f2aaf-30bb-4b92-b9b2-42a8ae0d72e9", - "d334a708-4512-4550-ac1e-0d0b1d4020b9", - "ee18a795-4c0e-4e3a-accf-9018035a0195", - "5acff021-3b6e-4313-a07c-6a000791a093", - "71ce9d84-ebd2-4a4c-a074-78ec9070fd22", - "38a5c677-4443-4d84-8e2d-3cdae3aa0648", - "cff1bfd8-ebbf-4f63-9b9b-95ffea97fbbc", - "cfedb93c-e5f9-48d8-9759-bbfed6b80c36", - "c2a40abd-ccc2-47af-86a0-2fdd616e5612", - "5b12d62b-47f1-461b-88c7-022f50430e77", - "a83219ba-1124-4dae-a0f1-73ec6e06bf0a", - "9367ee67-05e5-4663-a394-2cd3e91655e3", - "0633bb08-c971-4fd2-9849-99b20ae1a25c", ] APIKEY = Apikeys.ANTHOLOGY @@ -195,8 +107,11 @@ def grab_ppl_ids(rowdict): nextlink = resp["links"] for data in resp["data"]: - person = data["id"] - person_list.append(person) + if data["attributes"]["registration_status"] == "activated": + person = data["id"] + person_list.append(person) + else: + pass if "next" not in nextlink: break @@ -208,6 +123,8 @@ def grab_ppl_ids(rowdict): cprint(f"Person list for knowledgestate.edu has {len(person_list)} people.", 'blue') cprint(f"Skipping the bulk function.", 'yellow') +def add_group_to_people(person_list): + pass def bulk_remove_and_enroll(person_list, group_list): cprint("Moving people and groups into bulk function.", 'green') @@ -229,9 +146,8 @@ def bulk_remove_and_enroll(person_list, group_list): del_payload_var = {"id": group["id"], "type": "membership-groups"} del_group_list.append(del_payload_var) del_payload_base = {"data": del_group_list} - print(del_payload_base) if not del_payload_base["data"]: - print("notthing in del_payload_base") + print("nothing in del_payload_base") pass else: try: