Subversion Repositories SmartDukaan

Rev

Rev 19637 | Rev 20368 | 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
        bestSellerPoints = 0
349
        toUpdate = []
16019 kshitij.so 350
        prepaidBestPrice = float("inf")
351
        prepaidBestOne = None
352
        prepaidBestSellerPoints = 0
13828 kshitij.so 353
        for similarItem in similarItems:
16019 kshitij.so 354
            if similarItem['codAvailable'] ==1:
355
                if mc.get("negative_deals") is None:
356
                    populateNegativeDeals()
16171 kshitij.so 357
                if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 358
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
359
                    continue
17675 kshitij.so 360
                if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0 and similarItem['category_id']!=6:
16019 kshitij.so 361
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
362
                    continue
19144 kshitij.so 363
                if similarItem['netPriceAfterCashBack'] < bestPrice:
20347 kshitij.so 364
 
16019 kshitij.so 365
                    bestOne = similarItem
19144 kshitij.so 366
                    bestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 367
                    bestSellerPoints = similarItem['bestSellerPoints']
20347 kshitij.so 368
                elif similarItem['netPriceAfterCashBack'] == bestPrice:
369
 
370
                    try:
371
                        if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(bestOne['source_id']))):
372
                            continue
373
                    except:
374
                        traceback.print_exc()
375
 
16019 kshitij.so 376
                    bestOne = similarItem
19144 kshitij.so 377
                    bestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 378
                    bestSellerPoints = similarItem['bestSellerPoints']
379
                else:
380
                    pass
13828 kshitij.so 381
            else:
16019 kshitij.so 382
                if mc.get("negative_deals") is None:
383
                    populateNegativeDeals()
16171 kshitij.so 384
                if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 385
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
386
                    continue
17750 kshitij.so 387
                if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0 and similarItem['category_id']!=6:
16019 kshitij.so 388
                    get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
389
                    continue
19144 kshitij.so 390
                if similarItem['netPriceAfterCashBack'] < prepaidBestPrice:
16019 kshitij.so 391
                    prepaidBestOne = similarItem
19144 kshitij.so 392
                    prepaidBestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 393
                    prepaidBestSellerPoints = similarItem['bestSellerPoints']
20347 kshitij.so 394
                elif similarItem['netPriceAfterCashBack'] == prepaidBestPrice:
395
 
396
                    try:
397
                        if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(bestOne['source_id']))):
398
                            continue
399
                    except:
400
                        traceback.print_exc()
401
 
16019 kshitij.so 402
                    prepaidBestOne = similarItem
19144 kshitij.so 403
                    prepaidBestPrice = similarItem['netPriceAfterCashBack']
16019 kshitij.so 404
                    prepaidBestSellerPoints = similarItem['bestSellerPoints']
405
                else:
406
                    pass
16026 kshitij.so 407
        if bestOne is not None or prepaidBestOne is not None:
13828 kshitij.so 408
            for similarItem in similarItems:
409
                toUpdate.append(similarItem['_id'])
16026 kshitij.so 410
            if bestOne is not None:
411
                toUpdate.remove(bestOne['_id'])
412
                get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
413
            if prepaidBestOne is not None:
16071 kshitij.so 414
                if bestOne is not None:
19144 kshitij.so 415
                    if prepaidBestOne['netPriceAfterCashBack'] < bestOne['netPriceAfterCashBack']: 
16071 kshitij.so 416
                        toUpdate.remove(prepaidBestOne['_id'])
417
                        get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
418
                else:
419
                    toUpdate.remove(prepaidBestOne['_id'])
420
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13828 kshitij.so 421
        if len(toUpdate) > 0:
16019 kshitij.so 422
            get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
13755 kshitij.so 423
 
16868 kshitij.so 424
def populateDealPointsBundle():
425
    global DEAL_POINTS_MAP
426
    activeDealPoints = get_mongo_connection().Catalog.DealPoints.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}})
427
    for activeDeal in activeDealPoints:
428
        dealPoints = __DealPoints(activeDeal['dealThresholdPrice'], activeDeal['dealPoints'])
19144 kshitij.so 429
        DEAL_POINTS_MAP[activeDeal['skuBundleId']] = dealPoints
16868 kshitij.so 430
 
