diff --git a/ebay/best_match.py b/ebay/best_match.py index 05c2cf6..c2a2ddf 100644 --- a/ebay/best_match.py +++ b/ebay/best_match.py @@ -1,156 +1,148 @@ -import urllib2 +# import urllib2 + from lxml import etree -from utils import get_config_store - - -def findBestMatchItemDetailsAcrossStores( - keywords, - siteResultsPerPage, - categoryId=None, - entriesPerPage=None, - ignoreFeatured=None, - itemFilter=None, - outputSelector=None, - postSearchItemFilter=None, - postSearchSellerFilter=None, - encoding="JSON"): - root = etree.Element("findBestMatchItemDetailsAcrossStoresRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") - root = get_generic_tags( - root=root, - keywords=keywords, - siteResultsPerPage=siteResultsPerPage, - categoryId=categoryId, - entriesPerPage=entriesPerPage, - ignoreFeatured=ignoreFeatured, - itemFilter=itemFilter, - outputSelector=outputSelector, - postSearchItemFilter=postSearchItemFilter, - postSearchSellerFilter=postSearchSellerFilter) +try: + from utils import get_config_store, urlopen, Request +except ImportError: + from .utils import get_config_store, urlopen, Request + +def findBestMatchItemDetailsAcrossStores(keywords, \ + siteResultsPerPage, \ + categoryId=None, \ + entriesPerPage=None, \ + ignoreFeatured=None, \ + itemFilter=None, \ + outputSelector=None, \ + postSearchItemFilter=None, \ + postSearchSellerFilter=None, \ + encoding="JSON"): + root = etree.Element("findBestMatchItemDetailsAcrossStoresRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = get_generic_tags(root=root, \ + keywords=keywords, \ + siteResultsPerPage=siteResultsPerPage, \ + categoryId=categoryId, \ + entriesPerPage=entriesPerPage, \ + ignoreFeatured=ignoreFeatured, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + postSearchItemFilter=postSearchItemFilter, \ + postSearchSellerFilter=postSearchSellerFilter) request = etree.tostring(root, pretty_print=True) return get_response(findBestMatchItemDetailsAcrossStores.__name__, request, encoding) -def findBestMatchItemDetailsAdvanced( - keywords, - siteResultsPerPage, - categoryId=None, - entriesPerPage=None, - ignoreFeatured=None, - itemFilter=None, - outputSelector=None, - postSearchItemFilter=None, - postSearchSellerFilter=None, - encoding="JSON"): - root = etree.Element("findBestMatchItemDetailsAdvancedRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") - root = get_generic_tags( - root=root, - keywords=keywords, - siteResultsPerPage=siteResultsPerPage, - categoryId=categoryId, - entriesPerPage=entriesPerPage, - ignoreFeatured=ignoreFeatured, - itemFilter=itemFilter, - outputSelector=outputSelector, - postSearchItemFilter=postSearchItemFilter, - postSearchSellerFilter=postSearchSellerFilter) + +def findBestMatchItemDetailsAdvanced(keywords, \ + siteResultsPerPage, \ + categoryId=None, \ + entriesPerPage=None, \ + ignoreFeatured=None, \ + itemFilter=None, \ + outputSelector=None, \ + postSearchItemFilter=None, \ + postSearchSellerFilter=None, \ + encoding="JSON"): + root = etree.Element("findBestMatchItemDetailsAdvancedRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = get_generic_tags(root=root, \ + keywords=keywords, \ + siteResultsPerPage=siteResultsPerPage, \ + categoryId=categoryId, \ + entriesPerPage=entriesPerPage, \ + ignoreFeatured=ignoreFeatured, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + postSearchItemFilter=postSearchItemFilter, \ + postSearchSellerFilter=postSearchSellerFilter) request = etree.tostring(root, pretty_print=True) return get_response(findBestMatchItemDetailsAdvanced.__name__, request, encoding) -def findBestMatchItemDetailsByCategory( - categoryId, - siteResultsPerPage, - entriesPerPage=None, - ignoreFeatured=None, - itemFilter=None, - outputSelector=None, - postSearchItemFilter=None, - postSearchSellerFilter=None, - encoding="JSON"): - root = etree.Element("findBestMatchItemDetailsByCategoryRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") - root = get_generic_tags( - root=root, - categoryId=categoryId, - siteResultsPerPage=siteResultsPerPage, - entriesPerPage=entriesPerPage, - ignoreFeatured=ignoreFeatured, - itemFilter=itemFilter, - outputSelector=outputSelector, - postSearchItemFilter=postSearchItemFilter, - postSearchSellerFilter=postSearchSellerFilter) + +def findBestMatchItemDetailsByCategory(categoryId, \ + siteResultsPerPage, \ + entriesPerPage=None, \ + ignoreFeatured=None, \ + itemFilter=None, \ + outputSelector=None, \ + postSearchItemFilter=None, \ + postSearchSellerFilter=None, \ + encoding="JSON"): + root = etree.Element("findBestMatchItemDetailsByCategoryRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = get_generic_tags(root=root, \ + categoryId=categoryId, \ + siteResultsPerPage=siteResultsPerPage, \ + entriesPerPage=entriesPerPage, \ + ignoreFeatured=ignoreFeatured, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + postSearchItemFilter=postSearchItemFilter, \ + postSearchSellerFilter=postSearchSellerFilter) request = etree.tostring(root, pretty_print=True) return get_response(findBestMatchItemDetailsByCategory.__name__, request, encoding) -def findBestMatchItemDetailsByKeywords( - keywords, - siteResultsPerPage, - entriesPerPage=None, - ignoreFeatured=None, - itemFilter=None, - outputSelector=None, - postSearchItemFilter=None, - postSearchSellerFilter=None, - encoding="JSON"): + +def findBestMatchItemDetailsByKeywords(keywords, \ + siteResultsPerPage, \ + entriesPerPage=None, \ + ignoreFeatured=None, \ + itemFilter=None, \ + outputSelector=None, \ + postSearchItemFilter=None, \ + postSearchSellerFilter=None, \ + encoding="JSON"): root = etree.Element("root", xmlns="http://www.ebay.com/marketplace/search/v1/services") - root = get_generic_tags( - root=root, - keywords=keywords, - siteResultsPerPage=siteResultsPerPage, - entriesPerPage=entriesPerPage, - ignoreFeatured=ignoreFeatured, - itemFilter=itemFilter, - outputSelector=outputSelector, - postSearchItemFilter=postSearchItemFilter, - postSearchSellerFilter=postSearchItemFilter) + root = get_generic_tags(root=root, \ + keywords=keywords, \ + siteResultsPerPage=siteResultsPerPage, \ + entriesPerPage=entriesPerPage, \ + ignoreFeatured=ignoreFeatured, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + postSearchItemFilter=postSearchItemFilter, \ + postSearchSellerFilter=postSearchItemFilter) request = etree.tostring(root, pretty_print=True) return get_response(findBestMatchItemDetailsByKeywords.__name__, request, encoding) -def findBestMatchItemDetailsByProduct( - productId, - siteResultsPerPage, - entriesPerPage=None, - ignoreFeatured=None, - itemFilter=None, - outputSelector=None, - postSearchItemFilter=None, - postSearchSellerFilter=None, - encoding="JSON"): - root = etree.Element("findBestMatchItemDetailsByProductRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") - root = get_generic_tags( - root=root, - productId=productId, - siteResultsPerPage=siteResultsPerPage, - entriesPerPage=entriesPerPage, - ignoreFeatured=ignoreFeatured, - itemFilter=itemFilter, - outputSelector=outputSelector, - postSearchItemFilter=postSearchItemFilter, - postSearchSellerFilter=postSearchItemFilter) + +def findBestMatchItemDetailsByProduct(productId, \ + siteResultsPerPage, \ + entriesPerPage=None, \ + ignoreFeatured=None, \ + itemFilter=None, \ + outputSelector=None, \ + postSearchItemFilter=None, \ + postSearchSellerFilter=None, \ + encoding="JSON"): + root = etree.Element("findBestMatchItemDetailsByProductRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = get_generic_tags(root=root, \ + productId=productId, \ + siteResultsPerPage=siteResultsPerPage, \ + entriesPerPage=entriesPerPage, \ + ignoreFeatured=ignoreFeatured, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + postSearchItemFilter=postSearchItemFilter, \ + postSearchSellerFilter=postSearchItemFilter) request = etree.tostring(root, pretty_print=True) return get_response(findBestMatchItemDetailsByProduct.__name__, request, encoding) -def findBestMatchItemDetailsBySeller( - categoryId, - sellerUserName, - ignoreFeatured=None, - itemFilter=None, - paginationInput=None, - encoding="JSON"): - root = etree.Element("findBestMatchItemDetailsBySellerRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + +def findBestMatchItemDetailsBySeller(categoryId, \ + sellerUserName, \ + ignoreFeatured=None, \ + itemFilter=None, \ + paginationInput=None, \ + encoding="JSON"): + root = etree.Element("findBestMatchItemDetailsBySellerRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") categoryId_elem = etree.SubElement(root, "categoryId") categoryId_elem.text = categoryId @@ -162,22 +154,18 @@ def findBestMatchItemDetailsBySeller( ignoreFeatured_elem = etree.SubElement(root, "ignoreFeatured") ignoreFeatured_elem.text = ignoreFeatured - # itemFilter is a List of dicts: [{ - # "paramName" : "PriceMin", - # "paramValue" : "50", - # "name" : "Currency", - # "value" : "USD"}] - + #itemFilter is a List of dicts: [{"paramName" : "PriceMin", "paramValue" : "50", "name" : "Currency", "value" : "USD"}] - for item_filter in itemFilter: - if len(item_filter) > 0: - itemFilter_elem = etree.SubElement(root, "itemFilter") - for key in item_filter.keys(): - item_elem = etree.SubElement(itemFilter_elem, key) - item_elem.text = item_filter[key] + if itemFilter: + for item_filter in itemFilter: + if len(item_filter)>0: + itemFilter_elem = etree.SubElement(root, "itemFilter") + for key in item_filter.keys(): + item_elem = etree.SubElement(itemFilter_elem, key) + item_elem.text = item_filter[key] # paginationInput is a dict: {entriesPerPage:5, pageNumber:10} - if paginationInput and len(paginationInput) > 0: + if paginationInput and len(paginationInput)>0: paginationInput_elem = etree.SubElement(root, "paginationInput") for key in paginationInput.keys(): input_values_elem = etree.SubElement(paginationInput_elem, key) @@ -195,21 +183,16 @@ def findBestMatchItemDetails(encoding="JSON"): 23484479761 """ - return get_response(findBestMatchItemDetails.__name__, request, encoding) - + return get_response(findBestMatchItemDetails.__name__,request, encoding) def getVersion(): root = etree.Element("getVersionRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") - request = etree.tostring(root, pretty_print=True) + request=etree.tostring(root, pretty_print=True) return get_response(getVersion.__name__, request, encoding="JSON") +def get_generic_tags(root, siteResultsPerPage, productId=None, keywords=None, categoryId=None, entriesPerPage=None, ignoreFeatured=None, itemFilter=None, outputSelector=None, postSearchItemFilter=None, postSearchSellerFilter=None): -def get_generic_tags(root, siteResultsPerPage, productId=None, - keywords=None, categoryId=None, entriesPerPage=None, - ignoreFeatured=None, itemFilter=None, outputSelector=None, - postSearchItemFilter=None, - postSearchSellerFilter=None): siteResultsPerPage_elem = etree.SubElement(root, "siteResultsPerPage") siteResultsPerPage_elem.text = siteResultsPerPage @@ -234,28 +217,30 @@ def get_generic_tags(root, siteResultsPerPage, productId=None, productId_elem.text = productId #itemFilter is a List of dicts: [{paramName=PriceMin, paramValue=50, name=Currency, value=USD}] - for item_filter in itemFilter: - if len(item_filter) > 0: - itemFilter_elem = etree.SubElement(root, "itemFilter") - for key in item_filter.keys(): - item_elem = etree.SubElement(itemFilter_elem, key) - item_elem.text = item_filter[key] + if itemFilter: + for item_filter in itemFilter: + if len(item_filter)>0: + itemFilter_elem = etree.SubElement(root, "itemFilter") + for key in item_filter.keys(): + item_elem = etree.SubElement(itemFilter_elem, key) + item_elem.text = item_filter[key] #outputSelector is a List - if outputSelector and len(outputSelector) > 0: + if outputSelector and len(outputSelector)>0: for output_selector in outputSelector: outputSelector_elem = etree.SubElement(root, "outputSelector") outputSelector_elem.text = output_selector + # postSearchItemFilter is a List - if postSearchItemFilter and len(postSearchItemFilter) > 0: + if postSearchItemFilter and len(postSearchItemFilter)>0: postSearchItemFilter_elem = etree.SubElement(root, "postSearchItemFilter") for item_filter in postSearchItemFilter: itemId_elem = etree.SubElement(postSearchItemFilter_elem, "itemId") itemId_elem.text = item_filter # postSearchSellerFilter is a List - if postSearchSellerFilter and len(postSearchSellerFilter) > 0: + if postSearchSellerFilter and len(postSearchSellerFilter)>0: postSearchSellerFilter_elem = etree.SubElement(root, "postSearchSellerFilter") for seller in postSearchSellerFilter: seller_elem = etree.SubElement(postSearchSellerFilter_elem, "sellerUserName") @@ -275,6 +260,9 @@ def get_response(operation_name, data, encoding, **headers): http_headers.update(headers) - req = urllib2.Request(endpoint, data, http_headers) - res = urllib2.urlopen(req) - return res.read() + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) + data = res.read() + return data diff --git a/ebay/client_alerts.py b/ebay/client_alerts.py index 46f05a5..4db2024 100644 --- a/ebay/client_alerts.py +++ b/ebay/client_alerts.py @@ -1,68 +1,61 @@ import requests -from utils import get_config_store +try: + from utils import get_config_store, urlopen, Request +except ImportError: + from .utils import get_config_store, urlopen, Request -def GetPublicAlerts(ChannelID, ChannelType, EventType, - MessageID=None, LastRequestTime=None, - encoding="JSON"): - user_param = { - 'callname': GetPublicAlerts.__name__, - 'ChannelDescriptor(0).ChannelID': ChannelID, - 'ChannelDescriptor(0).ChannelType': ChannelType, - 'ChannelDescriptor(0).EventType': EventType, - 'responseencoding': encoding} +def GetPublicAlerts(ChannelID, ChannelType, EventType, MessageID=None, LastRequestTime=None, encoding="JSON"): + user_param={'callname' : GetPublicAlerts.__name__, + 'ChannelDescriptor(0).ChannelID' : ChannelID, + 'ChannelDescriptor(0).ChannelType' : ChannelType, + 'ChannelDescriptor(0).EventType' : EventType, + 'responseencoding' : encoding} if MessageID: - user_param.update({"MessageID": MessageID}) - + user_param.update({"MessageID" : MessageID}) if LastRequestTime: - user_param.update({"LastRequestTime": LastRequestTime}) + user_param.update({"LastRequestTime" : LastRequestTime}) response = get_response(user_param) return response.content - def GetUserAlerts(SessionID, SessionData, MessageID=None, encoding="JSON"): - user_param = { - 'callname': GetUserAlerts.__name__, - 'SessionData': SessionData, - 'SessionID': SessionID, - 'responseencoding': encoding} + user_param={'callname' : GetUserAlerts.__name__, + 'SessionData' : SessionData, + 'SessionID' : SessionID, + 'responseencoding' : encoding} if MessageID: - user_param.update({"MessageID": MessageID}) + user_param.update({"MessageID" : MessageID}) response = get_response(user_param) return response.content - def Login(ClientAlertsAuthToken, MessageID=None, encoding="JSON"): - user_param = { - 'callname': Login.__name__, - 'ClientAlertsAuthToken': ClientAlertsAuthToken, - 'responseencoding': encoding} + user_param={'callname' : Login.__name__, + 'ClientAlertsAuthToken' : ClientAlertsAuthToken, + 'responseencoding' : encoding} if MessageID: - user_param.update({"MessageID": MessageID}) + user_param.update({"MessageID" : MessageID}) response = get_response(user_param) return response.content def Logout(SessionID, SessionData, MessageID=None, encoding="JSON"): - user_param = { - 'callname': Logout.__name__, - 'SessionData': SessionData, - 'SessionID': SessionID, - 'responseencoding': encoding} + user_param={'callname' : Logout.__name__, + 'SessionData' : SessionData, + 'SessionID' : SessionID, + 'responseencoding' : encoding} if MessageID: - user_param.update({"MessageID": MessageID}) + user_param.update({"MessageID" : MessageID}) response = get_response(user_param) return response.content - def get_response(user_params): config = get_config_store() app_id = config.get("keys", "app_name") @@ -70,7 +63,7 @@ def get_response(user_params): version = config.get("call", "compatibility_level") endpoint = config.get("endpoints", "client_alerts") - d = dict(appid=app_id, siteid=site_id, version=version) + d=dict(appid = app_id, siteid = site_id, version = version) d.update(user_params) - return requests.get(endpoint, params=d) \ No newline at end of file + return requests.get(endpoint, params=d) diff --git a/ebay/feedback.py b/ebay/feedback.py index be4794a..4d50ca0 100644 --- a/ebay/feedback.py +++ b/ebay/feedback.py @@ -1,15 +1,15 @@ -import urllib2 +# import urllib2 + from lxml import etree -from utils import get_config_store +try: + from utils import get_config_store, urlopen, Request +except ImportError: + from .utils import get_config_store, urlopen, Request -def createDSRSummaryByCategory( - categoryId, dateRangeFrom, - dateRangeTo, dateRangeEventType=None, - encoding="JSON"): - root = etree.Element("createDSRSummaryByCategoryRequest", - xmlns="http://www.ebay.com/marketplace/services") +def createDSRSummaryByCategory(categoryId , dateRangeFrom, dateRangeTo, dateRangeEventType=None, encoding="JSON"): + root = etree.Element("createDSRSummaryByCategoryRequest", xmlns="http://www.ebay.com/marketplace/services") #categoryId is a List for cat_id in categoryId: @@ -31,11 +31,8 @@ def createDSRSummaryByCategory( return get_response(createDSRSummaryByCategory.__name__, request, encoding) -def createDSRSummaryByPeriod( - dateRangeFrom, dateRangeTo, - dateRangeEventType=None, encoding="JSON"): - root = etree.Element("createDSRSummaryByPeriodRequest", - xmlns="http://www.ebay.com/marketplace/services") +def createDSRSummaryByPeriod(dateRangeFrom, dateRangeTo, dateRangeEventType=None, encoding="JSON"): + root = etree.Element("createDSRSummaryByPeriodRequest", xmlns="http://www.ebay.com/marketplace/services") dateRange_elem = etree.SubElement(root, "dateRange") dateRangeFrom_elem = etree.SubElement(dateRange_elem, "dateFrom") @@ -51,14 +48,8 @@ def createDSRSummaryByPeriod( request = etree.tostring(root, pretty_print=True) return get_response(createDSRSummaryByPeriod.__name__, request, encoding) - -def createDSRSummaryByShippingDetail( - dateRangeFrom, dateRangeTo, - dateRangeEventType=None, shippingCostType=None, - shippingDestinationType=None, shippingService=None, - shipToCountry=None, encoding="JSON"): - root = etree.Element("createDSRSummaryByShippingDetailRequest", - xmlns="http://www.ebay.com/marketplace/services") +def createDSRSummaryByShippingDetail(dateRangeFrom, dateRangeTo, dateRangeEventType=None, shippingCostType=None, shippingDestinationType=None, shippingService=None, shipToCountry=None, encoding="JSON"): + root = etree.Element("createDSRSummaryByShippingDetailRequest", xmlns="http://www.ebay.com/marketplace/services") dateRange_elem = etree.SubElement(root, "dateRange") dateRangeFrom_elem = etree.SubElement(dateRange_elem, "dateFrom") @@ -80,15 +71,16 @@ def createDSRSummaryByShippingDetail( shippingDestinationType_elem.text = shippingDestinationType #shippingService is a List - if shippingService and len(shippingService) > 0: + if shippingService and len(shippingService)>0: for service in shippingService: shippingService_elem = etree.SubElement(root, "shippingService") shippingService_elem.text = shippingService #shipToCountry is a List - for country in shipToCountry: - shipToCountry_elem = etree.SubElement(root, "shipToCountry") - shipToCountry_elem.text = shipToCountry + if shipToCountry: + for country in shipToCountry: + shipToCountry_elem = etree.SubElement(root, "shipToCountry") + shipToCountry_elem.text = shipToCountry request = etree.tostring(root, pretty_print=True) return get_response(createDSRSummaryByShippingDetail.__name__, request, encoding) @@ -97,23 +89,21 @@ def createDSRSummaryByShippingDetail( #making transactionId required here, but it's not in the eBay API. Will fix it later #transactionId is a list of dicts: [{itemId:123, transactionId:72}, {itemId:33, transactionId:21}] def createDSRSummaryByTransaction(transactionKey, encoding="JSON"): - root = etree.Element("createDSRSummaryByTransactionRequest", - xmlns="http://www.ebay.com/marketplace/services") + root = etree.Element("createDSRSummaryByTransactionRequest", xmlns="http://www.ebay.com/marketplace/services") for t in transactionKey: transactionKey_elem = etree.SubElement(root, "transactionKey") for key in t.keys(): itemId_elem = etree.SubElement(transactionKey_elem, key) - itemId_elem.text = t[key] + itemId_elem.text = t[key] request = etree.tostring(root, pretty_print=True) return get_response(createDSRSummaryByTransaction.__name__, request, encoding) def getDSRSummary(jobId, encoding="JSON"): - root = etree.Element("getDSRSummaryRequest", - xmlns="http://www.ebay.com/marketplace/services") + root = etree.Element("getDSRSummaryRequest", xmlns="http://www.ebay.com/marketplace/services") jobId_elem = etree.SubElement(root, "jobId") jobId_elem.text = jobId @@ -127,13 +117,15 @@ def get_response(operation_name, data, encoding, **headers): access_token = config.get("auth", "token") endpoint = config.get("endpoints", "feedback") - http_headers = { - "X-EBAY-SOA-OPERATION-NAME": operation_name, - "X-EBAY-SOA-SECURITY-TOKEN": access_token, - "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} + http_headers = {"X-EBAY-SOA-OPERATION-NAME": operation_name, + "X-EBAY-SOA-SECURITY-TOKEN": access_token, + "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} http_headers.update(headers) - req = urllib2.Request(endpoint, data, http_headers) - res = urllib2.urlopen(req) - return res.read() + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) + data = res.read() + return data diff --git a/ebay/finding.py b/ebay/finding.py index c2269d2..3913689 100644 --- a/ebay/finding.py +++ b/ebay/finding.py @@ -1,27 +1,37 @@ -import urllib2 from lxml import etree -from utils import get_config_store +# import urllib2 +try: + from utils import get_config_store, urlopen, Request +except ImportError: + from .utils import get_config_store, urlopen, Request -def getSearchKeywordsRecommendation(keywords, encoding="JSON"): +def getSearchKeywordsRecommendation( keywords, encoding="JSON", **headers ): root = etree.Element("getSearchKeywordsRecommendation", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + xmlns="http://www.ebay.com/marketplace/search/v1/services") keywords_elem = etree.SubElement(root, "keywords") keywords_elem.text = keywords request = etree.tostring(root, pretty_print=True) - return get_response(getSearchKeywordsRecommendation.__name__, request, encoding) - - -def findItemsByKeywords( - keywords, affiliate=None, - buyerPostalCode=None, paginationInput=None, - sortOrder=None, aspectFilter=None, - domainFilter=None, itemFilter=None, - outputSelector=None, encoding="JSON"): + return get_response( + getSearchKeywordsRecommendation.__name__, request, encoding, + **headers ) + + +def findItemsByKeywords(keywords, \ + affiliate=None, \ + buyerPostalCode=None, \ + paginationInput=None, \ + sortOrder=None, \ + aspectFilter=None, \ + domainFilter=None, \ + itemFilter=None, \ + outputSelector=None, \ + encoding="JSON", + **headers ): root = etree.Element("findItemsByKeywords", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + xmlns="http://www.ebay.com/marketplace/search/v1/services") keywords_elem = etree.SubElement(root, "keywords") keywords_elem.text = keywords @@ -58,36 +68,45 @@ def findItemsByKeywords( sortOrder_elem.text = sortOrder #aspectFilter is a list of dicts - for item in aspectFilter: - aspectFilter_elem = etree.SubElement(root, "aspectFilter") - for key in item: - key_elem = etree.SubElement(aspectFilter_elem, key) - key_elem.text = item[key] + if aspectFilter: + for item in aspectFilter: + aspectFilter_elem = etree.SubElement(root, "aspectFilter") + for key in item: + key_elem = etree.SubElement(aspectFilter_elem, key) + key_elem.text = item[key] #domainFilter is a list of dicts - for item in domainFilter: - domainFilter_elem = etree.SubElement(root, "domainFilter") - for key in item: - key_elem = etree.SubElement(domainFilter_elem, key) - key_elem.text = item[key] + if domainFilter: + for item in domainFilter: + domainFilter_elem = etree.SubElement(root, "domainFilter") + for key in item: + key_elem = etree.SubElement(domainFilter_elem, key) + key_elem.text = item[key] #outputSelector is a list - for item in outputSelector: - outputSelector_elem = etree.SubElement(root, "outputSelector") - outputSelector_elem.text = item + if outputSelector: + for item in outputSelector: + outputSelector_elem = etree.SubElement(root, "outputSelector") + outputSelector_elem.text = item request = etree.tostring(root, pretty_print=True) - return get_response(findItemsByKeywords.__name__, request, encoding) - - -def findItemsByCategory( - categoryId, affiliate=None, - buyerPostalCode=None, sortOrder=None, - paginationInput=None, aspectFilter=None, - domainFilter=None, itemFilter=None, - outputSelector=None, encoding="JSON"): + return get_response(findItemsByKeywords.__name__, request, encoding, + **headers ) + + +def findItemsByCategory(categoryId, \ + affiliate=None, \ + buyerPostalCode=None, \ + sortOrder=None, \ + paginationInput = None, \ + aspectFilter=None, \ + domainFilter=None, \ + itemFilter=None, \ + outputSelector=None, \ + encoding="JSON", + **headers ): root = etree.Element("findItemsByCategory", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + xmlns="http://www.ebay.com/marketplace/search/v1/services") categoryId_elem = etree.SubElement(root, "categoryId") categoryId_elem.text = categoryId @@ -111,11 +130,12 @@ def findItemsByCategory( key_elem.text = paginationInput[key] #itenFilter is a list of dicts - for item in itemFilter: - itemFilter_elem = etree.SubElement(root, "itemFilter") - for key in item: - key_elem = etree.SubElement(itemFilter_elem, key) - key_elem.text = item[key] + if itemFilter: + for item in itemFilter: + itemFilter_elem = etree.SubElement(root, "itemFilter") + for key in item: + key_elem = etree.SubElement(itemFilter_elem, key) + key_elem.text = item[key] #sortOrder if sortOrder: @@ -123,37 +143,46 @@ def findItemsByCategory( sortOrder_elem.text = sortOrder #aspectFilter is a list of dicts - for item in aspectFilter: - aspectFilter_elem = etree.SubElement(root, "aspectFilter") - for key in item: - key_elem = etree.SubElement(aspectFilter_elem, key) - key_elem.text = item[key] + if aspectFilter: + for item in aspectFilter: + aspectFilter_elem = etree.SubElement(root, "aspectFilter") + for key in item: + key_elem = etree.SubElement(aspectFilter_elem, key) + key_elem.text = item[key] #domainFilter is a list of dicts - for item in domainFilter: - domainFilter_elem = etree.SubElement(root, "domainFilter") - for key in item: - key_elem = etree.SubElement(domainFilter_elem, key) - key_elem.text = item[key] + if domainFilter: + for item in domainFilter: + domainFilter_elem = etree.SubElement(root, "domainFilter") + for key in item: + key_elem = etree.SubElement(domainFilter_elem, key) + key_elem.text = item[key] #outputSelector is a list - for item in outputSelector: - outputSelector_elem = etree.SubElement(root, "outputSelector") - outputSelector_elem.text = item + if outputSelector: + for item in outputSelector: + outputSelector_elem = etree.SubElement(root, "outputSelector") + outputSelector_elem.text = item request = etree.tostring(root, pretty_print=True) - return get_response(findItemsByCategory.__name__, request, encoding) - - -def findItemsAdvanced( - keywords=None, categoryId=None, - affiliate=None, buyerPostalCode=None, - paginationInput=None, sortOrder=None, - aspectFilter=None, domainFilter=None, - itemFilter=None, outputSelector=None, - encoding="JSON"): + return get_response(findItemsByCategory.__name__, request, encoding, + **headers ) + + +def findItemsAdvanced( keywords=None, \ + categoryId=None, \ + affiliate=None, \ + buyerPostalCode=None, \ + paginationInput = None, \ + sortOrder=None, \ + aspectFilter=None, \ + domainFilter=None, \ + itemFilter=None, \ + outputSelector=None, \ + encoding="JSON", + **headers ): root = etree.Element("findItemsAdvanced", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + xmlns="http://www.ebay.com/marketplace/search/v1/services") if keywords: keywords_elem = etree.SubElement(root, "keywords") @@ -182,12 +211,12 @@ def findItemsAdvanced( key_elem.text = paginationInput[key] #itenFilter is a list of dicts - - for item in itemFilter: - itemFilter_elem = etree.SubElement(root, "itemFilter") - for key in item: - key_elem = etree.SubElement(itemFilter_elem, key) - key_elem.text = item[key] + if itemFilter: + for item in itemFilter: + itemFilter_elem = etree.SubElement(root, "itemFilter") + for key in item: + key_elem = etree.SubElement(itemFilter_elem, key) + key_elem.text = item[key] #sortOrder if sortOrder: @@ -195,34 +224,42 @@ def findItemsAdvanced( sortOrder_elem.text = sortOrder #aspectFilter is a list of dicts - for item in aspectFilter: - aspectFilter_elem = etree.SubElement(root, "aspectFilter") - for key in item: - key_elem = etree.SubElement(aspectFilter_elem, key) - key_elem.text = item[key] + if aspectFilter: + for item in aspectFilter: + aspectFilter_elem = etree.SubElement(root, "aspectFilter") + for key in item: + key_elem = etree.SubElement(aspectFilter_elem, key) + key_elem.text = item[key] #domainFilter is a list of dicts - for item in domainFilter: - domainFilter_elem = etree.SubElement(root, "domainFilter") - for key in item: - key_elem = etree.SubElement(domainFilter_elem, key) - key_elem.text = item[key] + if domainFilter: + for item in domainFilter: + domainFilter_elem = etree.SubElement(root, "domainFilter") + for key in item: + key_elem = etree.SubElement(domainFilter_elem, key) + key_elem.text = item[key] #outputSelector is a list - for item in outputSelector: - outputSelector_elem = etree.SubElement(root, "outputSelector") - outputSelector_elem.text = item + if outputSelector: + for item in outputSelector: + outputSelector_elem = etree.SubElement(root, "outputSelector") + outputSelector_elem.text = item request = etree.tostring(root, pretty_print=True) - return get_response(findItemsAdvanced.__name__, request, encoding) - - -def findItemsByProduct( - keywords=None, productId=None, - affiliate=None, buyerPostalCode=None, - paginationInput=None, sortOrder=None, - itemFilter=None, outputSelector=None, - encoding="JSON"): + return get_response(findItemsAdvanced.__name__, request, encoding, + **headers ) + + +def findItemsByProduct( keywords=None, \ + productId=None, \ + affiliate=None, \ + buyerPostalCode=None, \ + paginationInput=None, \ + sortOrder=None, \ + itemFilter=None, \ + outputSelector=None, \ + encoding="JSON", + **headers ): root = etree.Element("findItemsByProduct", xmlns="http://www.ebay.com/marketplace/search/v1/services") @@ -253,11 +290,12 @@ def findItemsByProduct( key_elem.text = paginationInput[key] #itenFilter is a list of dicts - for item in itemFilter: - itemFilter_elem = etree.SubElement(root, "itemFilter") - for key in item: - key_elem = etree.SubElement(itemFilter_elem, key) - key_elem.text = item[key] + if itemFilter: + for item in itemFilter: + itemFilter_elem = etree.SubElement(root, "itemFilter") + for key in item: + key_elem = etree.SubElement(itemFilter_elem, key) + key_elem.text = item[key] #sortOrder if sortOrder: @@ -265,24 +303,30 @@ def findItemsByProduct( sortOrder_elem.text = sortOrder #outputSelector is a list - for item in outputSelector: - outputSelector_elem = etree.SubElement(root, "outputSelector") - outputSelector_elem.text = item + if outputSelector: + for item in outputSelector: + outputSelector_elem = etree.SubElement(root, "outputSelector") + outputSelector_elem.text = item request = etree.tostring(root, pretty_print=True) - return get_response(findItemsByProduct.__name__, request, encoding) - - -def findItemsIneBayStores( - keywords=None, - storeName=None, affiliate=None, - buyerPostalCode=None, paginationInput=None, - sortOrder=None, aspectFilter=None, - domainFilter=None, itemFilter=None, - outputSelector=None, - encoding="JSON"): + return get_response(findItemsByProduct.__name__, request, encoding, + **headers ) + + +def findItemsIneBayStores( keywords=None, \ + storeName=None, \ + affiliate=None, \ + buyerPostalCode=None, \ + paginationInput=None, \ + sortOrder=None, \ + aspectFilter=None, \ + domainFilter=None, \ + itemFilter=None, \ + outputSelector=None, \ + encoding="JSON", + **headers ): root = etree.Element("findItemsIneBayStores", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + xmlns="http://www.ebay.com/marketplace/search/v1/services") if keywords: keywords_elem = etree.SubElement(root, "keywords") @@ -311,11 +355,12 @@ def findItemsIneBayStores( key_elem.text = paginationInput[key] #itenFilter is a list of dicts - for item in itemFilter: - itemFilter_elem = etree.SubElement(root, "itemFilter") - for key in item: - key_elem = etree.SubElement(itemFilter_elem, key) - key_elem.text = item[key] + if itemFilter: + for item in itemFilter: + itemFilter_elem = etree.SubElement(root, "itemFilter") + for key in item: + key_elem = etree.SubElement(itemFilter_elem, key) + key_elem.text = item[key] #sortOrder if sortOrder: @@ -323,31 +368,35 @@ def findItemsIneBayStores( sortOrder_elem.text = sortOrder #aspectFilter is a list of dicts - for item in aspectFilter: - aspectFilter_elem = etree.SubElement(root, "aspectFilter") - for key in item: - key_elem = etree.SubElement(aspectFilter_elem, key) - key_elem.text = item[key] + if aspectFilter: + for item in aspectFilter: + aspectFilter_elem = etree.SubElement(root, "aspectFilter") + for key in item: + key_elem = etree.SubElement(aspectFilter_elem, key) + key_elem.text = item[key] #domainFilter is a list of dicts - for item in domainFilter: - domainFilter_elem = etree.SubElement(root, "domainFilter") - for key in item: - key_elem = etree.SubElement(domainFilter_elem, key) - key_elem.text = item[key] + if domainFilter: + for item in domainFilter: + domainFilter_elem = etree.SubElement(root, "domainFilter") + for key in item: + key_elem = etree.SubElement(domainFilter_elem, key) + key_elem.text = item[key] #outputSelector is a list - for item in outputSelector: - outputSelector_elem = etree.SubElement(root, "outputSelector") - outputSelector_elem.text = item + if outputSelector: + for item in outputSelector: + outputSelector_elem = etree.SubElement(root, "outputSelector") + outputSelector_elem.text = item request = etree.tostring(root, pretty_print=True) - return get_response(findItemsIneBayStores.__name__, request, encoding) + return get_response(findItemsIneBayStores.__name__, request, encoding, + **headers ) def getHistograms(categoryId, encoding="JSON"): root = etree.Element("getHistograms", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + xmlns="http://www.ebay.com/marketplace/search/v1/services") categoryId_elem = etree.SubElement(root, "categoryId") categoryId_elem.text = categoryId @@ -362,15 +411,17 @@ def get_response(operation_name, data, encoding, **headers): app_name = config.get("keys", "app_name") endpoint = config.get("endpoints", "finding") - http_headers = { - "X-EBAY-SOA-OPERATION-NAME": operation_name, - "X-EBAY-SOA-SECURITY-APPNAME": app_name, - "X-EBAY-SOA-GLOBAL-ID": globalId, - "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} + http_headers = {"X-EBAY-SOA-OPERATION-NAME": operation_name, + "X-EBAY-SOA-SECURITY-APPNAME": app_name, + "X-EBAY-SOA-GLOBAL-ID" : globalId, + "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} http_headers.update(headers) - req = urllib2.Request(endpoint, data, http_headers) - res = urllib2.urlopen(req) + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) data = res.read() + # return data diff --git a/ebay/merchandising.py b/ebay/merchandising.py index 02da804..b0016c1 100644 --- a/ebay/merchandising.py +++ b/ebay/merchandising.py @@ -1,13 +1,16 @@ -import urllib2 +# import urllib2 + from lxml import etree -from utils import get_config_store +try: + from utils import get_config_store, urlopen, Request +except ImportError: + from .utils import get_config_store, urlopen, Request def getDeals(keywords, encoding="JSON"): #not documented in ebay docs. Need to raise a ticket - root = etree.Element("getDealsRequest", - xmlns="http://www.ebay.com/marketplace/services") + root = etree.Element("getDealsRequest", xmlns="http://www.ebay.com/marketplace/services") keywords_elem = etree.SubElement(root, "keywords") keywords_elem.text = keywords @@ -16,10 +19,8 @@ def getDeals(keywords, encoding="JSON"): return get_response(getDeals.__name__, request, encoding) -def getMostWatchedItems(affiliate=None, maxResults=None, - categoryId=None, encoding="JSON"): - root = etree.Element("getMostWatchedItemsRequest", - xmlns="http://www.ebay.com/marketplace/services") +def getMostWatchedItems(affiliate=None, maxResults=None,categoryId=None, encoding="JSON"): + root = etree.Element("getMostWatchedItemsRequest", xmlns="http://www.ebay.com/marketplace/services") #affiliate is dict if affiliate: @@ -36,17 +37,19 @@ def getMostWatchedItems(affiliate=None, maxResults=None, categoryId_elem = etree.SubElement(root, "categoryId") categoryId_elem.text = categoryId + request = etree.tostring(root, pretty_print=True) return get_response(getMostWatchedItems.__name__, request, encoding) #Takes categoryId or itemId -def getRelatedCategoryItems( - affiliate=None, maxResults=None, - categoryId=None, itemFilter=None, - itemId=None, encoding="JSON"): - root = etree.Element("getRelatedCategoryItemsRequest", - xmlns="http://www.ebay.com/marketplace/services") +def getRelatedCategoryItems(affiliate=None, \ + maxResults=None, \ + categoryId=None, \ + itemFilter=None, \ + itemId=None, \ + encoding="JSON"): + root = etree.Element("getRelatedCategoryItemsRequest", xmlns="http://www.ebay.com/marketplace/services") #affiliate is dict if affiliate: @@ -64,12 +67,12 @@ def getRelatedCategoryItems( categoryId_elem.text = categoryId #itemFilter is list of dicts - if itemFilter and len(itemFilter) > 0: + if itemFilter and len(itemFilter)>0: for item in itemFilter: itemFilter_elem = etree.SubElement(root, "itemFilter") for key in itemFilter.keys(): itemId_elem = etree.SubElement(itemFilter_elem, key) - itemId_elem.text = itemFilter[key] + itemId_elem.text = itemFilter[key] if itemId: itemId_elem = etree.SubElement(root, "itemId") @@ -79,15 +82,18 @@ def getRelatedCategoryItems( return get_response(getRelatedCategoryItems.__name__, request, encoding) -def getSimilarItems( - affiliate=None, maxResults=None, - categoryId=None, categoryIdExclude=None, - endTimeFrom=None, endTimeTo=None, - itemFilter=None, itemId=None, - listingType=None, maxPrice=None, - encoding="JSON"): - root = etree.Element("getSimilarItemsRequest", - xmlns="http://www.ebay.com/marketplace/services") +def getSimilarItems(affiliate=None, \ + maxResults=None, \ + categoryId=None, \ + categoryIdExclude=None, \ + endTimeFrom=None, \ + endTimeTo=None, \ + itemFilter=None, \ + itemId=None, \ + listingType=None, \ + maxPrice=None, \ + encoding="JSON"): + root = etree.Element("getSimilarItemsRequest", xmlns="http://www.ebay.com/marketplace/services") #affiliate is dict if affiliate: @@ -106,9 +112,10 @@ def getSimilarItems( categoryId_elem.text = categoryId #categoryIdExclude is list - for cat_id in categoryIdExclude: - categoryIdExclude_elem = etree.SubElement(root, "categoryIdExclude") - categoryIdExclude_elem.text = cat_id + if categoryIdExclude: + for cat_id in categoryIdExclude: + categoryIdExclude_elem = etree.SubElement(root, "categoryIdExclude") + categoryIdExclude_elem.text = cat_id if endTimeFrom and endTimeTo: endTimeFrom_elem = etree.SubElement(root, "endTimeFrom") @@ -117,12 +124,12 @@ def getSimilarItems( endTimeTo_elem = endTimeTo #itemFilter is list of dicts - if itemFilter and len(itemFilter) > 0: + if itemFilter and len(itemFilter)>0: for item in itemFilter: itemFilter_elem = etree.SubElement(root, "itemFilter") for key in itemFilter.keys(): itemId_elem = etree.SubElement(itemFilter_elem, key) - itemId_elem.text = itemFilter[key] + itemId_elem.text = itemFilter[key] if itemId: itemId_elem = etree.SubElement(root, "itemId") @@ -136,6 +143,7 @@ def getSimilarItems( maxPrice_elem = etree.SubElement(root, "maxPrice") maxPrice_elem.text = maxPrice + request = etree.tostring(root, pretty_print=True) return get_response(getSimilarItems.__name__, request, encoding) @@ -154,6 +162,7 @@ def getTopSellingProducts(affiliate=None, maxResults=None, encoding="JSON"): maxResults_elem = etree.SubElement(root, "maxResults") maxResults_elem.text = maxResults + request = etree.tostring(root, pretty_print=True) return get_response(getTopSellingProducts.__name__, request, encoding) @@ -163,14 +172,16 @@ def get_response(operation_name, data, encoding, **headers): app_name = config.get("keys", "app_name") endpoint = config.get("endpoints", "merchandising") - http_headers = { - "X-EBAY-SOA-OPERATION-NAME": operation_name, - "EBAY-SOA-CONSUMER-ID": app_name, - "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} + http_headers = {"X-EBAY-SOA-OPERATION-NAME": operation_name, + "EBAY-SOA-CONSUMER-ID": app_name, + "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} http_headers.update(headers) - req = urllib2.Request(endpoint, data, http_headers) - res = urllib2.urlopen(req) - return res.read() + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) + data = res.read() + return data diff --git a/ebay/platform_notifications.py b/ebay/platform_notifications.py index 7563adb..4fb4e85 100644 --- a/ebay/platform_notifications.py +++ b/ebay/platform_notifications.py @@ -1,10 +1,3 @@ -def SetNotificationPreferences(): - pass - - -def GetNotificationPreferences(): - pass - - -def GetNotificationsUsage(): - pass \ No newline at end of file +def SetNotificationPreferences(): pass +def GetNotificationPreferences(): pass +def GetNotificationsUsage(): pass \ No newline at end of file diff --git a/ebay/product.py b/ebay/product.py index 80f6088..1c3c537 100644 --- a/ebay/product.py +++ b/ebay/product.py @@ -1,22 +1,29 @@ -import urllib2 +# import urllib2 + from lxml import etree +from six import print_ as print3 -from utils import (get_config_store ) +try: + from utils import ( get_config_store, urlopen, Request, Specification, + CompatibilityPropertyFilter, Value, SortOrder ) +except ImportError: +def findCompatibilitiesBySpecification(specification, \ + categoryId, \ + compatibilityPropertyFilter=None, \ + dataSet=None, \ + datasetPropertyName=None, \ + exactMatch=None, \ + paginationInput=None, \ + sortOrder=None, \ + encoding="JSON"): -def findCompatibilitiesBySpecification( - specification, categoryId, - compatibilityPropertyFilter=None, dataSet=None, - datasetPropertyName=None, exactMatch=None, - paginationInput=None, sortOrder=None, - encoding="JSON"): - root = etree.Element("findCompatibilitiesBySpecificationRequest", - xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + root = etree.Element("findCompatibilitiesBySpecificationRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") #specification is an array of objects in Utils.py for spec in specification: specification_elem = etree.SubElement(root, "specification") - propertyName_elem = etree.SubElement(specification_elem, "propertyName") + propertyName_elem = etree.SubElement(specification_elem,"propertyName") propertyName_elem.text = spec.propertyName for v in spec.values: @@ -37,105 +44,118 @@ def findCompatibilitiesBySpecification( subValue_elem.text = v.url #compatibilityPropertyFilter is an array of objects in Utils.py - for cp_filter in compatibilityPropertyFilter: - compatibilityPropertyFilter_elem = etree.SubElement(root, "compatibilityPropertyFilter") - propertyName_elem = etree.SubElement(compatibilityPropertyFilter_elem, "propertyName") - propertyName_elem.text = cp_filter.propertyName + if compatibilityPropertyFilter: + for cp_filter in compatibilityPropertyFilter: + compatibilityPropertyFilter_elem = etree.SubElement(root, "compatibilityPropertyFilter") + propertyName_elem = etree.SubElement(compatibilityPropertyFilter_elem,"propertyName") + propertyName_elem.text = cp_filter.propertyName + + for v in cp_filter.values: + value_elem = etree.SubElement(compatibilityPropertyFilter_elem, "value") + if v.number: + number_elem = etree.SubElement(value_elem, "number") + subValue_elem = etree.SubElement(number_elem, "value") + subValue_elem.text = v.number + + if v.text: + text_elem = etree.SubElement(value_elem, "text") + subValue_elem = etree.SubElement(text_elem, "value") + subValue_elem.text = v.text + + if v.url: + url_elem = etree.SubElement(value_elem, "URL") + subValue_elem = etree.SubElement(url_elem, "value") + subValue_elem.text = v.url - for v in cp_filter.values: - value_elem = etree.SubElement(compatibilityPropertyFilter_elem, "value") - if v.number: - number_elem = etree.SubElement(value_elem, "number") - subValue_elem = etree.SubElement(number_elem, "value") - subValue_elem.text = v.number - - if v.text: - text_elem = etree.SubElement(value_elem, "text") - subValue_elem = etree.SubElement(text_elem, "value") - subValue_elem.text = v.text - - if v.url: - url_elem = etree.SubElement(value_elem, "URL") - subValue_elem = etree.SubElement(url_elem, "value") - subValue_elem.text = v.url categoryId_elem = etree.SubElement(root, "categoryId") categoryId_elem.text = categoryId #dataSet is a List - for ds in dataSet: - ds_elem = etree.SubElement(root, "dataSet") - ds_elem.text = ds + if dataSet: + for ds in dataSet: + ds_elem = etree.SubElement(root, "dataSet") + ds_elem.text = ds #datasetPropertyName is a List - for dpn in datasetPropertyName: - dpn_elem = etree.SubElement(root, "datasetPropertyName") - dpn_elem.text = dpn + if datasetPropertyName: + for dpn in datasetPropertyName: + dpn_elem = etree.SubElement(root, "datasetPropertyName") + dpn_elem.text = dpn if exactMatch: exactMatch_elem = etree.SubElement(root, "exactMatch") exactMatch_elem.text = exactMatch #paginationInput is Dict - for key in paginationInput: - key_elem = etree.SubElement(root, key) - key_elem.text = paginationInput[key] + if paginationInput: + for key in paginationInput.keys(): + key_elem = etree.SubElement(root, key) + key_elem.text = paginationInput[key] #Really weirdly written API by eBay, sortOrder is used two times, confusing naming - for so in sortOrder: - sortOrder_elem = etree.SubElement(root, "sortOrder") - sortPriority_elem = etree.SubElement(sortOrder_elem, "sortPriority") - sortPriority_elem.text = so.sortPriority - - subSortOrder_elem = etree.SubElement(sortOrder_elem, "sortOrder") - order_elem = etree.SubElement(subSortOrder_elem, "order") - order_elem.text = so.order - propertyName_elem = etree.SubElement(subSortOrder_elem, "propertyName") - propertyName_elem.text = so.propertyName - - request = etree.tostring(root, pretty_print=True) - print request + if sortOrder: + for so in sortOrder: + sortOrder_elem = etree.SubElement(root, "sortOrder") + sortPriority_elem = etree.SubElement(sortOrder_elem,"sortPriority") + sortPriority_elem.text = so.sortPriority + + subSortOrder_elem = etree.SubElement(sortOrder_elem, "sortOrder") + order_elem = etree.SubElement(subSortOrder_elem, "order") + order_elem.text = so.order + propertyName_elem = etree.SubElement(subSortOrder_elem, "propertyName") + propertyName_elem.text = so.propertyName + + + request=etree.tostring(root, pretty_print=True) + # print request + print3( request ) + return get_response(findCompatibilitiesBySpecification.__name__, request, encoding) -def getProductCompatibilities( - datasetPropertyName, productIdentifier, - applicationPropertyFilter=None, dataset=None, - disabledProductFilter=None, paginationInput=None, - sortOrder=None, encoding="JSON"): - root = etree.Element("findProductsByCompatibilityRequest", - xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") +def getProductCompatibilities(datasetPropertyName, \ + productIdentifier, \ + applicationPropertyFilter=None, \ + dataset=None, \ + disabledProductFilter=None, \ + paginationInput=None, \ + sortOrder=None, \ + encoding="JSON"): + root = etree.Element("findProductsByCompatibilityRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") #datasetPropertyName is a List - for dpn in datasetPropertyName: - dpn_elem = etree.SubElement(root, "datasetPropertyName") - dpn_elem.text = dpn + if datasetPropertyName: + for dpn in datasetPropertyName: + dpn_elem = etree.SubElement(root, "datasetPropertyName") + dpn_elem.text = dpn #compatibilityPropertyFilter is an object in Utils.py - #TODO: compatibilityPropertyFilter is MISSING ??? - for cp_filter in compatibilityPropertyFilter: - compatibilityPropertyFilter_elem = etree.SubElement(root, "compatibilityPropertyFilter") - propertyName_elem = etree.SubElement(compatibilityPropertyFilter_elem, "propertyName") - propertyName_elem.text = cp_filter.propertyName - - for v in cp_filter.values: - value_elem = etree.SubElement(compatibilityPropertyFilter_elem, "value") - if v.number: - number_elem = etree.SubElement(value_elem, "number") - number_elem.text = v.number - - if v.text: - text_elem = etree.SubElement(value_elem, "text") - text_elem.text = v.text - - if v.url: - url_elem = etree.SubElement(value_elem, "URL") - url_elem.text = v.url + if compatibilityPropertyFilter: + for cp_filter in compatibilityPropertyFilter: + compatibilityPropertyFilter_elem = etree.SubElement(root, "compatibilityPropertyFilter") + propertyName_elem = etree.SubElement(compatibilityPropertyFilter_elem,"propertyName") + propertyName_elem.text = cp_filter.propertyName + + for v in cp_filter.values: + value_elem = etree.SubElement(compatibilityPropertyFilter_elem, "value") + if v.number: + number_elem = etree.SubElement(value_elem, "number") + number_elem.text = v.number + + if v.text: + text_elem = etree.SubElement(value_elem, "text") + text_elem.text = v.text + + if v.url: + url_elem = etree.SubElement(value_elem, "URL") + url_elem.text = v.url #dataSet is a List - for ds in dataSet: - ds_elem = etree.SubElement(root, "dataSet") - ds_elem.text = ds + if dataSet: + for ds in dataSet: + ds_elem = etree.SubElement(root, "dataSet") + ds_elem.text = ds #disabledProductFilter is dict if disabledProductFilter: @@ -145,9 +165,10 @@ def getProductCompatibilities( key_elem.text = disabledProductFilter[key] #paginationInput is Dict - for key in paginationInput: - key_elem = etree.SubElement(root, key) - key_elem.text = paginationInput[key] + if paginationInput: + for key in paginationInput.keys(): + key_elem = etree.SubElement(root, key) + key_elem.text = paginationInput[key] #productIdentifier is dict productIdentifier_elem = etree.SubElement(root, "productIdentifier") @@ -156,55 +177,52 @@ def getProductCompatibilities( key_elem.text = productIdentifier[key] #Really weirdly written API by eBay, sortOrder is used two times, confusing naming - for so in sortOrder: - sortOrder_elem = etree.SubElement(root, "sortOrder") - sortPriority_elem = etree.SubElement(sortOrder_elem, "sortPriority") - sortPriority_elem.text = so.sortPriority - - subSortOrder_elem = etree.SubElement(sortOrder_elem, "sortOrder") - order_elem = etree.SubElement(subSortOrder_elem, "order") - order_elem.text = so.order - propertyName_elem = etree.SubElement(subSortOrder_elem, "propertyName") - propertyName_elem.text = so.propertyName - - request = etree.tostring(root, pretty_print=True) + if sortOrder: + for so in sortOrder: + sortOrder_elem = etree.SubElement(root, "sortOrder") + sortPriority_elem = etree.SubElement(sortOrder_elem,"sortPriority") + sortPriority_elem.text = so.sortPriority + + subSortOrder_elem = etree.SubElement(sortOrder_elem, "sortOrder") + order_elem = etree.SubElement(subSortOrder_elem, "order") + order_elem.text = so.order + propertyName_elem = etree.SubElement(subSortOrder_elem, "propertyName") + propertyName_elem.text = so.propertyName + + request=etree.tostring(root, pretty_print=True) return get_response(getProductCompatibilities.__name__, request, encoding) -def findProducts( - invocationId, dataset=None, - datasetPropertyName=None, keywords=None, - paginationInput=None, productStatusFilter=None, - propertyFilter=None, sortOrder=None, - encoding="JSON"): - root = etree.Element("findProductsRequest", - xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") +def findProducts(invocationId, \ + dataset=None, \ + datasetPropertyName=None, \ + keywords=None, \ + paginationInput=None, \ + productStatusFilter=None, \ + propertyFilter=None, \ + sortOrder=None, \ + encoding="JSON"): + root = etree.Element("findProductsRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") #Really messed up! : http://developer.ebay.com/DevZone/product/CallRef/findProducts.html#Samples - request = etree.tostring(root, pretty_print=True) + request=etree.tostring(root, pretty_print=True) return get_response(findProducts.__name__, request, encoding) - def findProductsByCompatibility(encoding="JSON"): - root = etree.Element("findProductsByCompatibilityRequest", - xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + root = etree.Element("findProductsByCompatibilityRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") - #Problem with getProductDetails, findProductsByCompatibility and findProducts - # method: http://developer.ebay.com/DevZone/product/CallRef/index.html + #Problem with getProductDetails, findProductsByCompatibility and findProducts method: http://developer.ebay.com/DevZone/product/CallRef/index.html - request = etree.tostring(root, pretty_print=True) + request=etree.tostring(root, pretty_print=True) return get_response(findProductsByCompatibility.__name__, request, encoding) - def getProductDetails(encoding="JSON"): - root = etree.Element("getProductDetailsRequest", - xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + root = etree.Element("getProductDetailsRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") - #Problem with getProductDetails, findProductsByCompatibility and findProducts - # method: http://developer.ebay.com/DevZone/product/CallRef/index.html + #Problem with getProductDetails, findProductsByCompatibility and findProducts method: http://developer.ebay.com/DevZone/product/CallRef/index.html - request = etree.tostring(root, pretty_print=True) + request=etree.tostring(root, pretty_print=True) return get_response(getProductDetails.__name__, request, encoding) @@ -213,13 +231,15 @@ def get_response(operation_name, data, encoding, **headers): app_name = config.get("keys", "app_name") endpoint = config.get("endpoints", "product") - http_headers = { - "X-EBAY-SOA-OPERATION-NAME": operation_name, - "X-EBAY-SOA-SECURITY-APPNAME": app_name, - "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} + http_headers = {"X-EBAY-SOA-OPERATION-NAME": operation_name, + "X-EBAY-SOA-SECURITY-APPNAME": app_name, + "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} http_headers.update(headers) - req = urllib2.Request(endpoint, data, http_headers) - res = urllib2.urlopen(req) - return res.read() + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) + data = res.read() + return data diff --git a/ebay/requirements.txt b/ebay/requirements.txt new file mode 100644 index 0000000..296abe3 --- /dev/null +++ b/ebay/requirements.txt @@ -0,0 +1,6 @@ + +# virtualenv and virtualenvwrapper are highly recommended! + +lxml==4.1.1 +six==1.11.0 +requests==2.18.4 \ No newline at end of file diff --git a/ebay/research.py b/ebay/research.py index 5c2db03..d7e0cd6 100644 --- a/ebay/research.py +++ b/ebay/research.py @@ -1,4 +1,3 @@ #This sucks: http://developer.researchadvanced.com/contact.php -def GetPriceResearch(): - pass \ No newline at end of file +def GetPriceResearch(): pass \ No newline at end of file diff --git a/ebay/resolution_case_management.py b/ebay/resolution_case_management.py index 7946a36..aa70ede 100644 --- a/ebay/resolution_case_management.py +++ b/ebay/resolution_case_management.py @@ -1,19 +1,22 @@ -import urllib2 +# import urllib2 + from lxml import etree -from utils import get_config_store +try: + from utils import get_config_store, urlopen, Request +except ImportError: + from .utils import get_config_store, urlopen, Request # case retrieval calls -def getUserCases(caseStatusFilter=None, - caseTypeFilter=None, - creationDateRangeFilterFrom=None, - creationDateRangeFilterTo=None, - itemFilter=None, - paginationInput=None, - sortOrder=None, - encoding="JSON"): - root = etree.Element("getUserCasesRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") +def getUserCases(caseStatusFilter = None, + caseTypeFilter = None, + creationDateRangeFilterFrom = None, + creationDateRangeFilterTo = None, + itemFilter = None, + paginationInput = None, + sortOrder = None, + encoding = "JSON"): + root = etree.Element("getUserCasesRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") #caseStatusFilter is a List if caseStatusFilter: @@ -39,15 +42,15 @@ def getUserCases(caseStatusFilter=None, #itemFilter is a dict: {itemId:123, transactionId:72} - if itemFilter and len(itemFilter) > 0: + if itemFilter and len(itemFilter)>0: itemFilter_elem = etree.SubElement(root, "itemFilter") for key in itemFilter.keys(): itemId_elem = etree.SubElement(itemFilter_elem, key) - itemId_elem.text = itemFilter[key] + itemId_elem.text = itemFilter[key] # paginationInput is a dict: {entriesPerPage:5, pageNumber:10} - if paginationInput and len(paginationInput) > 0: + if paginationInput and len(paginationInput)>0: paginationInput_elem = etree.SubElement(root, "paginationInput") for key in paginationInput.keys(): input_values_elem = etree.SubElement(paginationInput_elem, key) @@ -57,13 +60,12 @@ def getUserCases(caseStatusFilter=None, sortOrder_elem = etree.SubElement(root, "sortOrder") sortOrder_elem.text = sortOrder + request = etree.tostring(root, pretty_print=True) return get_response(getUserCases.__name__, request, encoding) - def getEBPCaseDetail(caseId, caseType, encoding="JSON"): - root = etree.Element("getEBPCaseDetailRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = etree.Element("getEBPCaseDetailRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") caseId_elem = etree.SubElement(root, "caseId") id_elem = etree.SubElement(caseId_elem, "id") @@ -77,8 +79,7 @@ def getEBPCaseDetail(caseId, caseType, encoding="JSON"): # Seller Option Calls def provideTrackingInfo(caseId, caseType, carrierUsed, trackingNumber, comments=None, encoding="JSON"): - root = etree.Element("provideTrackingInfoRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = etree.Element("provideTrackingInfoRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") caseId_elem = etree.SubElement(root, "caseId") id_elem = etree.SubElement(caseId_elem, "id") @@ -96,13 +97,12 @@ def provideTrackingInfo(caseId, caseType, carrierUsed, trackingNumber, comments= comments_elem = etree.SubElement(root, "comments") comments_elem.text = comments + request = etree.tostring(root, pretty_print=True) return get_response(provideTrackingInfo.__name__, request, encoding) - def issueFullRefund(caseId, caseType, comments=None, encoding="JSON"): - root = etree.Element("issueFullRefundRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = etree.Element("issueFullRefundRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") caseId_elem = etree.SubElement(root, "caseId") id_elem = etree.SubElement(caseId_elem, "id") @@ -117,10 +117,8 @@ def issueFullRefund(caseId, caseType, comments=None, encoding="JSON"): request = etree.tostring(root, pretty_print=True) return get_response(issueFullRefund.__name__, request, encoding) - def offerOtherSolution(caseId, caseType, messageToBuyer, encoding="JSON"): - root = etree.Element("offerOtherSolutionRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = etree.Element("offerOtherSolutionRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") caseId_elem = etree.SubElement(root, "caseId") id_elem = etree.SubElement(caseId_elem, "id") @@ -135,10 +133,8 @@ def offerOtherSolution(caseId, caseType, messageToBuyer, encoding="JSON"): return get_response(offerOtherSolution.__name__, request, encoding) #NOT WORKING on SANDBOX, need to investigate -def escalateToCustomerSuppport(caseId, caseType, escalationReason, - comments=None, encoding="JSON"): - root = etree.Element("escalateToCustomerSuppportRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") +def escalateToCustomerSuppport(caseId, caseType, escalationReason, comments=None, encoding="JSON"): + root = etree.Element("escalateToCustomerSuppportRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") caseId_elem = etree.SubElement(root, "caseId") id_elem = etree.SubElement(caseId_elem, "id") @@ -159,11 +155,8 @@ def escalateToCustomerSuppport(caseId, caseType, escalationReason, request = etree.tostring(root, pretty_print=True) return get_response(escalateToCustomerSuppport.__name__, request, encoding) - -def appealToCustomerSupport(caseId, caseType, appealReason, - comments=None, encoding="JSON"): - root = etree.Element("appealToCustomerSupportRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") +def appealToCustomerSupport(caseId, caseType, appealReason, comments=None, encoding="JSON"): + root = etree.Element("appealToCustomerSupportRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") caseId_elem = etree.SubElement(root, "caseId") id_elem = etree.SubElement(caseId_elem, "id") @@ -184,8 +177,7 @@ def appealToCustomerSupport(caseId, caseType, appealReason, # Metadata calls def getActivityOptions(caseId, caseType, encoding="JSON"): - root = etree.Element("getActivityOptionsRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = etree.Element("getActivityOptionsRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") caseId_elem = etree.SubElement(root, "caseId") id_elem = etree.SubElement(caseId_elem, "id") @@ -196,10 +188,8 @@ def getActivityOptions(caseId, caseType, encoding="JSON"): request = etree.tostring(root, pretty_print=True) return get_response(getActivityOptions.__name__, request, encoding) - def getVersion(encoding="JSON"): - root = etree.Element("getVersionRequest", - xmlns="http://www.ebay.com/marketplace/search/v1/services") + root = etree.Element("getVersionRequest", xmlns="http://www.ebay.com/marketplace/search/v1/services") request = etree.tostring(root, pretty_print=True) return get_response(getVersion.__name__, request, encoding) @@ -210,14 +200,15 @@ def get_response(operation_name, data, encoding, **headers): access_token = config.get("auth", "token") endpoint = config.get("endpoints", "resolution_case_management") - http_headers = { - "X-EBAY-SOA-OPERATION-NAME": operation_name, - "X-EBAY-SOA-SECURITY-TOKEN": access_token, - "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} + http_headers = {"X-EBAY-SOA-OPERATION-NAME": operation_name, + "X-EBAY-SOA-SECURITY-TOKEN": access_token, + "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} http_headers.update(headers) - req = urllib2.Request(endpoint, data, http_headers) - res = urllib2.urlopen(req) + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) data = res.read() return data diff --git a/ebay/shopping.py b/ebay/shopping.py index aa9ed18..8787c88 100644 --- a/ebay/shopping.py +++ b/ebay/shopping.py @@ -1,149 +1,133 @@ import requests -from utils import get_config_store + +try: + from utils import get_config_store, urlopen, Request +except ImportError: + from .utils import get_config_store, urlopen, Request # Item Search def FindProducts(query, available_items, max_entries, encoding="JSON"): - user_param = { - 'callname': FindProducts.__name__, - 'responseencoding': encoding, - 'QueryKeywords': query, - 'AvailableItemsOnly': available_items, - 'MaxEntries': max_entries} - + + user_param={'callname' : FindProducts.__name__, + 'responseencoding' : encoding, + 'QueryKeywords' : query, + 'AvailableItemsOnly' : available_items, + 'MaxEntries' : max_entries} + response = get_response(user_param) return response.content - - -def FindHalfProducts(query=None, max_entries=None, - product_type=None, product_value=None, - include_selector=None, - encoding="JSON"): + +def FindHalfProducts(query=None, max_entries=None, product_type=None, product_value=None, include_selector=None, encoding="JSON"): if product_type and product_value and include_selector: - user_param = { - 'callname': FindHalfProducts.__name__, - 'responseencoding': encoding, - 'ProductId.type': product_type, - 'ProductId.Value': product_value, - 'IncludeSelector': include_selector} - + user_param = {'callname' : FindHalfProducts.__name__, + 'responseencoding' : encoding, + 'ProductId.type' : product_type, + 'ProductId.Value' : product_value, + 'IncludeSelector' : include_selector} + if query and max_entries: - user_param = { - 'callname': FindHalfProducts.__name__, - 'responseencoding': encoding, - 'QueryKeywords': query, - 'MaxEntries': max_entries} + user_param = {'callname' : FindHalfProducts.__name__, + 'responseencoding' : encoding, + 'QueryKeywords' : query, + 'MaxEntries' : max_entries} response = get_response(user_param) return response.content # Item Data def GetSingleItem(item_id, include_selector=None, encoding="JSON"): - user_param = { - 'callname': GetSingleItem.__name__, - 'responseencoding': encoding, - 'ItemId': item_id} + user_param={'callname' : GetSingleItem.__name__, + 'responseencoding' : encoding, + 'ItemId' : item_id} if include_selector: user_param['IncludeSelector'] = include_selector - + response = get_response(user_param) return response.content - - + def GetItemStatus(item_id, encoding="JSON"): - user_param = { - 'callname': GetItemStatus.__name__, - 'responseencoding': encoding, - 'ItemId': item_id} + user_param={'callname' : GetItemStatus.__name__, + 'responseencoding' : encoding, + 'ItemId' : item_id} response = get_response(user_param) return response.content - - -def GetShippingCosts(item_id, destination_country_code, destination_postal_code, details, quantity_sold, - encoding="JSON"): - user_param = { - 'callname': GetShippingCosts.__name__, - 'responseencoding': encoding, - 'ItemId': item_id, - 'DestinationCountryCode': destination_country_code, - 'DestinationPostalCode': destination_postal_code, - 'IncludeDetails': details, - 'QuantitySold': quantity_sold} - + +def GetShippingCosts(item_id, destination_country_code, destination_postal_code, details, quantity_sold, encoding="JSON"): + user_param={'callname' : GetShippingCosts.__name__, + 'responseencoding' : encoding, + 'ItemId' : item_id, + 'DestinationCountryCode' : destination_country_code, + 'DestinationPostalCode' : destination_postal_code, + 'IncludeDetails' : details, + 'QuantitySold' : quantity_sold} + response = get_response(user_param) - return response.content - - + return response.content + def GetMultipleItems(item_id, include_selector=None, encoding="JSON"): - user_param = { - 'callname': GetMultipleItems.__name__, - 'responseencoding': encoding, - 'ItemId': item_id} - + user_param={'callname' : GetMultipleItems.__name__, + 'responseencoding' : encoding, + 'ItemId' : item_id} + if include_selector: user_param['IncludeSelector'] = include_selector - + response = get_response(user_param) return response.content # User Reputation def GetUserProfile(user_id, include_selector=None, encoding="JSON"): - user_param = { - 'callname': GetUserProfile.__name__, - 'responseencoding': encoding, - 'UserID': user_id} - + user_param={'callname' : GetUserProfile.__name__, + 'responseencoding' : encoding, + 'UserID' : user_id} + if include_selector: - user_param['IncludeSelector'] = include_selector - + user_param['IncludeSelector'] = include_selector + response = get_response(user_param) return response.content - + # eBay pop! def FindPopularSearches(query, category_id=None, encoding="JSON"): - user_param = { - 'callname': FindPopularSearches.__name__, - 'responseencoding': encoding, - 'QueryKeywords': query} - + user_param={'callname' : FindPopularSearches.__name__, + 'responseencoding' : encoding, + 'QueryKeywords' : query} + if category_id: - user_param['CategoryID'] = category_id - + user_param['CategoryID'] = category_id + response = get_response(user_param) return response.content - + def FindPopularItems(query, category_id_exclude=None, encoding="JSON"): - user_param = { - 'callname': FindPopularItems.__name__, - 'responseencoding': encoding, - 'QueryKeywords': query} - + user_param={'callname' : FindPopularItems.__name__, + 'responseencoding' : encoding, + 'QueryKeywords' : query} + if category_id_exclude: - user_param['CategoryIDExclude'] = category_id_exclude - + user_param['CategoryIDExclude'] = category_id_exclude + response = get_response(user_param) return response.content - -# Search: Bug in eBay documentation of Product Id: -# http://developer.ebay.com/devzone/shopping/docs/callref/FindReviewsAndGuides.html#Samples + +# Search: Bug in eBay documentation of Product Id: http://developer.ebay.com/devzone/shopping/docs/callref/FindReviewsAndGuides.html#Samples def FindReviewsandGuides(category_id=None, product_id=None, encoding="JSON"): if category_id: - user_param = { - 'callname': FindReviewsandGuides.__name__, - 'responseencoding': encoding, - 'CategoryID': category_id} - + user_param={'callname' : FindReviewsandGuides.__name__, + 'responseencoding' : encoding, + 'CategoryID' : category_id} + if product_id: - user_param = { - 'callname': FindReviewsandGuides.__name__, - 'responseencoding': encoding, - 'ProductID': product_id} - + user_param={'callname' : FindReviewsandGuides.__name__, + 'responseencoding' : encoding, + 'ProductID' : product_id} + response = get_response(user_param) return response.content @@ -151,26 +135,23 @@ def FindReviewsandGuides(category_id=None, product_id=None, encoding="JSON"): # Utilities def GetCategoryInfo(category_id, include_selector=None, encoding="JSON"): if category_id: - user_param = { - 'callname': GetCategoryInfo.__name__, - 'responseencoding': encoding, - 'CategoryID': category_id} - + user_param={'callname' : GetCategoryInfo.__name__, + 'responseencoding' : encoding, + 'CategoryID' : category_id} + if include_selector: - user_param['IncludeSelector'] = include_selector - + user_param['IncludeSelector'] = include_selector + response = get_response(user_param) return response.content - - + def GeteBayTime(encoding="JSON"): - user_param = { - 'callname': GeteBayTime.__name__, - 'responseencoding': encoding} - + user_param={'callname' : GeteBayTime.__name__, + 'responseencoding' : encoding} + response = get_response(user_param) - return response.content - + return response.content + #requests method def get_response(user_params): @@ -180,8 +161,8 @@ def get_response(user_params): version = config.get("call", "compatibility_level") endpoint = config.get("endpoints", "shopping") - d = dict(appid=app_id, siteid=site_id, version=version) - + d=dict(appid = app_id, siteid = site_id, version = version) + d.update(user_params) - + return requests.get(endpoint, params=d) diff --git a/ebay/trading.py b/ebay/trading.py index ba45ed1..f40ed68 100644 --- a/ebay/trading.py +++ b/ebay/trading.py @@ -1,33 +1,34 @@ #!/usr/bin/env python #-*- coding: utf-8 -*- import sys -from xml.dom.minidom import parseString - -from utils import (get_endpoint_response, get_config_store, - get_endpoint_response_with_file, add_e, imgur_post) from lxml import etree, objectify +from xml.dom.minidom import parseString +try: + from utils import ( get_endpoint_response, get_config_store, + get_endpoint_response_with_file, add_e, imgur_post ) +except ImportError: + from .utils import ( get_endpoint_response, get_config_store, + get_endpoint_response_with_file, add_e, imgur_post ) CID = { 'new': '1000', 'used': '3000', } - def addItemWithPic(image, **kwargs): url = uploadSiteHostedPicture(image) kwargs['pictureDetails'] = [url] return addItem(**kwargs) +def addItem(title, description, primaryCategoryId, + startPrice='0.99', buyItNowPrice=None, country='US', + currency='USD', dispatchTimeMax='3', listingDuration='Days_7', + listingType='Chinese', paymentMethods=['PayPal'], + payPalEmailAddress='', pictureDetails=[], postalCode='', + photoDisplay='PicturePack', condition='new', + quantity=1, freeShipping=True, site='US', test=False): -def addItem( - title, description, primaryCategoryId, - startPrice='0.99', buyItNowPrice=None, country='US', - currency='USD', dispatchTimeMax='3', listingDuration='Days_7', - listingType='Chinese', paymentMethods=['PayPal'], - payPalEmailAddress='', pictureDetails=[], postalCode='', - photoDisplay='PicturePack', condition='new', - quantity=1, freeShipping=True, site='US', test=False): #get the user auth token token = get_config_store().get("auth", "token") oname = "AddItem" if not test else 'VerifyAddItem' @@ -39,6 +40,7 @@ def addItem( token_elem = etree.SubElement(credentials_elem, "eBayAuthToken") token_elem.text = token + item_e = etree.SubElement(root, "Item") t_e = add_e(item_e, "Title", str(title)) d_e = add_e(item_e, "Description", str(description)) @@ -71,7 +73,7 @@ def addItem( add_e(returnPol_e, "Description", "If you are not satisfied, ship the item back for a full refund.") add_e(returnPol_e, "ShippingCostPaidByOption", "Buyer") # end default ret pol - + shipde_e = add_e(item_e, "ShippingDetails", None) if freeShipping: sst = add_e(shipde_e, "ShippingType", "Flat") @@ -85,24 +87,24 @@ def addItem( #need to specify xml declaration and encoding or else will get error request = etree.tostring(root, pretty_print=True, - xml_declaration=True, encoding="utf-8") + xml_declaration=True, encoding="utf-8") response = get_response(oname, request, "utf-8") return response -def getCategories( - parentId=None, - detailLevel='ReturnAll', - errorLanguage=None, - messageId=None, - outputSelector=None, - version=None, - warningLevel="High", - levelLimit=1, - viewAllNodes=True, - categorySiteId=0, - encoding="JSON"): +def getCategories( parentId=None, \ + detailLevel='ReturnAll', \ + errorLanguage=None, \ + messageId=None, \ + outputSelector=None, \ + version=None, \ + warningLevel="High", \ + levelLimit=1, \ + viewAllNodes=True, \ + categorySiteId=0, \ + encoding="JSON", + **headers ): """ Using a query string and parentId this function returns all the categories containing that string within the category name, @@ -161,8 +163,8 @@ def getCategories( #need to specify xml declaration and encoding or else will get error request = etree.tostring(root, pretty_print=False, - xml_declaration=True, encoding="utf-8") - response = get_response("GetCategories", request, encoding) + xml_declaration=True, encoding="utf-8") + response = get_response("GetCategories", request, encoding, **headers ) return response @@ -220,7 +222,7 @@ def uploadSiteHostedPicture(filepath): epu = add_e(root, "ExternalPictureURL", urlpath) request = etree.tostring(root, pretty_print=True, - xml_declaration=True, encoding="UTF-8") + xml_declaration=True, encoding="UTF-8") response = get_response(oname, request, "UTF-8") @@ -231,15 +233,12 @@ def url_result(result): root = objectify.fromstring(result) url = root.FullURL.text return url - + def get_response(operation_name, data, encoding, **headers): - return get_endpoint_response( - "trading", operation_name, - data, encoding, **headers) - + return get_endpoint_response("trading", operation_name, + data, encoding, **headers) def get_response_with_file(operation_name, fobj, data, encoding, **headers): - return get_endpoint_response_with_file( - "trading", operation_name, - fobj, data, encoding, **headers) + return get_endpoint_response_with_file("trading", operation_name, + fobj, data, encoding, **headers) diff --git a/ebay/utils.py b/ebay/utils.py index 73c4d82..f9adfe4 100644 --- a/ebay/utils.py +++ b/ebay/utils.py @@ -1,25 +1,33 @@ -#!/usr/bin/env pythin +#!/usr/bin/env python #-*- coding: utf-8 -*- import sys +from os.path import join, dirname, abspath +# import urllib2 +from six import PY3 as PYTHON3 +# from ConfigParser import ConfigParser +from six.moves.configparser import ConfigParser +import requests +from lxml import etree import base64 +#import codecs import json import shutil import os -import urllib2 -from ConfigParser import ConfigParser -from os.path import join, dirname, abspath -import requests -from lxml import etree +# http://python-future.org/compatible_idioms.html +# urllib module +# urllib is the hardest module to use from Python 2/3 compatible code. -CONFIG_STORE = None +# Python 2 and 3: alternative 4 (modified) +if PYTHON3: + from urllib.request import urlopen, Request +else: + from urllib2 import urlopen, Request -def get_endpoint_response( - endpoint_name, operation_name, - data, encoding, - **headers): +def get_endpoint_response(endpoint_name, operation_name, data, encoding, + **headers): config = get_config_store() endpoint = config.get("endpoints", endpoint_name) app_name = config.get("keys", "app_name") @@ -28,26 +36,25 @@ def get_endpoint_response( compatibility_level = config.get("call", "compatibility_level") siteId = config.get("call", "siteid") - http_headers = { - "X-EBAY-API-COMPATIBILITY-LEVEL": compatibility_level, - "X-EBAY-API-DEV-NAME": dev_name, - "X-EBAY-API-APP-NAME": app_name, - "X-EBAY-API-CERT-NAME": cert_name, - "X-EBAY-API-CALL-NAME": operation_name, - "X-EBAY-API-SITEID": siteId, - "Content-Type": "text/xml"} + http_headers = { "X-EBAY-API-COMPATIBILITY-LEVEL" : compatibility_level, + "X-EBAY-API-DEV-NAME" : dev_name, + "X-EBAY-API-APP-NAME" : app_name, + "X-EBAY-API-CERT-NAME": cert_name, + "X-EBAY-API-CALL-NAME": operation_name, + "X-EBAY-API-SITEID" : siteId, + "Content-Type" : "text/xml" } http_headers.update(headers) - req = urllib2.Request(endpoint, data, http_headers) - res = urllib2.urlopen(req) - return res.read() + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) + data = res.read() + return data - -def get_endpoint_response_with_file( - endpoint_name, operation_name, - fobj, data, - encoding, **headers): +def get_endpoint_response_with_file(endpoint_name, operation_name, fobj, data, + encoding, **headers): config = get_config_store() endpoint = config.get("endpoints", endpoint_name) app_name = config.get("keys", "app_name") @@ -56,28 +63,27 @@ def get_endpoint_response_with_file( compatibility_level = config.get("call", "compatibility_level") siteId = config.get("call", "siteid") - http_headers = { - "X-EBAY-API-COMPATIBILITY-LEVEL": compatibility_level, - "X-EBAY-API-DEV-NAME": dev_name, - "X-EBAY-API-APP-NAME": app_name, - "X-EBAY-API-CERT-NAME": cert_name, - "X-EBAY-API-CALL-NAME": operation_name, - "X-EBAY-API-SITEID": siteId, - "X-EBAY-API-DETAIL-LEVEL": "0", - "Content-Type": "multipart/form-data"} + http_headers = { "X-EBAY-API-COMPATIBILITY-LEVEL" : compatibility_level, + "X-EBAY-API-DEV-NAME" : dev_name, + "X-EBAY-API-APP-NAME" : app_name, + "X-EBAY-API-CERT-NAME": cert_name, + "X-EBAY-API-CALL-NAME": operation_name, + "X-EBAY-API-SITEID" : siteId, + "X-EBAY-API-DETAIL-LEVEL": "0", + "Content-Type" : "multipart/form-data" } http_headers.update(headers) files = {'file': ('image', fobj)} - dataload = {'body': data} + dataload = { 'body': data } res = requests.post(endpoint, files=files, data=dataload, headers=http_headers) return res.text - def relative(*paths): return join(dirname(abspath(__file__)), *paths) +CONFIG_STORE = None def set_config_file(filename): """ @@ -88,7 +94,6 @@ def set_config_file(filename): CONFIG_STORE = ConfigParser() CONFIG_STORE.read(filename) - def get_config_store(): """ Return storage object with configuration values. @@ -100,10 +105,9 @@ def get_config_store(): if CONFIG_STORE is None: CONFIG_STORE = ConfigParser() CONFIG_STORE.read(relative("config.ini")) - + return CONFIG_STORE - def write_config_example(dst=None): """ Write an example configuration file for python-ebay. @@ -155,7 +159,6 @@ def __init__(self, sortPriority, order, propertyName): self.order = order self.propertyName = propertyName - def add_e(parent, key, val=None): child = etree.SubElement(parent, key) if val: diff --git a/product.py b/product.py new file mode 100644 index 0000000..cbd48ef --- /dev/null +++ b/product.py @@ -0,0 +1,247 @@ +# import urllib2 + +from lxml import etree +from six import print_ as print3 + +try: + from utils import ( get_config_store, urlopen, Request, Specification, + CompatibilityPropertyFilter, Value, SortOrder ) +except ImportError: + from .utils import ( get_config_store, urlopen, Request, Specification, + CompatibilityPropertyFilter, Value, SortOrder ) + +def findCompatibilitiesBySpecification(specification, \ + categoryId, \ + compatibilityPropertyFilter=None, \ + dataSet=None, \ + datasetPropertyName=None, \ + exactMatch=None, \ + paginationInput=None, \ + sortOrder=None, \ + encoding="JSON"): + + root = etree.Element("findCompatibilitiesBySpecificationRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + + #specification is an array of objects in Utils.py + for spec in specification: + specification_elem = etree.SubElement(root, "specification") + propertyName_elem = etree.SubElement(specification_elem,"propertyName") + propertyName_elem.text = spec.propertyName + + for v in spec.values: + value_elem = etree.SubElement(specification_elem, "value") + if v.number: + number_elem = etree.SubElement(value_elem, "number") + subValue_elem = etree.SubElement(number_elem, "value") + subValue_elem.text = v.number + + if v.text: + text_elem = etree.SubElement(value_elem, "text") + subValue_elem = etree.SubElement(text_elem, "value") + subValue_elem.text = v.text + + if v.url: + url_elem = etree.SubElement(value_elem, "URL") + subValue_elem = etree.SubElement(url_elem, "value") + subValue_elem.text = v.url + + #compatibilityPropertyFilter is an array of objects in Utils.py + if compatibilityPropertyFilter: + for cp_filter in compatibilityPropertyFilter: + compatibilityPropertyFilter_elem = etree.SubElement(root, "compatibilityPropertyFilter") + propertyName_elem = etree.SubElement(compatibilityPropertyFilter_elem,"propertyName") + propertyName_elem.text = cp_filter.propertyName + + for v in cp_filter.values: + value_elem = etree.SubElement(compatibilityPropertyFilter_elem, "value") + if v.number: + number_elem = etree.SubElement(value_elem, "number") + subValue_elem = etree.SubElement(number_elem, "value") + subValue_elem.text = v.number + + if v.text: + text_elem = etree.SubElement(value_elem, "text") + subValue_elem = etree.SubElement(text_elem, "value") + subValue_elem.text = v.text + + if v.url: + url_elem = etree.SubElement(value_elem, "URL") + subValue_elem = etree.SubElement(url_elem, "value") + subValue_elem.text = v.url + + + categoryId_elem = etree.SubElement(root, "categoryId") + categoryId_elem.text = categoryId + + #dataSet is a List + if dataSet: + for ds in dataSet: + ds_elem = etree.SubElement(root, "dataSet") + ds_elem.text = ds + + #datasetPropertyName is a List + if datasetPropertyName: + for dpn in datasetPropertyName: + dpn_elem = etree.SubElement(root, "datasetPropertyName") + dpn_elem.text = dpn + + if exactMatch: + exactMatch_elem = etree.SubElement(root, "exactMatch") + exactMatch_elem.text = exactMatch + + #paginationInput is Dict + if paginationInput: + for key in paginationInput.keys(): + key_elem = etree.SubElement(root, key) + key_elem.text = paginationInput[key] + + #Really weirdly written API by eBay, sortOrder is used two times, confusing naming + if sortOrder: + for so in sortOrder: + sortOrder_elem = etree.SubElement(root, "sortOrder") + sortPriority_elem = etree.SubElement(sortOrder_elem,"sortPriority") + sortPriority_elem.text = so.sortPriority + + subSortOrder_elem = etree.SubElement(sortOrder_elem, "sortOrder") + order_elem = etree.SubElement(subSortOrder_elem, "order") + order_elem.text = so.order + propertyName_elem = etree.SubElement(subSortOrder_elem, "propertyName") + propertyName_elem.text = so.propertyName + + + request=etree.tostring(root, pretty_print=True) + # print request + print3( request ) + + return get_response(findCompatibilitiesBySpecification.__name__, request, encoding) + + +def getProductCompatibilities(datasetPropertyName, \ + productIdentifier, \ + applicationPropertyFilter=None, \ + dataset=None, \ + disabledProductFilter=None, \ + paginationInput=None, \ + sortOrder=None, \ + encoding="JSON"): + root = etree.Element("findProductsByCompatibilityRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + + #datasetPropertyName is a List + if datasetPropertyName: + for dpn in datasetPropertyName: + dpn_elem = etree.SubElement(root, "datasetPropertyName") + dpn_elem.text = dpn + + #compatibilityPropertyFilter is an object in Utils.py + if compatibilityPropertyFilter: + for cp_filter in compatibilityPropertyFilter: + compatibilityPropertyFilter_elem = etree.SubElement(root, "compatibilityPropertyFilter") + propertyName_elem = etree.SubElement(compatibilityPropertyFilter_elem,"propertyName") + propertyName_elem.text = cp_filter.propertyName + + for v in cp_filter.values: + value_elem = etree.SubElement(compatibilityPropertyFilter_elem, "value") + if v.number: + number_elem = etree.SubElement(value_elem, "number") + number_elem.text = v.number + + if v.text: + text_elem = etree.SubElement(value_elem, "text") + text_elem.text = v.text + + if v.url: + url_elem = etree.SubElement(value_elem, "URL") + url_elem.text = v.url + + #dataSet is a List + if dataSet: + for ds in dataSet: + ds_elem = etree.SubElement(root, "dataSet") + ds_elem.text = ds + + #disabledProductFilter is dict + if disabledProductFilter: + disabledProductFilter_elem = etree.SubElement(root, "disabledProductFilter") + for key in disabledProductFilter.keys(): + key_elem = etree.SubElement(disabledProductFilter_elem, key) + key_elem.text = disabledProductFilter[key] + + #paginationInput is Dict + if paginationInput: + for key in paginationInput.keys(): + key_elem = etree.SubElement(root, key) + key_elem.text = paginationInput[key] + + #productIdentifier is dict + productIdentifier_elem = etree.SubElement(root, "productIdentifier") + for key in productIdentifier.keys(): + key_elem = etree.SubElement(productIdentifier_elem, key) + key_elem.text = productIdentifier[key] + + #Really weirdly written API by eBay, sortOrder is used two times, confusing naming + if sortOrder: + for so in sortOrder: + sortOrder_elem = etree.SubElement(root, "sortOrder") + sortPriority_elem = etree.SubElement(sortOrder_elem,"sortPriority") + sortPriority_elem.text = so.sortPriority + + subSortOrder_elem = etree.SubElement(sortOrder_elem, "sortOrder") + order_elem = etree.SubElement(subSortOrder_elem, "order") + order_elem.text = so.order + propertyName_elem = etree.SubElement(subSortOrder_elem, "propertyName") + propertyName_elem.text = so.propertyName + + request=etree.tostring(root, pretty_print=True) + return get_response(getProductCompatibilities.__name__, request, encoding) + + +def findProducts(invocationId, \ + dataset=None, \ + datasetPropertyName=None, \ + keywords=None, \ + paginationInput=None, \ + productStatusFilter=None, \ + propertyFilter=None, \ + sortOrder=None, \ + encoding="JSON"): + root = etree.Element("findProductsRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + + #Really messed up! : http://developer.ebay.com/DevZone/product/CallRef/findProducts.html#Samples + + request=etree.tostring(root, pretty_print=True) + return get_response(findProducts.__name__, request, encoding) + +def findProductsByCompatibility(encoding="JSON"): + root = etree.Element("findProductsByCompatibilityRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + + #Problem with getProductDetails, findProductsByCompatibility and findProducts method: http://developer.ebay.com/DevZone/product/CallRef/index.html + + request=etree.tostring(root, pretty_print=True) + return get_response(findProductsByCompatibility.__name__, request, encoding) + +def getProductDetails(encoding="JSON"): + root = etree.Element("getProductDetailsRequest", xmlns="http://www.ebay.com/marketplace/marketplacecatalog/v1/services") + + #Problem with getProductDetails, findProductsByCompatibility and findProducts method: http://developer.ebay.com/DevZone/product/CallRef/index.html + + request=etree.tostring(root, pretty_print=True) + return get_response(getProductDetails.__name__, request, encoding) + + +def get_response(operation_name, data, encoding, **headers): + config = get_config_store() + app_name = config.get("keys", "app_name") + endpoint = config.get("endpoints", "product") + + http_headers = {"X-EBAY-SOA-OPERATION-NAME": operation_name, + "X-EBAY-SOA-SECURITY-APPNAME": app_name, + "X-EBAY-SOA-RESPONSE-DATA-FORMAT": encoding} + + http_headers.update(headers) + + # req = urllib2.Request(endpoint, data, http_headers) + req = Request(endpoint, data, http_headers) + # res = urllib2.urlopen(req) + res = urlopen(req) + data = res.read() + return data diff --git a/test_finding.py b/test_finding.py new file mode 100644 index 0000000..d131fa1 --- /dev/null +++ b/test_finding.py @@ -0,0 +1,167 @@ +""" +Tests for package ``ebay.finding`` + +These tests are designed to work on the production system, not on Ebay's +sandbox. +""" +import unittest +from lxml import etree + +from ebay.finding import (getSearchKeywordsRecommendation, getHistograms, + findItemsAdvanced, findItemsByCategory, + findItemsByKeywords, findItemsByProduct, + findItemsIneBayStores) + + +encoding = "XML" #default "JSON": Output encoding +keywords = "ipod" +#Get category IDs with function: `ebay.shopping.GetCategoryInfo` +categoryId = "73839" #iPods & MP3 Players +productId = "77767691" #iPod nano 5th gen. Black. Each product has unique ID. +storeName = "Fab Finds 4 U" +#This information is encoded in URLs so the affiliate can get his commission. +affiliate = {"networkId":"9", "trackingId":"1234567890"} +buyerPostalCode = "10027" #central New York City, USA +paginationInput = {"entriesPerPage": "10", "pageNumber" : "1"} +#http://developer.ebay.com/DevZone/finding/CallRef/types/ItemFilterType.html +itemFilter = [{"name":"MaxPrice", "value":"100", + "paramName":"Currency", "paramValue":"EUR"}, + {"name":"MinPrice", "value":"50", + "paramName":"Currency", "paramValue":"EUR"}] +#http://developer.ebay.com/DevZone/finding/CallRef/findItemsByKeywords.html#Request.sortOrder +sortOrder = "EndTimeSoonest" +aspectFilter = [{"aspectName":"Color", "aspectValueName":"Black"}, + {"aspectName":"", "aspectValueName":""}] +#Multiple domain filters are currently unsupported +domainFilter = [{"domainName":"Other_MP3_Players"}] +#http://developer.ebay.com/DevZone/finding/CallRef/types/OutputSelectorType.html +outputSelector =["StoreInfo", "SellerInfo", "AspectHistogram"] + + +class TestFindingApi(unittest.TestCase): + def test_getSearchKeywordsRecommendation(self): + result = getSearchKeywordsRecommendation(keywords="eipod", encoding=encoding) +# print result + root = etree.fromstring(result) + ack = root.find("{http://www.ebay.com/marketplace/search/v1/services}ack").text + self.assertEqual(ack, "Success") + keyword = root.find("{http://www.ebay.com/marketplace/search/v1/services}keywords").text + self.assertEqual(keyword, "ipod") + + + def test_findItemsByKeywords(self): + result = findItemsByKeywords( + keywords=keywords, + affiliate=affiliate, \ + buyerPostalCode=buyerPostalCode, \ + paginationInput=paginationInput, \ + sortOrder=sortOrder, \ + aspectFilter=aspectFilter, \ + domainFilter=domainFilter, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + encoding=encoding) +# print result + root = etree.fromstring(result) + ack = root.find("{http://www.ebay.com/marketplace/search/v1/services}ack").text + self.assertEqual(ack, "Success") + #Number of Items between 0 and 10, because of paginationInput + res_items = root.find("{http://www.ebay.com/marketplace/search/v1/services}searchResult") + self.assertTrue(0 <= len(res_items) <= 10) + + + def test_findItemsByCategory(self): + result = findItemsByCategory( + categoryId=categoryId, \ + affiliate=affiliate, \ + buyerPostalCode=buyerPostalCode, \ + sortOrder=sortOrder, \ + paginationInput = paginationInput, \ + spectFilter=aspectFilter, \ + dainFilter=domainFilter, \ + iteilter=itemFilter, \ + outpuelector=outputSelector, \ + encoding=encoding) +# print result + root = etree.fromstring(result) + ack = root.find("{http://www.ebay.com/marketplace/search/v1/services}ack").text + self.assertEqual(ack, "Success") + #Number of Items between 0 and 10, because of paginationInput + res_items = root.find("{http://www.ebay.com/marketplace/search/v1/services}searchResult") + self.assertTrue(0 <= len(res_items) <= 10) + + + def test_findItemsAdvanced(self): + result = findItemsAdvanced( + keywords=keywords, \ + categoryId=categoryId, \ + affiliate=affiliate, \ + buyerPostalCode=buyerPostalCode, \ + paginationInput=paginationInput, \ + sortOrder=sortOrder, \ + spectFilter=aspectFilter, \ + domainFilter=domainFilter, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + encoding=encoding) +# pnt result + root = etree.fromstring(result) + ack = root.find("{http://www.ebay.com/marketplace/search/v1/services}ack").text + self.assertEqual(ack, "Success") + #Number of Items between 0 and 10, because of paginationInput + res_items = root.find("{http://www.ebay.com/marketplace/search/v1/services}searchResult") + self.assertTrue(0 <= len(res_items) <= 10) + + + def test_findItemsByProduct(self): + result = findItemsByProduct( + keywords=keywords, \ + productId=productId, \ + affiliate=affiliate, \ + buyerPostalCode=buyerPostalCode, \ + paginationInput= paginationInput, \ + sortOrder=sortOrder, \ + itemFilter=itemFilter, \ + outputSelector=outputSelector, \ + encoding=encoding) +# print result + root = etree.fromstring(result) + ack = root.find("{http://www.ebay.com/marketplace/search/v1/services}ack").text + self.assertEqual(ack, "Failure") + + + def test_findItemsIneBayStores(self): + result = findItemsIneBayStores( + keywords=keywords, \ + storeName=storeName, \ + affiliate=affiliate, \ + buyerPostalCode=buyerPostalCode, \ + paginationInput=paginationInput, \ + sortOrder=sortOrder, \ + asctFilter=aspectFilter, \ + domainFilter=domainFilter, \ + emFilter=itemFilter, \ + outputlector=outputSelector, \ + encoding=encoding) + root = etree.fromstring(result) + ack = root.find("{http://www.ebay.com/marketplace/search/v1/services}ack").text + self.assertEqual(ack, "Success") + #Number of Items between 0 and 10, because of paginationInput + res_items = root.find("{http://www.ebay.com/marketplace/search/v1/services}searchResult") + self.assertTrue(0 <= len(res_items) <= 10) + + + def test_getHistograms(self): + result = getHistograms(categoryId=categoryId, encoding=encoding) +# print result + root = etree.fromstring(result) + ack = root.find("{http://www.ebay.com/marketplace/search/v1/services}ack").text + self.assertEqual(ack, "Success") + + +if __name__ == '__main__': +# #Run single test manually. +# t = TestFindingApi("test_findItemsByProduct") +# t.test_findItemsByProduct() + + unittest.main() diff --git a/test_merchandising.py b/test_merchandising.py new file mode 100644 index 0000000..9d7fed1 --- /dev/null +++ b/test_merchandising.py @@ -0,0 +1,61 @@ +import unittest +from lxml import objectify + +from ebay.merchandising import * + +keywords = "ipod" + + +class TestMerchandisingApi(unittest.TestCase): + def test_getDeals(self): + result = getDeals(keywords=keywords, encoding="XML") + root = objectify.fromstring(result) + ack = root.ack.text + self.assertEqual(ack, "Success") + + + def test_getMostWatchedItems(self): + result = getMostWatchedItems(affiliate=None, maxResults=None,categoryId=None, encoding="XML") + root = objectify.fromstring(result) + ack = root.ack.text + self.assertEqual(ack, "Success") + + + def test_getRelatedCategoryItems(self): + result = getRelatedCategoryItems(affiliate=None, + maxResults=None, \ + categoryId=None, \ + itemFilter=None, \ + itemId=None, \ + encoding="XML") + root = objectify.fromstring(result) + ack = root.ack.text + self.assertEqual(ack, "Success") + + + def test_getSimilarItems(self): + result = getSimilarItems(affiliate=None, \ + maxResults=None, \ + categoryId=None, \ + categoryIdExclude=None, \ + endTimeFrom=None, \ + endTimeTo=None, \ + itemFilter=None, \ + itemId=None, \ + listingType=None, \ + maxPrice=None, \ + encoding="XML") + root = objectify.fromstring(result) + ack = root.ack.text + self.assertEqual(ack, "Success") + + + def test_getTopSellingProducts(self): + result = getTopSellingProducts(affiliate=None, maxResults=None, encoding="XML") + root = objectify.fromstring(result) + ack = root.ack.text + self.assertEqual(ack, "Success") + + +if __name__ == '__main__': + unittest.main() diff --git a/test_product.py b/test_product.py new file mode 100644 index 0000000..cd33899 --- /dev/null +++ b/test_product.py @@ -0,0 +1,49 @@ +import unittest +from lxml import objectify + +from ebay.product import * + +categoryId = "170577" +#The Specification array of objects +spec1 = Specification(propertyName="Offset") +spec1.values = [Value(text="45.0")] +spec2 = Specification(propertyName="Rim Width") +spec2.values = [Value(text="8.0")] +spec = [spec1, spec2] + + + +#The CompatibilityPropertyFilter array of objects +cpf1 = CompatibilityPropertyFilter(propertyName="Year") +cpf1.values = [Value(text="2006")] +cpf2 = CompatibilityPropertyFilter(propertyName="Make") +cpf2.values = [Value(text="Honda")] +cpf = [cpf1, cpf2] + +dataSet = ["DisplayableProductDetails", "Searchable"] +datasetPropertyName = ["Make", "Model", "Year", "Trim", "Engine"] +exactMatch = "True" +paginationInput = {"entriesPerPage":"10", "totalPages":"10"} +sortOrder = [SortOrder(sortPriority="Sort1", order="Ascending", propertyName="Offset"), SortOrder(sortPriority="Sort2", order="Ascending", propertyName="Rim Width")] +encoding = "XML" + + +class TestProductApi(unittest.TestCase): + def test_findCompatibilitiesBySpecification(self): + result = findCompatibilitiesBySpecification(specification=spec, \ + categoryId=categoryId, \ + compatibilityPropertyFilter=None, \ + dataSet=None, \ + datasetPropertyName=None, \ + exactMatch=None, \ + paginationInput=None, \ + sortOrder=None, \ + encoding=encoding) + root = objectify.fromstring(result) + ack = root.ack.text + self.assertEqual(ack, "Success") + + +if __name__ == '__main__': + unittest.main() +