Subversion Repositories SmartDukaan

Rev

Rev 17297 | Rev 19212 | 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
14705 kshitij.so 11
from dtr.utils.utils import getCashBack
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)
19186 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']
19186 kshitij.so 273
            elif similarItem.get('netPriceAfterCashBack') == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
16019 kshitij.so 274
                bestOne = similarItem
19186 kshitij.so 275
                bestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 276
                bestSellerPoints = similarItem['bestSellerPoints']
277
            else:
278
                pass
13917 kshitij.so 279
        else:
16019 kshitij.so 280
            if mc.get("negative_deals") is None:
281
                populateNegativeDeals()
16174 kshitij.so 282
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 283
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
284
                continue
285
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
286
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
287
                continue
19186 kshitij.so 288
            if similarItem.get('netPriceAfterCashBack') < prepaidBestPrice:
16019 kshitij.so 289
                prepaidBestOne = similarItem
19186 kshitij.so 290
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 291
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
19186 kshitij.so 292
            elif similarItem.get('netPriceAfterCashBack') == prepaidBestPrice and prepaidBestSellerPoints < similarItem['bestSellerPoints']:
16019 kshitij.so 293
                prepaidBestOne = similarItem
19186 kshitij.so 294
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 295
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
296
            else:
297
                pass
16026 kshitij.so 298
    if bestOne is not None or prepaidBestOne is not None:
13917 kshitij.so 299
        for similarItem in similarItems:
300
            toUpdate.append(similarItem['_id'])
16026 kshitij.so 301
        if bestOne is not None:
302
            toUpdate.remove(bestOne['_id'])
303
            get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
304
        if prepaidBestOne is not None:
16070 kshitij.so 305
            if bestOne is not None:
19186 kshitij.so 306
                if prepaidBestOne.get('netPriceAfterCashBack') < bestOne.get('netPriceAfterCashBack'): 
16070 kshitij.so 307
                    toUpdate.remove(prepaidBestOne['_id'])
308
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
309
            else:
310
                toUpdate.remove(prepaidBestOne['_id'])
311
                get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13917 kshitij.so 312
    if len(toUpdate) > 0:
16019 kshitij.so 313
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
19186 kshitij.so 314
 
16026 kshitij.so 315
 
13828 kshitij.so 316
def main():
14180 kshitij.so 317
    populate()
13828 kshitij.so 318
 
319
if __name__=='__main__':
320
    main()