Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
13828 kshitij.so 1
import urllib2
2
import simplejson as json
3
import pymongo
15270 kshitij.so 4
from dtr.utils.utils import to_java_date, getNlcPoints 
13917 kshitij.so 5
from datetime import datetime, timedelta
13828 kshitij.so 6
import time
14180 kshitij.so 7
from multiprocessing import Pool as ThreadPool
8
from multiprocessing import cpu_count
14254 kshitij.so 9
import optparse
14325 kshitij.so 10
from dtr.storage.MemCache import MemCache
14705 kshitij.so 11
from dtr.utils.utils import getCashBack
15270 kshitij.so 12
import traceback
13
from operator import itemgetter
13828 kshitij.so 14
 
15
con = None
16
 
14254 kshitij.so 17
parser = optparse.OptionParser()
18
parser.add_option("-m", "--m", dest="mongoHost",
19
                      default="localhost",
20
                      type="string", help="The HOST where the mongo server is running",
21
                      metavar="mongo_host")
22
 
23
(options, args) = parser.parse_args()
24
 
14325 kshitij.so 25
mc = MemCache(options.mongoHost)
14254 kshitij.so 26
 
13828 kshitij.so 27
headers = { 
28
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
29
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
30
            'Accept-Language' : 'en-US,en;q=0.8',                     
31
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
32
        }
33
 
14254 kshitij.so 34
def get_mongo_connection(host=options.mongoHost, port=27017):
13828 kshitij.so 35
    global con
36
    if con is None:
37
        print "Establishing connection %s host and port %d" %(host,port)
38
        try:
39
            con = pymongo.MongoClient(host, port)
40
        except Exception, e:
41
            print e
42
            return None
43
    return con
44
 
14180 kshitij.so 45
def populate():
46
    toScrapMap = {}
14132 kshitij.so 47
    bestSellers = list(get_mongo_connection().Catalog.MasterData.find({'rank':{'$gt':0}}))
48
    for bestSeller in bestSellers: 
49
        snapdealBestSellers = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':bestSeller['skuBundleId'],'source_id':3}))
50
        for data in snapdealBestSellers:
14180 kshitij.so 51
            if not toScrapMap.has_key(data['_id']):
15270 kshitij.so 52
                data['dealFlag'] = 0
53
                data['dealType'] = 0
54
                data['dealPoints'] = 0
55
                data['manualDealThresholdPrice'] = None
14180 kshitij.so 56
                toScrapMap[data['_id']] = data
14252 kshitij.so 57
    dealFlagged = list(get_mongo_connection().Catalog.Deals.find({'source_id':3,'showDeal':1,'totalPoints':{'$gt':0}}))
58
    for deal in dealFlagged:
59
        if not toScrapMap.has_key(deal['_id']):
14261 kshitij.so 60
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
15270 kshitij.so 61
            data[0]['dealFlag'] = 0
62
            data[0]['dealType'] = 0
63
            data[0]['dealPoints'] = 0
64
            data[0]['manualDealThresholdPrice'] = None
14261 kshitij.so 65
            toScrapMap[deal['_id']] = data[0]
15270 kshitij.so 66
    manualDeals = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':3}))
67
    for manualDeal in manualDeals:
68
        if not toScrapMap.has_key(manualDeal['sku']):
69
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':manualDeal['sku']}))
70
            if len(data) > 0:
71
                data[0]['dealFlag'] = 1
72
                data[0]['dealType'] = manualDeal['dealType']
73
                data[0]['dealPoints'] = manualDeal['dealPoints']
74
                data[0]['manualDealThresholdPrice'] = manualDeal['dealThresholdPrice']
75
                toScrapMap[manualDeal['sku']] = data[0]
76
        else:
77
            data = toScrapMap.get(manualDeal['sku'])
78
            data['dealFlag'] = 1
79
            data['dealType'] = manualDeal['dealType']
80
            data['dealPoints'] = manualDeal['dealPoints']
81
            data['manualDealThresholdPrice'] = manualDeal['dealThresholdPrice']
14180 kshitij.so 82
    pool = ThreadPool(cpu_count() *2)
15827 kshitij.so 83
    offset = 0
84
    limit =100
85
    while(offset<=len(toScrapMap.values())):
86
        pool.map(updatePrices,toScrapMap.values()[offset:offset+limit])
87
        offset = offset + limit
14180 kshitij.so 88
    pool.close()
89
    pool.join()
14252 kshitij.so 90
    print "joining threads at %s"%(str(datetime.now()))
14180 kshitij.so 91
 
92
 
93
def updatePrices(data):
94
    if data['source_id']!=3:
95
        return
96
    print data['identifier']
97
    if data['identifier'] is None or len(data['identifier'].strip())==0:
98
        print "returning"
99
        return
100
 
101
    try:
102
        if data['priceUpdatedOn'] > to_java_date(datetime.now() - timedelta(minutes=5)):
103
            print "sku id is already updated",data['_id'] 
104
            return
105
    except:
106
        pass
107
 
15823 kshitij.so 108
    url="http://www.snapdeal.com/acors/json/v2/gvbps?supc=%s&catUrl=&bn=&catId=175&start=0&count=10000"%(data['identifier'].strip())
14180 kshitij.so 109
    print url
110
    time.sleep(1)
111
    lowestOfferPrice = 0
112
    instock = 0
15270 kshitij.so 113
    buyBoxPrice = 0
114
    isBuyBox = 1
115
    stock = 0
14180 kshitij.so 116
    req = urllib2.Request(url,headers=headers)
117
    response = urllib2.urlopen(req)
15820 kshitij.so 118
    try:
