okta and workday scripts

This commit is contained in:
2026-01-26 16:49:09 -05:00
parent 01c3f51dac
commit 0d7ff5b63e
25 changed files with 148270 additions and 0 deletions

View File

@@ -0,0 +1,326 @@
# process.py
import os
import sys
import json
import re
import hashlib
from collections import Counter, defaultdict
import requests
import pandas as pd
import spacy
from openai import OpenAI
from tqdm import tqdm
# =========================
# Configuration
# =========================
#DEFAULT_LM_IP = "192.168.1.221" # default LM Studio host (without /v1)
DEFAULT_LM_IP = "10.81.209.99" # default LM Studio host (without /v1)
LLM_MODEL = "openai/gpt-oss-20b"
LLM_API_KEY = "not-needed" # LM Studio typically doesn't require an API key
INPUT_CSV = "test.csv"
OUTPUT_CSV = "test_with_names.csv"
EVENT_LOG = "event_log.txt"
# Columns to process
SOURCE_COL_1 = "Instance that Changed"
TARGET_COL_1 = "Applied to"
SOURCE_COL_2 = "Added"
TARGET_COL_2 = "Added Applied to"
ENTERED_COL = "Entered On"
ENTERED_MMDD_COL = "Entered On (MM/DD)"
# Values to ignore entirely (case-insensitive)
AUTO_STRINGS = {"automatic complete"}
def is_auto(val) -> bool:
return isinstance(val, str) and val.strip().lower() in AUTO_STRINGS
# Regex helpers
DELIM_SPLIT = re.compile(r"\s*[\/|\-–—]\s*")
KEEP_CHARS = re.compile(r"[^A-Za-zÀ-ÖØ-öø-ÿ' .\-]")
def clean_person(text: str) -> str:
"""Clean extracted name by removing job codes/fragments after dashes/slashes; keep name-ish chars."""
if not text:
return ""
first = DELIM_SPLIT.split(text, maxsplit=1)[0]
first = KEEP_CHARS.sub("", first).strip()
return re.sub(r"\s{2,}", " ", first)
# =========================
# LM Studio reachability
# =========================
def check_lmstudio(ip: str) -> str:
"""
Ensure LM Studio endpoint is reachable; if not, prompt for IP until it is.
Returns the validated base URL like "http://<ip>:1234/v1".
"""
def _ok(url: str) -> bool:
try:
r = requests.get(url.rstrip("/") + "/models", timeout=5)
return r.status_code == 200
except Exception:
return False
base_url = f"http://{ip}:1234/v1"
if _ok(base_url):
print(f"✅ LM Studio reachable at {base_url}")
return base_url
print(f"❌ Could not reach LM Studio at {base_url}")
while True:
new_ip = input("Enter LM Studio IP address (e.g. 192.168.1.221): ").strip()
if not new_ip:
print("Aborted: No IP provided.")
sys.exit(1)
base_url = f"http://{new_ip}:1234/v1"
print(f"🔍 Retesting {base_url}...")
if _ok(base_url):
print(f"✅ LM Studio reachable at {base_url}")
return base_url
else:
print("❌ Still unreachable. Try again or Ctrl+C to exit.")
# Perform reachability check BEFORE any processing
LLM_BASE_URL = check_lmstudio(DEFAULT_LM_IP)
client = OpenAI(base_url=LLM_BASE_URL, api_key=LLM_API_KEY)
# =========================
# spaCy model (Transformer)
# =========================
print("🔍 Loading spaCy transformer model: en_core_web_trf")
nlp = spacy.load(
"en_core_web_trf",
exclude=["parser", "tagger", "attribute_ruler", "lemmatizer", "morphologizer"],
)
print("✅ spaCy model loaded successfully.")
def extract_names(text: str) -> str:
"""Extract distinct PERSON names using spaCy Transformer model."""
if not isinstance(text, str) or not text.strip():
return ""
doc = nlp(text)
names, seen = [], set()
for ent in doc.ents:
if ent.label_ == "PERSON":
cleaned = clean_person(ent.text)
key = cleaned.lower()
if cleaned and key not in seen:
seen.add(key)
names.append(cleaned)
return ", ".join(names)
def insert_after(df: pd.DataFrame, after_col: str, new_col: str, values: pd.Series) -> None:
"""Insert new_col immediately after after_col (drop existing if present)."""
if new_col in df.columns:
df.drop(columns=[new_col], inplace=True)
idx = df.columns.get_loc(after_col) + 1
df.insert(idx, new_col, values)
def dataframe_to_compact_event(df: pd.DataFrame) -> str:
"""Compact JSON payload for a grouped event (keeps unique values per column)."""
def uniq(col):
return sorted([v for v in df[col].dropna().unique().tolist()]) if col in df else []
payload = {
"applied_to": uniq(TARGET_COL_1),
"by_user": uniq("By User"),
"in_transaction": uniq("In Transaction"),
"entered_on": uniq(ENTERED_COL),
"dates_mmdd": uniq(ENTERED_MMDD_COL),
"instances": uniq(SOURCE_COL_1),
"added": uniq(SOURCE_COL_2),
"row_count": int(len(df)),
}
return json.dumps(payload, ensure_ascii=False, indent=2)
# =========================
# Main flow
# =========================
# If processed CSV already exists, skip straight to summarization
if os.path.exists(OUTPUT_CSV):
print(f"⚡ Skipping CSV processing — {OUTPUT_CSV} already exists.")
df = pd.read_csv(OUTPUT_CSV)
# Ensure MM/DD exists (for old CSVs)
if ENTERED_MMDD_COL not in df.columns and ENTERED_COL in df.columns:
ts = pd.to_datetime(df[ENTERED_COL], errors="coerce")
df[ENTERED_MMDD_COL] = ts.dt.strftime("%m/%d").fillna("")
else:
print("⚙️ Processing CSV to extract names and generate output...")
# Load CSV
df = pd.read_csv(INPUT_CSV)
# Derive Entered On (MM/DD)
if ENTERED_COL in df.columns:
try:
ts = pd.to_datetime(df[ENTERED_COL], format="mixed", errors="coerce")
except TypeError:
ts = pd.to_datetime(df[ENTERED_COL], errors="coerce")
df[ENTERED_MMDD_COL] = ts.dt.strftime("%m/%d").fillna("")
else:
df[ENTERED_MMDD_COL] = ""
# Live progress counters for names across both columns
name_counter = Counter()
def _process_series_with_progress(series: pd.Series, desc: str) -> pd.Series:
"""Iterate with progress, update name_counter, and return extracted names Series."""
values = series.fillna("").astype(str).tolist()
out = []
total = len(values)
if total == 0:
return pd.Series([], dtype=object)
step = max(10, total // 20) # update ~every 5% (at least every 10 rows)
pbar = tqdm(values, desc=f"NER: {desc}", leave=True)
for i, text in enumerate(pbar, start=1):
names = extract_names(text)
# Update running totals (ignore "Automatic Complete")
for n in [x.strip() for x in names.split(",") if x.strip()]:
if n.lower() not in AUTO_STRINGS:
name_counter[n] += 1
out.append(names)
# Periodic status refresh
if i % step == 0 or i == total:
top = ", ".join(f"{n}:{c}" for n, c in name_counter.most_common(3))
pbar.set_postfix_str(f"unique={len(name_counter)} top=[{top}]")
return pd.Series(out, index=series.index, dtype=object)
# 1) Extract from "Instance that Changed" -> "Applied to"
if SOURCE_COL_1 in df.columns:
applied_series = _process_series_with_progress(df[SOURCE_COL_1], SOURCE_COL_1)
insert_after(df, SOURCE_COL_1, TARGET_COL_1, applied_series)
else:
df[TARGET_COL_1] = ""
# 1a) Simplified quick-fill:
# If "Applied to" has a value, always copy it to "Added Applied to"
if SOURCE_COL_2 in df.columns:
if TARGET_COL_2 not in df.columns:
df[TARGET_COL_2] = ""
for i, row in df.iterrows():
name = str(row.get(TARGET_COL_1, "")).strip()
aat = str(row.get(TARGET_COL_2, "")).strip()
if name and not aat:
df.at[i, TARGET_COL_2] = name
else:
df[TARGET_COL_2] = ""
# 2) Extract from "Added" -> "Added Applied to" (skip rows with value already set OR empty Added)
if SOURCE_COL_2 in df.columns:
mask_need = (df[TARGET_COL_2].fillna("").str.strip() == "") & (df[SOURCE_COL_2].fillna("").str.strip() != "")
idxs = df.index[mask_need].tolist()
if idxs:
values = df.loc[idxs, SOURCE_COL_2]
pbar = tqdm(values.tolist(), desc=f"NER: {SOURCE_COL_2} (remaining)", leave=True)
extracted = []
for text in pbar:
names = extract_names(text)
# update counter (ignore "Automatic Complete")
for n in [x.strip() for x in names.split(",") if x.strip()]:
if n.lower() not in AUTO_STRINGS:
name_counter[n] += 1
extracted.append(names)
df.loc[idxs, TARGET_COL_2] = extracted
# --- Remove any rows that are purely "Automatic Complete" in key fields ---
for col in [SOURCE_COL_1, SOURCE_COL_2, "In Transaction"]:
if col in df.columns:
df = df[~df[col].apply(is_auto)]
# --- Keep only selected columns (incl. MM/DD) ---
keep_cols = [
SOURCE_COL_1,
TARGET_COL_1,
"In Transaction",
SOURCE_COL_2,
TARGET_COL_2,
"By User",
ENTERED_COL,
ENTERED_MMDD_COL,
]
df = df[[c for c in keep_cols if c in df.columns]]
# --- Filter rows: keep where Applied to == Added Applied to (case-insensitive) ---
if TARGET_COL_1 in df.columns and TARGET_COL_2 in df.columns:
df = df[
df[TARGET_COL_1].fillna("").str.strip().str.lower()
== df[TARGET_COL_2].fillna("").str.strip().str.lower()
]
# --- Drop duplicates & save overall result ---
df = df.drop_duplicates().reset_index(drop=True)
df.to_csv(OUTPUT_CSV, index=False)
print(f"✅ Saved {len(df)} unique matching rows to {OUTPUT_CSV}")
# =========================
# LM Studio event summary generation (group by By User, then date asc)
# =========================
if not df.empty:
grouped = df.groupby([TARGET_COL_1, "By User", ENTERED_COL], dropna=False)
summaries = [] # list of tuples (by_user, mmdd, sentence)
for keys, gdf in grouped:
applied_to, by_user, entered_on = keys
if not applied_to or str(applied_to).strip() == "":
continue
mmdd_vals = gdf[ENTERED_MMDD_COL].dropna().astype(str)
mmdd = next((v for v in mmdd_vals if v.strip()), "")
payload = dataframe_to_compact_event(gdf)
prompt = (
"You are a compliance and information security analyst. "
"Given the following grouped audit data, produce ONE clear and concise sentence summarizing the event. "
"Include: (1) who performed the action (By User, include name and ID if available), "
"(2) who the change applied to (Applied to), "
"(3) the full list of role names that were assigned or added (from 'Instance that Changed' and 'Added'), "
"and (4) the date of the event. "
"Always mention the specific role titles exactly as shown in the data. "
"If multiple roles were assigned, list them all in a natural phrase like "
"'assigned the A, B, and C roles'. "
"Do not include raw JSON, extra commentary, or line breaks. Return only one sentence.\n\n"
f"Audit Data (JSON):\n{payload}"
)
try:
resp = client.chat.completions.create(
model=LLM_MODEL,
messages=[
{"role": "system", "content": "You write terse, clear compliance summaries."},
{"role": "user", "content": prompt},
],
temperature=0.2,
)
one_liner = (resp.choices[0].message.content or "").strip()
except Exception as e:
one_liner = f"[LLM ERROR] {e}"
summaries.append((by_user or "Unknown User", mmdd, one_liner))
# Group by By User, sort each user's entries by mm/dd asc, write file (OVERWRITE)
grouped_summaries: dict[str, list[tuple[str, str]]] = defaultdict(list)
for by_user, mmdd, line in summaries:
grouped_summaries[by_user].append((mmdd, line))
for user in grouped_summaries:
grouped_summaries[user].sort(key=lambda x: x[0] or "")
with open(EVENT_LOG, "w", encoding="utf-8") as f:
for user in sorted(grouped_summaries.keys()):
f.write(f"=== {user} ===\n")
for mmdd, line in grouped_summaries[user]:
prefix = f"{mmdd} - " if mmdd else ""
f.write(f"{prefix}{line}\n")
f.write("\n")
total_events = sum(len(v) for v in grouped_summaries.values())
print(f"📝 Overwrote {EVENT_LOG} with {total_events} grouped event summaries")
else:
print(" No matching rows found; nothing to summarize.")

View File

@@ -0,0 +1,91 @@
=== 1000054 / Dennis Cregan ===
11/03 - By Dennis Cregan assigned the User-Based Group Change - Event Lite Type role to Carmen Huang on 11/3/25.
11/03 - By Dennis Cregan, applied to Carmen Huang and Oona Julien, assigned no roles on 11/3/25.
11/03 - By Dennis Cregan assigned the User-Based Group Change - Event Lite Type role to Oona Julien on 11/3/25.
11/05 - By Dennis Cregan applied the change to Catherine Wukitsch on 11/5/25.
11/05 - By Dennis Cregan, the PSID role was assigned to PSID on 11/5/25.
11/07 - By Dennis Cregan (1000054) applied to Mariana Arroyo Chavez, assigned the Edit Workday Account, Edit Workday Account (Default Definition), Edit Workday Account: Mariana Arroyo Chavez (Private), English (United States), and Mariana Arroyo Chavez (Private) roles on 11/07/25.
11/07 - By Dennis Cregan assigned the Edit Workday Account, Edit Workday Account (Default Definition), Edit Workday Account: pherzog-impl / Petra Herzog, Successfully Completed, and pherzog-impl / Petra Herzog roles to Petra Herzog on 11/07/25.
11/10 - By Dennis Cregan (1000054) assigned the Edit Workday Account, Edit Workday Account (Default Definition), and Preferences for Colton Crace roles to Colton Crace on 11/10/25.
11/11 - Dennis Cregan (ID 1000054) assigned Katie Peardon the Approval by Integration Administrator, Background Process Launch: Student Prospect Update Event (Default Definition) step b - Batch/Job, and Edit Other IDs roles on 11/11/25.
11/11 - By User 1000054 / Dennis Cregan, the PSID role was assigned to PSID on 11/11/25.
11/12 - By user 1000054 / Dennis Cregan, the event applied to Isabella Alberti on 11/12/25 with no roles assigned.
11/12 - By Dennis Cregan assigned the Edit Workday Account, Edit Workday Account (Default Definition), Edit Workday Account: Isabella Alberti, Isabella Alberti, and Successfully Completed roles to Isabella Alberti on 11/12/25.
11/12 - Dennis Cregan (1000054) performed an Edit Other IDs transaction on Isabella Alberti, assigning no roles, on 11/12/25.
11/12 - By Dennis Cregan, applied to Jody Williams, no roles were assigned on 11/12/25.
11/12 - By Dennis Cregan assigned the Edit Workday Account, Edit Workday Account (Default Definition), Edit Workday Account: Jody Williams, Jody Williams, Preferences for Jody Williams, Successfully Completed, and User Notification Settings For System User: JodyWilliams roles to Jody Williams on 11/12/25.
11/18 - By Dennis Cregan applied the change to Brian Cheslik on 11/18/25.
11/18 - By user1000054/DennisCregan assigned the Edit Workday Account, Edit Workday Account (Default Definition), Edit Workday Account: Brian Cheslik, Preferences for Brian Cheslik, and User Notification Settings For System User: Brian Chesik roles to BrianCheslik on 11/18/25.
=== 1003153 / Joseph DeSiervi ===
11/12 - By User Joseph DeSiervi (1003153) assigned the Deny and Financial Aid Administrator - UBSG - U roles to Deny on 11/12/25.
11/12 - By User Joseph DeSiervi (ID 1003153) applied to Deny, assigned the Deny role on 11/12/25.
11/13 - By User 1003153 / Joseph DeSiervi assigned the 1004304 / John Huang, GU Testing Proxy Access1, and User-Based Group Change - Event Lite Type on 11/13/2025, 6:06:23.595 AM roles to John Huang on 11/13/25.
=== 1003966 / Kristinn Bjarnason ===
11/06 - By User 1003966 / Kristinn Bjarnason assigned the Marketing Manager, Student Finance Student Worker, GU Student Worker, and SFS Student Assistant roles to Amanda Gerson on 11/6/25.
11/06 - By user 1003966 / Kristinn Bjarnason assigned the P007183 SFS Student Assistant role to Evan Stromberg on 11/6/25.
11/06 - Kristinn Bjarnason (ID1003966) added roles to Kristinn Bjarnason, Kenneth Grazier's on 11/06/2025.
11/07 - By Kristinn Bjarnason (1003966) assigned the Dean of Faculty Academic Unit / Graduate and P000267 Graduate and Immigration Coordinator - B. Mutisya Nzyuko roles to B. Mutisya Nzyuko on 11/7/2513:46.
11/07 - By Kristinn Bjarnason (1003966) assigned the Student Finance Administrator - UBSG role to John Huang on 11/7/25.
11/07 - By User 1003966 / Kristinn Bjarnason assigned the P000506 Associate Dean, Graduate Education and P007153 Assistant Dean - Mary Perrodin-Singh roles to Mary Perrodin on 11/7/25.
11/07 - By User 1003966 / Kristinn Bjarnason assigned the P000267 Immigration Compliance Coordinator role to Mutisya Nzyuko on 11/07/2025.
11/07 - By user 1003966 / Kristinn Bjarnason, the event applied to beth gibbons and assigned the P000506 Associate Dean, Graduate Education, Student Registration Assistant, and Dean of Faculty Academic Unit / Graduate roles on 11/7/25.
11/11 - By user 1003966 / Kristinn Bjarnason, the change applied to Alexander Leffers assigned him the P000155 Manager, Gallaudet Interpreting Services (Unfilled)(+6) - Accommodations Viewer (GIS) - Gallaudet University and P000621 Communication and Community Engagement Manager roles on 11/11/2025.
11/11 - By user 1003966 / Kristinn Bjarnason, the role P000621 Communication and Community Engagement Manager was assigned to Alexander Leffers on 11/11/25.
11/11 - By Kristinn Bjarnason assigned the Manager, Gallaudet Interpreting Services (Unfilled) and Accommodations Viewer (GIS) roles to Edwin Martinez on 11/11/2025.
11/11 - By Kristinn Bjarnason (1003966) assigned the P000155 Manager, Gallaudet Interpreting Services (Unfilled); P000243 Accommodations Coordinator Edwin Martinez (Private); P000601 Director, Student Success Jerri Dorminy; P000621 Communication and Community Engagement Manager Alexander Leffers; P000888 Academic and Career Success Advisor Riley Schultz; P002098 Manager, Operations Gino Gouby; P002479 Accommodations Coordinator (Unfilled); and P003678 Supervisor, Operations Vanessa Saperstein roles to Edwin Martinez, Jerri Dorminy, Alexander Leffers, Riley Schultz, Gino Gouby and Vanessa Saperstein on 11/11/25 at 12:14.
11/11 - By Kristinn Bjarnason, the change applied to Gino Gouby assigned the P002098 Manager, Operations and the P000155 Manager, Gallaudet Interpreting Services (Unfilled)(+6) - Accommodations Viewer (GIS) roles on 11/11/25.
11/11 - By Kristinn Bjarnason, the roles P000456 Accessibility Resources Manager Jennifer Tuell (On Leave), P000621 Communication and Community Engagement Manager Alexander Leffers, and P000652 Manager, Office of Students With Disabilities Karen Terhune were assigned to Jennifer Tuell, Alexander Leffers and KarenTuell on 11/11/25.
11/11 - By User 1003966 / Kristinn Bjarnason assigned the P000155 Manager, Gallaudet Interpreting Services (Unfilled)(+6) - Accommodations Viewer (GIS) - Gallaudet University role to Jerri Dorminy on 11/11/25.
11/11 - By user 1003966 / Kristinn Bjarnason, the event assigned Karen Terhune the Manager, Office of Students With Disabilities and Accommodations Recorder roles on 11/11/25.
11/11 - By Kristinn Bjarnason (1003966) assigned the P000652 Manager, Office of Students With Disabilities - Karen Terhune(+1) - Accommodations Recorder - Gallaudet University role to KarenTerhune on 11/11/25.
11/11 - The audit records show that on 11/11/25, user Kristinn Bjarnason (ID1003966) removed the Accommodations Viewer (GIS) role from Kristinn Bjarnason and Karen Terhune.
11/11 - By User 1003966 / Kristinn Bjarnason applied changes to Kristinn Bjarnason, Karen Terhune on 11/11/25.
11/11 - By user 1003966 / Kristinn Bjarnason, the system applied changes to Kristinn Bjarnason and Karen Terhune, assigning no roles on 11/11/25.
11/11 - By User 1003966 / Kristinn Bjarnason assigned the P000155 Manager, Gallaudet Interpreting Services (Unfilled)(+6) - Accommodations Viewer (GIS) - Gallaudet University role to Riley Schultz on 11/11/25.
11/11 - By User 1003966 / Kristinn Bjarnason applied to Shane Dundas assigned the P000155 Manager, Gallaudet Interpreting Services (Unfilled)(+6) - Accommodations Viewer (GIS) - Gallaudet University and P007096 Coordinator DSC roles on 11/11/25.
11/11 - By user 1003966 / Kristinn Bjarnason, the system assigned the P000652 Manager, Office of Students With Disabilities - Karen Terhune(+1) - Accommodations Recorder - Gallaudet University and the P007096 Coordinator DSC - Shane Dundas roles to Shane Dundas on 11/11/25.
11/11 - By Kristinn Bjarnason assigned the Accommodations Reviewer- UBSG-U role to Shane Dundas on 11/11/25.
11/11 - By Kristinn Bjarnason (1003966) applied to Vanessa Saperstein assigned the P000155 Manager, Gallaudet Interpreting Services (Unfilled)(+6) - Accommodations Viewer (GIS) - Gallaudet University role on 11/11/25.
11/18 - By user 1003966 / Kristinn Bjarnason assigned the Marketing Manager, Student Finance Student Worker, and SFS Student Assistant roles to Amanda Gerson on 11/18/25.
11/18 - By User 1003966 / Kristinn Bjarnason applied to Bernadine Bertrand assigned the Director, Information Technology Operations and Student Finance Data Viewer roles on 11/18/25.
11/18 - By Kristinn Bjarnason, assigned the Director, Information Technology Operations and Student Finance Data Viewer roles to Bernadine Bertrand, and the Marketing Manager and Student Finance Student Worker roles to Amanda Gerson on 11/18/25.
11/18 - By user Kristinn Bjarnason (1003966) assigned the Accommodations Coordinator and Accommodations Recorder Only roles to Edwin Martinez on 11/18/25.
11/18 - By Kristinn Bjarnason, assigned the Accommodations Coordinator - Edwin Martinez (Private), Accommodations Coordinator (Unfilled), and Coordinator DSC roles to Edwin Martinez, Shane Dundas on 11/18/25.
11/18 - By User 1003966 / Kristinn Bjarnason assigned the P000228 Associate Registrar, P000231 Academic Classroom Coordinator, P000237 Transfer Articulation Coordinator, P000238 Curriculum Coordinator, P000254 Operations Coordinator, P000258 ASL Education Coordinator, P000267 Graduate and Immigration Coordinator, P000362 Manager, Operations, P000389 Director, Information Technology Operations, P000430 Executive Director, Product Management (Closed), P000506 Associate Dean, Graduate Education, P000563 Dean, Curriculum, Outreach, Resources, and Effectiveness, P000595 Registrar, P000601 Director, Student Success, P000625 Education Abroad Manager, P000669 Workday Manager, P000740 Residence Life Manager, P002052 Gallaudet Innovation and Entrepreneurship Institute Director, P002153 Workday Student Manager, P003626 Customer Experience Manager, P003894 Marketing Manager, P005663 Customer Representative Service, and P005664 Customer Service Representative to Laurie Miskovsky, Ericka Brown, Laura Willey, Kai Gagnon, Patrick Rolfe, Keith Grant, B. Mutisya Nzyuko, Rowena Winiarczyk, Bernadine Bertrand, Caroline Pezzarossi, Elice Patterson, Jerri Dorminy, Fiona Grugan, Joseph DeSiervi, Nikki Surber, Russell Stein, Kristinn Bjarnason, Corey Burton, Amanda Gerson, Anna Reyes, and Ama Penny on 11/18/25.
11/18 - By 1003966 / Kristinn Bjarnason, assigned the P002479 Accommodations Coordinator (Unfilled)(+2) - Accommodations Recorder Only role to Shane Dundas on 11/18/25.
=== 1004645 / Julie Longson ===
11/12 - By Julie Longson (1004645) assigned the Senior Financial Planning and Analysis Manager, International Billing Specialist, SF Developing Country, and Financial Services Specialist roles to Christopher Jappah on 11/12/25.
11/12 - By User 1004645 / Julie Longson assigned the P000394 Manager, Student Financial Services, P000447 Financial Services Specialist, and P001408 Senior Financial Planning and Analysis Manager roles to John Huang, Mekayla Walker, and Kathy Chen on 11/12/25.
11/12 - Julie Longson (ID 1004645) assigned Kathy Chen the Senior Financial Planning and Analysis Manager, International Billing Specialist SF Developing Country, and Senior Financial Planning & Analysis (FP&A) Analyst-2 roles on 11/12/2025.
11/12 - By User 1004645 / Julie Longson applied to Kathy Chen assigned the P001408 Senior Financial Planning and Analysis Manager - Kathy Chen-Petrus(+3) - International Billing Specialist - SF Developing Country role on 11/12/25.
11/14 - By Julie Longson on 11/14/25, the system assigned the P000052 Director, Financial Aid; P000054 Financial Aid Counselor (Private); P000061 Technical Specialist; P000083 Academic and Career Success Advisor (Unfilled); P000148 Associate Accreditation Coordinator (Private); P000194 Dean, Academic and Career Success; P000254 Operations Coordinator (Private); P000258 ASL Education Coordinator; P000265 Graduate Admissions Coordinator; P000420 Lecturer II; P000563 Dean, Curriculum, Outreach, Resources, and Effectiveness; P000591 Director, Institutional Research; P006294 Assistant Director to Amanda Jackson, Dylan Westbury, Na Zhuo, Sydney Padgett, Robert Sanchez, Patrick Rolfe, Keith Grant, Zeshan Shafiq, Gemma Gabor, Caroline Pezzarossi, Lindsay Buchko, Caroline Finklea Vizzuto, Michael Tota, Khadijat Rashid, Emelia Beldon, Mercedes Olson, Corey Burton, Shelby Bean, Shanna Cooley, and Vicki Cheeseman.
11/14 - Julie Longson (1004645) assigned the Director, Financial Aid and Assistant Director roles to Amanda Jackson and Vicki Cheeseman on 11/14/25.
11/14 - By User Julie Longson (1004645) assigned the P000083 Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer - Gallaudet University role to Caroline Finklea Vizzuto on 11/14/25.
11/14 - By User 1004645 / Julie Longson assigned the P000083 Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer role to Caroline Pezzarossi on 11/14/25.
11/14 - By User 1004645 / Julie Longson assigned the Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer role to Corey Burton on 11/14/25.
11/14 - By User Julie Longson (ID1004645) assigned the P000083 Academic and Career Success Advisor role to Dylan Westbury on 11/14/25.
11/14 - Julie Longson (ID1004645) assigned the Financial Aid Counselor Dylan Westbury (Private), Associate Financial Aid Counselor Mercedes Olson, Financial Aid Counselor Shelby Bean, Financial Aid Specialist Shanna Cooley (Private), and Assistant Director Vicki Cheeseman roles to Dylan Westbury, Mercedes Olson, Shelby Bean, Shanna Cooley and Vicki Cheeseman on 11/14/25.
11/14 - By Julie Longson (ID1004645) assigned the Academic and Career Success Advisor (Unfilled)(+20) Unofficial Student Transcript Viewer Gallaudet University role to Emelia Beldon on 11/14/25.
11/14 - By User Julie Longson, applied to Gemma Gabor, assigned the P000083 Academic and Career Success Advisor (Unfilled) role on 11/14/25.
11/14 - By User 1004645 / Julie Longson assigned the Academic and Career Success Advisor (Unfilled)(+20) role to Keith Grant on 11/14/25.
11/14 - By User 1004645 / Julie Longson applied to Lindsay Buchko assigned the P000083 Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer role on 11/14/25.
11/14 - By User 1004645 / Julie Longson applied to Mercedes Olson, assigned the P002048 Associate Financial Aid Counselor role and added the Academic and Career Success Advisor (Unfilled) and Unofficial Student Transcript Viewer roles on 11/14/25.
11/14 - By User 1004645 / Julie Longson assigned the P000083 Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer role to Michael Tota on 11/14/25.
11/14 - By User 1004645 / Julie Longson applied to Na Zhuo assigned the P000083 Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer - Gallaudet University role on 11/14/25.
11/14 - By User 1004645 / Julie Longson assigned the Academic and Career Success Advisor role to Patrick Rolfe on 11/14/25.
11/14 - By User 1004645 / Julie Longson assigned the Academic and Career Success Advisor (Unfilled)(+20) role to Robert Sanchez on 11/14/25.
11/14 - By User 1004645 / Julie Longson applied to Shanna Cooley assigned the Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer - Gallaudet University role on 11/14/25.
11/14 - By User 1004645 / Julie Longson assigned the P000083 Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer role to Shelby Bean on 11/14/25.
11/14 - By user 1004645 / Julie Longson, the change applied to Shelby Bean, assigning the Financial Aid Counselor and Financial Aid Specialist roles on 11/14/25.
11/14 - By User 1004645 / Julie Longson applied to Sydney Padgett assigned the P000083 Academic and Career Success Advisor (Unfilled)(+20) - Unofficial Student Transcript Viewer - Gallaudet University role on 11/14/25.
11/14 - Julie Longson (ID 1004645) assigned the P006294 Assistant Director Vicki Cheeseman(+1) Financial Aid Management, P000083 Academic and Career Success Advisor (Unfilled)(+20) Unofficial Student Transcript Viewer, and Financial Aid Administrator UBSG U roles to Vicki Cheeseman on 11/14/2025.
11/14 - By user 1004645 / Julie Longson assigned the GU Testing Proxy Access1 role to Vicki Cheeseman on 11/14/25.
11/14 - By User 1004645 / Julie Longson applied to Vicki Cheeseman assigned the P006294 Assistant Director, Financial Aid role on 11/14/25.
11/14 - By User 1004645 / Julie Longson applied to Zeshan Shafiq assigned the P000083 Academic and Career Success Advisor (Unfilled) role on 11/14/25.
=== mrakowski-impl / Margaret Rakowski ===
11/19 - By User Margaret Rakowski, applied to Domenique Meneses, assigned the Edit Workday Account, Edit Workday Account (Default Definition), and Edit Workday Account: dmeneses-impl / Domenique Meneses roles on 11/19/25.

View File

@@ -0,0 +1,161 @@
=== 1000054 / Dennis Cregan ===
10/01 - By Dennis Cregan (ID 1000054) applied to no one, assigned the Edit Reference ID role on 10/1/25.
10/02 - By Dennis Cregan, applied to Jacquelin Kutz, assigned no roles on 10/02.
10/02 - Dennis Cregan applied the Activate Pending Security Policy Changes role to the system on 10/2/25.
10/02 - By Dennis Cregan assigned the Edit Workday Account role on 10/02/2025.
10/06 - By Dennis Cregan, applied to no one, assigned the ISSG SINT008 Student Term, Maintain Permissions for Security Group, Student Data: Personal Data, Student Data: Student Profile, and View Only roles on 10/06/2025.
10/06 - Dennis Cregan applied the Activate Pending Security Policy Changes role to the system on 10/6/25.
10/06 - By Dennis Cregan (ID1000054) assigned the Edit Universal Id role, applied to no one, on 10/6/25.
10/06 - By Dennis Cregan, no user was specified as the target and he assigned the Edit Workday Account role on 10/6/25.
10/13 - By Dennis Cregan (ID 1000054) applied to no user, assigned the Edit Reference ID role on 10/13/25.
10/20 - Dennis Cregan (ID 1000054) applied the roles Audit: Academics Data, ISSG SINT058 OKTA Student Sync Outbound, Maintain Permissions for Security Group, Student Data: Program of Study, Student Data: Student Transcript, View Only, and View Only for Audit: Academics Data, View Only for Student Data: Program of Study, and View Only for Student Data: Student Transcript to the target on 10/20/25.
10/20 - By Dennis Cregan applied the Activate Pending Security Policy Changes role on 10/20/25.
10/22 - By Dennis Cregan assigned the Edit Workday Account role to Adrain Cookneuchan on 10/22/25.
10/22 - By Dennis Cregan (ID 1000054) applied to no specific user, assigned the Edit Reference ID role on 10/22/25.
10/22 - By Dennis Cregan, the Edit Workday Account role was assigned on 10/22/25.
10/23 - By Dennis Cregan, the Edit Workday Account was applied to Raven Taylor on 10/23/25.
10/23 - By Dennis Cregan, assigned the Create Universal Id, Edit Reference ID, and Edit Workday Account roles on 10/23/25.
10/24 - By Dennis Cregan applied to Michael Deninger on 10/24/25.
10/24 - By Dennis Cregan, applied to no one, assigned the English (United States), HCM Security Administrator, Maintain Assignable Roles, and Supervisory roles on 10/24/25.
10/24 - By Dennis Cregan, applied to Gallaudet Technology Services (HCM) RBSGC, he assigned the Create Security Group, Edit RoleBased Security Group (Constrained), Edit SegmentBased Security Group, English (United States), Gallaudet Technology Services (HCM), Gallaudet Technology Services (HCM) RBSGC, and Worker Home Email SBSG roles on 10/24/25.
10/24 - By Dennis Cregan applied to no one assigned the Maintain Permissions for Security Group, Person Data: Home Contact Information, Person Data: Home Email, View Only, View Only for Person Data: Home Contact Information, and Worker Home Email - SBSG roles on 10/24/25.
10/24 - By Dennis Cregan (1000054) applied the Activate Pending Security Policy Changes role on 10/24/25.
10/24 - By Dennis Cregan (ID1000054), assigned the Create Universal Id, Edit Reference ID, and Edit Workday Account roles on 10/24/25.
10/24 - By Dennis Cregan (ID1000054) applied to no specific user, he assigned the Create Security Group, Edit Role-Based Security Group (Unconstrained), and Payroll AccountantRBSGU roles on 10/24/25.
10/24 - By user Dennis Cregan (ID 1000054) applied the Activate Pending Security Policy Changes role to no one on 10/24/25.
10/27 - By Dennis Cregan, the Edit Workday Account was applied to Benjamin Jarashow on 10/27/25.
10/27 - By Dennis Cregan, applied to the system, assigned the Enable Domain Security Policy and Security Administrator Hub roles on 10/27/25.
10/27 - Dennis Cregan applied the Activate Pending Security Policy Changes role to no one on 10/27/25.
10/27 - By Dennis Cregan, the Edit Workday Account role was assigned on 10/27/25.
10/28 - By Dennis Cregan assigned the Edit Workday Account role to Cassidy Wainwright on 10/28/25.
10/28 - By Dennis Cregan (1000054) assigned no roles to Elnicky on 10/28/25.
10/28 - By Dennis Cregan, applied to Gail Levine, assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan assigned the Edit Workday Account role to Gwennie O'Connell on 10/28/25.
10/28 - By user 1000054 / Dennis Cregan, the change applied to Hannah Kish on 10/28/25; no roles were assigned.
10/28 - By Dennis Cregan, applied to JoAnna Marker assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan, applied to Kim White, assigned the Edit Workday Account role on 10/28/25.
10/28 - Dennis Cregan assigned the Edit Workday Account role to Kristen Rusnak on 10/28/25.
10/28 - Dennis Cregan (ID 1000054) assigned Lauren Wass the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan assigned the Edit Workday Account role to Oana Petrican on 10/28/25.
10/28 - Dennis Cregan (1000054) assigned the Edit Workday Account role to Petra Herzog on 10/28/25.
10/28 - By Dennis Cregan assigned the Edit Workday Account role to Prasadapu Srinivasa Rao on 10/28/25.
10/28 - By Dennis Cregan (1000054) applied changes to Ro Percy on 10/28/25.
10/28 - By Dennis Cregan assigned the Edit Workday Account role to Ron Salyers on 10/28/25.
10/28 - By Dennis Cregan (1000054) applied changes to Anushka Gupta (agupta), assigning no roles on 10/28/25.
10/28 - By Dennis Cregan (1000054) assigned the Edit Workday Account role to chuang, Carmen Huang on 10/28/25.
10/28 - By Dennis Cregan applied the Edit Workday Account to Cassidy Wainwright on 10/28/25.
10/28 - By Dennis Cregan, applied to Gwennie O'Connell, edited the Workday account on 10/28/25.
10/28 - By Dennis Cregan, the action was applied to Jon Bannan, editing his Workday account on 10/28/25.
10/28 - By user 1000054 / Dennis Cregan, the Edit Workday Account role was assigned to jcano, Josh Cano on 10/28/25.
10/28 - By Dennis Cregan, applied to jney, John Ney, assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan, applied to Katie Lopez, assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan (1000054) assigned no roles to Lara Munoz on 10/28/25.
10/28 - By Dennis Cregan, assigned the Edit Workday Account role to mfowler, Matthew Fowler on 10/28/25.
10/28 - By Dennis Cregan (1000054) on 10/28/25, the Edit Workday Account role was assigned to Megan Romack (mromack).
10/28 - By Dennis Cregan applied to Megan Seekford assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan assigned the Edit Workday Account role to nalbert, Nico Albert on 10/28/25.
10/28 - By Dennis Cregan, the Edit Workday Account was applied to nmshelia on 10/28/25.
10/28 - By Dennis Cregan assigned no roles to Oliver Day on 10/28/25.
10/28 - Dennis Cregan (1000054) assigned the Edit Workday Account role to Oona Julien on 10/28/25.
10/28 - By Dennis Cregan assigned the Edit Workday Account role to viyer, Venu Iyer on 10/28/25.
10/28 - By Dennis Cregan, the Edit Workday Account role was assigned to the account on 10/28/25.
10/28 - By Dennis Cregan (ID 1000054) applied to no user, he assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan, the Edit Workday Account role was assigned to no user on 10/28/25.
10/28 - By Dennis Cregan, assigned the Edit Workday Account, Edit Workday Account (Default Definition), Edit Workday Account: gkim.ey / Grace Kim, and Successfully Completed roles to Grace Kim on 10/28/25.
10/28 - By Dennis Cregan (ID1000054) assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan, the Edit Workday Account role was assigned to the account on 10/28/25.
10/28 - By Dennis Cregan (ID1000054) assigned the Edit Workday Account role to the account on 10/28/25.
10/28 - By Dennis Cregan, the Edit Workday Account role was assigned to no one on 10/28/25.
10/28 - By User Dennis Cregan (ID 1000054) applied to no one, assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan, applied to the account (none), assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan, the Edit Workday Account role was assigned on 10/28/25.
10/28 - By Dennis Cregan, applied to none, assigned the Edit Workday Account, Edit Workday Account (Default Definition), Edit Workday Account: mricciardi-impl / Mike Ricciardi, and Successfully Completed roles on 10/28/25.
10/28 - By Dennis Cregan (ID1000054) assigned the Edit Workday Account role to no user on 10/28/25.
10/28 - By user Dennis Cregan (ID 1000054) applied the Edit Workday Account role to no one on 10/28/25.
10/28 - By Dennis Cregan, the Edit Workday Account role was assigned on 10/28/25.
10/28 - By Dennis Cregan, applied to Prasadapu Srinivasa Raos Workday account, assigned the Edit Workday Account, Edit Workday Account (Default Definition), and Edit Workday Account: praoimpl / Prasadapu Srinivasa Rao roles on 10/28/25.
10/28 - By Dennis Cregan, applied to no user, assigned the Edit Workday Account role on 10/28/25.
10/28 - By Dennis Cregan (ID1000054) assigned the Edit Workday Account, Edit Workday Account (Default Definition), and Edit Workday Account: vmadhavan.ey/Vaishnavi Madhavan roles on 10/28/25.
10/28 - By Dennis Cregan, applied to no one, assigned the Edit Reference ID, Edit Universal Id, and Edit Workday Account roles on 10/28/25.
10/29 - By Dennis Cregan, applied to Grace Kim, assigned the Service Center Representative Status Change role on 10/29/25.
10/29 - By Dennis Cregan assigned no roles to Jennifer Suta on 10/29/25.
10/29 - By Dennis Cregan, applied to Jennifer Suta, inactivated the Service Center Representative role on 10/29/25.
10/29 - By Dennis Cregan (1000054) edited Kyle Blancos Workday account on 10/29/25.
10/29 - By Dennis Cregan applied to Kyle Blanco, inactivated the Service Center Representative role on 10/29/25.
10/29 - By Dennis Cregan assigned the Edit Workday Account role to Petra Herzog on 10/29/25.
10/29 - By Dennis Cregan assigned the Edit Workday Account role to Sanjana Bhaskar on 10/29/25.
10/29 - By User 1000054 / Dennis Cregan applied to Sanjana Bhaskar assigned the Service Center Representative role on 10/29/25.
10/29 - By Dennis Cregan, applied to VaishnaviMadhavan, assigned the Service Center Representative role on 10/29/25.
10/29 - By Dennis Cregan (ID 1000054) on 10/29/25, the Edit Workday Account role was assigned to no one.
10/29 - By Dennis Cregan, a change was applied to no specific user, assigning the Edit Workday Account role on 10/29/25.
10/29 - By Dennis Cregan (ID 1000054) assigned the Edit Workday Account role to no user on 10/29/25.
10/29 - By Dennis Cregan, the roles Awaiting Action, Business Process Definition Error for Inactivate Service Center Representative, and Inactivate Service Center Representative were assigned on 10/29/25.
10/29 - Dennis Cregan applied the Inactivate Service Center Representative role on 10/29/25.
10/29 - By Dennis Cregan, he assigned the Inactivate HCM Validator and Inactivate Service Center Representative roles on 10/29/25.
10/29 - By Dennis Cregan, the FIN Validator and HCM Validator roles were assigned to the Service Center Representative on 10/29/25.
=== 1000998 / Thad Ferguson ===
10/01 - By Thad Ferguson (1000998) applied the Edit Reference ID role to the system on 10/1/25.
=== 1003153 / Joseph DeSiervi ===
10/06 - By User Joseph DeSiervi (1003153) applied to no specific user assigned the Assign Users to User-Based Security Group, Security Configurator, User-Based Group Change, and User-Based Group Change - Event Lite Type on 10/06/2025, 9:03:06.767 AM roles on 10/6/25.
10/06 - By Joseph DeSiervi, the system applied to no users and assigned the Assign Users to User-Based Security Group, Security Configurator, User-Based Group Change, and User-Based Group Change - Event Lite Type on 10/06/2025, 9:04:28.359 AM roles on 10/6/25.
10/24 - By User Joseph DeSiervi (ID 1003153) applied to no target, assigned the Assign Users to User-Based Security Group, Report Writer, User-Based Group Change, and User-Based Group Change - Event Lite Type on 10/24/2025, 12:14:56.013 PM roles on 10/24/25.
10/28 - By User 1003153 / Joseph DeSiervi assigned the Director, Strategic Sourcing; Expense Settlement Specialist - Gallaudet University; and Supervisor, Accounts Payable roles to Stephanie Johnson on 10/28/25.
10/28 - By JosephDeSiervi (1003153) assigned the Enable Domain Security Policy and Process: Receivable Repayment roles on 10/28/25.
10/28 - By Joseph DeSiervi (1003153) applied the Enable Domain Security Policy and Process: Receivable Repayment - Cancel roles on 10/28/25.
10/28 - By Joseph DeSiervi (1003153) applied to no one, assigned the Enable Domain Security Policy and Process: Receivable Repayment - Core roles on 10/28/25.
10/28 - By User Joseph DeSiervi (ID 1003153) applied to no target, assigned the Enable Domain Security Policy and Process: Receivable Repayment - Reporting roles on 10/28/25.
10/28 - By Joseph DeSiervi (1003153) assigned the Expense Settlement Specialist, GMT05:00 Eastern Time (NewYork), RoleBased Group Change, and RoleBased Group Change Event Lite Type on 10/27/2025,9:00:00.000PM roles to the target on 10/28/25 at 9:25.
10/28 - By Joseph DeSiervi (ID 1003153) applied the Activate Pending Security Policy Changes role on 10/28/25.
10/31 - By Joseph DeSiervi (ID 1003153) on 10/31/25, the Activate Pending Security Policy Changes role was assigned.
=== 1003966 / Kristinn Bjarnason ===
10/06 - By user 1003966 / Kristinn Bjarnason, the change applied to Dae and assigned the P000109 Assistant Professor - Dae-Kun Kim and P000109 Assistant Professor - Dae-Kun Kim - Program Coordinator (Undergraduate) - English Program roles on 10/6/25.
10/06 - By User Kristinn Bjarnason (ID1003966) assigned the GMT05:00 Eastern Time (New York), Program Coordinator Undergraduate RBSGC, Program of Study Reviewer (Undergraduate) RBSGU, RoleBased Group Change, and RoleBased Group Change Event Lite Type on 10/05/2025, 9:00:00.000PM roles to the target on 10/6/25 at 14:28.
10/16 - Kristinn Bjarnason (1003966) assigned the Faculty Advisor AA ASL Connect Advisor, Academic Foundation Manager ASL Connect Academic Unit / Continuing Education, Accommodations Viewer (CCE/ASLC) ASL Connect Academic Unit, Admissions Administration American Sign Language Department, Program Coordinator ASL Connect Academic Unit, and Program of Study Manager ASL Connect Academic Unit roles to Corey Burton on 10/16/25.
10/16 - By Kristinn Bjarnason (1003966) assigned the P000254 Operations Coordinator and P000254 Operations Specialist roles to Patrick Rolfe on 10/16/25.
10/16 - By Kristinn Bjarnason, applied to none, assigned the Academic Foundation Manager - RBSG-C, Accommodations Viewer (CCE/ASLC) - RBSG-C, Admissions Administration - RBSG - C, Faculty Advisor - RBSG-C and Faculty Advisor - RBSG-U, Program Coordinator (CE/ASL-C ) - RBSG-C, and Program of Study Manager - RBSG-C roles on 10/16/25.
10/17 - By User 1003966 / Kristinn Bjarnason applied the change to Kristinn Bjarnason on 10/17/25.
10/17 - By User 1003966 / Kristinn Bjarnason applied to Mary Perrodin, assigned the P007153 Assistant Dean role on 10/17/25.
10/17 - By User 1003966 / Kristinn Bjarnason assigned the Advising Administrator, Graduate Dean, and Unofficial Student Transcript Viewer roles to beth gibbons on 10/17/25.
10/17 - By Kristinn Bjarnason (1003966) assigned the Dean, Academics & Career Services; Dean, Academics & Career Success; Assistant Dean, Graduate Education; Advising Administrator RBSGU; Graduate Dean RBSGU; and Unofficial Student Transcript Viewer RBSGC and U roles to the applicable users on 10/17/25.
10/24 - By user 1003966 / Kristinn Bjarnason assigned the P000621 Communication and Community Engagement Manager role to Alexander Leffers on 10/24/25.
10/24 - By user 1003966 / Kristinn Bjarnason, the change applied to Shane Dundas, assigning him the Accommodation Viewer (Housing) and Accommodations Recorder roles on 10/24/25.
10/24 - By User Kristinn Bjarnason (1003966) applied to P000155 Manager, Gallaudet Interpreting Services (Unfilled), assigned the Accommodations Recorder - RBSG-C, Accommodations Viewer (GIS) - RBSG-C, and Accommodations Viewer (Housing) - RBSG-C roles on 10/24/25.
10/24 - By Kristinn Bjarnason, the P000621 Communication and Community Engagement Manager was assigned the Accommodations Recorder - RBSG-C and Accommodations Viewer (GIS) - RBSG-C roles on 10/24/25 at 9:06.
10/28 - By Kristinn Bjarnason (1003966) assigned the Customer Experience Manager and Student Records Associate - American Sign Language Department roles to Corey Burton on 10/28/25.
10/28 - By User Kristinn Bjarnason (1003966) applied to the American Sign Language Department, assigned the Student Records Associate - RBSG-C role on 10/28/25.
10/31 - By user 1003966 / Kristinn Bjarnason, the change applied to Jeffrey Levitt assigned him the Education Abroad Assistant, Study Abroad Student Worker - Dean of Faculty Academic Unit / Graduate, and Study Abroad Student Worker - Dean of Faculty Academic Unit / Undergraduate roles on 10/31/25.
10/31 - By User Kristinn Bjarnason, the system assigned the Create Security Group, Edit Role-Based Security Group (Unconstrained), English (United States), General Education Director, and General Education Director RBSG-U roles on 10/31/25 at 11:29.
10/31 - By user Kristinn Bjarnason (ID 1003966) applied the Activate Pending Security Policy Changes role to no one on 10/31/25.
10/31 - By User Kristinn Bjarnason (ID 1003966) assigned the Maintain Assignable Roles role to no user on 10/31/25.
10/31 - By User Kristinn Bjarnason (ID1003966) applied to the system, assigned the Create Security Group, Edit Role-Based Security Group (Constrained), English(United States), Study Abroad Student Worker, and Study Abroad Student WorkerRBSGC roles on 10/31/25.
10/31 - By user Kristinn Bjarnason (ID1003966) applied the Activate Pending Security Policy Changes role to no users on 10/31/25 at14:15.
10/31 - By User Kristinn Bjarnason (ID 1003966) applied to no one, assigned the Create Security Group, English (United States), and International Student Data (Medium View Only) roles on 10/31/25.
10/31 - By User 1003966 / Kristinn Bjarnason assigned the Edit Segment-Based Security Group, International Student Data (Medium View Only), Student, Study Abroad Manager - RBSG-C, and Study Abroad Student Worker RBSG-C roles on 10/31/25.
10/31 - By User 1003966 / Kristinn Bjarnason assigned the Activate Pending Security Policy Changes role on 10/31/25.
10/31 - By User Kristinn Bjarnason (ID 1003966) applied to no one, assigned the Create Security Group and Student Age Data (View only) roles on 10/31/25.
10/31 - By Kristinn Bjarnason (ID1003966) assigned the Edit Segment-Based Security Group and Student Age Data (View only) roles to Study Abroad Student Worker RBSGC on 10/31/25.
10/31 - By user Kristinn Bjarnason (ID 1003966) applied the Activate Pending Security Policy Changes role to the system on 10/31/25.
10/31 - By User Kristinn Bjarnason activated the Pending Security Policy Changes on 10/31/25.
10/31 - By Kristinn Bjarnason (1003966) assigned the GMT-05:00 Eastern Time (New York), Role-Based Group Change, Role-Based Group Change - Event Lite Type on 10/30/2025, 9:00:00.000 PM, and Study Abroad Student Worker RBSG-C roles to the Dean of Faculty Academic Unit / Graduate and Dean of Faculty Academic Unit / Undergraduate on 10/31/25.
=== 1004645 / Julie Longson ===
10/03 - By User Julie Longson (ID1004645) applied to no one, assigned the Advising Notes and Edit Student Note Security Segment roles on 10/3/25.
10/06 - Julie Longson applied the Activate Pending Security Policy Changes role to no users on 10/6/25.
10/14 - By User Julie Longson (1004645) applied to Ann Marie Divina assigned the Student Finance Associate and Student Financials Campus Engagement Administrator roles on 10/14/25.
10/14 - By Julie Longson (1004645) assigned the Student Financials Campus Engagement Administrator and Student Finance Associate roles to Fritz Ann Marie Divina on 10/14/25.
10/14 - Julie Longson (1004645) assigned Kelly Webster the ALLSTAR Student Assistant role on 10/14/25.
10/14 - By User 1004645 / Julie Longson assigned the Financial Aid Counselor, Financial Aid Student Assistant Level I, and Financial Aid Student Assistant Level II roles to Shelby Bean on 10/14/25.
10/14 - By Julie Longson (1004645) assigned the Financial Aid Student Assistant Level I - RBSG-C, Financial Aid Student Assistant Level II - RBSG-C, Financial Aid Student Assistant Level II - RBSG-U - DNU (Inactive), GMT-05:00 Eastern Time (New York), Role-Based Group Change, and Role-Based Group Change - Event Lite Type on 10/13/2025, 9:00:00.000 PM roles on 10/14/25.
10/14 - By Julie Longson (ID1004645) applied to Fritz Ann Marie Divina, assigned the Student Finance Associate RBSGU and Student Financials Campus Engagement AdministratorRBSGU roles on 10/14/25.
10/14 - By User Julie Longson (ID 1004645) applied the Student Finance Administrator - UBSG role to no user on 10/14/25.
10/16 - By user Julie Longson (ID1004645) applied the Activate Pending Security Policy Changes role to no users on 10/16/2025.
10/22 - By User 1004645 / Julie Longson applied the Activate Pending Security Policy Changes role to no one on 10/22/25.
=== jsharp-impl / Jodi Sharp ===
10/29 - By Jodi Sharp, applied to Eric Vu assigned the Person Email Change - Event Lite Type for Eric Vu on 10/29/2025, 9:51:44.582 AM role on 10/29/25.
10/29 - By Jodi Sharp (jsharp-impl) applied to no one, assigned the Create Implementer role on 10/29/25.
10/29 - By Jodi Sharp (jsharp-impl) applied the Create Implementer, Person Email Change, Person Email Change - Event Lite Type for Alexa Grant on 10/29/2025, 9:56:49.540 AM, and agrant@hcg.com\n\nAlexa Grant roles to the system on 10/29/25.

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,359 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
import re
import json
import logging
from collections import Counter, defaultdict
from typing import List, Dict, Any, Optional
import requests
import pandas as pd
import spacy
from openai import OpenAI
from tqdm import tqdm
# =========================
# Configuration
# =========================
# DEFAULT_LM_IP = "192.168.1.221" # default LM Studio host (without /v1)
DEFAULT_LM_IP = "10.81.209.99" # default LM Studio host (without /v1)
LLM_MODEL = "openai/gpt-oss-20b"
LLM_API_KEY = "not-needed" # LM Studio typically doesn't require an API key
INPUT_CSV = "test.csv"
OUTPUT_CSV = "test_with_names.csv"
EVENT_LOG = "event_log.txt"
FINAL_SNAPSHOT = "final.csv" # snapshot right before LM Studio summarization
# Columns to process
SOURCE_COL_1 = "Instance that Changed"
TARGET_COL_1 = "Applied to"
SOURCE_COL_2 = "Added"
TARGET_COL_2 = "Added Applied to"
ENTERED_COL = "Entered On"
ENTERED_MMDD_COL = "Entered On (MM/DD)"
# Values to ignore entirely (case-insensitive)
AUTO_STRINGS = {"automatic complete"}
def is_auto(val) -> bool:
return isinstance(val, str) and val.strip().lower() in AUTO_STRINGS
# Regex helpers
DELIM_SPLIT = re.compile(r"\s*[\/|\-–—]\s*")
KEEP_CHARS = re.compile(r"[^A-Za-zÀ-ÖØ-öø-ÿ' .\-]")
def clean_person(text: str) -> str:
"""Clean extracted name by removing job codes/fragments after dashes/slashes; keep name-ish chars."""
if not text:
return ""
first = DELIM_SPLIT.split(text, maxsplit=1)[0]
first = KEEP_CHARS.sub("", first).strip()
return re.sub(r"\s{2,}", " ", first)
# =========================
# LM Studio reachability
# =========================
def check_lmstudio(ip: str) -> str:
"""
Ensure LM Studio endpoint is reachable; if not, prompt for IP until it is.
Returns the validated base URL like "http://<ip>:1234/v1".
"""
def _ok(url: str) -> bool:
try:
r = requests.get(url.rstrip("/") + "/models", timeout=5)
return r.status_code == 200
except Exception:
return False
base_url = f"http://{ip}:1234/v1"
if _ok(base_url):
print(f"✅ LM Studio reachable at {base_url}")
return base_url
print(f"❌ Could not reach LM Studio at {base_url}")
while True:
new_ip = input("Enter LM Studio IP address (e.g. 192.168.1.221): ").strip()
if not new_ip:
print("Aborted: No IP provided.")
sys.exit(1)
base_url = f"http://{new_ip}:1234/v1"
print(f"🔍 Retesting {base_url}...")
if _ok(base_url):
print(f"✅ LM Studio reachable at {base_url}")
return base_url
else:
print("❌ Still unreachable. Try again or Ctrl+C to exit.")
# Perform reachability check BEFORE any processing
LLM_BASE_URL = check_lmstudio(DEFAULT_LM_IP)
client = OpenAI(base_url=LLM_BASE_URL, api_key=LLM_API_KEY)
# =========================
# spaCy model (Transformer)
# =========================
print("🔍 Loading spaCy transformer model: en_core_web_trf")
nlp = spacy.load(
"en_core_web_trf",
exclude=["parser", "tagger", "attribute_ruler", "lemmatizer", "morphologizer"],
)
print("✅ spaCy model loaded successfully.")
def extract_names(text: str) -> str:
"""Extract distinct PERSON names using spaCy Transformer model."""
if not isinstance(text, str) or not text.strip():
return ""
doc = nlp(text)
names, seen = [], set()
for ent in doc.ents:
if ent.label_ == "PERSON":
cleaned = clean_person(ent.text)
key = cleaned.lower()
if cleaned and key not in seen:
seen.add(key)
names.append(cleaned)
return ", ".join(names)
def insert_after(df: pd.DataFrame, after_col: str, new_col: str, values: pd.Series) -> None:
"""Insert new_col immediately after after_col (drop existing if present)."""
if new_col in df.columns:
df.drop(columns=[new_col], inplace=True)
idx = df.columns.get_loc(after_col) + 1
df.insert(idx, new_col, values)
def dataframe_to_compact_event(df: pd.DataFrame) -> str:
"""Compact JSON payload for a grouped event (keeps unique values per column)."""
def uniq(col):
return sorted([v for v in df[col].dropna().unique().tolist()]) if col in df else []
payload = {
"applied_to": uniq(TARGET_COL_1),
"by_user": uniq("By User"),
"in_transaction": uniq("In Transaction"),
"entered_on": uniq(ENTERED_COL),
"dates_mmdd": uniq(ENTERED_MMDD_COL),
"instances": uniq(SOURCE_COL_1),
"added": uniq(SOURCE_COL_2),
"row_count": int(len(df)),
}
return json.dumps(payload, ensure_ascii=False, indent=2)
# =========================
# Main flow
# =========================
# If processed CSV already exists, skip straight to summarization
if os.path.exists(OUTPUT_CSV):
print(f"⚡ Skipping CSV processing — {OUTPUT_CSV} already exists.")
df = pd.read_csv(OUTPUT_CSV)
# Ensure MM/DD exists (for old CSVs)
if ENTERED_MMDD_COL not in df.columns and ENTERED_COL in df.columns:
ts = pd.to_datetime(df[ENTERED_COL], errors="coerce")
df[ENTERED_MMDD_COL] = ts.dt.strftime("%m/%d").fillna("")
else:
print("⚙️ Processing CSV to extract names and generate output...")
# Load CSV
df = pd.read_csv(INPUT_CSV)
# Derive Entered On (MM/DD)
if ENTERED_COL in df.columns:
try:
ts = pd.to_datetime(df[ENTERED_COL], format="mixed", errors="coerce")
except TypeError:
ts = pd.to_datetime(df[ENTERED_COL], errors="coerce")
df[ENTERED_MMDD_COL] = ts.dt.strftime("%m/%d").fillna("")
else:
df[ENTERED_MMDD_COL] = ""
# Live progress counters for names across both columns
name_counter = Counter()
def _process_series_with_progress(series: pd.Series, desc: str) -> pd.Series:
"""Iterate with progress, update name_counter, and return extracted names Series."""
values = series.fillna("").astype(str).tolist()
out = []
total = len(values)
if total == 0:
return pd.Series([], dtype=object)
step = max(10, total // 20) # update ~every 5% (at least every 10 rows)
pbar = tqdm(values, desc=f"NER: {desc}", leave=True)
for i, text in enumerate(pbar, start=1):
names = extract_names(text)
# Update running totals (ignore "Automatic Complete")
for n in [x.strip() for x in names.split(",") if x.strip()]:
if n.lower() not in AUTO_STRINGS:
name_counter[n] += 1
out.append(names)
# Periodic status refresh
if i % step == 0 or i == total:
top = ", ".join(f"{n}:{c}" for n, c in name_counter.most_common(3))
pbar.set_postfix_str(f"unique={len(name_counter)} top=[{top}]")
return pd.Series(out, index=series.index, dtype=object)
# =========================
# Requested processing order
# 1) Process "Added" FIRST -> fill BOTH "Added Applied to" and "Applied to"
# 2) Then process "Instance that Changed" ONLY where "Applied to" is still empty -> fill BOTH
# =========================
# Ensure target columns exist and are positioned
if SOURCE_COL_1 in df.columns:
if TARGET_COL_1 not in df.columns:
insert_after(df, SOURCE_COL_1, TARGET_COL_1, pd.Series([""] * len(df), index=df.index))
else:
if TARGET_COL_1 not in df.columns:
df[TARGET_COL_1] = ""
if SOURCE_COL_2 in df.columns:
if TARGET_COL_2 not in df.columns:
insert_after(df, SOURCE_COL_2, TARGET_COL_2, pd.Series([""] * len(df), index=df.index))
else:
if TARGET_COL_2 not in df.columns:
df[TARGET_COL_2] = ""
# ---- 1) Added -> fill BOTH "Added Applied to" and "Applied to"
if SOURCE_COL_2 in df.columns:
added_names = _process_series_with_progress(df[SOURCE_COL_2], f"{SOURCE_COL_2} (ALL)")
df[TARGET_COL_2] = added_names
df[TARGET_COL_1] = added_names
else:
df[TARGET_COL_2] = df.get(TARGET_COL_2, "")
df[TARGET_COL_1] = df.get(TARGET_COL_1, "")
# ---- 2) Instance that Changed -> only where "Applied to" still empty; fill BOTH
if SOURCE_COL_1 in df.columns:
mask_empty_applied = df[TARGET_COL_1].fillna("").str.strip() == ""
if mask_empty_applied.any():
inst_subset = df.loc[mask_empty_applied, SOURCE_COL_1]
inst_names = _process_series_with_progress(inst_subset, f"{SOURCE_COL_1} (only where Applied to empty)")
df.loc[mask_empty_applied, TARGET_COL_1] = inst_names
df.loc[mask_empty_applied, TARGET_COL_2] = inst_names
# --- Remove any rows that are purely "Automatic Complete" in key fields ---
for col in [SOURCE_COL_1, SOURCE_COL_2, "In Transaction"]:
if col in df.columns:
df = df[~df[col].apply(is_auto)]
# --- Keep only selected columns (incl. MM/DD) ---
keep_cols = [
SOURCE_COL_1,
TARGET_COL_1,
"In Transaction",
SOURCE_COL_2,
TARGET_COL_2,
"By User",
ENTERED_COL,
ENTERED_MMDD_COL,
]
df = df[[c for c in keep_cols if c in df.columns]]
# --- Filter rows: keep where Applied to == Added Applied to (case-insensitive) ---
if TARGET_COL_1 in df.columns and TARGET_COL_2 in df.columns:
df = df[
df[TARGET_COL_1].fillna("").str.strip().str.lower()
== df[TARGET_COL_2].fillna("").str.strip().str.lower()
]
# --- Drop duplicates & save overall result ---
df = df.drop_duplicates().reset_index(drop=True)
df.to_csv(OUTPUT_CSV, index=False)
print(f"✅ Saved {len(df)} unique matching rows to {OUTPUT_CSV}")
# =========================
# NEW RULE APPLIED BEFORE SUMMARIZATION (covers both branches):
# Ignore rows where 'Added Applied to' value appears inside 'By User'
# Vectorized + strictly-boolean mask to avoid TypeError on "~"
# =========================
if TARGET_COL_2 in df.columns and "By User" in df.columns and not df.empty:
# Normalize to lowercase strings
names = df[TARGET_COL_2].fillna("").astype(str).str.strip().str.lower()
byuser = df["By User"].fillna("").astype(str).str.strip().str.lower()
# Build a boolean mask: both non-empty AND 'names' is a substring of 'byuser'
contains_flags = pd.Series(
[(n != "") and (u != "") and (n in u) for n, u in zip(names, byuser)],
index=df.index,
dtype="bool",
)
before = len(df)
df = df[~contains_flags].reset_index(drop=True)
removed = before - len(df)
if removed:
print(f"🚫 Ignored {removed} rows where 'Added Applied to' matched text in 'By User'.")
# --- Snapshot rows right before LM Studio processing ---
df.to_csv(FINAL_SNAPSHOT, index=False)
print(f"📦 Wrote {len(df)} rows to {FINAL_SNAPSHOT} (pre-LM Studio snapshot)")
# =========================
# LM Studio event summary generation (group by By User, then date asc)
# =========================
if not df.empty:
grouped = df.groupby([TARGET_COL_1, "By User", ENTERED_COL], dropna=False)
summaries = [] # list of tuples (by_user, mmdd, sentence)
for keys, gdf in grouped:
applied_to, by_user, entered_on = keys
if not applied_to or str(applied_to).strip() == "":
continue
mmdd_vals = gdf[ENTERED_MMDD_COL].dropna().astype(str)
mmdd = next((v for v in mmdd_vals if v.strip()), "")
payload = dataframe_to_compact_event(gdf)
prompt = (
"You are a compliance and information security analyst. "
"Given the following grouped audit data, produce ONE clear and concise sentence summarizing the event. "
"Include: (1) who performed the action (By User, include name and ID if available), "
"(2) who the change applied to (Applied to), "
"(3) the full list of role names that were assigned or added (from 'Instance that Changed' and 'Added'), "
"and (4) the date of the event. "
"Always mention the specific role titles exactly as shown in the data. "
"If multiple roles were assigned, list them all in a natural phrase like "
"'assigned the A, B, and C roles'. "
"Do not include raw JSON, extra commentary, or line breaks. Return only one sentence.\n\n"
f"Audit Data (JSON):\n{payload}"
)
try:
resp = client.chat.completions.create(
model=LLM_MODEL,
messages=[
{"role": "system", "content": "You write terse, clear compliance summaries."},
{"role": "user", "content": prompt},
],
temperature=0.2,
)
one_liner = (resp.choices[0].message.content or "").strip()
except Exception as e:
one_liner = f"[LLM ERROR] {e}"
summaries.append((by_user or "Unknown User", mmdd, one_liner))
# Group by By User, sort each user's entries by mm/dd asc, write file (OVERWRITE)
grouped_summaries: Dict[str, list[tuple[str, str]]] = defaultdict(list)
for by_user, mmdd, line in summaries:
grouped_summaries[by_user].append((mmdd, line))
for user in grouped_summaries:
grouped_summaries[user].sort(key=lambda x: x[0] or "")
with open(EVENT_LOG, "w", encoding="utf-8") as f:
for user in sorted(grouped_summaries.keys()):
f.write(f"=== {user} ===\n")
for mmdd, line in grouped_summaries[user]:
prefix = f"{mmdd} - " if mmdd else ""
f.write(f"{prefix}{line}\n")
f.write("\n")
total_events = sum(len(v) for v in grouped_summaries.values())
print(f"📝 Overwrote {EVENT_LOG} with {total_events} grouped event summaries")
else:
print(" No matching rows found; nothing to summarize.")

View File

@@ -0,0 +1 @@
rm final.csv test_with_names.csv; python process.py

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff