Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
14305 amit.gupta 1
from bson.objectid import ObjectId
2
from datetime import datetime, timedelta
3
from dtr.config import PythonPropertyReader
16546 kshitij.so 4
from dtr.dao import FeaturedDeals, AppTransactions
14037 kshitij.so 5
from dtr.storage import DataService
6
from dtr.storage.DataService import price_preferences, brand_preferences, \
16631 manish.sha 7
    user_actions, Brands, app_offers, approved_app_transactions, user_app_cashbacks, user_app_installs
16304 amit.gupta 8
from dtr.storage.MemCache import MemCache
16560 amit.gupta 9
from dtr.utils.FetchLivePrices import returnLatestPrice
16631 manish.sha 10
from dtr.utils.utils import to_java_date, CB_PENDING, CB_APPROVED, CB_INIT, to_py_date
14305 amit.gupta 11
from elixir import *
12
from operator import itemgetter
13
import pymongo
16398 amit.gupta 14
import random
14322 kshitij.so 15
import re
14791 kshitij.so 16
import traceback
16631 manish.sha 17
import time
16693 manish.sha 18
from dtr.utils.MailSender import Email
13572 kshitij.so 19
 
20
con = None
21
 
14037 kshitij.so 22
DataService.initialize(db_hostname="localhost")
16304 amit.gupta 23
mc = MemCache("127.0.0.1")
14037 kshitij.so 24
 
16406 kshitij.so 25
SOURCE_MAP = {1:'AMAZON',2:'FLIPKART',3:'SNAPDEAL',4:'SAHOLIC',5:"SHOPCLUES.COM",6:"PAYTM.COM"}
14482 kshitij.so 26
 
15853 kshitij.so 27
COLLECTION_MAP = {
28
                  'ExceptionalNlc':'skuBundleId',
29
                  'SkuDealerPrices':'skuBundleId',
30
                  'SkuDiscountInfo':'skuBundleId',
31
                  'SkuSchemeDetails':'skuBundleId',
16488 kshitij.so 32
                  'DealPoints':'skuBundleId'
15853 kshitij.so 33
                  }
34
 
13572 kshitij.so 35
def get_mongo_connection(host='localhost', port=27017):
36
    global con
37
    if con is None:
38
        print "Establishing connection %s host and port %d" %(host,port)
39
        try:
40
            con = pymongo.MongoClient(host, port)
41
        except Exception, e:
42
            print e
43
            return None
44
    return con
45
 
13907 kshitij.so 46
def populateCashBack():
13921 kshitij.so 47
    print "Populating cashback"
48
    cashBackMap = {}
49
    itemCashBackMap = {}
13907 kshitij.so 50
    cashBack = list(get_mongo_connection().Catalog.CategoryCashBack.find())
51
    for row in cashBack:
13970 kshitij.so 52
        temp_map = {}
53
        temp_list = []
13907 kshitij.so 54
        if cashBackMap.has_key(row['source_id']):
55
            arr = cashBackMap.get(row['source_id'])
56
            for val in arr:
57
                temp_list.append(val)
58
            temp_map[row['category_id']] = row
59
            temp_list.append(temp_map)
60
            cashBackMap[row['source_id']] = temp_list 
61
        else:
62
            temp_map[row['category_id']] = row
63
            temp_list.append(temp_map)
64
            cashBackMap[row['source_id']] = temp_list
13921 kshitij.so 65
    itemCashBack = list(get_mongo_connection().Catalog.ItemCashBack.find())
66
    for row in itemCashBack:
67
        if not itemCashBackMap.has_key(row['skuId']):
68
            itemCashBackMap[row['skuId']] = row
14761 kshitij.so 69
    mc.set("item_cash_back", itemCashBackMap, 24 * 60 * 60)
70
    mc.set("category_cash_back", cashBackMap, 24 * 60 * 60)
13907 kshitij.so 71
 
13572 kshitij.so 72
def addCategoryDiscount(data):
13970 kshitij.so 73
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 74
    query = []
75
    data['brand'] = data['brand'].strip().upper()
13970 kshitij.so 76
    data['discountType'] = data['discountType'].upper().strip()
13572 kshitij.so 77
    query.append({"brand":data['brand']})
78
    query.append({"category_id":data['category_id']})
79
    r = collection.find({"$and":query})
80
    if r.count() > 0:
13639 kshitij.so 81
        return {0:"Brand & Category info already present."}
13572 kshitij.so 82
    else:
83
        collection.insert(data)
13970 kshitij.so 84
        get_mongo_connection().Catalog.MasterData.update({'brand':data['brand'],'category_id':data['category_id']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 85
        return {1:"Data added successfully"}
13572 kshitij.so 86
 
13970 kshitij.so 87
def updateCategoryDiscount(data,_id):
88
    try:
89
        collection = get_mongo_connection().Catalog.CategoryDiscount
90
        collection.update({'_id':ObjectId(_id)},{"$set":{'min_discount':data['min_discount'],'max_discount':data['max_discount'],'discountType':data['discountType'].upper().strip()}},upsert=False, multi = False)
91
        get_mongo_connection().Catalog.MasterData.update({'brand':data['brand'],'category_id':data['category_id']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
92
        return {1:"Data updated successfully"}
93
    except:
94
        return {0:"Data not updated."}
95
 
96
 
13572 kshitij.so 97
def getAllCategoryDiscount():
98
    data = []
13970 kshitij.so 99
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 100
    cursor = collection.find()
101
    for val in cursor:
102
        data.append(val)
103
    return data
104
 
14553 kshitij.so 105
def __getBundledSkusfromSku(sku):
106
    masterData =  get_mongo_connection().Catalog.MasterData.find_one({"_id":sku},{"skuBundleId":1})
107
    if masterData is not None:
108
        return list(get_mongo_connection().Catalog.MasterData.find({"skuBundleId":masterData.get('skuBundleId')},{'_id':1,'skuBundleId':1}))
109
    else:
110
        return []
13572 kshitij.so 111
 
15853 kshitij.so 112
def addSchemeDetailsForSku(data):
113
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
114
    result = collection.find_one({'skuBundleId':data['skuBundleId']})
115
    if result is None:
14553 kshitij.so 116
        collection.insert(data)
15853 kshitij.so 117
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14553 kshitij.so 118
        return {1:"Data added successfully"}
15853 kshitij.so 119
    return {1:"BundleId info already present"}
120
 
14069 kshitij.so 121
def getAllSkuWiseSchemeDetails(offset, limit):
13572 kshitij.so 122
    data = []
13970 kshitij.so 123
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
14071 kshitij.so 124
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 125
    for val in cursor:
15853 kshitij.so 126
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
127
        if master is not None:
128
            val['brand'] = master['brand']
129
            val['source_product_name'] = master['source_product_name']
14069 kshitij.so 130
        else:
131
            val['brand'] = ""
132
            val['source_product_name'] = ""
13572 kshitij.so 133
        data.append(val)
134
    return data
135
 
15853 kshitij.so 136
def addSkuDiscountInfo(data):
137
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
138
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
139
    if cursor is not None:
140
        return {0:"BundleId information already present."}
13572 kshitij.so 141
    else:
15853 kshitij.so 142
        collection.insert(data)
143
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 144
        return {1:"Data added successfully"}
13572 kshitij.so 145
 
13970 kshitij.so 146
def getallSkuDiscountInfo(offset, limit):
13572 kshitij.so 147
    data = []
13970 kshitij.so 148
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
149
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 150
    for val in cursor:
15853 kshitij.so 151
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
152
        if master is not None:
153
            val['brand'] = master['brand']
154
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 155
        else:
156
            val['brand'] = ""
157
            val['source_product_name'] = ""
13572 kshitij.so 158
        data.append(val)
159
    return data
160
 
13970 kshitij.so 161
def updateSkuDiscount(data,_id):
162
    try:
163
        collection = get_mongo_connection().Catalog.SkuDiscountInfo
164
        collection.update({'_id':ObjectId(_id)},{"$set":{'min_discount':data['min_discount'],'max_discount':data['max_discount'],'discountType':data['discountType'].upper().strip()}},upsert=False, multi = False)
15853 kshitij.so 165
        get_mongo_connection().Catalog.MasterData.update({'_id':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 166
        return {1:"Data updated successfully"}
167
    except:
168
        return {0:"Data not updated."}
169
 
170
 
15853 kshitij.so 171
def addExceptionalNlc(data):
172
    collection = get_mongo_connection().Catalog.ExceptionalNlc
173
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
174
    if cursor is not None:
175
        return {0:"BundleId information already present."}
13572 kshitij.so 176
    else:
15853 kshitij.so 177
        collection.insert(data)
178
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 179
        return {1:"Data added successfully"}
13572 kshitij.so 180
 
13970 kshitij.so 181
def getAllExceptionlNlcItems(offset, limit):
13572 kshitij.so 182
    data = []
13970 kshitij.so 183
    collection = get_mongo_connection().Catalog.ExceptionalNlc
14071 kshitij.so 184
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 185
    for val in cursor:
15853 kshitij.so 186
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
187
        if master is not None:
188
            val['brand'] = master['brand']
189
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 190
        else:
191
            val['brand'] = ""
192
            val['source_product_name'] = ""
13572 kshitij.so 193
        data.append(val)
194
    return data
195
 
14005 amit.gupta 196
def getMerchantOrdersByUser(userId, page=1, window=50, searchMap={}):
197
    if searchMap is None:
198
        searchMap = {}
13603 amit.gupta 199
    if page==None:
200
        page = 1
201
 
202
    if window==None:
203
        window = 50
204
    result = {}
13582 amit.gupta 205
    skip = (page-1)*window
14005 amit.gupta 206
 
14353 amit.gupta 207
    if userId is not None:
208
        searchMap['userId'] = userId
13603 amit.gupta 209
    collection = get_mongo_connection().Dtr.merchantOrder
14609 amit.gupta 210
    cursor = collection.find(searchMap).sort("orderId",-1)
13603 amit.gupta 211
    total_count = cursor.count()
212
    pages = total_count/window + (0 if total_count%window==0 else 1)  
213
    print "total_count", total_count
214
    if total_count > skip:
13999 amit.gupta 215
        cursor = cursor.skip(skip).limit(window)
13603 amit.gupta 216
        orders = []
217
        for order in cursor:
14002 amit.gupta 218
            del(order["_id"])
219
            orders.append(order)
13603 amit.gupta 220
        result['data'] = orders
221
        result['window'] = window
222
        result['totalCount'] = total_count 
223
        result['currCount'] = cursor.count()
224
        result['totalPages'] = pages
225
        result['currPage'] = page    
226
        return result
227
    else:
228
        return result
13630 kshitij.so 229
 
13927 amit.gupta 230
def getRefunds(userId, page=1, window=10):
231
    if page==None:
232
        page = 1
233
 
234
    if window==None:
13995 amit.gupta 235
        window = 10
13927 amit.gupta 236
    result = {}
237
    skip = (page-1)*window
16737 amit.gupta 238
    con = get_mongo_connection()
239
    collection = con.Dtr.refund
240
    user = con.Dtr.user
16754 amit.gupta 241
    credited = user.find_one({"userId":userId})
242
    if credited:
243
        credited = credited.get("credited")
244
    else:
245
        credited=0
246
 
13927 amit.gupta 247
    cursor = collection.find({"userId":userId})
248
    total_count = cursor.count()
249
    pages = total_count/window + (0 if total_count%window==0 else 1)  
250
    print "total_count", total_count
251
    if total_count > skip:
14668 amit.gupta 252
        cursor = cursor.skip(skip).limit(window).sort([('batch',-1)])
13927 amit.gupta 253
        refunds = []
254
        for refund in cursor:
255
            del(refund["_id"])
256
            refunds.append(refund)
16754 amit.gupta 257
        result['credited'] = credited
13927 amit.gupta 258
        result['data'] = refunds
259
        result['window'] = window
260
        result['totalCount'] = total_count 
261
        result['currCount'] = cursor.count()
262
        result['totalPages'] = pages
263
        result['currPage'] = page    
264
        return result
265
    else:
266
        return result
267
 
268
def getPendingRefunds(userId):
13991 amit.gupta 269
    print type(userId)
13927 amit.gupta 270
    result = get_mongo_connection().Dtr.merchantOrder\
271
        .aggregate([
16398 amit.gupta 272
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED, 'userId':userId}},
13927 amit.gupta 273
                    {'$unwind':"$subOrders"},
16398 amit.gupta 274
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED}},
13927 amit.gupta 275
                    { 
276
                     '$group':{
277
                               '_id':None,
278
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
279
                               }
280
                     }
13987 amit.gupta 281
                ])['result']
282
 
283
    if len(result)>0:
284
        result = result[0]        
285
        result.pop("_id")
286
    else:
287
        result={}
288
        result['amount'] = 0.0
14305 amit.gupta 289
    result['nextCredit'] = datetime.strftime(next_weekday(datetime.now(), int(PythonPropertyReader.getConfig('CREDIT_DAY_OF_WEEK'))),"%Y-%m-%d %H:%M:%S")
13927 amit.gupta 290
    return result
14037 kshitij.so 291
 
14671 amit.gupta 292
def getPendingCashbacks(userId):
293
    result = get_mongo_connection().Dtr.merchantOrder\
294
        .aggregate([
16398 amit.gupta 295
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING, 'userId':userId}},
14671 amit.gupta 296
                    {'$unwind':"$subOrders"},
16398 amit.gupta 297
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING}},
14671 amit.gupta 298
                    { 
299
                     '$group':{
300
                               '_id':None,
301
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
302
                               }
303
                     }
