Subversion Repositories SmartDukaan

Rev

Rev 19212 | Rev 20363 | 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
 
17294 kshitij.so 147
    url="http://www.snapdeal.com/acors/json/v2/gvbps?supc=%s&catUrl=&bn=&catId=175&start=0&count=10000&scoreCategoryUrl=mobiles-mobile-phones&make2Order=false&auto=false&isO2OVendorRequired=true"%(data['identifier'].strip())
14180 kshitij.so 148
    print url
149
    lowestOfferPrice = 0
150
    instock = 0
15270 kshitij.so 151
    buyBoxPrice = 0
152
    isBuyBox = 1
153
    stock = 0
15820 kshitij.so 154
    try:
16019 kshitij.so 155
        req = urllib2.Request(url,headers=headers)
156
        response = urllib2.urlopen(req)
16085 kshitij.so 157
        snapdeal_data = response.read()
16087 kshitij.so 158
        response.close()
16019 kshitij.so 159
    except:
160
        print "Unable to scrape %d"%(data['_id'])
16087 kshitij.so 161
        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())}})
162
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0}})
16019 kshitij.so 163
        return
16085 kshitij.so 164
    encoding =  chardet.detect(snapdeal_data)
16019 kshitij.so 165
    try:
16085 kshitij.so 166
        snapdeal_data = snapdeal_data.decode(encoding.get('encoding'))
15820 kshitij.so 167
    except:
16429 kshitij.so 168
        snapdeal_data = snapdeal_data.decode('latin-1')
16085 kshitij.so 169
    try:
170
        vendorInfo = json.loads(snapdeal_data)
17297 kshitij.so 171
        if vendorInfo is None:
172
            raise
16085 kshitij.so 173
    except:
16086 kshitij.so 174
        print "Unable to load json for %d"%(data['_id'])
15820 kshitij.so 175
        return
15270 kshitij.so 176
 
15820 kshitij.so 177
    try:
178
        buyBoxStock = vendorInfo['primaryVendor']['buyableInventory']
179
        if buyBoxStock >0:
180
            buyBoxPrice = vendorInfo['primaryVendor']['sellingPrice']
181
    except:
182
        pass
183
 
184
    sortedVendorsData = sorted(vendorInfo['vendors'], key=itemgetter('sellingPrice'))
185
    for sortedVendorData in sortedVendorsData:
186
        lowestOfferPrice = float(sortedVendorData['sellingPrice'])
187
        try:
188
            stock = sortedVendorData['buyableInventory']
189
        except:
190
            pass
191
        if stock > 0 and lowestOfferPrice > 0:
192
            instock = 1
193
            break
194
    if buyBoxPrice != lowestOfferPrice:
195
        isBuyBox = 0
196
 
14180 kshitij.so 197
    print lowestOfferPrice
198
    print instock
14181 kshitij.so 199
    print "Lowest Offer Price for id %d is %d , stock is %d and stock count is %d" %(data['_id'],lowestOfferPrice,instock,stock)
14180 kshitij.so 200
    print "*************"
19186 kshitij.so 201
    if instock ==1:
202
        netPriceAfterCashBack = getNetPriceForItem(data['_id'], SOURCE_MAP.get('SNAPDEAL'), data['category_id'], lowestOfferPrice)
203
    else:
204
        netPriceAfterCashBack = getNetPriceForItem(data['_id'], SOURCE_MAP.get('SNAPDEAL'), data['category_id'], data['available_price'])
205
 
206
 
207
 
14180 kshitij.so 208
    if instock  == 1:
15270 kshitij.so 209
        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 210
        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 211
    else:
15270 kshitij.so 212
        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 213
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':instock,'codAvailable':data['codAvailable'],'netPriceAfterCashBack':netPriceAfterCashBack}})
14180 kshitij.so 214
 
215
    try:
15270 kshitij.so 216
        recomputeDeal(data)
14180 kshitij.so 217
    except:
218
        print "Unable to compute deal for ",data['skuBundleId']
219
 
14325 kshitij.so 220
 
221
def populateNegativeDeals():
222
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
15270 kshitij.so 223
    mc.set("negative_deals", negativeDeals, 600)
224
 
