From e1c0aa6409fa5164c2a26ef46728e3918d193ddb Mon Sep 17 00:00:00 2001 From: Norm Rasmussen Date: Tue, 20 Jan 2026 16:35:03 -0500 Subject: [PATCH] Walmart and Chubb --- Scripts/AI-Prompted/concat-eml-files.py | 45 ++++++++++++++++++++++ Scripts/API_Tests/bulk_invite_and_props.py | 2 +- Tasks.md | 7 ++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 Scripts/AI-Prompted/concat-eml-files.py diff --git a/Scripts/AI-Prompted/concat-eml-files.py b/Scripts/AI-Prompted/concat-eml-files.py new file mode 100644 index 00000000..6a13209c --- /dev/null +++ b/Scripts/AI-Prompted/concat-eml-files.py @@ -0,0 +1,45 @@ +import argparse +from pathlib import Path + +SEP = "\n\n" + ("=" * 78) + "\n" # visible separator between messages + +def main(): + p = argparse.ArgumentParser(description="Concatenate .eml files into one all-emails.eml") + p.add_argument("folder", nargs="?", default=".", help="Folder containing .eml files (default: current folder)") + p.add_argument("--output", default="all-emails.eml", help="Output file name (default: all-emails.eml)") + p.add_argument("--sort", choices=["name", "mtime"], default="mtime", + help="Sort input files by name or modification time (default: mtime)") + args = p.parse_args() + + folder = Path(args.folder).expanduser().resolve() + if not folder.is_dir(): + raise SystemExit(f"Not a folder: {folder}") + + emls = list(folder.glob("*.eml")) + if not emls: + raise SystemExit(f"No .eml files found in {folder}") + + if args.sort == "name": + emls.sort(key=lambda x: x.name.lower()) + else: + emls.sort(key=lambda x: x.stat().st_mtime) + + out_path = folder / args.output + + with out_path.open("wb") as out: + for i, f in enumerate(emls, 1): + data = f.read_bytes() + + # Ensure each message ends with a newline + if data and not data.endswith(b"\n"): + data += b"\n" + + out.write(data) + # Add separator so messages don't run together + out.write(SEP.encode("utf-8")) + + print(f"Wrote {len(emls)} emails to {out_path}") + +if __name__ == "__main__": + main() + diff --git a/Scripts/API_Tests/bulk_invite_and_props.py b/Scripts/API_Tests/bulk_invite_and_props.py index f4999ec2..acf0ad4f 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 OLC users 122225-010225.csv" +IMPORTFILE = "/Users/normrasmussen/Downloads/CISA OLC users 010526-011626.csv" def bulk_invite_and_group(): diff --git a/Tasks.md b/Tasks.md index e90bc51e..4f966b98 100644 --- a/Tasks.md +++ b/Tasks.md @@ -1,6 +1,8 @@ # Tasks and Todos ## Nintex +- [ ] Certs need to be updated - likely just the CEOs signature. + - [ ] Figure out if Outlook365 link can be inserted into notification emails. * This is the url from the button on the session page: `https://outlook.office.com/calendar/0/deeplink/compose?path=/calendar/action/compose&rru=addevent&subject=session+error+test&startdt=2026-08-01T13%3A00%3A00Z&enddt=2026-08-01T13%3A45%3A00Z&body=To+read+more+about+this+session%2C+please+visit%3A+%3Ca+href%3D%22https%3A%2F%2Fnormsandbox.northpass.com%2Ftraining_sessions%2Fb9e26ea4-1e6a-4d7f-8a7d-d7eb3a572d10%22%3Esession+error+test%3C%2Fa%3E&location=https%3A%2F%2Fattendee.gotowebinar.com%2Fregister%2F5488234718167782496` * @@ -171,6 +173,11 @@ - [X] PoC Dashboard, Date range should be based on Earliest Activity View - they can get enrollment dates from other reports. But if someone was enrolled 2 months ago but hasn't really viewed activities until the last 2 weeks and the filter shows 7 days ago, they want to see those activity views within the last 7 days. - What courses are popular and what companies are digging into the academy. And also understand why is activity 0 for one course but 39 for another. Is this a marketing solution (outreach to enrollments) or content (improve delivery). - Allyson cares less about what courses are popular and what is driving adoption. +- [ ] Add some signifier to the courses section categories to indicate that there are more courses (either count of courses or "click here for more") +- [ ] Cloning of cert files +- [ ] Changing from all-access to group-based access - but some clients have already opted-out of CS. How can we auto-sync opt outs between CS and CE? + - [ ] Can CS JO get CE groups? See above issue. The other app they are using is Pardot + ### Completed - [X] Add Associated ILTs to the course overview page. Ref: SPS Training Centre.