Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
13829 kshitij.so 1
import urllib2
2
import simplejson as json
3
import pymongo
4
from dtr.utils.utils import to_java_date
13918 kshitij.so 5
from datetime import datetime, timedelta
13829 kshitij.so 6
from operator import itemgetter
7
from dtr.utils.AmazonPriceOnlyScraper import AmazonScraper
14309 kshitij.so 8
from dtr.utils import AmazonDealScraper
14121 kshitij.so 9
from dtr.utils import FlipkartScraper,NewFlipkartScraper
14324 kshitij.so 10
from dtr.storage.MemCache import MemCache
14334 kshitij.so 11
from functools import partial
12
import threading
14760 kshitij.so 13
from dtr.utils.utils import getCashBack
13829 kshitij.so 14
 
14324 kshitij.so 15
mc = MemCache("127.0.0.1")
16
 
13829 kshitij.so 17
con = None
14205 kshitij.so 18
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4}
13829 kshitij.so 19
 
20
headers = { 
21
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
22
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
23
            'Accept-Language' : 'en-US,en;q=0.8',                     
24
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
25
        }
26
 
27
def get_mongo_connection(host='localhost', port=27017):
28
    global con
29
    if con is None:
30
        print "Establishing connection %s host and port %d" %(host,port)
31
        try:
32
            con = pymongo.MongoClient(host, port)
33
        except Exception, e:
34
            print e
35
            return None
36
    return con
37
 
38
def returnLatestPrice(data, source_id):
13918 kshitij.so 39
    now = datetime.now()
13829 kshitij.so 40
    if source_id == 1:
41
        try:
13918 kshitij.so 42
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 43
                return {}
13918 kshitij.so 44
 
14577 kshitij.so 45
            if data['dealFlag'] ==1 and data['dealType'] ==1:
46
                data['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(data['identifier'].strip())
47
 
13918 kshitij.so 48
            try:
14355 kshitij.so 49
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13918 kshitij.so 50
                    print "sku id is already updated",data['_id'] 
13920 kshitij.so 51
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':1,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13918 kshitij.so 52
            except:
53
                pass
54
 
55
 
13829 kshitij.so 56
            url = "http://www.amazon.in/gp/offer-listing/%s/ref=olp_sort_ps"%(data['identifier'])
57
            lowestPrice = 0.0
14309 kshitij.so 58
            try:
59
                if data['dealFlag'] ==1 and data['dealType'] ==1:
60
                    print "Inside deal"
61
                    deal_url = "http://www.amazon.in/dp/%s"%(data['identifier'].strip())
62
                    print deal_url
63
                    dealScraperAmazon = AmazonDealScraper.AmazonScraper()
64
                    lowestPrice = dealScraperAmazon.read(deal_url)
65
                    print lowestPrice
66
                    if lowestPrice == 0:
67
                        raise
68
                else:    
69
                    scraperAmazon = AmazonScraper()
70
                    lowestPrice = scraperAmazon.read(url)
71
            except Exception as e:
72
                print e
73
                scraperAmazon = AmazonScraper()
74
                lowestPrice = scraperAmazon.read(url)
13929 kshitij.so 75
            print "LowestPrice ",lowestPrice
13829 kshitij.so 76
            inStock = 0
77
            if lowestPrice > 0:
78
                inStock = 1
79
            if lowestPrice > 0:
13971 kshitij.so 80
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':inStock}}, multi=True)
14309 kshitij.so 81
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice , 'in_stock':inStock,'dealType':data['dealType']}}, multi=True)
13829 kshitij.so 82
            else:
13929 kshitij.so 83
                lowestPrice = data['available_price']
13977 kshitij.so 84
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':0,'priceUpdatedOn':to_java_date(now)}}, multi=True)
14309 kshitij.so 85
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0,'dealType':data['dealType']}}, multi=True)
13918 kshitij.so 86
 
