Subversion Repositories SmartDukaan

Rev

Rev 16026 | Rev 16069 | 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
15951 kshitij.so 4
from dtr.utils.utils import to_java_date, getNlcPoints, transformUrl
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
15902 kshitij.so 9
from dtr.utils import FlipkartScraper,NewFlipkartScraper, ShopCluesScraper
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
15174 kshitij.so 15
from shop2020.config.client.ConfigClient import ConfigClient
16065 kshitij.so 16
import chardet
13829 kshitij.so 17
 
15174 kshitij.so 18
config_client = ConfigClient()
19
host_memCache = config_client.get_property('mem_cache_host_dtr')
20
host = config_client.get_property('mongo_dtr_host')
14324 kshitij.so 21
 
15174 kshitij.so 22
mc = MemCache(host_memCache)
23
 
24
 
15902 kshitij.so 25
con  = None
26
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5}
13829 kshitij.so 27
 
28
headers = { 
29
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
30
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
31
            'Accept-Language' : 'en-US,en;q=0.8',                     
32
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
33
        }
34
 
15902 kshitij.so 35
ignoreItems = []
15608 kshitij.so 36
 
15174 kshitij.so 37
def get_mongo_connection(port=27017):
13829 kshitij.so 38
    global con
39
    if con is None:
40
        print "Establishing connection %s host and port %d" %(host,port)
41
        try:
42
            con = pymongo.MongoClient(host, port)
43
        except Exception, e:
44
            print e
45
            return None
46
    return con
47
 
14828 kshitij.so 48
def returnLatestPrice(data, source_id, ignoreLastUpdated = True):
13918 kshitij.so 49
    now = datetime.now()
13829 kshitij.so 50
    if source_id == 1:
51
        try:
13918 kshitij.so 52
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 53
                return {}
13918 kshitij.so 54
 
15615 kshitij.so 55
            if data['_id'] in ignoreItems:
56
                print "Ignored items returning for %d"%(data['_id'])
15913 kshitij.so 57
                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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
15615 kshitij.so 58
 
59
 
14577 kshitij.so 60
            if data['dealFlag'] ==1 and data['dealType'] ==1:
61
                data['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(data['identifier'].strip())
62
 
13918 kshitij.so 63
            try:
14828 kshitij.so 64
                if ignoreLastUpdated and data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13918 kshitij.so 65
                    print "sku id is already updated",data['_id'] 
15913 kshitij.so 66
                    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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
13918 kshitij.so 67
            except:
68
                pass
69
 
70
 
15956 kshitij.so 71
            url = "http://www.amazon.in/gp/aw/ol/%s?o=New&op=1"%(data['identifier'])
13829 kshitij.so 72
            lowestPrice = 0.0
14309 kshitij.so 73
            try:
74
                if data['dealFlag'] ==1 and data['dealType'] ==1:
75
                    print "Inside deal"
76
                    deal_url = "http://www.amazon.in/dp/%s"%(data['identifier'].strip())
77
                    print deal_url
15213 kshitij.so 78
                    dealScraperAmazon = AmazonDealScraper.AmazonScraper(True)
14309 kshitij.so 79
                    lowestPrice = dealScraperAmazon.read(deal_url)
80
                    print lowestPrice
81
                    if lowestPrice == 0:
82
                        raise
83
                else:    
15213 kshitij.so 84
                    scraperAmazon = AmazonScraper(True)
14309 kshitij.so 85
                    lowestPrice = scraperAmazon.read(url)
86
            except Exception as e:
87
                print e
15213 kshitij.so 88
                scraperAmazon = AmazonScraper(True)
14309 kshitij.so 89
                lowestPrice = scraperAmazon.read(url)
13929 kshitij.so 90
            print "LowestPrice ",lowestPrice
13829 kshitij.so 91
            inStock = 0
92
            if lowestPrice > 0:
93
                inStock = 1
94
            if lowestPrice > 0:
13971 kshitij.so 95
                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)
16024 kshitij.so 96
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice , 'in_stock':inStock,'dealType':data['dealType'],'codAvailable':data['codAvailable']}}, multi=True)
13829 kshitij.so 97
            else:
13929 kshitij.so 98
                lowestPrice = data['available_price']
13977 kshitij.so 99
                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)
16024 kshitij.so 100
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0,'dealType':data['dealType'],'codAvailable':data['codAvailable']}}, multi=True)
13918 kshitij.so 101
 
15913 kshitij.so 102
            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'], 'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
14834 kshitij.so 103
        except Exception as e:
104
            print "Exception for _id %d and source %s"%(data['_id'], source_id)
105
            print e
15913 kshitij.so 106
            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'], 'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
13829 kshitij.so 107
 
14203 kshitij.so 108
    elif source_id ==4:
14207 kshitij.so 109
 
14203 kshitij.so 110
        try:
14212 kshitij.so 111
            if data['identifier'] is None or len(data['identifier'].strip())==0:
112
                return {}
113
 
114
            try:
14828 kshitij.so 115
                if ignoreLastUpdated and data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
14212 kshitij.so 116
                    print "sku id is already updated",data['_id'] 
15913 kshitij.so 117
                    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'], 'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
14212 kshitij.so 118
            except:
119
                pass
120
 
14840 kshitij.so 121
            url = "http://50.116.3.101:8080/mobileapi/dtr-pricing?id=%s"%(data['identifier'])
14212 kshitij.so 122
            lowestPrice = 0.0
123
            instock = 0
124
            req = urllib2.Request(url,headers=headers)
125
            response = urllib2.urlopen(req)
126
            json_input = response.read()
127
            response.close()
128
            priceInfo = json.loads(json_input)
129
            lowestPrice = priceInfo['response']['sellingPrice']
130
            if lowestPrice > 0:
131
                instock = 1
132
            if instock  == 1:
133
                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)
16024 kshitij.so 134
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestPrice , 'in_stock':instock,'codAvailable':data['codAvailable']}}, multi=True)
14212 kshitij.so 135
            else:
136
                lowestPrice = data['available_price']
137
                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)
16024 kshitij.so 138
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':instock,'codAvailable':data['codAvailable']}}, multi=True)
14212 kshitij.so 139
 
15913 kshitij.so 140
            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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
14834 kshitij.so 141
 
142
        except Exception as e:
143
            print "Exception for _id %d and source %s"%(data['_id'], source_id)
144
            print e
15913 kshitij.so 145
            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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
14203 kshitij.so 146
 
14207 kshitij.so 147
 
13829 kshitij.so 148
    elif source_id ==3:
149
        try:
13918 kshitij.so 150
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 151
                return {}
13918 kshitij.so 152
 
153
            try:
14828 kshitij.so 154
                if ignoreLastUpdated and data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13920 kshitij.so 155
                    print "sku id is already updated",data['_id']
15913 kshitij.so 156
                    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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
13919 kshitij.so 157
 
158
            except Exception as e:
13920 kshitij.so 159
                print "Exception snapdeal"
13919 kshitij.so 160
                print e
13918 kshitij.so 161
 
15819 kshitij.so 162
            url="http://www.snapdeal.com/acors/json/v2/gvbps?supc=%s&catUrl=&bn=&catId=175&start=0&count=10000"%(data['identifier'])
13829 kshitij.so 163
            req = urllib2.Request(url,headers=headers)
164
            response = urllib2.urlopen(req)
16065 kshitij.so 165
            snapdeal_data = response.read()
166
            encoding =  chardet.detect(snapdeal_data)
167
            try:
168
                snapdeal_data = snapdeal_data.decode(encoding.get('encoding'))
169
            except:
170
                snapdeal_data = snapdeal_data.decode(encoding.get('latin-1'))
171
            vendorInfo = json.loads(snapdeal_data)
14188 kshitij.so 172
            response.close()
13829 kshitij.so 173
            lowestOfferPrice = 0
174
            inStock = 0
15253 kshitij.so 175
            buyBoxPrice = 0
176
            isBuyBox = 1
15819 kshitij.so 177
            try:
178
                buyBoxStock = vendorInfo['primaryVendor']['buyableInventory']
179
                if buyBoxStock >0:
180
                    buyBoxPrice = vendorInfo['primaryVendor']['sellingPrice']
181
            except:
182
                pass
16065 kshitij.so 183
            print "buy box stock ",buyBoxStock
184
            print "bux box price ",buyBoxPrice
15819 kshitij.so 185
            sortedVendorsData = sorted(vendorInfo['vendors'], key=itemgetter('sellingPrice'))
15253 kshitij.so 186
            for sortedVendorData in sortedVendorsData:
187
                lowestOfferPrice = float(sortedVendorData['sellingPrice'])
188
                try:
189
                    stock = sortedVendorData['buyableInventory']
190
                except:
191
                    stock = 0
13829 kshitij.so 192
                if stock > 0 and lowestOfferPrice > 0:
193
                    inStock = 1
194
                    break
195
 
196
            print lowestOfferPrice
197
            print inStock
198
            print "*************"
15253 kshitij.so 199
 
200
            if buyBoxPrice != lowestOfferPrice:
201
                isBuyBox = 0
202
 
13829 kshitij.so 203
            if inStock  == 1:
15253 kshitij.so 204
                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,'buyBoxFlag':isBuyBox}}, multi=True)
16024 kshitij.so 205
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice , 'in_stock':inStock,'codAvailable':data['codAvailable']}}, multi=True)
13829 kshitij.so 206
            else:
13929 kshitij.so 207
                lowestOfferPrice = data['available_price']
15253 kshitij.so 208
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':inStock,'priceUpdatedOn':to_java_date(now),'buyBoxFlag':isBuyBox}}, multi=True)
16024 kshitij.so 209
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock,'codAvailable':data['codAvailable']}}, multi=True)
13918 kshitij.so 210
 
15913 kshitij.so 211
            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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
14834 kshitij.so 212
        except Exception as e:
15266 kshitij.so 213
            print traceback.print_exc()
14834 kshitij.so 214
            print "Exception for _id %d and source %s"%(data['_id'], source_id)
215
            print e
15913 kshitij.so 216
            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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
13829 kshitij.so 217
 
218
    elif source_id == 2:
219
        try:
13918 kshitij.so 220
            if data['identifier'] is None or len(data['identifier'].strip())==0:
13829 kshitij.so 221
                return {}
13918 kshitij.so 222
 
15609 kshitij.so 223
            if data['_id'] in ignoreItems:
15608 kshitij.so 224
                print "Ignored items returning for %d"%(data['_id'])
15913 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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
15608 kshitij.so 226
 
13918 kshitij.so 227
            try:
14828 kshitij.so 228
                if ignoreLastUpdated and data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
13918 kshitij.so 229
                    print "sku id is already updated",data['_id']
15913 kshitij.so 230
                    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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']} 
13918 kshitij.so 231
            except:
232
                pass
233
 
234
            lowestSp = 0
235
            inStock = 0
15253 kshitij.so 236
            buyBoxPrice = 0
237
            isBuyBox = 0
14189 kshitij.so 238
            scraperProductPage = NewFlipkartScraper.FlipkartProductPageScraper()
14121 kshitij.so 239
            try:
240
                if data['marketPlaceUrl']!="" or data['marketPlaceUrl'] !="http://www.flipkart.com/ps/%s"%(data['identifier']):
241
                    result = scraperProductPage.read(data['marketPlaceUrl'])
14124 kshitij.so 242
                    print result
14125 kshitij.so 243
                    if result.get('lowestSp')!=0:
244
                        lowestSp = result.get('lowestSp')
14121 kshitij.so 245
                        inStock = result.get('inStock')
15253 kshitij.so 246
                        buyBoxPrice = result.get('buyBoxPrice')
14121 kshitij.so 247
            except:
248
                print "Unable to scrape product page ",data['identifier']
249
            if lowestSp ==0:
