Subversion Repositories SmartDukaan

Rev

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