Subversion Repositories SmartDukaan

Rev

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