250
                url = "http://www.flipkart.com/ps/%s"%(data['identifier'])
14189 kshitij.so 251
                scraperFk = FlipkartScraper.FlipkartScraper()
15253 kshitij.so 252
                vendorsData, buyBoxInfo = (scraperFk.read(url))
14121 kshitij.so 253
                sortedVendorsData = []
254
                sortedVendorsData = sorted(vendorsData, key=itemgetter('sellingPrice'))
255
                print "data",sortedVendorsData
256
                for vData in sortedVendorsData:
257
                    lowestSp = vData['sellingPrice']
258
                    break
259
                if lowestSp > 0:
260
                    inStock = 1
15975 kshitij.so 261
                try:
262
                    buyBoxPrice = buyBoxInfo[0].get('sellingPrice')
263
                except:
264
                    buyBoxPrice = None
13829 kshitij.so 265
            print lowestSp
266
            print inStock
15253 kshitij.so 267
            if buyBoxPrice is not None and buyBoxPrice == lowestSp:
268
                isBuyBox = 1
13829 kshitij.so 269
            if lowestSp > 0:
15253 kshitij.so 270
                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,'buyBoxFlag':isBuyBox}}, multi=True)
16024 kshitij.so 271
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestSp , 'in_stock':inStock,'codAvailable':data['codAvailable']}}, multi=True)
13829 kshitij.so 272
            else:
13929 kshitij.so 273
                lowestSp = data['available_price']
15253 kshitij.so 274
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':inStock,'priceUpdatedOn':to_java_date(now),'buyBoxFlag':isBuyBox}}, multi=True)
16024 kshitij.so 275
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':inStock,'codAvailable':data['codAvailable']}}, multi=True)
13918 kshitij.so 276
 
15913 kshitij.so 277
            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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
14342 kshitij.so 278
 
14834 kshitij.so 279
        except Exception as e:
280
            print "Exception for _id %d and source %s"%(data['_id'], source_id)
281
            print e
15913 kshitij.so 282
            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'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
15902 kshitij.so 283
 
284
    elif source_id == 5:
285
        try:
286
            if data['_id'] in ignoreItems:
287
                print "Ignored items returning for %d"%(data['_id'])
15913 kshitij.so 288
                return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':5,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
15902 kshitij.so 289
 
290
            try:
291
                if ignoreLastUpdated and data['priceUpdatedOn'] > to_java_date(now - timedelta(minutes=5)):
292
                    print "sku id is already updated",data['_id'] 
15913 kshitij.so 293
                    return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':5,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
15902 kshitij.so 294
            except:
295
                pass
296
 
297
 
298
            url = data['marketPlaceUrl']
299
            lowestPrice = 0.0
300
            try:
301
                sc = ShopCluesScraper.ShopCluesScraper()
15951 kshitij.so 302
                url = transformUrl(url, 5)
15902 kshitij.so 303
                productInfo = sc.read(url)
304
            except Exception as e:
15912 kshitij.so 305
                print traceback.print_exc()
16022 kshitij.so 306
                productInfo['price'] = 0.0
307
                productInfo['inStock'] = 0
308
                productInfo['isCod'] = 0
309
 
15902 kshitij.so 310
            print "LowestPrice ",productInfo['price']
311
            if productInfo['price'] > 0 and productInfo['inStock']==1:
312
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':productInfo['price'],'coupon':productInfo['coupon'],'codAvailable':productInfo['isCod'],'updatedOn':to_java_date(now),'priceUpdatedOn':to_java_date(now),'in_stock':productInfo['inStock']}})
16024 kshitij.so 313
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':productInfo['price'] , 'in_stock':productInfo['inStock'],'dealType':data['dealType'], 'rank':data['rank'],'codAvailable':productInfo['isCod']}})
15902 kshitij.so 314
            else:
315
                lowestPrice = data['available_price']
316
                get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(now),'in_stock':0,'priceUpdatedOn':to_java_date(now)}})
16024 kshitij.so 317
                get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0,'dealType':data['dealType'],'rank':data['rank'],'codAvailable':productInfo['isCod']}})