304
                ])['result']
305
 
306
    if len(result)>0:
307
        result = result[0]        
308
        result.pop("_id")
309
    else:
310
        result={}
311
        result['amount'] = 0.0
312
    return result
313
 
14037 kshitij.so 314
def __populateCache(userId):
315
    print "Populating memcache for userId",userId
316
    outer_query = []
16067 kshitij.so 317
    outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
14037 kshitij.so 318
    query = {}
16170 kshitij.so 319
    query['$gt'] = -100
14037 kshitij.so 320
    outer_query.append({'totalPoints':query})
321
    brandPrefMap = {}
322
    pricePrefMap = {}
323
    actionsMap = {}
324
    brand_p = session.query(price_preferences).filter_by(user_id=userId).all()
325
    for x in brand_p:
326
        pricePrefMap[x.category_id] = [x.min_price,x.max_price]
327
    for x in session.query(brand_preferences).filter_by(user_id=userId).all():
328
        temp_map = {}
329
        if brandPrefMap.has_key((x.brand).strip().upper()):
330
            val = brandPrefMap.get((x.brand).strip().upper())
331
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
332
            val.append(temp_map)
333
        else:
334
            temp = []
335
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
336
            temp.append(temp_map)
337
            brandPrefMap[(x.brand).strip().upper()] = temp
338
 
339
    for x in session.query(user_actions).filter_by(user_id=userId).all():
340
        actionsMap[x.store_product_id] = 1 if x.action == 'like' else 0
16458 kshitij.so 341
    all_deals = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query},{'_id':1,'category_id':1,'brand':1,'totalPoints':1,'bestSellerPoints':1,'nlcPoints':1,'rank':1,'available_price':1,'dealType':1,'source_id':1,'brand_id':1,'skuBundleId':1,'dp':1, 'showDp':1}).sort([('totalPoints',pymongo.DESCENDING),('bestSellerPoints',pymongo.DESCENDING),('nlcPoints',pymongo.DESCENDING),('rank',pymongo.DESCENDING)]))
14037 kshitij.so 342
    all_category_deals = []
343
    mobile_deals = []
344
    tablet_deals = []
345
    for deal in all_deals:
346
        if actionsMap.get(deal['_id']) == 0:
347
            fav_weight =.25
348
        elif actionsMap.get(deal['_id']) == 1:
349
            fav_weight = 1.5
350
        else:
351
            fav_weight = 1
352
 
353
        if brandPrefMap.get(deal['brand'].strip().upper()) is not None:
354
            brand_weight = 1
355
            for brandInfo in brandPrefMap.get(deal['brand'].strip().upper()):
356
                if brandInfo.get(deal['category_id']) is not None:
357
                    if brandInfo.get(deal['category_id']) == 1:
14055 kshitij.so 358
                        brand_weight = 2.0
14037 kshitij.so 359
        else:
360
            brand_weight = 1
361
 
362
        if pricePrefMap.get(deal['category_id']) is not None:
363
 
364
            if deal['available_price'] >= pricePrefMap.get(deal['category_id'])[0] and deal['available_price'] <= pricePrefMap.get(deal['category_id'])[1]:
365
                asp_weight = 1.5
366
            elif  deal['available_price'] >= pricePrefMap.get(deal['category_id'])[0] - 0.5 * pricePrefMap.get(deal['category_id'])[0] and deal['available_price'] <= pricePrefMap.get(deal['category_id'])[1] + 0.5 * pricePrefMap.get(deal['category_id'])[1]:
367
                asp_weight = 1.2
368
            else:
369
                asp_weight = 1
370
        else:
371
            asp_weight = 1
372
 
373
        persPoints = deal['totalPoints'] * fav_weight * brand_weight * asp_weight
374
        deal['persPoints'] = persPoints
375
 
376
        if deal['category_id'] ==3:
377
            mobile_deals.append(deal)
378
        elif deal['category_id'] ==5:
379
            tablet_deals.append(deal)
380
        else:
381
            continue
382
        all_category_deals.append(deal)
383
 
14144 kshitij.so 384
    session.close()
14037 kshitij.so 385
    mem_cache_val = {3:mobile_deals, 5:tablet_deals, 0:all_deals}
386
    mc.set(str(userId), mem_cache_val)
387
 
388
 
14531 kshitij.so 389
def __populateFeaturedDeals():
390
    all_category_fd = []
391
    mobile_fd = []
392
    tablet_fd = []
14550 kshitij.so 393
    activeFeaturedDeals = get_mongo_connection().Catalog.FeaturedDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}}).sort({'rank':pymongo.ASCENDING})
14531 kshitij.so 394
    for activeFeaturedDeal in activeFeaturedDeals:
395
        for k,v in activeFeaturedDeal['rankDetails']:
396
            featuredDeal = FeaturedDeals(activeFeaturedDeal['sku'], int(k), activeFeaturedDeal['thresholdPrice'], int(v))
397
            if featuredDeal.category_id == 0:
398
                all_category_fd.append(featuredDeal)
399
            elif featuredDeal.category_id == 3:
400
                mobile_fd.append(featuredDeal)
401
            elif featuredDeal.category_id == 5:
402
                tablet_fd.append(featuredDeal)
403
            else:
404
                continue
14550 kshitij.so 405
    mc.set("featured_deals_category_"+str(0), all_category_fd, 3600)
406
    mc.set("featured_deals_category_"+str(3), mobile_fd, 3600)
407
    mc.set("featured_deals_category_"+str(5), tablet_fd, 3600)
14037 kshitij.so 408
 
14791 kshitij.so 409
def getNewDeals(userId, category_id, offset, limit, sort, direction, filterData=None):
14761 kshitij.so 410
    if not bool(mc.get("category_cash_back")):
13921 kshitij.so 411
        populateCashBack()
14037 kshitij.so 412
 
14550 kshitij.so 413
    try:
414
        if mc.get("featured_deals_category_"+str(category_id)) is None:
415
            __populateFeaturedDeals()
416
    except:
417
        pass 
14531 kshitij.so 418
 
13771 kshitij.so 419
    rank = 1
16079 kshitij.so 420
    dealsListMap = []
14037 kshitij.so 421
    user_specific_deals = mc.get(str(userId))
422
    if user_specific_deals is None:
423
        __populateCache(userId)
424
        user_specific_deals = mc.get(str(userId))
14038 kshitij.so 425
    else:
426
        print "Getting user deals from cache"
14037 kshitij.so 427
    category_specific_deals = user_specific_deals.get(category_id)
428
 
429
    if sort is None or direction is None:
430
        sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
431
    else:
432
        if sort == "bestSellerPoints":
433
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['bestSellerPoints'], x['rank'], x['nlcPoints']),reverse=True)
434
        else:
435
            if direction == -1:
436
                rev = True
437
            else:
438
                rev = False
439
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['available_price']),reverse=rev)
440
 
14791 kshitij.so 441
 
442
    print "============================"
443
    if filterData is not None:
444
        try:
445
            sorted_deals = filterDeals(sorted_deals, filterData)
446
        except:
16067 kshitij.so 447
            traceback.print_exc()
14791 kshitij.so 448
 
16067 kshitij.so 449
 
450
    sortedMap = {}
451
    rankMap = {}
452
    rank = 0
453
    for sorted_deal in sorted_deals:
454
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
455
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
456
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
457
            rank = rank +1
458
        else:
459
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
460
                temp_list.append(sorted_deal)
16079 kshitij.so 461
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
16067 kshitij.so 462
 
463
    for dealList in [rankMap.get(k, []) for k in range(offset, offset+limit)]:
16079 kshitij.so 464
        temp = []
16067 kshitij.so 465
        for d in dealList:
466
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
16320 kshitij.so 467
            if len(item) ==0:
468
                continue
16079 kshitij.so 469
            item[0]['persPoints'] = d['persPoints']
470
            if d['dealType'] == 1 and d['source_id'] ==1:
16511 kshitij.so 471
                try:
472
                    manualDeal = list(get_mongo_connection().Catalog.ManualDeals.find({'sku':d['_id'],'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}}))
473
                    item[0]['marketPlaceUrl'] = manualDeal[0]['dealUrl'].strip()
474
                except:
475
                    pass
16079 kshitij.so 476
            elif d['source_id'] ==3:
477
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
478
            else:
479
                pass 
480
            try:
481
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
482
                if not cashBack or cashBack.get('cash_back_status')!=1:
14037 kshitij.so 483
                    item[0]['cash_back_type'] = 0
484
                    item[0]['cash_back'] = 0
16079 kshitij.so 485
                else:
486
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
487
                    item[0]['cash_back'] = cashBack['cash_back']
488
            except:
489
                print "Error in adding cashback to deals"
490
                item[0]['cash_back_type'] = 0
491
                item[0]['cash_back'] = 0
16252 kshitij.so 492
            try:
493
                item[0]['dp'] = d['dp']
494
                item[0]['showDp'] = d['showDp']
495
            except:
496
                item[0]['dp'] = 0.0
497
                item[0]['showDp'] = 0
16483 kshitij.so 498
            try:
499
                item[0]['thumbnail'] = item[0]['thumbnail'].strip()
500
            except:
501
                pass 
16079 kshitij.so 502
            temp.append(item[0])
16125 kshitij.so 503
        if len(temp) > 1:
16126 kshitij.so 504
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
16079 kshitij.so 505
        dealsListMap.append(temp)
506
    return dealsListMap
14037 kshitij.so 507
 
14791 kshitij.so 508
def filterDeals(deals, filterData):
509
    dealFiltered = []
510
    brandsFiltered = []
511
    filterArray = filterData.split('|')
512
    for data in filterArray:
513
        try:
514
            filter, info = data.split(':')
515
        except Exception as ex:
516
            traceback.print_exc()
517
            continue
518
        if filter == 'dealFilter':
519
            toFilter = info.split('^')
520
            print "deal filter ",toFilter
521
            if 'deals' in toFilter:
522
                dealFiltered = deals
523
                continue
524
            for filterVal in toFilter:
525
                if filterVal == 'dod':
526
                    for deal in deals:
527
                        if deal['dealType'] == 1:
528
                            dealFiltered.append(deal)
529
        elif filter == 'brandFilter':
530
            toFilter = info.split('^')
531
            print "brand filter ",toFilter
532
            if len(toFilter) == 0 or (len(toFilter)==1 and toFilter[0]==''):
533
                brandsFiltered = deals
534
            for deal in deals:
15151 kshitij.so 535
                if str(int(deal['brand_id'])) in toFilter:
14791 kshitij.so 536
                    brandsFiltered.append(deal)
15040 kshitij.so 537
    if len(dealFiltered) == 0:
538
        return brandsFiltered
14791 kshitij.so 539
    return [i for i in dealFiltered for j in brandsFiltered if i['_id']==j['_id']]
540
 
541
 
14037 kshitij.so 542
def getDeals(userId, category_id, offset, limit, sort, direction):
14761 kshitij.so 543
    if not bool(mc.get("category_cash_back")):
14037 kshitij.so 544
        populateCashBack()
545
    rank = 1
13771 kshitij.so 546
    deals = {}
13910 kshitij.so 547
    outer_query = []
548
    outer_query.append({"showDeal":1})
549
    query = {}
550
    query['$gt'] = 0
551
    outer_query.append({'totalPoints':query})
552
    if category_id in (3,5):
553
        outer_query.append({'category_id':category_id})
13803 kshitij.so 554
    if sort is None or direction is None:
555
        direct = -1
13910 kshitij.so 556
        print outer_query
557
        data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([('totalPoints',direct),('bestSellerPoints',direct),('nlcPoints',direct),('rank',direct)]).skip(offset).limit(limit))
13795 kshitij.so 558
    else:
13910 kshitij.so 559
        print outer_query
13803 kshitij.so 560
        direct = direction
13910 kshitij.so 561
        if sort == "bestSellerPoints":
562
            print "yes,sorting by bestSellerPoints"
563
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([('bestSellerPoints',direct),('rank',direct),('nlcPoints',direct)]).skip(offset).limit(limit))
564
        else:
565
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([(sort,direct)]).skip(offset).limit(limit))
13771 kshitij.so 566
    for d in data:
567
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
568
        if not deals.has_key(item[0]['identifier']):
13921 kshitij.so 569
            item[0]['dealRank'] = rank
570
            try:
14761 kshitij.so 571
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
13921 kshitij.so 572
                if not cashBack or cashBack.get('cash_back_status')!=1:
13928 kshitij.so 573
                    item[0]['cash_back_type'] = 0
574
                    item[0]['cash_back'] = 0
13921 kshitij.so 575
                else:
14766 kshitij.so 576
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
13928 kshitij.so 577
                    item[0]['cash_back'] = cashBack['cash_back']
13921 kshitij.so 578
            except:
579
                print "Error in adding cashback to deals"
13928 kshitij.so 580
                item[0]['cash_back_type'] = 0
581
                item[0]['cash_back'] = 0
13771 kshitij.so 582
            deals[item[0]['identifier']] = item[0]
13921 kshitij.so 583
 
13771 kshitij.so 584
            rank +=1
13785 kshitij.so 585
    return sorted(deals.values(), key=itemgetter('dealRank'))
586
 
16222 kshitij.so 587
def getItem(skuId,showDp=None):
16224 kshitij.so 588
    temp = []
14761 kshitij.so 589
    if not bool(mc.get("category_cash_back")):
14113 kshitij.so 590
        populateCashBack()
13795 kshitij.so 591
    try:
16222 kshitij.so 592
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'_id':int(skuId)})
593
        if skuData is None:
594
            raise
595
        try:
596
            cashBack = getCashBack(skuData['_id'], skuData['source_id'], skuData['category_id'])
597
            if not cashBack or cashBack.get('cash_back_status')!=1:
598
                skuData['cash_back_type'] = 0
599
                skuData['cash_back'] = 0
600
            else:
601
                skuData['cash_back_type'] = cashBack['cash_back_type']
602
                skuData['cash_back'] = cashBack['cash_back']
603
        except:
604
            print "Error in adding cashback to deals"
605
            skuData['cash_back_type'] = 0
606
            skuData['cash_back'] = 0
607
        skuData['in_stock'] = int(skuData['in_stock'])
608
        skuData['is_shortage'] = int(skuData['is_shortage'])
609
        skuData['category_id'] = int(skuData['category_id'])
610
        skuData['status'] = int(skuData['status'])
16483 kshitij.so 611
        try:
612
            skuData['thumbnail'] = skuData['thumbnail'].strip()
613
        except:
614
            pass 
16222 kshitij.so 615
        if showDp is not None:
616
            dealerPrice = get_mongo_connection().Catalog.SkuDealerPrices.find_one({'skuBundleId':skuData['skuBundleId']})
617
            skuData['dp'] = 0.0
618
            skuData['showDp'] = 0
619
            if dealerPrice is not None:
620
                skuData['dp'] = dealerPrice['dp']
621
                skuData['showDp'] = dealerPrice['showDp']
16224 kshitij.so 622
        temp.append(skuData)
623
        return temp
13795 kshitij.so 624
    except:
16224 kshitij.so 625
        return []
13836 kshitij.so 626
 
14761 kshitij.so 627
def getCashBack(skuId, source_id, category_id):
628
    if not bool(mc.get("category_cash_back")):
629
        populateCashBack()
630
    itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 631
    itemCashBack = itemCashBackMap.get(skuId)
632
    if itemCashBack is not None:
633
        return itemCashBack
14761 kshitij.so 634
    cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 635
    sourceCashBack = cashBackMap.get(source_id)
636
    if sourceCashBack is not None and len(sourceCashBack) > 0:
637
        for cashBack in sourceCashBack:
638
            if cashBack.get(category_id) is None:
639
                continue
640
            else:
641
                return cashBack.get(category_id)
642
    else:
643
        return {}
16560 amit.gupta 644
 
645
def getBundleBySourceSku(source_id, identifier):
646
    if source_id in (1,2,4,5):
647
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
648
    elif source_id == 3:
649
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
650
    else:
651
        return {}
652
 
653
    if not skuData:
654
        return {}
655
    else:
16564 amit.gupta 656
        bundleId = skuData[0]["skuBundleId"]
16661 amit.gupta 657
        itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':bundleId, 'in_stock':1, 'source_id':{"$in":[1,2,3,5]}}, 
16580 amit.gupta 658
                       {"source_id":1, "available_price":1, "marketPlaceUrl":1, "gross_price":1, "codAvailable":1, "source_product_name":1, "offer":1, "coupon":1}))
16579 amit.gupta 659
        return {'products':itemIds}
16560 amit.gupta 660
 
661
 
13921 kshitij.so 662
 
15129 kshitij.so 663
def getDealRank(identifier, source_id, userId):
16406 kshitij.so 664
    if source_id in (1,2,4,5,6):
15129 kshitij.so 665
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
666
    elif source_id == 3:
667
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
668
    else:
16282 amit.gupta 669
        return {'rank':0, 'description':'Source not valid','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15349 kshitij.so 670
    if len(skuData) == 0:
16282 amit.gupta 671
        return {'rank':0, 'description':'No matching product identifier found','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15129 kshitij.so 672
    user_specific_deals = mc.get(str(userId))
673
    if user_specific_deals is None:
674
        __populateCache(userId)
675
        user_specific_deals = mc.get(str(userId))
676
    else:
677
        print "Getting user deals from cache"
678
    category_id = skuData[0]['category_id']
679
    category_specific_deals = user_specific_deals.get(category_id)
16280 kshitij.so 680
 
681
    dealsData = get_mongo_connection().Catalog.Deals.find_one({'skuBundleId':skuData[0]['skuBundleId']})
682
    if dealsData is None:
683
        dealsData = {}
684
 
15129 kshitij.so 685
    if category_specific_deals is None or len(category_specific_deals) ==0:
16280 kshitij.so 686
        return {'rank':0,'description':'Category specific deals is empty','maxNlc':dealsData.get('maxNlc'),'minNlc':dealsData.get('minNlc'),'status':dealsData.get('status'),'dp':dealsData.get('dp')}
15129 kshitij.so 687
    sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
16168 kshitij.so 688
    sortedMap = {}
689
    rankMap = {}
690
    rank = 0
15129 kshitij.so 691
    for sorted_deal in sorted_deals:
16168 kshitij.so 692
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
693
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
694
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
695
            rank = rank +1
696
        else:
697
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
698
                temp_list.append(sorted_deal)
699
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
700
 
16187 kshitij.so 701
    for dealRank ,dealList in rankMap.iteritems():
16168 kshitij.so 702
        for d in dealList:
16186 kshitij.so 703
            if d['skuBundleId'] == skuData[0]['skuBundleId']:
16280 kshitij.so 704
                return {'rank':dealRank+1,'description':'Rank found','maxNlc':dealsData.get('maxNlc'),'minNlc':dealsData.get('minNlc'),'status':dealsData.get('status'),'dp':dealsData.get('dp')}
16168 kshitij.so 705
 
16280 kshitij.so 706
    return {'rank':0,'description':'Rank not found','maxNlc':dealsData.get('maxNlc'),'minNlc':dealsData.get('minNlc'),'status':dealsData.get('status'),'dp':dealsData.get('dp')}
15129 kshitij.so 707
 
708
 
13836 kshitij.so 709
def getCashBackDetails(identifier, source_id):
14761 kshitij.so 710
    if not bool(mc.get("category_cash_back")):
13921 kshitij.so 711
        populateCashBack()
13771 kshitij.so 712
 
16406 kshitij.so 713
    if source_id in (1,2,4,5,6):
13839 kshitij.so 714
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 715
    elif source_id == 3:
13839 kshitij.so 716
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 717
    else:
718
        return {}
13836 kshitij.so 719
    if len(skuData) > 0:
14761 kshitij.so 720
        itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 721
        itemCashBack = itemCashBackMap.get(skuData[0]['_id'])
722
        if itemCashBack is not None:
723
            return itemCashBack
14761 kshitij.so 724
        cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 725
        sourceCashBack = cashBackMap.get(source_id)
726
        if sourceCashBack is not None and len(sourceCashBack) > 0:
727
            for cashBack in sourceCashBack:
728
                if cashBack.get(skuData[0]['category_id']) is None:
729
                    continue
730
                else:
731
                    return cashBack.get(skuData[0]['category_id'])
13836 kshitij.so 732
        else:
733
            return {} 
734
    else:
735
        return {}
13986 amit.gupta 736
 
14398 amit.gupta 737
def getImgSrc(identifier, source_id):
738
    skuData = None
16406 kshitij.so 739
    if source_id in (1,2,4,5,6):
14414 amit.gupta 740
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 741
    elif source_id == 3:
14414 amit.gupta 742
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 743
    if skuData is None:
744
        return {}
745
    else:
16483 kshitij.so 746
        try:
747
            return {'thumbnail':skuData.get('thumbnail').strip()}
748
        except:
749
            return {'thumbnail':skuData.get('thumbnail')}
13986 amit.gupta 750
 
751
def next_weekday(d, weekday):
752
    days_ahead = weekday - d.weekday()
753
    if days_ahead <= 0: # Target day already happened this week
754
        days_ahead += 7
755
    return d + timedelta(days_ahead)
756
 
13771 kshitij.so 757
 
13970 kshitij.so 758
def getAllDealerPrices(offset, limit):
759
    data = []
760
    collection = get_mongo_connection().Catalog.SkuDealerPrices
761
    cursor = collection.find().skip(offset).limit(limit)
762
    for val in cursor:
15853 kshitij.so 763
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
764
        if master is not None:
765
            val['brand'] = master['brand']
766
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 767
        else:
768
            val['brand'] = ""
769
            val['source_product_name'] = ""
16231 kshitij.so 770
        val['showDp'] = int(val['showDp'])
13970 kshitij.so 771
        data.append(val)
772
    return data
773
 
15853 kshitij.so 774
def addSkuDealerPrice(data):
775
    collection = get_mongo_connection().Catalog.SkuDealerPrices
776
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
777
    if cursor is not None:
778
        return {0:"BundleId information already present."}
13970 kshitij.so 779
    else:
15853 kshitij.so 780
        collection.insert(data)
781
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 782
        return {1:"Data added successfully"}
783
 
784
def updateSkuDealerPrice(data, _id):
785
    try:
786
        collection = get_mongo_connection().Catalog.SkuDealerPrices
787
        collection.update({'_id':ObjectId(_id)},{"$set":{'dp':data['dp']}},upsert=False, multi = False)
15853 kshitij.so 788
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 789
        return {1:"Data updated successfully"}
790
    except:
791
        return {0:"Data not updated."}
792
 
793
def updateExceptionalNlc(data, _id):
794
    try:
795
        collection = get_mongo_connection().Catalog.ExceptionalNlc
796
        collection.update({'_id':ObjectId(_id)},{"$set":{'maxNlc':data['maxNlc'], 'minNlc':data['minNlc'], 'overrideNlc':data['overrideNlc']}},upsert=False, multi = False)
15853 kshitij.so 797
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 798
        return {1:"Data updated successfully"}
799
    except:
800
        return {0:"Data not updated."}
801
 
14041 kshitij.so 802
def resetCache(userId):
14043 kshitij.so 803
    try:
804
        mc.delete(userId)
805
        return {1:'Cache cleared.'}
806
    except:
807
        return {0:'Unable to clear cache.'}
808
 
15853 kshitij.so 809
def updateCollection(data):
14083 kshitij.so 810
    print data
15853 kshitij.so 811
    try:
812
        collection = get_mongo_connection().Catalog[data['class']]
813
        class_name = data.pop('class')
814
        _id = data.pop('oid')
815
        result = collection.update({'_id':ObjectId(_id)},{"$set":data},upsert=False, multi = False)
816
        if class_name != "Notifications":
817
            record = list(collection.find({'_id':ObjectId(_id)}))
818
            if class_name !="CategoryDiscount":
819
                if record[0].has_key('sku'):
820
                    field = '_id'
821
                    val = record[0]['sku']
14852 kshitij.so 822
                else:
15853 kshitij.so 823
                    field = 'skuBundleId'
824
                    val = record[0]['skuBundleId']
825
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False, multi = True)
826
            else:
827
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
828
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
16233 kshitij.so 829
        if class_name =='SkuDealerPrices':
16237 kshitij.so 830
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':val},{"$set":data},upsert=False, multi=True)
15853 kshitij.so 831
        return {1:"Data updated successfully"}
832
    except Exception as e:
833
        print e
834
        return {0:"Data not updated."}
14575 kshitij.so 835
 
14076 kshitij.so 836
 
14553 kshitij.so 837
def addNegativeDeals(data, multi):
838
    if multi !=1: 
839
        collection = get_mongo_connection().Catalog.NegativeDeals
840
        cursor = collection.find({"sku":data['sku']})
841
        if cursor.count() > 0:
842
            return {0:"Sku information already present."}
843
        else:
844
            collection.insert(data)
845
            return {1:"Data added successfully"}
14481 kshitij.so 846
    else:
14553 kshitij.so 847
        skuIds = __getBundledSkusfromSku(data['sku'])
848
        for sku in skuIds:
849
            data['sku'] = sku.get('_id')
850
            collection = get_mongo_connection().Catalog.NegativeDeals
851
            cursor = collection.find({"sku":data['sku']})
852
            if cursor.count() > 0:
853
                continue
854
            else:
14558 kshitij.so 855
                data.pop('_id',None)
14553 kshitij.so 856
                collection.insert(data)
14481 kshitij.so 857
        return {1:"Data added successfully"}
858
 
859
def getAllNegativeDeals(offset, limit):
860
    data = []
861
    collection = get_mongo_connection().Catalog.NegativeDeals
862
    cursor = collection.find().skip(offset).limit(limit)
863
    for val in cursor:
864
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
865
        if len(master) > 0:
866
            val['brand'] = master[0]['brand']
867
            val['source_product_name'] = master[0]['source_product_name']
868
            val['skuBundleId'] = master[0]['skuBundleId']
869
        else:
870
            val['brand'] = ""
871
            val['source_product_name'] = ""
872
            val['skuBundleId'] = ""
873
        data.append(val)
874
    return data
875
 
876
def getAllManualDeals(offset, limit):
877
    data = []
878
    collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 879
    cursor = collection.find().skip(offset).limit(limit)
14481 kshitij.so 880
    for val in cursor:
881
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
882
        if len(master) > 0:
883
            val['brand'] = master[0]['brand']
884
            val['source_product_name'] = master[0]['source_product_name']
885
            val['skuBundleId'] = master[0]['skuBundleId']
886
        else:
887
            val['brand'] = ""
888
            val['source_product_name'] = ""
889
            val['skuBundleId'] = ""
890
        data.append(val)
891
    return data
14076 kshitij.so 892
 
14553 kshitij.so 893
def addManualDeal(data, multi):
894
    if multi !=1:
895
        collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 896
        cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 897
        if cursor.count() > 0:
898
            return {0:"Sku information already present."}
899
        else:
900
            collection.insert(data)
901
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
902
            return {1:"Data added successfully"}
14481 kshitij.so 903
    else:
14553 kshitij.so 904
        skuIds = __getBundledSkusfromSku(data['sku'])
905
        for sku in skuIds:
906
            data['sku'] = sku.get('_id')
907
            collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 908
            cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 909
            if cursor.count() > 0:
910
                continue
911
            else:
14558 kshitij.so 912
                data.pop('_id',None)
14553 kshitij.so 913
                collection.insert(data)
914
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14481 kshitij.so 915
        return {1:"Data added successfully"}
14553 kshitij.so 916
 
14481 kshitij.so 917
def deleteDocument(data):
15853 kshitij.so 918
    print "inside detete document"
14481 kshitij.so 919
    print data
920
    try:
921
        collection = get_mongo_connection().Catalog[data['class']]
922
        class_name = data.pop('class')
923
        _id = data.pop('oid')
924
        record = list(collection.find({'_id':ObjectId(_id)}))
925
        collection.remove({'_id':ObjectId(_id)})
15075 kshitij.so 926
        if class_name != "Notifications":
927
            if class_name !="CategoryDiscount":
15853 kshitij.so 928
                print record[0]
929
                if record[0].has_key('sku'):
930
                    field = '_id'
931
                    val = record[0]['sku']
932
                else:
933
                    field = 'skuBundleId'
934
                    val = record[0]['skuBundleId']
935
                print "Updating master"
936
                print field
937
                print val
938
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
15075 kshitij.so 939
            else:
940
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
941
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
14481 kshitij.so 942
        return {1:"Document deleted successfully"}
943
    except Exception as e:
944
        print e
945
        return {0:"Document not deleted."}
13970 kshitij.so 946
 
14482 kshitij.so 947
def searchMaster(offset, limit, search_term):
948
    data = []
14531 kshitij.so 949
    if search_term is not None:
14551 kshitij.so 950
        terms = search_term.split(' ')
951
        outer_query = []
952
        for term in terms:
953
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
14531 kshitij.so 954
        try:
14551 kshitij.so 955
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14531 kshitij.so 956
            for record in collection:
957
                data.append(record)
958
        except:
959
            pass
960
    else:
961
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14482 kshitij.so 962
        for record in collection:
963
            data.append(record)
964
    return data
14481 kshitij.so 965
 
14495 kshitij.so 966
def getAllFeaturedDeals(offset, limit):
967
    data = []
968
    collection = get_mongo_connection().Catalog.FeaturedDeals
969
    cursor = collection.find({'endDate':{'$gte':to_java_date(datetime.now())}}).skip(offset).limit(limit)
970
    for val in cursor:
971
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
972
        if len(master) > 0:
973
            val['brand'] = master[0]['brand']
974
            val['source_product_name'] = master[0]['source_product_name']
975
            val['skuBundleId'] = master[0]['skuBundleId']
976
        else:
977
            val['brand'] = ""
978
            val['source_product_name'] = ""
979
            val['skuBundleId'] = ""
980
        data.append(val)
981
    return data
982
 
14553 kshitij.so 983
def addFeaturedDeal(data, multi):
984
    if multi !=1:
985
        collection = get_mongo_connection().Catalog.FeaturedDeals
986
        cursor = collection.find({'sku':data['sku'],'startDate':{'$lte':data['startDate']},'endDate':{'$gte':data['endDate']}})
987
        if cursor.count() > 0:
988
            return {0:"Sku information already present."}
989
        else:
990
            collection.insert(data)
991
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
992
            return {1:"Data added successfully"}
14495 kshitij.so 993
    else:
14553 kshitij.so 994
        skuIds = __getBundledSkusfromSku(data['sku'])
995
        for sku in skuIds:
996
            data['sku'] = sku.get('_id')
997
            collection = get_mongo_connection().Catalog.FeaturedDeals
998
            cursor = collection.find({'sku':data['sku'],'startDate':{'$lte':data['startDate']},'endDate':{'$gte':data['endDate']}})
999
            if cursor.count() > 0:
1000
                continue
1001
            else:
14558 kshitij.so 1002
                data.pop('_id',None)
14553 kshitij.so 1003
                collection.insert(data)
1004
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14495 kshitij.so 1005
        return {1:"Data added successfully"}
1006
 
14499 kshitij.so 1007
def searchCollection(class_name, sku, skuBundleId):
14497 kshitij.so 1008
    data = []
1009
    collection = get_mongo_connection().Catalog[class_name]
15076 kshitij.so 1010
    if class_name == "Notifications":
1011
        cursor = collection.find({'skuBundleId':skuBundleId})
1012
        for val in cursor:
1013
            master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
1014
            if len(master) > 0:
1015
                val['brand'] = master[0]['brand']
1016
                val['model_name'] = master[0]['model_name']
1017
                val['skuBundleId'] = master[0]['skuBundleId']
1018
            else:
1019
                val['brand'] = ""
1020
                val['model_name'] = ""
1021
                val['skuBundleId'] = val['skuBundleId']
1022
            data.append(val)
15095 kshitij.so 1023
        return data
15853 kshitij.so 1024
    master = None
14499 kshitij.so 1025
    if sku is not None:
15853 kshitij.so 1026
        if COLLECTION_MAP.has_key(class_name):
1027
            master = get_mongo_connection().Catalog.MasterData.find_one({'_id':sku})
1028
            cursor = collection.find({'skuBundleId':master['skuBundleId']})
1029
        else:
1030
            cursor = collection.find({'sku':sku})
14499 kshitij.so 1031
        for val in cursor:
15853 kshitij.so 1032
            if master is None:
1033
                master = get_mongo_connection().Catalog.MasterData.find_one({'_id':val['sku']})
1034
            if master is not None:
1035
                val['brand'] = master['brand']
1036
                val['source_product_name'] = master['source_product_name']
1037
                val['skuBundleId'] = master['skuBundleId']
14499 kshitij.so 1038
            else:
1039
                val['brand'] = ""
1040
                val['source_product_name'] = ""
1041
                val['skuBundleId'] = ""
1042
            data.append(val)
1043
        return data
1044
    else:
15853 kshitij.so 1045
        if not COLLECTION_MAP.has_key(class_name):
1046
            skuIds = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId}).distinct('_id')
