diff --git a/asana_service.py b/asana_service.py index b6446cd..134fbad 100644 --- a/asana_service.py +++ b/asana_service.py @@ -3,7 +3,7 @@ from models.models import * class AsanaService(object): TASK_FIELDS = [ 'name', - 'notes', + 'html_notes', 'assignee.name', 'assignee_status', 'completed', @@ -23,6 +23,12 @@ class AsanaService(object): 'subtasks.name', ] + STORY_FIELDS = [ + 'created_by.name', + 'html_text', + 'type' + ] + def __init__(self, client): self.client = client self.completed_tasks = False @@ -32,17 +38,6 @@ class AsanaService(object): def __wrap__(self, Klass, values): return map(Klass, values) - def get_tasks(self, project_id): - params = { - 'completed_since': '' if self.completed_tasks else 'now', - 'opt_fields': self.TASK_FIELDS, - } - - return self.__wrap__( - Task, - self.client.tasks.find_by_project(project_id, params=params) - ) - def get_my_tasks(self): return self.__wrap__( Task, @@ -54,6 +49,11 @@ class AsanaService(object): }) ) + def get_project(self, project_id): + return Project( + self.client.projects.find_by_id(project_id) + ) + def get_task(self, task_id): return Task(self.client.tasks.find_by_id( task_id, @@ -61,8 +61,21 @@ class AsanaService(object): 'opt_fields': self.TASK_FIELDS } )) + + def get_tasks(self, project_id): + params = { + 'completed_since': '' if self.completed_tasks else 'now', + 'opt_fields': self.TASK_FIELDS, + } + + return self.__wrap__( + Task, + self.client.tasks.find_by_project(project_id, params=params) + ) def get_stories(self, task_id): - stories = self.client.stories.find_by_task(task_id) + stories = self.client.stories.find_by_task(task_id, params = { + 'opt_fields': self.STORY_FIELDS + }) filtered_stories = filter(lambda s: s['type'] == 'comment', stories) return self.__wrap__(Story, filtered_stories) diff --git a/models/models.py b/models/models.py index e039178..78b127e 100644 --- a/models/models.py +++ b/models/models.py @@ -1,4 +1,5 @@ import dateutil +from html.parser import HTMLParser import sys class AsanaObject(object): @@ -89,6 +90,55 @@ class CustomField(AsanaObject): return '' +class Strong(object): + def __init__(self, body): + self.body = body + + def str(self): + return ('strong', str(body)) + +class Italic(object): + def __init__(self, body): + self.body = body + + def str(self): + return ('italic', str(body)) + +class Tag(object): + def __init__(self, body): + self.body = body + + def str(self): + return str(self.body) + +class HTMLTextParser(HTMLParser): + def __init__(self): + self.text = [] + self.tag_stack = [] + super().__init__() + + def handle_starttag(self, tag, attrs): + if tag == 'STRONG': + self.tag_stack.append(Strong) + elif tag == 'EM': + self.tag_stack.append(Italic) + else: + self.tag_stack.append(Tag) + + def handle_data(self, data): + self.text.append(data) + + def handle_endtag(self, tag): + data = self.text.pop() + tag = self.tag_stack.pop() + + self.text.append(tag(data)) + + def get_formatted_text(self): + print(self.text) + return self.text + + class Story(AsanaObject): def creator(self): if 'created_by' in self.object_dict: @@ -97,4 +147,6 @@ class Story(AsanaObject): return '' def text(self): - return self.object_dict['text'] + parser = HTMLTextParser() + parser.feed(self.object_dict['html_text']) + return parser.get_formatted_text() diff --git a/ui/ui.py b/ui/ui.py index 7f96971..062689d 100644 --- a/ui/ui.py +++ b/ui/ui.py @@ -39,9 +39,10 @@ class Ui(object): def task_list(self, id): self.nav_stack.append(('project', id)) def runInThread(): + project = self.asana_service.get_project(id) tasks = self.asana_service.get_tasks(id) self.update(TaskList(tasks, - 'TODO: get project name', + project.name(), self.task_details ).component()) thread = Thread(target=runInThread())