16502 kshitij.so 225
#def recomputePoints(item, deal):
226
#    try:
227
#        if item.get('available_price') == deal['available_price']:
228
#            print "No need to compute points for %d , as price is still same" %(item['_id'])
229
#            raise
230
#        nlcPoints = getNlcPoints(item, deal['minNlc'], deal['maxNlc'], deal['available_price'])
231
#    except:
232
#        print traceback.print_exc()
233
#        nlcPoints = deal['nlcPoints']
234
#    
235
#    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())}}))
236
#    if len(bundleDealPoints) > 0:
237
#        item['manualDealThresholdPrice'] = bundleDealPoints[0]['dealThresholdPrice']
238
#        dealPoints = bundleDealPoints[0]['dealPoints']
239
#    else:
240
#        dealPoints = 0
241
#        item['manualDealThresholdPrice'] = None
242
#        
243
#    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 244
 
19186 kshitij.so 245
 
15270 kshitij.so 246
def recomputeDeal(item):
13917 kshitij.so 247
    """Lets recompute deal for this bundle"""
16019 kshitij.so 248
    print "Recomputing for bundleId %d" %(item.get('skuBundleId'))
15270 kshitij.so 249
    skuBundleId = item['skuBundleId']
13917 kshitij.so 250
 
19186 kshitij.so 251
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('netPriceAfterCashBack',pymongo.ASCENDING)]))
13917 kshitij.so 252
    bestPrice = float("inf")
253
    bestOne = None
254
    bestSellerPoints = 0
255
    toUpdate = []
16019 kshitij.so 256
    prepaidBestPrice = float("inf")
257
    prepaidBestOne = None
258
    prepaidBestSellerPoints = 0
13917 kshitij.so 259
    for similarItem in similarItems:
16019 kshitij.so 260
        if similarItem['codAvailable'] ==1:
261
            if mc.get("negative_deals") is None:
262
                populateNegativeDeals()
16174 kshitij.so 263
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 264
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
265
                continue
266
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
267
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
268
                continue
19186 kshitij.so 269
            if similarItem.get('netPriceAfterCashBack') < bestPrice:
16019 kshitij.so 270
                bestOne = similarItem
19186 kshitij.so 271
                bestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 272
                bestSellerPoints = similarItem['bestSellerPoints']
20347 kshitij.so 273
            elif similarItem.get('netPriceAfterCashBack') == bestPrice:
274
 
275
                try:
276
                    if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(bestOne['source_id']))):
277
                        continue
278
                except:
279
                    traceback.print_exc()
280
 
16019 kshitij.so 281
                bestOne = similarItem
19186 kshitij.so 282
                bestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 283
                bestSellerPoints = similarItem['bestSellerPoints']
284
            else:
285
                pass
13917 kshitij.so 286
        else:
16019 kshitij.so 287
            if mc.get("negative_deals") is None:
288
                populateNegativeDeals()
16174 kshitij.so 289
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 290
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
291
                continue
292
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
293
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
294
                continue
19186 kshitij.so 295
            if similarItem.get('netPriceAfterCashBack') < prepaidBestPrice:
16019 kshitij.so 296
                prepaidBestOne = similarItem
19186 kshitij.so 297
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 298
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
20347 kshitij.so 299
            elif similarItem.get('netPriceAfterCashBack') == prepaidBestPrice:
300
 
301
                try:
302
                    if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(bestOne['source_id']))):
303
                        continue
304
                except:
305
                    traceback.print_exc()
306
 
16019 kshitij.so 307
                prepaidBestOne = similarItem
19186 kshitij.so 308
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 309
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
310
            else:
311
                pass
16026 kshitij.so 312
    if bestOne is not None or prepaidBestOne is not None:
13917 kshitij.so 313
        for similarItem in similarItems:
314
            toUpdate.append(similarItem['_id'])
16026 kshitij.so 315
        if bestOne is not None:
316
            toUpdate.remove(bestOne['_id'])
317
            get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
318
        if prepaidBestOne is not None:
16070 kshitij.so 319
            if bestOne is not None:
19186 kshitij.so 320
                if prepaidBestOne.get('netPriceAfterCashBack') < bestOne.get('netPriceAfterCashBack'): 
16070 kshitij.so 321
                    toUpdate.remove(prepaidBestOne['_id'])
322
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
323
            else:
324
                toUpdate.remove(prepaidBestOne['_id'])
325
                get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13917 kshitij.so 326
    if len(toUpdate) > 0:
16019 kshitij.so 327
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
19186 kshitij.so 328
 
16026 kshitij.so 329
 
13828 kshitij.so 330
def main():
14180 kshitij.so 331
    populate()
13828 kshitij.so 332
 
333
if __name__=='__main__':
334
    main()