You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.6 KiB

import splunk.admin as admin
import json
import cp_aws_bin.utils.app_util as util
from dao.kvstore_access_object import KVStoreAccessObject
import recommendation_task.recommendation_consts as recomm_consts
logger = util.get_logger()
ARG_RECOMM_ID = 'recomm_id'
ARG_FEEDBACK = 'feedback'
ARG_TIMESTAMP = 'timestamp'
ARG_RESOURCE_ID = 'resource_id'
ARG_FEATURE = 'feature'
ARG_PRIORITY = 'ml_priority'
ARG_ACTION = 'ml_action'
ARG_DIMENSION = 'ml_dimension'
"""
@api {get} /saas-aws/da_itsi_cp_aws_recomm_action list recommendation feedbacks
@apiName list-recommendation-feedbacks
@apiGroup Recommendation Feedbacks
@apiSuccess {Atom.Entry} entry recommendation feedbacks
"""
"""
@api {post} /saas-aws/da_itsi_cp_aws_recomm_action create a recommendation feedback
@apiName create-recommendation-feedback
@apiGroup Recommendation Feedbacks
@apiSuccess {Atom.Entry} entry recommendation feedbacks
"""
class RecommActionHandler(admin.MConfigHandler):
def __init__(self, scriptMode, ctxInfo):
admin.MConfigHandler.__init__(self, scriptMode, ctxInfo)
self.shouldAutoList = False
self.kao = KVStoreAccessObject(recomm_consts.FEEDBACK_COLLECTION, self.getSessionKey())
self.recomm_kao = KVStoreAccessObject(recomm_consts.RECOMMENDATION_COLLECTION, self.getSessionKey())
def setup(self):
for arg in []:
self.supportedArgs.addReqArg(arg)
for arg in [ARG_RECOMM_ID, ARG_FEEDBACK, ARG_TIMESTAMP]:
self.supportedArgs.addOptArg(arg)
def handleList(self, confInfo):
results = self.kao.query_items({
'splunk_account': self.userName
}, 'timestamp')
results = json.loads(results)
for result in results:
d = confInfo[result['_key']]
for key in list(result.keys()):
d.append(key, result[key])
logger.info('list %s recommendation feedbacks' % (len(results)))
return
def handleEdit(self, confInfo):
recomm_id = self.callerArgs[ARG_RECOMM_ID][0]
item = self._merge_details(recomm_id)
if not item:
logger.info('failed to update feedback for %s' % recomm_id)
return False
logger.info('update feedback %s to %s' % (item[ARG_RESOURCE_ID], item[ARG_FEEDBACK]))
return self.kao.update_item_by_key(self.callerArgs.id, item)
def handleCreate(self, confInfo):
recomm_id = self.callerArgs[ARG_RECOMM_ID][0]
item = self._merge_details(recomm_id)
if not item:
logger.info('failed to create %s feedback for %s' % (self.callerArgs[ARG_FEEDBACK][0], recomm_id))
return False
new_item = self.kao.insert_single_item(item)
new_item = json.loads(new_item)
confInfo[new_item['_key']].append('id', item)
logger.info('create feedback for %s' % (item[ARG_RESOURCE_ID]))
return new_item
def _merge_details(self, recomm_id):
item = {}
try:
item = json.loads(self.recomm_kao.get_item_by_key(recomm_id))
except:
logger.info('failed to find recomm_item %s' % recomm_id)
return False
feedback_item = {}
for key in [ARG_RESOURCE_ID, ARG_DIMENSION, ARG_FEATURE, ARG_PRIORITY, ARG_ACTION]:
feedback_item[key] = item[key]
feedback_item[ARG_RECOMM_ID] = recomm_id
feedback_item['splunk_account'] = self.userName
feedback_item[ARG_FEEDBACK] = self.callerArgs[ARG_FEEDBACK][0]
feedback_item[ARG_TIMESTAMP] = int(self.callerArgs[ARG_TIMESTAMP][0]) // 1000
return feedback_item
admin.init(RecommActionHandler, admin.CONTEXT_APP_ONLY)