Subversion Repositories SmartDukaan

Rev

Rev 17606 | Rev 17608 | 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, \
17604 kshitij.so 12
    to_py_date, CB_REJECTED, SUB_CATEGORY_MAP
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'])
17607 kshitij.so 907
        skuData['subCategoryId'] = int(skuData['subCategoryId'])
16222 kshitij.so 908
        skuData['status'] = int(skuData['status'])
16483 kshitij.so 909
        try:
910
            skuData['thumbnail'] = skuData['thumbnail'].strip()
911
        except:
912
            pass 
16222 kshitij.so 913
        if showDp is not None:
914
            dealerPrice = get_mongo_connection().Catalog.SkuDealerPrices.find_one({'skuBundleId':skuData['skuBundleId']})
915
            skuData['dp'] = 0.0
916
            skuData['showDp'] = 0
917
            if dealerPrice is not None:
918
                skuData['dp'] = dealerPrice['dp']
919
                skuData['showDp'] = dealerPrice['showDp']
16224 kshitij.so 920
        temp.append(skuData)
921
        return temp
13795 kshitij.so 922
    except:
16224 kshitij.so 923
        return []
13836 kshitij.so 924
 
14761 kshitij.so 925
def getCashBack(skuId, source_id, category_id):
17469 kshitij.so 926
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14761 kshitij.so 927
        populateCashBack()
928
    itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 929
    itemCashBack = itemCashBackMap.get(skuId)
930
    if itemCashBack is not None:
931
        return itemCashBack
14761 kshitij.so 932
    cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 933
    sourceCashBack = cashBackMap.get(source_id)
934
    if sourceCashBack is not None and len(sourceCashBack) > 0:
935
        for cashBack in sourceCashBack:
936
            if cashBack.get(category_id) is None:
937
                continue
938
            else:
939
                return cashBack.get(category_id)
940
    else:
941
        return {}
16560 amit.gupta 942
 
943
def getBundleBySourceSku(source_id, identifier):
17035 kshitij.so 944
    if source_id in (1,2,4,5,6,7):
16560 amit.gupta 945
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
946
    elif source_id == 3:
947
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
948
    else:
949
        return {}
950
 
951
    if not skuData:
952
        return {}
953
    else:
16564 amit.gupta 954
        bundleId = skuData[0]["skuBundleId"]
17035 kshitij.so 955
        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 956
                       {"source_id":1, "available_price":1, "marketPlaceUrl":1, "gross_price":1, "codAvailable":1, "source_product_name":1, "offer":1, "coupon":1}))
16579 amit.gupta 957
        return {'products':itemIds}
16560 amit.gupta 958
 
959
 
13921 kshitij.so 960
 
15129 kshitij.so 961
def getDealRank(identifier, source_id, userId):
17035 kshitij.so 962
    if source_id in (1,2,4,5,6,7):
15129 kshitij.so 963
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
964
    elif source_id == 3:
965
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
966
    else:
