Subversion Repositories SmartDukaan

Rev

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