Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
16407 kshitij.so 1
import pymongo
2
from dtr.utils.utils import to_java_date, getNlcPoints
3
from datetime import datetime, timedelta
4
from operator import itemgetter
5
from dtr.utils import PaytmOfferScraper, PaytmScraper
6
from multiprocessing import Pool as ThreadPool
7
from multiprocessing import cpu_count
8
import optparse
9
from dtr.storage.MemCache import MemCache
10
from dtr.utils.utils import getCashBack
11
import traceback
16414 kshitij.so 12
from dtr.CouponMaster import addToPaytmMaster
16417 kshitij.so 13
from dtr.storage import DataService
16407 kshitij.so 14
 
15
con = None
16
 
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
 
25
mc = MemCache(options.mongoHost)
26
 
16417 kshitij.so 27
DataService.initialize(db_hostname=options.mongoHost)
28
 
16407 kshitij.so 29
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5,'PAYTM.COM':6}
30
 
31
def get_mongo_connection(host=options.mongoHost, port=27017):
32
    global con
33
    if con is None:
34
        print "Establishing connection %s host and port %d" %(host,port)
35
        try:
36
            con = pymongo.MongoClient(host, port)
37
        except Exception, e:
38
            print e
39
            return None
40
    return con
41
 
42
def populate():
43
    toScrapMap = {}
44
    bestSellers = list(get_mongo_connection().Catalog.MasterData.find({'rank':{'$gt':0}}))
45
    for bestSeller in bestSellers: 
46
        paytmBestSellers = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':bestSeller['skuBundleId'],'source_id':6}))
47
        for data in paytmBestSellers:
48
            if not toScrapMap.has_key(data['_id']):
49
                data['dealFlag'] = 0
50
                data['dealType'] = 0
51
                toScrapMap[data['_id']] = data
52
    dealFlagged = list(get_mongo_connection().Catalog.Deals.find({'source_id':6,'showDeal':1,'totalPoints':{'$gt':-100}}))
53
    for deal in dealFlagged:
54
        if not toScrapMap.has_key(deal['_id']):
55
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
56
            data[0]['dealFlag'] = 0
57
            data[0]['dealType'] = 0
58
            toScrapMap[deal['_id']] = data[0]
59
    manualDeals = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':6}))
60
    for manualDeal in manualDeals:
61
        if not toScrapMap.has_key(manualDeal['sku']):
62
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':manualDeal['sku']}))
63
            if len(data) > 0:
64
                data[0]['dealFlag'] = 1
65
                data[0]['dealType'] = manualDeal['dealType']
66
                toScrapMap[manualDeal['sku']] = data[0]
67
        else:
68
            data = toScrapMap.get(manualDeal['sku'])
69
            data['dealFlag'] = 1
70
            data['dealType'] = manualDeal['dealType']
16414 kshitij.so 71
    for val in toScrapMap.values():
72
        scrapePaytm(val)
16407 kshitij.so 73
    print "joining threads at %s"%(str(datetime.now()))
74
 
75
def scrapePaytm(data):
76
    if data['source_id']!=6:
77
        return
78
    if data['identifier'] is None or len(data['identifier'].strip())==0:
79
        print "returning in valid identifier"
80
        return
81
 
16506 kshitij.so 82
    if data.get('ignorePricing') ==1:
16407 kshitij.so 83
        print "Ignored items returning for %d"%(data['_id'])
16506 kshitij.so 84
        return
85
 
16407 kshitij.so 86
 
87
    try:
88
        if data['priceUpdatedOn'] > to_java_date(datetime.now() - timedelta(minutes=5)):
89
            print "sku id is already updated %d" %(data['_id']) 
90
            return
91
    except:
92
        pass
93
 
94
    paytmScraper = PaytmScraper.PaytmScraper()
95
    url = "https://catalog.paytm.com/v1/mobile/product/%s"%(data['identifier'].strip())
96
    try:
97
        result = paytmScraper.read(url)
16414 kshitij.so 98
        print result
16407 kshitij.so 99
        effective_price = result.get('offerPrice')
16463 kshitij.so 100
        gross_price = effective_price
16407 kshitij.so 101
        coupon = ""
18283 kshitij.so 102
        shareUrl = result.get('shareUrl')
103
        if shareUrl is None:
104
            shareUrl = data['marketPlaceUrl']
16414 kshitij.so 105
        print result['offerUrl']
16407 kshitij.so 106
        try:
107
            offers = PaytmOfferScraper.fetchOffers(result['offerUrl'])
16414 kshitij.so 108
            try:
109
                addToPaytmMaster(offers.get('codes'))
110
            except:
111
                print "Error in adding coupon"
112
                traceback.print_exc()
16407 kshitij.so 113
            bestOffer = {}
114
            for offer_data in offers.get('codes'):
16414 kshitij.so 115
                if effective_price > offer_data.get('effective_price'):
16407 kshitij.so 116
                    effective_price = offer_data.get('effective_price')
117
                    bestOffer = offer_data
118
                    coupon = bestOffer.get('code')
119
        except:
16414 kshitij.so 120
            traceback.print_exc()
121
        print "coupon code",coupon
16470 kshitij.so 122
        if len(coupon) > 0:
123
            result['codAvailable'] = 0
16407 kshitij.so 124
        available_price = effective_price 
125
        if result['inStock']:
18283 kshitij.so 126
            get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'available_price':available_price,'updatedOn':to_java_date(datetime.now()),'priceUpdatedOn':to_java_date(datetime.now()),'in_stock':1,'buyBoxFlag':1,'codAvailable':result.get('codAvailable'),'coupon':coupon,'gross_price':gross_price,'marketPlaceUrl':shareUrl}})
16463 kshitij.so 127
            get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'available_price':available_price , 'in_stock':1,'codAvailable':result.get('codAvailable'),'gross_price':gross_price}})
16407 kshitij.so 128
        else:
18283 kshitij.so 129
            get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(datetime.now()),'in_stock':0,'priceUpdatedOn':to_java_date(datetime.now()),'buyBoxFlag':1,'codAvailable':result.get('codAvailable'),'coupon':coupon,'marketPlaceUrl':shareUrl}})
16414 kshitij.so 130
            get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0,'codAvailable':result.get('codAvailable')}})
16407 kshitij.so 131
 
132
    except:
133
        get_mongo_connection().Catalog.MasterData.update({'_id':data['_id']}, {'$set' : {'updatedOn':to_java_date(datetime.now()),'in_stock':0,'priceUpdatedOn':to_java_date(datetime.now()),'buyBoxFlag':1}})
134
        get_mongo_connection().Catalog.Deals.update({'_id':data['_id']}, {'$set' : {'in_stock':0}})
135
 
136
 
137
 
138
    try:
139
        recomputeDeal(data)
140
    except:
141
        print "Unable to compute deal for %s"%(data['skuBundleId'])
142
 
16506 kshitij.so 143
#def recomputePoints(item, deal):
144
#    try:
145
#        if item.get('available_price') == deal['available_price']:
146
#            print "No need to compute points for %d , as price is still same" %(item['_id'])
147
#            return
148
#        nlcPoints = getNlcPoints(item, deal['minNlc'], deal['maxNlc'], deal['available_price'])
149
#    except:
150
#        print traceback.print_exc()
151
#        nlcPoints = deal['nlcPoints']
152
#    
153
#    bundleDealPoints = list(get_mongo_connection().Catalog.DealPoints.find({'skuBundleId':item['skuBundleId'],'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}}))
154
#    if len(bundleDealPoints) > 0:
155
#        item['manualDealThresholdPrice'] = bundleDealPoints[0]['dealThresholdPrice']
156
#        dealPoints = bundleDealPoints[0]['dealPoints']
157
#    else:
158
#        dealPoints = 0
159
#        item['manualDealThresholdPrice'] = None
160
#    
161
#    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']}})
16407 kshitij.so 162
 
163
def populateNegativeDeals():
164
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
165
    mc.set("negative_deals", negativeDeals, 600)  
166
 
167
def recomputeDeal(item):
168
    """Lets recompute deal for this bundle"""
169
    print "Recomputing for bundleId %d" %(item.get('skuBundleId'))
170
    skuBundleId = item['skuBundleId']
171
 
172
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('available_price',pymongo.ASCENDING)]))
173
    bestPrice = float("inf")
174
    bestOne = None
175
    bestSellerPoints = 0
176
    toUpdate = []
177
    prepaidBestPrice = float("inf")
178
    prepaidBestOne = None
179
    prepaidBestSellerPoints = 0
180
    for similarItem in similarItems:
181
        if similarItem['codAvailable'] ==1:
182
            if mc.get("negative_deals") is None:
183
                populateNegativeDeals()
184
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
185
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
186
                continue
187
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
188
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
189
                continue
190
            if similarItem['available_price'] < bestPrice:
191
                bestOne = similarItem
192
                bestPrice = similarItem['available_price']
193
                bestSellerPoints = similarItem['bestSellerPoints']
194
            elif similarItem['available_price'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
195
                bestOne = similarItem
196
                bestPrice = similarItem['available_price']
197
                bestSellerPoints = similarItem['bestSellerPoints']
198
            else:
199
                pass
200
        else:
201
            if mc.get("negative_deals") is None:
202
                populateNegativeDeals()
203
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
204
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
205
                continue
206
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
207
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
208
                continue
16869 kshitij.so 209
            if similarItem['source_id'] == SOURCE_MAP.get('PAYTM.COM'):
210
                similarItem['available_price'] = similarItem['gross_price']
16407 kshitij.so 211
            if similarItem['available_price'] < prepaidBestPrice:
212
                prepaidBestOne = similarItem
213
                prepaidBestPrice = similarItem['available_price']
214
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
215
            elif similarItem['available_price'] == prepaidBestPrice and prepaidBestSellerPoints < similarItem['bestSellerPoints']:
216
                prepaidBestOne = similarItem
217
                prepaidBestPrice = similarItem['available_price']
218
                prepaidBestSellerPoints = similarItem['bestSellerPoints']
219
            else:
220
                pass
221
    if bestOne is not None or prepaidBestOne is not None:
222
        for similarItem in similarItems:
223
            toUpdate.append(similarItem['_id'])
224
        if bestOne is not None:
225
            toUpdate.remove(bestOne['_id'])
226
            get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
227
        if prepaidBestOne is not None:
228
            if bestOne is not None:
229
                if prepaidBestOne['available_price'] < bestOne['available_price']: 
230
                    toUpdate.remove(prepaidBestOne['_id'])
231
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
232
            else:
233
                toUpdate.remove(prepaidBestOne['_id'])
234
                get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
235
    if len(toUpdate) > 0:
236
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
237
 
238
def main():
239
    populate()
240
 
241
if __name__=='__main__':
242
    main()