16282 amit.gupta 967
        return {'rank':0, 'description':'Source not valid','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15349 kshitij.so 968
    if len(skuData) == 0:
16282 amit.gupta 969
        return {'rank':0, 'description':'No matching product identifier found','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15129 kshitij.so 970
    user_specific_deals = mc.get(str(userId))
971
    if user_specific_deals is None:
972
        __populateCache(userId)
973
        user_specific_deals = mc.get(str(userId))
974
    else:
975
        print "Getting user deals from cache"
976
    category_id = skuData[0]['category_id']
977
    category_specific_deals = user_specific_deals.get(category_id)
16280 kshitij.so 978
 
979
    dealsData = get_mongo_connection().Catalog.Deals.find_one({'skuBundleId':skuData[0]['skuBundleId']})
980
    if dealsData is None:
981
        dealsData = {}
982
 
15129 kshitij.so 983
    if category_specific_deals is None or len(category_specific_deals) ==0:
16280 kshitij.so 984
        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 985
    sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
16168 kshitij.so 986
    sortedMap = {}
987
    rankMap = {}
988
    rank = 0
15129 kshitij.so 989
    for sorted_deal in sorted_deals:
16168 kshitij.so 990
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
991
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
992
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
993
            rank = rank +1
994
        else:
995
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
996
                temp_list.append(sorted_deal)
997
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
998
 
16187 kshitij.so 999
    for dealRank ,dealList in rankMap.iteritems():
16168 kshitij.so 1000
        for d in dealList:
16186 kshitij.so 1001
            if d['skuBundleId'] == skuData[0]['skuBundleId']:
16280 kshitij.so 1002
                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 1003
 
16280 kshitij.so 1004
    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 1005
 
1006
 
13836 kshitij.so 1007
def getCashBackDetails(identifier, source_id):
17469 kshitij.so 1008
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
13921 kshitij.so 1009
        populateCashBack()
13771 kshitij.so 1010
 
17035 kshitij.so 1011
    if source_id in (1,2,4,5,6,7):
13839 kshitij.so 1012
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1013
    elif source_id == 3:
13839 kshitij.so 1014
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1015
    else:
1016
        return {}
13836 kshitij.so 1017
    if len(skuData) > 0:
14761 kshitij.so 1018
        itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 1019
        itemCashBack = itemCashBackMap.get(skuData[0]['_id'])
1020
        if itemCashBack is not None:
1021
            return itemCashBack
14761 kshitij.so 1022
        cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 1023
        sourceCashBack = cashBackMap.get(source_id)
1024
        if sourceCashBack is not None and len(sourceCashBack) > 0:
1025
            for cashBack in sourceCashBack:
1026
                if cashBack.get(skuData[0]['category_id']) is None:
1027
                    continue
1028
                else:
1029
                    return cashBack.get(skuData[0]['category_id'])
13836 kshitij.so 1030
        else:
1031
            return {} 
1032
    else:
1033
        return {}
13986 amit.gupta 1034
 
14398 amit.gupta 1035
def getImgSrc(identifier, source_id):
1036
    skuData = None
17035 kshitij.so 1037
    if source_id in (1,2,4,5,6,7):
14414 amit.gupta 1038
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1039
    elif source_id == 3:
14414 amit.gupta 1040
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1041
    if skuData is None:
1042
        return {}
1043
    else:
16483 kshitij.so 1044
        try:
1045
            return {'thumbnail':skuData.get('thumbnail').strip()}
1046
        except:
1047
            return {'thumbnail':skuData.get('thumbnail')}
13986 amit.gupta 1048
 
1049
def next_weekday(d, weekday):
1050
    days_ahead = weekday - d.weekday()
1051
    if days_ahead <= 0: # Target day already happened this week
1052
        days_ahead += 7
1053
    return d + timedelta(days_ahead)
1054
 
13771 kshitij.so 1055
 
13970 kshitij.so 1056
def getAllDealerPrices(offset, limit):
1057
    data = []
1058
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1059
    cursor = collection.find().skip(offset).limit(limit)
1060
    for val in cursor:
15853 kshitij.so 1061
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
1062
        if master is not None:
1063
            val['brand'] = master['brand']
1064
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 1065
        else:
1066
            val['brand'] = ""
1067
            val['source_product_name'] = ""
16231 kshitij.so 1068
        val['showDp'] = int(val['showDp'])
13970 kshitij.so 1069
        data.append(val)
1070
    return data
1071
 
15853 kshitij.so 1072
def addSkuDealerPrice(data):
1073
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1074
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
1075
    if cursor is not None:
1076
        return {0:"BundleId information already present."}
13970 kshitij.so 1077
    else:
15853 kshitij.so 1078
        collection.insert(data)
1079
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1080
        return {1:"Data added successfully"}
1081
 
1082
def updateSkuDealerPrice(data, _id):
1083
    try:
1084
        collection = get_mongo_connection().Catalog.SkuDealerPrices
1085
        collection.update({'_id':ObjectId(_id)},{"$set":{'dp':data['dp']}},upsert=False, multi = False)
15853 kshitij.so 1086
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1087
        return {1:"Data updated successfully"}
1088
    except:
1089
        return {0:"Data not updated."}
1090
 
1091
def updateExceptionalNlc(data, _id):
1092
    try:
1093
        collection = get_mongo_connection().Catalog.ExceptionalNlc
1094
        collection.update({'_id':ObjectId(_id)},{"$set":{'maxNlc':data['maxNlc'], 'minNlc':data['minNlc'], 'overrideNlc':data['overrideNlc']}},upsert=False, multi = False)
15853 kshitij.so 1095
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1096
        return {1:"Data updated successfully"}
1097
    except:
1098
        return {0:"Data not updated."}
1099
 
14041 kshitij.so 1100
def resetCache(userId):
14043 kshitij.so 1101
    try:
1102
        mc.delete(userId)
1103
        return {1:'Cache cleared.'}
1104
    except:
1105
        return {0:'Unable to clear cache.'}
1106
 
15853 kshitij.so 1107
def updateCollection(data):
14083 kshitij.so 1108
    print data
15853 kshitij.so 1109
    try:
1110
        collection = get_mongo_connection().Catalog[data['class']]
1111
        class_name = data.pop('class')
1112
        _id = data.pop('oid')
1113
        result = collection.update({'_id':ObjectId(_id)},{"$set":data},upsert=False, multi = False)
1114
        if class_name != "Notifications":
1115
            record = list(collection.find({'_id':ObjectId(_id)}))
1116
            if class_name !="CategoryDiscount":
1117
                if record[0].has_key('sku'):
1118
                    field = '_id'
1119
                    val = record[0]['sku']
14852 kshitij.so 1120
                else:
15853 kshitij.so 1121
                    field = 'skuBundleId'
1122
                    val = record[0]['skuBundleId']
1123
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False, multi = True)
1124
            else:
1125
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1126
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
16233 kshitij.so 1127
        if class_name =='SkuDealerPrices':
16237 kshitij.so 1128
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':val},{"$set":data},upsert=False, multi=True)
15853 kshitij.so 1129
        return {1:"Data updated successfully"}
1130
    except Exception as e:
1131
        print e
1132
        return {0:"Data not updated."}
14575 kshitij.so 1133
 
14076 kshitij.so 1134
 
14553 kshitij.so 1135
def addNegativeDeals(data, multi):
1136
    if multi !=1: 
1137
        collection = get_mongo_connection().Catalog.NegativeDeals
1138
        cursor = collection.find({"sku":data['sku']})
1139
        if cursor.count() > 0:
1140
            return {0:"Sku information already present."}
1141
        else:
1142
            collection.insert(data)
1143
            return {1:"Data added successfully"}
14481 kshitij.so 1144
    else:
14553 kshitij.so 1145
        skuIds = __getBundledSkusfromSku(data['sku'])
1146
        for sku in skuIds:
1147
            data['sku'] = sku.get('_id')
1148
            collection = get_mongo_connection().Catalog.NegativeDeals
1149
            cursor = collection.find({"sku":data['sku']})
1150
            if cursor.count() > 0:
1151
                continue
1152
            else:
14558 kshitij.so 1153
                data.pop('_id',None)
14553 kshitij.so 1154
                collection.insert(data)
14481 kshitij.so 1155
        return {1:"Data added successfully"}
1156
 
1157
def getAllNegativeDeals(offset, limit):
1158
    data = []
1159
    collection = get_mongo_connection().Catalog.NegativeDeals
1160
    cursor = collection.find().skip(offset).limit(limit)
1161
    for val in cursor:
1162
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1163
        if len(master) > 0:
1164
            val['brand'] = master[0]['brand']
1165
            val['source_product_name'] = master[0]['source_product_name']
1166
            val['skuBundleId'] = master[0]['skuBundleId']
1167
        else:
1168
            val['brand'] = ""
1169
            val['source_product_name'] = ""
1170
            val['skuBundleId'] = ""
1171
        data.append(val)
1172
    return data
1173
 
1174
def getAllManualDeals(offset, limit):
1175
    data = []
1176
    collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1177
    cursor = collection.find().skip(offset).limit(limit)
14481 kshitij.so 1178
    for val in cursor:
1179
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1180
        if len(master) > 0:
1181
            val['brand'] = master[0]['brand']
1182
            val['source_product_name'] = master[0]['source_product_name']
1183
            val['skuBundleId'] = master[0]['skuBundleId']
1184
        else:
1185
            val['brand'] = ""
1186
            val['source_product_name'] = ""
1187
            val['skuBundleId'] = ""
1188
        data.append(val)
1189
    return data
14076 kshitij.so 1190
 
14553 kshitij.so 1191
def addManualDeal(data, multi):
1192
    if multi !=1:
1193
        collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1194
        cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1195
        if cursor.count() > 0:
1196
            return {0:"Sku information already present."}
1197
        else:
1198
            collection.insert(data)
1199
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
1200
            return {1:"Data added successfully"}
14481 kshitij.so 1201
    else:
14553 kshitij.so 1202
        skuIds = __getBundledSkusfromSku(data['sku'])
1203
        for sku in skuIds:
1204
            data['sku'] = sku.get('_id')
1205
            collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1206
            cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1207
            if cursor.count() > 0:
1208
                continue
1209
            else:
14558 kshitij.so 1210
                data.pop('_id',None)
14553 kshitij.so 1211
                collection.insert(data)
1212
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14481 kshitij.so 1213
        return {1:"Data added successfully"}
14553 kshitij.so 1214
 
14481 kshitij.so 1215
def deleteDocument(data):
15853 kshitij.so 1216
    print "inside detete document"
14481 kshitij.so 1217
    print data
1218
    try:
1219
        collection = get_mongo_connection().Catalog[data['class']]
1220
        class_name = data.pop('class')
1221
        _id = data.pop('oid')
1222
        record = list(collection.find({'_id':ObjectId(_id)}))
1223
        collection.remove({'_id':ObjectId(_id)})
15075 kshitij.so 1224
        if class_name != "Notifications":
1225
            if class_name !="CategoryDiscount":
15853 kshitij.so 1226
                print record[0]
1227
                if record[0].has_key('sku'):
1228
                    field = '_id'
1229
                    val = record[0]['sku']
1230
                else:
1231
                    field = 'skuBundleId'
1232
                    val = record[0]['skuBundleId']
1233
                print "Updating master"
1234
                print field
1235
                print val
1236
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
15075 kshitij.so 1237
            else:
1238
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1239
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
14481 kshitij.so 1240
        return {1:"Document deleted successfully"}
1241
    except Exception as e:
1242
        print e
1243
        return {0:"Document not deleted."}
13970 kshitij.so 1244
 
14482 kshitij.so 1245
def searchMaster(offset, limit, search_term):
1246
    data = []
14531 kshitij.so 1247
    if search_term is not None:
14551 kshitij.so 1248
        terms = search_term.split(' ')
1249
        outer_query = []
1250
        for term in terms:
1251
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
14531 kshitij.so 1252
        try:
14551 kshitij.so 1253
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14531 kshitij.so 1254
            for record in collection:
1255
                data.append(record)
1256
        except:
1257
            pass
1258
    else:
1259
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14482 kshitij.so 1260
        for record in collection:
1261
            data.append(record)
1262
    return data
14481 kshitij.so 1263
 
14495 kshitij.so 1264
def getAllFeaturedDeals(offset, limit):
1265
    data = []
1266
    collection = get_mongo_connection().Catalog.FeaturedDeals
17561 kshitij.so 1267
    cursor = collection.find({}).skip(offset).limit(limit)
14495 kshitij.so 1268
    for val in cursor:
17367 kshitij.so 1269
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14495 kshitij.so 1270
        if len(master) > 0:
1271
            val['brand'] = master[0]['brand']
1272
            val['source_product_name'] = master[0]['source_product_name']
1273
            val['skuBundleId'] = master[0]['skuBundleId']
1274
        else:
1275
            val['brand'] = ""
1276
            val['source_product_name'] = ""
1277
            val['skuBundleId'] = ""
1278
        data.append(val)
1279
    return data
1280
 
14553 kshitij.so 1281
def addFeaturedDeal(data, multi):
17367 kshitij.so 1282
    collection = get_mongo_connection().Catalog.FeaturedDeals
1283
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1284
    master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':data['skuBundleId']})
1285
    if master is None:
1286
        return {0:"BundleId is wrong"}
17469 kshitij.so 1287
    otherInfoObj = data['otherInfo']
1288
    toPop = []
1289
    for x,y in otherInfoObj.iteritems():
1290
        if y==0:
1291
            toPop.append(x)
1292
 
1293
    for popItem in toPop:
1294
        otherInfoObj.pop(popItem)
1295
    if len(otherInfoObj.keys())==0:
1296
        return {0:"No rank info to add"}
1297
 
1298
    for x,y in otherInfoObj.iteritems():
1299
        exist = get_mongo_connection().Catalog.FeaturedDeals.find({'otherInfo.'+x:y})
1300
        if exist.count() >0:
1301
            return {0:"Rank already assigned bundleId %s"%(exist[0]['skuBundleId'])}
17367 kshitij.so 1302
    if cursor.count() > 0:
1303
        return {0:"SkuBundleId information already present."}
14495 kshitij.so 1304
    else:
17367 kshitij.so 1305
        collection.insert(data)
14495 kshitij.so 1306
        return {1:"Data added successfully"}
1307
 
14499 kshitij.so 1308
def searchCollection(class_name, sku, skuBundleId):
14497 kshitij.so 1309
    data = []
1310
    collection = get_mongo_connection().Catalog[class_name]
15076 kshitij.so 1311
    if class_name == "Notifications":
1312
        cursor = collection.find({'skuBundleId':skuBundleId})
1313
        for val in cursor:
1314
            master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
1315
            if len(master) > 0:
1316
                val['brand'] = master[0]['brand']
1317
                val['model_name'] = master[0]['model_name']
1318
                val['skuBundleId'] = master[0]['skuBundleId']
1319
            else:
1320
                val['brand'] = ""
1321
                val['model_name'] = ""
1322
                val['skuBundleId'] = val['skuBundleId']
1323
            data.append(val)
15095 kshitij.so 1324
        return data
15853 kshitij.so 1325
    master = None
14499 kshitij.so 1326
    if sku is not None:
15853 kshitij.so 1327
        if COLLECTION_MAP.has_key(class_name):
1328
            master = get_mongo_connection().Catalog.MasterData.find_one({'_id':sku})
1329
            cursor = collection.find({'skuBundleId':master['skuBundleId']})
1330
        else:
1331
            cursor = collection.find({'sku':sku})
14499 kshitij.so 1332
        for val in cursor:
15853 kshitij.so 1333
            if master is None:
1334
                master = get_mongo_connection().Catalog.MasterData.find_one({'_id':val['sku']})
1335
            if master is not None:
1336
                val['brand'] = master['brand']
1337
                val['source_product_name'] = master['source_product_name']
1338
                val['skuBundleId'] = master['skuBundleId']
14499 kshitij.so 1339
            else:
1340
                val['brand'] = ""
1341
                val['source_product_name'] = ""
1342
                val['skuBundleId'] = ""
1343
            data.append(val)
1344
        return data
1345
    else:
15853 kshitij.so 1346
        if not COLLECTION_MAP.has_key(class_name):
1347
            skuIds = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId}).distinct('_id')
