Subversion Repositories SmartDukaan

Rev

Rev 20379 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13828 kshitij.so 1
import urllib2
2
import simplejson as json
3
import pymongo
15270 kshitij.so 4
from dtr.utils.utils import to_java_date, getNlcPoints 
13917 kshitij.so 5
from datetime import datetime, timedelta
13828 kshitij.so 6
import time
14180 kshitij.so 7
from multiprocessing import Pool as ThreadPool
8
from multiprocessing import cpu_count
14254 kshitij.so 9
import optparse
14325 kshitij.so 10
from dtr.storage.MemCache import MemCache
20347 kshitij.so 11
from dtr.utils.utils import getCashBack, DEAL_PRIORITY
15270 kshitij.so 12
import traceback
13
from operator import itemgetter
16085 kshitij.so 14
import chardet
13828 kshitij.so 15
 
16
con = None
17
 
14254 kshitij.so 18
parser = optparse.OptionParser()
19
parser.add_option("-m", "--m", dest="mongoHost",
20
                      default="localhost",
21
                      type="string", help="The HOST where the mongo server is running",
22
                      metavar="mongo_host")
23
 
24
(options, args) = parser.parse_args()
25
 
14325 kshitij.so 26
mc = MemCache(options.mongoHost)
14254 kshitij.so 27
 
16869 kshitij.so 28
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5,'PAYTM.COM':6}
16019 kshitij.so 29
 
13828 kshitij.so 30
headers = { 
31
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
32
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
33
            'Accept-Language' : 'en-US,en;q=0.8',                     
34
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
35
        }
36
 
16429 kshitij.so 37
 
14254 kshitij.so 38
def get_mongo_connection(host=options.mongoHost, port=27017):
13828 kshitij.so 39
    global con
40
    if con is None:
41
        print "Establishing connection %s host and port %d" %(host,port)
42
        try:
43
            con = pymongo.MongoClient(host, port)
44
        except Exception, e:
45
            print e
46
            return None
47
    return con
48
 
19186 kshitij.so 49
def getNetPriceForItem(itemId, source_id, category_id ,price):
50
    cash_back_type = 0
51
    cash_back = 0
52
    try:
53
        cashBack = getCashBack(itemId, source_id, category_id, mc, options.mongoHost)
54
        if not cashBack or cashBack.get('cash_back_status')!=1:
55
            cash_back_type = 0
56
            cash_back = 0 
57
 
58
        else:
59
            if cashBack['cash_back_type'] in (1,2):
60
 
61
                if cashBack.get('maxCashBack') is not None:
62
 
63
                    if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*price)/100 > cashBack.get('maxCashBack'):
64
                        cashBack['cash_back_type'] = 2
65
                        cashBack['cash_back'] = cashBack['maxCashBack']
66
                    elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
67
                        cashBack['cash_back'] = cashBack['maxCashBack']
68
                    else:
69
                        pass
70
 
71
 
72
 
73
                cash_back_type = cashBack['cash_back_type']
74
                cash_back = float(cashBack['cash_back'])
75
    except Exception as cashBackEx:
76
        pass
77
 
78
    if cash_back_type ==1:
79
        return (price - float(cash_back)*price/100)
80
    elif cash_back_type ==2:
81
        return (price - cash_back)
82
    else:
83
        return price
84
 
85
 
14180 kshitij.so 86
def populate():
87
    toScrapMap = {}
14132 kshitij.so 88
    bestSellers = list(get_mongo_connection().Catalog.MasterData.find({'rank':{'$gt':0}}))
89
    for bestSeller in bestSellers: 
90
        snapdealBestSellers = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':bestSeller['skuBundleId'],'source_id':3}))
91
        for data in snapdealBestSellers:
14180 kshitij.so 92
            if not toScrapMap.has_key(data['_id']):
15270 kshitij.so 93
                data['dealFlag'] = 0
94
                data['dealType'] = 0
14180 kshitij.so 95
                toScrapMap[data['_id']] = data
