Rev 31560 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
from elixir import *from shop2020.model.v1.catalog.impl import DataServicefrom shop2020.model.v1.catalog.impl.DataService import Item, Tag_Listing, \Tag_Ranking, PrivateDealsfrom shop2020.thriftpy.model.v1.catalog.ttypes import statusfrom sqlalchemy.sql.expression import or_, descfrom sqlalchemy.sql.functions import nowimport jsonimport optparseimport osimport pymongoimport pysolrimport shutilimport tracebackimport urllib2from dtr.utils.utils import to_java_dateimport urllib2import StringIO# import pymongo# import pysolrCATEGORY_MASTER = [10006, 10010, 14202, 14203]parser = optparse.OptionParser()parser.add_option("-d", "--d", dest="dbHost",default="127.0.0.1",type="string", help="The HOST where the mysql server is running",metavar="DBHOST")parser.add_option("-s", "--s", dest="solrPath",default="http://localhost:8984/solr/demo",type="string", help="Complete solr path",metavar="SOLRHOST")parser.add_option("-m", "--m", dest="mongoHost",default="localhost",type="string", help="Complete solr path",metavar="HOST")(options, args) = parser.parse_args()con = NoneDataService.initialize(db_hostname=options.dbHost)solr = pysolr.Solr(options.solrPath, always_commit=True, timeout=10)def get_mongo_connection(host='localhost', port=27017):global conif con is None:print "Establishing connection %s host and port %d" % (host, port)try:con = pymongo.MongoClient(host, port)except Exception, e:print ereturn Nonereturn conclass __SkuInfo:def __init__(self, id, ids, brand, model_name, category_id, subCategoryId, thumbnail, title, brand_synonyms, model_name_synonyms, source_product_names, \category, subCategory):# Skubundle idself.id = id# _id of skusself.ids = idsself.brand = brandself.model_name = model_nameself.category_id = category_idself.subCategoryId = subCategoryIdself.thumbnail = thumbnailself.title = titleself.brand_synonyms = brand_synonymsself.model_name_synonyms = model_name_synonymsself.source_product_names = source_product_namesself.category = categoryself.subCategory = subCategorydef toJSON(self):return json.dumps(self, default=lambda o: o.__dict__,sort_keys=True, indent=4)class __Catalog:def __init__(self, id, rank, title, items):# Skubundle idself.id = idself.rank = rankself.title = titleself._childDocuments_ = itemsdef toJSON(self):return json.dumps(self, default=lambda o: o.__dict__)class __Item:def __init__(self, id, color, tags):self.id = idself.color = colorself._childDocuments_ = tagsdef toJSON(self):return json.dumps(self, default=lambda o: o.__dict__)class __Tag:def __init__(self, id, sellingPrice, mop):self.id = idself.sellingPrice = sellingPriceself.mop = mop# solr = pysolr.Solr(options.solrPath, timeout=10)def todict(obj, classkey=None):if isinstance(obj, dict):data = {}for (k, v) in obj.items():data[k] = todict(v, classkey)return dataelif hasattr(obj, "_ast"):return todict(obj._ast())elif hasattr(obj, "__iter__"):return [todict(v, classkey) for v in obj]elif hasattr(obj, "__dict__"):data = dict([(key, todict(value, classkey))for key, value in obj.__dict__.iteritems()if not callable(value) and not key.startswith('_')])if classkey is not None and hasattr(obj, "__class__"):data[classkey] = obj.__class__.__name__return dataelse:return objdef ungzipResponse(r):headers = r.info()if headers.get('Content-Encoding') == 'gzip':url_f = StringIO.StringIO(r.read())gz = gzip.GzipFile(fileobj=url_f)html = gz.read()gz.close()return htmlreturn r.read()def getAvailabilityJSON():url = "http://50.116.10.120/reports/run.php?execute_mode=EXECUTE&xmlin=warehousecisnew.xml&project=FOCOR&project_password=focor&target_format=JSON"req = urllib2.Request(url, headers={})response = urllib2.urlopen(req)response_data = ungzipResponse(response)response.close()return json.loads(response_data)['data']def getPendingPOJSON():url = "http://50.116.10.120/reports/run.php?execute_mode=EXECUTE&xmlin=UnfulfilledPOItemsNew.xml&project=FOCOR&project_password=focor&target_format=JSON"req = urllib2.Request(url, headers={})response = urllib2.urlopen(req)response_data = ungzipResponse(response)response.close()return json.loads(response_data)['data']def getItemMap():rawAvailabilityList = getAvailabilityJSON()rawPendingPoList = getPendingPOJSON()availabilityItemMap = {}# {"Warehouseid":"8468","Warehousefrom":"7573","Itemid":"29591","Availability":"8","Reserved":"0","Netavailability":"8"}for rawAvailability in rawAvailabilityList:if not availabilityItemMap.has_key(rawAvailability['Itemid']):availabilityItemMap[rawAvailability['Itemid']] = {}if not availabilityItemMap[rawAvailability['Itemid']].has_key(rawAvailability['Warehouseid']):availabilityItemMap[rawAvailability['Itemid']][rawAvailability['Warehouseid']] = {"netAvailability":0, "netPo":0}availabilityItemMap[rawAvailability['Itemid']][rawAvailability['Warehouseid']]['netAvailability'] += int(rawAvailability['Netavailability'])for rawPendingPo in rawPendingPoList:if not availabilityItemMap.has_key(rawPendingPo['Itemid']):availabilityItemMap[rawPendingPo['Itemid']] = {}if not availabilityItemMap[rawPendingPo['Itemid']].has_key(rawPendingPo['Warehouseid']):availabilityItemMap[rawPendingPo['Itemid']][rawPendingPo['Warehouseid']] = {"netAvailability":0, "netPo":0}availabilityItemMap[rawPendingPo['Itemid']][rawPendingPo['Warehouseid']]['netPo'] += int(rawPendingPo['Unfulfilled'])return availabilityItemMapdef populateTagItems():availabilityItemMap = getItemMap()tagRankingList = session.query(Tag_Ranking).order_by(desc(Tag_Ranking.rankPoints)).all()rankingList = []featureMap = {}for tagRanking in tagRankingList:rankingList.append(tagRanking.catalogItemId)featureMap[tagRanking.catalogItemId] = tagRanking.featurecatalogMap = {}# stmt = session.query(PrivateDeals).filter_by(isActive=1).filter(now().between(PrivateDeals.startDate, PrivateDeals.endDate)).subquery()# query = session.query(Item, privateDealAlias.dealPrice).outerjoin((privateDealAlias, Item.id==privateDealAlias.item_id)).filter(Item.status != status.PHASED_OUT)tuples = session.query(Tag_Listing, Item).join((Item, Item.id == Tag_Listing.item_id)).filter(or_(Item.status == status.ACTIVE, Item.status == status.PAUSED_BY_RISK, Item.status == status.PARTIALLY_ACTIVE))projection = {'defaultImageUrl':1}excludeBrands = ["Live Demo", "Dummy", "FOC HANDSET"]for tag, item in tuples:if item.brand in excludeBrands:continueif not catalogMap.has_key(item.catalog_item_id):catalogObj = {}catalogObj['feature'] = ""catalogObj['title'] = " ".join(filter(None, [item.brand, item.model_name, item.model_number]))catalogObj['brand'] = (item.brand)if item.brand == 'Huawei' or item.brand == 'Honor':catalogObj['brand'] = ('Huawei', 'Honor')if item.brand == 'Mi' or item.brand == 'Xiaomi' or item.brand == 'Redmi':catalogObj['brand'] = ('Mi', 'Xiaomi', 'Redmi')catalogObj['identifier'] = item.catalog_item_idcatalogObj['items'] = {}filterMap = {"_id":item.catalog_item_id}# Dont include it catalog not availabletry:catalogObj['imageUrl'] = get_mongo_connection(options.mongoHost).CONTENT.siteContent.find_one(filterMap, projection)['defaultImageUrl']print catalogObj['imageUrl']except:try:catalogObj['imageUrl'] = 'https://images.smartdukaan.com/uploads/campaigns/' + str(item.catalog_item_id) + '.jpg'except:traceback.print_exc()try:catalogObj['rank'] = rankingList.index(item.catalog_item_id)except:# A very big numbertraceback.print_exc()catalogObj['rank'] = 50000000if featureMap.has_key(item.catalog_item_id) and featureMap.get(item.catalog_item_id) is not None:catalogObj['feature'] = featureMap.get(item.catalog_item_id)# Mobile and tablets are showcased in same categorycatalogObj['categoryId'] = item.category if item.category in CATEGORY_MASTER else 6# Temporay change need to be removedif item.category == 10006:catalogObj['categoryId'] = 3catalogObj['subCategoryId'] = item.categorycatalogObj['create_timestamp'] = to_java_date(tag.create_timestamp)catalogMap[item.catalog_item_id] = catalogObjcatalogObj['avColor'] = {}catalogObj = catalogMap.get(item.catalog_item_id)if availabilityItemMap.has_key(str(item.id)):for warehouseId, avMap in availabilityItemMap[str(item.id)].iteritems():print warehouseId, avMap, item.color, item.brand, item.model_name, item.model_number, item.catalog_item_idif not catalogObj['avColor'].has_key(int(warehouseId)):catalogObj['avColor'][int(warehouseId)] = 0color = catalogObj['avColor'][int(warehouseId)]if avMap['netAvailability'] > 0:color = 2elif avMap['netAvailability'] + avMap['netPo']:color = max(color, 1)else:color = max(color, 0)catalogObj['avColor'][int(warehouseId)] = colorif not catalogObj['items'].has_key(item.id):catalogObj['items'][item.id] = {'color': item.color.replace("f_", ""), 'tagPricing':[]}itemMap = catalogObj['items'].get(item.id)itemMap['tagPricing'].append(tag)catalogObjs = []for catalogId, catalogMap in catalogMap.iteritems():print "catalogMap", catalogMapactive = FalseitemsMap = catalogMap['items']itemObjs = []mop = 0for itemId, itemMap in itemsMap.iteritems():tags = itemMap.pop('tagPricing')for tag in tags:active = active or tag.activeitemObj = {'id':('itemtag-%s-%s' % (itemId, tag.tag_id)), 'color_s':itemMap['color'], 'itemId_i': itemId, 'tagId_i':tag.tag_id,'mrp_f':tag.mrp, 'mop_f': tag.mop, 'sellingPrice_f': tag.selling_price, 'active_b' : tag.active, 'hot_deal_b': tag.hot_deals}mop = tag.mopitemObjs.append(itemObj)catalogObj = {'id':'catalog' + str(catalogId), 'rank_i':catalogMap['rank'], 'title_s': catalogMap['title'],'_childDocuments_':itemObjs,'child_b' : len(itemObjs) > 0,'catalogId_i':catalogId,'imageUrl_s': catalogMap['imageUrl'].replace("saholic", "smartdukaan"),'feature_s':catalogMap['feature'],'brand_ss': catalogMap['brand'], 'create_s':catalogMap['create_timestamp'],'categoryId_i':catalogMap['categoryId'],'subCategoryId_i':catalogMap['subCategoryId'],'w7573_i':0,'w7678_i':0,'w7720_i':0,'w8468_i':0,'w8889_i':0,'w8947_i':0,'w9213_i':0,'w9203_i':0,'show_default_b': "FOC" in catalogMap['brand'],'mop_f': mop}for whId, color in catalogMap['avColor'].iteritems():print catalogId, whId, color, catalogMap['title']catalogObj['w%d_i'%(whId)] = colorcatalogObj['active_b'] = activecatalogObjs.append(catalogObj)solr.delete(q='*:*')solr.add(catalogObjs)#print catalogObjs#for catalogObj in catalogObjs:# solr.add(catalogObj)def pushData():populateTagItems()if __name__ == '__main__':pushData()