Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
13755 kshitij.so 1
import pymongo
2
from elixir import *
3
from shop2020.model.v1.catalog.impl import DataService
4
from shop2020.model.v1.catalog.impl.DataService import Item
5
from shop2020.clients.InventoryClient import InventoryClient
19144 kshitij.so 6
from dtr.utils.utils import to_java_date, getCashBack
13755 kshitij.so 7
from datetime import datetime, timedelta
8
import time
14258 kshitij.so 9
import optparse
14325 kshitij.so 10
from dtr.storage.MemCache import MemCache
16635 manish.sha 11
import traceback
19211 kshitij.so 12
import math
19584 kshitij.so 13
from pymongo import ASCENDING
13755 kshitij.so 14
 
14258 kshitij.so 15
parser = optparse.OptionParser()
14263 kshitij.so 16
parser.add_option("-H", "--host", dest="hostname",
14258 kshitij.so 17
                      default="localhost",
18
                      type="string", help="The HOST where the DB server is running",
19
                      metavar="host")
20
parser.add_option("-m", "--m", dest="mongoHost",
21
                      default="localhost",
22
                      type="string", help="The HOST where the mongo server is running",
23
                      metavar="mongo_host")
13755 kshitij.so 24
 
14258 kshitij.so 25
(options, args) = parser.parse_args()
14325 kshitij.so 26
 
27
mc = MemCache(options.mongoHost)
28
 
14258 kshitij.so 29
DataService.initialize(db_hostname=options.hostname)
30
 
13755 kshitij.so 31
con = None
17034 kshitij.so 32
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5,'PAYTM.COM':6,'HOMESHOP18.COM':7}
13755 kshitij.so 33
DISCOUNT_TYPE = {'MRP':1,'DP':2}
34
LATEST_UPDATED_ITEMS = []
16253 kshitij.so 35
STATUS_WEIGHTAGE = {1 : 1.0, 2 : 2.0, 3 : 1.0, 4 : 0.5}
19584 kshitij.so 36
subCatRankList = []
13755 kshitij.so 37
 
16868 kshitij.so 38
DEAL_POINTS_MAP = {}
39
 
13755 kshitij.so 40
now = datetime.now()
41
 
16868 kshitij.so 42
class __DealPoints:
43
 
44
    def __init__(self, manualDealThresholdPrice, points):
45
        self.manualDealThresholdPrice = manualDealThresholdPrice
46
        self.points = points
47
 
48
 
13755 kshitij.so 49
class __SkuInfo:
50
 
51
    def __init__(self, _id, skuBundleId, category_id, mrp, available_price, source_id, rank, maxNlc, minNlc, schemeAmount, minDiscount, \
16534 kshitij.so 52
                 maxDiscount, discountType, dp, nlcPoints, status, in_stock, maxprice, brand, dealType, brand_id, manualDealThresholdPrice,\
19144 kshitij.so 53
                 codAvailable,showDp,gross_price, subCategoryId,subCategory,shippingCost,netPriceAfterCashBack):
13755 kshitij.so 54
        self._id = _id
55
        self.skuBundleId = skuBundleId
56
        self.category_id = category_id
57
        self.mrp = mrp
58
        self.available_price = available_price
59
        self.source_id = source_id
60
        self.rank = rank
61
        self.maxNlc = maxNlc
62
        self.minNlc = minNlc
63
        self.schemeAmount = schemeAmount
64
        self.minDiscount = minDiscount
65
        self.maxDiscount = maxDiscount
66
        self.discountType = discountType
67
        self.dp = dp
68
        self.nlcPoints = nlcPoints
13824 kshitij.so 69
        self.status = status
70
        self.in_stock = in_stock
71
        self.maxprice = maxprice
14035 kshitij.so 72
        self.brand = brand
14306 kshitij.so 73
        self.dealType = dealType
15063 kshitij.so 74
        self.brand_id = brand_id
15271 kshitij.so 75
        self.manualDealThresholdPrice = manualDealThresholdPrice
16019 kshitij.so 76
        self.codAvailable = codAvailable
16253 kshitij.so 77
        self.showDp = showDp
16456 kshitij.so 78
        self.gross_price = gross_price