19144 kshitij.so 431
def getNetPriceForItem(itemId, source_id, category_id ,price):
432
    cash_back_type = 0
433
    cash_back = 0
434
    try:
435
        cashBack = getCashBack(itemId, source_id, category_id, mc, options.mongoHost)
436
        if not cashBack or cashBack.get('cash_back_status')!=1:
437
            cash_back_type = 0
438
            cash_back = 0 
439
 
440
        else:
441
            if cashBack['cash_back_type'] in (1,2):
442
 
443
                if cashBack.get('maxCashBack') is not None:
444
 
445
                    if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*price)/100 > cashBack.get('maxCashBack'):
446
                        cashBack['cash_back_type'] = 2
447
                        cashBack['cash_back'] = cashBack['maxCashBack']
448
                    elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
449
                        cashBack['cash_back'] = cashBack['maxCashBack']
450
                    else:
451
                        pass
452
 
453
 
454
 
455
                cash_back_type = cashBack['cash_back_type']
456
                cash_back = float(cashBack['cash_back'])
457
    except Exception as cashBackEx:
458
        pass
459
 
460
    if cash_back_type ==1:
19211 kshitij.so 461
        return (price - math.floor(float(cash_back)*price/100))
19144 kshitij.so 462
    elif cash_back_type ==2:
463
        return (price - cash_back)
464
    else:
465
        return price
466
 
467
 
19584 kshitij.so 468
def getSubCategoryRanking():
469
    subCatRanks = get_mongo_connection().Catalog.SubCategoriesRank.find().sort([('rank',ASCENDING)])
470
    for subCatRank in subCatRanks:
471
        subCatRankList.append(subCatRank['subCategoryId'])
472
 
473
def startBucketing():
474
 
475
    """Lets create initial buckets of 25 products each from all valid subCategories"""
476
    initialMap = {}
477
    for subCat in subCatRankList:
478
        products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':{"$gt":0}}).sort([('internalRank',ASCENDING)]).limit(25))
479
        temp_list = []
480
        for product in products:
481
            if product['skuBundleId'] not in temp_list:
482
                temp_list.append(product['skuBundleId'])
483
        initialMap[subCat] = temp_list
484
    laterMap = {}
485
    for subCat in subCatRankList:
486
        products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':{"$gt":0}}).sort([('internalRank',ASCENDING)]).skip(25))
487
        temp_list = []
488
        for product in products:
489
            if product['skuBundleId'] not in temp_list:
490
                temp_list.append(product['skuBundleId'])
491
        laterMap[subCat] = temp_list
492
 
493
    for subCat in subCatRankList:
494
        no_of_products = len(initialMap.get(subCat))
495
        if no_of_products < 25:
496
            toFetch = 25 - no_of_products
497
            products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':0}).limit(toFetch))
498
            for product in products:
499
                initialMap.get(subCat).append(product['skuBundleId'])
500
            products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':0}).skip(toFetch))
501
            for product in products:
502
                laterMap.get(subCat).append(product['skuBundleId'])
503
        else:
504
            products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':0}))
505
            for product in products:
506
                laterMap.get(subCat).append(product['skuBundleId'])
19144 kshitij.so 507
 
19584 kshitij.so 508
    """Now we have created two diff. maps having product sorted by rank.Lets create buckets (5 products) from initialMap and (10 products) from laterMap"""
509
 
510
    dealRankPoints = 0
511
    for k, v in initialMap.iteritems():
512
        dealRankPoints = dealRankPoints + len(v)
513
    for k, v in laterMap.iteritems():
514
        dealRankPoints = dealRankPoints + len(v)
515
 
516
    while(len(initialMap.keys())>0):
517
        for subCat in subCatRankList:
518
            v = initialMap.get(subCat)
519
            if v is None or len(v) ==0:
520
                initialMap.pop(subCat, None)
521
                continue
522
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':v[0]},{"$set":{'dealRankPoints':dealRankPoints}},upsert=False,multi=True)
523
            dealRankPoints = dealRankPoints-1
524
            v.pop(0)
525
            if len(v) == 0:
526
                initialMap.pop(subCat, None)
527
 
528
 
529
    print "============================================================"
530
 
531
    while(len(laterMap.keys())>0):
532
        for subCat in subCatRankList:
533
            v = laterMap.get(subCat)
