Compare commits
3 Commits
aac1bc5c88
...
886eb58842
Author | SHA1 | Date | |
---|---|---|---|
886eb58842 | |||
963dbae8d8 | |||
8de4d90e2f |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
mccs-it/data
|
25
mccs-it/CSVFilterer.html
Normal file
25
mccs-it/CSVFilterer.html
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>CSV Filterer</title>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.3.0/papaparse.min.js"></script>
|
||||||
|
<script src="./CSVFilterer.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>CSV Filterer</h1>
|
||||||
|
<label for="ueFileInput">UserEnrollments.csv:</label>
|
||||||
|
<input type="file" id="ueFileInput" accept=".csv">
|
||||||
|
<button onclick="filterEnrollments(document)">Filter Enrollments</button>
|
||||||
|
<br />
|
||||||
|
<label for="usersFileInput">Users.csv:</label>
|
||||||
|
<input type="file" id="usersFileInput" accept=".csv">
|
||||||
|
<button onclick="parseUsers(document.getElementById('usersFileInput'), document)">Parse Users</button>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<button onclick="refreshStatus(document)">Refresh Status</button>
|
||||||
|
<p>Status: <span id="status">Unknown</span></p>
|
||||||
|
<a id="downloadLink" style="display:none;">Download Filtered CSV</a>
|
||||||
|
</body>
|
||||||
|
</html>
|
125
mccs-it/CSVFilterer.js
Normal file
125
mccs-it/CSVFilterer.js
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
class UserData {
|
||||||
|
constructor(dataRow) {
|
||||||
|
this.userId = dataRow[0];
|
||||||
|
this.uName = dataRow[1];
|
||||||
|
this.fName = dataRow[3];
|
||||||
|
this.sName = dataRow[5];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class EnrollmentData {
|
||||||
|
constructor(dataRow) {
|
||||||
|
this.orgUnitId = dataRow[0];
|
||||||
|
this.userId = dataRow[1];
|
||||||
|
this.roleName = dataRow[2];
|
||||||
|
this.timestamp = dataRow[3];
|
||||||
|
this.roleId = dataRow[5];
|
||||||
|
this.fName = "N/A";
|
||||||
|
this.sName = "N/A";
|
||||||
|
this.uName = "N/A";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create empty Maps to store the filtered enrollment data and user info in
|
||||||
|
// These will be cross checked later to generate the list of all instructors
|
||||||
|
const users = new Map();
|
||||||
|
const enrollments = new Map();
|
||||||
|
|
||||||
|
let states = {
|
||||||
|
enrollments: "Unfiltered",
|
||||||
|
users: "Unparsed"
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterEnrollments(document) {
|
||||||
|
let fileInput = document.getElementById('ueFileInput');
|
||||||
|
let filterValue = "KV Instructor";
|
||||||
|
document.getElementById('downloadLink')
|
||||||
|
if (!fileInput.files.length) {
|
||||||
|
alert('Please select a CSV file.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = fileInput.files[0];
|
||||||
|
|
||||||
|
Papa.parse(file, {
|
||||||
|
complete: function(results) {
|
||||||
|
// Iterate over the entire data set
|
||||||
|
results.data.forEach(row => {
|
||||||
|
// Create an EnrollmentData object with it:
|
||||||
|
const enrollmentData = new EnrollmentData(row);
|
||||||
|
// If the row contains the filter string and is not in the 'seen' Set
|
||||||
|
if (row.some(cell => cell.includes(filterValue)) && !enrollments.has(enrollmentData.userId)) {
|
||||||
|
// Add it to the data array
|
||||||
|
enrollments.set(enrollmentData.userId, enrollmentData);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
states.enrollments = "Filtered";
|
||||||
|
refreshStatus(document);
|
||||||
|
},
|
||||||
|
error: function(error) {
|
||||||
|
console.error(error);
|
||||||
|
alert('An error occurred while processing the file.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const parseUsers = (usersFileInputs, document) => {
|
||||||
|
if (!usersFileInputs.files.length) {
|
||||||
|
alert('Please select a CSV file.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const usersFile = usersFileInputs.files[0];
|
||||||
|
|
||||||
|
Papa.parse(usersFile, {
|
||||||
|
complete: function(results) {
|
||||||
|
// Iterate over the entire data set
|
||||||
|
results.data.forEach(row => {
|
||||||
|
// Create an object with it:
|
||||||
|
const userData = new UserData(row);
|
||||||
|
// Add it to the data array
|
||||||
|
users.set(userData.userId, userData);
|
||||||
|
});
|
||||||
|
states.users = "Parsed";
|
||||||
|
refreshStatus(document);
|
||||||
|
generateList(document);
|
||||||
|
},
|
||||||
|
error: function(error) {
|
||||||
|
console.error(error);
|
||||||
|
alert('An error occurred while processing the Users.csv file.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const generateList = (document) => {
|
||||||
|
const preCSV = [
|
||||||
|
"UserId,Timestamp,FirstName,LastName,Username"
|
||||||
|
];
|
||||||
|
enrollments.forEach(e => {
|
||||||
|
// Get the associated user
|
||||||
|
const user = users.get(e.userId);
|
||||||
|
preCSV.push(`${user.userId},${e.timestamp}.${user.fName},${user.sName},${user.uName}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
generateCSV(preCSV, document);
|
||||||
|
}
|
||||||
|
|
||||||
|
const generateCSV = (input, document) => {
|
||||||
|
const downloadLink = document.getElementById("downloadLink");
|
||||||
|
const csv = Papa.unparse(input);
|
||||||
|
|
||||||
|
const blob = new Blob([csv], { type: 'text/csv' });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
|
||||||
|
downloadLink.href = url;
|
||||||
|
downloadLink.download = 'filtered.csv';
|
||||||
|
downloadLink.style.display = 'block';
|
||||||
|
downloadLink.textContent = 'Download Filtered CSV';
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshStatus(document) {
|
||||||
|
let statusSpan = document.getElementById('status')
|
||||||
|
let statusString = `Enrollments: ${states.enrollments} | Users: ${states.users}`;
|
||||||
|
statusSpan.innerHTML = statusString;
|
||||||
|
}
|
128
mccs-it/NewApplicant.py
Normal file
128
mccs-it/NewApplicant.py
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
from selenium import webdriver
|
||||||
|
from selenium.webdriver.common.keys import Keys
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
from selenium.webdriver.common.alert import Alert
|
||||||
|
import time
|
||||||
|
import getpass
|
||||||
|
|
||||||
|
# Put
|
||||||
|
studentIds = [
|
||||||
|
"5121951",
|
||||||
|
"5010522",
|
||||||
|
"5137363",
|
||||||
|
"5145175",
|
||||||
|
"5144503",
|
||||||
|
"5146582",
|
||||||
|
"5142212",
|
||||||
|
"5146605",
|
||||||
|
"5109465",
|
||||||
|
"5146602",
|
||||||
|
"5146608",
|
||||||
|
"5146598",
|
||||||
|
"5127204",
|
||||||
|
"5142694",
|
||||||
|
"5123415",
|
||||||
|
"5146588",
|
||||||
|
"5146589",
|
||||||
|
"5146600",
|
||||||
|
"5146581",
|
||||||
|
"5146506",
|
||||||
|
"5146609",
|
||||||
|
"5146607",
|
||||||
|
"5146601",
|
||||||
|
"5131148",
|
||||||
|
"5107200",
|
||||||
|
"5133891",
|
||||||
|
"5005257",
|
||||||
|
"5146590",
|
||||||
|
"5135862",
|
||||||
|
"5146599",
|
||||||
|
"5146586",
|
||||||
|
"5146552",
|
||||||
|
"5146308",
|
||||||
|
"5136688",
|
||||||
|
"5126696",
|
||||||
|
]
|
||||||
|
|
||||||
|
class StudentInfo:
|
||||||
|
def __init__(self, name, id, auth_method, ad_ou):
|
||||||
|
self.name = name
|
||||||
|
self.id = id
|
||||||
|
self.auth_method = auth_method
|
||||||
|
self.ad_ou = ad_ou
|
||||||
|
|
||||||
|
driver = webdriver.Firefox()
|
||||||
|
|
||||||
|
def login():
|
||||||
|
username = input("MyKV Username: ")
|
||||||
|
password = getpass.getpass(prompt="MyKV Password: ", stream=None)
|
||||||
|
driver.get("https://my.kvcc.me.edu/ics/")
|
||||||
|
time.sleep(1)
|
||||||
|
driver.find_element(By.ID, "userName").send_keys(username)
|
||||||
|
driver.find_element(By.ID, "password").send_keys(password)
|
||||||
|
driver.find_element(By.ID, "siteNavBar_welcomeBackBarLoggedOut_ButtonLogin").click()
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
def navToLookup():
|
||||||
|
driver.get("https://my.kvcc.me.edu/ICS/IT_Admin/Help_Desk_Apps/")
|
||||||
|
time.sleep(1)
|
||||||
|
driver.find_element(By.ID, "pg0_V_lnkToMainView").click()
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
def navToStudentInfo(id):
|
||||||
|
driver.get("https://my.kvcc.me.edu/jicspages/It_Utilities/Helpdesk/HelpDesk_Main.aspx?1=" + id + "&2=@@UserName&3=" + id)
|
||||||
|
|
||||||
|
def getStudentInfo():
|
||||||
|
stu_name = driver.find_element(By.XPATH, "//html/body/form/div/table/tbody/tr/td/span/table/tbody/tr[4]/td[1]").text
|
||||||
|
stu_id = driver.find_element(By.XPATH, "//html/body/form/div/table/tbody/tr/td/span/table/tbody/tr[4]/td[2]").text
|
||||||
|
# auth_text = driver.find_element(By.XPATH, "//html/body/form/div/table/tbody/tr/td/span/table/tbody/tr[5]/td[3]").text
|
||||||
|
auth_method = driver.find_element(By.XPATH, "//html/body/form/div/table/tbody/tr/td/span/table/tbody/tr[6]/td[1]").text
|
||||||
|
# ad_text = driver.find_element(By.XPATH, "//html/body/form/div/table/tbody/tr/td/span/table/tbody/tr[7]/td[2]").text
|
||||||
|
ad_ou = driver.find_element(By.XPATH, "//html/body/form/div/table/tbody/tr/td/span/table/tbody/tr[8]/td[3]").text
|
||||||
|
|
||||||
|
info = StudentInfo(stu_name, stu_id, auth_method, ad_ou)
|
||||||
|
|
||||||
|
combined = stu_name + " (" + stu_id + ")\nAD OU: "+ ad_ou + "\nAuthentication: " + auth_method
|
||||||
|
print(combined)
|
||||||
|
return info
|
||||||
|
|
||||||
|
def resetPassword(info):
|
||||||
|
# TODO
|
||||||
|
driver.get("https://my.kvcc.me.edu/jicspages/It_Utilities/Helpdesk/HelpDesk_Main.aspx?1=" + info.id + "&2=@@UserName&3=" + info.id + "&4=3")
|
||||||
|
alert = Alert(driver)
|
||||||
|
print(alert.text)
|
||||||
|
alert.accept()
|
||||||
|
time.sleep(1)
|
||||||
|
driver.get("https://my.kvcc.me.edu/jicspages/It_Utilities/Helpdesk/HelpDesk_Main.aspx?1=" + info.id + "&2=@@UserName&3=" + info.id)
|
||||||
|
print("Password reset.")
|
||||||
|
|
||||||
|
def createADAcct(info):
|
||||||
|
driver.get("https://my.kvcc.me.edu/jicspages/It_Utilities/Helpdesk/HelpDesk_Main.aspx?1=" + info.id + "&2=@@UserName&3=" + info.id + "&4=2")
|
||||||
|
alert = Alert(driver)
|
||||||
|
print(alert.text)
|
||||||
|
alert.accept()
|
||||||
|
time.sleep(1)
|
||||||
|
driver.get("https://my.kvcc.me.edu/jicspages/It_Utilities/Helpdesk/HelpDesk_Main.aspx?1=" + info.id + "&2=@@UserName&3=" + info.id)
|
||||||
|
|
||||||
|
def checkStudentInfo(info):
|
||||||
|
if info.auth_method == "Portal Only":
|
||||||
|
print("No AD authentication, only resetting password.")
|
||||||
|
resetPassword(info)
|
||||||
|
elif info.auth_method == "Active Directory":
|
||||||
|
if info.ad_ou != "":
|
||||||
|
print("AD authentication set up, with an already existing account, only resetting password.")
|
||||||
|
resetPassword(info)
|
||||||
|
else:
|
||||||
|
print("AD authentication set up, without an AD account. Creating account then resetting password.")
|
||||||
|
resetPassword(info)
|
||||||
|
else:
|
||||||
|
print("Unable to determine authentication method. Please complete this manually.")
|
||||||
|
|
||||||
|
|
||||||
|
login()
|
||||||
|
for id in studentIds:
|
||||||
|
navToStudentInfo(id)
|
||||||
|
studentInfo = getStudentInfo()
|
||||||
|
checkStudentInfo(studentInfo)
|
30
mccs-it/UEFilterer.py
Normal file
30
mccs-it/UEFilterer.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Filters Brightspace's DataHub's UserEnrollments.csv file for a single college
|
||||||
|
# Install Python on Windows from Powershell by running `python` with no arguments
|
||||||
|
# pip install pandas
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
college = 'KV'
|
||||||
|
ue_input_file = '.\\data\\UserEnrollments.csv'
|
||||||
|
ue_output_file = '.\\data\\UEFiltered' + college + '.csv'
|
||||||
|
ue_field_name = 'RoleName'
|
||||||
|
ue_filter_value = college + ' Instructor'
|
||||||
|
|
||||||
|
users_input_file = '.\\data\\Users.csv'
|
||||||
|
users_output_file = '.\\data\\UsersFiltered' + college + '.csv'
|
||||||
|
users_field_name = 'UserName'
|
||||||
|
users_filter_value = "KV_"
|
||||||
|
|
||||||
|
def filter_csv(input_file, output_file, field_name, filter_value):
|
||||||
|
# Read the CSV file
|
||||||
|
df = pd.read_csv(input_file)
|
||||||
|
|
||||||
|
# Filter the DataFrame based on the field value
|
||||||
|
filtered_df = df[df[field_name].str.contains(filter_value, na=False)]
|
||||||
|
|
||||||
|
# Export the filtered DataFrame to a new CSV file
|
||||||
|
filtered_df.to_csv(output_file, index=False)
|
||||||
|
|
||||||
|
filter_csv(ue_input_file, ue_output_file, ue_field_name, ue_filter_value)
|
||||||
|
filter_csv(users_input_file, users_output_file, users_field_name, users_filter_value)
|
Loading…
Reference in New Issue
Block a user