#! /usr/bin/python3
from copy import deepcopy
from datetime import datetime
import json
import subprocess
from pathlib import Path, PurePath
TEST_MODE = True
DELETE_JSON = False
GAM_BIN = '/?????/bin/gamadv-xtd3/gam' # your gam path if python doesn't find it.
OU_STUDENTS ='/Students/'
BASE_POLICY = {
"additionalTargetKeys": [],
"direct": True,
"fields": [{"name": "managedBookmarks","value": {"bookmarks": []}}],
"name": "chrome.users.ManagedBookmarksSetting",
}
bookmarks = [
{
"grade": 3,
"name": "3rd Grade Bookmarks",
"links": [
],
},
{
"grade": 4,
"test_ou": False, # Toggle True to test this ou when in TEST_MODE
"name": "4th Grade Bookmarks",
"links": [ # The first few are expanded to see the folder option
{
"name": "Schoology",
},
{
"name": "Jeopardy Labs",
"folder": "Websites"
},
{
"name": "IXL Math",
"folder": "Websites"
},
]
},
{
"grade": 12,
"name": "Senior Bookmarks",
"links": [
],
},
]
def get_grade_year(grade):
if type(grade) == str:
if grade.lower() == 'k':
grade = 0
elif grade.lower() == 'pk':
grade = -1
else:
grade = -2
if datetime.now().month > 6: # If in the fall, adjust for next calendar year
return datetime.now().year + 13 - grade
else:
return datetime.now().year + 12 - grade
def get_working_ou(grade):
"""Update as necessary for complicated OU assignments"""
grade_year = get_grade_year(grade)
return str(PurePath(OU_STUDENTS, str(grade_year)))
if __name__ == "__main__":
for ou_bookmarks in bookmarks:
bookmark_order = list()
bookmark_folders = dict()
ou = get_working_ou(ou_bookmarks['grade'])
policy = deepcopy(BASE_POLICY)
policy['orgUnitPath'] = ou
policy['parentOrgUnitPath'] = ou
for link in ou_bookmarks['links']:
if link.get('folder', None) is None:
bookmark_order.append(link)
elif link['folder'] not in bookmark_order:
bookmark_order.append(link['folder'])
bookmark_folders[link['folder']] = list()
bookmark_folders[link['folder']].append(link)
else:
bookmark_folders[link['folder']].append(link)
for b in bookmark_order:
if b in [x for x in bookmark_folders]:
new_entry = {"folder": {"entries": list(), "name":b}}
for bl in bookmark_folders[b]:
new_entry["folder"]["entries"].append(
{"link": { x:y for x,y in bl.items() if x in ['name','url']}})
policy['fields'][0]['value']['bookmarks'].append(new_entry)
else:
policy['fields'][0]['value']['bookmarks'].append({"link": b})
policy['fields'][0]['value']['toplevelName'] = ou_bookmarks['name']
fname = f"temp_{get_grade_year(ou_bookmarks['grade'])}_policy.json"
with open(fname, 'w', encoding='utf-8') as temp_json_file:
json.dump(policy, temp_json_file, ensure_ascii=False, indent=4)
if (not TEST_MODE) or (ou_bookmarks.get('test_ou', False)):
subprocess.run([
GAM_BIN,'update','chromepolicy',
'chrome.users.ManagedBookmarksSetting',
'json','file',fname,'orgunit',ou])
if DELETE_JSON:
Path.unlink(fname)
##
GAC, Chrome, Policy, GAM, Bookmarks