Subversion Repositories SmartDukaan

Rev

Rev 14729 | Rev 14748 | 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
14743 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()
14743 kshitij.so 245
        try:
246
            cashBack = getCashBack(similarItem['_id'], similarItem['source_id'], similarItem['category_id'], mc, 'localhost')
247
            if not cashBack or cashBack.get('cash_back_status')!=1:
248
                pass
249
            else:
250
                if cashBack['cash_back_type'] ==1:
251
                    similarItem['available_price'] = similarItem['available_price'] - similarItem['available_price'] * float(cashBack['cash_back'])/100
252
                elif cashBack['cash_back_type'] ==2:
253
                    similarItem['available_price'] = similarItem['available_price'] - float(cashBack['cash_back'])
254
                else:
255
                    pass
256
        except Exception as cashBackEx:
257
            print cashBackEx
258
            print "Error calculating cashback."
14332 kshitij.so 259
        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 260
            get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0 }})
261
            continue
262
        if similarItem['available_price'] < bestPrice:
263
            bestOne = similarItem
264
            bestPrice = similarItem['available_price']
265
            bestSellerPoints = similarItem['bestSellerPoints']
266
        elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
267
            bestOne = similarItem
268
            bestPrice = similarItem['available_price']
269
            bestSellerPoints = similarItem['bestSellerPoints']
270
        else:
271
            pass
272
    if bestOne is not None:
273
        for similarItem in similarItems:
274
            toUpdate.append(similarItem['_id'])
275
        toUpdate.remove(bestOne['_id'])
276
        get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1 }})
277
    if len(toUpdate) > 0:
278
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0 }},upsert=False, multi=True)
14342 kshitij.so 279
 
280
    print "Done with recomputing"
13829 kshitij.so 281
 
282
def getLatestPrice(skuBundleId, source_id):
283
    temp = []
284
    itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId,'source_id' : source_id}))
285
    for item in itemIds:
14309 kshitij.so 286
        item['dealFlag'] = 0
287
        item['dealType'] = 0
288
        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']}))
289
        if len(manualDeals) > 0:
290
            item['dealFlag'] = 1
291
            item['dealType'] =manualDeals[0]['dealType'] 
13829 kshitij.so 292
        temp.append(returnLatestPrice(item, source_id))
14367 kshitij.so 293
    try:
294
        thread = threading.Thread(target=recomputeDeal, args = (skuBundleId,))
295
        thread.daemon = True
296
        thread.start()    
297
    except:
298
        print "Unable to compute deal for ",skuBundleId
13829 kshitij.so 299
    return temp
300
 
13864 kshitij.so 301
def getLatestPriceById(id):
302
    item = list(get_mongo_connection().Catalog.MasterData.find({'_id':id}))
14309 kshitij.so 303
    item[0]['dealFlag'] = 0
304
    item[0]['dealType'] = 0
305
    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']}))
306
    if len(manualDeals) > 0:
307
        item[0]['dealFlag'] = 1
308
        item[0]['dealType'] =manualDeals[0]['dealType'] 
14367 kshitij.so 309
 
14431 kshitij.so 310
    info = returnLatestPrice(item[0], item[0]['source_id'])
14367 kshitij.so 311
    try:
312
        thread = threading.Thread(target=recomputeDeal, args = (item[0]['skuBundleId'],))
313
        thread.daemon = True
314
        thread.start()    
315
    except:
316
        print "Unable to compute deal for ",item[0]['skuBundleId']
14431 kshitij.so 317
    return info
13829 kshitij.so 318
 
319
 
320
def main():
14577 kshitij.so 321
    print "retuned %s"%(str(getLatestPrice(17, 2)))
13829 kshitij.so 322
 
323
if __name__=='__main__':
13971 kshitij.so 324
    main()
325