1047
            for sku in skuIds:
1048
                cursor = collection.find({'sku':sku})
1049
                for val in cursor:
1050
                    master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1051
                    if len(master) > 0:
1052
                        val['brand'] = master[0]['brand']
1053
                        val['source_product_name'] = master[0]['source_product_name']
1054
                        val['skuBundleId'] = master[0]['skuBundleId']
1055
                    else:
1056
                        val['brand'] = ""
1057
                        val['source_product_name'] = ""
1058
                        val['skuBundleId'] = ""
1059
                    data.append(val)
1060
            return data
1061
        else:
1062
            cursor = collection.find({'skuBundleId':skuBundleId})
14499 kshitij.so 1063
            for val in cursor:
15853 kshitij.so 1064
                master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14499 kshitij.so 1065
                if len(master) > 0:
1066
                    val['brand'] = master[0]['brand']
1067
                    val['source_product_name'] = master[0]['source_product_name']
1068
                else:
1069
                    val['brand'] = ""
1070
                    val['source_product_name'] = ""
1071
                data.append(val)
15853 kshitij.so 1072
            return data
14495 kshitij.so 1073
 
15074 kshitij.so 1074
def __getBrandIdForBrand(brandName, category_id):
1075
    brandInfo = Brands.query.filter(Brands.category_id==category_id).filter(Brands.name == brandName).all()
1076
    if brandInfo is None or len(brandInfo)!=1:
1077
        raise
1078
    else:
1079
        return brandInfo[0].id
1080
 
14588 kshitij.so 1081
def addNewItem(data):
14594 kshitij.so 1082
    try:
1083
        data['updatedOn'] = to_java_date(datetime.now())
1084
        data['addedOn'] = to_java_date(datetime.now())
1085
        data['priceUpdatedOn'] = to_java_date(datetime.now())
1086
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
1087
        max_bundle = list(get_mongo_connection().Catalog.MasterData.find().sort([('skuBundleId',pymongo.DESCENDING)]).limit(1))
1088
        data['_id'] = max_id[0]['_id'] + 1
1089
        data['skuBundleId'] = max_bundle[0]['skuBundleId'] + 1
1090
        data['identifier'] = str(data['identifier'])
1091
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
15074 kshitij.so 1092
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
14594 kshitij.so 1093
        get_mongo_connection().Catalog.MasterData.insert(data)
1094
        return {1:'Data added successfully'}
1095
    except Exception as e:
1096
        print e
1097
        return {0:'Unable to add data.'}
15130 kshitij.so 1098
    finally:
1099
        session.close()
14588 kshitij.so 1100
 
1101
def addItemToExistingBundle(data):
1102
    try:
1103
        data['updatedOn'] = to_java_date(datetime.now())
1104
        data['addedOn'] = to_java_date(datetime.now())
1105
        data['priceUpdatedOn'] = to_java_date(datetime.now())
14593 kshitij.so 1106
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
14590 kshitij.so 1107
        data['_id'] = max_id[0]['_id'] + 1
14594 kshitij.so 1108
        data['identifier'] = str(data['identifier'])
1109
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
15074 kshitij.so 1110
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
14588 kshitij.so 1111
        get_mongo_connection().Catalog.MasterData.insert(data)
1112
        return {1:'Data added successfully.'}
14594 kshitij.so 1113
    except Exception as e:
1114
        print e
14588 kshitij.so 1115
        return {0:'Unable to add data.'}
15130 kshitij.so 1116
    finally:
1117
        session.close()
14588 kshitij.so 1118
 
1119
def updateMaster(data, multi):
15130 kshitij.so 1120
    try:
1121
        print data
1122
        if multi != 1:
1123
            _id = data.pop('_id')
1124
            skuBundleId = data.pop('skuBundleId')
1125
            data['updatedOn'] = to_java_date(datetime.now())
1126
            data['identifier'] = str(data['identifier'])
1127
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
1128
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
1129
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1130
            return {1:'Data updated successfully.'}
1131
        else:
1132
            _id = data.pop('_id')
1133
            skuBundleId = data.pop('skuBundleId')
1134
            data['updatedOn'] = to_java_date(datetime.now())
1135
            data['identifier'] = str(data['identifier'])
1136
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
1137
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
1138
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1139
            similarItems = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId})
1140
            for item in similarItems:
1141
                if item['_id'] == _id:
1142
                    continue
1143
                item['updatedOn'] = to_java_date(datetime.now())
1144
                item['thumbnail'] = data['thumbnail']
1145
                item['category'] = data['category']
1146
                item['category_id'] = data['category_id']
1147
                item['tagline'] = data['tagline']
1148
                item['is_shortage'] = data['is_shortage']
1149
                item['mrp'] = data['mrp']
1150
                item['status'] = data['status']
1151
                item['maxPrice'] = data['maxPrice']
1152
                item['brand_id'] = data['brand_id']
1153
                similar_item_id = item.pop('_id')
1154
                get_mongo_connection().Catalog.MasterData.update({'_id':similar_item_id},{"$set":item},upsert=False)
1155
            return {1:'Data updated successfully.'}
1156
    finally:
1157
        session.close()
14619 kshitij.so 1158
 
1159
def getLiveCricScore():
1160
    return mc.get('liveScore')
14852 kshitij.so 1161
 
1162
def addBundleToNotification(data):
1163
    try:
15069 kshitij.so 1164
        collection = get_mongo_connection().Catalog.Notifications
14852 kshitij.so 1165
        cursor = collection.find({'skuBundleId':data['skuBundleId']})
1166
        if cursor.count() > 0:
1167
            return {0:"SkuBundleId information already present."}
1168
        else:
1169
            collection.insert(data)
1170
            return {1:'Data updated successfully.'}
1171
    except:
1172
        return {0:'Unable to add data.'}
1173
 
1174
def getAllNotifications(offset, limit):
1175
    data = []
15069 kshitij.so 1176
    collection = get_mongo_connection().Catalog.Notifications
16450 kshitij.so 1177
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
14852 kshitij.so 1178
    for val in cursor:
15072 kshitij.so 1179
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14852 kshitij.so 1180
        if len(master) > 0:
1181
            val['brand'] = master[0]['brand']
15071 kshitij.so 1182
            val['model_name'] = master[0]['model_name']
14852 kshitij.so 1183
            val['skuBundleId'] = master[0]['skuBundleId']
1184
        else:
1185
            val['brand'] = ""
15071 kshitij.so 1186
            val['model_name'] = ""
1187
            val['skuBundleId'] = val['skuBundleId']
14852 kshitij.so 1188
        data.append(val)
1189
    return data
14997 kshitij.so 1190
 
1191
def getBrandsForFilter(category_id):
1192
    if mc.get("brandFilter") is None:
15095 kshitij.so 1193
        print "Populating brand data for category_id %d" %(category_id)
14997 kshitij.so 1194
        tabData, mobData = [], []
1195
        mobileDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1196
                                                                      {"$match":{"category_id":3,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1197
                                                                    },
1198
                                                                 {"$group" : 
1199
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1200
                                                                  }
1201
                                                                ])
14588 kshitij.so 1202
 
14997 kshitij.so 1203
        tabletDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1204
                                                                      {"$match":{"category_id":5,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1205
                                                                    },
1206
                                                                 {"$group" : 
1207
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1208
                                                                  }
1209
                                                                ])
1210
 
1211
        allDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1212
                                                                   {"$match":{"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1213
                                                                    },
1214
                                                                 {"$group" : 
1215
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1216
                                                                  }
1217
                                                                ])
1218
        #print mobileDeals
1219
        #print "==========Mobile data ends=========="
1220
 
1221
        #print tabletDeals
1222
        #print "==========Tablet data ends=========="
1223
 
1224
        #print allDeals
1225
        #print "==========All deal data ends========="
1226
 
1227
        for mobileDeal in mobileDeals['result']:
1228
            if mobileDeal.get('_id').get('brand_id') != 0:
1229
                tempMap = {}
1230
                tempMap['brand'] = mobileDeal.get('_id').get('brand')
1231
                tempMap['brand_id'] = mobileDeal.get('_id').get('brand_id')
1232
                tempMap['count'] = mobileDeal.get('count')
1233
                mobData.append(tempMap)
1234
 
1235
        for tabletDeal in tabletDeals['result']:
1236
            if tabletDeal.get('_id').get('brand_id') != 0:
1237
                tempMap = {}
1238
                tempMap['brand'] = tabletDeal.get('_id').get('brand')