17649 kshitij.so 79
        self.subCategoryId = subCategoryId
17678 kshitij.so 80
        self.subCategory = subCategory
17713 kshitij.so 81
        self.shippingCost = shippingCost
19144 kshitij.so 82
        self.netPriceAfterCashBack = netPriceAfterCashBack
13755 kshitij.so 83
 
84
 
14258 kshitij.so 85
def get_mongo_connection(host=options.mongoHost, port=27017):
13755 kshitij.so 86
    global con
87
    if con is None:
88
        print "Establishing connection %s host and port %d" %(host,port)
89
        try:
90
            con = pymongo.MongoClient(host, port)
91
        except Exception, e:
92
            print e
93
            return None
94
    return con
95
 
96
def populateStuff():
97
    print "Inside populate"
98
    global LATEST_UPDATED_ITEMS
99
    """Fetch latest updated items across portals
100
       and calculate max and min R-Nlc"""
101
    offset= 0
102
    while(True):
103
        print "Fetching records offset %d and limit %d" %(offset,300)
18189 kshitij.so 104
        topSkus = list(get_mongo_connection().Catalog.MasterData.find( {"$and":[{'updatedOn': { "$gt": to_java_date(now - timedelta(hours=1))} }, { 'source_id' : { "$in": SOURCE_MAP.values() } }] }).skip(offset).limit(300))
13755 kshitij.so 105
        if len((topSkus)) == 0:
106
            break
107
        #topSkus = collection.find( {'_id':664})
108
        for sku in topSkus:
13908 kshitij.so 109
            """Fix this """
110
            #TODO Compute deal flags else where.
19144 kshitij.so 111
            if sku['source_id'] != SOURCE_MAP.get('PAYTM.COM'):
112
                netPriceAfterCashBack = getNetPriceForItem(sku['_id'], sku['source_id'], sku['category_id'], sku['available_price'])
113
            else:
114
                if sku['codAvailable'] ==0:
115
                    netPriceAfterCashBack = getNetPriceForItem(sku['_id'], sku['source_id'], sku['category_id'], sku['gross_price'])
116
                else:
117
                    netPriceAfterCashBack = getNetPriceForItem(sku['_id'], sku['source_id'], sku['category_id'], sku['available_price'])
118
 
13755 kshitij.so 119
            info = __SkuInfo(sku['_id'], sku['skuBundleId'], sku['category_id'], sku['mrp'], sku['available_price'], sku['source_id'], sku['rank'], None, None, 0.0, None, \
17678 kshitij.so 120
                             None, None, None, None, sku['status'], sku['in_stock'],sku['maxPrice'],sku['brand'].strip().upper(), 0, sku['brand_id'], None, sku['codAvailable'], 0, sku['gross_price'], sku['subCategoryId'], \
19144 kshitij.so 121
                             sku['subCategory'],sku['shippingCost'],netPriceAfterCashBack)
15854 kshitij.so 122
            exceptionalNlc = list(get_mongo_connection().Catalog.ExceptionalNlc.find( {"$and" : [ {'skuBundleId':info.skuBundleId}, {'overrideNlc':1} ]} ))
13755 kshitij.so 123
            if len(exceptionalNlc) > 0:
124
                """Exceptional nlc found, no need to calculate max and min R-nlc"""
125
                info.maxNlc = exceptionalNlc[0]['maxNlc']
126
                info.minNlc = exceptionalNlc[0]['minNlc']
14842 kshitij.so 127
                if info.maxprice == 0:
128
                    info.maxprice = exceptionalNlc[0]['maxNlc']
13755 kshitij.so 129
                LATEST_UPDATED_ITEMS.append(info)
130
                continue
131
 
15854 kshitij.so 132
            skuSchemeDetails = list(get_mongo_connection().Catalog.SkuSchemeDetails.find( {'skuBundleId':info.skuBundleId}))
13755 kshitij.so 133
            if len(skuSchemeDetails) > 0:
134
                """Sku scheme details, populate scheme amount (Recently added)"""
13824 kshitij.so 135
 
136
                #TODO Add start date and end date of scehems
137
 