13829 kshitij.so 87
            return {'_id':data['_id'],'available_price':lowestPrice,'in_stock':inStock,'source_id':1,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
88
        except:
13920 kshitij.so 89
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':1,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13829 kshitij.so 90
 
14203 kshitij.so 91
    elif source_id ==4:
14207 kshitij.so 92
 
14203 kshitij.so 93
        try:
14212 kshitij.so 94
            if data['identifier'] is None or len(data['identifier'].strip())==0:
95
                return {}
96
 
97
            try:
98
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
99
                    print "sku id is already updated",data['_id'] 
100
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':4,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
101
            except:
102
                pass
103
 
104
            url = "http://109.74.200.220:8080/mobileapi/dtr-pricing?id=%s"%(data['identifier'])
105
            lowestPrice = 0.0
106
            instock = 0
107
            req = urllib2.Request(url,headers=headers)
108
            response = urllib2.urlopen(req)
109
            json_input = response.read()
110
            response.close()
111
            priceInfo = json.loads(json_input)
112
            lowestPrice = priceInfo['response']['sellingPrice']
113
            if lowestPrice > 0:
114
                instock = 1
115
            if instock  == 1:
116
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':instock}}, multi=True)
117
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice , 'in_stock':instock}}, multi=True)
118
            else:
119
                lowestPrice = data['available_price']
120
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':instock,'priceUpdatedOn':to_java_date(now)}}, multi=True)
121
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':instock}}, multi=True)
122
 
123
            return {'_id':data['_id'],'available_price':lowestPrice,'in_stock':instock,'source_id':4,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
124
 
14207 kshitij.so 125
        except:
14212 kshitij.so 126
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':4,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
14203 kshitij.so 127
 
14207 kshitij.so 128
 
13829 kshitij.so 129
    elif source_id ==3:
130
        try:
13918 kshitij.so 131
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 132
                return {}
13918 kshitij.so 133
 
134
            try:
13975 kshitij.so 135
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13920 kshitij.so 136
                    print "sku id is already updated",data['_id']
137
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':3,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13919 kshitij.so 138
 
139
            except Exception as e:
13920 kshitij.so 140
                print "Exception snapdeal"
13919 kshitij.so 141
                print e
13918 kshitij.so 142
                pass
143
 
144
 
13829 kshitij.so 145
            url="http://www.snapdeal.com/acors/json/gvbps?supc=%s&catId=175&sort=sellingPrice"%(data['identifier'])
146
            req = urllib2.Request(url,headers=headers)
147
            response = urllib2.urlopen(req)
14210 kshitij.so 148
            json_input = response.read()
14188 kshitij.so 149
            response.close()
13829 kshitij.so 150
            vendorInfo = json.loads(json_input)
151
            lowestOfferPrice = 0
152
            inStock = 0
153
            for vendor in vendorInfo:
154
                lowestOfferPrice = float(vendor['sellingPrice'])
155
                stock = vendor['buyableInventory']
156
                if stock > 0 and lowestOfferPrice > 0:
157
                    inStock = 1
158
                    break
159
 
160
            print lowestOfferPrice
161
            print inStock
162
            print "*************"
163
            if inStock  == 1:
13971 kshitij.so 164
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':inStock}}, multi=True)
13918 kshitij.so 165
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice , 'in_stock':inStock}}, multi=True)
13829 kshitij.so 166
            else:
13929 kshitij.so 167
                lowestOfferPrice = data['available_price']
13977 kshitij.so 168
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':inStock,'priceUpdatedOn':to_java_date(now)}}, multi=True)
13918 kshitij.so 169
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock}}, multi=True)
170
 
13829 kshitij.so 171
            return {'_id':data['_id'],'available_price':lowestOfferPrice,'in_stock':inStock,'source_id':3,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
172
        except:
13920 kshitij.so 173
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':3,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13829 kshitij.so 174
 
175
    elif source_id == 2:
176
        try:
13918 kshitij.so 177
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 178
                return {}
13918 kshitij.so 179
 
180
            try:
13975 kshitij.so 181
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13918 kshitij.so 182
                    print "sku id is already updated",data['_id']
13920 kshitij.so 183
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':2,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']} 
13918 kshitij.so 184
            except:
