def post(self, sketch_id): """Handles POST request to the resource. Args: sketch_id: Integer primary key for a sketch database model Returns: An annotation in JSON (instance of flask.wrappers.Response) """ form = EventAnnotationForm.build(request) if form.validate_on_submit(): sketch = Sketch.query.get_with_acl(sketch_id) indices = [t.searchindex.index_name for t in sketch.timelines] annotation_type = form.annotation_type.data searchindex_id = form.searchindex_id.data searchindex = SearchIndex.query.get(searchindex_id) event_id = form.event_id.data if searchindex_id not in indices: abort(HTTP_STATUS_CODE_BAD_REQUEST) def _set_label(label, toggle=False): """Set label on the event in the datastore.""" self.datastore.set_label( searchindex_id, event_id, sketch.id, current_user.id, label, toggle=toggle) # Get or create an event in the SQL database to have something to # attach the annotation to. event = Event.get_or_create( sketch=sketch, searchindex=searchindex, document_id=event_id) # Add the annotation to the event object. if u'comment' in annotation_type: annotation = Event.Comment( comment=form.annotation.data, user=current_user) event.comments.append(annotation) _set_label(u'__ts_comment') elif u'label' in annotation_type: annotation = Event.Label.get_or_create( label=form.annotation.data, user=current_user) if annotation not in event.labels: event.labels.append(annotation) toggle = False if u'__ts_star' in form.annotation.data: toggle = True _set_label(form.annotation.data, toggle) else: abort(HTTP_STATUS_CODE_BAD_REQUEST) # Save the event to the database db_session.add(event) db_session.commit() return self.to_json( annotation, status_code=HTTP_STATUS_CODE_CREATED) return abort(HTTP_STATUS_CODE_BAD_REQUEST)
def _create_event(self, sketch, searchindex, user): """Create an event in the database. Args: sketch: A sketch (instance of timesketch.models.sketch.Sketch) searchindex: A searchindex (instance of timesketch.models.sketch.SearchIndex) user: A user (instance of timesketch.models.user.User) Returns: An event (instance of timesketch.models.sketch.Event) """ event = Event( sketch=sketch, searchindex=searchindex, document_id=u'test') comment = event.Comment(comment=u'test', user=user) event.comments.append(comment) self._commit_to_database(event) return event
def add_comment(self, comment): """Add comment to event. Args: comment: Comment string. Raises: RuntimeError: if no sketch is present. """ if not self.sketch: raise RuntimeError('No sketch provided.') searchindex = SearchIndex.query.filter_by( index_name=self.index_name).first() db_event = SQLEvent.get_or_create(sketch=self.sketch.sql_sketch, searchindex=searchindex, document_id=self.event_id) comment = SQLEvent.Comment(comment=comment, user=None) db_event.comments.append(comment) db_session.add(db_event) db_session.commit() self.add_label(label='__ts_comment')
def _create_event(self, sketch, searchindex, user): """Create an event in the database. Args: sketch: A sketch (instance of timesketch.models.sketch.Sketch) searchindex: A searchindex (instance of timesketch.models.sketch.SearchIndex) user: A user (instance of timesketch.models.user.User) Returns: An event (instance of timesketch.models.sketch.Event) """ event = Event.get_or_create( sketch=sketch, searchindex=searchindex, document_id='test') comment = event.Comment(comment='test', user=user) event.comments.append(comment) self._commit_to_database(event) return event
def add_comment(self, comment): """Add comment to event. Args: comment: Comment string. Raises: RuntimeError: if no sketch is present. """ if not self.sketch: raise RuntimeError('No sketch provided.') searchindex = SearchIndex.query.filter_by( index_name=self.index_name).first() db_event = SQLEvent.get_or_create( sketch=self.sketch.sql_sketch, searchindex=searchindex, document_id=self.event_id) comment = SQLEvent.Comment(comment=comment, user=None) db_event.comments.append(comment) db_session.add(db_event) db_session.commit() self.add_label(label='__ts_comment')
def post(self, sketch_id): """Handles POST request to the resource. Args: sketch_id: Integer primary key for a sketch database model Returns: An annotation in JSON (instance of flask.wrappers.Response) """ form = forms.EventAnnotationForm.build(request) if not form.validate_on_submit(): abort(HTTP_STATUS_CODE_BAD_REQUEST, 'Unable to validate form data.') annotations = [] sketch = Sketch.query.get_with_acl(sketch_id) if not sketch: abort(HTTP_STATUS_CODE_NOT_FOUND, 'No sketch found with this ID.') if not sketch.has_permission(current_user, 'write'): abort(HTTP_STATUS_CODE_FORBIDDEN, 'User does not have write access controls on sketch.') indices = [ t.searchindex.index_name for t in sketch.timelines if t.get_status.status.lower() == 'ready' ] annotation_type = form.annotation_type.data events = form.events.raw_data for _event in events: searchindex_id = _event['_index'] searchindex = SearchIndex.query.filter_by( index_name=searchindex_id).first() event_id = _event['_id'] event_type = _event['_type'] if searchindex_id not in indices: abort( HTTP_STATUS_CODE_BAD_REQUEST, 'Search index ID ({0!s}) does not belong to the list ' 'of indices'.format(searchindex_id)) # Get or create an event in the SQL database to have something # to attach the annotation to. event = Event.get_or_create(sketch=sketch, searchindex=searchindex, document_id=event_id) # Add the annotation to the event object. if 'comment' in annotation_type: annotation = Event.Comment(comment=form.annotation.data, user=current_user) event.comments.append(annotation) self.datastore.set_label(searchindex_id, event_id, event_type, sketch.id, current_user.id, '__ts_comment', toggle=False) elif 'label' in annotation_type: annotation = Event.Label.get_or_create( label=form.annotation.data, user=current_user) if annotation not in event.labels: event.labels.append(annotation) toggle = False if '__ts_star' or '__ts_hidden' in form.annotation.data: toggle = True if form.remove.data: toggle = True self.datastore.set_label(searchindex_id, event_id, event_type, sketch.id, current_user.id, form.annotation.data, toggle=toggle) else: abort( HTTP_STATUS_CODE_BAD_REQUEST, 'Annotation type needs to be either label or comment, ' 'not {0!s}'.format(annotation_type)) annotations.append(annotation) # Save the event to the database db_session.add(event) db_session.commit() return self.to_json(annotations, status_code=HTTP_STATUS_CODE_CREATED)
def post(self, sketch_id): """Handles POST request to the resource. Args: sketch_id: Integer primary key for a sketch database model Returns: An annotation in JSON (instance of flask.wrappers.Response) """ form = EventAnnotationForm.build(request) if form.validate_on_submit(): annotations = [] sketch = Sketch.query.get_with_acl(sketch_id) indices = [t.searchindex.index_name for t in sketch.timelines] annotation_type = form.annotation_type.data events = form.events.raw_data for _event in events: searchindex_id = _event[u'_index'] searchindex = SearchIndex.query.filter_by( index_name=searchindex_id).first() event_id = _event[u'_id'] event_type = _event[u'_type'] if searchindex_id not in indices: abort(HTTP_STATUS_CODE_BAD_REQUEST) # Get or create an event in the SQL database to have something # to attach the annotation to. event = Event.get_or_create(sketch=sketch, searchindex=searchindex, document_id=event_id) # Add the annotation to the event object. if u'comment' in annotation_type: annotation = Event.Comment(comment=form.annotation.data, user=current_user) event.comments.append(annotation) self.datastore.set_label(searchindex_id, event_id, event_type, sketch.id, current_user.id, u'__ts_comment', toggle=False) elif u'label' in annotation_type: annotation = Event.Label.get_or_create( label=form.annotation.data, user=current_user) if annotation not in event.labels: event.labels.append(annotation) toggle = False if u'__ts_star' or u'__ts_hidden' in form.annotation.data: toggle = True self.datastore.set_label(searchindex_id, event_id, event_type, sketch.id, current_user.id, form.annotation.data, toggle=toggle) else: abort(HTTP_STATUS_CODE_BAD_REQUEST) annotations.append(annotation) # Save the event to the database db_session.add(event) db_session.commit() return self.to_json(annotations, status_code=HTTP_STATUS_CODE_CREATED) return abort(HTTP_STATUS_CODE_BAD_REQUEST)