From 5c0e9807d8f33a8a4d631f4c1cf39eb6b0ca4b55 Mon Sep 17 00:00:00 2001 From: Steve Spicklemire Date: Sat, 6 Feb 2021 04:44:31 -0500 Subject: [PATCH 1/3] add options to copy user files --- ide/modDBFunctions.py | 60 ++++++++++++++++++++++++++++++ ide/shell_cmds/copyUserPrograms.py | 11 ++++++ ide/shell_cmds/getUserPrograms.py | 2 + main.py | 4 +- 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 ide/shell_cmds/copyUserPrograms.py create mode 100644 ide/shell_cmds/getUserPrograms.py diff --git a/ide/modDBFunctions.py b/ide/modDBFunctions.py index 6cfe3aab..c6a97d59 100644 --- a/ide/modDBFunctions.py +++ b/ide/modDBFunctions.py @@ -51,4 +51,64 @@ def SetSetting(name, value, **kwargs): Setting = kwargs['Setting'] s = Setting(id=name, value=value) s.put() + + +def getUserPrograms(user, folder, **kwargs): + User = kwargs['User'] + ndb = kwargs['ndb'] + Program = kwargs['Program'] + print("Checking user:", user, "Folder:", folder) + programs = [{ "name": p.key.id(), "datetime": str(p.datetime)} + for p in Program.query(ancestor=ndb.Key("User",user,"Folder",folder))] + return programs + +def copyUserPrograms(oldUser, oldFolder, newUser, newFolder, public=True, **kwargs): + ndb = kwargs['ndb'] + User = kwargs['User'] + Folder = kwargs['Folder'] + Program = kwargs['Program'] + + copiedPrograms = [] # keep track of copied programs + + oldPrograms = [p.key.id() for p in Program.query(ancestor=ndb.Key("User",oldUser,"Folder",oldFolder))] + + ndbNewFolder = ndb.Key("User", newUser, "Folder", newFolder).get() + if ndbNewFolder: + # + # Folder already exists. + # Check to make sure the are no programs in the new folder that + # conflict with the programs from the old folder + # + + newPrograms = [p.key.id() for p in Program.query(ancestor=ndb.Key("User",newUser,"Folder",newFolder))] + foundConflict = False + conflictingProgram = None + for o in oldPrograms: + if o in newPrograms: + foundConflict = True + break + + if foundConflict: + return f"Yikes! {conflictingProgram} is already in the new folder" + else: + newFolderOwner = ndb.Key("User",newUser).get() + if newFolderOwner: + ndbNewFolder = Folder( parent=newFolderOwner.key, id=newFolder, isPublic=public) + ndbNewFolder.put() # create new folder + else: + return "Yikes! Can't find newUser" + newUser + + for pid in oldPrograms: + ndbOldProgram = ndb.Key("User",oldUser,"Folder",oldFolder,"Program",pid).get() + if not ndbOldProgram: + return "Ack! Cannot load program:" + pid + else: + newNDBProg = Program(parent=ndbNewFolder.key, id=pid) + newNDBProg.source = ndbOldProgram.source + newNDBProg.datetime = ndbOldProgram.datetime + newNDBProg.description = ndbOldProgram.description + newNDBProg.screenshot = ndbOldProgram.screenshot + newNDBProg.put() + copiedPrograms.append(pid) + return copiedPrograms diff --git a/ide/shell_cmds/copyUserPrograms.py b/ide/shell_cmds/copyUserPrograms.py new file mode 100644 index 00000000..8519de7a --- /dev/null +++ b/ide/shell_cmds/copyUserPrograms.py @@ -0,0 +1,11 @@ +#def copyUserPrograms(oldUser, oldFolder, newUser, newFolder, public=True, **kwargs): + +result = wc(modDBFunctions.copyUserPrograms, + oldUser='localuser', + oldFolder='MyPrograms', + newUser='localuser', + newFolder='TestDestination2', + public=True, + ndb=ndb, Folder=Folder, Program=Program, User=User ) + +print(result) diff --git a/ide/shell_cmds/getUserPrograms.py b/ide/shell_cmds/getUserPrograms.py new file mode 100644 index 00000000..87d4dcba --- /dev/null +++ b/ide/shell_cmds/getUserPrograms.py @@ -0,0 +1,2 @@ +result = wc(modDBFunctions.getUserPrograms, user='localuser', folder='MyPrograms', ndb=ndb, Program=Program, User=User ) +print(result) diff --git a/main.py b/main.py index 9cd3f14c..6b84d841 100644 --- a/main.py +++ b/main.py @@ -10,8 +10,10 @@ def make_shell_context(): client = ndb.Client(project=project) # for user data, folders, and programs def wc(func, **args): + result = None with client.context(): - func(**args) + result = func(**args) + return result return {'app': app, 'User': models.User, 'Folder':models.Folder, 'Program':models.Program, 'Setting':models.Setting, 'ndb':ndb, 'wc':wc, 'models':models, 'routes':routes, From 698a81adebe32ad7367235db2373d40d97a8163f Mon Sep 17 00:00:00 2001 From: Steve Spicklemire Date: Tue, 9 Feb 2021 07:16:44 -0500 Subject: [PATCH 2/3] add utility to dump user data to json file --- .gitignore | 2 +- ide/modDBFunctions.py | 4 +++- ide/shell_cmds/dumpUsers.py | 7 ++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index c8260b87..d8c5749b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,4 @@ __pycache__/ /.vscode/ /ide/.vscode /ide/flask_secret.py - +/output.json diff --git a/ide/modDBFunctions.py b/ide/modDBFunctions.py index c6a97d59..160725a1 100644 --- a/ide/modDBFunctions.py +++ b/ide/modDBFunctions.py @@ -43,9 +43,11 @@ def DumpSettings(**kwargs): print (s) def DumpUsers(**kwargs): + result = [] for s in kwargs['User'].query(): - print (s) + result.append({'keyID':s.key.id(), 'email':s.email}) + return result def SetSetting(name, value, **kwargs): Setting = kwargs['Setting'] diff --git a/ide/shell_cmds/dumpUsers.py b/ide/shell_cmds/dumpUsers.py index dc3fd654..d49ca3ed 100644 --- a/ide/shell_cmds/dumpUsers.py +++ b/ide/shell_cmds/dumpUsers.py @@ -1,4 +1,9 @@ # pipe this into "flask shell" to update all users in the datastore +import json -wc(modDBFunctions.DumpUsers, User=User) +f = open('output.json','w') +result = wc(modDBFunctions.DumpUsers, User=User) +json.dump(result,f) +f.close() +print("complete") From 54da63e82751e91bb70745b12a887dc7f22c1f34 Mon Sep 17 00:00:00 2001 From: Steve Spicklemire Date: Tue, 9 Feb 2021 07:37:56 -0500 Subject: [PATCH 3/3] script to find case conflicts --- ide/shell_cmds/find_case_conflicts.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 ide/shell_cmds/find_case_conflicts.py diff --git a/ide/shell_cmds/find_case_conflicts.py b/ide/shell_cmds/find_case_conflicts.py new file mode 100644 index 00000000..adb22db2 --- /dev/null +++ b/ide/shell_cmds/find_case_conflicts.py @@ -0,0 +1,19 @@ +import json + +result = {} + +with open('output.json') as f: + for user in json.load(f): + lowerKey = user['keyID'].lower() + if lowerKey in result: + print("conflict found: {0} {1}".format(result[lowerKey],user['keyID'])) + else: + result[lowerKey] = user['keyID'] + + + + + + + +