185
                pass
186
 
187
            lowestSp = 0
188
            inStock = 0
14189 kshitij.so 189
            scraperProductPage = NewFlipkartScraper.FlipkartProductPageScraper()
14121 kshitij.so 190
            try:
191
                if data['marketPlaceUrl']!="" or data['marketPlaceUrl'] !="http://www.flipkart.com/ps/%s"%(data['identifier']):
192
                    result = scraperProductPage.read(data['marketPlaceUrl'])
14124 kshitij.so 193
                    print result
14125 kshitij.so 194
                    if result.get('lowestSp')!=0:
195
                        lowestSp = result.get('lowestSp')
14121 kshitij.so 196
                        inStock = result.get('inStock')
197
            except:
198
                print "Unable to scrape product page ",data['identifier']
199
            if lowestSp ==0:
200
                url = "http://www.flipkart.com/ps/%s"%(data['identifier'])
14189 kshitij.so 201
                scraperFk = FlipkartScraper.FlipkartScraper()
14121 kshitij.so 202
                vendorsData = scraperFk.read(url)
203
                sortedVendorsData = []
204
                sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
205
                print "data",sortedVendorsData
206
                for vData in sortedVendorsData:
207
                    lowestSp = vData['sellingPrice']
208
                    break
209
                if lowestSp > 0:
210
                    inStock = 1
13829 kshitij.so 211
            print lowestSp
212
            print inStock
213
            if lowestSp > 0:
13971 kshitij.so 214
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestSp,'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':inStock}}, multi=True)
13918 kshitij.so 215
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestSp , 'in_stock':inStock}}, multi=True)
13829 kshitij.so 216
            else:
13929 kshitij.so 217
                lowestSp = data['available_price']
13977 kshitij.so 218
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':inStock,'priceUpdatedOn':to_java_date(now)}}, multi=True)
13918 kshitij.so 219
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock}}, multi=True)
220
 
13829 kshitij.so 221
            return {'_id':data['_id'],'available_price':lowestSp,'in_stock':inStock,'source_id':2,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
14342 kshitij.so 222
 
13829 kshitij.so 223
        except:
13920 kshitij.so 224
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':2,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail']}
13829 kshitij.so 225
    else:
226
        return {}
13918 kshitij.so 227
 
14324 kshitij.so 228
 
229
def populateNegativeDeals():
230
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
231
    mc.set("negative_deals", negativeDeals, 600)
232
 
13918 kshitij.so 233
def recomputeDeal(skuBundleId):
234
    """Lets recompute deal for this bundle"""
235
    print "Recomputing for bundleId",skuBundleId
13829 kshitij.so 236
 
13918 kshitij.so 237
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('available_price',pymongo.ASCENDING)]))
238
    bestPrice = float("inf")
239
    bestOne = None
240
    bestSellerPoints = 0
241
    toUpdate = []
242
    for similarItem in similarItems:
14332 kshitij.so 243
        if mc.get("negative_deals") is None:
14324 kshitij.so 244
            populateNegativeDeals()
14332 kshitij.so 245
        if similarItem['in_stock'] == 0 or similarItem['maxprice'] is None or similarItem['maxprice'] < similarItem['available_price'] or similarItem['_id'] in mc.get("negative_deals"):
13918 kshitij.so 246
            get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0 }})
247
            continue
248
        if similarItem['available_price'] < bestPrice:
249
            bestOne = similarItem
250
            bestPrice = similarItem['available_price']
251
            bestSellerPoints = similarItem['bestSellerPoints']
252
        elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
253
            bestOne = similarItem
254
            bestPrice = similarItem['available_price']
255
            bestSellerPoints = similarItem['bestSellerPoints']