15902 kshitij.so 318
 
15912 kshitij.so 319
            return {'_id':data['_id'],'available_price':productInfo['price'],'in_stock':productInfo['inStock'],'source_id':5,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail'], 'coupon':productInfo['coupon'],'codAvailable':productInfo['isCod']}
15902 kshitij.so 320
        except Exception as e:
321
            print "Exception for _id %d and source %s"%(data['_id'], source_id)
322
            print e
15913 kshitij.so 323
            return {'_id':data['_id'],'available_price':data['available_price'],'in_stock':data['in_stock'],'source_id':5,'source_product_name':data['source_product_name'],'marketPlaceUrl':data['marketPlaceUrl'],'thumbnail':data['thumbnail'],'coupon':data['coupon'], 'codAvailable':data['codAvailable']}
15902 kshitij.so 324
 
13829 kshitij.so 325
    else:
326
        return {}
15902 kshitij.so 327
 
328
 
13918 kshitij.so 329
 
15253 kshitij.so 330
def recomputePoints(item, deal):
331
    try:
332
        nlcPoints = getNlcPoints(item, deal['minNlc'], deal['maxNlc'], deal['available_price'])
333
    except:
334
        print traceback.print_exc()
335
        nlcPoints = deal['nlcPoints']
336
    if item['manualDealThresholdPrice'] >= deal['available_price']:
337
        dealPoints = item['dealPoints']
338
    else:
339
        dealPoints = 0
340
    get_mongo_connection().Catalog.Deals.update({'_id':deal['_id']},{"$set":{'totalPoints':deal['totalPoints'] - deal['nlcPoints'] + nlcPoints - deal['dealPoints'] +dealPoints , 'nlcPoints': nlcPoints, 'dealPoints': dealPoints, 'manualDealThresholdPrice': item['manualDealThresholdPrice']}})
341
 
15266 kshitij.so 342
 
343
def populateNegativeDeals():
344
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
345
    mc.set("negative_deals", negativeDeals, 600)
346
 
347
def recomputeDeal(item):
16017 kshitij.so 348
 
13918 kshitij.so 349
    """Lets recompute deal for this bundle"""
15266 kshitij.so 350
    print "Recomputing for bundleId",item.get('skuBundleId')
351
    skuBundleId = item['skuBundleId']
13829 kshitij.so 352
 
13918 kshitij.so 353
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('available_price',pymongo.ASCENDING)]))
354
    bestPrice = float("inf")
355
    bestOne = None
356
    bestSellerPoints = 0
357
    toUpdate = []
16017 kshitij.so 358
    prepaidBestPrice = float("inf")
359
    prepaidBestOne = None
360
    prepaidBestSellerPoints = 0
13918 kshitij.so 361
    for similarItem in similarItems:
15266 kshitij.so 362
        if similarItem['_id'] == item['_id']:
363
            recomputePoints(item, similarItem)
16017 kshitij.so 364
        if similarItem['codAvailable'] ==1:
365
            if mc.get("negative_deals") is None:
366
                populateNegativeDeals()
367
            if similarItem['in_stock'] == 0 or similarItem['maxprice'] is None or similarItem['maxprice'] < similarItem['available_price'] or similarItem['_id'] in mc.get("negative_deals"):
368
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
369
                continue
370
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
371
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
372
                continue
373
            if similarItem['available_price'] < bestPrice:
374
                bestOne = similarItem
375
                bestPrice = similarItem['available_price']
376
                bestSellerPoints = similarItem['bestSellerPoints']
377
            elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
378
                bestOne = similarItem
379
                bestPrice = similarItem['available_price']
380
                bestSellerPoints = similarItem['bestSellerPoints']
381
            else:
382
                pass
13918 kshitij.so 383
        else:
16017 kshitij.so 384
            if mc.get("negative_deals") is None:
385
                populateNegativeDeals()
386
            if similarItem['in_stock'] == 0 or similarItem['maxprice'] is None or similarItem['maxprice'] < similarItem['available_price'] or similarItem['_id'] in mc.get("negative_deals"):
