Subversion Repositories SmartDukaan

Rev

Rev 17570 | Rev 17604 | 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
16894 manish.sha 4
from dtr.dao import FeaturedDeals, AppTransactions, AppOfferObj
14037 kshitij.so 5
from dtr.storage import DataService
6
from dtr.storage.DataService import price_preferences, brand_preferences, \
16789 amit.gupta 7
    user_actions, Brands, app_offers, approved_app_transactions, user_app_cashbacks, \
17280 manish.sha 8
    user_app_installs, appmasters, notification_campaigns
16304 amit.gupta 9
from dtr.storage.MemCache import MemCache
16789 amit.gupta 10
from dtr.utils.MailSender import Email
11
from dtr.utils.utils import to_java_date, CB_PENDING, CB_APPROVED, CB_INIT, \
12
    to_py_date, CB_REJECTED
16894 manish.sha 13
from sqlalchemy.sql.expression import func, func, or_, desc, asc, case
14305 amit.gupta 14
from elixir import *
15
from operator import itemgetter
16789 amit.gupta 16
from pymongo.command_cursor import CommandCursor
14305 amit.gupta 17
import pymongo
16398 amit.gupta 18
import random
14322 kshitij.so 19
import re
16789 amit.gupta 20
import time
14791 kshitij.so 21
import traceback
16894 manish.sha 22
from itertools import groupby
17280 manish.sha 23
import urllib
24
import urllib2
25
import json
17367 kshitij.so 26
import collections
27
try:
28
    import ordereddict
29
except:
30
    pass
13572 kshitij.so 31
 
32
con = None
33
 
14037 kshitij.so 34
DataService.initialize(db_hostname="localhost")
16304 amit.gupta 35
mc = MemCache("127.0.0.1")
14037 kshitij.so 36
 
17035 kshitij.so 37
SOURCE_MAP = {1:'AMAZON',2:'FLIPKART',3:'SNAPDEAL',4:'SAHOLIC',5:"SHOPCLUES.COM",6:"PAYTM.COM",7:"HOMESHOP18.COM"}
14482 kshitij.so 38
 
15853 kshitij.so 39
COLLECTION_MAP = {
40
                  'ExceptionalNlc':'skuBundleId',
41
                  'SkuDealerPrices':'skuBundleId',
42
                  'SkuDiscountInfo':'skuBundleId',
43
                  'SkuSchemeDetails':'skuBundleId',
17367 kshitij.so 44
                  'DealPoints':'skuBundleId',
45
                  'FeaturedDeals': 'skuBundleId'
15853 kshitij.so 46
                  }
47
 
13572 kshitij.so 48
def get_mongo_connection(host='localhost', port=27017):
49
    global con
50
    if con is None:
51
        print "Establishing connection %s host and port %d" %(host,port)
52
        try:
53
            con = pymongo.MongoClient(host, port)
54
        except Exception, e:
55
            print e
56
            return None
57
    return con
58
 
13907 kshitij.so 59
def populateCashBack():
13921 kshitij.so 60
    print "Populating cashback"
61
    cashBackMap = {}
62
    itemCashBackMap = {}
13907 kshitij.so 63
    cashBack = list(get_mongo_connection().Catalog.CategoryCashBack.find())
64
    for row in cashBack:
13970 kshitij.so 65
        temp_map = {}
66
        temp_list = []
13907 kshitij.so 67
        if cashBackMap.has_key(row['source_id']):
68
            arr = cashBackMap.get(row['source_id'])
69
            for val in arr:
70
                temp_list.append(val)
71
            temp_map[row['category_id']] = row
72
            temp_list.append(temp_map)
73
            cashBackMap[row['source_id']] = temp_list 
74
        else:
75
            temp_map[row['category_id']] = row
76
            temp_list.append(temp_map)
77
            cashBackMap[row['source_id']] = temp_list
13921 kshitij.so 78
    itemCashBack = list(get_mongo_connection().Catalog.ItemCashBack.find())
79
    for row in itemCashBack:
80
        if not itemCashBackMap.has_key(row['skuId']):
81
            itemCashBackMap[row['skuId']] = row
14761 kshitij.so 82
    mc.set("item_cash_back", itemCashBackMap, 24 * 60 * 60)
83
    mc.set("category_cash_back", cashBackMap, 24 * 60 * 60)
13907 kshitij.so 84
 
13572 kshitij.so 85
def addCategoryDiscount(data):
13970 kshitij.so 86
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 87
    query = []
88
    data['brand'] = data['brand'].strip().upper()
13970 kshitij.so 89
    data['discountType'] = data['discountType'].upper().strip()
13572 kshitij.so 90
    query.append({"brand":data['brand']})
91
    query.append({"category_id":data['category_id']})
92
    r = collection.find({"$and":query})
93
    if r.count() > 0:
13639 kshitij.so 94
        return {0:"Brand & Category info already present."}
13572 kshitij.so 95
    else:
96
        collection.insert(data)
13970 kshitij.so 97
        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 98
        return {1:"Data added successfully"}
13572 kshitij.so 99
 
13970 kshitij.so 100
def updateCategoryDiscount(data,_id):
101
    try:
102
        collection = get_mongo_connection().Catalog.CategoryDiscount
103
        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)
104
        get_mongo_connection().Catalog.MasterData.update({'brand':data['brand'],'category_id':data['category_id']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
105
        return {1:"Data updated successfully"}
106
    except:
107
        return {0:"Data not updated."}
108
 
109
 
13572 kshitij.so 110
def getAllCategoryDiscount():
111
    data = []
13970 kshitij.so 112
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 113
    cursor = collection.find()
114
    for val in cursor:
115
        data.append(val)
116
    return data
117
 
14553 kshitij.so 118
def __getBundledSkusfromSku(sku):
119
    masterData =  get_mongo_connection().Catalog.MasterData.find_one({"_id":sku},{"skuBundleId":1})
120
    if masterData is not None:
121
        return list(get_mongo_connection().Catalog.MasterData.find({"skuBundleId":masterData.get('skuBundleId')},{'_id':1,'skuBundleId':1}))
122
    else:
123
        return []
13572 kshitij.so 124
 
15853 kshitij.so 125
def addSchemeDetailsForSku(data):
126
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
127
    result = collection.find_one({'skuBundleId':data['skuBundleId']})
128
    if result is None:
14553 kshitij.so 129
        collection.insert(data)
15853 kshitij.so 130
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14553 kshitij.so 131
        return {1:"Data added successfully"}
15853 kshitij.so 132
    return {1:"BundleId info already present"}
133
 
14069 kshitij.so 134
def getAllSkuWiseSchemeDetails(offset, limit):
13572 kshitij.so 135
    data = []
13970 kshitij.so 136
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
14071 kshitij.so 137
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 138
    for val in cursor:
15853 kshitij.so 139
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
140
        if master is not None:
141
            val['brand'] = master['brand']
142
            val['source_product_name'] = master['source_product_name']
14069 kshitij.so 143
        else:
144
            val['brand'] = ""
145
            val['source_product_name'] = ""
13572 kshitij.so 146
        data.append(val)
147
    return data
148
 
15853 kshitij.so 149
def addSkuDiscountInfo(data):
150
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
151
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
152
    if cursor is not None:
153
        return {0:"BundleId information already present."}
13572 kshitij.so 154
    else:
15853 kshitij.so 155
        collection.insert(data)
156
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 157
        return {1:"Data added successfully"}
13572 kshitij.so 158
 
13970 kshitij.so 159
def getallSkuDiscountInfo(offset, limit):
13572 kshitij.so 160
    data = []
13970 kshitij.so 161
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
162
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 163
    for val in cursor:
15853 kshitij.so 164
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
165
        if master is not None:
166
            val['brand'] = master['brand']
167
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 168
        else:
169
            val['brand'] = ""
170
            val['source_product_name'] = ""
13572 kshitij.so 171
        data.append(val)
172
    return data
173
 
13970 kshitij.so 174
def updateSkuDiscount(data,_id):
175
    try:
176
        collection = get_mongo_connection().Catalog.SkuDiscountInfo
177
        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 178
        get_mongo_connection().Catalog.MasterData.update({'_id':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 179
        return {1:"Data updated successfully"}
180
    except:
181
        return {0:"Data not updated."}
182
 
183
 
15853 kshitij.so 184
def addExceptionalNlc(data):
185
    collection = get_mongo_connection().Catalog.ExceptionalNlc
186
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
187
    if cursor is not None:
188
        return {0:"BundleId information already present."}
13572 kshitij.so 189
    else:
15853 kshitij.so 190
        collection.insert(data)
191
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 192
        return {1:"Data added successfully"}
13572 kshitij.so 193
 
13970 kshitij.so 194
def getAllExceptionlNlcItems(offset, limit):
13572 kshitij.so 195
    data = []
13970 kshitij.so 196
    collection = get_mongo_connection().Catalog.ExceptionalNlc
14071 kshitij.so 197
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 198
    for val in cursor:
15853 kshitij.so 199
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
200
        if master is not None:
201
            val['brand'] = master['brand']
202
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 203
        else:
204
            val['brand'] = ""
205
            val['source_product_name'] = ""
13572 kshitij.so 206
        data.append(val)
207
    return data
208
 
14005 amit.gupta 209
def getMerchantOrdersByUser(userId, page=1, window=50, searchMap={}):
210
    if searchMap is None:
211
        searchMap = {}
13603 amit.gupta 212
    if page==None:
213
        page = 1
214
 
215
    if window==None:
216
        window = 50
217
    result = {}
13582 amit.gupta 218
    skip = (page-1)*window
14005 amit.gupta 219
 
14353 amit.gupta 220
    if userId is not None:
221
        searchMap['userId'] = userId
13603 amit.gupta 222
    collection = get_mongo_connection().Dtr.merchantOrder
14609 amit.gupta 223
    cursor = collection.find(searchMap).sort("orderId",-1)
13603 amit.gupta 224
    total_count = cursor.count()
225
    pages = total_count/window + (0 if total_count%window==0 else 1)  
226
    print "total_count", total_count
227
    if total_count > skip:
13999 amit.gupta 228
        cursor = cursor.skip(skip).limit(window)
13603 amit.gupta 229
        orders = []
230
        for order in cursor:
14002 amit.gupta 231
            del(order["_id"])
232
            orders.append(order)
13603 amit.gupta 233
        result['data'] = orders
234
        result['window'] = window
235
        result['totalCount'] = total_count 
236
        result['currCount'] = cursor.count()
237
        result['totalPages'] = pages
238
        result['currPage'] = page    
239
        return result
240
    else:
241
        return result
13630 kshitij.so 242
 
13927 amit.gupta 243
def getRefunds(userId, page=1, window=10):
244
    if page==None:
245
        page = 1
246
 
247
    if window==None:
13995 amit.gupta 248
        window = 10
13927 amit.gupta 249
    result = {}
250
    skip = (page-1)*window
16737 amit.gupta 251
    con = get_mongo_connection()
252
    collection = con.Dtr.refund
253
    user = con.Dtr.user
16754 amit.gupta 254
    credited = user.find_one({"userId":userId})
255
    if credited:
256
        credited = credited.get("credited")
257
    else:
258
        credited=0
259
 
13927 amit.gupta 260
    cursor = collection.find({"userId":userId})
261
    total_count = cursor.count()
262
    pages = total_count/window + (0 if total_count%window==0 else 1)  
263
    print "total_count", total_count
264
    if total_count > skip:
14668 amit.gupta 265
        cursor = cursor.skip(skip).limit(window).sort([('batch',-1)])
13927 amit.gupta 266
        refunds = []
267
        for refund in cursor:
268
            del(refund["_id"])
269
            refunds.append(refund)
16754 amit.gupta 270
        result['credited'] = credited
13927 amit.gupta 271
        result['data'] = refunds
272
        result['window'] = window
273
        result['totalCount'] = total_count 
274
        result['currCount'] = cursor.count()
275
        result['totalPages'] = pages
276
        result['currPage'] = page    
277
        return result
278
    else:
279
        return result
280
 
281
def getPendingRefunds(userId):
13991 amit.gupta 282
    print type(userId)
13927 amit.gupta 283
    result = get_mongo_connection().Dtr.merchantOrder\
284
        .aggregate([
16398 amit.gupta 285
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED, 'userId':userId}},
13927 amit.gupta 286
                    {'$unwind':"$subOrders"},
16398 amit.gupta 287
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED}},
13927 amit.gupta 288
                    { 
289
                     '$group':{
290
                               '_id':None,
291
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
292
                               }
293
                     }
13987 amit.gupta 294
                ])['result']
295
 
296
    if len(result)>0:
297
        result = result[0]        
298
        result.pop("_id")
299
    else:
300
        result={}