1348
            for sku in skuIds:
1349
                cursor = collection.find({'sku':sku})
1350
                for val in cursor:
1351
                    master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1352
                    if len(master) > 0:
1353
                        val['brand'] = master[0]['brand']
1354
                        val['source_product_name'] = master[0]['source_product_name']
1355
                        val['skuBundleId'] = master[0]['skuBundleId']
1356
                    else:
1357
                        val['brand'] = ""
1358
                        val['source_product_name'] = ""
1359
                        val['skuBundleId'] = ""
1360
                    data.append(val)
1361
            return data
1362
        else:
1363
            cursor = collection.find({'skuBundleId':skuBundleId})
14499 kshitij.so 1364
            for val in cursor:
15853 kshitij.so 1365
                master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14499 kshitij.so 1366
                if len(master) > 0:
1367
                    val['brand'] = master[0]['brand']
1368
                    val['source_product_name'] = master[0]['source_product_name']
1369
                else:
1370
                    val['brand'] = ""
1371
                    val['source_product_name'] = ""
1372
                data.append(val)
15853 kshitij.so 1373
            return data
14495 kshitij.so 1374
 
15074 kshitij.so 1375
def __getBrandIdForBrand(brandName, category_id):
1376
    brandInfo = Brands.query.filter(Brands.category_id==category_id).filter(Brands.name == brandName).all()
1377
    if brandInfo is None or len(brandInfo)!=1:
1378
        raise
1379
    else:
1380
        return brandInfo[0].id
1381
 
14588 kshitij.so 1382
def addNewItem(data):
14594 kshitij.so 1383
    try:
1384
        data['updatedOn'] = to_java_date(datetime.now())
1385
        data['addedOn'] = to_java_date(datetime.now())
1386
        data['priceUpdatedOn'] = to_java_date(datetime.now())
1387
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
1388
        max_bundle = list(get_mongo_connection().Catalog.MasterData.find().sort([('skuBundleId',pymongo.DESCENDING)]).limit(1))
1389
        data['_id'] = max_id[0]['_id'] + 1
1390
        data['skuBundleId'] = max_bundle[0]['skuBundleId'] + 1
1391
        data['identifier'] = str(data['identifier'])
1392
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1393
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1394
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 1395
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1396
            return {0:'Sub-Category not selected'}
17604 kshitij.so 1397
        data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
14594 kshitij.so 1398
        get_mongo_connection().Catalog.MasterData.insert(data)
1399
        return {1:'Data added successfully'}
1400
    except Exception as e:
1401
        print e
1402
        return {0:'Unable to add data.'}
15130 kshitij.so 1403
    finally:
1404
        session.close()
14588 kshitij.so 1405
 
1406
def addItemToExistingBundle(data):
1407
    try:
1408
        data['updatedOn'] = to_java_date(datetime.now())
1409
        data['addedOn'] = to_java_date(datetime.now())
1410
        data['priceUpdatedOn'] = to_java_date(datetime.now())
14593 kshitij.so 1411
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
14590 kshitij.so 1412
        data['_id'] = max_id[0]['_id'] + 1
14594 kshitij.so 1413
        data['identifier'] = str(data['identifier'])
1414
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1415
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1416
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 1417
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1418
            return {0:'Sub-Category not selected'}
17604 kshitij.so 1419
        data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
14588 kshitij.so 1420
        get_mongo_connection().Catalog.MasterData.insert(data)
1421
        return {1:'Data added successfully.'}
14594 kshitij.so 1422
    except Exception as e:
1423
        print e
14588 kshitij.so 1424
        return {0:'Unable to add data.'}
15130 kshitij.so 1425
    finally:
1426
        session.close()
14588 kshitij.so 1427
 
1428
def updateMaster(data, multi):
15130 kshitij.so 1429
    try:
1430
        print data
1431
        if multi != 1:
1432
            _id = data.pop('_id')
1433
            skuBundleId = data.pop('skuBundleId')
1434
            data['updatedOn'] = to_java_date(datetime.now())
1435
            data['identifier'] = str(data['identifier'])
1436
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1437
            data['model_name'] = str(data['model_name'])
15130 kshitij.so 1438
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 1439
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1440
                return {0:'Sub-Category not selected'}
17604 kshitij.so 1441
            data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
15130 kshitij.so 1442
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1443
            return {1:'Data updated successfully.'}
1444
        else:
1445
            _id = data.pop('_id')
1446
            skuBundleId = data.pop('skuBundleId')
1447
            data['updatedOn'] = to_java_date(datetime.now())
1448
            data['identifier'] = str(data['identifier'])
1449
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
1450
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17115 manish.sha 1451
            data['model_name'] = str(data['model_name'])
17603 kshitij.so 1452
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1453
                return {0:'Sub-Category not selected'}
17604 kshitij.so 1454
            data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
15130 kshitij.so 1455
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1456
            similarItems = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId})
1457
            for item in similarItems:
1458
                if item['_id'] == _id:
1459
                    continue
1460
                item['updatedOn'] = to_java_date(datetime.now())
1461
                item['thumbnail'] = data['thumbnail']
1462
                item['category'] = data['category']
1463
                item['category_id'] = data['category_id']
1464
                item['tagline'] = data['tagline']
1465
                item['is_shortage'] = data['is_shortage']
1466
                item['mrp'] = data['mrp']
1467
                item['status'] = data['status']
1468
                item['maxPrice'] = data['maxPrice']
1469
                item['brand_id'] = data['brand_id']
17603 kshitij.so 1470
                item['subCategoryId'] = data['subCategoryId']
1471
                item['subCategory'] = data['subCategory']
15130 kshitij.so 1472
                similar_item_id = item.pop('_id')
1473
                get_mongo_connection().Catalog.MasterData.update({'_id':similar_item_id},{"$set":item},upsert=False)
1474
            return {1:'Data updated successfully.'}
17603 kshitij.so 1475
    except:
1476
        return {0:'Unable to update data'}
15130 kshitij.so 1477
    finally:
1478
        session.close()
14619 kshitij.so 1479
 
1480
def getLiveCricScore():
1481
    return mc.get('liveScore')
14852 kshitij.so 1482
 
1483
def addBundleToNotification(data):
1484
    try:
15069 kshitij.so 1485
        collection = get_mongo_connection().Catalog.Notifications
14852 kshitij.so 1486
        cursor = collection.find({'skuBundleId':data['skuBundleId']})
1487
        if cursor.count() > 0:
1488
            return {0:"SkuBundleId information already present."}
1489
        else:
1490
            collection.insert(data)
1491
            return {1:'Data updated successfully.'}
1492
    except:
1493
        return {0:'Unable to add data.'}
1494
 
1495
def getAllNotifications(offset, limit):
1496
    data = []
15069 kshitij.so 1497
    collection = get_mongo_connection().Catalog.Notifications
16450 kshitij.so 1498
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
14852 kshitij.so 1499
    for val in cursor:
15072 kshitij.so 1500
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14852 kshitij.so 1501
        if len(master) > 0:
1502
            val['brand'] = master[0]['brand']
15071 kshitij.so 1503
            val['model_name'] = master[0]['model_name']
14852 kshitij.so 1504
            val['skuBundleId'] = master[0]['skuBundleId']
1505
        else:
1506
            val['brand'] = ""
15071 kshitij.so 1507
            val['model_name'] = ""
1508
            val['skuBundleId'] = val['skuBundleId']
14852 kshitij.so 1509
        data.append(val)
1510
    return data
14997 kshitij.so 1511
 
1512
def getBrandsForFilter(category_id):
1513
    if mc.get("brandFilter") is None:
15095 kshitij.so 1514
        print "Populating brand data for category_id %d" %(category_id)
17469 kshitij.so 1515
        tabData, mobData, accData = [], [], []
14997 kshitij.so 1516
        mobileDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1517
                                                                      {"$match":{"category_id":3,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1518
                                                                    },
1519
                                                                 {"$group" : 
1520
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1521
                                                                  }
1522
                                                                ])
14588 kshitij.so 1523
 
14997 kshitij.so 1524
        tabletDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1525
                                                                      {"$match":{"category_id":5,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1526
                                                                    },
1527
                                                                 {"$group" : 
1528
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1529
                                                                  }
1530
                                                                ])
1531
 
17469 kshitij.so 1532
        accessoriesDeals = get_mongo_connection().Catalog.Deals.aggregate([
1533
                                                                      {"$match":{"category_id":6,"showDeal":1,"totalPoints":{"$gt":-100}}
1534
                                                                    },
1535
                                                                 {"$group" : 
1536
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1537
                                                                  }
1538
                                                                ])
1539
 
14997 kshitij.so 1540
        allDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1541
                                                                   {"$match":{"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1542
                                                                    },
1543
                                                                 {"$group" : 
1544
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1545
                                                                  }
1546
                                                                ])
1547
        #print mobileDeals
1548
        #print "==========Mobile data ends=========="
1549
 
1550
        #print tabletDeals
1551
        #print "==========Tablet data ends=========="
1552
 
1553
        #print allDeals
1554
        #print "==========All deal data ends========="
1555
 
1556
        for mobileDeal in mobileDeals['result']:
1557
            if mobileDeal.get('_id').get('brand_id') != 0:
1558
                tempMap = {}
1559
                tempMap['brand'] = mobileDeal.get('_id').get('brand')
1560
                tempMap['brand_id'] = mobileDeal.get('_id').get('brand_id')
1561
                tempMap['count'] = mobileDeal.get('count')
1562
                mobData.append(tempMap)
1563
 
1564
        for tabletDeal in tabletDeals['result']:
1565
            if tabletDeal.get('_id').get('brand_id') != 0:
1566
                tempMap = {}
