Anthology script needs some reworking.

This commit is contained in:
Norm Rasmussen
2025-06-03 14:29:23 -04:00
parent e2716f1c23
commit 61673efc36
3 changed files with 158 additions and 93 deletions

149
Scripts/API_Tests/\ Normal file
View File

@ -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()

View File

@ -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():

View File

@ -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: