Subversion Repositories SmartDukaan

Rev

Rev 16117 | Rev 16176 | 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'])
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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'] 
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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
 
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
14834 kshitij.so 103
        except Exception as e:
104
            print "Exception for _id %d and source %s"%(data['_id'], source_id)
105
            print e
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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'] 
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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
 
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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'])
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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']
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']} 
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
 
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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'])
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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'] 
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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
 
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
15902 kshitij.so 320
        except Exception as e:
321
            print "Exception for _id %d and source %s"%(data['_id'], source_id)
322
            print e
16117 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'], 'tagline': data['tagline'], 'offer': data['offer']}
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()
16172 kshitij.so 367
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16017 kshitij.so 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()
16172 kshitij.so 386
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16017 kshitij.so 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:
16069 kshitij.so 411
            if bestOne is not None:
412
                if prepaidBestOne['available_price'] < bestOne['available_price']: 
413
                    toUpdate.remove(prepaidBestOne['_id'])
414
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
16072 kshitij.so 415
            else:
416
                toUpdate.remove(prepaidBestOne['_id'])
417
                get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13918 kshitij.so 418
    if len(toUpdate) > 0:
16017 kshitij.so 419
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
420
 
14342 kshitij.so 421
    print "Done with recomputing"
13829 kshitij.so 422
 
423
def getLatestPrice(skuBundleId, source_id):
424
    temp = []
425
    itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId,'source_id' : source_id}))
16026 kshitij.so 426
    item = None
13829 kshitij.so 427
    for item in itemIds:
14309 kshitij.so 428
        item['dealFlag'] = 0
429
        item['dealType'] = 0
15266 kshitij.so 430
        item['dealPoints'] = 0
431
        item['manualDealThresholdPrice'] = None
15912 kshitij.so 432
        if item['source_id'] ==5 and item['rank'] == 0:
433
            continue
15187 kshitij.so 434
        if item['source_id'] ==3:
435
            item['marketPlaceUrl'] = item['marketPlaceUrl']+'?supc='+item.get('identifier')
14309 kshitij.so 436
        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']}))
437
        if len(manualDeals) > 0:
438
            item['dealFlag'] = 1
14760 kshitij.so 439
            item['dealType'] =manualDeals[0]['dealType']
15266 kshitij.so 440
            item['dealPoints'] = manualDeals[0]['dealPoints']
441
            item['manualDealThresholdPrice'] = manualDeals[0]['dealThresholdPrice']
14760 kshitij.so 442
        info = returnLatestPrice(item, source_id)
14794 kshitij.so 443
        print info
14760 kshitij.so 444
        try:
445
            cashBack = getCashBack(item['_id'], item['source_id'], item['category_id'], mc, 'localhost')
14794 kshitij.so 446
            print "CashBack is ",cashBack
14760 kshitij.so 447
            if not cashBack or cashBack.get('cash_back_status')!=1:
14801 kshitij.so 448
                info['cash_back_type'] = 0
449
                info['cash_back'] = 0
14760 kshitij.so 450
            else:
451
                if cashBack['cash_back_type'] in (1,2):
452
                    info['cash_back_type'] = cashBack['cash_back_type']
453
                    info['cash_back'] = float(cashBack['cash_back'])
454
                else:
14801 kshitij.so 455
                    info['cash_back_type'] = 0
456
                    info['cash_back'] = 0
14760 kshitij.so 457
        except Exception as cashBackEx:
14794 kshitij.so 458
            traceback.print_exc()
14760 kshitij.so 459
            print "Error calculating cashback."
460
            info['cash_back_type'] = 0
461
            info['cash_back'] = 0
14794 kshitij.so 462
        print "info is ",info
14760 kshitij.so 463
        temp.append(info)
16026 kshitij.so 464
    if item is not None:
465
        try:
466
            thread = threading.Thread(target=recomputeDeal, args = (item,))
467
            thread.daemon = True
468
            thread.start()    
469
        except:
470
            print traceback.print_exc()
471
            print "Unable to compute deal for ",skuBundleId
13829 kshitij.so 472
    return temp
473
 
13864 kshitij.so 474
def getLatestPriceById(id):
475
    item = list(get_mongo_connection().Catalog.MasterData.find({'_id':id}))
14309 kshitij.so 476
    item[0]['dealFlag'] = 0
477
    item[0]['dealType'] = 0
15266 kshitij.so 478
    item[0]['dealPoints'] = 0
479
    item[0]['manualDealThresholdPrice'] = None
14309 kshitij.so 480
    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']}))
481
    if len(manualDeals) > 0:
482
        item[0]['dealFlag'] = 1
15266 kshitij.so 483
        item[0]['dealType'] =manualDeals[0]['dealType']
484
        item[0]['dealPoints'] = manualDeals[0]['dealPoints']
485
        item[0]['manualDealThresholdPrice'] = manualDeals[0]['dealThresholdPrice']
14367 kshitij.so 486
 
14431 kshitij.so 487
    info = returnLatestPrice(item[0], item[0]['source_id'])
14794 kshitij.so 488
    print info
14367 kshitij.so 489
    try:
14794 kshitij.so 490
        cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'], mc, 'localhost')
491
        print "CashBack is ",cashBack
14760 kshitij.so 492
        if not cashBack or cashBack.get('cash_back_status')!=1:
14801 kshitij.so 493
            info['cash_back_type'] = 0
494
            info['cash_back'] = 0
14760 kshitij.so 495
        else:
496
            if cashBack['cash_back_type'] in (1,2):
497
                info['cash_back_type'] = cashBack['cash_back_type']
498
                info['cash_back'] = float(cashBack['cash_back'])
499
            else:
14801 kshitij.so 500
                info['cash_back_type'] = 0
501
                info['cash_back'] = 0
14760 kshitij.so 502
    except Exception as cashBackEx:
14794 kshitij.so 503
        traceback.print_exc()
14760 kshitij.so 504
        print cashBackEx
505
        print "Error calculating cashback."
506
        info['cash_back_type'] = 0
507
        info['cash_back'] = 0
508
    try:
15273 kshitij.so 509
        thread = threading.Thread(target=recomputeDeal, args = (item[0],))
14367 kshitij.so 510
        thread.daemon = True
511
        thread.start()    
512
    except:
513
        print "Unable to compute deal for ",item[0]['skuBundleId']
14431 kshitij.so 514
    return info
13829 kshitij.so 515
 
14828 kshitij.so 516
def updatePriceForNotificationBundles(skuBundleId):
15266 kshitij.so 517
    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 518
    for item in itemIds:
14833 kshitij.so 519
        print item['_id']
14828 kshitij.so 520
        item['dealFlag'] = 0
521
        item['dealType'] = 0
15266 kshitij.so 522
        item['dealPoints'] = 0
523
        item['manualDealThresholdPrice'] = None
14828 kshitij.so 524
        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']}))
525
        if len(manualDeals) > 0:
526
            item['dealFlag'] = 1
527
            item['dealType'] =manualDeals[0]['dealType']
15266 kshitij.so 528
            item['dealPoints'] = manualDeals[0]['dealPoints']
529
            item['manualDealThresholdPrice'] = manualDeals[0]['dealThresholdPrice']
14828 kshitij.so 530
        info = returnLatestPrice(item, item['source_id'],False)
531
        print info
532
 
13829 kshitij.so 533
def main():
15956 kshitij.so 534
    print datetime.now()
16117 kshitij.so 535
    print "retuned %s"%(str(getLatestPriceById(22804)))
15956 kshitij.so 536
    print datetime.now()
13829 kshitij.so 537
if __name__=='__main__':
13971 kshitij.so 538
    main()
539