1567
                tempMap['brand'] = tabletDeal.get('_id').get('brand')
1568
                tempMap['brand_id'] = tabletDeal.get('_id').get('brand_id')
1569
                tempMap['count'] = tabletDeal.get('count')
1570
                tabData.append(tempMap)
1571
 
17469 kshitij.so 1572
        for accessoryDeal in accessoriesDeals['result']:
1573
            if accessoryDeal.get('_id').get('brand_id') != 0:
1574
                tempMap = {}
1575
                tempMap['brand'] = accessoryDeal.get('_id').get('brand')
1576
                tempMap['brand_id'] = accessoryDeal.get('_id').get('brand_id')
1577
                tempMap['count'] = accessoryDeal.get('count')
1578
                accData.append(tempMap)
14997 kshitij.so 1579
 
17469 kshitij.so 1580
 
14997 kshitij.so 1581
        brandMap = {}
1582
        for allDeal in allDeals['result']:
1583
            if allDeal.get('_id').get('brand_id') != 0:
1584
                if brandMap.has_key(allDeal.get('_id').get('brand')):
15002 kshitij.so 1585
                    brand_ids = brandMap.get(allDeal.get('_id').get('brand')).get('brand_ids')
14997 kshitij.so 1586
                    brand_ids.append(allDeal.get('_id').get('brand_id'))
15003 kshitij.so 1587
                    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 1588
                else:
1589
                    temp = []
1590
                    temp.append(allDeal.get('_id').get('brand_id'))
15002 kshitij.so 1591
                    brandMap[allDeal.get('_id').get('brand')] = {'brand_ids':temp,'count':allDeal.get('count')}
14997 kshitij.so 1592
 
17469 kshitij.so 1593
        mc.set("brandFilter",{0:brandMap, 3:mobData, 5:tabData, 6:accData}, 600)  
14997 kshitij.so 1594
 
15062 kshitij.so 1595
    return sorted(mc.get("brandFilter").get(category_id), key = lambda x: (-x['count'], x['brand']))
15375 kshitij.so 1596
 
15459 kshitij.so 1597
def getStaticDeals(offset, limit, category_id, direction):
15375 kshitij.so 1598
    user_specific_deals = mc.get("staticDeals")
1599
    if user_specific_deals is None:
1600
        __populateStaticDeals()
1601
        user_specific_deals = mc.get("staticDeals")
15459 kshitij.so 1602
    rev = False
1603
    if direction is None or direction == -1:
1604
        rev=True
1605
    return sorted((user_specific_deals.get(category_id))[offset:offset+limit],reverse=rev)
15375 kshitij.so 1606
 
1607
def __populateStaticDeals():
1608
    print "Populating memcache for static deals"
1609
    outer_query = []
1610
    outer_query.append({"showDeal":1})
1611
    query = {}
16170 kshitij.so 1612
    query['$gt'] = -100
15375 kshitij.so 1613
    outer_query.append({'totalPoints':query})
1614
    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)]))
1615
    mobile_deals = []
1616
    tablet_deals = []
1617
    for deal in all_deals:
1618
        item = get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']})
1619
        if deal['category_id'] ==3:
1620
            mobile_deals.append(getItemObjForStaticDeals(item[0]))
1621
        elif deal['category_id'] ==5:
1622
            tablet_deals.append(getItemObjForStaticDeals(item[0]))
1623
        else:
1624
            continue
1625
 
1626
    random.shuffle(mobile_deals,random.random)
1627
    random.shuffle(tablet_deals,random.random)
1628
 
1629
    mem_cache_val = {3:mobile_deals, 5:tablet_deals}
1630
    mc.set("staticDeals", mem_cache_val, 3600)
1631
 
1632
def getItemObjForStaticDeals(item):
17469 kshitij.so 1633
    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 1634
 
1635
def getItemByMerchantIdentifier(identifier, source_id):
1636
    skuData = None
17035 kshitij.so 1637
    if source_id in (1,2,4,5,6,7):
16300 manas 1638
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
1639
    elif source_id == 3:
1640
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
1641
    if skuData is None:
1642
        return {}
1643
    else:
1644
        return skuData
15375 kshitij.so 1645
 
16364 kshitij.so 1646
def getDealsForNotification(skuBundleIds):
1647
    bundles= [int(skuBundleId) for skuBundleId in skuBundleIds.split(',')]
1648
    print bundles
16406 kshitij.so 1649
    dealsList = []
16364 kshitij.so 1650
    dealsListMap = []
16406 kshitij.so 1651
    for bundleId in bundles:
1652
        outer_query = []
1653
        outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
1654
        outer_query.append({'skuBundleId':bundleId})
1655
        deals = get_mongo_connection().Catalog.Deals.find({"$and":outer_query})
1656
        for deal in deals:
1657
            dealsList.append(deal)
16364 kshitij.so 1658
    sortedMap = {}
1659
    rankMap = {}
1660
    rank = 0
16406 kshitij.so 1661
    for sorted_deal in dealsList:
16364 kshitij.so 1662
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
1663
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1664
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1665
            rank = rank +1
1666
        else:
1667
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1668
                temp_list.append(sorted_deal)
1669
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1670
 
16367 kshitij.so 1671
    for dealList in [rankMap.get(k, []) for k in range(0, len(bundles))]:
16364 kshitij.so 1672
        temp = []
1673
        for d in dealList:
1674
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
1675
            if len(item) ==0:
1676
                continue
1677
            if d['dealType'] == 1 and d['source_id'] ==1:
1678
                item[0]['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(item[0]['identifier'].strip())
1679
            elif d['source_id'] ==3:
1680
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
1681
            else:
1682
                pass 
1683
            try:
1684
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
1685
                if not cashBack or cashBack.get('cash_back_status')!=1:
1686
                    item[0]['cash_back_type'] = 0
1687
                    item[0]['cash_back'] = 0
1688
                else:
1689
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
1690
                    item[0]['cash_back'] = cashBack['cash_back']
1691
            except:
1692
                print "Error in adding cashback to deals"
1693
                item[0]['cash_back_type'] = 0
1694
                item[0]['cash_back'] = 0
1695
            try:
1696
                item[0]['dp'] = d['dp']
1697
                item[0]['showDp'] = d['showDp']
1698
            except:
1699
                item[0]['dp'] = 0.0
1700
                item[0]['showDp'] = 0
1701
            temp.append(item[0])
1702
        if len(temp) > 1:
1703
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
1704
        dealsListMap.append(temp)
1705
    return dealsListMap
1706
 
16373 manas 1707
def getSkuBrandData(sku):
1708
    if sku is None:
1709
        return {}
1710
    else:
1711
        orders = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':sku})
1712
        if orders is None:
1713
            return {}
1714
        return orders
16488 kshitij.so 1715
 
1716
def addDealPoints(data):
1717
    collection = get_mongo_connection().Catalog.DealPoints
1718
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1719
    if cursor.count() > 0:
1720
        return {0:"Sku information already present."}
1721
    else:
1722
        collection.insert(data)
1723
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
1724
        return {1:"Data added successfully"}
1725
 
1726
def getAllBundlesWithDealPoints(offset, limit):
1727
    data = []
1728
    collection = get_mongo_connection().Catalog.DealPoints
1729
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
1730
    for val in cursor:
1731
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val.get('skuBundleId')})
1732
        if master is not None:
1733
            val['brand'] = master['brand']
1734
            val['source_product_name'] = master['product_name']
1735
        else:
1736
            val['brand'] = ""
1737
            val['source_product_name'] = ""
1738
        data.append(val)
1739
    return data
16546 kshitij.so 1740
 
1741
def generateRedirectUrl(retailer_id, app_id):
1742
    try:
16663 manish.sha 1743
        if retailer_id <= 0:
1744
            return {'url':"","message":"Retailer Id not valid"}
16546 kshitij.so 1745
        d_app_offer = app_offers.get_by(id=app_id)
16605 manish.sha 1746
    except:
1747
        traceback.print_exc()
16546 kshitij.so 1748
    finally:
1749
        session.close()
1750
    if d_app_offer is None:
1751
        return {'url':"","message":"App id doesn't exist"}
16364 kshitij.so 1752
 
16915 manish.sha 1753
    final_user_payout = 0
1754
    if d_app_offer.override_payout:
1755
        final_user_payout = d_app_offer.overriden_payout
1756
    else:
1757
        final_user_payout = d_app_offer.user_payout
16546 kshitij.so 1758
 
16915 manish.sha 1759
    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)
1760
 
16546 kshitij.so 1761
    get_mongo_connection().AppOrder.AppTransaction.insert(appTransactions.__dict__)
1762
    embedd = str((appTransactions.__dict__).get('_id'))
16548 kshitij.so 1763
    try:
1764
        index = d_app_offer.link.index(".freeb.co.in")
1765
    except:
16605 manish.sha 1766
        traceback.print_exc()
16548 kshitij.so 1767
        return {'url':"","message":"Substring not found"}
1768
    redirect_url = d_app_offer.link[0:index]+"."+embedd+d_app_offer.link[index:]
16546 kshitij.so 1769
    get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(embedd)},{"$set":{'redirect_url':redirect_url}})
16548 kshitij.so 1770
    return {'url':redirect_url,"message":"Success"}
16556 kshitij.so 1771
 
1772
def addPayout(payout, transaction_id):
1773
    try:
16764 manish.sha 1774
        print 'Got Response for Transaction Id:- '+ str(transaction_id)+ ' and Actual Payout:- '+str(payout)
16556 kshitij.so 1775
        transaction = list(get_mongo_connection().AppOrder.AppTransaction.find({'_id':ObjectId(transaction_id)}))
1776
        if len(transaction) > 0:
1777
            if (transaction[0])['payout_status'] ==1:
16753 manish.sha 1778
                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 1779
 
1780
                approvedAppTransaction = approved_app_transactions.get_by(transaction_id=transaction_id)
1781
                if approvedAppTransaction is None:
1782
                    approvedAppTransaction = approved_app_transactions()
16919 manish.sha 1783
                    approvedAppTransaction.app_id = transaction[0].get('app_id')
16782 manish.sha 1784
                    approvedAppTransaction.cash_back_description = CB_APPROVED
16919 manish.sha 1785
                    approvedAppTransaction.retailer_id = transaction[0].get('retailer_id')
16782 manish.sha 1786
                    approvedAppTransaction.transaction_id = transaction_id
16919 manish.sha 1787
                    approvedAppTransaction.transaction_time = to_py_date(long(transaction[0].get('transaction_time')))
1788
                    approvedAppTransaction.redirect_url = transaction[0].get('redirect_url')
16782 manish.sha 1789
                    approvedAppTransaction.payout_status = 2
1790
                    approvedAppTransaction.payout_description = CB_APPROVED
1791
                    approvedAppTransaction.cashback_status = 2 
1792
                    approvedAppTransaction.payout_amount = long(payout)
1793
                    approvedAppTransaction.payout_time = datetime.now()
16919 manish.sha 1794
                    approvedAppTransaction.offer_price = long(transaction[0].get('offer_price')) 
1795
                    approvedAppTransaction.overridenCashBack = transaction[0].get('overridenCashBack')
1796
                    approvedAppTransaction.isCashBackOverriden = transaction[0].get('isCashBackOverriden')
1797
                    approvedAppTransaction.user_payout = transaction[0].get('user_payout')
16782 manish.sha 1798
                    approvedAppTransaction.cashBackConsidered = False
16915 manish.sha 1799
                    if transaction[0].get('final_user_payout') is not None:
1800
                        approvedAppTransaction.final_user_payout = transaction[0].get('final_user_payout')
1801
                    else:
16919 manish.sha 1802
                        if transaction[0].get('isCashBackOverriden'):
1803
                            approvedAppTransaction.final_user_payout = transaction[0].get('overridenCashBack')
16915 manish.sha 1804
                        else:
16919 manish.sha 1805
                            approvedAppTransaction.final_user_payout = transaction[0].get('user_payout')
16782 manish.sha 1806
                    session.commit()
1807
 
1808
                    updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
16631 manish.sha 1809
                else:
16783 manish.sha 1810
                    approvedAppTransaction.payout_amount = long(payout)
1811
                    approvedAppTransaction.payout_time = datetime.now()
1812
                    if approvedAppTransaction.cashBackConsidered == False:
1813
                        updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
1814
                    session.commit()
16782 manish.sha 1815
 
1816
                    '''
1817
                    try:
1818
                        if int(transaction[0]['offer_price']) != payout or int(transaction[0]['user_payout']) < payout:
1819
                            _sendAlertForAppPayouts(int(transaction[0]['app_id']), int(transaction[0]['offer_price']), int(transaction[0]['user_payout']), payout)
1820
                    except:
1821
                        print traceback.print_exc()
1822
                    '''
16556 kshitij.so 1823
                return {'status':'ok','message':'Payout updated'}
1824
            elif (transaction[0])['payout_status'] ==2:
1825
                return {'status':'ok','message':'Payout already processed'}
1826
            else:
1827
                return {'status':'fail','message':'Something is wrong'}
1828
        else:
1829
            return {'status':'fail','message':'transaction_id not found'}
1830
    except:
16657 manish.sha 1831
        print traceback.print_exc()
16631 manish.sha 1832
        try:
16753 manish.sha 1833
            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 1834
        except:
1835
            print 'Data Inconsistency in Cashback Process'
16636 manish.sha 1836
            print traceback.print_exc()
16559 kshitij.so 1837
        return  {'status':'fail','message':'Something is wrong'}
16885 kshitij.so 1838
    finally:
1839
        session.close()
16556 kshitij.so 1840
 
16631 manish.sha 1841
def _updateApprovedCashbackToUser(approvedAppTransactionId):
1842
    approvedAppTransaction = approved_app_transactions.get_by(id=approvedAppTransactionId)
16915 manish.sha 1843
    if approvedAppTransaction.retailer_id < 0:
1844
        return False
1845
 
16631 manish.sha 1846
    currentMonth = datetime.today().month
1847
    currentDay = datetime.today().day
1848
    currentYear = datetime.today().year
1849
    fortNight = (currentMonth - 1)*2 + (currentDay/15)
1850
    if currentDay == 30 or currentDay ==31:
1851
        fortNight = fortNight-1
1852
    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()
1853
    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()
1854
    try:
1855
        if userAppCashbackObj is None:
1856
            userAppCashbackObj = user_app_cashbacks()