13755 kshitij.so 138
                info.schemeAmount = float(skuSchemeDetails[0]['schemeAmount'])
139
 
15854 kshitij.so 140
            skuDealerPrices = list(get_mongo_connection().Catalog.SkuDealerPrices.find( {'skuBundleId':info.skuBundleId} ) )
13755 kshitij.so 141
            if len(skuDealerPrices) > 0:
142
                info.dp = skuDealerPrices[0]['dp']
16253 kshitij.so 143
                info.showDp = skuDealerPrices[0]['showDp']
15854 kshitij.so 144
            skuDiscount = list(get_mongo_connection().Catalog.SkuDiscountInfo.find( {'skuBundleId':info.skuBundleId} ) )
13755 kshitij.so 145
            if len(skuDiscount) > 0:
146
                """Sku rule found, populate max , min Discount and discount type"""
147
                info.maxDiscount = skuDiscount[0]['max_discount']
148
                info.minDiscount = skuDiscount[0]['min_discount']
149
                info.discountType = DISCOUNT_TYPE.get(skuDiscount[0]['discountType'].upper())
150
                LATEST_UPDATED_ITEMS.append(info)
151
                continue
152
 
14035 kshitij.so 153
            categoryDiscount = list(get_mongo_connection().Catalog.CategoryDiscount.find( {"$and" : [{'brand':sku['brand'].strip().upper()}, {'category_id':sku['category_id']} ]} ))
13755 kshitij.so 154
            if len(categoryDiscount) > 0:
155
                info.maxDiscount = categoryDiscount[0]['max_discount']
156
                info.minDiscount = categoryDiscount[0]['min_discount']
157
                info.discountType = DISCOUNT_TYPE.get(categoryDiscount[0]['discountType'].upper())
158
 
159
            LATEST_UPDATED_ITEMS.append(info)
160
        offset = offset + 300
161
    for lol in LATEST_UPDATED_ITEMS:
162
        print lol.__dict__
163
 
164
 
165
def calculateNlc():
166
    global LATEST_UPDATED_ITEMS
167
    populated = 0
168
    while(populated <= len(LATEST_UPDATED_ITEMS)):
169
        inventory_client = InventoryClient().get_client()
170
        for obj in LATEST_UPDATED_ITEMS[populated:300+populated]:
171
            if obj.maxNlc > 0 and obj.minNlc > 0:
172
                continue
173
            saholic_sku = list(get_mongo_connection().Catalog.MasterData.find( {"$and":[{'skuBundleId': obj.skuBundleId}, { 'source_id' : SOURCE_MAP.get('SAHOLIC')}] }))
174
            identifier = None
175
            if len(saholic_sku) > 0:
176
                identifier = saholic_sku[0]['identifier']
177
            if obj.discountType == DISCOUNT_TYPE.get('MRP'):
178
                if obj.mrp == 0:
179
                    """Now mrp is zero, so we have to use saholic MRP"""
180
                    if identifier is not None:
181
                        it = Item.query.filter_by(catalog_item_id=identifier).first()
182
                        obj.mrp = it.mrp
183
                if obj.mrp > 0:
14842 kshitij.so 184
                    print obj._id
13755 kshitij.so 185
                    obj.minNlc = obj.mrp - (obj.mrp * obj.maxDiscount/100) - obj.schemeAmount
13824 kshitij.so 186
                    obj.maxNlc = obj.mrp - (obj.mrp * obj.minDiscount/100) - obj.schemeAmount
14842 kshitij.so 187
                    if obj.maxprice == 0:
188
                        obj.maxprice = obj.maxNlc  
13755 kshitij.so 189
            elif obj.discountType == DISCOUNT_TYPE.get('DP'):
190
                if obj.dp == 0:
191
                    """Now dp is zero, so we have to use saholic minimum dp for item"""
192
                    if identifier is not None:
193
                        it = Item.query.filter_by(catalog_item_id=identifier).first()
194
                        try:
195
                            vendorPricing = inventory_client.getAllItemPricing(it.id)
196
                            min_dp = min(pricing.dealerPrice for pricing in vendorPricing)
197
                            obj.dp = min_dp 
16253 kshitij.so 198
                            obj.showDp = 1