1239
                tempMap['brand_id'] = tabletDeal.get('_id').get('brand_id')
1240
                tempMap['count'] = tabletDeal.get('count')
1241
                tabData.append(tempMap)
1242
 
1243
 
1244
        brandMap = {}
1245
        for allDeal in allDeals['result']:
1246
            if allDeal.get('_id').get('brand_id') != 0:
1247
                if brandMap.has_key(allDeal.get('_id').get('brand')):
15002 kshitij.so 1248
                    brand_ids = brandMap.get(allDeal.get('_id').get('brand')).get('brand_ids')
14997 kshitij.so 1249
                    brand_ids.append(allDeal.get('_id').get('brand_id'))
15003 kshitij.so 1250
                    brandMap[allDeal.get('_id').get('brand')] = {'brand_ids':brand_ids,'count':brandMap.get(allDeal.get('_id').get('brand')).get('count') + allDeal.get('count')}
14997 kshitij.so 1251
                else:
1252
                    temp = []
1253
                    temp.append(allDeal.get('_id').get('brand_id'))
15002 kshitij.so 1254
                    brandMap[allDeal.get('_id').get('brand')] = {'brand_ids':temp,'count':allDeal.get('count')}
14997 kshitij.so 1255
 
1256
        mc.set("brandFilter",{0:brandMap, 3:mobData, 5:tabData}, 600)  
1257
 
15062 kshitij.so 1258
    return sorted(mc.get("brandFilter").get(category_id), key = lambda x: (-x['count'], x['brand']))
15375 kshitij.so 1259
 
15459 kshitij.so 1260
def getStaticDeals(offset, limit, category_id, direction):
15375 kshitij.so 1261
    user_specific_deals = mc.get("staticDeals")
1262
    if user_specific_deals is None:
1263
        __populateStaticDeals()
1264
        user_specific_deals = mc.get("staticDeals")
15459 kshitij.so 1265
    rev = False
1266
    if direction is None or direction == -1:
1267
        rev=True
1268
    return sorted((user_specific_deals.get(category_id))[offset:offset+limit],reverse=rev)
15375 kshitij.so 1269
 
1270
def __populateStaticDeals():
1271
    print "Populating memcache for static deals"
1272
    outer_query = []
1273
    outer_query.append({"showDeal":1})
1274
    query = {}
16170 kshitij.so 1275
    query['$gt'] = -100
15375 kshitij.so 1276
    outer_query.append({'totalPoints':query})
1277
    all_deals = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query},{'_id':1,'category_id':1,'brand':1,'totalPoints':1,'bestSellerPoints':1,'nlcPoints':1,'rank':1,'available_price':1,'dealType':1,'source_id':1,'brand_id':1,'skuBundleId':1}).sort([('totalPoints',pymongo.DESCENDING),('bestSellerPoints',pymongo.DESCENDING),('nlcPoints',pymongo.DESCENDING),('rank',pymongo.DESCENDING)]))
1278
    mobile_deals = []
1279
    tablet_deals = []
1280
    for deal in all_deals:
1281
        item = get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']})
1282
        if deal['category_id'] ==3:
1283
            mobile_deals.append(getItemObjForStaticDeals(item[0]))
1284
        elif deal['category_id'] ==5:
1285
            tablet_deals.append(getItemObjForStaticDeals(item[0]))
1286
        else:
1287
            continue
1288
 
1289
    random.shuffle(mobile_deals,random.random)
1290
    random.shuffle(tablet_deals,random.random)
1291
 
1292
    mem_cache_val = {3:mobile_deals, 5:tablet_deals}
1293
    mc.set("staticDeals", mem_cache_val, 3600)
1294
 
1295
def getItemObjForStaticDeals(item):
15379 kshitij.so 1296
    return {'marketPlaceUrl':item.get('marketPlaceUrl'),'available_price':item.get('available_price'),'source_product_name':item.get('source_product_name'),'thumbnail':item.get('thumbnail'),'source_id':int(item.get('source_id'))}
16300 manas 1297
 
1298
def getItemByMerchantIdentifier(identifier, source_id):
1299
    skuData = None
16406 kshitij.so 1300
    if source_id in (1,2,4,5,6):
16300 manas 1301
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
1302
    elif source_id == 3:
1303
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
1304
    if skuData is None:
1305
        return {}
1306
    else:
1307
        return skuData
15375 kshitij.so 1308
 
16364 kshitij.so 1309
def getDealsForNotification(skuBundleIds):
1310
    bundles= [int(skuBundleId) for skuBundleId in skuBundleIds.split(',')]
1311
    print bundles
16406 kshitij.so 1312
    dealsList = []
16364 kshitij.so 1313
    dealsListMap = []
16406 kshitij.so 1314
    for bundleId in bundles:
1315
        outer_query = []
1316
        outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
1317
        outer_query.append({'skuBundleId':bundleId})
1318
        deals = get_mongo_connection().Catalog.Deals.find({"$and":outer_query})
1319
        for deal in deals:
1320
            dealsList.append(deal)
16364 kshitij.so 1321
    sortedMap = {}
1322
    rankMap = {}
1323
    rank = 0
16406 kshitij.so 1324
    for sorted_deal in dealsList:
16364 kshitij.so 1325
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
1326
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1327
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1328
            rank = rank +1
1329
        else:
1330
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1331
                temp_list.append(sorted_deal)
1332
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1333
 
16367 kshitij.so 1334
    for dealList in [rankMap.get(k, []) for k in range(0, len(bundles))]:
16364 kshitij.so 1335
        temp = []
1336
        for d in dealList:
1337
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
1338
            if len(item) ==0:
1339
                continue
1340
            if d['dealType'] == 1 and d['source_id'] ==1:
1341
                item[0]['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(item[0]['identifier'].strip())
1342
            elif d['source_id'] ==3:
1343
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
1344
            else:
1345
                pass 
1346
            try:
1347
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
1348
                if not cashBack or cashBack.get('cash_back_status')!=1:
1349
                    item[0]['cash_back_type'] = 0
1350
                    item[0]['cash_back'] = 0
1351
                else:
1352
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
1353
                    item[0]['cash_back'] = cashBack['cash_back']
1354
            except:
1355
                print "Error in adding cashback to deals"
1356
                item[0]['cash_back_type'] = 0
1357
                item[0]['cash_back'] = 0
1358
            try:
1359
                item[0]['dp'] = d['dp']
1360
                item[0]['showDp'] = d['showDp']
1361
            except:
1362
                item[0]['dp'] = 0.0
1363
                item[0]['showDp'] = 0
1364
            temp.append(item[0])
1365
        if len(temp) > 1:
1366
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
1367
        dealsListMap.append(temp)
1368
    return dealsListMap
1369
 
16373 manas 1370
def getSkuBrandData(sku):
1371
    if sku is None:
1372
        return {}
1373
    else:
1374
        orders = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':sku})
1375
        if orders is None:
1376
            return {}
1377
        return orders
16488 kshitij.so 1378
 
1379
def addDealPoints(data):
1380
    collection = get_mongo_connection().Catalog.DealPoints
1381
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1382
    if cursor.count() > 0:
1383
        return {0:"Sku information already present."}
1384
    else:
1385
        collection.insert(data)
1386
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
1387
        return {1:"Data added successfully"}
1388
 
1389
def getAllBundlesWithDealPoints(offset, limit):
1390
    data = []
1391
    collection = get_mongo_connection().Catalog.DealPoints
1392
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
1393
    for val in cursor:
1394
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val.get('skuBundleId')})
1395
        if master is not None:
1396
            val['brand'] = master['brand']
1397
            val['source_product_name'] = master['product_name']
1398
        else:
1399
            val['brand'] = ""
1400
            val['source_product_name'] = ""
1401
        data.append(val)
1402
    return data
16546 kshitij.so 1403
 
1404
def generateRedirectUrl(retailer_id, app_id):
1405
    try:
16663 manish.sha 1406
        if retailer_id <= 0:
1407
            return {'url':"","message":"Retailer Id not valid"}
16546 kshitij.so 1408
        d_app_offer = app_offers.get_by(id=app_id)
16605 manish.sha 1409
    except:
1410
        traceback.print_exc()
16546 kshitij.so 1411
    finally:
1412
        session.close()
1413
    if d_app_offer is None:
1414
        return {'url':"","message":"App id doesn't exist"}
16364 kshitij.so 1415
 
16553 kshitij.so 1416
    appTransactions = AppTransactions(app_id, retailer_id, to_java_date(datetime.now()), None, 1, CB_INIT, 1, CB_INIT, None, None, d_app_offer.offer_price, d_app_offer.overriden_payout, d_app_offer.override_payout, d_app_offer.user_payout)
16546 kshitij.so 1417
 
1418
    get_mongo_connection().AppOrder.AppTransaction.insert(appTransactions.__dict__)
1419
    embedd = str((appTransactions.__dict__).get('_id'))
16548 kshitij.so 1420
    try:
1421
        index = d_app_offer.link.index(".freeb.co.in")
1422
    except:
16605 manish.sha 1423
        traceback.print_exc()
16548 kshitij.so 1424
        return {'url':"","message":"Substring not found"}
1425
    redirect_url = d_app_offer.link[0:index]+"."+embedd+d_app_offer.link[index:]
16546 kshitij.so 1426
    get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(embedd)},{"$set":{'redirect_url':redirect_url}})
