From f58b3b37b20f2d4a5cf677f1744c10d02cdff5fc Mon Sep 17 00:00:00 2001 From: Maciej Krok Date: Mon, 19 Sep 2016 16:46:27 +0200 Subject: [PATCH 1/2] start --- thingspy/Project.py | 8 ++++++++ thingspy/ToDo.py | 6 ++++++ thingspy/things | 19 +++++++++++++++++++ thingspy/things.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 thingspy/Project.py create mode 100644 thingspy/ToDo.py create mode 100755 thingspy/things create mode 100644 thingspy/things.py diff --git a/thingspy/Project.py b/thingspy/Project.py new file mode 100644 index 0000000..96235c5 --- /dev/null +++ b/thingspy/Project.py @@ -0,0 +1,8 @@ + +from ToDo import ToDo + +class Project(ToDo): + + def __init__(self,dict): + ToDo.__init__(self,dict) + return \ No newline at end of file diff --git a/thingspy/ToDo.py b/thingspy/ToDo.py new file mode 100644 index 0000000..0827818 --- /dev/null +++ b/thingspy/ToDo.py @@ -0,0 +1,6 @@ + + +class ToDo: + def __init__(self, dict): + self.plist = dict + return \ No newline at end of file diff --git a/thingspy/things b/thingspy/things new file mode 100755 index 0000000..7054d5b --- /dev/null +++ b/thingspy/things @@ -0,0 +1,19 @@ +#!/bin/bash + + +echo test + +osascript <' + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print sys.argv[0]+' --to-add= ' + sys.exit() + elif opt in ("-a", "--to-add"): + self.toAddFile = arg + + + + +if __name__ == "__main__": + obj = thingspy(); + obj.main(sys.argv[1:]) \ No newline at end of file From b4c16f07b8b006e39eff6a307034423fae19f35c Mon Sep 17 00:00:00 2001 From: Maciej Krok Date: Mon, 19 Sep 2016 19:53:01 +0200 Subject: [PATCH 2/2] thingspy done --- thingspy/Project.py | 47 ++++++++++++++++++++++- thingspy/README.md | 6 +++ thingspy/ToDo.py | 54 +++++++++++++++++++++++++- thingspy/sample.plist | 89 +++++++++++++++++++++++++++++++++++++++++++ thingspy/things.py | 33 +++++++++++++++- 5 files changed, 225 insertions(+), 4 deletions(-) create mode 100644 thingspy/README.md create mode 100644 thingspy/sample.plist diff --git a/thingspy/Project.py b/thingspy/Project.py index 96235c5..b34eaa8 100644 --- a/thingspy/Project.py +++ b/thingspy/Project.py @@ -5,4 +5,49 @@ class Project(ToDo): def __init__(self,dict): ToDo.__init__(self,dict) - return \ No newline at end of file + self.todos = [] + + if "to dos" in self.plist: + for pToDo in self.plist["to dos"]: + self.todos.append(ToDo(pToDo)) + + return + + def getArea(self): + if "area" not in self.plist: + return "" + return self.plist["area"] + + def getTodos(self): + return self.todos + + def makeAppleScript(self): + ans = "\n" + + ans += "set " + self.getMD5() + " to make new project \n" + + ans += "set name of " + self.getMD5() + " to \"" + self.getName() + "\"\n" + + # if self.getArea() != "" : + # ans += "set " + self.getMD5Mark(self.getArea()) + " to make new area with properties {name:\"" + self.getArea() + "\"} \n" + # ans += "set area of " + self.getMD5() + " to \"" + self.getArea() + "\"\n" + + ans += "set notes of " + self.getMD5() + " to \"" + self.getNotes() + "\"\n" + + if self.getDueDate() > 0: + ans += "set due date of " + self.getMD5() + " to (current date) + " + self.getDueDate() + " * days\n" + + tags = "" + for tag in self.getTags(): + ans += "set "+self.getMD5Mark(tag)+" to make new tag with properties {name:\""+tag+"\"} \n" + tags += tag + ", " + + if tags != "": + tags = tags[:-2] + ans += "set tag names of " + self.getMD5() + " to \"" + tags + "\"\n" + + for todo in self.getTodos(): + ans += todo.makeAppleScript() + ans += "set project of "+ todo.getMD5() +" to " + self.getMD5() + + return ans \ No newline at end of file diff --git a/thingspy/README.md b/thingspy/README.md new file mode 100644 index 0000000..d646a13 --- /dev/null +++ b/thingspy/README.md @@ -0,0 +1,6 @@ +# thingspy + +add projects and todos to Things from plist + + ptyhon things.py -a ./sample.plist + diff --git a/thingspy/ToDo.py b/thingspy/ToDo.py index 0827818..4b0b56e 100644 --- a/thingspy/ToDo.py +++ b/thingspy/ToDo.py @@ -1,6 +1,56 @@ - +import hashlib class ToDo: def __init__(self, dict): self.plist = dict - return \ No newline at end of file + self.md5 = "md5" + self.md5 += str(hashlib.md5(str(self.plist)).hexdigest()) + return + + def getName(self): + return self.plist["name"] + + def getNotes(self): + if "notes" not in self.plist: + return "" + return self.plist["notes"] + + def getTags(self): + if "tags" not in self.plist: + return [] + return self.plist["tags"] + + def getDueDate(self): + if "due date " not in self.plist: + return 0 + return self.plist["due date "] + + def getMD5(self): + return self.md5 + + def getMD5Mark(self, mark): + return self.md5 + str(hashlib.md5(str(mark)).hexdigest()) + + def makeAppleScript(self): + ans = "\n" + + ans += "set " + self.getMD5() +" to make new to do \n" + + ans += "set name of " + self.getMD5() + " to \""+ self.getName() +"\"\n" + + ans += "set notes of " + self.getMD5() + " to \""+ self.getNotes() +"\"\n" + + if self.getDueDate() > 0 : + ans += "set due date of " + self.getMD5() + " to (current date) + "+ str(self.getDueDate()) +" * days\n" + + tags = "" + for tag in self.getTags(): + ans += "set "+self.getMD5Mark(tag)+" to make new tag with properties {name:\""+tag+"\"} \n" + tags+= tag + ", " + + if tags != "" : + tags = tags[:-2] + ans += "set tag names of " + self.getMD5() + " to \""+ tags +"\"\n" + + return ans + diff --git a/thingspy/sample.plist b/thingspy/sample.plist new file mode 100644 index 0000000..f3979fa --- /dev/null +++ b/thingspy/sample.plist @@ -0,0 +1,89 @@ + + + + + To Dos + + + name + sample todos0 + due date + 5 + tags + + sampleTag4 + sampleTag1 + + notes + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lobortis sapien eu sagittis tincidunt. Aenean posuere mattis nisi eu varius. Aenean ultricies purus metus, non sodales magna condimentum vel. Nulla aliquam odio nisi, vel volutpat risus blandit ac. Nulla turpis diam, porta a nisi non, tempor dictum nisi. Cras pulvinar est dui, quis pharetra lorem finibus in. Praesent pharetra sem quis auctor pharetra. Proin id tortor quis nisi luctus rhoncus. Mauris placerat elementum consectetur. Duis sollicitudin tempor dui at dapibus. Curabitur a sollicitudin ante. Sed lobortis orci non elit maximus, dictum semper nulla facilisis. Quisque id ullamcorper risus. + + + Projects + + + name + sample projrct one + notes + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lobortis sapien eu sagittis tincidunt. Aenean posuere mattis nisi eu varius. Aenean ultricies purus metus, non sodales magna condimentum vel. Nulla aliquam odio nisi, vel volutpat risus blandit ac. Nulla turpis diam, porta a nisi non, tempor dictum nisi. Cras pulvinar est dui, quis pharetra lorem finibus in. Praesent pharetra sem quis auctor pharetra. Proin id tortor quis nisi luctus rhoncus. Mauris placerat elementum consectetur. Duis sollicitudin tempor dui at dapibus. Curabitur a sollicitudin ante. Sed lobortis orci non elit maximus, dictum semper nulla facilisis. Quisque id ullamcorper risus. + +Sed nulla lacus, sagittis vel sem eu, sodales interdum diam. Sed ipsum elit, bibendum vitae pretium ut, volutpat at lorem. Maecenas pretium elementum purus ac consectetur. Donec tincidunt sem ac odio maximus aliquam a ac odio. Curabitur in luctus lectus. Nullam laoreet, augue vitae laoreet tempor, nunc nulla mollis odio, sed lacinia enim lectus vitae libero. Donec ut imperdiet augue. Phasellus sit amet consequat mauris. Morbi lorem odio, ultrices vitae urna ac, feugiat elementum odio. Nulla facilisi. In porta ipsum quis ligula elementum euismod eget a lectus. + +Etiam molestie aliquam eleifend. Maecenas fringilla odio ex, at cursus massa imperdiet vel. Proin sollicitudin orci nec rutrum bibendum. Ut id diam ipsum. Suspendisse in mi at erat malesuada volutpat at in leo. Cras fringilla pulvinar est, sed finibus libero viverra sed. Nam malesuada pulvinar dui, sit amet elementum nibh tempor sollicitudin. + +Phasellus fringilla est sed congue mollis. Nullam cursus aliquam arcu quis tincidunt. Cras vehicula purus at efficitur rhoncus. Quisque sit amet tortor tincidunt eros laoreet efficitur sed quis ligula. Phasellus maximus tellus a ornare efficitur. Mauris quis viverra dui, ornare dictum arcu. Praesent fermentum, ante in varius dictum, nisl purus pellentesque libero, at varius nunc massa quis enim. Nunc eu ipsum vel dolor blandit ultrices a quis risus. Cras et risus quis est lobortis suscipit. Aenean tempus mi eget aliquet eleifend. Mauris tincidunt metus a magna rutrum, nec convallis erat viverra. Maecenas sollicitudin efficitur egestas. + +Duis at congue nisl. In pharetra vitae nibh at finibus. Aenean ullamcorper purus a ultrices consectetur. Duis sed ultricies sapien, pulvinar vestibulum libero. Donec id neque nec mi eleifend blandit at id libero. Nullam scelerisque massa quis ultrices tincidunt. Aenean condimentum rhoncus fringilla. + due date + 3 + tags + + sampleTag1 + sampleTag2 + + area + sample area + to dos + + + name + sample todos1 + due date + 0 + tags + + sampleTag3 + sampleTag1 + + notes + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lobortis sapien eu sagittis tincidunt. Aenean posuere mattis nisi eu varius. Aenean ultricies purus metus, non sodales magna condimentum vel. Nulla aliquam odio nisi, vel volutpat risus blandit ac. Nulla turpis diam, porta a nisi non, tempor dictum nisi. Cras pulvinar est dui, quis pharetra lorem finibus in. Praesent pharetra sem quis auctor pharetra. Proin id tortor quis nisi luctus rhoncus. Mauris placerat elementum consectetur. Duis sollicitudin tempor dui at dapibus. Curabitur a sollicitudin ante. Sed lobortis orci non elit maximus, dictum semper nulla facilisis. Quisque id ullamcorper risus. + + + name + sample todos2 + due date + 0 + tags + + sampleTag2 + sampleTag1 + + notes + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lobortis sapien eu sagittis tincidunt. Aenean posuere mattis nisi eu varius. Aenean ultricies purus metus, non sodales magna condimentum vel. Nulla aliquam odio nisi, vel volutpat risus blandit ac. Nulla turpis diam, porta a nisi non, tempor dictum nisi. Cras pulvinar est dui, quis pharetra lorem finibus in. Praesent pharetra sem quis auctor pharetra. Proin id tortor quis nisi luctus rhoncus. Mauris placerat elementum consectetur. Duis sollicitudin tempor dui at dapibus. Curabitur a sollicitudin ante. Sed lobortis orci non elit maximus, dictum semper nulla facilisis. Quisque id ullamcorper risus. + + + name + sample todos3 + due date + 0 + tags + + sampleTag3 + + notes + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus lobortis sapien eu sagittis tincidunt. Aenean posuere mattis nisi eu varius. Aenean ultricies purus metus, non sodales magna condimentum vel. Nulla aliquam odio nisi, vel volutpat risus blandit ac. Nulla turpis diam, porta a nisi non, tempor dictum nisi. Cras pulvinar est dui, quis pharetra lorem finibus in. Praesent pharetra sem quis auctor pharetra. Proin id tortor quis nisi luctus rhoncus. Mauris placerat elementum consectetur. Duis sollicitudin tempor dui at dapibus. Curabitur a sollicitudin ante. Sed lobortis orci non elit maximus, dictum semper nulla facilisis. Quisque id ullamcorper risus. + + + + + + diff --git a/thingspy/things.py b/thingspy/things.py index 14fd576..46250a9 100644 --- a/thingspy/things.py +++ b/thingspy/things.py @@ -2,6 +2,7 @@ import sys, getopt, locale import plistlib +from subprocess import Popen, PIPE from ToDo import ToDo @@ -18,8 +19,9 @@ class thingspy: def main(self, argv): self.parseParam(argv) self.plist = plistlib.readPlist(self.toAddFile) - print(self.plist) + self.fillProjectsAndTodos() + self.addToThings() def parseParam(self, args): @@ -35,7 +37,36 @@ class thingspy: elif opt in ("-a", "--to-add"): self.toAddFile = arg + def fillProjectsAndTodos(self): + for pProject in self.plist["Projects"] : + self.projects.append(Project(pProject)) + for pTodo in self.plist["To Dos"] : + self.todos.append(ToDo(pTodo)) + + def addToThings(self): + for project in self.projects: + applescript = "tell application \"Things\"\n" + applescript += project.makeAppleScript() + applescript += "\nend tell \n" + self.doAppleScript(applescript) + + for todo in self.todos: + applescript = "tell application \"Things\"\n" + applescript += todo.makeAppleScript() + applescript += "\nend tell \n" + self.doAppleScript(applescript) + + def doAppleScript(self, applescript): + cmd = [] + cmd.append("osascript") + cmd.append("-e") + cmd.append(applescript) + + process = Popen(cmd, stdout=PIPE) + out, err = process.communicate() + print("out:" + str(out)) + print("err:" + str(err)) if __name__ == "__main__":