Subversion Repositories SmartDukaan

Rev

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