def post(self, *args, **keywords): task_type = args[0] try: from drenaj_api.utils.drenajneo4jmanager import init_user_to_graph_aux, upsert_campaign task_definition = bson.json_util.loads(self.get_argument('task_definition')) queue = self.get_argument('queue') metadata = task_definition['metadata'] campaign_id = self.get_argument('campaign_id', 'default') campaign_node = upsert_campaign(campaign_id) user = init_user_to_graph_aux(campaign_node, metadata['user']) # user = self.application.db.get_user_from_watchlist(metadata['user']) print user if task_type == 'timeline': timeline_task_state = [rel for rel in user.match_incoming('TIMELINE_TASK_STATE')][0] user_object = dict(user.properties) user_object.update({'campaign_ids': campaign_id}) res = app_object.send_task('timeline_retrieve_userlist', [[[user_object, timeline_task_state.properties['since_tweet_id'], timeline_task_state.properties['page_not_found']]]], queue=queue) timeline_task_state.properties['state'] = 1 timeline_task_state.push() elif task_type == 'friendfollower': friendfollower_task_state = \ [rel for rel in user.match_incoming('FRIENDFOLLOWER_TASK_STATE')][0] res = app_object.send_task('crawl_friends_or_followers', [[[dict(user.properties), friendfollower_task_state.properties[ 'page_not_found']]]], queue=queue) friendfollower_task_state.properties['state'] = 1 friendfollower_task_state.push() elif task_type == 'userinfo': userinfo_task_state = \ [rel for rel in user.match_incoming('USER_INFO_HARVESTER_TASK_STATE')][0] res = app_object.send_task('crawl_user_info', [[[dict(user.properties), 0]]], queue=queue) userinfo_task_state.properties['state'] = 1 userinfo_task_state.push() else: raise MissingArgumentError('timeline or friendfollower') self.write(bson.json_util.dumps({'result': 'successful', 'message': res.task_id})) self.add_header('Content-Type', 'application/json') except MissingArgumentError as e: raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name)
def post(self, *args): """ I chose to handle all options at once, using only POST requests for API requests. GET requests will be used for browser examination. """ (friends_or_followers, ids_or_list, store_or_view) = args print "FollowerHandler: {} {} {}".format(friends_or_followers, ids_or_list, store_or_view) auth_user_id = self.get_argument('auth_user_id') if ((store_or_view != None and store_or_view == 'view') or (store_or_view == None)): try: user_id = self.get_argument('user_id') # if no user_id is supplied. if user_id == '': tmp = [] else: # friends or followers if friends_or_followers == 'followers': id_field_prefix_graph_query = 'friend_' id_field_prefix_graph_query_opposite = '' elif friends_or_followers == 'friends': id_field_prefix_graph_query = '' id_field_prefix_graph_query_opposite = 'friend_' tx = graph.cypher.begin() if friends_or_followers == 'followers': tx.append( "MATCH (u { id_str:{id_str} })<--(u2) RETURN u2", {"id_str": str(user_id)}) elif friends_or_followers == 'friends': tx.append( "MATCH (u { id_str:{id_str} })-->(u2) RETURN u2", {"id_str": str(user_id)}) results = tx.commit() # take only the first line results = results[0] tmp = [] if ids_or_list == 'ids': tmp = [x.u2.properties['id_str'] for x in results] elif ids_or_list == 'list': tmp = [x.u2.properties for x in results] self.write(bson.json_util.dumps({'results': tmp})) self.add_header('Content-Type', 'application/json') except MissingArgumentError as e: # TODO: implement logging. raise HTTPError( 500, 'You didn' 't supply %s as an argument' % e.arg_name) elif (store_or_view == 'store'): try: raise HTTPError( 500, "This functionality is not available for now.") # WARN: This functionality is not available for now. # # Check long int/str versions # id_str = str(self.get_argument('id_str')) # campaign_id = self.get_argument('campaign_id', 'default') # user_objects_str = self.get_argument('user_objects', '[]') # # res = app_object.send_task('store_friendsfollowers_in_neo4j_offline', # [[id_str, campaign_id, user_objects_str, # friends_or_followers]], # queue="offline_jobs") # # self.write(bson.json_util.dumps({'status': res.task_id})) except MissingArgumentError as e: # TODO: implement logging. raise HTTPError( 500, 'You didn' 't supply %s as an argument' % e.arg_name) pass elif store_or_view == 'store_user_info': try: user_object = self.get_argument('user_object', '{}') user_object = bson.json_util.loads(user_object) user_node = init_user_to_graph_aux('default', user_object) if user_node: tx = graph.cypher.begin() tx.append( "MATCH (u:User { id_str: {id_str} })<-[r]-(t:USER_INFO_HARVESTER_TASK {id: 1}) DELETE r", {'id_str': user_object['id_str']}) tx.commit() else: self.write(bson.json_util.dumps({'status': 'error'})) except MissingArgumentError as e: # TODO: implement logging. raise HTTPError( 500, 'You didn' 't supply %s as an argument' % e.arg_name) pass
def post(self, *args, **keywords): task_type = args[0] try: from drenaj_api.utils.drenajneo4jmanager import init_user_to_graph_aux, upsert_campaign task_definition = bson.json_util.loads( self.get_argument('task_definition')) queue = self.get_argument('queue') metadata = task_definition['metadata'] campaign_id = self.get_argument('campaign_id', 'default') campaign_node = upsert_campaign(campaign_id) user = init_user_to_graph_aux(campaign_node, metadata['user']) # user = self.application.db.get_user_from_watchlist(metadata['user']) print user if task_type == 'timeline': timeline_task_state = [ rel for rel in user.match_incoming('TIMELINE_TASK_STATE') ][0] user_object = dict(user.properties) user_object.update({'campaign_ids': campaign_id}) res = app_object.send_task('timeline_retrieve_userlist', [[[ user_object, timeline_task_state.properties['since_tweet_id'], timeline_task_state.properties['page_not_found'] ]]], queue=queue) timeline_task_state.properties['state'] = 1 timeline_task_state.push() elif task_type == 'friendfollower': friendfollower_task_state = \ [rel for rel in user.match_incoming('FRIENDFOLLOWER_TASK_STATE')][0] res = app_object.send_task('crawl_friends_or_followers', [[[ dict(user.properties), friendfollower_task_state.properties['page_not_found'] ]]], queue=queue) friendfollower_task_state.properties['state'] = 1 friendfollower_task_state.push() elif task_type == 'userinfo': userinfo_task_state = \ [rel for rel in user.match_incoming('USER_INFO_HARVESTER_TASK_STATE')][0] res = app_object.send_task('crawl_user_info', [[[dict(user.properties), 0]]], queue=queue) userinfo_task_state.properties['state'] = 1 userinfo_task_state.push() else: raise MissingArgumentError('timeline or friendfollower') self.write( bson.json_util.dumps({ 'result': 'successful', 'message': res.task_id })) self.add_header('Content-Type', 'application/json') except MissingArgumentError as e: raise HTTPError( 500, 'You didn' 't supply %s as an argument' % e.arg_name)
def post(self, *args): """ I chose to handle all options at once, using only POST requests for API requests. GET requests will be used for browser examination. """ (friends_or_followers, ids_or_list, store_or_view) = args print "FollowerHandler: {} {} {}".format(friends_or_followers, ids_or_list, store_or_view) auth_user_id = self.get_argument('auth_user_id') if ((store_or_view != None and store_or_view == 'view') or (store_or_view == None)): try: user_id = self.get_argument('user_id') # if no user_id is supplied. if user_id == '': tmp = [] else: # friends or followers if friends_or_followers == 'followers': id_field_prefix_graph_query = 'friend_' id_field_prefix_graph_query_opposite = '' elif friends_or_followers == 'friends': id_field_prefix_graph_query = '' id_field_prefix_graph_query_opposite = 'friend_' tx = graph.cypher.begin() if friends_or_followers == 'followers': tx.append("MATCH (u { id_str:{id_str} })<--(u2) RETURN u2", {"id_str": str(user_id)}) elif friends_or_followers == 'friends': tx.append("MATCH (u { id_str:{id_str} })-->(u2) RETURN u2", {"id_str": str(user_id)}) results = tx.commit() # take only the first line results = results[0] tmp = [] if ids_or_list == 'ids': tmp = [x.u2.properties['id_str'] for x in results] elif ids_or_list == 'list': tmp = [x.u2.properties for x in results] self.write(bson.json_util.dumps({'results': tmp})) self.add_header('Content-Type', 'application/json') except MissingArgumentError as e: # TODO: implement logging. raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name) elif (store_or_view == 'store'): try: raise HTTPError(500, "This functionality is not available for now.") # WARN: This functionality is not available for now. # # Check long int/str versions # id_str = str(self.get_argument('id_str')) # campaign_id = self.get_argument('campaign_id', 'default') # user_objects_str = self.get_argument('user_objects', '[]') # # res = app_object.send_task('store_friendsfollowers_in_neo4j_offline', # [[id_str, campaign_id, user_objects_str, # friends_or_followers]], # queue="offline_jobs") # # self.write(bson.json_util.dumps({'status': res.task_id})) except MissingArgumentError as e: # TODO: implement logging. raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name) pass elif store_or_view == 'store_user_info': try: user_object = self.get_argument('user_object', '{}') user_object = bson.json_util.loads(user_object) user_node = init_user_to_graph_aux('default', user_object) if user_node: tx = graph.cypher.begin() tx.append( "MATCH (u:User { id_str: {id_str} })<-[r]-(t:USER_INFO_HARVESTER_TASK {id: 1}) DELETE r", {'id_str': user_object['id_str']}) tx.commit() else: self.write(bson.json_util.dumps({'status': 'error'})) except MissingArgumentError as e: # TODO: implement logging. raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name) pass