119
        vendorInfo = json.load(response)
120
    except:
121
        return
122
    finally:
123
        response.close()
15270 kshitij.so 124
 
15820 kshitij.so 125
    try:
126
        buyBoxStock = vendorInfo['primaryVendor']['buyableInventory']
127
        if buyBoxStock >0:
128
            buyBoxPrice = vendorInfo['primaryVendor']['sellingPrice']
129
    except:
130
        pass
131
 
132
    sortedVendorsData = sorted(vendorInfo['vendors'], key=itemgetter('sellingPrice'))
133
    for sortedVendorData in sortedVendorsData:
134
        lowestOfferPrice = float(sortedVendorData['sellingPrice'])
135
        try:
136
            stock = sortedVendorData['buyableInventory']
137
        except:
138
            pass
139
        if stock > 0 and lowestOfferPrice > 0:
140
            instock = 1
141
            break
142
    if buyBoxPrice != lowestOfferPrice:
143
        isBuyBox = 0
144
 
14180 kshitij.so 145
    print lowestOfferPrice
146
    print instock
14181 kshitij.so 147
    print "Lowest Offer Price for id %d is %d , stock is %d and stock count is %d" %(data['_id'],lowestOfferPrice,instock,stock)
14180 kshitij.so 148
    print "*************"
149
    if instock  == 1:
15270 kshitij.so 150
        get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice,'updatedOn':to_java_date(datetime.now()),'priceUpdatedOn':to_java_date(datetime.now()),'in_stock':instock,'buyBoxFlag':isBuyBox}}, multi=True)
14180 kshitij.so 151
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':lowestOfferPrice , 'in_stock':instock}}, multi=True)
152
    else:
15270 kshitij.so 153
        get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(datetime.now()),'in_stock':instock,'priceUpdatedOn':to_java_date(datetime.now()),'buyBoxFlag':isBuyBox}}, multi=True)
14180 kshitij.so 154
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':instock}}, multi=True)
155
 
156
    try:
15270 kshitij.so 157
        recomputeDeal(data)
14180 kshitij.so 158
    except:
159
        print "Unable to compute deal for ",data['skuBundleId']
160
 
14325 kshitij.so 161
 
162
def populateNegativeDeals():
163
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
15270 kshitij.so 164
    mc.set("negative_deals", negativeDeals, 600)
165
 
166
def recomputePoints(item, deal):
167
    try:
168
        nlcPoints = getNlcPoints(item, deal['minNlc'], deal['maxNlc'], deal['available_price'])
169
    except:
170
        traceback.print_exc()
171
        nlcPoints = deal['nlcPoints']
172
    if item['manualDealThresholdPrice'] >= deal['available_price']:
173
        dealPoints = item['dealPoints']
174
    else:
175
        dealPoints = 0
176
    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']}})
177
 
14180 kshitij.so 178
 
15270 kshitij.so 179
def recomputeDeal(item):
13917 kshitij.so 180
    """Lets recompute deal for this bundle"""
15270 kshitij.so 181
    print "Recomputing for bundleId",item.get('skuBundleId')
182
    skuBundleId = item['skuBundleId']
13917 kshitij.so 183
 
184
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('available_price',pymongo.ASCENDING)]))
185
    bestPrice = float("inf")
186
    bestOne = None
187
    bestSellerPoints = 0
188
    toUpdate = []
189
    for similarItem in similarItems:
14330 kshitij.so 190
        if mc.get("negative_deals") is None:
14325 kshitij.so 191
            populateNegativeDeals()
15270 kshitij.so 192
#        try:
193
#            cashBack = getCashBack(similarItem['_id'], similarItem['source_id'], similarItem['category_id'], mc, options.mongoHost)
194
#            if not cashBack or cashBack.get('cash_back_status')!=1:
195
#                pass
196
#            else:
197
#                if cashBack['cash_back_type'] ==1:
198
#                    similarItem['available_price'] = similarItem['available_price'] - similarItem['available_price'] * float(cashBack['cash_back'])/100
199
#                elif cashBack['cash_back_type'] ==2:
200
#                    similarItem['available_price'] = similarItem['available_price'] - float(cashBack['cash_back'])
201
#                else:
202
#                    pass
203
#        except Exception as cashBackEx:
204
#            print cashBackEx
205
#            print "Error calculating cashback."
206
        if similarItem['_id'] == item['_id']:
207
            try:
208
                recomputePoints(item, similarItem)
209
            except:
210
                traceback.print_exc()
14330 kshitij.so 211
        if similarItem['in_stock'] == 0 or similarItem['maxprice'] is None or similarItem['maxprice'] < similarItem['available_price'] or similarItem['_id'] in mc.get("negative_deals"):
13917 kshitij.so 212
            get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0 }})
213
            continue
214
        if similarItem['available_price'] < bestPrice:
215
            bestOne = similarItem
216
            bestPrice = similarItem['available_price']
217
            bestSellerPoints = similarItem['bestSellerPoints']
218
        elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
219
            bestOne = similarItem
220
            bestPrice = similarItem['available_price']
221
            bestSellerPoints = similarItem['bestSellerPoints']
222
        else:
223
            pass
224
    if bestOne is not None:
225
        for similarItem in similarItems:
226
            toUpdate.append(similarItem['_id'])
227
        toUpdate.remove(bestOne['_id'])
228
        get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1 }})
229
    if len(toUpdate) > 0:
230
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0 }},upsert=False, multi=True)
231
 
13828 kshitij.so 232
def main():
14180 kshitij.so 233
    populate()
13828 kshitij.so 234
 
235
if __name__=='__main__':
236
    main()