13755 kshitij.so 199
                        except:
200
                            pass
201
                if obj.dp > 0:
202
                    obj.minNlc = obj.dp - (obj.dp * obj.maxDiscount/100) - obj.schemeAmount
13824 kshitij.so 203
                    obj.maxNlc = obj.dp - (obj.dp * obj.minDiscount/100) - obj.schemeAmount
14842 kshitij.so 204
                    if obj.maxprice == 0:
205
                        obj.maxprice = obj.maxNlc  
13755 kshitij.so 206
            else:
207
                """No rule found, use saholic min nlc as max and min R-Nlc"""
208
                if identifier is not None:
209
                    it = Item.query.filter_by(catalog_item_id=identifier).first()
210
                    try:
211
                        vendorPricing = inventory_client.getAllItemPricing(it.id)
212
                        min_nlc = min(pricing.nlc for pricing in vendorPricing)
213
                        obj.maxNlc = min_nlc
13824 kshitij.so 214
                        obj.minNlc = min_nlc
14842 kshitij.so 215
                        if obj.maxprice == 0:
216
                            obj.maxprice = obj.maxNlc   
13755 kshitij.so 217
                    except:
218
                        pass
219
        populated = populated + 300
220
        time.sleep(10) 
221
 
14306 kshitij.so 222
def addManualDealsInfo():
223
    for sku in LATEST_UPDATED_ITEMS:
224
        manualDeal = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':sku.source_id, 'sku':sku._id}))
225
        if len(manualDeal) > 0:
226
            sku.dealType = manualDeal[0]['dealType']
14310 kshitij.so 227
 
228
    """Remove deal flag from expired deals"""
14311 kshitij.so 229
    manualDeals = list(get_mongo_connection().Catalog.Deals.find({'dealType':1}))
14310 kshitij.so 230
    for manualDeal in manualDeals:
14389 kshitij.so 231
        d_manualDeal = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':manualDeal['source_id'], 'sku':manualDeal['_id']}))
232
        if len(d_manualDeal) > 0:
14310 kshitij.so 233
            continue
234
        else:
16507 kshitij.so 235
            get_mongo_connection().Catalog.Deals.update({'_id':manualDeal['_id']},{"$set":{'dealType':0}},upsert=False, multi=False)
14306 kshitij.so 236
 
13755 kshitij.so 237
def calculateNlcPoints():
238
    global LATEST_UPDATED_ITEMS
14842 kshitij.so 239
    print "inside nlc oints"
13755 kshitij.so 240
    for sku in LATEST_UPDATED_ITEMS:
241
        if sku.maxNlc and sku.minNlc:
14842 kshitij.so 242
            print sku._id
13824 kshitij.so 243
 
244
            """Create map - TODO"""
245
 
246
            if sku.status == 2:
247
                eolWeight = .60
248
            else:
249
                eolWeight = 1.0
250
            if sku.category_id == 3:
251
                basePointPercentage = 5.0
252
                maxNlcPoints = 200
253
            elif sku.category_id == 5:
254
                basePointPercentage = 8.0
255
                maxNlcPoints = 150
17540 kshitij.so 256
            elif sku.category_id == 6:
257
                basePointPercentage = 5.0
258
                maxNlcPoints = 200
259
 
13824 kshitij.so 260
            else:
261
                basePointPercentage = 10.0
262
                maxNlcPoints = 150
14842 kshitij.so 263
            discFromMinNlc = float((sku.minNlc - sku.available_price))/sku.available_price *100
264
            discFromMaxNlc = float((sku.maxNlc - sku.available_price))/sku.available_price *100
265
            print discFromMinNlc
266
            print discFromMaxNlc
13755 kshitij.so 267
            if discFromMinNlc > 0:
13824 kshitij.so 268
                nlcPoints = 100/basePointPercentage * discFromMinNlc
13755 kshitij.so 269
            elif discFromMinNlc < 0 and discFromMaxNlc > 0:
270
                nlcPoints = 0
271
            else:
13824 kshitij.so 272
                nlcPoints = 100/basePointPercentage * discFromMinNlc
273
            if (min(nlcPoints,maxNlcPoints)) > 0:
274
                sku.nlcPoints = (min(nlcPoints,maxNlcPoints)) * eolWeight
275
            else:
276
                sku.nlcPoints = (min(nlcPoints,maxNlcPoints))
13755 kshitij.so 277
        else:
278
            sku.nlcPoints = 0
279
 
280
def commitData():
281
    global LATEST_UPDATED_ITEMS
282
    for sku in LATEST_UPDATED_ITEMS:
283
        #get_mongo_connection().Catalog.Deals.update({'_id':sku._id},{'$set' : sku.__dict__},upsert=True,multi=True)
14020 amit.gupta 284
        get_mongo_connection().Catalog.Deals.update({'_id':sku._id},{"$set":sku.__dict__},upsert=True)
13755 kshitij.so 285
 
286
 
287
def addBestSellerPoints():
288
    allItems = list(get_mongo_connection().Catalog.Deals.find({})) 
289
    for sku in allItems:
13824 kshitij.so 290
        bestSellerPoints = list(get_mongo_connection().Catalog.BestSellerPoints.find( {"$and":[{'min_rank': { "$lte": sku['rank'] } }, {'max_rank': { "$gte": sku['rank'] } } , { 'category_id' : sku['category_id'] }, { 'source_id' : sku['source_id'] }] } ))
13755 kshitij.so 291
        if len(bestSellerPoints) > 0:
13824 kshitij.so 292
            print bestSellerPoints[0]['points']
293
            if (bestSellerPoints[0]['points']) > 0:
16253 kshitij.so 294
                sku['bestSellerPoints'] = (bestSellerPoints[0]['points']) * bestSellerPoints[0]['weightage'] * STATUS_WEIGHTAGE.get(sku['status'])
13824 kshitij.so 295
            else:
296
                sku['bestSellerPoints'] = (bestSellerPoints[0]['points'])
13755 kshitij.so 297
        else:
17708 kshitij.so 298
            if sku['category_id'] == 6:
17763 kshitij.so 299
                sku['bestSellerPoints'] = 0
17708 kshitij.so 300
            else:
301
                sku['bestSellerPoints'] = -120
14114 kshitij.so 302
        #sku['totalPoints'] = sku['bestSellerPoints'] + sku['nlcPoints']
303
        get_mongo_connection().Catalog.Deals.update({'_id':sku['_id']},{'$set':{'bestSellerPoints':sku['bestSellerPoints']}},multi=False)
304
 
14390 kshitij.so 305
    shortageSkus = get_mongo_connection().Catalog.MasterData.find({"$and":[{'is_shortage': 1 }, { 'source_id' : { "$in": SOURCE_MAP.values() } }] }).distinct('_id')
306
    print "Shortage skus"
307
    print shortageSkus
14388 kshitij.so 308
 
14114 kshitij.so 309
    for sku in allItems:
310
        deal_item = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':sku['skuBundleId']}).sort('bestSellerPoints',pymongo.DESCENDING).limit(1))
14142 kshitij.so 311
        sku['catalogBestSellerPoints'] = deal_item[0]['bestSellerPoints']
14388 kshitij.so 312
        shortagePoints = 50 if sku['_id'] in shortageSkus else 0
14391 kshitij.so 313
        print "Shortage points for ",sku['_id']
314
        print shortagePoints
16868 kshitij.so 315
 
316
        dealPoints = DEAL_POINTS_MAP.get(sku['skuBundleId'])
317
 
318
        if dealPoints is not None and dealPoints.manualDealThresholdPrice >= sku['available_price']:
319
            sku['dealPoints'] = dealPoints.points
320
            sku['manualDealThresholdPrice'] = dealPoints.manualDealThresholdPrice
321
        else:
322
            sku['dealPoints'] = 0
323
            sku['manualDealThresholdPrice'] = None
324
 
325
 
326
        sku['totalPoints'] = sku['catalogBestSellerPoints'] + sku['nlcPoints'] + shortagePoints + sku['dealPoints'] 
327
        get_mongo_connection().Catalog.Deals.update({'_id':sku['_id']},{'$set':{'catalogBestSellerPoints':sku['catalogBestSellerPoints'],'totalPoints':sku['totalPoints'],'dealPoints':sku['dealPoints'], \
328
                                                                                    'manualDealThresholdPrice':sku['manualDealThresholdPrice']}},multi=False)
