Subversion Repositories SmartDukaan

Rev

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