From 7bef69a200f64eb66904debab4d430feab1a9f7b Mon Sep 17 00:00:00 2001 From: Mike Sheldon Date: Tue, 19 Jan 2021 07:22:33 -0800 Subject: [PATCH] Config, Staff (#2) - Add Configuration - Add Staff - Adjust Students --- configuration.json | 58 ++++++++++++ departments.ps1 => staff.departments.ps1 | 17 ++-- staff.persons.ps1 | 115 +++++++++++++++++++++++ students.departments.ps1 | 62 ++++++++++++ persons.ps1 => students.persons.ps1 | 32 +++---- 5 files changed, 258 insertions(+), 26 deletions(-) create mode 100644 configuration.json rename departments.ps1 => staff.departments.ps1 (69%) create mode 100644 staff.persons.ps1 create mode 100644 students.departments.ps1 rename persons.ps1 => students.persons.ps1 (79%) diff --git a/configuration.json b/configuration.json new file mode 100644 index 0000000..c07d07e --- /dev/null +++ b/configuration.json @@ -0,0 +1,58 @@ +[ + { + "key": "baseurl", + "type": "input", + "defaultValue": "", + "templateOptions": { + "label": "Base URI", + "required": true, + "placeholder": "https://customername.powerschool.com" + } + }, + { + "key": "apiKey", + "type": "input", + "defaultValue": "", + "templateOptions": { + "label": "Client Key", + "required": true + } + }, + { + "key": "apiSecret", + "type": "input", + "defaultValue": "", + "templateOptions": { + "label": "Client Secret", + "type": "password", + "required": true + } + }, + { + "key": "expansions", + "type": "input", + "defaultValue": "demographics, school_enrollment, contact_info", + "templateOptions": { + "label": "Expansions", + "required": true + } + }, + { + "key": "extensions", + "type": "input", + "defaultValue": "", + "templateOptions": { + "label": "Extensions", + "required": true + } + }, + { + "key": "filter", + "type": "input", + "defaultValue": "name.last_name==*;school_enrollment.enroll_status_code==(-1,0)", + "templateOptions": { + "label": "Filter", + "required": false + } + } +] \ No newline at end of file diff --git a/departments.ps1 b/staff.departments.ps1 similarity index 69% rename from departments.ps1 rename to staff.departments.ps1 index 3dc709b..9a9c994 100644 --- a/departments.ps1 +++ b/staff.departments.ps1 @@ -1,14 +1,15 @@ #Config -$baseurl = "https://.powerschool.com"; -$apiKey = ""; -$apiSecret = ""; +$config = ConvertFrom-Json $configuration; +$expansions = $config.expansions -split (","); +$extensions = $config.extensions -split (","); [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; #Get OAuth Token -$Token = [System.Convert]::ToBase64String( [System.Text.Encoding]::ASCII.GetBytes("$($apiKey):$($apiSecret)") ); +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; +$Token = [System.Convert]::ToBase64String( [System.Text.Encoding]::ASCII.GetBytes("$($config.apiKey):$($config.apiSecret)") ); $headers = @{ Authorization = "Basic " + $Token }; -$tokenResponse = Invoke-RestMethod -uri "$($baseurl)/oauth/access_token" -Method 'POST' -Headers $headers -Body (@{grant_type= "client_credentials";}) +$tokenResponse = Invoke-RestMethod -uri "$($config.baseurl)/oauth/access_token" -Method 'POST' -Headers $headers -Body (@{grant_type= "client_credentials";}) $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Authorization", "Bearer $($tokenResponse.access_token)") @@ -16,7 +17,7 @@ $headers.Add("Accept", "application/json") #Get Schools Write-Verbose -Verbose "Retrieving Schools" -$uri = "$($baseurl)/ws/v1/district/school/count" +$uri = "$($config.baseurl)/ws/v1/district/school/count" $count = (Invoke-RestMethod $uri -Method GET -Headers $headers ).resource.count $page = 1; $schools = [System.Collections.ArrayList]@(); @@ -26,7 +27,7 @@ while($true) page = $page; pagesize = 100; } - $uri = "$($baseurl)/ws/v1/district/school" + $uri = "$($config.baseurl)/ws/v1/district/school" $response = Invoke-RestMethod $uri -Method GET -Headers $headers -Body $parameters if($response.schools.school -is [array]) @@ -58,4 +59,4 @@ foreach($s in $schools) } $row | ConvertTo-Json -Depth 10 -} +} \ No newline at end of file diff --git a/staff.persons.ps1 b/staff.persons.ps1 new file mode 100644 index 0000000..c1d208e --- /dev/null +++ b/staff.persons.ps1 @@ -0,0 +1,115 @@ +#Configuration +$config = ConvertFrom-Json $configuration; +$expansions = $config.expansions -split (","); +$extensions = $config.extensions -split (","); + +#Get OAuth Token +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; +$Token = [System.Convert]::ToBase64String( [System.Text.Encoding]::ASCII.GetBytes("$($config.apiKey):$($config.apiSecret)") ); +$headers = @{ Authorization = "Basic " + $Token }; +$tokenResponse = Invoke-RestMethod -uri "$($config.baseurl)/oauth/access_token" -Method 'POST' -Headers $headers -Body (@{grant_type= "client_credentials";}) + + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.Add("Authorization", "Bearer $($tokenResponse.access_token)") +$headers.Add("Accept", "application/json") + +#Get Schools +$uri = "$($config.baseurl)/ws/v1/district/school" +$schools = (Invoke-RestMethod $uri -Method GET -Headers $headers).schools.school + + +$allstaff = [System.Collections.ArrayList]@(); +foreach($school in $schools) +{ + #Count Staff + $uri = "$($config.baseurl)/ws/v1/school/$($school.id)/staff/count" + $count = (Invoke-RestMethod $uri -Method GET -Headers $headers -Body $parameters).resource.count + + #Get Staff + Write-Verbose -Verbose "Retrieving Staff ($($school.id))" + $page = 1; + $staff = [System.Collections.ArrayList]@(); + + while($true) + { + $parameters = @{ + expansions = ($expansions -join ','); + page = $page; + pagesize = 100 + + } + $uri = "$($config.baseurl)/ws/v1/school/$($school.id)/staff" + Write-Verbose -Verbose "Page $($page)"; + $response = Invoke-RestMethod $uri -Method GET -Headers $headers -Body $parameters + + if($response.staffs.staff -eq $null) { break; } + + if($response.staffs.staff -is [array]) + { + [void]$staff.AddRange($response.staffs.staff); + } + else + { + [void]$staff.Add($response.staffs.staff); + } + + if($staff.count -lt $count) + { + $page++; + } + else + { + break; + } + + } + + if($staff.count -gt 0) + { + [void]$allStaff.AddRange($staff); + } +} + +function Get-ObjectProperties +{ + param ($Object, $Depth = 0, $MaxDepth = 10) + $OutObject = @{}; + + foreach($prop in $Object.PSObject.properties) + { + if ($prop.TypeNameOfValue -eq "System.Management.Automation.PSCustomObject" -or $prop.TypeNameOfValue -eq "System.Object" -and $Depth -lt $MaxDepth) + { + $OutObject[$prop.Name] = Get-ObjectProperties -Object $prop.Value -Depth ($Depth + 1); + } + else + { + $OutObject[$prop.Name] = "$($prop.Value)"; + } + } + return $OutObject; +} + +foreach($s in $allstaff) +{ + $person = @{}; + + $person = Get-ObjectProperties -Object $s; + + $person['ExternalId'] = if($s.id) { $s.Id } else { $s.local_id } + $person['DisplayName'] = "$($s.Name.first_name) $($s.name.last_name) ($($person.ExternalId))"; + + $person['Contracts'] = [System.Collections.ArrayList]@(); + + foreach($school in $s.school_affiliations.school_affiliation) + { + $contract = @{}; + $location = @{}; + + $contract = Get-ObjectProperties -Object $school; + $contract['PersonExternalId'] = $($person.ExternalId) + [void]$person['Contracts'].Add($contract); + } + + Write-Output ($person | ConvertTo-Json -Depth 20); +} \ No newline at end of file diff --git a/students.departments.ps1 b/students.departments.ps1 new file mode 100644 index 0000000..9a9c994 --- /dev/null +++ b/students.departments.ps1 @@ -0,0 +1,62 @@ +#Config +$config = ConvertFrom-Json $configuration; +$expansions = $config.expansions -split (","); +$extensions = $config.extensions -split (","); + +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; + +#Get OAuth Token +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; +$Token = [System.Convert]::ToBase64String( [System.Text.Encoding]::ASCII.GetBytes("$($config.apiKey):$($config.apiSecret)") ); +$headers = @{ Authorization = "Basic " + $Token }; +$tokenResponse = Invoke-RestMethod -uri "$($config.baseurl)/oauth/access_token" -Method 'POST' -Headers $headers -Body (@{grant_type= "client_credentials";}) + +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.Add("Authorization", "Bearer $($tokenResponse.access_token)") +$headers.Add("Accept", "application/json") + +#Get Schools +Write-Verbose -Verbose "Retrieving Schools" +$uri = "$($config.baseurl)/ws/v1/district/school/count" +$count = (Invoke-RestMethod $uri -Method GET -Headers $headers ).resource.count +$page = 1; +$schools = [System.Collections.ArrayList]@(); +while($true) +{ + $parameters = @{ + page = $page; + pagesize = 100; + } + $uri = "$($config.baseurl)/ws/v1/district/school" + $response = Invoke-RestMethod $uri -Method GET -Headers $headers -Body $parameters + + if($response.schools.school -is [array]) + { + [void]$schools.AddRange($response.schools.school); + } + else + { + [void]$schools.Add($response.schools.school); + } + + if($schools.count -lt $count) + { + $page++; + } + else + { + break; + } + +} + +foreach($s in $schools) +{ + $row = @{ + ExternalId = $s.id; + DisplayName = $s.name; + Code = $s.school_number; + } + + $row | ConvertTo-Json -Depth 10 +} \ No newline at end of file diff --git a/persons.ps1 b/students.persons.ps1 similarity index 79% rename from persons.ps1 rename to students.persons.ps1 index 7ef659e..4747e67 100644 --- a/persons.ps1 +++ b/students.persons.ps1 @@ -1,17 +1,13 @@ -#Config -$baseurl = "https://.powerschool.com"; -$apiKey = ""; -$apiSecret = ""; -$expansions = @("demographics", "school_enrollment", "contact_info"); -$extensions = @(); -$filter = "name.last_name==*;school_enrollment.enroll_status_code==(-1,0)" - -[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; +#Configuration +$config = ConvertFrom-Json $configuration; +$expansions = $config.expansions -split (","); +$extensions = $config.extensions -split (","); #Get OAuth Token -$Token = [System.Convert]::ToBase64String( [System.Text.Encoding]::ASCII.GetBytes("$($apiKey):$($apiSecret)") ); +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; +$Token = [System.Convert]::ToBase64String( [System.Text.Encoding]::ASCII.GetBytes("$($config.apiKey):$($config.apiSecret)") ); $headers = @{ Authorization = "Basic " + $Token }; -$tokenResponse = Invoke-RestMethod -uri "$($baseurl)/oauth/access_token" -Method 'POST' -Headers $headers -Body (@{grant_type= "client_credentials";}) +$tokenResponse = Invoke-RestMethod -uri "$($config.baseurl)/oauth/access_token" -Method 'POST' -Headers $headers -Body (@{grant_type= "client_credentials";}) $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" @@ -20,9 +16,9 @@ $headers.Add("Accept", "application/json") #Count Students -$uri = "$($baseurl)/ws/v1/district/student/count" +$uri = "$($config.baseurl)/ws/v1/district/student/count" $parameters = @{ - q = "name.last_name==*;school_enrollment.enroll_status_code==(-1,0)"; + q = $config.filter; } $count = (Invoke-RestMethod $uri -Method GET -Headers $headers -Body $parameters).resource.count @@ -36,10 +32,10 @@ while($true) expansions = ($expansions -join ','); page = $page; pagesize = 100 - q = $filter; + q = $config.filter; } - $uri = "$($baseurl)/ws/v1/district/student" + $uri = "$($config.baseurl)/ws/v1/district/student" Write-Verbose -Verbose "Page $($page)"; $response = Invoke-RestMethod $uri -Method GET -Headers $headers -Body $parameters @@ -65,7 +61,7 @@ while($true) #Get Schools Write-Verbose -Verbose "Retrieving Schools" -$uri = "$($baseurl)/ws/v1/district/school/count" +$uri = "$($config.baseurl)/ws/v1/district/school/count" $count = (Invoke-RestMethod $uri -Method GET -Headers $headers ).resource.count $page = 1; $schools = [System.Collections.ArrayList]@(); @@ -75,7 +71,7 @@ while($true) page = $page; pagesize = 100; } - $uri = "$($baseurl)/ws/v1/district/school" + $uri = "$($config.baseurl)/ws/v1/district/school" $response = Invoke-RestMethod $uri -Method GET -Headers $headers -Body $parameters if($response.schools.school -is [array]) @@ -124,7 +120,7 @@ foreach($student in $students) $person = Get-ObjectProperties -Object $student; $person['ExternalId'] = if($student.id) { $student.Id } else { $student.local_id } - $person['DisplayName'] = "$($student.FullNameFL) ($($person.ExternalId))"; + $person['DisplayName'] = "$($student.Name.first_name) $($student.name.last_name) ($($person.ExternalId))"; $person['Contracts'] = [System.Collections.ArrayList]@();