1857
            userAppCashbackObj.user_id = approvedAppTransaction.retailer_id
1858
            userAppCashbackObj.status = 'Approved'
16915 manish.sha 1859
            userAppCashbackObj.amount = approvedAppTransaction.final_user_payout
16631 manish.sha 1860
            userAppCashbackObj.fortnightOfYear = fortNight
1861
            userAppCashbackObj.yearVal = currentYear
1862
        else:
16915 manish.sha 1863
            userAppCashbackObj.amount = userAppCashbackObj.amount + approvedAppTransaction.final_user_payout
16631 manish.sha 1864
 
1865
        if userAppInstallObj is None:
1866
            app_offer = app_offers.get_by(id=approvedAppTransaction.app_id)
1867
            userAppInstallObj = user_app_installs()
1868
            userAppInstallObj.user_id = approvedAppTransaction.retailer_id
1869
            userAppInstallObj.fortnightOfYear = fortNight
1870
            userAppInstallObj.transaction_date = datetime(currentYear, currentMonth, currentDay, 0, 0, 0, 0).date()
1871
            userAppInstallObj.app_id = approvedAppTransaction.app_id
1872
            userAppInstallObj.app_name = app_offer.app_name
1873
            userAppInstallObj.installCount = 1
16915 manish.sha 1874
            userAppInstallObj.payoutAmount = approvedAppTransaction.final_user_payout
16631 manish.sha 1875
        else:
1876
            userAppInstallObj.installCount = userAppInstallObj.installCount + 1
16915 manish.sha 1877
            userAppInstallObj.payoutAmount = userAppInstallObj.payoutAmount +approvedAppTransaction.final_user_payout
16631 manish.sha 1878
 
1879
        approvedAppTransaction.cashBackConsidered = True
1880
        session.commit()
1881
        return True
1882
    except:
1883
        session.rollback()
16636 manish.sha 1884
        print traceback.print_exc()
16631 manish.sha 1885
        return False
16693 manish.sha 1886
 
1887
def _sendAlertForAppPayouts(app_id, offerPrice, userPayout, payout):
1888
    m = Email('localhost')
1889
    mFrom = "dtr@shop2020.in"
1890
    m.setFrom(mFrom)
1891
    mTo = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com','chaitnaya.vats@saholic.com','manoj.kumar@saholic.com','manish.sharma@shop2020.in']
1892
    for receipient in mTo:
1893
        m.addRecipient(receipient)
1894
    appOffer = app_offers.get_by(id=app_id)
1895
    if offerPrice != payout:
1896
        m.setSubject("Mismatch in Offer Price and Actual Pay Out for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1897
        message1 = "Offer Price:- "+ str(appOffer.offer_price) + "\n" + "Actual Pay Out:- "+ str(payout)
1898
        m.setTextBody(message1)
1899
    if userPayout > payout:
1900
        m.setSubject("User Pay Out greater than actual PayOut for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1901
        message2 = "User Pay Out Price:- "+ str(appOffer.user_payout) + "\n" + "Actual Pay Out:- "+ str(payout)
1902
        m.setTextBody(message2)
1903
    m.send()
16631 manish.sha 1904
 
16789 amit.gupta 1905
def rejectCashback(orderId, subOrderId):
16833 amit.gupta 1906
    cashBack = get_mongo_connection().Dtr.merchantOrder.update({"orderId":orderId, "subOrders.merchantSubOrderId":subOrderId}, 
16789 amit.gupta 1907
                                                               {"$set":{"subOrders.$.cashBackStatus":CB_REJECTED}})
16837 amit.gupta 1908
    print cashBack
16836 amit.gupta 1909
    return cashBack.get("nModified")
16894 manish.sha 1910
 
1911
def getAppOffers(retailer_id):
1912
    if not bool(mc.get("cached_app_offers_"+str(retailer_id))):
1913
        populateAppOffers(retailer_id)
1914
    return mc.get("cached_app_offers_"+str(retailer_id)) 
1915
 
1916
def populateAppOffers(retailerId):
1917
    retailerId = int(retailerId)
1918
    #offset = req.get_param_as_int("offset")
1919
    #limit = req.get_param_as_int("limit")
16941 manish.sha 1920
    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()
1921
    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 1922
    #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()
1923
 
1924
    appOffersMap = {}
1925
    priorityList = []
1926
    priorityMap = {}
1927
    for offer in priortizeders:
16941 manish.sha 1928
        if priorityMap.has_key(long(offer[1])):
1929
            offersVal = priorityMap.get(long(offer[1]))
1930
            offersVal.append(offer)
1931
            priorityMap[long(offer[1])]=offersVal
1932
        else:
1933
            offersVal = []
1934
            offersVal.append(offer)
1935
            priorityMap[long(offer[1])]=offersVal
1936
 
16894 manish.sha 1937
    priorityList = sorted(priorityMap)
1938
 
1939
    maxCount = len(nonPriortizedOffers) + len(priortizeders)
1940
 
16909 manish.sha 1941
    if priorityList is not None and len(priorityList)>0:
1942
        if maxCount < max(priorityList):
1943
            maxCount = max(priorityList)
16894 manish.sha 1944
 
1945
    count = 1
1946
    blockedPlaces = []
1947
    availablePlaces = []
1948
    while count <= maxCount:
1949
        if count in priorityList:
1950
            blockedPlaces.append(count)
1951
        else:
1952
            availablePlaces.append(count)
1953
        count = count +1
16941 manish.sha 1954
    print 'Blocked Places', blockedPlaces
16894 manish.sha 1955
    for val in blockedPlaces:
16941 manish.sha 1956
        key = val
1957
        for offerObj in priorityMap.get(val):
1958
            while appOffersMap.has_key(key):
1959
                key = key+1
1960
            appOffersMap[key] = long(offerObj[0])
1961
            if key in availablePlaces:
1962
                availablePlaces.remove(key)
1963
 
1964
    print 'Available Places', availablePlaces
1965
 
16894 manish.sha 1966
    i=0
1967
    for val in availablePlaces:
16899 manish.sha 1968
        if i<len(nonPriortizedOffers):
16902 manish.sha 1969
            appOffersMap[val]= long(nonPriortizedOffers[i][0])
16899 manish.sha 1970
        else:
1971
            break
1972
        i=i+1
16901 manish.sha 1973
    print 'AppOffersMap', appOffersMap
16894 manish.sha 1974
 
1975
    finalAppOffersMap = {}
1976
    if len(appOffersMap) > 0:
1977
        for key in sorted(appOffersMap):               
1978
            finalAppOffersMap[key] = appOffersMap[key]
1979
 
1980
        mc.set("cached_app_offers_"+str(retailerId), finalAppOffersMap, 120)
1981
    else:
1982
        print 'No Offers'
1983
        mc.set("cached_app_offers_"+str(retailerId), {}, 10)              
17280 manish.sha 1984
 
1985
def sendNotification(userIds, campaignName, title, message,notificationtype, url, expiresat='2999-01-01'):
1986
    campaignId = addNotificationCampaign(campaignName, title, message, notificationtype, url, None)
1987
    payload = {}
1988
    payload["user_id"]= userIds[0]
1989
    payload["type"]="pending"
1990
    payload["notification_campaign_id"]= campaignId
1991
    payload["status"]=0
16546 kshitij.so 1992
 
17280 manish.sha 1993
    payloadList = []
1994
    payloadList.append(payload)
17281 manish.sha 1995
    jsonObj = json.dumps([dict(pn) for pn in payloadList])
1996
    print jsonObj
1997
    pushpostrequest = urllib2.Request("http://45.33.50.227:3001/addPushNotification")
1998
    pushpostrequest.add_header('Content-Type', 'application/json')
1999
    response = urllib2.urlopen(pushpostrequest, jsonObj).read()
17280 manish.sha 2000
    print response
2001
 
2002
def addNotificationCampaign(name, title, message, type, url, sql):
2003
    notificationCampaign = notification_campaigns()
2004
    notificationCampaign.name = name
2005
    notificationCampaign.title = title
2006
    notificationCampaign.type = type
2007
    notificationCampaign.message = message
2008
    notificationCampaign.url = url
2009
    notificationCampaign.sql = sql
2010
    notificationCampaign.expiresat = datetime(2999, 1, 1)
2011
    notificationCampaign.status = 'active'
2012
    notificationCampaign.created = datetime.now()
2013
 
2014
    session.commit()
2015
    campaignId = notificationCampaign.id
2016
 
2017
    session.close()
2018
    return campaignId
17302 kshitij.so 2019
 
2020
def getDummyDeals(categoryId, offset, limit):
2021
    outer_query = []
2022
    outer_query.append({"showDeal":1})
2023
    outer_query.append({"category_id":categoryId})
2024
    query = {}
2025
    query['$gt'] = -100
2026
    outer_query.append({'totalPoints':query})
2027
    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))
