import logging
from fastjsonrpc.jsonrpc import JSONRPCError
from fastjsonrpc.server import JSONRPCServer
from jsonobject.exceptions import BadValueError
from twisted.internet import defer, reactor
from twisted.web.server import Site
from adselect.iface import const as iface_const, protocol as iface_proto, utils as iface_utils
[docs]class AdSelectIfaceServer(JSONRPCServer):
"""
JSON-RPC endpoint.
"""
def __init__(self):
JSONRPCServer.__init__(self)
self.logger = logging.getLogger(__name__)
# campaign interface
[docs] @defer.inlineCallbacks
def jsonrpc_campaign_update(self, *campaign_data_list):
"""
JSON-RPC campaign_update method handler.
:param campaign_data_list: List of campaign data.
:return: True
"""
if not campaign_data_list:
yield self.logger.warning("No campaign data to update.")
defer.returnValue(True)
else:
for campaign_data in campaign_data_list:
yield self.logger.debug("Campaign update: {0}".format(campaign_data))
try:
campaign_data['filters'] = iface_proto.RequireExcludeObject(**campaign_data['filters'])
campaign_data['banners'] = [iface_proto.BannerObject(campaign_id=campaign_data['campaign_id'], **b) for b in
campaign_data['banners']]
yield iface_utils.create_or_update_campaign(iface_proto.CampaignObject(**campaign_data))
except KeyError as e:
raise JSONRPCError('Key error in campaign data: {0}'.format(e), iface_const.INVALID_OBJECT)
except (TypeError, BadValueError) as e:
raise JSONRPCError(e, iface_const.INVALID_OBJECT)
defer.returnValue(True)
[docs] @defer.inlineCallbacks
def jsonrpc_campaign_delete(self, *campaign_id_list):
"""
JSON-RPC campaign_delete method handler.
:param campaign_id_list: List of campaign identifiers.
:return: True
"""
if not campaign_id_list:
yield self.logger.warning("No campaign id to remove.")
defer.returnValue(True)
else:
for campaign_id in campaign_id_list:
yield self.logger.info("Campaign removal: {0}".format(campaign_id))
yield iface_utils.delete_campaign(campaign_id)
defer.returnValue(True)
[docs] @defer.inlineCallbacks
# impressions interface
def jsonrpc_impression_add(self, *impressions_data_list):
"""
JSON-RPC impression_add method handler.
:param impressions_data_list: List of impression data.
:return: True
"""
if not impressions_data_list:
yield self.logger.warning("No event data to add.")
defer.returnValue(True)
else:
for imobj in impressions_data_list:
yield self.logger.debug("Adding event data: {0}".format(imobj))
imobj['paid_amount'] = 0
yield self.logger.debug("Adding event data: {0}".format(imobj))
try:
yield iface_utils.add_impression(iface_proto.ImpressionObject(imobj))
except BadValueError as e:
raise JSONRPCError(e, iface_const.INVALID_OBJECT)
defer.returnValue(True)
[docs] @defer.inlineCallbacks
# impressions interface
def jsonrpc_impression_payment_add(self, *impressions_data_list):
"""
JSON-RPC impression_add method handler.
:param impressions_data_list: List of impression data.
:return: True
"""
if not impressions_data_list:
yield self.logger.warning("No event data to add.")
defer.returnValue(True)
else:
for imobj in impressions_data_list:
yield self.logger.debug("Adding event data: {0}".format(imobj))
try:
yield iface_utils.add_impression(iface_proto.ImpressionObject(imobj),
increment=False)
except BadValueError as e:
raise JSONRPCError(e, iface_const.INVALID_OBJECT)
defer.returnValue(True)
[docs] @defer.inlineCallbacks
# select banner interface
def jsonrpc_banner_select(self, *impression_param_list):
"""
JSON-RPC banner_select method handler.
:param impression_param_list: List of impression parameters
:return: Selected banners data in JSON.
"""
def send_respone(responses_dict):
responses = [iface_proto.SelectBannerResponse(request_id=request_id,
banner_id=responses_dict[request_id])
for request_id in responses_dict]
return [response.to_json() for response in responses]
if not impression_param_list:
yield self.logger.warning("No event parameters.")
defer.returnValue([])
else:
yield self.logger.info("Select banners request received.")
yield self.logger.debug(impression_param_list)
try:
banner_requests = [iface_proto.SelectBannerRequest(impression_param) for impression_param in
impression_param_list]
selected_banners = iface_utils.select_banner(banner_requests)
selected_banners.addCallback(send_respone)
ret_sb = yield selected_banners
except BadValueError as e:
raise JSONRPCError(e, iface_const.INVALID_OBJECT)
defer.returnValue(ret_sb)