256
        else:
257
            pass
258
    if bestOne is not None:
259
        for similarItem in similarItems:
260
            toUpdate.append(similarItem['_id'])
261
        toUpdate.remove(bestOne['_id'])
262
        get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1 }})
263
    if len(toUpdate) > 0:
264
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0 }},upsert=False, multi=True)
14342 kshitij.so 265
 
266
    print "Done with recomputing"
13829 kshitij.so 267
 
268
def getLatestPrice(skuBundleId, source_id):
269
    temp = []
270
    itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId,'source_id' : source_id}))
271
    for item in itemIds:
14309 kshitij.so 272
        item['dealFlag'] = 0
273
        item['dealType'] = 0
274
        manualDeals = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':source_id, 'sku':item['_id']}))
275
        if len(manualDeals) > 0:
276
            item['dealFlag'] = 1
14760 kshitij.so 277
            item['dealType'] =manualDeals[0]['dealType']
278
        info = returnLatestPrice(item, source_id)
279
        try:
280
            cashBack = getCashBack(item['_id'], item['source_id'], item['category_id'], mc, 'localhost')
281
            if not cashBack or cashBack.get('cash_back_status')!=1:
282
                pass
283
            else:
284
                if cashBack['cash_back_type'] in (1,2):
285
                    info['cash_back_type'] = cashBack['cash_back_type']
286
                    info['cash_back'] = float(cashBack['cash_back'])
287
                else:
288
                    raise
289
        except Exception as cashBackEx:
290
            print cashBackEx
291
            print "Error calculating cashback."
292
            info['cash_back_type'] = 0
293
            info['cash_back'] = 0
294
        temp.append(info)
14367 kshitij.so 295
    try:
296
        thread = threading.Thread(target=recomputeDeal, args = (skuBundleId,))
297
        thread.daemon = True
298
        thread.start()    
299
    except:
300
        print "Unable to compute deal for ",skuBundleId
13829 kshitij.so 301
    return temp
302
 
13864 kshitij.so 303
def getLatestPriceById(id):
304
    item = list(get_mongo_connection().Catalog.MasterData.find({'_id':id}))
14309 kshitij.so 305
    item[0]['dealFlag'] = 0
306
    item[0]['dealType'] = 0
307
    manualDeals = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':item[0]['source_id'], 'sku':item[0]['_id']}))
308
    if len(manualDeals) > 0:
309
        item[0]['dealFlag'] = 1
310
        item[0]['dealType'] =manualDeals[0]['dealType'] 
14367 kshitij.so 311
 
14431 kshitij.so 312
    info = returnLatestPrice(item[0], item[0]['source_id'])
14367 kshitij.so 313
    try:
14760 kshitij.so 314
        cashBack = getCashBack(item['_id'], item['source_id'], item['category_id'], mc, 'localhost')
315
        if not cashBack or cashBack.get('cash_back_status')!=1:
316
            pass
317
        else:
318
            if cashBack['cash_back_type'] in (1,2):
319
                info['cash_back_type'] = cashBack['cash_back_type']
320
                info['cash_back'] = float(cashBack['cash_back'])
321
            else:
322
                raise
323
    except Exception as cashBackEx:
324
        print cashBackEx
325
        print "Error calculating cashback."
326
        info['cash_back_type'] = 0
327
        info['cash_back'] = 0
328
    try:
14367 kshitij.so 329
        thread = threading.Thread(target=recomputeDeal, args = (item[0]['skuBundleId'],))
330
        thread.daemon = True
331
        thread.start()    
332
    except:
333
        print "Unable to compute deal for ",item[0]['skuBundleId']
14431 kshitij.so 334
    return info
13829 kshitij.so 335
 
336
def main():
14577 kshitij.so 337
    print "retuned %s"%(str(getLatestPrice(17, 2)))
13829 kshitij.so 338
 
339
if __name__=='__main__':
13971 kshitij.so 340
    main()
341