2028
    returnObj = []
2029
    for deal in all_deals:
17306 kshitij.so 2030
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
17305 kshitij.so 2031
        returnObj.append(getItemObjForStaticDeals(item[0]))
17302 kshitij.so 2032
    return returnObj
17367 kshitij.so 2033
 
17469 kshitij.so 2034
def searchDummyDeals(search_term , limit, offset):
17367 kshitij.so 2035
    data = []
2036
    uniqueMap = {}
2037
    if search_term is not None:
2038
        terms = search_term.split(' ')
2039
        outer_query = []
2040
        for term in terms:
2041
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
2042
        try:
2043
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}})
2044
            for record in collection:
2045
                data.append(record)
2046
        except:
2047
            pass
2048
    else:
2049
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}})
2050
        for record in collection:
2051
            data.append(record)
2052
    for x in data:
2053
        if not uniqueMap.has_key(x['skuBundleId']):
17469 kshitij.so 2054
            uniqueMap[x['skuBundleId']] = {'source_product_name':x['source_product_name'],'skuBundleId':x['skuBundleId'],'thumbnail':x['thumbnail']}
17367 kshitij.so 2055
 
17469 kshitij.so 2056
    if (offset + limit) > len(uniqueMap.values()):
2057
        limit = len(uniqueMap.values()) - offset - 1
2058
 
2059
    count = 0
2060
#     for x in uniqueMap.values():
2061
#         print count,
2062
#         print '\t',
2063
#         print x
2064
#         count = count+1
17555 kshitij.so 2065
 
17469 kshitij.so 2066
    print offset
2067
    print limit
2068
 
2069
    return uniqueMap.values()[offset:limit+offset]
17367 kshitij.so 2070
 
17469 kshitij.so 2071
 
2072
def getDummyPricing(skuBundleId):
2073
    collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()},'skuBundleId':skuBundleId,'in_stock':1})
2074
    print collection.count()
2075
    cheapest = 99999999
2076
    cheapestDetails= None
2077
    returnMap = {}
2078
 
2079
    for d in collection:
2080
        if d['available_price'] < cheapest:
2081
            cheapestDetails = d
2082
            cheapest = int(d['available_price'])
2083
        if returnMap.has_key(d['source_id']):
2084
            d = getItemObjForStaticDeals(d)
2085
            d['toShowStore'] = 0
2086
            returnMap[d['source_id']].append(d)
2087
        else:
2088
            temp = []
2089
            d = getItemObjForStaticDeals(d)
2090
            d['toShowStore'] = 1
2091
            temp.append(d)
2092
            returnMap[d['source_id']] = temp
2093
    returnMap['cheapest'] = cheapestDetails
2094
    for y in returnMap.itervalues():
2095
        if isinstance(y, (list, tuple)):
2096
            (y[len(y)-1])['lastElement'] = 1
2097
        else:
2098
            pass
2099
    if returnMap['cheapest'] ==None:
2100
        dum = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':skuBundleId,'source_id':{"$in":SOURCE_MAP.keys()}})
2101
        returnMap['cheapest'] = {'thumbnail':dum['thumbnail'],'source_product_name':dum['source_product_name']}
2102
    return returnMap
17555 kshitij.so 2103
 
17603 kshitij.so 2104
 
17555 kshitij.so 2105
def addDealObject(data):
17570 kshitij.so 2106
    if data.get('img_url') is None or data.get('img_url')=="" or data.get('name') is None or data.get('name')=="":
2107
        return {0:'Invalid data'}   
17555 kshitij.so 2108
    try:
2109
        max_id = list(get_mongo_connection().Catalog.DealObject.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
2110
        if len(max_id) ==0:
2111
            max_id = 0
17559 kshitij.so 2112
        else:
2113
            max_id = max_id[0]['_id']
2114
        data['_id'] = max_id +1
17555 kshitij.so 2115
        get_mongo_connection().Catalog.DealObject.insert(data)
2116
        return {1:'Data added successfully'}
2117
    except:
2118
        return {0:'Error in adding data'}
2119
 
17561 kshitij.so 2120
def getAllDealObjects(offset, limit):
2121
    data = []
2122
    collection = get_mongo_connection().Catalog.DealObject
2123
    cursor = collection.find({}).skip(offset).limit(limit)
2124
    for val in cursor:
17564 kshitij.so 2125
        data.append({'_id':val['_id'],'name':val['name']})
17561 kshitij.so 2126
    return data
17564 kshitij.so 2127
 
2128
def deleteDealObject(id):
2129
    try:
2130
        get_mongo_connection().Catalog.DealObject.remove({'_id':id})
2131
        return {1:"Deal Object deleted"}
2132
    except:
2133
        return {0:"Error in deleting object"}
17566 kshitij.so 2134
 
2135
def getDealObjectById(id):
2136
    try:
2137
        data = get_mongo_connection().Catalog.DealObject.find({'_id':id})
2138
        return data
2139
    except:
17570 kshitij.so 2140
        return {}
17561 kshitij.so 2141
 
17570 kshitij.so 2142
def updateDealObject(data):
2143
    try:
2144
        _id = data['_id']
2145
        data.pop('_id')
2146
        get_mongo_connection().Catalog.DealObject.update({'_id':_id},{"$set":data},upsert=False)
2147
        return {1:"Data updated successfully"}
2148
    except:
2149
        return {0:"Error in updating data"}
2150
 
13572 kshitij.so 2151
def main():
17555 kshitij.so 2152
    data = {'hello':"ya"}
2153
    addDealObject(data)
17469 kshitij.so 2154
 
2155
 
2156
 
13572 kshitij.so 2157
if __name__=='__main__':
13932 amit.gupta 2158
    main()
17469 kshitij.so 2159