534
            if v is None or len(v) ==0:
535
                laterMap.pop(subCat, None)
536
                continue
537
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':v[0]},{"$set":{'dealRankPoints':dealRankPoints}},upsert=False,multi=True)
538
            dealRankPoints = dealRankPoints-1
539
            v.pop(0)
540
            if len(v) == 0:
541
                laterMap.pop(subCat, None)
542
 
19631 kshitij.so 543
def shuffle():
544
    for subCat in subCatRankList:
545
        products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':0},{'skuBundleId':1}))
546
        if len(products) >0:
547
            max_rank = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat}).sort([('internalRank',DESCENDING)]).limit(1))
548
            rank_to_assign = max_rank[0]['internalRank'] + 1
549
            for p in products:
550
                get_mongo_connection().Catalog.MasterData.update({'skuBundleId':p['skuBundleId']},{"$set":{'internalRank':rank_to_assign}},upsert=False,multi=True)
551
                rank_to_assign = rank_to_assign + 1
552
 
553
        new_rank =1
554
        start = 0
555
        end = 5
556
        products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':{"$gt":0}},{'skuBundleId':1}).sort([('internalRank',ASCENDING)]).limit(25))
557
        while(True):
558
            temp_list = products[start:end]
559
            shuffled_list = temp_list[1:] + temp_list[:1]
560
            if len(shuffled_list) > 0:
561
                for p in shuffled_list:
562
                    get_mongo_connection().Catalog.MasterData.update({'skuBundleId':p['skuBundleId']},{"$set":{'internalRank':new_rank}},upsert=False,multi=True)
563
                    new_rank = new_rank + 1
564
                start = end
565
                end = end + 5
566
            else:
567
                break
568
        products = list(get_mongo_connection().Catalog.MasterData.find({'subCategoryId':subCat,'internalRank':{"$gt":0}},{'skuBundleId':1}).sort([('internalRank',ASCENDING)]).skip(25))
569
        start = 0
570
        end = 10
571
        while(True):
572
            temp_list = products[start:end]
573
            shuffled_list = temp_list[1:] + temp_list[:1]
574
            if len(shuffled_list) > 0:
575
                for p in shuffled_list:
576
                    get_mongo_connection().Catalog.MasterData.update({'skuBundleId':p['skuBundleId']},{"$set":{'internalRank':new_rank}},upsert=False,multi=True)
577
                    new_rank = new_rank + 1
578
                start = end
579
                end = end + 10
580
            else:
581
                break
582
 
13755 kshitij.so 583
def main():
14263 kshitij.so 584
    try:
19194 kshitij.so 585
        print "Starting populating stuff ", datetime.now()
14263 kshitij.so 586
        populateStuff()
19194 kshitij.so 587
        print "Starting calculate nlc stuff ", datetime.now()
14263 kshitij.so 588
        calculateNlc()
19194 kshitij.so 589
        print "Starting adding manualdeals stuff ", datetime.now()
14306 kshitij.so 590
        addManualDealsInfo()
14263 kshitij.so 591
    finally:
592
        session.close()
19194 kshitij.so 593
    print "Starting calculate nlc points ", datetime.now()
13755 kshitij.so 594
    calculateNlcPoints()
19194 kshitij.so 595
    print "commiting data ", datetime.now()
13755 kshitij.so 596
    commitData()
19194 kshitij.so 597
    print "Populate deal points bundle ", datetime.now()
16868 kshitij.so 598
    populateDealPointsBundle()
19194 kshitij.so 599
    print "Add best seller points ", datetime.now()
13755 kshitij.so 600
    addBestSellerPoints()
19194 kshitij.so 601
    print "eliminate similar deals ", datetime.now()
16868 kshitij.so 602
    eliminateSimilarDeals()
19194 kshitij.so 603
    print "done ", datetime.now()
19584 kshitij.so 604
    getSubCategoryRanking()
19631 kshitij.so 605
    if options.shuffle=='true':
606
        print "Shuffling products"
607
        shuffle()
19634 kshitij.so 608
    startBucketing()
19584 kshitij.so 609
    print "Done with bucketing",datetime.now()
610
 
13755 kshitij.so 611
 
13828 kshitij.so 612
 
13755 kshitij.so 613
if __name__=='__main__':
14842 kshitij.so 614
    main()