Subversion Repositories SmartDukaan

Rev

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