387
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
388
                continue
389
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
390
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
391
                continue
392
            if similarItem['available_price'] < prepaidBestPrice:
393
                prepaidBestOne = similarItem
394
                prepaidBestPrice = similarItem['available_price']
395
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
396
            elif similarItem['available_price'] == prepaidBestPrice and prepaidBestSellerPoints < similarItem['bestSellerPoints']:
397
                prepaidBestOne = similarItem
398
                prepaidBestPrice = similarItem['available_price']
399
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
400
            else:
401
                pass
16024 kshitij.so 402
    print "bestOne ", bestOne
403
    print "prepaid best one",  prepaidBestOne
404
    if bestOne is not None or prepaidBestOne is not None:
13918 kshitij.so 405
        for similarItem in similarItems:
406
            toUpdate.append(similarItem['_id'])
16023 kshitij.so 407
        if bestOne is not None:
408
            toUpdate.remove(bestOne['_id'])
409
            get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
410
        if prepaidBestOne is not None:
411
            toUpdate.remove(prepaidBestOne['_id'])
412
            get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13918 kshitij.so 413
    if len(toUpdate) > 0:
16017 kshitij.so 414
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
415
 
14342 kshitij.so 416
    print "Done with recomputing"
13829 kshitij.so 417
 
418
def getLatestPrice(skuBundleId, source_id):
419
    temp = []
420
    itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId,'source_id' : source_id}))
16026 kshitij.so 421
    item = None
13829 kshitij.so 422
    for item in itemIds:
14309 kshitij.so 423
        item['dealFlag'] = 0
424
        item['dealType'] = 0
15266 kshitij.so 425
        item['dealPoints'] = 0
426
        item['manualDealThresholdPrice'] = None
15912 kshitij.so 427
        if item['source_id'] ==5 and item['rank'] == 0:
428
            continue
15187 kshitij.so 429
        if item['source_id'] ==3:
430
            item['marketPlaceUrl'] = item['marketPlaceUrl']+'?supc='+item.get('identifier')
14309 kshitij.so 431
        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']}))
432
        if len(manualDeals) > 0:
433
            item['dealFlag'] = 1
14760 kshitij.so 434
            item['dealType'] =manualDeals[0]['dealType']
15266 kshitij.so 435
            item['dealPoints'] = manualDeals[0]['dealPoints']
436
            item['manualDealThresholdPrice'] = manualDeals[0]['dealThresholdPrice']
14760 kshitij.so 437
        info = returnLatestPrice(item, source_id)
14794 kshitij.so 438
        print info
14760 kshitij.so 439
        try:
440
            cashBack = getCashBack(item['_id'], item['source_id'], item['category_id'], mc, 'localhost')
14794 kshitij.so 441
            print "CashBack is ",cashBack
14760 kshitij.so 442
            if not cashBack or cashBack.get('cash_back_status')!=1:
14801 kshitij.so 443
                info['cash_back_type'] = 0
444
                info['cash_back'] = 0
14760 kshitij.so 445
            else:
446
                if cashBack['cash_back_type'] in (1,2):
447
                    info['cash_back_type'] = cashBack['cash_back_type']
448
                    info['cash_back'] = float(cashBack['cash_back'])
449
                else:
14801 kshitij.so 450
                    info['cash_back_type'] = 0
451
                    info['cash_back'] = 0
14760 kshitij.so 452
        except Exception as cashBackEx:
14794 kshitij.so 453
            traceback.print_exc()
14760 kshitij.so 454
            print "Error calculating cashback."
455
            info['cash_back_type'] = 0
456
            info['cash_back'] = 0
14794 kshitij.so 457
        print "info is ",info
14760 kshitij.so 458
        temp.append(info)
16026 kshitij.so 459
    if item is not None:
460
        try:
461
            thread = threading.Thread(target=recomputeDeal, args = (item,))
462
            thread.daemon = True
463
            thread.start()    
464
        except:
465
            print traceback.print_exc()
466
            print "Unable to compute deal for ",skuBundleId
13829 kshitij.so 467
    return temp
468
 
13864 kshitij.so 469
def getLatestPriceById(id):
470
    item = list(get_mongo_connection().Catalog.MasterData.find({'_id':id}))
14309 kshitij.so 471
    item[0]['dealFlag'] = 0
472
    item[0]['dealType'] = 0
15266 kshitij.so 473
    item[0]['dealPoints'] = 0
474
    item[0]['manualDealThresholdPrice'] = None
14309 kshitij.so 475
    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']}))
476
    if len(manualDeals) > 0:
477
        item[0]['dealFlag'] = 1
15266 kshitij.so 478
        item[0]['dealType'] =manualDeals[0]['dealType']
479
        item[0]['dealPoints'] = manualDeals[0]['dealPoints']
480
        item[0]['manualDealThresholdPrice'] = manualDeals[0]['dealThresholdPrice']
14367 kshitij.so 481
 
14431 kshitij.so 482
    info = returnLatestPrice(item[0], item[0]['source_id'])
14794 kshitij.so 483
    print info
14367 kshitij.so 484
    try:
14794 kshitij.so 485
        cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'], mc, 'localhost')
486
        print "CashBack is ",cashBack
14760 kshitij.so 487
        if not cashBack or cashBack.get('cash_back_status')!=1:
14801 kshitij.so 488
            info['cash_back_type'] = 0
489
            info['cash_back'] = 0
14760 kshitij.so 490
        else:
491
            if cashBack['cash_back_type'] in (1,2):
492
                info['cash_back_type'] = cashBack['cash_back_type']
493
                info['cash_back'] = float(cashBack['cash_back'])
494
            else:
14801 kshitij.so 495
                info['cash_back_type'] = 0
496
                info['cash_back'] = 0
14760 kshitij.so 497
    except Exception as cashBackEx:
14794 kshitij.so 498
        traceback.print_exc()
14760 kshitij.so 499
        print cashBackEx
500
        print "Error calculating cashback."
501
        info['cash_back_type'] = 0
502
        info['cash_back'] = 0
503
    try:
15273 kshitij.so 504
        thread = threading.Thread(target=recomputeDeal, args = (item[0],))
14367 kshitij.so 505
        thread.daemon = True
506
        thread.start()    
507
    except:
508
        print "Unable to compute deal for ",item[0]['skuBundleId']
14431 kshitij.so 509
    return info
13829 kshitij.so 510
 
14828 kshitij.so 511
def updatePriceForNotificationBundles(skuBundleId):
15266 kshitij.so 512
    itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId,'priceUpdatedOn':{'$lte':to_java_date(datetime.now() - timedelta(minutes=2))},'source_id':{"$in":SOURCE_MAP.values()}}))
14828 kshitij.so 513
    for item in itemIds:
14833 kshitij.so 514
        print item['_id']
14828 kshitij.so 515
        item['dealFlag'] = 0
516
        item['dealType'] = 0
15266 kshitij.so 517
        item['dealPoints'] = 0
518
        item['manualDealThresholdPrice'] = None
14828 kshitij.so 519
        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['source_id'], 'sku':item['_id']}))
520
        if len(manualDeals) > 0:
521
            item['dealFlag'] = 1
522
            item['dealType'] =manualDeals[0]['dealType']
15266 kshitij.so 523
            item['dealPoints'] = manualDeals[0]['dealPoints']
524
            item['manualDealThresholdPrice'] = manualDeals[0]['dealThresholdPrice']
14828 kshitij.so 525
        info = returnLatestPrice(item, item['source_id'],False)
526
        print info
527
 
13829 kshitij.so 528
def main():
15956 kshitij.so 529
    print datetime.now()
16065 kshitij.so 530
    print "retuned %s"%(str(getLatestPriceById(271)))
15956 kshitij.so 531
    print datetime.now()
13829 kshitij.so 532
if __name__=='__main__':
13971 kshitij.so 533
    main()
534