301
        result['amount'] = 0.0
14305 amit.gupta 302
    result['nextCredit'] = datetime.strftime(next_weekday(datetime.now(), int(PythonPropertyReader.getConfig('CREDIT_DAY_OF_WEEK'))),"%Y-%m-%d %H:%M:%S")
13927 amit.gupta 303
    return result
14037 kshitij.so 304
 
14671 amit.gupta 305
def getPendingCashbacks(userId):
306
    result = get_mongo_connection().Dtr.merchantOrder\
307
        .aggregate([
16398 amit.gupta 308
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING, 'userId':userId}},
14671 amit.gupta 309
                    {'$unwind':"$subOrders"},
16398 amit.gupta 310
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING}},
14671 amit.gupta 311
                    { 
312
                     '$group':{
313
                               '_id':None,
314
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
315
                               }
316
                     }
317
                ])['result']
318
 
319
    if len(result)>0:
320
        result = result[0]        
321
        result.pop("_id")
322
    else:
323
        result={}
324
        result['amount'] = 0.0
325
    return result
326
 
17369 kshitij.so 327
def __constructDummyDealObject(skuBundleId):
328
    temp =[]
329
    deals = get_mongo_connection().Catalog.Deals.find({"skuBundleId":skuBundleId,"$or":[{"showDeal":1}, {"prepaidDeal":1}]},{'_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, 'gross_price':1})
330
    for d in deals:
331
        d['persPoints'] = 0
332
        temp.append(d)
333
    return temp
334
 
335
 
336
 
14037 kshitij.so 337
def __populateCache(userId):
17369 kshitij.so 338
    try:
339
        if mc.get("featured_deals") is None:
340
            __populateFeaturedDeals()
341
        featuredDeals = mc.get("featured_deals")
342
 
343
    except Exception as e:
344
        print traceback.print_exc()
17469 kshitij.so 345
        featuredDeals = {3:{},5:{},6:{}}
17369 kshitij.so 346
    print featuredDeals
347
 
348
    fd_bundles = []
349
 
350
    for catMap in featuredDeals.itervalues():
351
        for fd_map in catMap.itervalues():
17541 kshitij.so 352
            if not fd_map.get('skuBundleId') in fd_bundles:
353
                fd_bundles.append(fd_map.get('skuBundleId'))
17369 kshitij.so 354
 
14037 kshitij.so 355
    print "Populating memcache for userId",userId
356
    outer_query = []
16067 kshitij.so 357
    outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
14037 kshitij.so 358
    query = {}
16170 kshitij.so 359
    query['$gt'] = -100
14037 kshitij.so 360
    outer_query.append({'totalPoints':query})
361
    brandPrefMap = {}
362
    pricePrefMap = {}
363
    actionsMap = {}
364
    brand_p = session.query(price_preferences).filter_by(user_id=userId).all()
365
    for x in brand_p:
366
        pricePrefMap[x.category_id] = [x.min_price,x.max_price]
367
    for x in session.query(brand_preferences).filter_by(user_id=userId).all():
368
        temp_map = {}
369
        if brandPrefMap.has_key((x.brand).strip().upper()):
370
            val = brandPrefMap.get((x.brand).strip().upper())
371
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
372
            val.append(temp_map)
373
        else:
374
            temp = []
375
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
376
            temp.append(temp_map)
377
            brandPrefMap[(x.brand).strip().upper()] = temp
378
 
379
    for x in session.query(user_actions).filter_by(user_id=userId).all():
380
        actionsMap[x.store_product_id] = 1 if x.action == 'like' else 0
17367 kshitij.so 381
    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, 'gross_price':1}).sort([('totalPoints',pymongo.DESCENDING),('bestSellerPoints',pymongo.DESCENDING),('nlcPoints',pymongo.DESCENDING),('rank',pymongo.DESCENDING)]))
14037 kshitij.so 382
    mobile_deals = []
383
    tablet_deals = []
17469 kshitij.so 384
    accessories_deals = []
14037 kshitij.so 385
    for deal in all_deals:
17369 kshitij.so 386
 
17469 kshitij.so 387
 
17369 kshitij.so 388
        try:
389
            fd_bundles.remove(deal.get('skuBundleId'))
390
        except:
391
            pass
392
 
14037 kshitij.so 393
        if actionsMap.get(deal['_id']) == 0:
394
            fav_weight =.25
395
        elif actionsMap.get(deal['_id']) == 1:
396
            fav_weight = 1.5
397
        else:
398
            fav_weight = 1
399
 
400
        if brandPrefMap.get(deal['brand'].strip().upper()) is not None:
17469 kshitij.so 401
 
14037 kshitij.so 402
            brand_weight = 1
403
            for brandInfo in brandPrefMap.get(deal['brand'].strip().upper()):
404
                if brandInfo.get(deal['category_id']) is not None:
405
                    if brandInfo.get(deal['category_id']) == 1:
14055 kshitij.so 406
                        brand_weight = 2.0
14037 kshitij.so 407
        else:
408
            brand_weight = 1
409
 
410
        if pricePrefMap.get(deal['category_id']) is not None:
411
 
412
            if deal['available_price'] >= pricePrefMap.get(deal['category_id'])[0] and deal['available_price'] <= pricePrefMap.get(deal['category_id'])[1]:
413
                asp_weight = 1.5
414
            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]:
415
                asp_weight = 1.2
416
            else:
417
                asp_weight = 1
418
        else:
419
            asp_weight = 1
420
 
421
        persPoints = deal['totalPoints'] * fav_weight * brand_weight * asp_weight
422
        deal['persPoints'] = persPoints
423
 
424
        if deal['category_id'] ==3:
425
            mobile_deals.append(deal)
426
        elif deal['category_id'] ==5:
427
            tablet_deals.append(deal)
17469 kshitij.so 428
        elif deal['category_id'] ==6:
429
            accessories_deals.append(deal)
14037 kshitij.so 430
        else:
431
            continue
432
 
14144 kshitij.so 433
    session.close()
17367 kshitij.so 434
 
