Subversion Repositories SmartDukaan

Rev

Rev 14324 | Rev 14334 | 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
13829 kshitij.so 11
 
14324 kshitij.so 12
mc = MemCache("127.0.0.1")
13
 
13829 kshitij.so 14
con = None
14205 kshitij.so 15
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4}
13829 kshitij.so 16
 
17
headers = { 
18
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
19
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
20
            'Accept-Language' : 'en-US,en;q=0.8',                     
21
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
22
        }
23
 
24
def get_mongo_connection(host='localhost', port=27017):
25
    global con
26
    if con is None:
27
        print "Establishing connection %s host and port %d" %(host,port)
28
        try:
29
            con = pymongo.MongoClient(host, port)
30
        except Exception, e:
31
            print e
32
            return None
33
    return con
34
 
35
def returnLatestPrice(data, source_id):
13918 kshitij.so 36
    now = datetime.now()
13829 kshitij.so 37
    if source_id == 1:
38
        try:
13918 kshitij.so 39
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 40
                return {}
13918 kshitij.so 41
 
42
            try:
14309 kshitij.so 43
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=0)):
13918 kshitij.so 44
                    print "sku id is already updated",data['_id'] 
13920 kshitij.so 45
                    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 46
            except:
47
                pass
48
 
49
 
13829 kshitij.so 50
            url = "http://www.amazon.in/gp/offer-listing/%s/ref=olp_sort_ps"%(data['identifier'])
51
            lowestPrice = 0.0
14309 kshitij.so 52
            print data['dealFlag']
53
            print data['dealType']
54
            try:
55
                if data['dealFlag'] ==1 and data['dealType'] ==1:
56
                    print "Inside deal"
57
                    deal_url = "http://www.amazon.in/dp/%s"%(data['identifier'].strip())
58
                    print deal_url
59
                    dealScraperAmazon = AmazonDealScraper.AmazonScraper()
60
                    lowestPrice = dealScraperAmazon.read(deal_url)
61
                    print lowestPrice
62
                    if lowestPrice == 0:
63
                        raise
64
                else:    
65
                    scraperAmazon = AmazonScraper()
66
                    lowestPrice = scraperAmazon.read(url)
67
            except Exception as e:
68
                print e
69
                scraperAmazon = AmazonScraper()
70
                lowestPrice = scraperAmazon.read(url)
13929 kshitij.so 71
            print "LowestPrice ",lowestPrice
13829 kshitij.so 72
            inStock = 0
73
            if lowestPrice > 0:
74
                inStock = 1
75
            if lowestPrice > 0:
13971 kshitij.so 76
                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 77
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice , 'in_stock':inStock,'dealType':data['dealType']}}, multi=True)
13829 kshitij.so 78
            else:
13929 kshitij.so 79
                lowestPrice = data['available_price']
13977 kshitij.so 80
                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 81
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0,'dealType':data['dealType']}}, multi=True)
13918 kshitij.so 82
 
83
            try:    
84
                recomputeDeal(data['skuBundleId'])
85
            except:
86
                print "Unable to compute deal for ",data['skuBundleId']
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
            try:    
125
                recomputeDeal(data['skuBundleId'])
126
            except:
127
                print "Unable to compute deal for ",data['skuBundleId']
128
 
129
            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']}
130
 
14207 kshitij.so 131
        except:
14212 kshitij.so 132
            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 133
 
14207 kshitij.so 134
 
13829 kshitij.so 135
    elif source_id ==3:
136
        try:
13918 kshitij.so 137
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 138
                return {}
13918 kshitij.so 139
 
140
            try:
13975 kshitij.so 141
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13920 kshitij.so 142
                    print "sku id is already updated",data['_id']
143
                    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 144
 
145
            except Exception as e:
13920 kshitij.so 146
                print "Exception snapdeal"
13919 kshitij.so 147
                print e
13918 kshitij.so 148
                pass
149
 
150
 
13829 kshitij.so 151
            url="http://www.snapdeal.com/acors/json/gvbps?supc=%s&catId=175&sort=sellingPrice"%(data['identifier'])
152
            req = urllib2.Request(url,headers=headers)
153
            response = urllib2.urlopen(req)
14210 kshitij.so 154
            json_input = response.read()
14188 kshitij.so 155
            response.close()
13829 kshitij.so 156
            vendorInfo = json.loads(json_input)
157
            lowestOfferPrice = 0
158
            inStock = 0
159
            for vendor in vendorInfo:
160
                lowestOfferPrice = float(vendor['sellingPrice'])
161
                stock = vendor['buyableInventory']
162
                if stock > 0 and lowestOfferPrice > 0:
163
                    inStock = 1
164
                    break
165
 
166
            print lowestOfferPrice
167
            print inStock
168
            print "*************"
169
            if inStock  == 1:
13971 kshitij.so 170
                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 171
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice , 'in_stock':inStock}}, multi=True)
13829 kshitij.so 172
            else:
13929 kshitij.so 173
                lowestOfferPrice = data['available_price']
13977 kshitij.so 174
                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 175
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock}}, multi=True)
176
 
