Subversion Repositories SmartDukaan

Rev

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