16174 kshitij.so 96
    dealFlagged = list(get_mongo_connection().Catalog.Deals.find({'source_id':3,'showDeal':1,'totalPoints':{'$gt':-100}}))
14252 kshitij.so 97
    for deal in dealFlagged:
98
        if not toScrapMap.has_key(deal['_id']):
14261 kshitij.so 99
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
15270 kshitij.so 100
            data[0]['dealFlag'] = 0
101
            data[0]['dealType'] = 0
14261 kshitij.so 102
            toScrapMap[deal['_id']] = data[0]
15270 kshitij.so 103
    manualDeals = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':3}))
104
    for manualDeal in manualDeals:
105
        if not toScrapMap.has_key(manualDeal['sku']):
106
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':manualDeal['sku']}))
107
            if len(data) > 0:
108
                data[0]['dealFlag'] = 1
109
                data[0]['dealType'] = manualDeal['dealType']
110
                toScrapMap[manualDeal['sku']] = data[0]
111
        else:
112
            data = toScrapMap.get(manualDeal['sku'])
113
            data['dealFlag'] = 1
114
            data['dealType'] = manualDeal['dealType']
16502 kshitij.so 115
 
16019 kshitij.so 116
    for val in toScrapMap.values():
117
        updatePrices(val)
118
#    pool = ThreadPool(cpu_count() *2)
119
#    offset = 0
120
#    limit =100
121
#    while(offset<=len(toScrapMap.values())):
122
#        pool.map(updatePrices,toScrapMap.values()[offset:offset+limit])
123
#        offset = offset + limit
124
#    pool.close()
125
#    pool.join()
126
#    print "joining threads at %s"%(str(datetime.now()))
14180 kshitij.so 127
 
128
 
129
def updatePrices(data):
16502 kshitij.so 130
    if data.get('ignorePricing') ==1:
16429 kshitij.so 131
        print "Ignored items returning for %d"%(data['_id'])
132
        return
14180 kshitij.so 133
    if data['source_id']!=3:
134
        return
135
    print data['identifier']
136
    if data['identifier'] is None or len(data['identifier'].strip())==0:
137
        print "returning"
138
        return
139
 
140
    try:
141
        if data['priceUpdatedOn'] > to_java_date(datetime.now() - timedelta(minutes=5)):
142
            print "sku id is already updated",data['_id'] 
143
            return
144
    except:
145
        pass
146
 
20379 kshitij.so 147
    url="https://m.snapdeal.com/snap/product/getRefreshProductDetails?supc=%s"%(data['identifier'].strip())
14180 kshitij.so 148
    print url
15820 kshitij.so 149
    try:
16019 kshitij.so 150
        req = urllib2.Request(url,headers=headers)
151
        response = urllib2.urlopen(req)
16085 kshitij.so 152
        snapdeal_data = response.read()
16087 kshitij.so 153
        response.close()
16019 kshitij.so 154
    except:
155
        print "Unable to scrape %d"%(data['_id'])
16087 kshitij.so 156
        get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(datetime.now()),'in_stock':0,'priceUpdatedOn':to_java_date(datetime.now())}})
157
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0}})
16019 kshitij.so 158
        return
16085 kshitij.so 159
    encoding =  chardet.detect(snapdeal_data)
16019 kshitij.so 160
    try:
16085 kshitij.so 161
        snapdeal_data = snapdeal_data.decode(encoding.get('encoding'))
15820 kshitij.so 162
    except:
16429 kshitij.so 163
        snapdeal_data = snapdeal_data.decode('latin-1')
16085 kshitij.so 164
    try:
20377 kshitij.so 165
        vendor_data = json.loads(snapdeal_data)
166
        if vendor_data is None:
17297 kshitij.so 167
            raise
16085 kshitij.so 168
    except:
16086 kshitij.so 169
        print "Unable to load json for %d"%(data['_id'])
15820 kshitij.so 170
        return
20377 kshitij.so 171
 
172
    instock = 0
173
    buyBoxPrice = 0.0
20380 kshitij.so 174
    isBuyBox = 1
20377 kshitij.so 175
 
176
    buyBoxStock = int(vendor_data['vendorDtlSRO']['vendorDetailInventoryPricingSRO']['buyableInventory'])
177
    soldOut = vendor_data['vendorDtlSRO']['vendorDetailInventoryPricingSRO']['soldOut']
178
    instock = 1 if not soldOut else 0
179
    if buyBoxStock >0:
180
        buyBoxPrice = float(vendor_data['vendorDtlSRO']['finalPrice'])
15820 kshitij.so 181
 
20377 kshitij.so 182
    lowestOfferPrice = float(vendor_data['auxiliarySellerInfo']['priceStartRange'])
183
 
15820 kshitij.so 184
    if buyBoxPrice != lowestOfferPrice:
185
        isBuyBox = 0
186
 
14180 kshitij.so 187
    print lowestOfferPrice
188
    print instock
20378 kshitij.so 189
    print "Lowest Offer Price for id %d is %d , In-Stock is %d " %(data['_id'],lowestOfferPrice,instock)
14180 kshitij.so 190
    print "*************"
19186 kshitij.so 191
    if instock ==1:
192
        netPriceAfterCashBack = getNetPriceForItem(data['_id'], SOURCE_MAP.get('SNAPDEAL'), data['category_id'], lowestOfferPrice)
193
    else:
194
        netPriceAfterCashBack = getNetPriceForItem(data['_id'], SOURCE_MAP.get('SNAPDEAL'), data['category_id'], data['available_price'])
195
 
196
 
197
 
14180 kshitij.so 198
    if instock  == 1:
15270 kshitij.so 199
        get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice,'updatedOn':to_java_date(datetime.now()),'priceUpdatedOn':to_java_date(datetime.now()),'in_stock':instock,'buyBoxFlag':isBuyBox}}, multi=True)
19212 kshitij.so 200
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice , 'in_stock':instock,'codAvailable':data['codAvailable'],'netPriceAfterCashBack':netPriceAfterCashBack}}, multi=True)
14180 kshitij.so 201
    else:
15270 kshitij.so 202
        get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(datetime.now()),'in_stock':instock,'priceUpdatedOn':to_java_date(datetime.now()),'buyBoxFlag':isBuyBox}}, multi=True)
19186 kshitij.so 203
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':instock,'codAvailable':data['codAvailable'],'netPriceAfterCashBack':netPriceAfterCashBack}})
14180 kshitij.so 204
 
205
    try:
15270 kshitij.so 206
        recomputeDeal(data)
14180 kshitij.so 207
    except:
208
        print "Unable to compute deal for ",data['skuBundleId']
209
 
14325 kshitij.so 210
 
211
def populateNegativeDeals():
212
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
15270 kshitij.so 213
    mc.set("negative_deals", negativeDeals, 600)
214
 
16502 kshitij.so 215
#def recomputePoints(item, deal):
216
#    try:
217
#        if item.get('available_price') == deal['available_price']:
218
#            print "No need to compute points for %d , as price is still same" %(item['_id'])
219
#            raise
220
#        nlcPoints = getNlcPoints(item, deal['minNlc'], deal['maxNlc'], deal['available_price'])
221
#    except:
222
#        print traceback.print_exc()
223
#        nlcPoints = deal['nlcPoints']
224
#    
225
#    bundleDealPoints = list(get_mongo_connection().Catalog.DealPoints.find({'skuBundleId':item['skuBundleId'],'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}}))
226
#    if len(bundleDealPoints) > 0:
227
#        item['manualDealThresholdPrice'] = bundleDealPoints[0]['dealThresholdPrice']
228
#        dealPoints = bundleDealPoints[0]['dealPoints']
229
#    else:
230
#        dealPoints = 0
231
#        item['manualDealThresholdPrice'] = None
232
#        
233
#    get_mongo_connection().Catalog.Deals.update({'_id':deal['_id']},{"$set":{'totalPoints':deal['totalPoints'] - deal['nlcPoints'] + nlcPoints - deal['dealPoints'] +dealPoints , 'nlcPoints': nlcPoints, 'dealPoints': dealPoints, 'manualDealThresholdPrice': item['manualDealThresholdPrice']}})
15270 kshitij.so 234
 
19186 kshitij.so 235
 
15270 kshitij.so 236
def recomputeDeal(item):
13917 kshitij.so 237
    """Lets recompute deal for this bundle"""
16019 kshitij.so 238
    print "Recomputing for bundleId %d" %(item.get('skuBundleId'))
15270 kshitij.so 239
    skuBundleId = item['skuBundleId']
13917 kshitij.so 240
 
19186 kshitij.so 241
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('netPriceAfterCashBack',pymongo.ASCENDING)]))
13917 kshitij.so 242
    bestPrice = float("inf")
243
    bestOne = None
244
    toUpdate = []
16019 kshitij.so 245
    prepaidBestPrice = float("inf")
246
    prepaidBestOne = None
13917 kshitij.so 247
    for similarItem in similarItems:
16019 kshitij.so 248
        if similarItem['codAvailable'] ==1:
249
            if mc.get("negative_deals") is None:
250
                populateNegativeDeals()
16174 kshitij.so 251
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 252
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
253
                continue
254
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
255
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
256
                continue
19186 kshitij.so 257
            if similarItem.get('netPriceAfterCashBack') < bestPrice:
16019 kshitij.so 258
                bestOne = similarItem
19186 kshitij.so 259
                bestPrice = similarItem.get('netPriceAfterCashBack')
20347 kshitij.so 260
            elif similarItem.get('netPriceAfterCashBack') == bestPrice:
261
 
262
                try:
263
                    if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(bestOne['source_id']))):
264
                        continue
265
                except:
266
                    traceback.print_exc()
267
 
16019 kshitij.so 268
                bestOne = similarItem
19186 kshitij.so 269
                bestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 270
            else:
271
                pass
13917 kshitij.so 272
        else:
16019 kshitij.so 273
            if mc.get("negative_deals") is None:
274
                populateNegativeDeals()
16174 kshitij.so 275
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 276
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
277
                continue
278
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
279
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
280
                continue
19186 kshitij.so 281
            if similarItem.get('netPriceAfterCashBack') < prepaidBestPrice:
16019 kshitij.so 282
                prepaidBestOne = similarItem
19186 kshitij.so 283
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
20347 kshitij.so 284
            elif similarItem.get('netPriceAfterCashBack') == prepaidBestPrice:
285
 
286
                try:
20363 kshitij.so 287
                    if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(prepaidBestOne['source_id']))):
20347 kshitij.so 288
                        continue
289
                except:
290
                    traceback.print_exc()
291
 
16019 kshitij.so 292
                prepaidBestOne = similarItem
19186 kshitij.so 293
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 294
            else:
295
                pass
16026 kshitij.so 296
    if bestOne is not None or prepaidBestOne is not None:
13917 kshitij.so 297
        for similarItem in similarItems:
298
            toUpdate.append(similarItem['_id'])
16026 kshitij.so 299
        if bestOne is not None:
300
            toUpdate.remove(bestOne['_id'])
301
            get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
302
        if prepaidBestOne is not None:
16070 kshitij.so 303
            if bestOne is not None:
19186 kshitij.so 304
                if prepaidBestOne.get('netPriceAfterCashBack') < bestOne.get('netPriceAfterCashBack'): 
16070 kshitij.so 305
                    toUpdate.remove(prepaidBestOne['_id'])
306
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
307
            else:
308
                toUpdate.remove(prepaidBestOne['_id'])
309
                get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13917 kshitij.so 310
    if len(toUpdate) > 0:
16019 kshitij.so 311
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
19186 kshitij.so 312
 
16026 kshitij.so 313
 
13828 kshitij.so 314
def main():
14180 kshitij.so 315
    populate()
13828 kshitij.so 316
 
317
if __name__=='__main__':
318
    main()