15271 kshitij.so 329
 
330
 
13755 kshitij.so 331
 
14325 kshitij.so 332
def populateNegativeDeals():
333
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
334
    mc.set("negative_deals", negativeDeals, 600)   
335
 
16868 kshitij.so 336
def eliminateSimilarDeals():
13912 kshitij.so 337
    allItems = get_mongo_connection().Catalog.Deals.find().distinct('skuBundleId')
338
    for skuBundleId in allItems:
339
        print skuBundleId
19144 kshitij.so 340
        similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('netPriceAfterCashBack',pymongo.ASCENDING)]))
13828 kshitij.so 341
        bestPrice = float("inf")
342
        bestOne = None
343
        bestSellerPoints = 0
344
        toUpdate = []
16019 kshitij.so 345
        prepaidBestPrice = float("inf")
346
        prepaidBestOne = None
347
        prepaidBestSellerPoints = 0
13828 kshitij.so 348
        for similarItem in similarItems:
16019 kshitij.so 349
            if similarItem['codAvailable'] ==1:
350
                if mc.get("negative_deals") is None:
351
                    populateNegativeDeals()
16171 kshitij.so 352
                if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 353
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
354
                    continue
17675 kshitij.so 355
                if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0 and similarItem['category_id']!=6:
16019 kshitij.so 356
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
357
                    continue
19144 kshitij.so 358
                if similarItem['netPriceAfterCashBack'] < bestPrice:
16019 kshitij.so 359
                    bestOne = similarItem
19144 kshitij.so 360
                    bestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 361
                    bestSellerPoints = similarItem['bestSellerPoints']
19144 kshitij.so 362
                elif similarItem['netPriceAfterCashBack'] == bestPrice and bestSellerPoints < similarItem['bestSellerPoints']:
16019 kshitij.so 363
                    bestOne = similarItem
19144 kshitij.so 364
                    bestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 365
                    bestSellerPoints = similarItem['bestSellerPoints']
366
                else:
367
                    pass
13828 kshitij.so 368
            else:
16019 kshitij.so 369
                if mc.get("negative_deals") is None:
370
                    populateNegativeDeals()
16171 kshitij.so 371
                if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 372
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
373
                    continue
17750 kshitij.so 374
                if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0 and similarItem['category_id']!=6:
16019 kshitij.so 375
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
376
                    continue
19144 kshitij.so 377
                if similarItem['netPriceAfterCashBack'] < prepaidBestPrice:
16019 kshitij.so 378
                    prepaidBestOne = similarItem
19144 kshitij.so 379
                    prepaidBestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 380
                    prepaidBestSellerPoints = similarItem['bestSellerPoints']
19144 kshitij.so 381
                elif similarItem['netPriceAfterCashBack'] == prepaidBestPrice and prepaidBestSellerPoints < similarItem['bestSellerPoints']:
16019 kshitij.so 382
                    prepaidBestOne = similarItem
19144 kshitij.so 383
                    prepaidBestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 384
                    prepaidBestSellerPoints = similarItem['bestSellerPoints']
385
                else:
386
                    pass
16026 kshitij.so 387
        if bestOne is not None or prepaidBestOne is not None:
13828 kshitij.so 388
            for similarItem in similarItems:
389
                toUpdate.append(similarItem['_id'])
16026 kshitij.so 390
            if bestOne is not None:
391
                toUpdate.remove(bestOne['_id'])
392
                get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
393
            if prepaidBestOne is not None:
16071 kshitij.so 394
                if bestOne is not None:
19144 kshitij.so 395
                    if prepaidBestOne['netPriceAfterCashBack'] < bestOne['netPriceAfterCashBack']: 
16071 kshitij.so 396
                        toUpdate.remove(prepaidBestOne['_id'])
397
                        get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
398
                else:
399
                    toUpdate.remove(prepaidBestOne['_id'])
400
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13828 kshitij.so 401
        if len(toUpdate) > 0:
16019 kshitij.so 402
            get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
13755 kshitij.so 403
 
