def collect_task_updates(self): """ Update the stories since the last time this method was called. """ def getLastUpdated(project_id, version): new_last_updated = datetime.datetime.now() - datetime.timedelta(seconds=self.overlap_seconds) last_updated = self._get_last_updated(project_id, version) self._set_last_updated(new_last_updated, project_id, version) if __debug__: logger.debug('%s-%s: %s' % (project_id, version, last_updated)) return last_updated for project_id in self.project_ids: last_updated = getLastUpdated(project_id, 'v3') activitiesxml = pt_api.get_project_activities_v3(project_id, last_updated, self.token) if activitiesxml is not None: activities = [activityxml for activityxml in activitiesxml.iterchildren()] activities.sort(key=operator.attrgetter('occurred_at')) for activityxml in activities: self.process_activity(activityxml) last_updated = getLastUpdated(project_id, 'v4') activitiesxml = pt_api.get_project_activities(project_id, last_updated, self.token) if activitiesxml is not None: activities = [activityxml for activityxml in activitiesxml.iterchildren()] activities.sort(key=operator.attrgetter('occurred_at')) for activityxml in activities: if activityxml.event_type in ['task_delete', 'task_edit', 'task_create', 'comment_delete']: if __debug__: logger.debug(pt_api.to_str(activityxml)) logger.info(activityxml.event_type) self.process_activity(activityxml)
def process_activity(self, activity): ''' To be run in a thread, process all the activities in the queue ''' with self.update_lock: if activity.id in self.processed_activities: if __debug__: logger.debug('Ignoring repeat activity %s.' % activity.id) return if __debug__: logger.debug(pt_api.to_str(activity)) logger.info('--------------------') logger.info('') logger.info('--------------------') logger.info(activity.event_type) logger.info(activity.description) self.processed_activities.append(activity.id) if activity.event_type in ['story_update', 'move_into_project']: for storyxml in activity.stories.iterchildren(): story = self.getStory(storyxml) if story: logger.info('%s: %s' % (activity.event_type, storyxml.id)) story.update(activity, storyxml) logger.info("<Updated Story> %s:%s" % (story.id, story.description)) elif activity.event_type == 'story_create': for storyxml in activity.stories.iterchildren(): logger.info('%s: %s' % (activity.event_type, storyxml.id)) story = Story.create(activity.project_id, storyxml) self.stories[story.id] = story logger.info("<Added Story> %s:%s" % (story.id, story.description)) elif activity.event_type in ['story_delete', 'multi_story_delete']: for storyxml in activity.stories.iterchildren(): logger.info('%s: %s' % (activity.event_type, storyxml.id)) story = self.getStory(storyxml) if story: del self.stories[storyxml.id] logger.info("<Deleted Story> %s:%s" % (story.id, story.description)) elif activity.event_type == 'note_create': for storyxml in activity.stories.iterchildren(): logger.info('%s: %s' % (activity.event_type, storyxml.id)) story = self.getStory(storyxml) if story: for notexml in storyxml.notes.iterchildren(): note = Note(notexml.id, notexml['text'].text, activity.author, activity.occurred_at) story.notes[note.id] = note logger.info("<Created Note> %s:%s" % (note.id, note.text)) elif activity.event_type == 'task_create': for storyxml in activity.stories.iterchildren(): logger.info('%s: %s' % (activity.event_type, storyxml.id)) story = self.getStory(storyxml) if story: for taskxml in storyxml.tasks.iterchildren(): position = getattr(taskxml, 'position', None) complete = getattr(taskxml, 'complete', False) created_at = getattr(taskxml, 'created_at', None) task = Task(taskxml.id, taskxml.description, created_at, position=position, complete=complete) story.tasks[task.id] = task logger.info("<Created Task> %s:%s" % (task.id, task.description)) elif activity.event_type == 'task_edit': for storyxml in activity.stories.iterchildren(): story = self.getStory(storyxml) if story: logger.info('%s: %s' % (activity.event_type, storyxml.id)) for taskxml in storyxml.tasks.iterchildren(): task = self.getTask(story, taskxml) if task: task.update(taskxml) logger.info("<Updated Task> %s:%s" % (task.id, task.description)) elif activity.event_type == 'task_delete': for storyxml in activity.stories.iterchildren(): story = self.getStory(storyxml) if story: logger.info('%s: %s' % (activity.event_type, storyxml.id)) for taskxml in storyxml.tasks.iterchildren(): task = self.getTask(story, taskxml) if task: del story.tasks[taskxml.id] logger.info("<Deleted Task> %s:%s" % (task.id, task.description)) elif activity.event_type == 'comment_delete': for storyxml in activity.stories.iterchildren(): story = self.getStory(storyxml) if story: logger.info('%s: %s' % (activity.event_type, storyxml.id)) for commentxml in storyxml.comments.iterchildren(): if commentxml.id in story.notes: note = story.notes[commentxml.id] del story.notes[commentxml.id] logger.info("<Deleted Note> %s:%s" % (note.id, note.text)) else: self.log_unknown_comment(commentxml) elif activity.event_type in ['move_from_project']: # because all the projects are mixed together move_from_project event_type can be ignored pass else: logger.warning('Unknown event type: %s' % activity.event_type) if __debug__: logger.debug(pt_api.to_str(activity))
def log_unknown_task(self, taskxml): logger.warning('Task unknown: %s' % taskxml.id) if __debug__: logger.debug(pt_api.to_str(taskxml))
def log_unknown_comment(self, commentxml): logger.warning('Comment unknown: %s' % commentxml.id) if __debug__: logger.debug(pt_api.to_str(commentxml))
def log_unknown_story(self, storyxml): logger.warning('Story unknown: %s' % storyxml.id) if __debug__: logger.debug(pt_api.to_str(storyxml))