Subversion Repositories SmartDukaan

Rev

Rev 14828 | Rev 14834 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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