16548 kshitij.so 1427
    return {'url':redirect_url,"message":"Success"}
16556 kshitij.so 1428
 
1429
def addPayout(payout, transaction_id):
1430
    try:
16764 manish.sha 1431
        print 'Got Response for Transaction Id:- '+ str(transaction_id)+ ' and Actual Payout:- '+str(payout)
16556 kshitij.so 1432
        transaction = list(get_mongo_connection().AppOrder.AppTransaction.find({'_id':ObjectId(transaction_id)}))
1433
        if len(transaction) > 0:
1434
            if (transaction[0])['payout_status'] ==1:
16753 manish.sha 1435
                get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(transaction_id)},{"$set":{'payout_amount':float(payout), 'payout_description': CB_APPROVED,'payout_status':2, 'cashback_status': 2, 'cash_back_description': CB_APPROVED, 'payout_time':to_java_date(datetime.now())}})
16782 manish.sha 1436
 
1437
                approvedAppTransaction = approved_app_transactions.get_by(transaction_id=transaction_id)
1438
                if approvedAppTransaction is None:
1439
                    approvedAppTransaction = approved_app_transactions()
1440
                    approvedAppTransaction.app_id = transaction[0]['app_id']
1441
                    approvedAppTransaction.cash_back_description = CB_APPROVED
1442
                    approvedAppTransaction.retailer_id = transaction[0]['retailer_id']
1443
                    approvedAppTransaction.transaction_id = transaction_id
1444
                    approvedAppTransaction.transaction_time = to_py_date(long(transaction[0]['transaction_time']))
1445
                    approvedAppTransaction.redirect_url = transaction[0]['redirect_url']
1446
                    approvedAppTransaction.payout_status = 2
1447
                    approvedAppTransaction.payout_description = CB_APPROVED
1448
                    approvedAppTransaction.cashback_status = 2 
1449
                    approvedAppTransaction.payout_amount = long(payout)
1450
                    approvedAppTransaction.payout_time = datetime.now()
1451
                    approvedAppTransaction.offer_price = long(transaction[0]['offer_price']) 
1452
                    approvedAppTransaction.overridenCashBack = transaction[0]['overridenCashBack']
1453
                    if str(transaction[0]['isCashBackOverriden']) == 'false' or str(transaction[0]['isCashBackOverriden']) == 'False':
1454
                        approvedAppTransaction.isCashBackOverriden = False
1455
                    else:
1456
                        approvedAppTransaction.isCashBackOverriden = True
1457
                    approvedAppTransaction.user_payout = transaction[0]['user_payout']
1458
                    approvedAppTransaction.cashBackConsidered = False
1459
                    session.commit()
1460
 
1461
                    updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
16631 manish.sha 1462
                else:
16783 manish.sha 1463
                    approvedAppTransaction.payout_amount = long(payout)
1464
                    approvedAppTransaction.payout_time = datetime.now()
1465
                    if approvedAppTransaction.cashBackConsidered == False:
1466
                        updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
1467
                    session.commit()
16782 manish.sha 1468
 
1469
                    '''
1470
                    try:
1471
                        if int(transaction[0]['offer_price']) != payout or int(transaction[0]['user_payout']) < payout:
1472
                            _sendAlertForAppPayouts(int(transaction[0]['app_id']), int(transaction[0]['offer_price']), int(transaction[0]['user_payout']), payout)
1473
                    except:
1474
                        print traceback.print_exc()
1475
                    '''
16783 manish.sha 1476
                    session.close()
16556 kshitij.so 1477
                return {'status':'ok','message':'Payout updated'}
1478
            elif (transaction[0])['payout_status'] ==2:
1479
                return {'status':'ok','message':'Payout already processed'}
1480
            else:
1481
                return {'status':'fail','message':'Something is wrong'}
1482
        else:
1483
            return {'status':'fail','message':'transaction_id not found'}
1484
    except:
16657 manish.sha 1485
        print traceback.print_exc()
16631 manish.sha 1486
        try:
16753 manish.sha 1487
            get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(transaction_id)},{"$set":{'payout_amount':None, 'payout_description': CB_INIT,'payout_status':1, 'cashback_status': 1, 'cash_back_description': CB_INIT, 'payout_time':None}})
16631 manish.sha 1488
        except:
1489
            print 'Data Inconsistency in Cashback Process'
16636 manish.sha 1490
            print traceback.print_exc()
16559 kshitij.so 1491
        return  {'status':'fail','message':'Something is wrong'}
16556 kshitij.so 1492
 
16631 manish.sha 1493
def _updateApprovedCashbackToUser(approvedAppTransactionId):
1494
    approvedAppTransaction = approved_app_transactions.get_by(id=approvedAppTransactionId)
1495
    currentMonth = datetime.today().month
1496
    currentDay = datetime.today().day
1497
    currentYear = datetime.today().year
1498
    fortNight = (currentMonth - 1)*2 + (currentDay/15)
1499
    if currentDay == 30 or currentDay ==31:
1500
        fortNight = fortNight-1
1501
    userAppCashbackObj = user_app_cashbacks.query.filter(user_app_cashbacks.yearVal==currentYear).filter(user_app_cashbacks.user_id==approvedAppTransaction.retailer_id).filter(user_app_cashbacks.fortnightOfYear==fortNight).filter(user_app_cashbacks.status=='Approved').first()
1502
    userAppInstallObj = user_app_installs.query.filter(user_app_installs.user_id==approvedAppTransaction.retailer_id).filter(user_app_installs.app_id==approvedAppTransaction.app_id).filter(user_app_installs.transaction_date==datetime(currentYear, currentMonth, currentDay, 0, 0, 0, 0).date()).first()
1503
    try:
1504
        if userAppCashbackObj is None:
1505
            userAppCashbackObj = user_app_cashbacks()
1506
            userAppCashbackObj.user_id = approvedAppTransaction.retailer_id
1507
            userAppCashbackObj.status = 'Approved'
1508
            userAppCashbackObj.amount = approvedAppTransaction.user_payout
1509
            userAppCashbackObj.fortnightOfYear = fortNight
1510
            userAppCashbackObj.yearVal = currentYear
1511
        else:
1512
            userAppCashbackObj.amount = userAppCashbackObj.amount + approvedAppTransaction.user_payout
1513
 
1514
        if userAppInstallObj is None:
1515
            app_offer = app_offers.get_by(id=approvedAppTransaction.app_id)
1516
            userAppInstallObj = user_app_installs()
1517
            userAppInstallObj.user_id = approvedAppTransaction.retailer_id
1518
            userAppInstallObj.fortnightOfYear = fortNight
1519
            userAppInstallObj.transaction_date = datetime(currentYear, currentMonth, currentDay, 0, 0, 0, 0).date()
1520
            userAppInstallObj.app_id = approvedAppTransaction.app_id
1521
            userAppInstallObj.app_name = app_offer.app_name
1522
            userAppInstallObj.installCount = 1
1523
            userAppInstallObj.payoutAmount = approvedAppTransaction.user_payout
1524
        else:
1525
            userAppInstallObj.installCount = userAppInstallObj.installCount + 1
1526
            userAppInstallObj.payoutAmount = userAppInstallObj.payoutAmount +approvedAppTransaction.user_payout
1527
 
1528
        approvedAppTransaction.cashBackConsidered = True
1529
        session.commit()
1530
        return True
1531
    except:
1532
        session.rollback()
16636 manish.sha 1533
        print traceback.print_exc()
16631 manish.sha 1534
        return False
16693 manish.sha 1535
 
1536
def _sendAlertForAppPayouts(app_id, offerPrice, userPayout, payout):
1537
    m = Email('localhost')
1538
    mFrom = "dtr@shop2020.in"
1539
    m.setFrom(mFrom)
1540
    mTo = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com','chaitnaya.vats@saholic.com','manoj.kumar@saholic.com','manish.sharma@shop2020.in']
1541
    for receipient in mTo:
1542
        m.addRecipient(receipient)
1543
    appOffer = app_offers.get_by(id=app_id)
1544
    if offerPrice != payout:
1545
        m.setSubject("Mismatch in Offer Price and Actual Pay Out for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1546
        message1 = "Offer Price:- "+ str(appOffer.offer_price) + "\n" + "Actual Pay Out:- "+ str(payout)
1547
        m.setTextBody(message1)
1548
    if userPayout > payout:
1549
        m.setSubject("User Pay Out greater than actual PayOut for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1550
        message2 = "User Pay Out Price:- "+ str(appOffer.user_payout) + "\n" + "Actual Pay Out:- "+ str(payout)
1551
        m.setTextBody(message2)
1552
    m.send()
16631 manish.sha 1553
 
16546 kshitij.so 1554
 
16693 manish.sha 1555
 
16546 kshitij.so 1556
 
13572 kshitij.so 1557
def main():
16556 kshitij.so 1558
    #generateRedirectUrl(101,1
16781 manish.sha 1559
    print getCashBackDetails('1351153', 3)
1560
    #print addPayout("10", "55db82c0bcabd7fc59e0a71")
13811 kshitij.so 1561
 
13921 kshitij.so 1562
 
15375 kshitij.so 1563
 
13572 kshitij.so 1564
if __name__=='__main__':
13932 amit.gupta 1565
    main()