Subversion Repositories SmartDukaan

Rev

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