16868 kshitij.so 404
def populateDealPointsBundle():
405
    global DEAL_POINTS_MAP
406
    activeDealPoints = get_mongo_connection().Catalog.DealPoints.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}})
407
    for activeDeal in activeDealPoints:
408
        dealPoints = __DealPoints(activeDeal['dealThresholdPrice'], activeDeal['dealPoints'])
19144 kshitij.so 409
        DEAL_POINTS_MAP[activeDeal['skuBundleId']] = dealPoints
16868 kshitij.so 410
 
19144 kshitij.so 411
def getNetPriceForItem(itemId, source_id, category_id ,price):
412
    cash_back_type = 0
413
    cash_back = 0
414
    try:
415
        cashBack = getCashBack(itemId, source_id, category_id, mc, options.mongoHost)
416
        if not cashBack or cashBack.get('cash_back_status')!=1:
417
            cash_back_type = 0
418
            cash_back = 0 
419
 
420
        else:
421
            if cashBack['cash_back_type'] in (1,2):
422
 
423
                if cashBack.get('maxCashBack') is not None:
424
 
425
                    if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*price)/100 > cashBack.get('maxCashBack'):
426
                        cashBack['cash_back_type'] = 2
427
                        cashBack['cash_back'] = cashBack['maxCashBack']
428
                    elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
429
                        cashBack['cash_back'] = cashBack['maxCashBack']
430
                    else:
431
                        pass
432
 
433
 
434
 
435
                cash_back_type = cashBack['cash_back_type']
436
                cash_back = float(cashBack['cash_back'])
437
    except Exception as cashBackEx:
438
        pass
439
 
440
    if cash_back_type ==1:
19211 kshitij.so 441
        return (price - math.floor(float(cash_back)*price/100))
19144 kshitij.so 442
    elif cash_back_type ==2:
443
        return (price - cash_back)
444
    else:
445
        return price
446
 
447
 
19584 kshitij.so 448
def getSubCategoryRanking():
449
    subCatRanks = get_mongo_connection().Catalog.SubCategoriesRank.find().sort([('rank',ASCENDING)])
450
    for subCatRank in subCatRanks:
451
        subCatRankList.append(subCatRank['subCategoryId'])
452
 
453
def startBucketing():
454
 
455
    """Lets create initial buckets of 25 products each from all valid subCategories"""
456
    initialMap = {}
457
    for subCat in subCatRankList:
458
        products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':{"$gt":0}}).sort([('internalRank',ASCENDING)]).limit(25))
459
        temp_list = []
460
        for product in products:
461
            if product['skuBundleId'] not in temp_list:
462
                temp_list.append(product['skuBundleId'])
463
        initialMap[subCat] = temp_list
464
    laterMap = {}
465
    for subCat in subCatRankList:
466
        products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':{"$gt":0}}).sort([('internalRank',ASCENDING)]).skip(25))
467
        temp_list = []
468
        for product in products:
469
            if product['skuBundleId'] not in temp_list:
470
                temp_list.append(product['skuBundleId'])
471
        laterMap[subCat] = temp_list
472
 
473
    for subCat in subCatRankList:
474
        no_of_products = len(initialMap.get(subCat))
475
        if no_of_products < 25:
476
            toFetch = 25 - no_of_products
477
            products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':0}).limit(toFetch))
478
            for product in products:
479
                initialMap.get(subCat).append(product['skuBundleId'])
480
            products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':0}).skip(toFetch))
481
            for product in products:
482
                laterMap.get(subCat).append(product['skuBundleId'])
483
        else:
484
            products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':0}))
485
            for product in products:
486
                laterMap.get(subCat).append(product['skuBundleId'])
19144 kshitij.so 487
 
19584 kshitij.so 488
    """Now we have created two diff. maps having product sorted by rank.Lets create buckets (5 products) from initialMap and (10 products) from laterMap"""
489
 
490
    dealRankPoints = 0
491
    for k, v in initialMap.iteritems():
492
        dealRankPoints = dealRankPoints + len(v)
493
    for k, v in laterMap.iteritems():
494
        dealRankPoints = dealRankPoints + len(v)
495
 
496
    while(len(initialMap.keys())>0):
