def from_node(cls, node): """instantiates a Story object from an elementTree node, build child notes and attachment lists""" story = Story() story.story_id = _parse_text(node, 'id') story.name = _parse_text(node, 'name') story.owned_by = _parse_text(node, 'owned_by') story.story_type = _parse_text(node, 'story_type') story.state = _parse_text(node, 'current_state') story.description = _parse_text(node, 'description') story.estimate = _parse_int(node, 'estimate') story.labels = _parse_text(node, 'labels') story.url = _parse_text(node, 'url') story.project_id = _parse_text(node, 'project_id') note_nodes = node.find('notes') if note_nodes is not None: for note_node in note_nodes: note_id = _parse_text(note_node, 'id') text = _parse_text(note_node, 'text') author = _parse_text(note_node, 'author') story.notes.append(Note(note_id, text, author)) attachment_nodes = node.find('attachments') if attachment_nodes is not None: for attachment_node in attachment_nodes: attachment_id = _parse_text(attachment_node, 'id') description = _parse_text(attachment_node, 'text') url = _parse_text(attachment_node, 'url') story.attachments.append( Attachment(attachment_id, description, url)) task_nodes = node.find('tasks') if task_nodes is not None: for task_node in task_nodes: task_id = _parse_text(task_node, 'id') description = _parse_text(task_node, 'description') complete = _parse_boolean(task_node, 'complete') story.tasks.append(Task(task_id, description, complete)) return story