Subversion Repositories SmartDukaan

Rev

Rev 16174 | Rev 16502 | 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
 
16019 kshitij.so 28
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5}
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
ignoreItems = [24291, 24102, 24101]
38
 
14254 kshitij.so 39
def get_mongo_connection(host=options.mongoHost, port=27017):
13828 kshitij.so 40
    global con
41
    if con is None:
42
        print "Establishing connection %s host and port %d" %(host,port)
43
        try:
44
            con = pymongo.MongoClient(host, port)
45
        except Exception, e:
46
            print e
47
            return None
48
    return con
49
 
14180 kshitij.so 50
def populate():
51
    toScrapMap = {}
14132 kshitij.so 52
    bestSellers = list(get_mongo_connection().Catalog.MasterData.find({'rank':{'$gt':0}}))
53
    for bestSeller in bestSellers: 
54
        snapdealBestSellers = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':bestSeller['skuBundleId'],'source_id':3}))
55
        for data in snapdealBestSellers:
14180 kshitij.so 56
            if not toScrapMap.has_key(data['_id']):
15270 kshitij.so 57
                data['dealFlag'] = 0
58
                data['dealType'] = 0
59
                data['dealPoints'] = 0
60
                data['manualDealThresholdPrice'] = None
14180 kshitij.so 61
                toScrapMap[data['_id']] = data
16174 kshitij.so 62
    dealFlagged = list(get_mongo_connection().Catalog.Deals.find({'source_id':3,'showDeal':1,'totalPoints':{'$gt':-100}}))
14252 kshitij.so 63
    for deal in dealFlagged:
64
        if not toScrapMap.has_key(deal['_id']):
14261 kshitij.so 65
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
15270 kshitij.so 66
            data[0]['dealFlag'] = 0
67
            data[0]['dealType'] = 0
68
            data[0]['dealPoints'] = 0
69
            data[0]['manualDealThresholdPrice'] = None
14261 kshitij.so 70
            toScrapMap[deal['_id']] = data[0]
15270 kshitij.so 71
    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}))
72
    for manualDeal in manualDeals:
73
        if not toScrapMap.has_key(manualDeal['sku']):
74
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':manualDeal['sku']}))
75
            if len(data) > 0:
76
                data[0]['dealFlag'] = 1
77
                data[0]['dealType'] = manualDeal['dealType']
78
                data[0]['dealPoints'] = manualDeal['dealPoints']
79
                data[0]['manualDealThresholdPrice'] = manualDeal['dealThresholdPrice']
80
                toScrapMap[manualDeal['sku']] = data[0]
81
        else:
82
            data = toScrapMap.get(manualDeal['sku'])
83
            data['dealFlag'] = 1
84
            data['dealType'] = manualDeal['dealType']
85
            data['dealPoints'] = manualDeal['dealPoints']
86
            data['manualDealThresholdPrice'] = manualDeal['dealThresholdPrice']
16019 kshitij.so 87
    for val in toScrapMap.values():
88
        updatePrices(val)
89
#    pool = ThreadPool(cpu_count() *2)
90
#    offset = 0
91
#    limit =100
92
#    while(offset<=len(toScrapMap.values())):
93
#        pool.map(updatePrices,toScrapMap.values()[offset:offset+limit])
94
#        offset = offset + limit
95
#    pool.close()
96
#    pool.join()
97
#    print "joining threads at %s"%(str(datetime.now()))
14180 kshitij.so 98
 
99
 
100
def updatePrices(data):
16429 kshitij.so 101
    if data['_id'] in ignoreItems:
102
        print "Ignored items returning for %d"%(data['_id'])
103
        return
14180 kshitij.so 104
    if data['source_id']!=3:
105
        return
106
    print data['identifier']
107
    if data['identifier'] is None or len(data['identifier'].strip())==0:
108
        print "returning"
109
        return
110
 
111
    try:
112
        if data['priceUpdatedOn'] > to_java_date(datetime.now() - timedelta(minutes=5)):
113
            print "sku id is already updated",data['_id'] 
114
            return
115
    except:
116
        pass
117
 
15823 kshitij.so 118
    url="http://www.snapdeal.com/acors/json/v2/gvbps?supc=%s&catUrl=&bn=&catId=175&start=0&count=10000"%(data['identifier'].strip())
14180 kshitij.so 119
    print url
120
    lowestOfferPrice = 0
121
    instock = 0
15270 kshitij.so 122
    buyBoxPrice = 0
123
    isBuyBox = 1
124
    stock = 0
15820 kshitij.so 125
    try:
16019 kshitij.so 126
        req = urllib2.Request(url,headers=headers)
127
        response = urllib2.urlopen(req)
16085 kshitij.so 128
        snapdeal_data = response.read()
16087 kshitij.so 129
        response.close()
16019 kshitij.so 130
    except:
131
        print "Unable to scrape %d"%(data['_id'])
16087 kshitij.so 132
        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())}})
133
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0}})
16019 kshitij.so 134
        return
16085 kshitij.so 135
    encoding =  chardet.detect(snapdeal_data)
16019 kshitij.so 136
    try:
16085 kshitij.so 137
        snapdeal_data = snapdeal_data.decode(encoding.get('encoding'))
15820 kshitij.so 138
    except:
16429 kshitij.so 139
        snapdeal_data = snapdeal_data.decode('latin-1')
16085 kshitij.so 140
    try:
141
        vendorInfo = json.loads(snapdeal_data)
142
    except:
16086 kshitij.so 143
        print "Unable to load json for %d"%(data['_id'])
15820 kshitij.so 144
        return
