thingspy done
This commit is contained in:
parent
f58b3b37b2
commit
b4c16f07b8
@ -5,4 +5,49 @@ class Project(ToDo):
|
|||||||
|
|
||||||
def __init__(self,dict):
|
def __init__(self,dict):
|
||||||
ToDo.__init__(self,dict)
|
ToDo.__init__(self,dict)
|
||||||
|
self.todos = []
|
||||||
|
|
||||||
|
if "to dos" in self.plist:
|
||||||
|
for pToDo in self.plist["to dos"]:
|
||||||
|
self.todos.append(ToDo(pToDo))
|
||||||
|
|
||||||
return
|
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
|
||||||
6
thingspy/README.md
Normal file
6
thingspy/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# thingspy
|
||||||
|
|
||||||
|
add projects and todos to Things from plist
|
||||||
|
|
||||||
|
ptyhon things.py -a ./sample.plist
|
||||||
|
|
||||||
@ -1,6 +1,56 @@
|
|||||||
|
import hashlib
|
||||||
|
|
||||||
class ToDo:
|
class ToDo:
|
||||||
def __init__(self, dict):
|
def __init__(self, dict):
|
||||||
self.plist = dict
|
self.plist = dict
|
||||||
|
self.md5 = "md5"
|
||||||
|
self.md5 += str(hashlib.md5(str(self.plist)).hexdigest())
|
||||||
return
|
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
|
||||||
|
|
||||||
|
|||||||
89
thingspy/sample.plist
Normal file
89
thingspy/sample.plist
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>To Dos</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>sample todos0</string>
|
||||||
|
<key>due date </key>
|
||||||
|
<integer>5</integer>
|
||||||
|
<key>tags</key>
|
||||||
|
<array>
|
||||||
|
<string>sampleTag4</string>
|
||||||
|
<string>sampleTag1</string>
|
||||||
|
</array>
|
||||||
|
<key>notes</key>
|
||||||
|
<string>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.</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>Projects</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>sample projrct one</string>
|
||||||
|
<key>notes</key>
|
||||||
|
<string>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.</string>
|
||||||
|
<key>due date</key>
|
||||||
|
<integer>3</integer>
|
||||||
|
<key>tags</key>
|
||||||
|
<array>
|
||||||
|
<string>sampleTag1</string>
|
||||||
|
<string>sampleTag2</string>
|
||||||
|
</array>
|
||||||
|
<key>area</key>
|
||||||
|
<string>sample area</string>
|
||||||
|
<key>to dos</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>sample todos1</string>
|
||||||
|
<key>due date </key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>tags</key>
|
||||||
|
<array>
|
||||||
|
<string>sampleTag3</string>
|
||||||
|
<string>sampleTag1</string>
|
||||||
|
</array>
|
||||||
|
<key>notes</key>
|
||||||
|
<string>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.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>sample todos2</string>
|
||||||
|
<key>due date </key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>tags</key>
|
||||||
|
<array>
|
||||||
|
<string>sampleTag2</string>
|
||||||
|
<string>sampleTag1</string>
|
||||||
|
</array>
|
||||||
|
<key>notes</key>
|
||||||
|
<string>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.</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>name</key>
|
||||||
|
<string>sample todos3</string>
|
||||||
|
<key>due date </key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>tags</key>
|
||||||
|
<array>
|
||||||
|
<string>sampleTag3</string>
|
||||||
|
</array>
|
||||||
|
<key>notes</key>
|
||||||
|
<string>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.</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import sys, getopt, locale
|
import sys, getopt, locale
|
||||||
import plistlib
|
import plistlib
|
||||||
|
from subprocess import Popen, PIPE
|
||||||
|
|
||||||
|
|
||||||
from ToDo import ToDo
|
from ToDo import ToDo
|
||||||
@ -18,8 +19,9 @@ class thingspy:
|
|||||||
def main(self, argv):
|
def main(self, argv):
|
||||||
self.parseParam(argv)
|
self.parseParam(argv)
|
||||||
self.plist = plistlib.readPlist(self.toAddFile)
|
self.plist = plistlib.readPlist(self.toAddFile)
|
||||||
print(self.plist)
|
self.fillProjectsAndTodos()
|
||||||
|
|
||||||
|
self.addToThings()
|
||||||
|
|
||||||
|
|
||||||
def parseParam(self, args):
|
def parseParam(self, args):
|
||||||
@ -35,7 +37,36 @@ class thingspy:
|
|||||||
elif opt in ("-a", "--to-add"):
|
elif opt in ("-a", "--to-add"):
|
||||||
self.toAddFile = arg
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user