497
        for subCat in subCatRankList:
498
            v = initialMap.get(subCat)
499
            if v is None or len(v) ==0:
500
                initialMap.pop(subCat, None)
501
                continue
502
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':v[0]},{"$set":{'dealRankPoints':dealRankPoints}},upsert=False,multi=True)
503
            dealRankPoints = dealRankPoints-1
504
            v.pop(0)
505
            if len(v) == 0:
506
                initialMap.pop(subCat, None)
507
 
508
 
509
    print "============================================================"
510
 
511
    while(len(laterMap.keys())>0):
512
        for subCat in subCatRankList:
513
            v = laterMap.get(subCat)
514
            if v is None or len(v) ==0:
515
                laterMap.pop(subCat, None)
516
                continue
517
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':v[0]},{"$set":{'dealRankPoints':dealRankPoints}},upsert=False,multi=True)
518
            dealRankPoints = dealRankPoints-1
519
            v.pop(0)
520
            if len(v) == 0:
521
                laterMap.pop(subCat, None)
522
 
523
 
524
 
525
 
19144 kshitij.so 526
# def calculateNetPriceAfterCashback():
527
#     for data in LATEST_UPDATED_ITEMS:
528
#         master = list(get_mongo_connection().Catalog.MasterData.find({'_id':data._id}))
529
#         if master[0]['source_id'] != SOURCE_MAP.get('PAYTM.COM'):
530
#             netPriceAfterCashBack = getNetPriceForItem(data._id, master[0]['source_id'], master[0]['category_id'], master[0]['available_price'])
531
#             get_mongo_connection().Catalog.Deals.update({'_id':data._id},{"$set":{'available_price':master[0]['available_price'],'in_stock':master[0]['in_stock'],'netPriceAfterCashBack':netPriceAfterCashBack}})
532
#         else:
533
#             if master[0]['codAvailable'] ==0:
534
#                 netPriceAfterCashBack = getNetPriceForItem(data._id, master[0]['source_id'], master[0]['category_id'], master[0]['gross_price'])
535
#             else:
536
#                 netPriceAfterCashBack = getNetPriceForItem(data._id, master[0]['source_id'], master[0]['category_id'], master[0]['available_price'])
537
#             get_mongo_connection().Catalog.Deals.update({'_id':data._id},{"$set":{'available_price':master[0]['available_price'],'gross_price':master[0]['gross_price'],'in_stock':master[0]['in_stock'],'netPriceAfterCashBack':netPriceAfterCashBack}})
538
#         
539
 
13755 kshitij.so 540
def main():
14263 kshitij.so 541
    try:
19194 kshitij.so 542
        print "Starting populating stuff ", datetime.now()
14263 kshitij.so 543
        populateStuff()
19194 kshitij.so 544
        print "Starting calculate nlc stuff ", datetime.now()
14263 kshitij.so 545
        calculateNlc()
19194 kshitij.so 546
        print "Starting adding manualdeals stuff ", datetime.now()
14306 kshitij.so 547
        addManualDealsInfo()
14263 kshitij.so 548
    finally:
549
        session.close()
19194 kshitij.so 550
    print "Starting calculate nlc points ", datetime.now()
13755 kshitij.so 551
    calculateNlcPoints()
19194 kshitij.so 552
    print "commiting data ", datetime.now()
13755 kshitij.so 553
    commitData()
19194 kshitij.so 554
    print "Populate deal points bundle ", datetime.now()
16868 kshitij.so 555
    populateDealPointsBundle()
19194 kshitij.so 556
    print "Add best seller points ", datetime.now()
13755 kshitij.so 557
    addBestSellerPoints()
19194 kshitij.so 558
    print "eliminate similar deals ", datetime.now()
16868 kshitij.so 559
    eliminateSimilarDeals()
19194 kshitij.so 560
    print "done ", datetime.now()
19584 kshitij.so 561
    getSubCategoryRanking()
562
    startBucketing()
563
    print "Done with bucketing",datetime.now()
564
 
13755 kshitij.so 565
 
13828 kshitij.so 566
 
13755 kshitij.so 567
if __name__=='__main__':
14842 kshitij.so 568
    main()