15270 kshitij.so 145
 
15820 kshitij.so 146
    try:
147
        buyBoxStock = vendorInfo['primaryVendor']['buyableInventory']
148
        if buyBoxStock >0:
149
            buyBoxPrice = vendorInfo['primaryVendor']['sellingPrice']
150
    except:
151
        pass
152
 
153
    sortedVendorsData = sorted(vendorInfo['vendors'], key=itemgetter('sellingPrice'))
154
    for sortedVendorData in sortedVendorsData:
155
        lowestOfferPrice = float(sortedVendorData['sellingPrice'])
156
        try:
157
            stock = sortedVendorData['buyableInventory']
158
        except:
159
            pass
160
        if stock > 0 and lowestOfferPrice > 0:
161
            instock = 1
162
            break
163
    if buyBoxPrice != lowestOfferPrice:
164
        isBuyBox = 0
165
 
14180 kshitij.so 166
    print lowestOfferPrice
167
    print instock
14181 kshitij.so 168
    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 169
    print "*************"
170
    if instock  == 1:
15270 kshitij.so 171
        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)
16019 kshitij.so 172
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice , 'in_stock':instock,'codAvailable':data['codAvailable']}}, multi=True)
14180 kshitij.so 173
    else:
15270 kshitij.so 174
        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)
16019 kshitij.so 175
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':instock,'codAvailable':data['codAvailable']}})
14180 kshitij.so 176
 
177
    try:
15270 kshitij.so 178
        recomputeDeal(data)
14180 kshitij.so 179
    except:
180
        print "Unable to compute deal for ",data['skuBundleId']
181
 
14325 kshitij.so 182
 
183
def populateNegativeDeals():
184
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
15270 kshitij.so 185
    mc.set("negative_deals", negativeDeals, 600)
186
 
187
def recomputePoints(item, deal):
188
    try:
189
        nlcPoints = getNlcPoints(item, deal['minNlc'], deal['maxNlc'], deal['available_price'])
190
    except:
191
        traceback.print_exc()
192
        nlcPoints = deal['nlcPoints']
193
    if item['manualDealThresholdPrice'] >= deal['available_price']:
194
        dealPoints = item['dealPoints']
195
    else:
196
        dealPoints = 0
197
    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']}})
198
 
14180 kshitij.so 199
 
15270 kshitij.so 200
def recomputeDeal(item):
13917 kshitij.so 201
    """Lets recompute deal for this bundle"""
16019 kshitij.so 202
    print "Recomputing for bundleId %d" %(item.get('skuBundleId'))
15270 kshitij.so 203
    skuBundleId = item['skuBundleId']
13917 kshitij.so 204
 
205
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('available_price',pymongo.ASCENDING)]))
206
    bestPrice = float("inf")
207
    bestOne = None
208
    bestSellerPoints = 0
209
    toUpdate = []
16019 kshitij.so 210
    prepaidBestPrice = float("inf")
211
    prepaidBestOne = None
212
    prepaidBestSellerPoints = 0
13917 kshitij.so 213
    for similarItem in similarItems:
15270 kshitij.so 214
        if similarItem['_id'] == item['_id']:
215
            try:
216
                recomputePoints(item, similarItem)
217
            except:
218
                traceback.print_exc()
16019 kshitij.so 219
        if similarItem['codAvailable'] ==1:
220
            if mc.get("negative_deals") is None:
221
                populateNegativeDeals()
16174 kshitij.so 222
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 223
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
224
                continue
225
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
226
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
227
                continue
228
            if similarItem['available_price'] < bestPrice:
229
                bestOne = similarItem
230
                bestPrice = similarItem['available_price']
231
                bestSellerPoints = similarItem['bestSellerPoints']
232
            elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
233
                bestOne = similarItem
234
                bestPrice = similarItem['available_price']
235
                bestSellerPoints = similarItem['bestSellerPoints']
236
            else:
237
                pass
13917 kshitij.so 238
        else:
16019 kshitij.so 239
            if mc.get("negative_deals") is None:
240
                populateNegativeDeals()
16174 kshitij.so 241
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 242
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
243
                continue
244
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
245
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
246
                continue
247
            if similarItem['available_price'] < prepaidBestPrice:
248
                prepaidBestOne = similarItem
249
                prepaidBestPrice = similarItem['available_price']
250
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
251
            elif similarItem['available_price'] == prepaidBestPrice and prepaidBestSellerPoints < similarItem['bestSellerPoints']:
252
                prepaidBestOne = similarItem
253
                prepaidBestPrice = similarItem['available_price']
254
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
255
            else:
256
                pass
16026 kshitij.so 257
    if bestOne is not None or prepaidBestOne is not None:
13917 kshitij.so 258
        for similarItem in similarItems:
259
            toUpdate.append(similarItem['_id'])
16026 kshitij.so 260
        if bestOne is not None:
261
            toUpdate.remove(bestOne['_id'])
262
            get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
263
        if prepaidBestOne is not None:
16070 kshitij.so 264
            if bestOne is not None:
265
                if prepaidBestOne['available_price'] < bestOne['available_price']: 
266
                    toUpdate.remove(prepaidBestOne['_id'])
267
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
268
            else:
269
                toUpdate.remove(prepaidBestOne['_id'])
270
                get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13917 kshitij.so 271
    if len(toUpdate) > 0:
16019 kshitij.so 272
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
16026 kshitij.so 273
 
13828 kshitij.so 274
def main():
14180 kshitij.so 275
    populate()
13828 kshitij.so 276
 
277
if __name__=='__main__':
278
    main()