435
    mobile_deals = sorted(mobile_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
436
    tablet_deals = sorted(tablet_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
17469 kshitij.so 437
    accessories_deals = sorted(accessories_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
17367 kshitij.so 438
 
439
 
17369 kshitij.so 440
    if len(fd_bundles) > 0:
441
        print fd_bundles
442
        print "There is still bundle in feature deals with points less than -100.Lets add info"
443
        for skuBundleId in fd_bundles:
444
            dummyDealObjList = __constructDummyDealObject(skuBundleId)
445
            for dummyDealObj in dummyDealObjList:
446
                if dummyDealObj['category_id'] ==3:
447
                    mobile_deals.append(dummyDealObj)
448
                elif dummyDealObj['category_id'] ==5:
449
                    tablet_deals.append(dummyDealObj)
17469 kshitij.so 450
                elif dummyDealObj['category_id'] ==6:
451
                    accessories_deals.append(dummyDealObj)
17369 kshitij.so 452
                else:
453
                    pass
454
 
17469 kshitij.so 455
    for super_category, categoryFeaturedDeals in featuredDeals.iteritems():
456
        for val in categoryFeaturedDeals.itervalues():
457
            dummyDealObjList = __constructDummyDealObject(val.get('skuBundleId'))
458
            for dummyDealObj in dummyDealObjList:
459
                if super_category == dummyDealObj['category_id']:
460
                    continue  
461
 
462
                if super_category ==3:
463
                    mobile_deals.append(dummyDealObj)
464
                elif super_category ==5:
465
                    tablet_deals.append(dummyDealObj)
466
                elif super_category ==6:
467
                    accessories_deals.append(dummyDealObj)
468
                else:
469
                    pass
470
 
17367 kshitij.so 471
    sortedMapMobiles = {}
472
    rankMapMobiles = {}
473
    rankMobiles = 0
474
 
475
    blockedRanksMobiles = []
476
    blockedSkuBundlesMobiles = []
477
    blockedInfoMobiles = {}
478
 
479
    featuredDealsMobiles = featuredDeals.get(3)
480
 
481
    for k, v in featuredDealsMobiles.iteritems():
17469 kshitij.so 482
        blockedRanksMobiles.append(k-1)
483
        blockedSkuBundlesMobiles.append(v.get('skuBundleId'))
17367 kshitij.so 484
 
485
    print "Blocked ranks ", blockedRanksMobiles
486
    print "Blocked bundles ", blockedSkuBundlesMobiles 
487
 
488
    for sorted_deal in mobile_deals:
17369 kshitij.so 489
 
17367 kshitij.so 490
        while(True):
491
            if rankMobiles in blockedRanksMobiles:
492
                print "skipping rank ",rankMobiles
493
                rankMobiles = rankMobiles +1
494
            else:
495
                break
496
 
497
        if sorted_deal['skuBundleId'] in blockedSkuBundlesMobiles:
498
            print "Yes sorted deal in blocked ",sorted_deal['skuBundleId']
499
            if blockedInfoMobiles.has_key(sorted_deal['skuBundleId']):
500
                blockedInfoMobiles.get(sorted_deal['skuBundleId']).append(sorted_deal)
501
            else:
502
                blockedInfoMobiles[sorted_deal['skuBundleId']] = [sorted_deal]
503
            continue
504
 
505
        if sortedMapMobiles.get(sorted_deal['skuBundleId']) is None:
506
            sortedMapMobiles[sorted_deal['skuBundleId']] = {rankMobiles:[sorted_deal]}
507
            rankMapMobiles[rankMobiles] = (sortedMapMobiles[sorted_deal['skuBundleId']].values())[0]
508
            rankMobiles = rankMobiles +1
509
        else:
510
            for temp_list in sortedMapMobiles.get(sorted_deal['skuBundleId']).itervalues():
511
                temp_list.append(sorted_deal)
512
            rankMapMobiles[(sortedMapMobiles.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
513
 
514
    print "Blocked info ", blockedInfoMobiles
515
 
516
    for rank in blockedRanksMobiles:
517
        print "Adding rank ",rank 
17369 kshitij.so 518
        if blockedInfoMobiles.get((featuredDealsMobiles.get(rank+1)).get('skuBundleId')) is not None:
519
            rankMapMobiles[rank] = blockedInfoMobiles.get((featuredDealsMobiles.get(rank+1)).get('skuBundleId'))
520
            print rankMapMobiles[rank]
17367 kshitij.so 521
 
522
 
523
    sortedMapTablets = {}
524
    rankMapTablets = {}
525
    rankTablets = 0
526
 
527
    blockedRanksTablets = []
528
    blockedSkuBundlesTablets = []
529
    blockedInfoTablets = {}
530
 
531
    featuredDealsTablets = featuredDeals.get(5)
532
 
533
 
534
    for k, v in featuredDealsTablets.iteritems():
17469 kshitij.so 535
        blockedRanksTablets.append(k-1)
536
        blockedSkuBundlesTablets.append(v.get('skuBundleId'))
537
 
17367 kshitij.so 538
    print "Blocked ranks ", blockedRanksTablets
539
    print "Blocked bundles ", blockedSkuBundlesTablets 
540
 
541
    for sorted_deal in tablet_deals:
542
        while(True):
543
            if rankTablets in blockedRanksTablets:
544
                print "skipping rank ",rankTablets
545
                rankTablets = rankTablets +1
546
            else:
547
                break
548
 
549
        if sorted_deal['skuBundleId'] in blockedSkuBundlesTablets:
550
            if blockedInfoTablets.has_key(sorted_deal['skuBundleId']):
551
                blockedInfoTablets.get(sorted_deal['skuBundleId']).append(sorted_deal)
552
            else:
553
                blockedInfoTablets[sorted_deal['skuBundleId']] = [sorted_deal]
554
            continue
555
 
556
        if sortedMapTablets.get(sorted_deal['skuBundleId']) is None:
557
            sortedMapTablets[sorted_deal['skuBundleId']] = {rankTablets:[sorted_deal]}
558
            rankMapTablets[rankTablets] = (sortedMapTablets[sorted_deal['skuBundleId']].values())[0]
559
            rankTablets = rankTablets +1
560
        else:
561
            for temp_list in sortedMapTablets.get(sorted_deal['skuBundleId']).itervalues():
562
                temp_list.append(sorted_deal)
563
            rankMapTablets[(sortedMapTablets.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
564
 
565
    for rank in blockedRanksTablets:
566
        print "Adding rank ",rank 
17369 kshitij.so 567
        if blockedInfoTablets.get((featuredDealsTablets.get(rank+1)).get('skuBundleId')) is not None:
568
            rankMapTablets[rank] = blockedInfoTablets.get((featuredDealsTablets.get(rank+1)).get('skuBundleId'))
569
            print rankMapTablets[rank]
17469 kshitij.so 570
 
17367 kshitij.so 571
 
17469 kshitij.so 572
    sortedMapAccessories = {}
573
    rankMapAccessories = {}
574
    rankAccessories = 0
575
 
576
    blockedRanksAccessories = []
577
    blockedSkuBundlesAccessories = []
578
    blockedInfoAccessories = {}
579
 
580
    featuredDealsAccessories = featuredDeals.get(6)
581
 
582
    for k, v in featuredDealsAccessories.iteritems():
583
        blockedRanksAccessories.append(k-1)
584
        blockedSkuBundlesAccessories.append(v.get('skuBundleId'))
585
 
586
    print "Blocked ranks ", blockedRanksAccessories
587
    print "Blocked bundles ", blockedSkuBundlesAccessories 
588
 
589
    for sorted_deal in accessories_deals:
590
 
591
        while(True):
592
            if rankAccessories in blockedRanksAccessories:
593
                print "skipping rank ",rankAccessories
594
                rankAccessories = rankAccessories +1
595
            else:
596
                break
597
 
598
        if sorted_deal['skuBundleId'] in blockedSkuBundlesAccessories:
599
            print "Yes sorted deal in blocked ",sorted_deal['skuBundleId']
600
            if blockedInfoAccessories.has_key(sorted_deal['skuBundleId']):
601
                blockedInfoAccessories.get(sorted_deal['skuBundleId']).append(sorted_deal)
602
            else:
603
                blockedInfoAccessories[sorted_deal['skuBundleId']] = [sorted_deal]
604
            continue
605
 
606
        if sortedMapAccessories.get(sorted_deal['skuBundleId']) is None:
607
            sortedMapAccessories[sorted_deal['skuBundleId']] = {rankAccessories:[sorted_deal]}
608
            rankMapAccessories[rankAccessories] = (sortedMapAccessories[sorted_deal['skuBundleId']].values())[0]
609
            rankAccessories = rankAccessories +1
610
        else:
611
            for temp_list in sortedMapAccessories.get(sorted_deal['skuBundleId']).itervalues():
612
                temp_list.append(sorted_deal)
613
            rankMapAccessories[(sortedMapAccessories.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
614
 
615
    print "Blocked info ", blockedInfoAccessories
616
 
617
    for rank in blockedRanksAccessories:
618
        print "Adding rank acc ",rank 
619
        if blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId')) is not None:
620
            rankMapAccessories[rank] = blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId'))
621
            print rankMapAccessories[rank]
622
 
623
    print rankMapAccessories
624
 
625
    mem_cache_val = {3:mobile_deals, 5:tablet_deals, 6: accessories_deals,"3_rankMap": rankMapMobiles,"5_rankMap": rankMapTablets,"6_rankMap": rankMapAccessories }
14037 kshitij.so 626
    mc.set(str(userId), mem_cache_val)
627
 
628
 
14531 kshitij.so 629
def __populateFeaturedDeals():
17367 kshitij.so 630
    print "Populating featured deals....."
631
    featuredDealsMobiles = {}
632
    featuredDealsTablets = {}
17469 kshitij.so 633
    featuredDealsAccessories = {}
17367 kshitij.so 634
    activeFeaturedDeals = get_mongo_connection().Catalog.FeaturedDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}}).sort([('rank',pymongo.DESCENDING)])
14531 kshitij.so 635
    for activeFeaturedDeal in activeFeaturedDeals:
17367 kshitij.so 636
        deals = get_mongo_connection().Catalog.Deals.find({"skuBundleId":activeFeaturedDeal.get('skuBundleId'),"$or":[{"showDeal":1}, {"prepaidDeal":1}]})
637
        for deal in deals:
638
            if deal.get('available_price') <= activeFeaturedDeal.get('thresholdPrice'):
17469 kshitij.so 639
                for category_id, rank  in activeFeaturedDeal['otherInfo'].iteritems():
640
                    f_deal = {'skuBundleId':activeFeaturedDeal.get('skuBundleId'), 'thresholdPrice':activeFeaturedDeal.get('thresholdPrice'), 'rank':rank,'category_id':int(category_id),'totalPoints':activeFeaturedDeal.get('totalPoints')}
641
                    if f_deal['category_id'] == 3:
642
                        featuredDealsMobiles[rank] = f_deal
643
                    elif f_deal['category_id']==5:
644
                        featuredDealsTablets[rank] = f_deal
645
                    elif f_deal['category_id']==6:
646
                        featuredDealsAccessories[rank] = f_deal
17367 kshitij.so 647
                break
17469 kshitij.so 648
 
649
#                f_deal = {'skuBundleId':activeFeaturedDeal.get('skuBundleId'), 'thresholdPrice':activeFeaturedDeal.get('thresholdPrice'), 'rank':activeFeaturedDeal.get('rank'),'category_id':activeFeaturedDeal.get('category_id'),'totalPoints':activeFeaturedDeal.get('totalPoints')}
650
#                 if activeFeaturedDeal.get('category_id') == 3:
651
#                     featuredDealsMobiles[activeFeaturedDeal.get('rank')] = f_deal
652
#                 else:
653
#                     featuredDealsTablets[activeFeaturedDeal.get('rank')] = f_deal
654
#                 break
655
 
17367 kshitij.so 656
 
17469 kshitij.so 657
    mc.set("featured_deals", {3:featuredDealsMobiles,5:featuredDealsTablets,6:featuredDealsAccessories}, 600)
14037 kshitij.so 658
 
14791 kshitij.so 659
def getNewDeals(userId, category_id, offset, limit, sort, direction, filterData=None):
17469 kshitij.so 660
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
13921 kshitij.so 661
        populateCashBack()
14037 kshitij.so 662
 
16079 kshitij.so 663
    dealsListMap = []
14037 kshitij.so 664
    user_specific_deals = mc.get(str(userId))
665
    if user_specific_deals is None:
666
        __populateCache(userId)
667
        user_specific_deals = mc.get(str(userId))
14038 kshitij.so 668
    else:
669
        print "Getting user deals from cache"
14037 kshitij.so 670
    category_specific_deals = user_specific_deals.get(category_id)
671
 
17367 kshitij.so 672
    insert_featured_deals = False
14037 kshitij.so 673
    if sort is None or direction is None:
17367 kshitij.so 674
        insert_featured_deals = True
675
        rankMap = user_specific_deals.get(str(category_id)+"_rankMap")
14037 kshitij.so 676
    else:
677
        if sort == "bestSellerPoints":
678
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['bestSellerPoints'], x['rank'], x['nlcPoints']),reverse=True)
679
        else:
680
            if direction == -1:
681
                rev = True
682
            else:
683
                rev = False
684
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['available_price']),reverse=rev)
685
 
14791 kshitij.so 686
 
687
    print "============================"
17367 kshitij.so 688
    filtered_deals = []
14791 kshitij.so 689
    if filterData is not None:
690
        try:
17367 kshitij.so 691
            filtered_deals = filterDeals(category_specific_deals, filterData)
14791 kshitij.so 692
        except:
16067 kshitij.so 693
            traceback.print_exc()
14791 kshitij.so 694
 
17367 kshitij.so 695
    if not insert_featured_deals:
696
        sortedMap = {}
697
        rankMap = {}
698
        rank = 0
699
        for sorted_deal in sorted_deals:
700
 
701
            if len(filtered_deals) > 0 and  sorted_deal['skuBundleId'] not in filtered_deals:
702
                continue
703
 
704
            if sortedMap.get(sorted_deal['skuBundleId']) is None:
705
                sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
706
                rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
707
                rank = rank +1
708
            else:
709
                for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
710
                    temp_list.append(sorted_deal)
711
                rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
712
    else:
713
        filterMap = {}
714
        rank = 0
715
        if len(filtered_deals) > 0:
716
            try:
717
                od = collections.OrderedDict(sorted(rankMap.items()))
718
            except:
719
                od = ordereddict.OrderedDict(sorted(rankMap.items()))
720
            for k, v in od.iteritems():
721
                if v[0].get('skuBundleId') in filtered_deals:
722
                    filterMap[rank] = v
723
                    rank =rank+1
724
            rankMap = filterMap
725
 
16067 kshitij.so 726
    for dealList in [rankMap.get(k, []) for k in range(offset, offset+limit)]:
16079 kshitij.so 727
        temp = []
17367 kshitij.so 728
        if dealList is None or len(dealList)==0:
17369 kshitij.so 729
            print "Empty deal;lisr"
17367 kshitij.so 730
            continue
16067 kshitij.so 731
        for d in dealList:
732
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
16320 kshitij.so 733
            if len(item) ==0:
734
                continue
16079 kshitij.so 735
            item[0]['persPoints'] = d['persPoints']
736
            if d['dealType'] == 1 and d['source_id'] ==1:
16511 kshitij.so 737
                try:
738
                    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())}}))
739
                    item[0]['marketPlaceUrl'] = manualDeal[0]['dealUrl'].strip()
740
                except:
741
                    pass
16079 kshitij.so 742
            elif d['source_id'] ==3:
743
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
744
            else:
745
                pass 
746
            try:
747
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
748
                if not cashBack or cashBack.get('cash_back_status')!=1:
14037 kshitij.so 749
                    item[0]['cash_back_type'] = 0
750
                    item[0]['cash_back'] = 0
16079 kshitij.so 751
                else:
17180 kshitij.so 752
                    if cashBack.get('maxCashBack') is not None:
753
 
754
                        if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*item[0]['available_price'])/100 > cashBack.get('maxCashBack'):
755
                            cashBack['cash_back_type'] = 2
756
                            cashBack['cash_back'] = cashBack['maxCashBack']
757
                        elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
758
                            cashBack['cash_back'] = cashBack['maxCashBack']
759
 
16079 kshitij.so 760
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
761
                    item[0]['cash_back'] = cashBack['cash_back']
762
            except:
763
                print "Error in adding cashback to deals"
764
                item[0]['cash_back_type'] = 0
765
                item[0]['cash_back'] = 0
16252 kshitij.so 766
            try:
767
                item[0]['dp'] = d['dp']
768
                item[0]['showDp'] = d['showDp']
769
            except:
770
                item[0]['dp'] = 0.0
771
                item[0]['showDp'] = 0
16483 kshitij.so 772
            try:
773
                item[0]['thumbnail'] = item[0]['thumbnail'].strip()
774
            except:
17115 manish.sha 775
                pass
17603 kshitij.so 776
 
777
            try:
778
                if item[0]['showVideo']==0:
779
                    item[0]['videoLink'] =""
780
            except:
781
                item[0]['videoLink'] =""
782
            try:
783
                if item[0]['quantity'] >1:
784
                    ppq = float(item[0]['available_price'])/item[0]['quantity']
785
 
786
                    if ppq == round(ppq):
787
                        item[0]['ppq'] = int(ppq)
788
                    else:
789
                        item[0]['ppq'] = round(ppq,2)
790
                    item[0]['tagline'] = ""
791
                else:
792
                    item[0]['ppq'] = 0
793
            except:
794
                item[0]['ppq'] = 0
795
            try:
796
                item[0]['filterLink'] = '/category/'+str(int(item[0]['category_id']))+'?filter=brand&brands='+str(int(item[0]['brand_id']))
797
            except:
798
                item[0]['filterLink'] = ""
16079 kshitij.so 799
            temp.append(item[0])
16125 kshitij.so 800
        if len(temp) > 1:
16126 kshitij.so 801
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
16079 kshitij.so 802
        dealsListMap.append(temp)
803
    return dealsListMap
14037 kshitij.so 804
 
14791 kshitij.so 805
def filterDeals(deals, filterData):
806
    dealFiltered = []
807
    brandsFiltered = []
808
    filterArray = filterData.split('|')
809
    for data in filterArray:
810
        try:
811
            filter, info = data.split(':')
812
        except Exception as ex:
813
            traceback.print_exc()
814
            continue
815
        if filter == 'dealFilter':
816
            toFilter = info.split('^')
817
            print "deal filter ",toFilter
818
            if 'deals' in toFilter:
819
                dealFiltered = deals
820
                continue
821
            for filterVal in toFilter:
822
                if filterVal == 'dod':
823
                    for deal in deals:
824
                        if deal['dealType'] == 1:
825
                            dealFiltered.append(deal)
826
        elif filter == 'brandFilter':
827
            toFilter = info.split('^')
828
            print "brand filter ",toFilter
829
            if len(toFilter) == 0 or (len(toFilter)==1 and toFilter[0]==''):
830
                brandsFiltered = deals
831
            for deal in deals:
15151 kshitij.so 832
                if str(int(deal['brand_id'])) in toFilter:
14791 kshitij.so 833
                    brandsFiltered.append(deal)
15040 kshitij.so 834
    if len(dealFiltered) == 0:
17367 kshitij.so 835
        return [trend['skuBundleId'] for trend in brandsFiltered]
836
    return [i['skuBundleId'] for i in dealFiltered for j in brandsFiltered if i['_id']==j['_id']]
14791 kshitij.so 837
 
838
 
14037 kshitij.so 839
def getDeals(userId, category_id, offset, limit, sort, direction):
17469 kshitij.so 840
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14037 kshitij.so 841
        populateCashBack()
842
    rank = 1
13771 kshitij.so 843
    deals = {}
13910 kshitij.so 844
    outer_query = []
845
    outer_query.append({"showDeal":1})
846
    query = {}
847
    query['$gt'] = 0
848
    outer_query.append({'totalPoints':query})
849
    if category_id in (3,5):
850
        outer_query.append({'category_id':category_id})
13803 kshitij.so 851
    if sort is None or direction is None:
852
        direct = -1
13910 kshitij.so 853
        print outer_query
854
        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 855
    else:
13910 kshitij.so 856
        print outer_query
13803 kshitij.so 857
        direct = direction
13910 kshitij.so 858
        if sort == "bestSellerPoints":
859
            print "yes,sorting by bestSellerPoints"
860
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([('bestSellerPoints',direct),('rank',direct),('nlcPoints',direct)]).skip(offset).limit(limit))
861
        else:
862
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([(sort,direct)]).skip(offset).limit(limit))
13771 kshitij.so 863
    for d in data:
864
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
865
        if not deals.has_key(item[0]['identifier']):
13921 kshitij.so 866
            item[0]['dealRank'] = rank
867
            try:
14761 kshitij.so 868
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
13921 kshitij.so 869
                if not cashBack or cashBack.get('cash_back_status')!=1:
13928 kshitij.so 870
                    item[0]['cash_back_type'] = 0
871
                    item[0]['cash_back'] = 0
13921 kshitij.so 872
                else:
14766 kshitij.so 873
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
13928 kshitij.so 874
                    item[0]['cash_back'] = cashBack['cash_back']
13921 kshitij.so 875
            except:
876
                print "Error in adding cashback to deals"
13928 kshitij.so 877
                item[0]['cash_back_type'] = 0
878
                item[0]['cash_back'] = 0
13771 kshitij.so 879
            deals[item[0]['identifier']] = item[0]
13921 kshitij.so 880
 
13771 kshitij.so 881
            rank +=1
13785 kshitij.so 882
    return sorted(deals.values(), key=itemgetter('dealRank'))
883
 
16222 kshitij.so 884
def getItem(skuId,showDp=None):
16224 kshitij.so 885
    temp = []
17469 kshitij.so 886
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14113 kshitij.so 887
        populateCashBack()
13795 kshitij.so 888
    try:
16222 kshitij.so 889
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'_id':int(skuId)})
890
        if skuData is None:
891
            raise
892
        try:
893
            cashBack = getCashBack(skuData['_id'], skuData['source_id'], skuData['category_id'])
894
            if not cashBack or cashBack.get('cash_back_status')!=1:
895
                skuData['cash_back_type'] = 0
896
                skuData['cash_back'] = 0
897
            else:
898
                skuData['cash_back_type'] = cashBack['cash_back_type']
899
                skuData['cash_back'] = cashBack['cash_back']
900
        except:
901
            print "Error in adding cashback to deals"
902
            skuData['cash_back_type'] = 0
903
            skuData['cash_back'] = 0
904
        skuData['in_stock'] = int(skuData['in_stock'])
905
        skuData['is_shortage'] = int(skuData['is_shortage'])
906
        skuData['category_id'] = int(skuData['category_id'])
907
        skuData['status'] = int(skuData['status'])
16483 kshitij.so 908
        try:
909
            skuData['thumbnail'] = skuData['thumbnail'].strip()
910
        except:
911
            pass 
16222 kshitij.so 912
        if showDp is not None:
913
            dealerPrice = get_mongo_connection().Catalog.SkuDealerPrices.find_one({'skuBundleId':skuData['skuBundleId']})
914
            skuData['dp'] = 0.0
915
            skuData['showDp'] = 0
916
            if dealerPrice is not None:
917
                skuData['dp'] = dealerPrice['dp']
918
                skuData['showDp'] = dealerPrice['showDp']
16224 kshitij.so 919
        temp.append(skuData)
920
        return temp
13795 kshitij.so 921
    except:
16224 kshitij.so 922
        return []
13836 kshitij.so 923
 
14761 kshitij.so 924
def getCashBack(skuId, source_id, category_id):
17469 kshitij.so 925
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14761 kshitij.so 926
        populateCashBack()
927
    itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 928
    itemCashBack = itemCashBackMap.get(skuId)
929
    if itemCashBack is not None:
930
        return itemCashBack
14761 kshitij.so 931
    cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 932
    sourceCashBack = cashBackMap.get(source_id)
933
    if sourceCashBack is not None and len(sourceCashBack) > 0:
934
        for cashBack in sourceCashBack:
935
            if cashBack.get(category_id) is None:
936
                continue
937
            else:
938
                return cashBack.get(category_id)
939
    else:
940
        return {}
16560 amit.gupta 941
 
942
def getBundleBySourceSku(source_id, identifier):
17035 kshitij.so 943
    if source_id in (1,2,4,5,6,7):
16560 amit.gupta 944
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
945
    elif source_id == 3:
946
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
947
    else:
948
        return {}
949
 
950
    if not skuData:
951
        return {}
952
    else:
16564 amit.gupta 953
        bundleId = skuData[0]["skuBundleId"]
17035 kshitij.so 954
        itemIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':bundleId, 'in_stock':1, 'source_id':{"$in":[1,2,3,5,6,7]}}, 
16580 amit.gupta 955
                       {"source_id":1, "available_price":1, "marketPlaceUrl":1, "gross_price":1, "codAvailable":1, "source_product_name":1, "offer":1, "coupon":1}))
16579 amit.gupta 956
        return {'products':itemIds}
16560 amit.gupta 957
 
958
 
13921 kshitij.so 959
 
15129 kshitij.so 960
def getDealRank(identifier, source_id, userId):
17035 kshitij.so 961
    if source_id in (1,2,4,5,6,7):
15129 kshitij.so 962
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
963
    elif source_id == 3:
964
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
965
    else:
16282 amit.gupta 966
        return {'rank':0, 'description':'Source not valid','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15349 kshitij.so 967
    if len(skuData) == 0:
16282 amit.gupta 968
        return {'rank':0, 'description':'No matching product identifier found','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15129 kshitij.so 969
    user_specific_deals = mc.get(str(userId))
970
    if user_specific_deals is None:
971
        __populateCache(userId)
972
        user_specific_deals = mc.get(str(userId))
973
    else:
974
        print "Getting user deals from cache"
975
    category_id = skuData[0]['category_id']
976
    category_specific_deals = user_specific_deals.get(category_id)
16280 kshitij.so 977
 
978
    dealsData = get_mongo_connection().Catalog.Deals.find_one({'skuBundleId':skuData[0]['skuBundleId']})
979
    if dealsData is None:
980
        dealsData = {}
981
 
15129 kshitij.so 982
    if category_specific_deals is None or len(category_specific_deals) ==0:
16280 kshitij.so 983
        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 984
    sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
16168 kshitij.so 985
    sortedMap = {}
986
    rankMap = {}
987
    rank = 0
15129 kshitij.so 988
    for sorted_deal in sorted_deals:
16168 kshitij.so 989
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
990
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
991
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
992
            rank = rank +1
993
        else:
994
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
995
                temp_list.append(sorted_deal)
996
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
997
 
16187 kshitij.so 998
    for dealRank ,dealList in rankMap.iteritems():
16168 kshitij.so 999
        for d in dealList:
16186 kshitij.so 1000
            if d['skuBundleId'] == skuData[0]['skuBundleId']:
16280 kshitij.so 1001
                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 1002
 
16280 kshitij.so 1003
    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 1004
 
1005
 
13836 kshitij.so 1006
def getCashBackDetails(identifier, source_id):
17469 kshitij.so 1007
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
13921 kshitij.so 1008
        populateCashBack()
13771 kshitij.so 1009
 
17035 kshitij.so 1010
    if source_id in (1,2,4,5,6,7):
13839 kshitij.so 1011
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1012
    elif source_id == 3:
13839 kshitij.so 1013
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1014
    else:
1015
        return {}
13836 kshitij.so 1016
    if len(skuData) > 0:
14761 kshitij.so 1017
        itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 1018
        itemCashBack = itemCashBackMap.get(skuData[0]['_id'])
1019
        if itemCashBack is not None:
1020
            return itemCashBack
14761 kshitij.so 1021
        cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 1022
        sourceCashBack = cashBackMap.get(source_id)
1023
        if sourceCashBack is not None and len(sourceCashBack) > 0:
1024
            for cashBack in sourceCashBack:
1025
                if cashBack.get(skuData[0]['category_id']) is None:
1026
                    continue
1027
                else:
1028
                    return cashBack.get(skuData[0]['category_id'])
13836 kshitij.so 1029
        else:
1030
            return {} 
1031
    else:
1032
        return {}
13986 amit.gupta 1033
 
14398 amit.gupta 1034
def getImgSrc(identifier, source_id):
1035
    skuData = None
17035 kshitij.so 1036
    if source_id in (1,2,4,5,6,7):
14414 amit.gupta 1037
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1038
    elif source_id == 3:
14414 amit.gupta 1039
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1040
    if skuData is None:
1041
        return {}
1042
    else:
16483 kshitij.so 1043
        try:
1044
            return {'thumbnail':skuData.get('thumbnail').strip()}
1045
        except:
1046
            return {'thumbnail':skuData.get('thumbnail')}
13986 amit.gupta 1047
 
1048
def next_weekday(d, weekday):
1049
    days_ahead = weekday - d.weekday()
1050
    if days_ahead <= 0: # Target day already happened this week
1051
        days_ahead += 7
1052
    return d + timedelta(days_ahead)
1053
 
13771 kshitij.so 1054
 
13970 kshitij.so 1055
def getAllDealerPrices(offset, limit):
1056
    data = []
1057
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1058
    cursor = collection.find().skip(offset).limit(limit)
1059
    for val in cursor:
15853 kshitij.so 1060
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
1061
        if master is not None:
1062
            val['brand'] = master['brand']
1063
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 1064
        else:
1065
            val['brand'] = ""
1066
            val['source_product_name'] = ""
16231 kshitij.so 1067
        val['showDp'] = int(val['showDp'])
13970 kshitij.so 1068
        data.append(val)
1069
    return data
1070
 
15853 kshitij.so 1071
def addSkuDealerPrice(data):
1072
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1073
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
1074
    if cursor is not None:
1075
        return {0:"BundleId information already present."}
13970 kshitij.so 1076
    else:
15853 kshitij.so 1077
        collection.insert(data)
1078
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1079
        return {1:"Data added successfully"}
1080
 
1081
def updateSkuDealerPrice(data, _id):
1082
    try:
1083
        collection = get_mongo_connection().Catalog.SkuDealerPrices
1084
        collection.update({'_id':ObjectId(_id)},{"$set":{'dp':data['dp']}},upsert=False, multi = False)
15853 kshitij.so 1085
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1086
        return {1:"Data updated successfully"}
1087
    except:
1088
        return {0:"Data not updated."}
1089
 
1090
def updateExceptionalNlc(data, _id):
1091
    try:
1092
        collection = get_mongo_connection().Catalog.ExceptionalNlc
1093
        collection.update({'_id':ObjectId(_id)},{"$set":{'maxNlc':data['maxNlc'], 'minNlc':data['minNlc'], 'overrideNlc':data['overrideNlc']}},upsert=False, multi = False)
15853 kshitij.so 1094
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1095
        return {1:"Data updated successfully"}
1096
    except:
1097
        return {0:"Data not updated."}
1098
 
14041 kshitij.so 1099
def resetCache(userId):
14043 kshitij.so 1100
    try:
1101
        mc.delete(userId)
1102
        return {1:'Cache cleared.'}
1103
    except:
1104
        return {0:'Unable to clear cache.'}
1105
 
15853 kshitij.so 1106
def updateCollection(data):
14083 kshitij.so 1107
    print data
15853 kshitij.so 1108
    try:
1109
        collection = get_mongo_connection().Catalog[data['class']]
1110
        class_name = data.pop('class')
1111
        _id = data.pop('oid')
1112
        result = collection.update({'_id':ObjectId(_id)},{"$set":data},upsert=False, multi = False)
1113
        if class_name != "Notifications":
1114
            record = list(collection.find({'_id':ObjectId(_id)}))
1115
            if class_name !="CategoryDiscount":
1116
                if record[0].has_key('sku'):
1117
                    field = '_id'
1118
                    val = record[0]['sku']
14852 kshitij.so 1119
                else:
15853 kshitij.so 1120
                    field = 'skuBundleId'
1121
                    val = record[0]['skuBundleId']
1122
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False, multi = True)
1123
            else:
1124
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1125
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
16233 kshitij.so 1126
        if class_name =='SkuDealerPrices':
16237 kshitij.so 1127
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':val},{"$set":data},upsert=False, multi=True)
15853 kshitij.so 1128
        return {1:"Data updated successfully"}
1129
    except Exception as e:
1130
        print e
1131
        return {0:"Data not updated."}
14575 kshitij.so 1132
 
14076 kshitij.so 1133
 
14553 kshitij.so 1134
def addNegativeDeals(data, multi):
1135
    if multi !=1: 
1136
        collection = get_mongo_connection().Catalog.NegativeDeals
1137
        cursor = collection.find({"sku":data['sku']})
1138
        if cursor.count() > 0:
1139
            return {0:"Sku information already present."}
1140
        else:
1141
            collection.insert(data)
1142
            return {1:"Data added successfully"}
14481 kshitij.so 1143
    else:
14553 kshitij.so 1144
        skuIds = __getBundledSkusfromSku(data['sku'])
1145
        for sku in skuIds:
1146
            data['sku'] = sku.get('_id')
1147
            collection = get_mongo_connection().Catalog.NegativeDeals
1148
            cursor = collection.find({"sku":data['sku']})
1149
            if cursor.count() > 0:
1150
                continue
1151
            else:
14558 kshitij.so 1152
                data.pop('_id',None)
14553 kshitij.so 1153
                collection.insert(data)
14481 kshitij.so 1154
        return {1:"Data added successfully"}
1155
 
1156
def getAllNegativeDeals(offset, limit):
1157
    data = []
1158
    collection = get_mongo_connection().Catalog.NegativeDeals
1159
    cursor = collection.find().skip(offset).limit(limit)
1160
    for val in cursor:
1161
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1162
        if len(master) > 0:
1163
            val['brand'] = master[0]['brand']
1164
            val['source_product_name'] = master[0]['source_product_name']
1165
            val['skuBundleId'] = master[0]['skuBundleId']
1166
        else:
1167
            val['brand'] = ""
1168
            val['source_product_name'] = ""
1169
            val['skuBundleId'] = ""
1170
        data.append(val)
1171
    return data
1172
 
1173
def getAllManualDeals(offset, limit):
1174
    data = []
1175
    collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1176
    cursor = collection.find().skip(offset).limit(limit)
14481 kshitij.so 1177
    for val in cursor:
1178
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1179
        if len(master) > 0:
1180
            val['brand'] = master[0]['brand']
1181
            val['source_product_name'] = master[0]['source_product_name']
1182
            val['skuBundleId'] = master[0]['skuBundleId']
1183
        else:
1184
            val['brand'] = ""
1185
            val['source_product_name'] = ""
1186
            val['skuBundleId'] = ""
1187
        data.append(val)
1188
    return data
14076 kshitij.so 1189
 
14553 kshitij.so 1190
def addManualDeal(data, multi):
1191
    if multi !=1:
1192
        collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1193
        cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1194
        if cursor.count() > 0:
1195
            return {0:"Sku information already present."}
1196
        else:
1197
            collection.insert(data)
1198
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
1199
            return {1:"Data added successfully"}
14481 kshitij.so 1200
    else:
14553 kshitij.so 1201
        skuIds = __getBundledSkusfromSku(data['sku'])
1202
        for sku in skuIds:
1203
            data['sku'] = sku.get('_id')
1204
            collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1205
            cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1206
            if cursor.count() > 0:
1207
                continue
1208
            else:
14558 kshitij.so 1209
                data.pop('_id',None)
14553 kshitij.so 1210
                collection.insert(data)
1211
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14481 kshitij.so 1212
        return {1:"Data added successfully"}
14553 kshitij.so 1213
 
14481 kshitij.so 1214
def deleteDocument(data):
15853 kshitij.so 1215
    print "inside detete document"
14481 kshitij.so 1216
    print data
1217
    try:
1218
        collection = get_mongo_connection().Catalog[data['class']]
1219
        class_name = data.pop('class')
1220
        _id = data.pop('oid')
1221
        record = list(collection.find({'_id':ObjectId(_id)}))
1222
        collection.remove({'_id':ObjectId(_id)})
15075 kshitij.so 1223
        if class_name != "Notifications":
1224
            if class_name !="CategoryDiscount":
15853 kshitij.so 1225
                print record[0]
1226
                if record[0].has_key('sku'):
1227
                    field = '_id'
1228
                    val = record[0]['sku']
1229
                else:
1230
                    field = 'skuBundleId'
1231
                    val = record[0]['skuBundleId']
1232
                print "Updating master"
1233
                print field
1234
                print val
1235
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
15075 kshitij.so 1236
            else:
1237
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1238
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
14481 kshitij.so 1239
        return {1:"Document deleted successfully"}
1240
    except Exception as e:
1241
        print e
1242
        return {0:"Document not deleted."}
13970 kshitij.so 1243
 
14482 kshitij.so 1244
def searchMaster(offset, limit, search_term):
1245
    data = []
14531 kshitij.so 1246
    if search_term is not None:
14551 kshitij.so 1247
        terms = search_term.split(' ')
1248
        outer_query = []
1249
        for term in terms:
1250
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
14531 kshitij.so 1251
        try:
14551 kshitij.so 1252
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14531 kshitij.so 1253
            for record in collection:
1254
                data.append(record)
1255
        except:
1256
            pass
1257
    else:
1258
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14482 kshitij.so 1259
        for record in collection:
1260
            data.append(record)
1261
    return data
14481 kshitij.so 1262
 
14495 kshitij.so 1263
def getAllFeaturedDeals(offset, limit):
1264
    data = []
1265
    collection = get_mongo_connection().Catalog.FeaturedDeals
17561 kshitij.so 1266
    cursor = collection.find({}).skip(offset).limit(limit)
14495 kshitij.so 1267
    for val in cursor:
17367 kshitij.so 1268
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14495 kshitij.so 1269
        if len(master) > 0:
1270
            val['brand'] = master[0]['brand']
1271
            val['source_product_name'] = master[0]['source_product_name']
1272
            val['skuBundleId'] = master[0]['skuBundleId']
1273
        else:
1274
            val['brand'] = ""
1275
            val['source_product_name'] = ""
1276
            val['skuBundleId'] = ""
1277
        data.append(val)
1278
    return data
1279
 
14553 kshitij.so 1280
def addFeaturedDeal(data, multi):
17367 kshitij.so 1281
    collection = get_mongo_connection().Catalog.FeaturedDeals
1282
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1283
    master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':data['skuBundleId']})
1284
    if master is None:
1285
        return {0:"BundleId is wrong"}
17469 kshitij.so 1286
    otherInfoObj = data['otherInfo']
1287
    toPop = []
1288
    for x,y in otherInfoObj.iteritems():
1289
        if y==0:
1290
            toPop.append(x)
1291
 
1292
    for popItem in toPop:
1293
        otherInfoObj.pop(popItem)
1294
    if len(otherInfoObj.keys())==0:
1295
        return {0:"No rank info to add"}
1296
 
1297
    for x,y in otherInfoObj.iteritems():
1298
        exist = get_mongo_connection().Catalog.FeaturedDeals.find({'otherInfo.'+x:y})
1299
        if exist.count() >0:
1300
            return {0:"Rank already assigned bundleId %s"%(exist[0]['skuBundleId'])}
17367 kshitij.so 1301
    if cursor.count() > 0:
1302
        return {0:"SkuBundleId information already present."}
14495 kshitij.so 1303
    else:
17367 kshitij.so 1304
        collection.insert(data)
14495 kshitij.so 1305
        return {1:"Data added successfully"}
1306
 
14499 kshitij.so 1307
def searchCollection(class_name, sku, skuBundleId):
14497 kshitij.so 1308
    data = []
1309
    collection = get_mongo_connection().Catalog[class_name]
15076 kshitij.so 1310
    if class_name == "Notifications":
1311
        cursor = collection.find({'skuBundleId':skuBundleId})
1312
        for val in cursor:
1313
            master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
1314
            if len(master) > 0:
1315
                val['brand'] = master[0]['brand']
1316
                val['model_name'] = master[0]['model_name']
1317
                val['skuBundleId'] = master[0]['skuBundleId']
1318
            else:
1319
                val['brand'] = ""
1320
                val['model_name'] = ""
1321
                val['skuBundleId'] = val['skuBundleId']
1322
            data.append(val)
15095 kshitij.so 1323
        return data
15853 kshitij.so 1324
    master = None
14499 kshitij.so 1325
    if sku is not None:
15853 kshitij.so 1326
        if COLLECTION_MAP.has_key(class_name):
1327
            master = get_mongo_connection().Catalog.MasterData.find_one({'_id':sku})
1328
            cursor = collection.find({'skuBundleId':master['skuBundleId']})
1329
        else:
1330
            cursor = collection.find({'sku':sku})
14499 kshitij.so 1331
        for val in cursor:
15853 kshitij.so 1332
            if master is None:
1333
                master = get_mongo_connection().Catalog.MasterData.find_one({'_id':val['sku']})
1334
            if master is not None:
1335
                val['brand'] = master['brand']
1336
                val['source_product_name'] = master['source_product_name']
1337
                val['skuBundleId'] = master['skuBundleId']
14499 kshitij.so 1338
            else:
1339
                val['brand'] = ""
1340
                val['source_product_name'] = ""
1341
                val['skuBundleId'] = ""
1342
            data.append(val)
1343
        return data
1344
    else:
15853 kshitij.so 1345
        if not COLLECTION_MAP.has_key(class_name):
1346
            skuIds = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId}).distinct('_id')
1347
            for sku in skuIds:
1348
                cursor = collection.find({'sku':sku})
1349
                for val in cursor:
1350
                    master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1351
                    if len(master) > 0:
1352
                        val['brand'] = master[0]['brand']
1353
                        val['source_product_name'] = master[0]['source_product_name']
1354
                        val['skuBundleId'] = master[0]['skuBundleId']
1355
                    else:
1356
                        val['brand'] = ""
1357
                        val['source_product_name'] = ""
1358
                        val['skuBundleId'] = ""
1359
                    data.append(val)
1360
            return data
1361
        else:
1362
            cursor = collection.find({'skuBundleId':skuBundleId})
14499 kshitij.so 1363
            for val in cursor:
15853 kshitij.so 1364
                master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14499 kshitij.so 1365
                if len(master) > 0:
1366
                    val['brand'] = master[0]['brand']
1367
                    val['source_product_name'] = master[0]['source_product_name']
1368
                else:
1369
                    val['brand'] = ""
1370
                    val['source_product_name'] = ""
1371
                data.append(val)
15853 kshitij.so 1372
            return data
14495 kshitij.so 1373
 
15074 kshitij.so 1374
def __getBrandIdForBrand(brandName, category_id):
1375
    brandInfo = Brands.query.filter(Brands.category_id==category_id).filter(Brands.name == brandName).all()
1376
    if brandInfo is None or len(brandInfo)!=1:
1377
        raise
1378
    else:
1379
        return brandInfo[0].id
1380
 
14588 kshitij.so 1381
def addNewItem(data):
14594 kshitij.so 1382
    try:
1383
        data['updatedOn'] = to_java_date(datetime.now())
1384
        data['addedOn'] = to_java_date(datetime.now())
1385
        data['priceUpdatedOn'] = to_java_date(datetime.now())
1386
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
1387
        max_bundle = list(get_mongo_connection().Catalog.MasterData.find().sort([('skuBundleId',pymongo.DESCENDING)]).limit(1))
1388
        data['_id'] = max_id[0]['_id'] + 1
1389
        data['skuBundleId'] = max_bundle[0]['skuBundleId'] + 1
1390
        data['identifier'] = str(data['identifier'])
1391
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1392
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1393
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 1394
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
1395
            raise
14594 kshitij.so 1396
        get_mongo_connection().Catalog.MasterData.insert(data)
1397
        return {1:'Data added successfully'}
1398
    except Exception as e:
1399
        print e
1400
        return {0:'Unable to add data.'}
15130 kshitij.so 1401
    finally:
1402
        session.close()
14588 kshitij.so 1403
 
1404
def addItemToExistingBundle(data):
1405
    try:
1406
        data['updatedOn'] = to_java_date(datetime.now())
1407
        data['addedOn'] = to_java_date(datetime.now())
1408
        data['priceUpdatedOn'] = to_java_date(datetime.now())