177
            try:    
178
                recomputeDeal(data['skuBundleId'])
179
            except:
180
                print "Unable to compute deal for ",data['skuBundleId']
181
 
13829 kshitij.so 182
            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']}
183
        except:
13920 kshitij.so 184
            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 185
 
186
    elif source_id == 2:
187
        try:
13918 kshitij.so 188
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 189
                return {}
13918 kshitij.so 190
 
191
            try:
13975 kshitij.so 192
                if data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13918 kshitij.so 193
                    print "sku id is already updated",data['_id']
13920 kshitij.so 194
                    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 195
            except:
196
                pass
197
 
198
            lowestSp = 0
199
            inStock = 0
14189 kshitij.so 200
            scraperProductPage = NewFlipkartScraper.FlipkartProductPageScraper()
14121 kshitij.so 201
            try:
202
                if data['marketPlaceUrl']!="" or data['marketPlaceUrl'] !="http://www.flipkart.com/ps/%s"%(data['identifier']):
203
                    result = scraperProductPage.read(data['marketPlaceUrl'])
14124 kshitij.so 204
                    print result
14125 kshitij.so 205
                    if result.get('lowestSp')!=0:
206
                        lowestSp = result.get('lowestSp')
14121 kshitij.so 207
                        inStock = result.get('inStock')
208
            except:
209
                print "Unable to scrape product page ",data['identifier']
210
            if lowestSp ==0:
211
                url = "http://www.flipkart.com/ps/%s"%(data['identifier'])
14189 kshitij.so 212
                scraperFk = FlipkartScraper.FlipkartScraper()
14121 kshitij.so 213
                vendorsData = scraperFk.read(url)
214
                sortedVendorsData = []
215
                sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
216
                print "data",sortedVendorsData
217
                for vData in sortedVendorsData:
218
                    lowestSp = vData['sellingPrice']
219
                    break
220
                if lowestSp > 0:
221
                    inStock = 1
13829 kshitij.so 222
            print lowestSp
223
            print inStock
224
            if lowestSp > 0:
13971 kshitij.so 225
                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 226
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestSp , 'in_stock':inStock}}, multi=True)
13829 kshitij.so 227
            else:
13929 kshitij.so 228
                lowestSp = data['available_price']
13977 kshitij.so 229
                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 230
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock}}, multi=True)
231
 
232
 
233
            try:    
234
                recomputeDeal(data['skuBundleId'])
235
            except:
236
                print "Unable to compute deal for ",data['skuBundleId']
237
 
13829 kshitij.so 238
            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']}
239
        except:
13920 kshitij.so 240
            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 241
    else:
242
        return {}
13918 kshitij.so 243
 
14324 kshitij.so 244
 
245
def populateNegativeDeals():
246
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
247
    mc.set("negative_deals", negativeDeals, 600)
248
 
13918 kshitij.so 249
def recomputeDeal(skuBundleId):
250
    """Lets recompute deal for this bundle"""
251
    print "Recomputing for bundleId",skuBundleId
13829 kshitij.so 252
 
13918 kshitij.so 253
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('available_price',pymongo.ASCENDING)]))
254
    bestPrice = float("inf")
255
    bestOne = None
256
    bestSellerPoints = 0
257
    toUpdate = []
258
    for similarItem in similarItems:
14332 kshitij.so 259
        if mc.get("negative_deals") is None:
14324 kshitij.so 260
            populateNegativeDeals()
14332 kshitij.so 261
        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 262
            get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0 }})
263
            continue
264
        if similarItem['available_price'] < bestPrice:
265
            bestOne = similarItem
266
            bestPrice = similarItem['available_price']
267
            bestSellerPoints = similarItem['bestSellerPoints']
268
        elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
269
            bestOne = similarItem
270
            bestPrice = similarItem['available_price']
271
            bestSellerPoints = similarItem['bestSellerPoints']
272
        else:
273
            pass
274
    if bestOne is not None:
275
        for similarItem in similarItems:
276
            toUpdate.append(similarItem['_id'])
277
        toUpdate.remove(bestOne['_id'])
278
        get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1 }})
279
    if len(toUpdate) > 0:
280
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0 }},upsert=False, multi=True)
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))
293
    return temp
294
 
13864 kshitij.so 295
def getLatestPriceById(id):
296
    item = list(get_mongo_connection().Catalog.MasterData.find({'_id':id}))
14309 kshitij.so 297
    item[0]['dealFlag'] = 0
298
    item[0]['dealType'] = 0
299
    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']}))
300
    if len(manualDeals) > 0:
301
        item[0]['dealFlag'] = 1
302
        item[0]['dealType'] =manualDeals[0]['dealType'] 
13866 kshitij.so 303
    return returnLatestPrice(item[0], item[0]['source_id'])
13829 kshitij.so 304
 
305
 
306
def main():
14309 kshitij.so 307
    print getLatestPriceById(22746)
13829 kshitij.so 308
 
309
if __name__=='__main__':
13971 kshitij.so 310
    main()
311
 
312
"""21.06$"""