3 Commits

Author SHA1 Message Date
Aaron Gutierrez
dab2efd4c1 Still merging 2015-07-28 23:22:21 -07:00
Aaron Gutierrez
fe432a10db Merge branch 'master' into search 2015-07-28 23:17:30 -07:00
Aaron Gutierrez
5e71a0fc6e wip search 2015-07-24 17:46:40 -07:00
3 changed files with 55 additions and 108 deletions

2
.gitignore vendored
View File

@@ -1,8 +1,6 @@
*.swp *.swp
*.pyc *.pyc
tags
.state .state
.oauth .oauth
secrets.py secrets.py

View File

@@ -58,13 +58,12 @@ class CmdAsana:
}, },
) )
(url, state) = self.client.session.authorization_url() (url, state) = self.client.session.authorization_url()
print("Go to the following link and enter the code:")
print(url)
try: try:
import webbrowser import webbrowser
webbrowser.open(url) webbrowser.open(url)
except Exception: except Exception:
pass print("Go to the following link and enter the code:")
print(url)
code = sys.stdin.readline().strip() code = sys.stdin.readline().strip()
token = self.client.session.fetch_token(code=code) token = self.client.session.fetch_token(code=code)
@@ -135,7 +134,6 @@ class CmdAsana:
def update(task): def update(task):
task_list,_ = self.frame.contents[1] task_list,_ = self.frame.contents[1]
task_list.insertNewTask(task) task_list.insertNewTask(task)
self.loop.draw_screen()
thread = Thread(target=runInThread) thread = Thread(target=runInThread)
thread.start() thread.start()
@@ -171,17 +169,12 @@ class CmdAsana:
def userTypeAhead(self, text, callback): def userTypeAhead(self, text, callback):
def runInThread(): def runInThread():
if self.state['workspace_id'] != PERSONAL: users = self.client.workspaces.typeahead(self.state['workspace_id'],
users = self.client.workspaces \ {
.typeahead(self.state['workspace_id'], 'type': 'user',
{ 'query': text,
'type': 'user', 'count': 5
'query': text, })
'count': 5
})
else:
users = [self.me]
callback(users) callback(users)
self.loop.draw_screen() self.loop.draw_screen()
@@ -260,6 +253,10 @@ class CmdAsana:
thread = Thread(target=runInThread) thread = Thread(target=runInThread)
thread.start() thread.start()
def loadProjectSearch(self):
pass
#callback somehow?
def showDetails(self, task_id, show_loading=True): def showDetails(self, task_id, show_loading=True):
self.state['view'] = 'details' self.state['view'] = 'details'
self.state['id'] = task_id self.state['id'] = task_id
@@ -270,11 +267,10 @@ class CmdAsana:
def runInThread(): def runInThread():
task = self.client.tasks.find_by_id(task_id) task = self.client.tasks.find_by_id(task_id)
stories = self.client.stories.find_by_task(task_id) stories = self.client.stories.find_by_task(task_id)
subtasks = self.client.tasks.subtasks(task_id) update(task, stories)
update(task, stories, subtasks)
def update(task, stories, subtasks): def update(task, stories):
task_details = ui.TaskDetails(task, stories, subtasks) task_details = ui.TaskDetails(task, stories)
self.connectDetailsSignals(task_details) self.connectDetailsSignals(task_details)
self.replaceBody(task_details) self.replaceBody(task_details)
@@ -302,9 +298,6 @@ class CmdAsana:
'updatetask', 'updatetask',
'usertypeahead', 'usertypeahead',
'assigntask', 'assigntask',
'complete',
'newtask',
'details',
]) ])
urwid.register_signal(ui.AssigneeTypeAhead, [ urwid.register_signal(ui.AssigneeTypeAhead, [
@@ -343,9 +336,6 @@ class CmdAsana:
urwid.connect_signal(task_details, 'updatetask', self.updateTask) urwid.connect_signal(task_details, 'updatetask', self.updateTask)
urwid.connect_signal(task_details, 'usertypeahead', self.userTypeAhead) urwid.connect_signal(task_details, 'usertypeahead', self.userTypeAhead)
urwid.connect_signal(task_details, 'assigntask', self.assignTask) urwid.connect_signal(task_details, 'assigntask', self.assignTask)
urwid.connect_signal(task_details, 'complete', self.completeTask)
urwid.connect_signal(task_details, 'newtask', self.newTask)
urwid.connect_signal(task_details, 'details', self.showDetails)
def handleInput(self, key): def handleInput(self, key):
if key in ('q', 'Q'): if key in ('q', 'Q'):

121
ui.py
View File

@@ -12,7 +12,6 @@ palette = [
('header', 'bold,light green', ''), ('header', 'bold,light green', ''),
('secondary', 'light gray', ''), ('secondary', 'light gray', ''),
('task', 'light green', ''), ('task', 'light green', ''),
('project', 'yellow', ''),
('section', 'white', 'dark green'), ('section', 'white', 'dark green'),
('workspace', 'white', 'dark blue'), ('workspace', 'white', 'dark blue'),
('pager', 'standout', ''), ('pager', 'standout', ''),
@@ -62,29 +61,46 @@ class ProjectIcon(urwid.SelectableIcon):
super(ProjectIcon, self).__init__(project['name']) super(ProjectIcon, self).__init__(project['name'])
def keypress(self, size, key): def keypress(self, size, key):
if key in ('enter', 'right', 'l'): if key in ('enter', 'left', 'l'):
self.onClick(self.project['id']) self.onClick(self.project['id'])
else: else:
return super(ProjectIcon, self).keypress(size, key) return super(ProjectIcon, self).keypress(size, key)
class ProjectSearch(urwid.Edit):
def __init__(self):
super(ProjectSearch, self).__init__('Search: ')
class ProjectList(urwid.ListBox): class ProjectList(urwid.ListBox):
def __init__(self, projects): def __init__(self, projects):
self.projects = projects self.projects = projects
self.project_search = ProjectSearch()
urwid.connect_signal(self.project_search, 'change', self.search)
body = urwid.SimpleFocusListWalker( body = urwid.SimpleFocusListWalker(
[urwid.AttrMap(ProjectIcon({'name': 'My Tasks', 'id': None}, [
self.loadProject), 'project'), self.project_search,
None] ProjectIcon({'name': 'My Tasks', 'id': None},
self.loadProject),
None
]
) )
super(ProjectList, self).__init__(body) super(ProjectList, self).__init__(body)
self.loadPage() self.loadPage()
def search(self):
urwid.emit_signal(self, 'search', self.project_search.get_edit_text())
def loadSearch(self, projects):
self.body = [self.project_search] + \
[ProjectIcon(p, self.loadProject) for p in projects]
def loadPage(self, opt=None): def loadPage(self, opt=None):
self.body.pop() self.body.pop()
for i in range(50): for i in range(50):
try: try:
self.body.append(urwid.AttrMap(ProjectIcon(self.projects.next(), self.body.append(ProjectIcon(self.projects.next(),
self.loadProject), 'project')) self.loadProject))
except StopIteration: except StopIteration:
return return
@@ -113,8 +129,7 @@ class TaskList(urwid.ListBox):
body = urwid.SimpleFocusListWalker([]) body = urwid.SimpleFocusListWalker([])
for task_widget,_ in task_widgets.contents: for task_widget,_ in task_widgets.contents:
self.connectSignals(task_widget) self.connectSignals(task_widget)
style = 'section' if len(task_widget.task['name']) and \ style = 'section' if task_widget.task['name'][-1] == ':' else 'task'
task_widget.task['name'][-1] == ':' else 'task'
body.append(urwid.AttrMap(task_widget, style, focus_map='selected')) body.append(urwid.AttrMap(task_widget, style, focus_map='selected'))
super(TaskList, self).__init__(body) super(TaskList, self).__init__(body)
@@ -266,37 +281,8 @@ class AssigneeTypeAhead(urwid.Pile):
self.contents = [self.contents[0]] self.contents = [self.contents[0]]
self.edit.set_edit_text(user['name']) self.edit.set_edit_text(user['name'])
class ProjectTypeAhead(urwid.Pile): class TaskDetails(urwid.Pile):
def __init__(self, task): def __init__(self, task, stories):
body = [('pack', urwid.AttrMap(ProjectIcon(project, self.loadProject),
'project'))
for project in task['projects']]
self.edit = urwid.Edit('Add Project: ')
urwid.connect_signal(self.edit, 'change', self.typeAhead)
body.append(('pack', self.edit))
super(ProjecTypeAhead).__init__(body)
def typeAhead(self, widget, text):
urwid.emit_signal(self, 'projecttypeahead', text, self.updateTypeAhead)
def updateTypeAhead(self, projects):
projects = [(TypeAheadButton(p, self.add), ('pack', None))
for p in projects]
body = [('pack', urwid.AttrMap(ProjectIcon(project, self.loadProject),
'project'))
for project in self.task['projects']]
body.append(('pack', self.edit))
self.contents = body + projects
class TaskDetails(urwid.ListBox):
def __init__(self, task, stories, subtasks):
self.task = task self.task = task
self.stories = stories self.stories = stories
@@ -314,54 +300,27 @@ class TaskDetails(urwid.ListBox):
urwid.connect_signal(assignee_type_ahead, 'usertypeahead', urwid.connect_signal(assignee_type_ahead, 'usertypeahead',
self.userTypeAhead) self.userTypeAhead)
urwid.connect_signal(assignee_type_ahead, 'assigntask', self.assignTask) urwid.connect_signal(assignee_type_ahead, 'assigntask', self.assignTask)
containers = []
if task['parent'] != None: projects = [('pack', ProjectIcon(project, self.loadProject))
parent = TaskEdit(task['parent']) for project in task['projects']]
urwid.connect_signal(parent, 'updatetask', self.updateSubtask)
urwid.connect_signal(parent, 'details', self.showDetails)
#Remap enter to load details of parent body = projects + \
urwid.connect_signal(parent, 'newtask', self.showDetails)
containers.append(parent)
all_subtasks = [t for t in subtasks]
subtask_list = TaskList(all_subtasks)
urwid.connect_signal(subtask_list, 'complete', self.completeTask)
urwid.connect_signal(subtask_list, 'newtask', self.newTask)
urwid.connect_signal(subtask_list, 'updatetask', self.updateSubtask)
urwid.connect_signal(subtask_list, 'details', self.showDetails)
body = containers + \
[ [
urwid.Divider('='), ('pack', urwid.Divider('=')),
task_name_edit, ('pack', task_name_edit),
assignee_type_ahead, ('pack', assignee_type_ahead),
urwid.Divider('-'), ('pack', urwid.Divider('-')),
self.description_edit, ('pack', self.description_edit),
urwid.Divider('-'), ('pack', urwid.Divider('-')),
urwid.BoxAdapter(subtask_list, len(all_subtasks)),
urwid.Divider('-'),
] + \ ] + \
[urwid.Text('[' + story['created_by']['name'] + '] ' + \ [('pack', urwid.Text('[' + story['created_by']['name'] + '] ' + \
story['text']) for story in stories] + \ story['text'])) for story in stories] + \
[comment_edit] [
('weight', 1, urwid.Filler(comment_edit, 'bottom'))
]
super(TaskDetails, self).__init__(body) super(TaskDetails, self).__init__(body)
def completeTask(self, task_id):
urwid.emit_signal(self, 'complete', task_id)
def newTask(self, task_after_id=None):
urwid.emit_signal(self, 'newtask', task_after_id)
def updateSubtask(self, task_id, name):
urwid.emit_signal(self, 'updatetask', task_id, name)
def showDetails(self, task_id):
urwid.emit_signal(self, 'details', task_id)
def keypress(self, size, key): def keypress(self, size, key):
key = super(TaskDetails, self).keypress(size, key) key = super(TaskDetails, self).keypress(size, key)