14593 kshitij.so 1409
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
14590 kshitij.so 1410
        data['_id'] = max_id[0]['_id'] + 1
14594 kshitij.so 1411
        data['identifier'] = str(data['identifier'])
1412
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1413
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1414
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 1415
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
1416
            raise
14588 kshitij.so 1417
        get_mongo_connection().Catalog.MasterData.insert(data)
1418
        return {1:'Data added successfully.'}
14594 kshitij.so 1419
    except Exception as e:
1420
        print e
14588 kshitij.so 1421
        return {0:'Unable to add data.'}
15130 kshitij.so 1422
    finally:
1423
        session.close()
14588 kshitij.so 1424
 
1425
def updateMaster(data, multi):
15130 kshitij.so 1426
    try:
1427
        print data
1428
        if multi != 1:
1429
            _id = data.pop('_id')
1430
            skuBundleId = data.pop('skuBundleId')
1431
            data['updatedOn'] = to_java_date(datetime.now())
1432
            data['identifier'] = str(data['identifier'])
1433
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1434
            data['model_name'] = str(data['model_name'])
15130 kshitij.so 1435
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 1436
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
1437
                raise
15130 kshitij.so 1438
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1439
            return {1:'Data updated successfully.'}
1440
        else:
1441
            _id = data.pop('_id')
1442
            skuBundleId = data.pop('skuBundleId')
1443
            data['updatedOn'] = to_java_date(datetime.now())
1444
            data['identifier'] = str(data['identifier'])
1445
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
1446
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17115 manish.sha 1447
            data['model_name'] = str(data['model_name'])
17603 kshitij.so 1448
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
1449
                raise
15130 kshitij.so 1450
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1451
            similarItems = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId})
1452
            for item in similarItems:
1453
                if item['_id'] == _id:
1454
                    continue
1455
                item['updatedOn'] = to_java_date(datetime.now())
1456
                item['thumbnail'] = data['thumbnail']
1457
                item['category'] = data['category']
1458
                item['category_id'] = data['category_id']
1459
                item['tagline'] = data['tagline']
1460
                item['is_shortage'] = data['is_shortage']
1461
                item['mrp'] = data['mrp']
1462
                item['status'] = data['status']
1463
                item['maxPrice'] = data['maxPrice']
1464
                item['brand_id'] = data['brand_id']
17603 kshitij.so 1465
                item['subCategoryId'] = data['subCategoryId']
1466
                item['subCategory'] = data['subCategory']
15130 kshitij.so 1467
                similar_item_id = item.pop('_id')
1468
                get_mongo_connection().Catalog.MasterData.update({'_id':similar_item_id},{"$set":item},upsert=False)
1469
            return {1:'Data updated successfully.'}
17603 kshitij.so 1470
    except:
1471
        return {0:'Unable to update data'}
15130 kshitij.so 1472
    finally:
1473
        session.close()
14619 kshitij.so 1474
 
1475
def getLiveCricScore():
1476
    return mc.get('liveScore')
14852 kshitij.so 1477
 
1478
def addBundleToNotification(data):
1479
    try:
15069 kshitij.so 1480
        collection = get_mongo_connection().Catalog.Notifications
14852 kshitij.so 1481
        cursor = collection.find({'skuBundleId':data['skuBundleId']})
1482
        if cursor.count() > 0:
1483
            return {0:"SkuBundleId information already present."}
1484
        else:
1485
            collection.insert(data)
1486
            return {1:'Data updated successfully.'}
1487
    except:
1488
        return {0:'Unable to add data.'}
1489
 
1490
def getAllNotifications(offset, limit):
1491
    data = []
15069 kshitij.so 1492
    collection = get_mongo_connection().Catalog.Notifications
16450 kshitij.so 1493
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
14852 kshitij.so 1494
    for val in cursor:
15072 kshitij.so 1495
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14852 kshitij.so 1496
        if len(master) > 0:
1497
            val['brand'] = master[0]['brand']
15071 kshitij.so 1498
            val['model_name'] = master[0]['model_name']
14852 kshitij.so 1499
            val['skuBundleId'] = master[0]['skuBundleId']
1500
        else:
1501
            val['brand'] = ""
15071 kshitij.so 1502
            val['model_name'] = ""
1503
            val['skuBundleId'] = val['skuBundleId']
14852 kshitij.so 1504
        data.append(val)
1505
    return data
14997 kshitij.so 1506
 
1507
def getBrandsForFilter(category_id):
1508
    if mc.get("brandFilter") is None:
15095 kshitij.so 1509
        print "Populating brand data for category_id %d" %(category_id)
17469 kshitij.so 1510
        tabData, mobData, accData = [], [], []
14997 kshitij.so 1511
        mobileDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1512
                                                                      {"$match":{"category_id":3,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1513
                                                                    },
1514
                                                                 {"$group" : 
1515
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1516
                                                                  }
1517
                                                                ])
14588 kshitij.so 1518
 
14997 kshitij.so 1519
        tabletDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1520
                                                                      {"$match":{"category_id":5,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1521
                                                                    },
1522
                                                                 {"$group" : 
1523
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1524
                                                                  }
1525
                                                                ])
1526
 
17469 kshitij.so 1527
        accessoriesDeals = get_mongo_connection().Catalog.Deals.aggregate([
1528
                                                                      {"$match":{"category_id":6,"showDeal":1,"totalPoints":{"$gt":-100}}
1529
                                                                    },
1530
                                                                 {"$group" : 
1531
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1532
                                                                  }
1533
                                                                ])
1534
 
14997 kshitij.so 1535
        allDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1536
                                                                   {"$match":{"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1537
                                                                    },
1538
                                                                 {"$group" : 
1539
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1540
                                                                  }
1541
                                                                ])
1542
        #print mobileDeals
1543
        #print "==========Mobile data ends=========="
1544
 
1545
        #print tabletDeals
1546
        #print "==========Tablet data ends=========="
1547
 
1548
        #print allDeals
1549
        #print "==========All deal data ends========="
1550
 
1551
        for mobileDeal in mobileDeals['result']:
1552
            if mobileDeal.get('_id').get('brand_id') != 0:
1553
                tempMap = {}
1554
                tempMap['brand'] = mobileDeal.get('_id').get('brand')
1555
                tempMap['brand_id'] = mobileDeal.get('_id').get('brand_id')
1556
                tempMap['count'] = mobileDeal.get('count')
1557
                mobData.append(tempMap)
1558
 
1559
        for tabletDeal in tabletDeals['result']:
1560
            if tabletDeal.get('_id').get('brand_id') != 0:
1561
                tempMap = {}
1562
                tempMap['brand'] = tabletDeal.get('_id').get('brand')
1563
                tempMap['brand_id'] = tabletDeal.get('_id').get('brand_id')
1564
                tempMap['count'] = tabletDeal.get('count')
1565
                tabData.append(tempMap)
1566
 
17469 kshitij.so 1567
        for accessoryDeal in accessoriesDeals['result']:
1568
            if accessoryDeal.get('_id').get('brand_id') != 0:
1569
                tempMap = {}
1570
                tempMap['brand'] = accessoryDeal.get('_id').get('brand')
1571
                tempMap['brand_id'] = accessoryDeal.get('_id').get('brand_id')
1572
                tempMap['count'] = accessoryDeal.get('count')
1573
                accData.append(tempMap)
14997 kshitij.so 1574
 
17469 kshitij.so 1575
 
14997 kshitij.so 1576
        brandMap = {}
1577
        for allDeal in allDeals['result']:
1578
            if allDeal.get('_id').get('brand_id') != 0:
1579
                if brandMap.has_key(allDeal.get('_id').get('brand')):
15002 kshitij.so 1580
                    brand_ids = brandMap.get(allDeal.get('_id').get('brand')).get('brand_ids')
14997 kshitij.so 1581
                    brand_ids.append(allDeal.get('_id').get('brand_id'))
15003 kshitij.so 1582
                    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 1583
                else:
1584
                    temp = []
1585
                    temp.append(allDeal.get('_id').get('brand_id'))
15002 kshitij.so 1586
                    brandMap[allDeal.get('_id').get('brand')] = {'brand_ids':temp,'count':allDeal.get('count')}
14997 kshitij.so 1587
 
17469 kshitij.so 1588
        mc.set("brandFilter",{0:brandMap, 3:mobData, 5:tabData, 6:accData}, 600)  
14997 kshitij.so 1589
 
15062 kshitij.so 1590
    return sorted(mc.get("brandFilter").get(category_id), key = lambda x: (-x['count'], x['brand']))
15375 kshitij.so 1591
 
15459 kshitij.so 1592
def getStaticDeals(offset, limit, category_id, direction):
15375 kshitij.so 1593
    user_specific_deals = mc.get("staticDeals")
1594
    if user_specific_deals is None:
1595
        __populateStaticDeals()
1596
        user_specific_deals = mc.get("staticDeals")
15459 kshitij.so 1597
    rev = False
1598
    if direction is None or direction == -1:
1599
        rev=True
1600
    return sorted((user_specific_deals.get(category_id))[offset:offset+limit],reverse=rev)
15375 kshitij.so 1601
 
1602
def __populateStaticDeals():
1603
    print "Populating memcache for static deals"
1604
    outer_query = []
1605
    outer_query.append({"showDeal":1})
1606
    query = {}
16170 kshitij.so 1607
    query['$gt'] = -100
15375 kshitij.so 1608
    outer_query.append({'totalPoints':query})
1609
    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)]))
1610
    mobile_deals = []
1611
    tablet_deals = []
1612
    for deal in all_deals:
1613
        item = get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']})
1614
        if deal['category_id'] ==3:
1615
            mobile_deals.append(getItemObjForStaticDeals(item[0]))
1616
        elif deal['category_id'] ==5:
1617
            tablet_deals.append(getItemObjForStaticDeals(item[0]))
1618
        else:
1619
            continue
1620
 
1621
    random.shuffle(mobile_deals,random.random)
1622
    random.shuffle(tablet_deals,random.random)
1623
 
1624
    mem_cache_val = {3:mobile_deals, 5:tablet_deals}
1625
    mc.set("staticDeals", mem_cache_val, 3600)
1626
 
1627
def getItemObjForStaticDeals(item):
17469 kshitij.so 1628
    return {'marketPlaceUrl':item.get('marketPlaceUrl'),'available_price':int(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 1629
 
1630
def getItemByMerchantIdentifier(identifier, source_id):
1631
    skuData = None
17035 kshitij.so 1632
    if source_id in (1,2,4,5,6,7):
16300 manas 1633
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
1634
    elif source_id == 3:
1635
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
1636
    if skuData is None:
1637
        return {}
1638
    else:
1639
        return skuData
15375 kshitij.so 1640
 
16364 kshitij.so 1641
def getDealsForNotification(skuBundleIds):
1642
    bundles= [int(skuBundleId) for skuBundleId in skuBundleIds.split(',')]
1643
    print bundles
16406 kshitij.so 1644
    dealsList = []
16364 kshitij.so 1645
    dealsListMap = []
16406 kshitij.so 1646
    for bundleId in bundles:
1647
        outer_query = []
1648
        outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
1649
        outer_query.append({'skuBundleId':bundleId})
1650
        deals = get_mongo_connection().Catalog.Deals.find({"$and":outer_query})
1651
        for deal in deals:
1652
            dealsList.append(deal)
16364 kshitij.so 1653
    sortedMap = {}
1654
    rankMap = {}
1655
    rank = 0
16406 kshitij.so 1656
    for sorted_deal in dealsList:
16364 kshitij.so 1657
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
1658
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1659
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1660
            rank = rank +1
1661
        else:
1662
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1663
                temp_list.append(sorted_deal)
1664
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1665
 
16367 kshitij.so 1666
    for dealList in [rankMap.get(k, []) for k in range(0, len(bundles))]:
16364 kshitij.so 1667
        temp = []
1668
        for d in dealList:
1669
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
1670
            if len(item) ==0:
1671
                continue
1672
            if d['dealType'] == 1 and d['source_id'] ==1:
1673
                item[0]['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(item[0]['identifier'].strip())
1674
            elif d['source_id'] ==3:
1675
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
1676
            else:
1677
                pass 
1678
            try:
1679
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
1680
                if not cashBack or cashBack.get('cash_back_status')!=1:
1681
                    item[0]['cash_back_type'] = 0
1682
                    item[0]['cash_back'] = 0
1683
                else:
1684
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
1685
                    item[0]['cash_back'] = cashBack['cash_back']
1686
            except:
1687
                print "Error in adding cashback to deals"
1688
                item[0]['cash_back_type'] = 0
1689
                item[0]['cash_back'] = 0
1690
            try:
1691
                item[0]['dp'] = d['dp']
1692
                item[0]['showDp'] = d['showDp']
1693
            except:
1694
                item[0]['dp'] = 0.0
1695
                item[0]['showDp'] = 0
1696
            temp.append(item[0])
1697
        if len(temp) > 1:
1698
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
1699
        dealsListMap.append(temp)
1700
    return dealsListMap
1701
 
16373 manas 1702
def getSkuBrandData(sku):
1703
    if sku is None:
1704
        return {}
1705
    else:
1706
        orders = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':sku})
1707
        if orders is None:
1708
            return {}
1709
        return orders
16488 kshitij.so 1710
 
1711
def addDealPoints(data):
1712
    collection = get_mongo_connection().Catalog.DealPoints
1713
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1714
    if cursor.count() > 0:
1715
        return {0:"Sku information already present."}
1716
    else:
1717
        collection.insert(data)
1718
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
1719
        return {1:"Data added successfully"}
1720
 
1721
def getAllBundlesWithDealPoints(offset, limit):
1722
    data = []
1723
    collection = get_mongo_connection().Catalog.DealPoints
1724
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
1725
    for val in cursor:
1726
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val.get('skuBundleId')})
1727
        if master is not None:
1728
            val['brand'] = master['brand']
1729
            val['source_product_name'] = master['product_name']
1730
        else:
1731
            val['brand'] = ""
1732
            val['source_product_name'] = ""
1733
        data.append(val)
1734
    return data
16546 kshitij.so 1735
 
1736
def generateRedirectUrl(retailer_id, app_id):
1737
    try:
16663 manish.sha 1738
        if retailer_id <= 0:
1739
            return {'url':"","message":"Retailer Id not valid"}
16546 kshitij.so 1740
        d_app_offer = app_offers.get_by(id=app_id)
16605 manish.sha 1741
    except:
1742
        traceback.print_exc()
16546 kshitij.so 1743
    finally:
1744
        session.close()
1745
    if d_app_offer is None:
1746
        return {'url':"","message":"App id doesn't exist"}
16364 kshitij.so 1747
 
16915 manish.sha 1748
    final_user_payout = 0
1749
    if d_app_offer.override_payout:
1750
        final_user_payout = d_app_offer.overriden_payout
1751
    else:
1752
        final_user_payout = d_app_offer.user_payout
16546 kshitij.so 1753
 
16915 manish.sha 1754
    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, final_user_payout)
1755
 
16546 kshitij.so 1756
    get_mongo_connection().AppOrder.AppTransaction.insert(appTransactions.__dict__)
1757
    embedd = str((appTransactions.__dict__).get('_id'))
16548 kshitij.so 1758
    try:
1759
        index = d_app_offer.link.index(".freeb.co.in")
1760
    except:
16605 manish.sha 1761
        traceback.print_exc()
16548 kshitij.so 1762
        return {'url':"","message":"Substring not found"}
1763
    redirect_url = d_app_offer.link[0:index]+"."+embedd+d_app_offer.link[index:]
16546 kshitij.so 1764
    get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(embedd)},{"$set":{'redirect_url':redirect_url}})
16548 kshitij.so 1765
    return {'url':redirect_url,"message":"Success"}
16556 kshitij.so 1766
 
1767
def addPayout(payout, transaction_id):
1768
    try:
16764 manish.sha 1769
        print 'Got Response for Transaction Id:- '+ str(transaction_id)+ ' and Actual Payout:- '+str(payout)
16556 kshitij.so 1770
        transaction = list(get_mongo_connection().AppOrder.AppTransaction.find({'_id':ObjectId(transaction_id)}))
1771
        if len(transaction) > 0:
1772
            if (transaction[0])['payout_status'] ==1:
16753 manish.sha 1773
                get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(transaction_id)},{"$set":{'payout_amount':float(payout), 'payout_description': CB_APPROVED,'payout_status':2, 'cashback_status': 2, 'cash_back_description': CB_APPROVED, 'payout_time':to_java_date(datetime.now())}})
16782 manish.sha 1774
 
1775
                approvedAppTransaction = approved_app_transactions.get_by(transaction_id=transaction_id)
1776
                if approvedAppTransaction is None:
1777
                    approvedAppTransaction = approved_app_transactions()
16919 manish.sha 1778
                    approvedAppTransaction.app_id = transaction[0].get('app_id')
16782 manish.sha 1779
                    approvedAppTransaction.cash_back_description = CB_APPROVED
16919 manish.sha 1780
                    approvedAppTransaction.retailer_id = transaction[0].get('retailer_id')
16782 manish.sha 1781
                    approvedAppTransaction.transaction_id = transaction_id
16919 manish.sha 1782
                    approvedAppTransaction.transaction_time = to_py_date(long(transaction[0].get('transaction_time')))
1783
                    approvedAppTransaction.redirect_url = transaction[0].get('redirect_url')
16782 manish.sha 1784
                    approvedAppTransaction.payout_status = 2
1785
                    approvedAppTransaction.payout_description = CB_APPROVED
1786
                    approvedAppTransaction.cashback_status = 2 
1787
                    approvedAppTransaction.payout_amount = long(payout)
1788
                    approvedAppTransaction.payout_time = datetime.now()
16919 manish.sha 1789
                    approvedAppTransaction.offer_price = long(transaction[0].get('offer_price')) 
1790
                    approvedAppTransaction.overridenCashBack = transaction[0].get('overridenCashBack')
1791
                    approvedAppTransaction.isCashBackOverriden = transaction[0].get('isCashBackOverriden')
1792
                    approvedAppTransaction.user_payout = transaction[0].get('user_payout')
16782 manish.sha 1793
                    approvedAppTransaction.cashBackConsidered = False
16915 manish.sha 1794
                    if transaction[0].get('final_user_payout') is not None:
1795
                        approvedAppTransaction.final_user_payout = transaction[0].get('final_user_payout')
1796
                    else:
16919 manish.sha 1797
                        if transaction[0].get('isCashBackOverriden'):
1798
                            approvedAppTransaction.final_user_payout = transaction[0].get('overridenCashBack')
16915 manish.sha 1799
                        else:
16919 manish.sha 1800
                            approvedAppTransaction.final_user_payout = transaction[0].get('user_payout')
16782 manish.sha 1801
                    session.commit()
1802
 
1803
                    updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
16631 manish.sha 1804
                else:
16783 manish.sha 1805
                    approvedAppTransaction.payout_amount = long(payout)
1806
                    approvedAppTransaction.payout_time = datetime.now()
1807
                    if approvedAppTransaction.cashBackConsidered == False:
1808
                        updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
1809
                    session.commit()
16782 manish.sha 1810
 
1811
                    '''
1812
                    try:
1813
                        if int(transaction[0]['offer_price']) != payout or int(transaction[0]['user_payout']) < payout:
1814
                            _sendAlertForAppPayouts(int(transaction[0]['app_id']), int(transaction[0]['offer_price']), int(transaction[0]['user_payout']), payout)
1815
                    except:
1816
                        print traceback.print_exc()
1817
                    '''
16556 kshitij.so 1818
                return {'status':'ok','message':'Payout updated'}
1819
            elif (transaction[0])['payout_status'] ==2:
1820
                return {'status':'ok','message':'Payout already processed'}
1821
            else:
1822
                return {'status':'fail','message':'Something is wrong'}
1823
        else:
1824
            return {'status':'fail','message':'transaction_id not found'}
1825
    except:
16657 manish.sha 1826
        print traceback.print_exc()
16631 manish.sha 1827
        try:
16753 manish.sha 1828
            get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(transaction_id)},{"$set":{'payout_amount':None, 'payout_description': CB_INIT,'payout_status':1, 'cashback_status': 1, 'cash_back_description': CB_INIT, 'payout_time':None}})
16631 manish.sha 1829
        except:
1830
            print 'Data Inconsistency in Cashback Process'
16636 manish.sha 1831
            print traceback.print_exc()
16559 kshitij.so 1832
        return  {'status':'fail','message':'Something is wrong'}
16885 kshitij.so 1833
    finally:
1834
        session.close()
16556 kshitij.so 1835
 
16631 manish.sha 1836
def _updateApprovedCashbackToUser(approvedAppTransactionId):
1837
    approvedAppTransaction = approved_app_transactions.get_by(id=approvedAppTransactionId)
16915 manish.sha 1838
    if approvedAppTransaction.retailer_id < 0:
1839
        return False
1840
 
16631 manish.sha 1841
    currentMonth = datetime.today().month
1842
    currentDay = datetime.today().day
1843
    currentYear = datetime.today().year
1844
    fortNight = (currentMonth - 1)*2 + (currentDay/15)
1845
    if currentDay == 30 or currentDay ==31:
1846
        fortNight = fortNight-1
1847
    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()
1848
    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()
1849
    try:
1850
        if userAppCashbackObj is None:
1851
            userAppCashbackObj = user_app_cashbacks()
1852
            userAppCashbackObj.user_id = approvedAppTransaction.retailer_id
1853
            userAppCashbackObj.status = 'Approved'
16915 manish.sha 1854
            userAppCashbackObj.amount = approvedAppTransaction.final_user_payout
16631 manish.sha 1855
            userAppCashbackObj.fortnightOfYear = fortNight
1856
            userAppCashbackObj.yearVal = currentYear
1857
        else:
16915 manish.sha 1858
            userAppCashbackObj.amount = userAppCashbackObj.amount + approvedAppTransaction.final_user_payout
16631 manish.sha 1859
 
1860
        if userAppInstallObj is None:
1861
            app_offer = app_offers.get_by(id=approvedAppTransaction.app_id)
1862
            userAppInstallObj = user_app_installs()
1863
            userAppInstallObj.user_id = approvedAppTransaction.retailer_id
1864
            userAppInstallObj.fortnightOfYear = fortNight
1865
            userAppInstallObj.transaction_date = datetime(currentYear, currentMonth, currentDay, 0, 0, 0, 0).date()
1866
            userAppInstallObj.app_id = approvedAppTransaction.app_id
1867
            userAppInstallObj.app_name = app_offer.app_name
1868
            userAppInstallObj.installCount = 1
16915 manish.sha 1869
            userAppInstallObj.payoutAmount = approvedAppTransaction.final_user_payout
16631 manish.sha 1870
        else:
1871
            userAppInstallObj.installCount = userAppInstallObj.installCount + 1
16915 manish.sha 1872
            userAppInstallObj.payoutAmount = userAppInstallObj.payoutAmount +approvedAppTransaction.final_user_payout
16631 manish.sha 1873
 
1874
        approvedAppTransaction.cashBackConsidered = True
1875
        session.commit()
1876
        return True
1877
    except:
1878
        session.rollback()
16636 manish.sha 1879
        print traceback.print_exc()
16631 manish.sha 1880
        return False
16693 manish.sha 1881
 
1882
def _sendAlertForAppPayouts(app_id, offerPrice, userPayout, payout):
1883
    m = Email('localhost')
1884
    mFrom = "dtr@shop2020.in"
1885
    m.setFrom(mFrom)
1886
    mTo = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com','chaitnaya.vats@saholic.com','manoj.kumar@saholic.com','manish.sharma@shop2020.in']
1887
    for receipient in mTo:
1888
        m.addRecipient(receipient)
1889
    appOffer = app_offers.get_by(id=app_id)
1890
    if offerPrice != payout:
1891
        m.setSubject("Mismatch in Offer Price and Actual Pay Out for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1892
        message1 = "Offer Price:- "+ str(appOffer.offer_price) + "\n" + "Actual Pay Out:- "+ str(payout)
1893
        m.setTextBody(message1)
1894
    if userPayout > payout:
1895
        m.setSubject("User Pay Out greater than actual PayOut for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1896
        message2 = "User Pay Out Price:- "+ str(appOffer.user_payout) + "\n" + "Actual Pay Out:- "+ str(payout)
1897
        m.setTextBody(message2)
1898
    m.send()
16631 manish.sha 1899
 
16789 amit.gupta 1900
def rejectCashback(orderId, subOrderId):
16833 amit.gupta 1901
    cashBack = get_mongo_connection().Dtr.merchantOrder.update({"orderId":orderId, "subOrders.merchantSubOrderId":subOrderId}, 
16789 amit.gupta 1902
                                                               {"$set":{"subOrders.$.cashBackStatus":CB_REJECTED}})
16837 amit.gupta 1903
    print cashBack
16836 amit.gupta 1904
    return cashBack.get("nModified")
16894 manish.sha 1905
 
1906
def getAppOffers(retailer_id):
1907
    if not bool(mc.get("cached_app_offers_"+str(retailer_id))):
1908
        populateAppOffers(retailer_id)
1909
    return mc.get("cached_app_offers_"+str(retailer_id)) 
1910
 
1911
def populateAppOffers(retailerId):
1912
    retailerId = int(retailerId)
1913
    #offset = req.get_param_as_int("offset")
1914
    #limit = req.get_param_as_int("limit")
16941 manish.sha 1915
    nonPriortizedOffers = session.query(app_offers.id).join((appmasters,appmasters.id==app_offers.appmaster_id)).filter(app_offers.affiliate_id==retailerId).filter(appmasters.showApp==True).filter(app_offers.show==True).filter(app_offers.offer_active==True).filter(app_offers.offer_price>0).filter(appmasters.rank==0).order_by(desc('user_payout')).all()
1916
    priortizeders = session.query(app_offers.id, appmasters.rank).join((appmasters,appmasters.id==app_offers.appmaster_id)).filter(app_offers.affiliate_id==retailerId).filter(appmasters.showApp==True).filter(app_offers.show==True).filter(app_offers.offer_active==True).filter(app_offers.offer_price>0).filter(appmasters.rank>0).order_by(asc(appmasters.rank)).all()
16894 manish.sha 1917
    #session.query(app_offers.id,app_offers.appmaster_id, app_offers.app_name, app_offers.affiliate_offer_id, app_offers.image_url, app_offers.downloads, app_offers.link, app_offers.offer_price, app_offers.offerCategory, app_offers.package_name, app_offers.promoImage, app_offers.ratings, case([(app_offers.override_payout == True, app_offers.overriden_payout)], else_=app_offers.user_payout).label('user_payout'), case([(appmasters.shortDescription != None, appmasters.shortDescription)], else_=None).label('shortDescription'), case([(appmasters.longDescription != None, appmasters.longDescription)], else_=None).label('longDescription'), appmasters.customerOneLiner, appmasters.retailerOneLiner,app_offers.priority, app_offers.offerCondition, app_offers.location).join((appmasters,appmasters.id==app_offers.appmaster_id)).filter(app_offers.affiliate_id==retailerId).filter(appmasters.showApp==True).filter(app_offers.show==True).filter(app_offers.offer_active==True).filter(app_offers.offer_price>0).order_by(case([(app_offers.priority.in_(tuple(nullCheckList)), 1)], else_=0), asc(app_offers.priority),desc('user_payout')).all()
1918
 
1919
    appOffersMap = {}
1920
    priorityList = []
1921
    priorityMap = {}
1922
    for offer in priortizeders:
16941 manish.sha 1923
        if priorityMap.has_key(long(offer[1])):
1924
            offersVal = priorityMap.get(long(offer[1]))
1925
            offersVal.append(offer)
1926
            priorityMap[long(offer[1])]=offersVal
1927
        else:
1928
            offersVal = []
1929
            offersVal.append(offer)
1930
            priorityMap[long(offer[1])]=offersVal
1931
 
16894 manish.sha 1932
    priorityList = sorted(priorityMap)
1933
 
1934
    maxCount = len(nonPriortizedOffers) + len(priortizeders)
1935
 
16909 manish.sha 1936
    if priorityList is not None and len(priorityList)>0:
1937
        if maxCount < max(priorityList):
1938
            maxCount = max(priorityList)
16894 manish.sha 1939
 
1940
    count = 1
1941
    blockedPlaces = []
1942
    availablePlaces = []
1943
    while count <= maxCount:
1944
        if count in priorityList:
1945
            blockedPlaces.append(count)
1946
        else:
1947
            availablePlaces.append(count)
1948
        count = count +1
16941 manish.sha 1949
    print 'Blocked Places', blockedPlaces
16894 manish.sha 1950
    for val in blockedPlaces:
16941 manish.sha 1951
        key = val
1952
        for offerObj in priorityMap.get(val):
1953
            while appOffersMap.has_key(key):
1954
                key = key+1
1955
            appOffersMap[key] = long(offerObj[0])
1956
            if key in availablePlaces:
1957
                availablePlaces.remove(key)
1958
 
1959
    print 'Available Places', availablePlaces
1960
 
16894 manish.sha 1961
    i=0
1962
    for val in availablePlaces:
16899 manish.sha 1963
        if i<len(nonPriortizedOffers):
16902 manish.sha 1964
            appOffersMap[val]= long(nonPriortizedOffers[i][0])
16899 manish.sha 1965
        else:
1966
            break
1967
        i=i+1
16901 manish.sha 1968
    print 'AppOffersMap', appOffersMap
16894 manish.sha 1969
 
1970
    finalAppOffersMap = {}
1971
    if len(appOffersMap) > 0:
1972
        for key in sorted(appOffersMap):               
1973
            finalAppOffersMap[key] = appOffersMap[key]
1974
 
1975
        mc.set("cached_app_offers_"+str(retailerId), finalAppOffersMap, 120)
1976
    else:
1977
        print 'No Offers'
1978
        mc.set("cached_app_offers_"+str(retailerId), {}, 10)              
17280 manish.sha 1979
 
1980
def sendNotification(userIds, campaignName, title, message,notificationtype, url, expiresat='2999-01-01'):
1981
    campaignId = addNotificationCampaign(campaignName, title, message, notificationtype, url, None)
1982
    payload = {}
1983
    payload["user_id"]= userIds[0]
1984
    payload["type"]="pending"
1985
    payload["notification_campaign_id"]= campaignId
1986
    payload["status"]=0
16546 kshitij.so 1987
 
17280 manish.sha 1988
    payloadList = []
1989
    payloadList.append(payload)
17281 manish.sha 1990
    jsonObj = json.dumps([dict(pn) for pn in payloadList])
1991
    print jsonObj
1992
    pushpostrequest = urllib2.Request("http://45.33.50.227:3001/addPushNotification")
1993
    pushpostrequest.add_header('Content-Type', 'application/json')
1994
    response = urllib2.urlopen(pushpostrequest, jsonObj).read()
17280 manish.sha 1995
    print response
1996
 
1997
def addNotificationCampaign(name, title, message, type, url, sql):
1998
    notificationCampaign = notification_campaigns()
1999
    notificationCampaign.name = name
2000
    notificationCampaign.title = title
2001
    notificationCampaign.type = type
2002
    notificationCampaign.message = message
2003
    notificationCampaign.url = url
2004
    notificationCampaign.sql = sql
2005
    notificationCampaign.expiresat = datetime(2999, 1, 1)
2006
    notificationCampaign.status = 'active'
2007
    notificationCampaign.created = datetime.now()
2008
 
2009
    session.commit()
2010
    campaignId = notificationCampaign.id
2011
 
2012
    session.close()
2013
    return campaignId
17302 kshitij.so 2014
 
2015
def getDummyDeals(categoryId, offset, limit):
2016
    outer_query = []
2017
    outer_query.append({"showDeal":1})
2018
    outer_query.append({"category_id":categoryId})
2019
    query = {}
2020
    query['$gt'] = -100
2021
    outer_query.append({'totalPoints':query})
2022
    all_deals = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query},{'_id':1}).sort([('totalPoints',pymongo.DESCENDING),('bestSellerPoints',pymongo.DESCENDING),('nlcPoints',pymongo.DESCENDING),('rank',pymongo.DESCENDING)]).skip(offset).limit(limit))
2023
    returnObj = []
2024
    for deal in all_deals:
17306 kshitij.so 2025
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
17305 kshitij.so 2026
        returnObj.append(getItemObjForStaticDeals(item[0]))
17302 kshitij.so 2027
    return returnObj
17367 kshitij.so 2028
 
17469 kshitij.so 2029
def searchDummyDeals(search_term , limit, offset):
17367 kshitij.so 2030
    data = []
2031
    uniqueMap = {}
2032
    if search_term is not None:
2033
        terms = search_term.split(' ')
2034
        outer_query = []
2035
        for term in terms:
2036
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
2037
        try:
2038
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}})
2039
            for record in collection:
2040
                data.append(record)
2041
        except:
2042
            pass
2043
    else:
2044
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}})
2045
        for record in collection:
2046
            data.append(record)
2047
    for x in data:
2048
        if not uniqueMap.has_key(x['skuBundleId']):
17469 kshitij.so 2049
            uniqueMap[x['skuBundleId']] = {'source_product_name':x['source_product_name'],'skuBundleId':x['skuBundleId'],'thumbnail':x['thumbnail']}
17367 kshitij.so 2050
 
17469 kshitij.so 2051
    if (offset + limit) > len(uniqueMap.values()):
2052
        limit = len(uniqueMap.values()) - offset - 1
2053
 
2054
    count = 0
2055
#     for x in uniqueMap.values():
2056
#         print count,
2057
#         print '\t',
2058
#         print x
2059
#         count = count+1
17555 kshitij.so 2060
 
17469 kshitij.so 2061
    print offset
2062
    print limit
2063
 
2064
    return uniqueMap.values()[offset:limit+offset]
17367 kshitij.so 2065
 
17469 kshitij.so 2066
 
2067
def getDummyPricing(skuBundleId):
2068
    collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()},'skuBundleId':skuBundleId,'in_stock':1})
2069
    print collection.count()
2070
    cheapest = 99999999
2071
    cheapestDetails= None
2072
    returnMap = {}
2073
 
2074
    for d in collection:
2075
        if d['available_price'] < cheapest:
2076
            cheapestDetails = d
2077
            cheapest = int(d['available_price'])
2078
        if returnMap.has_key(d['source_id']):
2079
            d = getItemObjForStaticDeals(d)
2080
            d['toShowStore'] = 0
2081
            returnMap[d['source_id']].append(d)
2082
        else:
2083
            temp = []
2084
            d = getItemObjForStaticDeals(d)
2085
            d['toShowStore'] = 1
2086
            temp.append(d)
2087
            returnMap[d['source_id']] = temp
2088
    returnMap['cheapest'] = cheapestDetails
2089
    for y in returnMap.itervalues():
2090
        if isinstance(y, (list, tuple)):
2091
            (y[len(y)-1])['lastElement'] = 1
2092
        else:
2093
            pass
2094
    if returnMap['cheapest'] ==None:
2095
        dum = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':skuBundleId,'source_id':{"$in":SOURCE_MAP.keys()}})
2096
        returnMap['cheapest'] = {'thumbnail':dum['thumbnail'],'source_product_name':dum['source_product_name']}
2097
    return returnMap
17555 kshitij.so 2098
 
17603 kshitij.so 2099
 
17555 kshitij.so 2100
def addDealObject(data):
17570 kshitij.so 2101
    if data.get('img_url') is None or data.get('img_url')=="" or data.get('name') is None or data.get('name')=="":
2102
        return {0:'Invalid data'}   
17555 kshitij.so 2103
    try:
2104
        max_id = list(get_mongo_connection().Catalog.DealObject.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
2105
        if len(max_id) ==0:
2106
            max_id = 0
17559 kshitij.so 2107
        else:
2108
            max_id = max_id[0]['_id']
2109
        data['_id'] = max_id +1
17555 kshitij.so 2110
        get_mongo_connection().Catalog.DealObject.insert(data)
2111
        return {1:'Data added successfully'}
2112
    except:
2113
        return {0:'Error in adding data'}
2114
 
17561 kshitij.so 2115
def getAllDealObjects(offset, limit):
2116
    data = []
2117
    collection = get_mongo_connection().Catalog.DealObject
2118
    cursor = collection.find({}).skip(offset).limit(limit)
2119
    for val in cursor:
17564 kshitij.so 2120
        data.append({'_id':val['_id'],'name':val['name']})
17561 kshitij.so 2121
    return data
17564 kshitij.so 2122
 
2123
def deleteDealObject(id):
2124
    try:
2125
        get_mongo_connection().Catalog.DealObject.remove({'_id':id})
2126
        return {1:"Deal Object deleted"}
2127
    except:
2128
        return {0:"Error in deleting object"}
17566 kshitij.so 2129
 
2130
def getDealObjectById(id):
2131
    try:
2132
        data = get_mongo_connection().Catalog.DealObject.find({'_id':id})
2133
        return data
2134
    except:
17570 kshitij.so 2135
        return {}
17561 kshitij.so 2136
 
17570 kshitij.so 2137
def updateDealObject(data):
2138
    try:
2139
        _id = data['_id']
2140
        data.pop('_id')
2141
        get_mongo_connection().Catalog.DealObject.update({'_id':_id},{"$set":data},upsert=False)
2142
        return {1:"Data updated successfully"}
2143
    except:
2144
        return {0:"Error in updating data"}
2145
 
13572 kshitij.so 2146
def main():
17555 kshitij.so 2147
    data = {'hello':"ya"}
2148
    addDealObject(data)
17469 kshitij.so 2149
 
2150
 
2151
 
13572 kshitij.so 2152
if __name__=='__main__':
13932 amit.gupta 2153
    main()
17469 kshitij.so 2154