Subversion Repositories SmartDukaan

Rev

Rev 17764 | Rev 17788 | 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 =[]
17764 kshitij.so 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,'subCategoryId':1})
17369 kshitij.so 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
17662 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, 'subCategoryId':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
 
486
    for sorted_deal in mobile_deals:
17369 kshitij.so 487
 
17367 kshitij.so 488
        while(True):
489
            if rankMobiles in blockedRanksMobiles:
490
                print "skipping rank ",rankMobiles
491
                rankMobiles = rankMobiles +1
492
            else:
493
                break
494
 
495
        if sorted_deal['skuBundleId'] in blockedSkuBundlesMobiles:
496
            print "Yes sorted deal in blocked ",sorted_deal['skuBundleId']
497
            if blockedInfoMobiles.has_key(sorted_deal['skuBundleId']):
498
                blockedInfoMobiles.get(sorted_deal['skuBundleId']).append(sorted_deal)
499
            else:
500
                blockedInfoMobiles[sorted_deal['skuBundleId']] = [sorted_deal]
501
            continue
502
 
503
        if sortedMapMobiles.get(sorted_deal['skuBundleId']) is None:
504
            sortedMapMobiles[sorted_deal['skuBundleId']] = {rankMobiles:[sorted_deal]}
505
            rankMapMobiles[rankMobiles] = (sortedMapMobiles[sorted_deal['skuBundleId']].values())[0]
506
            rankMobiles = rankMobiles +1
507
        else:
508
            for temp_list in sortedMapMobiles.get(sorted_deal['skuBundleId']).itervalues():
509
                temp_list.append(sorted_deal)
510
            rankMapMobiles[(sortedMapMobiles.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
511
 
512
 
513
    for rank in blockedRanksMobiles:
17369 kshitij.so 514
        if blockedInfoMobiles.get((featuredDealsMobiles.get(rank+1)).get('skuBundleId')) is not None:
515
            rankMapMobiles[rank] = blockedInfoMobiles.get((featuredDealsMobiles.get(rank+1)).get('skuBundleId'))
516
            print rankMapMobiles[rank]
17367 kshitij.so 517
 
518
 
519
    sortedMapTablets = {}
520
    rankMapTablets = {}
521
    rankTablets = 0
522
 
523
    blockedRanksTablets = []
524
    blockedSkuBundlesTablets = []
525
    blockedInfoTablets = {}
526
 
527
    featuredDealsTablets = featuredDeals.get(5)
528
 
529
 
530
    for k, v in featuredDealsTablets.iteritems():
17469 kshitij.so 531
        blockedRanksTablets.append(k-1)
532
        blockedSkuBundlesTablets.append(v.get('skuBundleId'))
533
 
17367 kshitij.so 534
 
535
    for sorted_deal in tablet_deals:
536
        while(True):
537
            if rankTablets in blockedRanksTablets:
538
                print "skipping rank ",rankTablets
539
                rankTablets = rankTablets +1
540
            else:
541
                break
542
 
543
        if sorted_deal['skuBundleId'] in blockedSkuBundlesTablets:
544
            if blockedInfoTablets.has_key(sorted_deal['skuBundleId']):
545
                blockedInfoTablets.get(sorted_deal['skuBundleId']).append(sorted_deal)
546
            else:
547
                blockedInfoTablets[sorted_deal['skuBundleId']] = [sorted_deal]
548
            continue
549
 
550
        if sortedMapTablets.get(sorted_deal['skuBundleId']) is None:
551
            sortedMapTablets[sorted_deal['skuBundleId']] = {rankTablets:[sorted_deal]}
552
            rankMapTablets[rankTablets] = (sortedMapTablets[sorted_deal['skuBundleId']].values())[0]
553
            rankTablets = rankTablets +1
554
        else:
555
            for temp_list in sortedMapTablets.get(sorted_deal['skuBundleId']).itervalues():
556
                temp_list.append(sorted_deal)
557
            rankMapTablets[(sortedMapTablets.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
558
 
559
    for rank in blockedRanksTablets:
17369 kshitij.so 560
        if blockedInfoTablets.get((featuredDealsTablets.get(rank+1)).get('skuBundleId')) is not None:
561
            rankMapTablets[rank] = blockedInfoTablets.get((featuredDealsTablets.get(rank+1)).get('skuBundleId'))
562
            print rankMapTablets[rank]
17469 kshitij.so 563
 
17367 kshitij.so 564
 
17469 kshitij.so 565
    sortedMapAccessories = {}
566
    rankMapAccessories = {}
567
    rankAccessories = 0
568
 
569
    blockedRanksAccessories = []
570
    blockedSkuBundlesAccessories = []
571
    blockedInfoAccessories = {}
572
 
573
    featuredDealsAccessories = featuredDeals.get(6)
574
 
575
    for k, v in featuredDealsAccessories.iteritems():
576
        blockedRanksAccessories.append(k-1)
577
        blockedSkuBundlesAccessories.append(v.get('skuBundleId'))
578
 
579
 
580
    for sorted_deal in accessories_deals:
581
 
582
        while(True):
583
            if rankAccessories in blockedRanksAccessories:
584
                print "skipping rank ",rankAccessories
585
                rankAccessories = rankAccessories +1
586
            else:
587
                break
588
 
589
        if sorted_deal['skuBundleId'] in blockedSkuBundlesAccessories:
590
            print "Yes sorted deal in blocked ",sorted_deal['skuBundleId']
591
            if blockedInfoAccessories.has_key(sorted_deal['skuBundleId']):
592
                blockedInfoAccessories.get(sorted_deal['skuBundleId']).append(sorted_deal)
593
            else:
594
                blockedInfoAccessories[sorted_deal['skuBundleId']] = [sorted_deal]
595
            continue
596
 
597
        if sortedMapAccessories.get(sorted_deal['skuBundleId']) is None:
598
            sortedMapAccessories[sorted_deal['skuBundleId']] = {rankAccessories:[sorted_deal]}
599
            rankMapAccessories[rankAccessories] = (sortedMapAccessories[sorted_deal['skuBundleId']].values())[0]
600
            rankAccessories = rankAccessories +1
601
        else:
602
            for temp_list in sortedMapAccessories.get(sorted_deal['skuBundleId']).itervalues():
603
                temp_list.append(sorted_deal)
604
            rankMapAccessories[(sortedMapAccessories.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
605
 
606
 
607
    for rank in blockedRanksAccessories:
608
        print "Adding rank acc ",rank 
609
        if blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId')) is not None:
610
            rankMapAccessories[rank] = blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId'))
611
            print rankMapAccessories[rank]
612
 
613
    print rankMapAccessories
614
 
615
    mem_cache_val = {3:mobile_deals, 5:tablet_deals, 6: accessories_deals,"3_rankMap": rankMapMobiles,"5_rankMap": rankMapTablets,"6_rankMap": rankMapAccessories }
14037 kshitij.so 616
    mc.set(str(userId), mem_cache_val)
617
 
618
 
14531 kshitij.so 619
def __populateFeaturedDeals():
17367 kshitij.so 620
    print "Populating featured deals....."
621
    featuredDealsMobiles = {}
622
    featuredDealsTablets = {}
17469 kshitij.so 623
    featuredDealsAccessories = {}
17618 kshitij.so 624
    activeFeaturedDeals = get_mongo_connection().Catalog.FeaturedDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}})
14531 kshitij.so 625
    for activeFeaturedDeal in activeFeaturedDeals:
17367 kshitij.so 626
        deals = get_mongo_connection().Catalog.Deals.find({"skuBundleId":activeFeaturedDeal.get('skuBundleId'),"$or":[{"showDeal":1}, {"prepaidDeal":1}]})
627
        for deal in deals:
628
            if deal.get('available_price') <= activeFeaturedDeal.get('thresholdPrice'):
17469 kshitij.so 629
                for category_id, rank  in activeFeaturedDeal['otherInfo'].iteritems():
630
                    f_deal = {'skuBundleId':activeFeaturedDeal.get('skuBundleId'), 'thresholdPrice':activeFeaturedDeal.get('thresholdPrice'), 'rank':rank,'category_id':int(category_id),'totalPoints':activeFeaturedDeal.get('totalPoints')}
631
                    if f_deal['category_id'] == 3:
632
                        featuredDealsMobiles[rank] = f_deal
633
                    elif f_deal['category_id']==5:
634
                        featuredDealsTablets[rank] = f_deal
635
                    elif f_deal['category_id']==6:
636
                        featuredDealsAccessories[rank] = f_deal
17367 kshitij.so 637
                break
17469 kshitij.so 638
 
639
#                f_deal = {'skuBundleId':activeFeaturedDeal.get('skuBundleId'), 'thresholdPrice':activeFeaturedDeal.get('thresholdPrice'), 'rank':activeFeaturedDeal.get('rank'),'category_id':activeFeaturedDeal.get('category_id'),'totalPoints':activeFeaturedDeal.get('totalPoints')}
640
#                 if activeFeaturedDeal.get('category_id') == 3:
641
#                     featuredDealsMobiles[activeFeaturedDeal.get('rank')] = f_deal
642
#                 else:
643
#                     featuredDealsTablets[activeFeaturedDeal.get('rank')] = f_deal
644
#                 break
645
 
17367 kshitij.so 646
 
17469 kshitij.so 647
    mc.set("featured_deals", {3:featuredDealsMobiles,5:featuredDealsTablets,6:featuredDealsAccessories}, 600)
14037 kshitij.so 648
 
17618 kshitij.so 649
def __populateFeaturedDealsForDealObject():
650
    print "Caching deal objects...."
651
    featuredDealObjectMobiles = {}
652
    featuredDealObjectTablets = {}
653
    featuredDealObjectAccessories = {}
654
    dealObjects = get_mongo_connection().Catalog.FeaturedDealsDealObject.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}})
655
    for dealObject in dealObjects:
656
        d_object = list(get_mongo_connection().Catalog.DealObject.find({'_id':dealObject['_id']}))
657
        if len(d_object) == 0:
658
            continue
659
        for category_id, rank  in dealObject['otherInfo'].iteritems():
660
            d_object[0]['dealObject'] = 1
661
            f_deal = {'rank':rank,'category_id':int(category_id),'object':d_object[0]}
662
            if f_deal['category_id'] == 3:
663
                featuredDealObjectMobiles[rank] = f_deal
664
            elif f_deal['category_id']==5:
665
                featuredDealObjectTablets[rank] = f_deal
666
            elif f_deal['category_id']==6:
667
                featuredDealObjectAccessories[rank] = f_deal
668
    mc.set("featured_deals_deal_object", {3:featuredDealObjectMobiles,5:featuredDealObjectTablets,6:featuredDealObjectAccessories}, 600)
17619 kshitij.so 669
    print mc.get('featured_deals_deal_object')
17618 kshitij.so 670
 
14791 kshitij.so 671
def getNewDeals(userId, category_id, offset, limit, sort, direction, filterData=None):
17469 kshitij.so 672
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
13921 kshitij.so 673
        populateCashBack()
14037 kshitij.so 674
 
16079 kshitij.so 675
    dealsListMap = []
14037 kshitij.so 676
    user_specific_deals = mc.get(str(userId))
677
    if user_specific_deals is None:
678
        __populateCache(userId)
679
        user_specific_deals = mc.get(str(userId))
14038 kshitij.so 680
    else:
681
        print "Getting user deals from cache"
14037 kshitij.so 682
    category_specific_deals = user_specific_deals.get(category_id)
683
 
17367 kshitij.so 684
    insert_featured_deals = False
14037 kshitij.so 685
    if sort is None or direction is None:
17367 kshitij.so 686
        insert_featured_deals = True
687
        rankMap = user_specific_deals.get(str(category_id)+"_rankMap")
14037 kshitij.so 688
    else:
689
        if sort == "bestSellerPoints":
690
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['bestSellerPoints'], x['rank'], x['nlcPoints']),reverse=True)
691
        else:
692
            if direction == -1:
693
                rev = True
694
            else:
695
                rev = False
696
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['available_price']),reverse=rev)
697
 
14791 kshitij.so 698
 
17367 kshitij.so 699
    filtered_deals = []
17668 kshitij.so 700
    dataExist = True
14791 kshitij.so 701
    if filterData is not None:
702
        try:
17669 kshitij.so 703
            filtered_deals = filterDeals(category_specific_deals, filterData)
704
            if len(filtered_deals)==0:
705
                dataExist = False
14791 kshitij.so 706
        except:
16067 kshitij.so 707
            traceback.print_exc()
17668 kshitij.so 708
    if dataExist:
14791 kshitij.so 709
 
17668 kshitij.so 710
        if not insert_featured_deals:
711
            sortedMap = {}
712
            rankMap = {}
713
            rank = 0
714
            for sorted_deal in sorted_deals:
715
 
716
                if len(filtered_deals) > 0 and  sorted_deal['skuBundleId'] not in filtered_deals:
717
                    continue
718
 
719
                if sortedMap.get(sorted_deal['skuBundleId']) is None:
720
                    sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
721
                    rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
722
                    rank = rank +1
723
                else:
724
                    for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
725
                        temp_list.append(sorted_deal)
726
                    rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
727
        else:
728
            filterMap = {}
729
            rank = 0
730
            if len(filtered_deals) > 0:
731
                try:
732
                    od = collections.OrderedDict(sorted(rankMap.items()))
733
                except:
734
                    od = ordereddict.OrderedDict(sorted(rankMap.items()))
735
                for k, v in od.iteritems():
736
                    if v[0].get('skuBundleId') in filtered_deals:
737
                        filterMap[rank] = v
738
                        rank =rank+1
739
                rankMap = filterMap
740
 
741
        rankCounter = offset
742
        if filterData is None:
743
            if mc.get("featured_deals_deal_object") is None or not bool(mc.get("featured_deals_deal_object")):
744
                try:
745
                    __populateFeaturedDealsForDealObject()
746
                    fd_dealObject = mc.get("featured_deals_deal_object")
747
                except:
748
                    fd_dealObject = {3:{},5:{},6:{}}
17367 kshitij.so 749
            else:
17668 kshitij.so 750
                fd_dealObject = mc.get("featured_deals_deal_object")
751
 
17367 kshitij.so 752
    else:
17668 kshitij.so 753
        rankMap = {}
17618 kshitij.so 754
 
17627 kshitij.so 755
    for dealList in [rankMap.get(k, []) for k in range(offset, offset+limit)]:
17629 kshitij.so 756
        if filterData is None:
17627 kshitij.so 757
            while(True):
758
 
759
                rankCounter = rankCounter+1
760
                if (fd_dealObject.get(category_id).get(rankCounter)) is not None:
761
                    deal_object_temp = []
762
                    deal_object_temp.append(fd_dealObject.get(category_id).get(rankCounter).get('object'))
763
                    dealsListMap.append(deal_object_temp)
764
                else:
765
                    break
17620 kshitij.so 766
 
16079 kshitij.so 767
        temp = []
17367 kshitij.so 768
        if dealList is None or len(dealList)==0:
17369 kshitij.so 769
            print "Empty deal;lisr"
17367 kshitij.so 770
            continue
16067 kshitij.so 771
        for d in dealList:
772
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
16320 kshitij.so 773
            if len(item) ==0:
774
                continue
16079 kshitij.so 775
            item[0]['persPoints'] = d['persPoints']
776
            if d['dealType'] == 1 and d['source_id'] ==1:
16511 kshitij.so 777
                try:
778
                    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())}}))
779
                    item[0]['marketPlaceUrl'] = manualDeal[0]['dealUrl'].strip()
780
                except:
781
                    pass
16079 kshitij.so 782
            elif d['source_id'] ==3:
783
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
784
            else:
785
                pass 
786
            try:
787
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
788
                if not cashBack or cashBack.get('cash_back_status')!=1:
14037 kshitij.so 789
                    item[0]['cash_back_type'] = 0
790
                    item[0]['cash_back'] = 0
16079 kshitij.so 791
                else:
17180 kshitij.so 792
                    if cashBack.get('maxCashBack') is not None:
793
 
794
                        if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*item[0]['available_price'])/100 > cashBack.get('maxCashBack'):
795
                            cashBack['cash_back_type'] = 2
796
                            cashBack['cash_back'] = cashBack['maxCashBack']
797
                        elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
798
                            cashBack['cash_back'] = cashBack['maxCashBack']
799
 
16079 kshitij.so 800
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
801
                    item[0]['cash_back'] = cashBack['cash_back']
802
            except:
803
                print "Error in adding cashback to deals"
804
                item[0]['cash_back_type'] = 0
805
                item[0]['cash_back'] = 0
16252 kshitij.so 806
            try:
807
                item[0]['dp'] = d['dp']
808
                item[0]['showDp'] = d['showDp']
809
            except:
810
                item[0]['dp'] = 0.0
811
                item[0]['showDp'] = 0
16483 kshitij.so 812
            try:
813
                item[0]['thumbnail'] = item[0]['thumbnail'].strip()
814
            except:
17115 manish.sha 815
                pass
17603 kshitij.so 816
 
817
            try:
818
                if item[0]['showVideo']==0:
819
                    item[0]['videoLink'] =""
820
            except:
821
                item[0]['videoLink'] =""
822
            try:
823
                if item[0]['quantity'] >1:
824
                    ppq = float(item[0]['available_price'])/item[0]['quantity']
825
 
826
                    if ppq == round(ppq):
827
                        item[0]['ppq'] = int(ppq)
828
                    else:
829
                        item[0]['ppq'] = round(ppq,2)
830
                    item[0]['tagline'] = ""
831
                else:
832
                    item[0]['ppq'] = 0
833
            except:
834
                item[0]['ppq'] = 0
17627 kshitij.so 835
            if filterData is None:
17679 kshitij.so 836
                if item[0]['category_id']!=6:
837
                    try:
838
                        item[0]['filterLink'] = '/category/'+str(int(item[0]['category_id']))+'?filter=brand&brands='+str(int(item[0]['brand_id']))
17714 kshitij.so 839
                        item[0]['filterText'] = 'More %s items'%(item[0]['brand'])
17679 kshitij.so 840
                    except:
841
                        item[0]['filterLink'] = ""
842
                        item[0]['filterText'] = ""
843
                else:
844
                    try:
17756 kshitij.so 845
                        if item[0]['subCategory']=='' or item[0]['subCategory'] is None or item[0]['subCategoryId']==0:
17679 kshitij.so 846
                            raise
847
                        item[0]['filterLink'] = '/category/'+str(int(item[0]['category_id']))+'?filter=subcategory&subcategories='+str(int(item[0]['subCategoryId']))
17714 kshitij.so 848
                        item[0]['filterText'] = 'More %s'%(item[0]['subCategory'])
17679 kshitij.so 849
                    except:
850
                        item[0]['filterLink'] = ''
851
                        item[0]['filterText'] = ""
17771 kshitij.so 852
            try:
853
                if item[0]['source_id']==4:
854
                    item_availability_info = mc.get("item_availability_"+str(item[0]['identifier']).strip())
855
                    if item_availability_info is None or len(item_availability_info)==0:
856
                        item[0]['availabilityInfo'] = [{}]
857
                    else:
858
                        item[0]['availabilityInfo'] = item_availability_info
859
            except:
860
                item[0]['availabilityInfo'] = [{}]
16079 kshitij.so 861
            temp.append(item[0])
16125 kshitij.so 862
        if len(temp) > 1:
16126 kshitij.so 863
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
16079 kshitij.so 864
        dealsListMap.append(temp)
865
    return dealsListMap
14037 kshitij.so 866
 
14791 kshitij.so 867
def filterDeals(deals, filterData):
17658 kshitij.so 868
    print "Filter data ", filterData
14791 kshitij.so 869
    brandsFiltered = []
17657 kshitij.so 870
    subCategoryFiltered = []
14791 kshitij.so 871
    filterArray = filterData.split('|')
872
    for data in filterArray:
873
        try:
874
            filter, info = data.split(':')
875
        except Exception as ex:
876
            traceback.print_exc()
877
            continue
17657 kshitij.so 878
        if filter == 'brandFilter':
14791 kshitij.so 879
            toFilter = info.split('^')
880
            print "brand filter ",toFilter
881
            for deal in deals:
15151 kshitij.so 882
                if str(int(deal['brand_id'])) in toFilter:
14791 kshitij.so 883
                    brandsFiltered.append(deal)
17657 kshitij.so 884
        elif filter =='subCategoryFilter':
885
            toFilter = info.split('^')
886
            print "Sub Category filter ",toFilter
887
            for deal in deals:
888
                if str(int(deal['subCategoryId'])) in toFilter:
889
                    subCategoryFiltered.append(deal)
17668 kshitij.so 890
    print "No of brand filtered ",len(brandsFiltered)
891
    print "No of sub-cat filtered ",len(subCategoryFiltered)
17657 kshitij.so 892
    if len(subCategoryFiltered) == 0:
17367 kshitij.so 893
        return [trend['skuBundleId'] for trend in brandsFiltered]
17663 kshitij.so 894
    elif len(brandsFiltered) == 0:
895
        return [trend['skuBundleId'] for trend in subCategoryFiltered]
17669 kshitij.so 896
    return [i['skuBundleId'] for i in subCategoryFiltered for j in brandsFiltered if i['_id']==j['_id']]
14791 kshitij.so 897
 
898
 
14037 kshitij.so 899
def getDeals(userId, category_id, offset, limit, sort, direction):
17469 kshitij.so 900
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14037 kshitij.so 901
        populateCashBack()
902
    rank = 1
13771 kshitij.so 903
    deals = {}
13910 kshitij.so 904
    outer_query = []
905
    outer_query.append({"showDeal":1})
906
    query = {}
907
    query['$gt'] = 0
908
    outer_query.append({'totalPoints':query})
909
    if category_id in (3,5):
910
        outer_query.append({'category_id':category_id})
13803 kshitij.so 911
    if sort is None or direction is None:
912
        direct = -1
13910 kshitij.so 913
        print outer_query
914
        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 915
    else:
13910 kshitij.so 916
        print outer_query
13803 kshitij.so 917
        direct = direction
13910 kshitij.so 918
        if sort == "bestSellerPoints":
919
            print "yes,sorting by bestSellerPoints"
920
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([('bestSellerPoints',direct),('rank',direct),('nlcPoints',direct)]).skip(offset).limit(limit))
921
        else:
922
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([(sort,direct)]).skip(offset).limit(limit))
13771 kshitij.so 923
    for d in data:
924
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
925
        if not deals.has_key(item[0]['identifier']):
13921 kshitij.so 926
            item[0]['dealRank'] = rank
927
            try:
14761 kshitij.so 928
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
13921 kshitij.so 929
                if not cashBack or cashBack.get('cash_back_status')!=1:
13928 kshitij.so 930
                    item[0]['cash_back_type'] = 0
931
                    item[0]['cash_back'] = 0
13921 kshitij.so 932
                else:
14766 kshitij.so 933
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
13928 kshitij.so 934
                    item[0]['cash_back'] = cashBack['cash_back']
13921 kshitij.so 935
            except:
936
                print "Error in adding cashback to deals"
13928 kshitij.so 937
                item[0]['cash_back_type'] = 0
938
                item[0]['cash_back'] = 0
13771 kshitij.so 939
            deals[item[0]['identifier']] = item[0]
13921 kshitij.so 940
 
13771 kshitij.so 941
            rank +=1
13785 kshitij.so 942
    return sorted(deals.values(), key=itemgetter('dealRank'))
943
 
16222 kshitij.so 944
def getItem(skuId,showDp=None):
16224 kshitij.so 945
    temp = []
17469 kshitij.so 946
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14113 kshitij.so 947
        populateCashBack()
13795 kshitij.so 948
    try:
16222 kshitij.so 949
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'_id':int(skuId)})
950
        if skuData is None:
951
            raise
952
        try:
953
            cashBack = getCashBack(skuData['_id'], skuData['source_id'], skuData['category_id'])
954
            if not cashBack or cashBack.get('cash_back_status')!=1:
955
                skuData['cash_back_type'] = 0
956
                skuData['cash_back'] = 0
957
            else:
958
                skuData['cash_back_type'] = cashBack['cash_back_type']
959
                skuData['cash_back'] = cashBack['cash_back']
960
        except:
961
            print "Error in adding cashback to deals"
962
            skuData['cash_back_type'] = 0
963
            skuData['cash_back'] = 0
964
        skuData['in_stock'] = int(skuData['in_stock'])
965
        skuData['is_shortage'] = int(skuData['is_shortage'])
966
        skuData['category_id'] = int(skuData['category_id'])
17607 kshitij.so 967
        skuData['subCategoryId'] = int(skuData['subCategoryId'])
16222 kshitij.so 968
        skuData['status'] = int(skuData['status'])
16483 kshitij.so 969
        try:
970
            skuData['thumbnail'] = skuData['thumbnail'].strip()
971
        except:
972
            pass 
16222 kshitij.so 973
        if showDp is not None:
974
            dealerPrice = get_mongo_connection().Catalog.SkuDealerPrices.find_one({'skuBundleId':skuData['skuBundleId']})
975
            skuData['dp'] = 0.0
976
            skuData['showDp'] = 0
977
            if dealerPrice is not None:
978
                skuData['dp'] = dealerPrice['dp']
979
                skuData['showDp'] = dealerPrice['showDp']
16224 kshitij.so 980
        temp.append(skuData)
981
        return temp
13795 kshitij.so 982
    except:
16224 kshitij.so 983
        return []
13836 kshitij.so 984
 
14761 kshitij.so 985
def getCashBack(skuId, source_id, category_id):
17469 kshitij.so 986
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14761 kshitij.so 987
        populateCashBack()
988
    itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 989
    itemCashBack = itemCashBackMap.get(skuId)
990
    if itemCashBack is not None:
991
        return itemCashBack
14761 kshitij.so 992
    cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 993
    sourceCashBack = cashBackMap.get(source_id)
994
    if sourceCashBack is not None and len(sourceCashBack) > 0:
995
        for cashBack in sourceCashBack:
996
            if cashBack.get(category_id) is None:
997
                continue
998
            else:
999
                return cashBack.get(category_id)
1000
    else:
1001
        return {}
16560 amit.gupta 1002
 
1003
def getBundleBySourceSku(source_id, identifier):
17035 kshitij.so 1004
    if source_id in (1,2,4,5,6,7):
16560 amit.gupta 1005
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
1006
    elif source_id == 3:
1007
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
1008
    else:
1009
        return {}
1010
 
1011
    if not skuData:
1012
        return {}
1013
    else:
16564 amit.gupta 1014
        bundleId = skuData[0]["skuBundleId"]
17035 kshitij.so 1015
        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 1016
                       {"source_id":1, "available_price":1, "marketPlaceUrl":1, "gross_price":1, "codAvailable":1, "source_product_name":1, "offer":1, "coupon":1}))
16579 amit.gupta 1017
        return {'products':itemIds}
16560 amit.gupta 1018
 
1019
 
13921 kshitij.so 1020
 
15129 kshitij.so 1021
def getDealRank(identifier, source_id, userId):
17035 kshitij.so 1022
    if source_id in (1,2,4,5,6,7):
15129 kshitij.so 1023
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
1024
    elif source_id == 3:
1025
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
1026
    else:
16282 amit.gupta 1027
        return {'rank':0, 'description':'Source not valid','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15349 kshitij.so 1028
    if len(skuData) == 0:
16282 amit.gupta 1029
        return {'rank':0, 'description':'No matching product identifier found','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15129 kshitij.so 1030
    user_specific_deals = mc.get(str(userId))
1031
    if user_specific_deals is None:
1032
        __populateCache(userId)
1033
        user_specific_deals = mc.get(str(userId))
1034
    else:
1035
        print "Getting user deals from cache"
1036
    category_id = skuData[0]['category_id']
1037
    category_specific_deals = user_specific_deals.get(category_id)
16280 kshitij.so 1038
 
1039
    dealsData = get_mongo_connection().Catalog.Deals.find_one({'skuBundleId':skuData[0]['skuBundleId']})
1040
    if dealsData is None:
1041
        dealsData = {}
1042
 
15129 kshitij.so 1043
    if category_specific_deals is None or len(category_specific_deals) ==0:
16280 kshitij.so 1044
        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 1045
    sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
16168 kshitij.so 1046
    sortedMap = {}
1047
    rankMap = {}
1048
    rank = 0
15129 kshitij.so 1049
    for sorted_deal in sorted_deals:
16168 kshitij.so 1050
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
1051
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1052
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1053
            rank = rank +1
1054
        else:
1055
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1056
                temp_list.append(sorted_deal)
1057
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1058
 
16187 kshitij.so 1059
    for dealRank ,dealList in rankMap.iteritems():
16168 kshitij.so 1060
        for d in dealList:
16186 kshitij.so 1061
            if d['skuBundleId'] == skuData[0]['skuBundleId']:
16280 kshitij.so 1062
                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 1063
 
16280 kshitij.so 1064
    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 1065
 
1066
 
13836 kshitij.so 1067
def getCashBackDetails(identifier, source_id):
17469 kshitij.so 1068
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
13921 kshitij.so 1069
        populateCashBack()
13771 kshitij.so 1070
 
17035 kshitij.so 1071
    if source_id in (1,2,4,5,6,7):
13839 kshitij.so 1072
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1073
    elif source_id == 3:
13839 kshitij.so 1074
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1075
    else:
1076
        return {}
13836 kshitij.so 1077
    if len(skuData) > 0:
14761 kshitij.so 1078
        itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 1079
        itemCashBack = itemCashBackMap.get(skuData[0]['_id'])
1080
        if itemCashBack is not None:
1081
            return itemCashBack
14761 kshitij.so 1082
        cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 1083
        sourceCashBack = cashBackMap.get(source_id)
1084
        if sourceCashBack is not None and len(sourceCashBack) > 0:
1085
            for cashBack in sourceCashBack:
1086
                if cashBack.get(skuData[0]['category_id']) is None:
1087
                    continue
1088
                else:
1089
                    return cashBack.get(skuData[0]['category_id'])
13836 kshitij.so 1090
        else:
1091
            return {} 
1092
    else:
1093
        return {}
13986 amit.gupta 1094
 
14398 amit.gupta 1095
def getImgSrc(identifier, source_id):
1096
    skuData = None
17035 kshitij.so 1097
    if source_id in (1,2,4,5,6,7):
14414 amit.gupta 1098
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1099
    elif source_id == 3:
14414 amit.gupta 1100
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1101
    if skuData is None:
1102
        return {}
1103
    else:
16483 kshitij.so 1104
        try:
1105
            return {'thumbnail':skuData.get('thumbnail').strip()}
1106
        except:
1107
            return {'thumbnail':skuData.get('thumbnail')}
13986 amit.gupta 1108
 
1109
def next_weekday(d, weekday):
1110
    days_ahead = weekday - d.weekday()
1111
    if days_ahead <= 0: # Target day already happened this week
1112
        days_ahead += 7
1113
    return d + timedelta(days_ahead)
1114
 
13771 kshitij.so 1115
 
13970 kshitij.so 1116
def getAllDealerPrices(offset, limit):
1117
    data = []
1118
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1119
    cursor = collection.find().skip(offset).limit(limit)
1120
    for val in cursor:
15853 kshitij.so 1121
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
1122
        if master is not None:
1123
            val['brand'] = master['brand']
1124
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 1125
        else:
1126
            val['brand'] = ""
1127
            val['source_product_name'] = ""
16231 kshitij.so 1128
        val['showDp'] = int(val['showDp'])
13970 kshitij.so 1129
        data.append(val)
1130
    return data
1131
 
15853 kshitij.so 1132
def addSkuDealerPrice(data):
1133
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1134
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
1135
    if cursor is not None:
1136
        return {0:"BundleId information already present."}
13970 kshitij.so 1137
    else:
15853 kshitij.so 1138
        collection.insert(data)
1139
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1140
        return {1:"Data added successfully"}
1141
 
1142
def updateSkuDealerPrice(data, _id):
1143
    try:
1144
        collection = get_mongo_connection().Catalog.SkuDealerPrices
1145
        collection.update({'_id':ObjectId(_id)},{"$set":{'dp':data['dp']}},upsert=False, multi = False)
15853 kshitij.so 1146
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1147
        return {1:"Data updated successfully"}
1148
    except:
1149
        return {0:"Data not updated."}
1150
 
1151
def updateExceptionalNlc(data, _id):
1152
    try:
1153
        collection = get_mongo_connection().Catalog.ExceptionalNlc
1154
        collection.update({'_id':ObjectId(_id)},{"$set":{'maxNlc':data['maxNlc'], 'minNlc':data['minNlc'], 'overrideNlc':data['overrideNlc']}},upsert=False, multi = False)
15853 kshitij.so 1155
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1156
        return {1:"Data updated successfully"}
1157
    except:
1158
        return {0:"Data not updated."}
1159
 
14041 kshitij.so 1160
def resetCache(userId):
14043 kshitij.so 1161
    try:
1162
        mc.delete(userId)
1163
        return {1:'Cache cleared.'}
1164
    except:
1165
        return {0:'Unable to clear cache.'}
1166
 
15853 kshitij.so 1167
def updateCollection(data):
14083 kshitij.so 1168
    print data
15853 kshitij.so 1169
    try:
1170
        collection = get_mongo_connection().Catalog[data['class']]
1171
        class_name = data.pop('class')
1172
        _id = data.pop('oid')
1173
        result = collection.update({'_id':ObjectId(_id)},{"$set":data},upsert=False, multi = False)
1174
        if class_name != "Notifications":
1175
            record = list(collection.find({'_id':ObjectId(_id)}))
1176
            if class_name !="CategoryDiscount":
1177
                if record[0].has_key('sku'):
1178
                    field = '_id'
1179
                    val = record[0]['sku']
14852 kshitij.so 1180
                else:
15853 kshitij.so 1181
                    field = 'skuBundleId'
1182
                    val = record[0]['skuBundleId']
1183
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False, multi = True)
1184
            else:
1185
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1186
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
16233 kshitij.so 1187
        if class_name =='SkuDealerPrices':
16237 kshitij.so 1188
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':val},{"$set":data},upsert=False, multi=True)
15853 kshitij.so 1189
        return {1:"Data updated successfully"}
1190
    except Exception as e:
1191
        print e
1192
        return {0:"Data not updated."}
14575 kshitij.so 1193
 
14076 kshitij.so 1194
 
14553 kshitij.so 1195
def addNegativeDeals(data, multi):
1196
    if multi !=1: 
1197
        collection = get_mongo_connection().Catalog.NegativeDeals
1198
        cursor = collection.find({"sku":data['sku']})
1199
        if cursor.count() > 0:
1200
            return {0:"Sku information already present."}
1201
        else:
1202
            collection.insert(data)
1203
            return {1:"Data added successfully"}
14481 kshitij.so 1204
    else:
14553 kshitij.so 1205
        skuIds = __getBundledSkusfromSku(data['sku'])
1206
        for sku in skuIds:
1207
            data['sku'] = sku.get('_id')
1208
            collection = get_mongo_connection().Catalog.NegativeDeals
1209
            cursor = collection.find({"sku":data['sku']})
1210
            if cursor.count() > 0:
1211
                continue
1212
            else:
14558 kshitij.so 1213
                data.pop('_id',None)
14553 kshitij.so 1214
                collection.insert(data)
14481 kshitij.so 1215
        return {1:"Data added successfully"}
1216
 
1217
def getAllNegativeDeals(offset, limit):
1218
    data = []
1219
    collection = get_mongo_connection().Catalog.NegativeDeals
1220
    cursor = collection.find().skip(offset).limit(limit)
1221
    for val in cursor:
1222
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1223
        if len(master) > 0:
1224
            val['brand'] = master[0]['brand']
1225
            val['source_product_name'] = master[0]['source_product_name']
1226
            val['skuBundleId'] = master[0]['skuBundleId']
1227
        else:
1228
            val['brand'] = ""
1229
            val['source_product_name'] = ""
1230
            val['skuBundleId'] = ""
1231
        data.append(val)
1232
    return data
1233
 
1234
def getAllManualDeals(offset, limit):
1235
    data = []
1236
    collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1237
    cursor = collection.find().skip(offset).limit(limit)
14481 kshitij.so 1238
    for val in cursor:
1239
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1240
        if len(master) > 0:
1241
            val['brand'] = master[0]['brand']
1242
            val['source_product_name'] = master[0]['source_product_name']
1243
            val['skuBundleId'] = master[0]['skuBundleId']
1244
        else:
1245
            val['brand'] = ""
1246
            val['source_product_name'] = ""
1247
            val['skuBundleId'] = ""
1248
        data.append(val)
1249
    return data
14076 kshitij.so 1250
 
14553 kshitij.so 1251
def addManualDeal(data, multi):
1252
    if multi !=1:
1253
        collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1254
        cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1255
        if cursor.count() > 0:
1256
            return {0:"Sku information already present."}
1257
        else:
1258
            collection.insert(data)
1259
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
1260
            return {1:"Data added successfully"}
14481 kshitij.so 1261
    else:
14553 kshitij.so 1262
        skuIds = __getBundledSkusfromSku(data['sku'])
1263
        for sku in skuIds:
1264
            data['sku'] = sku.get('_id')
1265
            collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1266
            cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1267
            if cursor.count() > 0:
1268
                continue
1269
            else:
14558 kshitij.so 1270
                data.pop('_id',None)
14553 kshitij.so 1271
                collection.insert(data)
1272
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14481 kshitij.so 1273
        return {1:"Data added successfully"}
14553 kshitij.so 1274
 
14481 kshitij.so 1275
def deleteDocument(data):
15853 kshitij.so 1276
    print "inside detete document"
14481 kshitij.so 1277
    print data
1278
    try:
1279
        collection = get_mongo_connection().Catalog[data['class']]
1280
        class_name = data.pop('class')
1281
        _id = data.pop('oid')
1282
        record = list(collection.find({'_id':ObjectId(_id)}))
1283
        collection.remove({'_id':ObjectId(_id)})
15075 kshitij.so 1284
        if class_name != "Notifications":
1285
            if class_name !="CategoryDiscount":
15853 kshitij.so 1286
                print record[0]
1287
                if record[0].has_key('sku'):
1288
                    field = '_id'
1289
                    val = record[0]['sku']
1290
                else:
1291
                    field = 'skuBundleId'
1292
                    val = record[0]['skuBundleId']
1293
                print "Updating master"
1294
                print field
1295
                print val
1296
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
15075 kshitij.so 1297
            else:
1298
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1299
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
14481 kshitij.so 1300
        return {1:"Document deleted successfully"}
1301
    except Exception as e:
1302
        print e
1303
        return {0:"Document not deleted."}
13970 kshitij.so 1304
 
14482 kshitij.so 1305
def searchMaster(offset, limit, search_term):
1306
    data = []
14531 kshitij.so 1307
    if search_term is not None:
14551 kshitij.so 1308
        terms = search_term.split(' ')
1309
        outer_query = []
1310
        for term in terms:
1311
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
14531 kshitij.so 1312
        try:
14551 kshitij.so 1313
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14531 kshitij.so 1314
            for record in collection:
1315
                data.append(record)
1316
        except:
1317
            pass
1318
    else:
1319
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14482 kshitij.so 1320
        for record in collection:
1321
            data.append(record)
1322
    return data
14481 kshitij.so 1323
 
14495 kshitij.so 1324
def getAllFeaturedDeals(offset, limit):
1325
    data = []
1326
    collection = get_mongo_connection().Catalog.FeaturedDeals
17561 kshitij.so 1327
    cursor = collection.find({}).skip(offset).limit(limit)
14495 kshitij.so 1328
    for val in cursor:
17367 kshitij.so 1329
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14495 kshitij.so 1330
        if len(master) > 0:
1331
            val['brand'] = master[0]['brand']
1332
            val['source_product_name'] = master[0]['source_product_name']
1333
            val['skuBundleId'] = master[0]['skuBundleId']
1334
        else:
1335
            val['brand'] = ""
1336
            val['source_product_name'] = ""
1337
            val['skuBundleId'] = ""
1338
        data.append(val)
1339
    return data
1340
 
14553 kshitij.so 1341
def addFeaturedDeal(data, multi):
17367 kshitij.so 1342
    collection = get_mongo_connection().Catalog.FeaturedDeals
1343
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1344
    master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':data['skuBundleId']})
1345
    if master is None:
1346
        return {0:"BundleId is wrong"}
17469 kshitij.so 1347
    otherInfoObj = data['otherInfo']
1348
    toPop = []
1349
    for x,y in otherInfoObj.iteritems():
1350
        if y==0:
1351
            toPop.append(x)
1352
 
1353
    for popItem in toPop:
1354
        otherInfoObj.pop(popItem)
1355
    if len(otherInfoObj.keys())==0:
1356
        return {0:"No rank info to add"}
1357
 
1358
    for x,y in otherInfoObj.iteritems():
1359
        exist = get_mongo_connection().Catalog.FeaturedDeals.find({'otherInfo.'+x:y})
1360
        if exist.count() >0:
1361
            return {0:"Rank already assigned bundleId %s"%(exist[0]['skuBundleId'])}
17367 kshitij.so 1362
    if cursor.count() > 0:
1363
        return {0:"SkuBundleId information already present."}
14495 kshitij.so 1364
    else:
17367 kshitij.so 1365
        collection.insert(data)
14495 kshitij.so 1366
        return {1:"Data added successfully"}
1367
 
14499 kshitij.so 1368
def searchCollection(class_name, sku, skuBundleId):
14497 kshitij.so 1369
    data = []
1370
    collection = get_mongo_connection().Catalog[class_name]
15076 kshitij.so 1371
    if class_name == "Notifications":
1372
        cursor = collection.find({'skuBundleId':skuBundleId})
1373
        for val in cursor:
1374
            master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
1375
            if len(master) > 0:
1376
                val['brand'] = master[0]['brand']
1377
                val['model_name'] = master[0]['model_name']
1378
                val['skuBundleId'] = master[0]['skuBundleId']
1379
            else:
1380
                val['brand'] = ""
1381
                val['model_name'] = ""
1382
                val['skuBundleId'] = val['skuBundleId']
1383
            data.append(val)
15095 kshitij.so 1384
        return data
15853 kshitij.so 1385
    master = None
14499 kshitij.so 1386
    if sku is not None:
15853 kshitij.so 1387
        if COLLECTION_MAP.has_key(class_name):
1388
            master = get_mongo_connection().Catalog.MasterData.find_one({'_id':sku})
1389
            cursor = collection.find({'skuBundleId':master['skuBundleId']})
1390
        else:
1391
            cursor = collection.find({'sku':sku})
14499 kshitij.so 1392
        for val in cursor:
15853 kshitij.so 1393
            if master is None:
1394
                master = get_mongo_connection().Catalog.MasterData.find_one({'_id':val['sku']})
1395
            if master is not None:
1396
                val['brand'] = master['brand']
1397
                val['source_product_name'] = master['source_product_name']
1398
                val['skuBundleId'] = master['skuBundleId']
14499 kshitij.so 1399
            else:
1400
                val['brand'] = ""
1401
                val['source_product_name'] = ""
1402
                val['skuBundleId'] = ""
1403
            data.append(val)
1404
        return data
1405
    else:
15853 kshitij.so 1406
        if not COLLECTION_MAP.has_key(class_name):
1407
            skuIds = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId}).distinct('_id')
1408
            for sku in skuIds:
1409
                cursor = collection.find({'sku':sku})
1410
                for val in cursor:
1411
                    master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1412
                    if len(master) > 0:
1413
                        val['brand'] = master[0]['brand']
1414
                        val['source_product_name'] = master[0]['source_product_name']
1415
                        val['skuBundleId'] = master[0]['skuBundleId']
1416
                    else:
1417
                        val['brand'] = ""
1418
                        val['source_product_name'] = ""
1419
                        val['skuBundleId'] = ""
1420
                    data.append(val)
1421
            return data
1422
        else:
1423
            cursor = collection.find({'skuBundleId':skuBundleId})
14499 kshitij.so 1424
            for val in cursor:
15853 kshitij.so 1425
                master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14499 kshitij.so 1426
                if len(master) > 0:
1427
                    val['brand'] = master[0]['brand']
1428
                    val['source_product_name'] = master[0]['source_product_name']
1429
                else:
1430
                    val['brand'] = ""
1431
                    val['source_product_name'] = ""
1432
                data.append(val)
15853 kshitij.so 1433
            return data
14495 kshitij.so 1434
 
15074 kshitij.so 1435
def __getBrandIdForBrand(brandName, category_id):
1436
    brandInfo = Brands.query.filter(Brands.category_id==category_id).filter(Brands.name == brandName).all()
1437
    if brandInfo is None or len(brandInfo)!=1:
1438
        raise
1439
    else:
1440
        return brandInfo[0].id
1441
 
14588 kshitij.so 1442
def addNewItem(data):
14594 kshitij.so 1443
    try:
1444
        data['updatedOn'] = to_java_date(datetime.now())
1445
        data['addedOn'] = to_java_date(datetime.now())
1446
        data['priceUpdatedOn'] = to_java_date(datetime.now())
1447
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
1448
        max_bundle = list(get_mongo_connection().Catalog.MasterData.find().sort([('skuBundleId',pymongo.DESCENDING)]).limit(1))
1449
        data['_id'] = max_id[0]['_id'] + 1
1450
        data['skuBundleId'] = max_bundle[0]['skuBundleId'] + 1
1451
        data['identifier'] = str(data['identifier'])
1452
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1453
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1454
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17746 kshitij.so 1455
        data['shippingCost'] = float(data['shippingCost'])
17603 kshitij.so 1456
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1457
            return {0:'Sub-Category not selected'}
17608 kshitij.so 1458
        elif data['category_id'] !=6 and data['subCategoryId'] !=0:
1459
            return {0:'Sub-Category not valid'}
1460
        else:
1461
            pass
17604 kshitij.so 1462
        data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
14594 kshitij.so 1463
        get_mongo_connection().Catalog.MasterData.insert(data)
1464
        return {1:'Data added successfully'}
1465
    except Exception as e:
1466
        print e
1467
        return {0:'Unable to add data.'}
15130 kshitij.so 1468
    finally:
1469
        session.close()
14588 kshitij.so 1470
 
1471
def addItemToExistingBundle(data):
1472
    try:
1473
        data['updatedOn'] = to_java_date(datetime.now())
1474
        data['addedOn'] = to_java_date(datetime.now())
1475
        data['priceUpdatedOn'] = to_java_date(datetime.now())
14593 kshitij.so 1476
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
14590 kshitij.so 1477
        data['_id'] = max_id[0]['_id'] + 1
14594 kshitij.so 1478
        data['identifier'] = str(data['identifier'])
1479
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1480
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1481
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17746 kshitij.so 1482
        data['shippingCost'] = float(data['shippingCost'])
17603 kshitij.so 1483
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1484
            return {0:'Sub-Category not selected'}
17608 kshitij.so 1485
        elif data['category_id'] !=6 and data['subCategoryId'] !=0:
1486
            return {0:'Sub-Category not valid'}
1487
        else:
1488
            pass
17604 kshitij.so 1489
        data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
14588 kshitij.so 1490
        get_mongo_connection().Catalog.MasterData.insert(data)
1491
        return {1:'Data added successfully.'}
14594 kshitij.so 1492
    except Exception as e:
1493
        print e
14588 kshitij.so 1494
        return {0:'Unable to add data.'}
15130 kshitij.so 1495
    finally:
1496
        session.close()
14588 kshitij.so 1497
 
1498
def updateMaster(data, multi):
15130 kshitij.so 1499
    try:
1500
        print data
1501
        if multi != 1:
1502
            _id = data.pop('_id')
1503
            skuBundleId = data.pop('skuBundleId')
1504
            data['updatedOn'] = to_java_date(datetime.now())
1505
            data['identifier'] = str(data['identifier'])
1506
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1507
            data['model_name'] = str(data['model_name'])
17746 kshitij.so 1508
            data['shippingCost'] = float(data['shippingCost'])
15130 kshitij.so 1509
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 1510
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1511
                return {0:'Sub-Category not selected'}
17608 kshitij.so 1512
            elif data['category_id'] !=6 and data['subCategoryId'] !=0:
1513
                return {0:'Sub-Category not valid'}
1514
            else:
1515
                pass
17604 kshitij.so 1516
            data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
15130 kshitij.so 1517
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1518
            return {1:'Data updated successfully.'}
1519
        else:
1520
            _id = data.pop('_id')
1521
            skuBundleId = data.pop('skuBundleId')
1522
            data['updatedOn'] = to_java_date(datetime.now())
1523
            data['identifier'] = str(data['identifier'])
1524
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
1525
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17115 manish.sha 1526
            data['model_name'] = str(data['model_name'])
17746 kshitij.so 1527
            data['shippingCost'] = float(data['shippingCost'])
17603 kshitij.so 1528
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1529
                return {0:'Sub-Category not selected'}
17608 kshitij.so 1530
            elif data['category_id'] !=6 and data['subCategoryId'] !=0:
1531
                return {0:'Sub-Category not valid'}
1532
            else:
1533
                pass
17604 kshitij.so 1534
            data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
15130 kshitij.so 1535
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1536
            similarItems = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId})
1537
            for item in similarItems:
1538
                if item['_id'] == _id:
1539
                    continue
1540
                item['updatedOn'] = to_java_date(datetime.now())
1541
                item['thumbnail'] = data['thumbnail']
1542
                item['category'] = data['category']
1543
                item['category_id'] = data['category_id']
1544
                item['tagline'] = data['tagline']
1545
                item['is_shortage'] = data['is_shortage']
1546
                item['mrp'] = data['mrp']
1547
                item['status'] = data['status']
1548
                item['maxPrice'] = data['maxPrice']
1549
                item['brand_id'] = data['brand_id']
17603 kshitij.so 1550
                item['subCategoryId'] = data['subCategoryId']
1551
                item['subCategory'] = data['subCategory']
15130 kshitij.so 1552
                similar_item_id = item.pop('_id')
1553
                get_mongo_connection().Catalog.MasterData.update({'_id':similar_item_id},{"$set":item},upsert=False)
1554
            return {1:'Data updated successfully.'}
17603 kshitij.so 1555
    except:
1556
        return {0:'Unable to update data'}
15130 kshitij.so 1557
    finally:
1558
        session.close()
14619 kshitij.so 1559
 
1560
def getLiveCricScore():
1561
    return mc.get('liveScore')
14852 kshitij.so 1562
 
1563
def addBundleToNotification(data):
1564
    try:
15069 kshitij.so 1565
        collection = get_mongo_connection().Catalog.Notifications
14852 kshitij.so 1566
        cursor = collection.find({'skuBundleId':data['skuBundleId']})
1567
        if cursor.count() > 0:
1568
            return {0:"SkuBundleId information already present."}
1569
        else:
1570
            collection.insert(data)
1571
            return {1:'Data updated successfully.'}
1572
    except:
1573
        return {0:'Unable to add data.'}
1574
 
1575
def getAllNotifications(offset, limit):
1576
    data = []
15069 kshitij.so 1577
    collection = get_mongo_connection().Catalog.Notifications
16450 kshitij.so 1578
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
14852 kshitij.so 1579
    for val in cursor:
15072 kshitij.so 1580
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14852 kshitij.so 1581
        if len(master) > 0:
1582
            val['brand'] = master[0]['brand']
15071 kshitij.so 1583
            val['model_name'] = master[0]['model_name']
14852 kshitij.so 1584
            val['skuBundleId'] = master[0]['skuBundleId']
1585
        else:
1586
            val['brand'] = ""
15071 kshitij.so 1587
            val['model_name'] = ""
1588
            val['skuBundleId'] = val['skuBundleId']
14852 kshitij.so 1589
        data.append(val)
1590
    return data
14997 kshitij.so 1591
 
1592
def getBrandsForFilter(category_id):
1593
    if mc.get("brandFilter") is None:
15095 kshitij.so 1594
        print "Populating brand data for category_id %d" %(category_id)
17469 kshitij.so 1595
        tabData, mobData, accData = [], [], []
14997 kshitij.so 1596
        mobileDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1597
                                                                      {"$match":{"category_id":3,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1598
                                                                    },
1599
                                                                 {"$group" : 
1600
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1601
                                                                  }
1602
                                                                ])
14588 kshitij.so 1603
 
14997 kshitij.so 1604
        tabletDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1605
                                                                      {"$match":{"category_id":5,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1606
                                                                    },
1607
                                                                 {"$group" : 
1608
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1609
                                                                  }
1610
                                                                ])
1611
 
17469 kshitij.so 1612
        accessoriesDeals = get_mongo_connection().Catalog.Deals.aggregate([
1613
                                                                      {"$match":{"category_id":6,"showDeal":1,"totalPoints":{"$gt":-100}}
1614
                                                                    },
1615
                                                                 {"$group" : 
1616
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1617
                                                                  }
1618
                                                                ])
1619
 
14997 kshitij.so 1620
        allDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1621
                                                                   {"$match":{"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1622
                                                                    },
1623
                                                                 {"$group" : 
1624
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1625
                                                                  }
1626
                                                                ])
1627
        #print mobileDeals
1628
        #print "==========Mobile data ends=========="
1629
 
1630
        #print tabletDeals
1631
        #print "==========Tablet data ends=========="
1632
 
1633
        #print allDeals
1634
        #print "==========All deal data ends========="
1635
 
1636
        for mobileDeal in mobileDeals['result']:
1637
            if mobileDeal.get('_id').get('brand_id') != 0:
1638
                tempMap = {}
1639
                tempMap['brand'] = mobileDeal.get('_id').get('brand')
1640
                tempMap['brand_id'] = mobileDeal.get('_id').get('brand_id')
1641
                tempMap['count'] = mobileDeal.get('count')
1642
                mobData.append(tempMap)
1643
 
1644
        for tabletDeal in tabletDeals['result']:
1645
            if tabletDeal.get('_id').get('brand_id') != 0:
1646
                tempMap = {}
1647
                tempMap['brand'] = tabletDeal.get('_id').get('brand')
1648
                tempMap['brand_id'] = tabletDeal.get('_id').get('brand_id')
1649
                tempMap['count'] = tabletDeal.get('count')
1650
                tabData.append(tempMap)
1651
 
17469 kshitij.so 1652
        for accessoryDeal in accessoriesDeals['result']:
1653
            if accessoryDeal.get('_id').get('brand_id') != 0:
1654
                tempMap = {}
1655
                tempMap['brand'] = accessoryDeal.get('_id').get('brand')
1656
                tempMap['brand_id'] = accessoryDeal.get('_id').get('brand_id')
1657
                tempMap['count'] = accessoryDeal.get('count')
1658
                accData.append(tempMap)
14997 kshitij.so 1659
 
17469 kshitij.so 1660
 
14997 kshitij.so 1661
        brandMap = {}
1662
        for allDeal in allDeals['result']:
1663
            if allDeal.get('_id').get('brand_id') != 0:
1664
                if brandMap.has_key(allDeal.get('_id').get('brand')):
15002 kshitij.so 1665
                    brand_ids = brandMap.get(allDeal.get('_id').get('brand')).get('brand_ids')
14997 kshitij.so 1666
                    brand_ids.append(allDeal.get('_id').get('brand_id'))
15003 kshitij.so 1667
                    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 1668
                else:
1669
                    temp = []
1670
                    temp.append(allDeal.get('_id').get('brand_id'))
15002 kshitij.so 1671
                    brandMap[allDeal.get('_id').get('brand')] = {'brand_ids':temp,'count':allDeal.get('count')}
14997 kshitij.so 1672
 
17469 kshitij.so 1673
        mc.set("brandFilter",{0:brandMap, 3:mobData, 5:tabData, 6:accData}, 600)  
14997 kshitij.so 1674
 
15062 kshitij.so 1675
    return sorted(mc.get("brandFilter").get(category_id), key = lambda x: (-x['count'], x['brand']))
15375 kshitij.so 1676
 
15459 kshitij.so 1677
def getStaticDeals(offset, limit, category_id, direction):
15375 kshitij.so 1678
    user_specific_deals = mc.get("staticDeals")
1679
    if user_specific_deals is None:
1680
        __populateStaticDeals()
1681
        user_specific_deals = mc.get("staticDeals")
15459 kshitij.so 1682
    rev = False
1683
    if direction is None or direction == -1:
1684
        rev=True
1685
    return sorted((user_specific_deals.get(category_id))[offset:offset+limit],reverse=rev)
15375 kshitij.so 1686
 
1687
def __populateStaticDeals():
1688
    print "Populating memcache for static deals"
1689
    outer_query = []
1690
    outer_query.append({"showDeal":1})
1691
    query = {}
16170 kshitij.so 1692
    query['$gt'] = -100
15375 kshitij.so 1693
    outer_query.append({'totalPoints':query})
1694
    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)]))
1695
    mobile_deals = []
1696
    tablet_deals = []
1697
    for deal in all_deals:
1698
        item = get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']})
1699
        if deal['category_id'] ==3:
1700
            mobile_deals.append(getItemObjForStaticDeals(item[0]))
1701
        elif deal['category_id'] ==5:
1702
            tablet_deals.append(getItemObjForStaticDeals(item[0]))
1703
        else:
1704
            continue
1705
 
1706
    random.shuffle(mobile_deals,random.random)
1707
    random.shuffle(tablet_deals,random.random)
1708
 
1709
    mem_cache_val = {3:mobile_deals, 5:tablet_deals}
1710
    mc.set("staticDeals", mem_cache_val, 3600)
1711
 
17733 kshitij.so 1712
def getItemObjForStaticDeals(item,transform=None):
1713
    mpu = str(item.get('marketPlaceUrl'))
1714
    if transform:
1715
        if mpu.find("snapdeal")!=-1:
1716
            mpu = "http://m.snapdeal.com"+mpu[mpu.find("/product"):]
1717
        elif mpu.find("homeshop18")!=-1:
1718
            mpu = "http://m.homeshop18.com/product.mobi?productId="+item['identifier']
17735 kshitij.so 1719
        elif mpu.find("saholic.com")!=-1:
17746 kshitij.so 1720
            mpu = "http://m."+mpu[mpu.find("saholic.com"):]
17735 kshitij.so 1721
        elif mpu.find("shopclues.com")!=-1:
17733 kshitij.so 1722
            mpu = "http://m."+mpu[mpu.find("shopclues.com"):]
1723
        else:
1724
            pass
1725
 
1726
    return {'marketPlaceUrl':mpu,'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 1727
 
1728
def getItemByMerchantIdentifier(identifier, source_id):
1729
    skuData = None
17035 kshitij.so 1730
    if source_id in (1,2,4,5,6,7):
16300 manas 1731
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
1732
    elif source_id == 3:
1733
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
1734
    if skuData is None:
1735
        return {}
1736
    else:
1737
        return skuData
15375 kshitij.so 1738
 
16364 kshitij.so 1739
def getDealsForNotification(skuBundleIds):
1740
    bundles= [int(skuBundleId) for skuBundleId in skuBundleIds.split(',')]
1741
    print bundles
16406 kshitij.so 1742
    dealsList = []
16364 kshitij.so 1743
    dealsListMap = []
16406 kshitij.so 1744
    for bundleId in bundles:
1745
        outer_query = []
1746
        outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
1747
        outer_query.append({'skuBundleId':bundleId})
1748
        deals = get_mongo_connection().Catalog.Deals.find({"$and":outer_query})
1749
        for deal in deals:
1750
            dealsList.append(deal)
16364 kshitij.so 1751
    sortedMap = {}
1752
    rankMap = {}
1753
    rank = 0
16406 kshitij.so 1754
    for sorted_deal in dealsList:
16364 kshitij.so 1755
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
1756
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1757
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1758
            rank = rank +1
1759
        else:
1760
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1761
                temp_list.append(sorted_deal)
1762
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1763
 
16367 kshitij.so 1764
    for dealList in [rankMap.get(k, []) for k in range(0, len(bundles))]:
16364 kshitij.so 1765
        temp = []
1766
        for d in dealList:
1767
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
1768
            if len(item) ==0:
1769
                continue
1770
            if d['dealType'] == 1 and d['source_id'] ==1:
1771
                item[0]['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(item[0]['identifier'].strip())
1772
            elif d['source_id'] ==3:
1773
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
1774
            else:
1775
                pass 
1776
            try:
1777
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
1778
                if not cashBack or cashBack.get('cash_back_status')!=1:
1779
                    item[0]['cash_back_type'] = 0
1780
                    item[0]['cash_back'] = 0
1781
                else:
1782
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
1783
                    item[0]['cash_back'] = cashBack['cash_back']
1784
            except:
1785
                print "Error in adding cashback to deals"
1786
                item[0]['cash_back_type'] = 0
1787
                item[0]['cash_back'] = 0
1788
            try:
1789
                item[0]['dp'] = d['dp']
1790
                item[0]['showDp'] = d['showDp']
1791
            except:
1792
                item[0]['dp'] = 0.0
1793
                item[0]['showDp'] = 0
17727 kshitij.so 1794
 
1795
            try:
1796
                if item[0]['showVideo']==0:
1797
                    item[0]['videoLink'] =""
1798
            except:
1799
                item[0]['videoLink'] =""
1800
            try:
1801
                if item[0]['quantity'] >1:
1802
                    ppq = float(item[0]['available_price'])/item[0]['quantity']
1803
 
1804
                    if ppq == round(ppq):
1805
                        item[0]['ppq'] = int(ppq)
1806
                    else:
1807
                        item[0]['ppq'] = round(ppq,2)
1808
                    item[0]['tagline'] = ""
1809
                else:
1810
                    item[0]['ppq'] = 0
1811
            except:
1812
                item[0]['ppq'] = 0
1813
 
1814
            if item[0]['category_id']!=6:
1815
                try:
1816
                    item[0]['filterLink'] = '/category/'+str(int(item[0]['category_id']))+'?filter=brand&brands='+str(int(item[0]['brand_id']))
1817
                    item[0]['filterText'] = 'More %s items'%(item[0]['brand'])
1818
                except:
1819
                    item[0]['filterLink'] = ""
1820
                    item[0]['filterText'] = ""
1821
            else:
1822
                try:
1823
                    if item[0]['subCategory']=='' or item[0]['subCategory'] is None or item[0]['subCategor']:
1824
                        raise
1825
                    item[0]['filterLink'] = '/category/'+str(int(item[0]['category_id']))+'?filter=subcategory&subcategories='+str(int(item[0]['subCategoryId']))
1826
                    item[0]['filterText'] = 'More %s'%(item[0]['subCategory'])
1827
                except:
1828
                    item[0]['filterLink'] = ''
1829
                    item[0]['filterText'] = ""
1830
 
16364 kshitij.so 1831
            temp.append(item[0])
1832
        if len(temp) > 1:
1833
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
1834
        dealsListMap.append(temp)
1835
    return dealsListMap
1836
 
16373 manas 1837
def getSkuBrandData(sku):
1838
    if sku is None:
1839
        return {}
1840
    else:
1841
        orders = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':sku})
1842
        if orders is None:
1843
            return {}
1844
        return orders
16488 kshitij.so 1845
 
1846
def addDealPoints(data):
1847
    collection = get_mongo_connection().Catalog.DealPoints
1848
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1849
    if cursor.count() > 0:
1850
        return {0:"Sku information already present."}
1851
    else:
1852
        collection.insert(data)
1853
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
1854
        return {1:"Data added successfully"}
1855
 
1856
def getAllBundlesWithDealPoints(offset, limit):
1857
    data = []
1858
    collection = get_mongo_connection().Catalog.DealPoints
1859
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
1860
    for val in cursor:
1861
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val.get('skuBundleId')})
1862
        if master is not None:
1863
            val['brand'] = master['brand']
1864
            val['source_product_name'] = master['product_name']
1865
        else:
1866
            val['brand'] = ""
1867
            val['source_product_name'] = ""
1868
        data.append(val)
1869
    return data
16546 kshitij.so 1870
 
1871
def generateRedirectUrl(retailer_id, app_id):
1872
    try:
16663 manish.sha 1873
        if retailer_id <= 0:
1874
            return {'url':"","message":"Retailer Id not valid"}
16546 kshitij.so 1875
        d_app_offer = app_offers.get_by(id=app_id)
16605 manish.sha 1876
    except:
1877
        traceback.print_exc()
16546 kshitij.so 1878
    finally:
1879
        session.close()
1880
    if d_app_offer is None:
1881
        return {'url':"","message":"App id doesn't exist"}
16364 kshitij.so 1882
 
16915 manish.sha 1883
    final_user_payout = 0
1884
    if d_app_offer.override_payout:
1885
        final_user_payout = d_app_offer.overriden_payout
1886
    else:
1887
        final_user_payout = d_app_offer.user_payout
16546 kshitij.so 1888
 
16915 manish.sha 1889
    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)
1890
 
16546 kshitij.so 1891
    get_mongo_connection().AppOrder.AppTransaction.insert(appTransactions.__dict__)
1892
    embedd = str((appTransactions.__dict__).get('_id'))
16548 kshitij.so 1893
    try:
1894
        index = d_app_offer.link.index(".freeb.co.in")
1895
    except:
16605 manish.sha 1896
        traceback.print_exc()
16548 kshitij.so 1897
        return {'url':"","message":"Substring not found"}
1898
    redirect_url = d_app_offer.link[0:index]+"."+embedd+d_app_offer.link[index:]
16546 kshitij.so 1899
    get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(embedd)},{"$set":{'redirect_url':redirect_url}})
16548 kshitij.so 1900
    return {'url':redirect_url,"message":"Success"}
16556 kshitij.so 1901
 
1902
def addPayout(payout, transaction_id):
1903
    try:
16764 manish.sha 1904
        print 'Got Response for Transaction Id:- '+ str(transaction_id)+ ' and Actual Payout:- '+str(payout)
16556 kshitij.so 1905
        transaction = list(get_mongo_connection().AppOrder.AppTransaction.find({'_id':ObjectId(transaction_id)}))
1906
        if len(transaction) > 0:
1907
            if (transaction[0])['payout_status'] ==1:
16753 manish.sha 1908
                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 1909
 
1910
                approvedAppTransaction = approved_app_transactions.get_by(transaction_id=transaction_id)
1911
                if approvedAppTransaction is None:
1912
                    approvedAppTransaction = approved_app_transactions()
16919 manish.sha 1913
                    approvedAppTransaction.app_id = transaction[0].get('app_id')
16782 manish.sha 1914
                    approvedAppTransaction.cash_back_description = CB_APPROVED
16919 manish.sha 1915
                    approvedAppTransaction.retailer_id = transaction[0].get('retailer_id')
16782 manish.sha 1916
                    approvedAppTransaction.transaction_id = transaction_id
16919 manish.sha 1917
                    approvedAppTransaction.transaction_time = to_py_date(long(transaction[0].get('transaction_time')))
1918
                    approvedAppTransaction.redirect_url = transaction[0].get('redirect_url')
16782 manish.sha 1919
                    approvedAppTransaction.payout_status = 2
1920
                    approvedAppTransaction.payout_description = CB_APPROVED
1921
                    approvedAppTransaction.cashback_status = 2 
1922
                    approvedAppTransaction.payout_amount = long(payout)
1923
                    approvedAppTransaction.payout_time = datetime.now()
16919 manish.sha 1924
                    approvedAppTransaction.offer_price = long(transaction[0].get('offer_price')) 
1925
                    approvedAppTransaction.overridenCashBack = transaction[0].get('overridenCashBack')
1926
                    approvedAppTransaction.isCashBackOverriden = transaction[0].get('isCashBackOverriden')
1927
                    approvedAppTransaction.user_payout = transaction[0].get('user_payout')
16782 manish.sha 1928
                    approvedAppTransaction.cashBackConsidered = False
16915 manish.sha 1929
                    if transaction[0].get('final_user_payout') is not None:
1930
                        approvedAppTransaction.final_user_payout = transaction[0].get('final_user_payout')
1931
                    else:
16919 manish.sha 1932
                        if transaction[0].get('isCashBackOverriden'):
1933
                            approvedAppTransaction.final_user_payout = transaction[0].get('overridenCashBack')
16915 manish.sha 1934
                        else:
16919 manish.sha 1935
                            approvedAppTransaction.final_user_payout = transaction[0].get('user_payout')
16782 manish.sha 1936
                    session.commit()
1937
 
1938
                    updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
16631 manish.sha 1939
                else:
16783 manish.sha 1940
                    approvedAppTransaction.payout_amount = long(payout)
1941
                    approvedAppTransaction.payout_time = datetime.now()
1942
                    if approvedAppTransaction.cashBackConsidered == False:
1943
                        updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
1944
                    session.commit()
16782 manish.sha 1945
 
1946
                    '''
1947
                    try:
1948
                        if int(transaction[0]['offer_price']) != payout or int(transaction[0]['user_payout']) < payout:
1949
                            _sendAlertForAppPayouts(int(transaction[0]['app_id']), int(transaction[0]['offer_price']), int(transaction[0]['user_payout']), payout)
1950
                    except:
1951
                        print traceback.print_exc()
1952
                    '''
16556 kshitij.so 1953
                return {'status':'ok','message':'Payout updated'}
1954
            elif (transaction[0])['payout_status'] ==2:
1955
                return {'status':'ok','message':'Payout already processed'}
1956
            else:
1957
                return {'status':'fail','message':'Something is wrong'}
1958
        else:
1959
            return {'status':'fail','message':'transaction_id not found'}
1960
    except:
16657 manish.sha 1961
        print traceback.print_exc()
16631 manish.sha 1962
        try:
16753 manish.sha 1963
            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 1964
        except:
1965
            print 'Data Inconsistency in Cashback Process'
16636 manish.sha 1966
            print traceback.print_exc()
16559 kshitij.so 1967
        return  {'status':'fail','message':'Something is wrong'}
16885 kshitij.so 1968
    finally:
1969
        session.close()
16556 kshitij.so 1970
 
16631 manish.sha 1971
def _updateApprovedCashbackToUser(approvedAppTransactionId):
1972
    approvedAppTransaction = approved_app_transactions.get_by(id=approvedAppTransactionId)
16915 manish.sha 1973
    if approvedAppTransaction.retailer_id < 0:
1974
        return False
1975
 
16631 manish.sha 1976
    currentMonth = datetime.today().month
1977
    currentDay = datetime.today().day
1978
    currentYear = datetime.today().year
1979
    fortNight = (currentMonth - 1)*2 + (currentDay/15)
1980
    if currentDay == 30 or currentDay ==31:
1981
        fortNight = fortNight-1
1982
    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()
1983
    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()
1984
    try:
1985
        if userAppCashbackObj is None:
1986
            userAppCashbackObj = user_app_cashbacks()
1987
            userAppCashbackObj.user_id = approvedAppTransaction.retailer_id
1988
            userAppCashbackObj.status = 'Approved'
16915 manish.sha 1989
            userAppCashbackObj.amount = approvedAppTransaction.final_user_payout
16631 manish.sha 1990
            userAppCashbackObj.fortnightOfYear = fortNight
1991
            userAppCashbackObj.yearVal = currentYear
1992
        else:
16915 manish.sha 1993
            userAppCashbackObj.amount = userAppCashbackObj.amount + approvedAppTransaction.final_user_payout
16631 manish.sha 1994
 
1995
        if userAppInstallObj is None:
1996
            app_offer = app_offers.get_by(id=approvedAppTransaction.app_id)
1997
            userAppInstallObj = user_app_installs()
1998
            userAppInstallObj.user_id = approvedAppTransaction.retailer_id
1999
            userAppInstallObj.fortnightOfYear = fortNight
2000
            userAppInstallObj.transaction_date = datetime(currentYear, currentMonth, currentDay, 0, 0, 0, 0).date()
2001
            userAppInstallObj.app_id = approvedAppTransaction.app_id
2002
            userAppInstallObj.app_name = app_offer.app_name
2003
            userAppInstallObj.installCount = 1
16915 manish.sha 2004
            userAppInstallObj.payoutAmount = approvedAppTransaction.final_user_payout
16631 manish.sha 2005
        else:
2006
            userAppInstallObj.installCount = userAppInstallObj.installCount + 1
16915 manish.sha 2007
            userAppInstallObj.payoutAmount = userAppInstallObj.payoutAmount +approvedAppTransaction.final_user_payout
16631 manish.sha 2008
 
2009
        approvedAppTransaction.cashBackConsidered = True
2010
        session.commit()
2011
        return True
2012
    except:
2013
        session.rollback()
16636 manish.sha 2014
        print traceback.print_exc()
16631 manish.sha 2015
        return False
16693 manish.sha 2016
 
2017
def _sendAlertForAppPayouts(app_id, offerPrice, userPayout, payout):
2018
    m = Email('localhost')
2019
    mFrom = "dtr@shop2020.in"
2020
    m.setFrom(mFrom)
2021
    mTo = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com','chaitnaya.vats@saholic.com','manoj.kumar@saholic.com','manish.sharma@shop2020.in']
2022
    for receipient in mTo:
2023
        m.addRecipient(receipient)
2024
    appOffer = app_offers.get_by(id=app_id)
2025
    if offerPrice != payout:
2026
        m.setSubject("Mismatch in Offer Price and Actual Pay Out for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
2027
        message1 = "Offer Price:- "+ str(appOffer.offer_price) + "\n" + "Actual Pay Out:- "+ str(payout)
2028
        m.setTextBody(message1)
2029
    if userPayout > payout:
2030
        m.setSubject("User Pay Out greater than actual PayOut for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
2031
        message2 = "User Pay Out Price:- "+ str(appOffer.user_payout) + "\n" + "Actual Pay Out:- "+ str(payout)
2032
        m.setTextBody(message2)
2033
    m.send()
16631 manish.sha 2034
 
16789 amit.gupta 2035
def rejectCashback(orderId, subOrderId):
16833 amit.gupta 2036
    cashBack = get_mongo_connection().Dtr.merchantOrder.update({"orderId":orderId, "subOrders.merchantSubOrderId":subOrderId}, 
16789 amit.gupta 2037
                                                               {"$set":{"subOrders.$.cashBackStatus":CB_REJECTED}})
16837 amit.gupta 2038
    print cashBack
16836 amit.gupta 2039
    return cashBack.get("nModified")
16894 manish.sha 2040
 
2041
def getAppOffers(retailer_id):
2042
    if not bool(mc.get("cached_app_offers_"+str(retailer_id))):
2043
        populateAppOffers(retailer_id)
2044
    return mc.get("cached_app_offers_"+str(retailer_id)) 
2045
 
2046
def populateAppOffers(retailerId):
2047
    retailerId = int(retailerId)
2048
    #offset = req.get_param_as_int("offset")
2049
    #limit = req.get_param_as_int("limit")
16941 manish.sha 2050
    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()
2051
    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 2052
    #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()
2053
 
2054
    appOffersMap = {}
2055
    priorityList = []
2056
    priorityMap = {}
2057
    for offer in priortizeders:
16941 manish.sha 2058
        if priorityMap.has_key(long(offer[1])):
2059
            offersVal = priorityMap.get(long(offer[1]))
2060
            offersVal.append(offer)
2061
            priorityMap[long(offer[1])]=offersVal
2062
        else:
2063
            offersVal = []
2064
            offersVal.append(offer)
2065
            priorityMap[long(offer[1])]=offersVal
2066
 
16894 manish.sha 2067
    priorityList = sorted(priorityMap)
2068
 
2069
    maxCount = len(nonPriortizedOffers) + len(priortizeders)
2070
 
16909 manish.sha 2071
    if priorityList is not None and len(priorityList)>0:
2072
        if maxCount < max(priorityList):
2073
            maxCount = max(priorityList)
16894 manish.sha 2074
 
2075
    count = 1
2076
    blockedPlaces = []
2077
    availablePlaces = []
2078
    while count <= maxCount:
2079
        if count in priorityList:
2080
            blockedPlaces.append(count)
2081
        else:
2082
            availablePlaces.append(count)
2083
        count = count +1
16941 manish.sha 2084
    print 'Blocked Places', blockedPlaces
16894 manish.sha 2085
    for val in blockedPlaces:
16941 manish.sha 2086
        key = val
2087
        for offerObj in priorityMap.get(val):
2088
            while appOffersMap.has_key(key):
2089
                key = key+1
2090
            appOffersMap[key] = long(offerObj[0])
2091
            if key in availablePlaces:
2092
                availablePlaces.remove(key)
2093
 
2094
    print 'Available Places', availablePlaces
2095
 
16894 manish.sha 2096
    i=0
2097
    for val in availablePlaces:
16899 manish.sha 2098
        if i<len(nonPriortizedOffers):
16902 manish.sha 2099
            appOffersMap[val]= long(nonPriortizedOffers[i][0])
16899 manish.sha 2100
        else:
2101
            break
2102
        i=i+1
16901 manish.sha 2103
    print 'AppOffersMap', appOffersMap
16894 manish.sha 2104
 
2105
    finalAppOffersMap = {}
2106
    if len(appOffersMap) > 0:
2107
        for key in sorted(appOffersMap):               
2108
            finalAppOffersMap[key] = appOffersMap[key]
2109
 
2110
        mc.set("cached_app_offers_"+str(retailerId), finalAppOffersMap, 120)
2111
    else:
2112
        print 'No Offers'
2113
        mc.set("cached_app_offers_"+str(retailerId), {}, 10)              
17280 manish.sha 2114
 
2115
def sendNotification(userIds, campaignName, title, message,notificationtype, url, expiresat='2999-01-01'):
2116
    campaignId = addNotificationCampaign(campaignName, title, message, notificationtype, url, None)
2117
    payload = {}
2118
    payload["user_id"]= userIds[0]
2119
    payload["type"]="pending"
2120
    payload["notification_campaign_id"]= campaignId
2121
    payload["status"]=0
16546 kshitij.so 2122
 
17280 manish.sha 2123
    payloadList = []
2124
    payloadList.append(payload)
17281 manish.sha 2125
    jsonObj = json.dumps([dict(pn) for pn in payloadList])
2126
    print jsonObj
2127
    pushpostrequest = urllib2.Request("http://45.33.50.227:3001/addPushNotification")
2128
    pushpostrequest.add_header('Content-Type', 'application/json')
2129
    response = urllib2.urlopen(pushpostrequest, jsonObj).read()
17280 manish.sha 2130
    print response
2131
 
2132
def addNotificationCampaign(name, title, message, type, url, sql):
2133
    notificationCampaign = notification_campaigns()
2134
    notificationCampaign.name = name
2135
    notificationCampaign.title = title
2136
    notificationCampaign.type = type
2137
    notificationCampaign.message = message
2138
    notificationCampaign.url = url
2139
    notificationCampaign.sql = sql
2140
    notificationCampaign.expiresat = datetime(2999, 1, 1)
2141
    notificationCampaign.status = 'active'
2142
    notificationCampaign.created = datetime.now()
2143
 
2144
    session.commit()
2145
    campaignId = notificationCampaign.id
2146
 
2147
    session.close()
2148
    return campaignId
17302 kshitij.so 2149
 
2150
def getDummyDeals(categoryId, offset, limit):
2151
    outer_query = []
2152
    outer_query.append({"showDeal":1})
2153
    outer_query.append({"category_id":categoryId})
2154
    query = {}
2155
    query['$gt'] = -100
2156
    outer_query.append({'totalPoints':query})
2157
    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))
2158
    returnObj = []
2159
    for deal in all_deals:
17306 kshitij.so 2160
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
17734 kshitij.so 2161
        returnObj.append(getItemObjForStaticDeals(item[0],transform=True))
17302 kshitij.so 2162
    return returnObj
17367 kshitij.so 2163
 
17469 kshitij.so 2164
def searchDummyDeals(search_term , limit, offset):
17367 kshitij.so 2165
    data = []
2166
    uniqueMap = {}
2167
    if search_term is not None:
2168
        terms = search_term.split(' ')
2169
        outer_query = []
2170
        for term in terms:
2171
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
2172
        try:
2173
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}})
2174
            for record in collection:
2175
                data.append(record)
2176
        except:
2177
            pass
2178
    else:
2179
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}})
2180
        for record in collection:
2181
            data.append(record)
2182
    for x in data:
2183
        if not uniqueMap.has_key(x['skuBundleId']):
17469 kshitij.so 2184
            uniqueMap[x['skuBundleId']] = {'source_product_name':x['source_product_name'],'skuBundleId':x['skuBundleId'],'thumbnail':x['thumbnail']}
17367 kshitij.so 2185
 
17469 kshitij.so 2186
    if (offset + limit) > len(uniqueMap.values()):
2187
        limit = len(uniqueMap.values()) - offset - 1
2188
 
2189
    count = 0
2190
#     for x in uniqueMap.values():
2191
#         print count,
2192
#         print '\t',
2193
#         print x
2194
#         count = count+1
17555 kshitij.so 2195
 
17469 kshitij.so 2196
    print offset
2197
    print limit
2198
 
2199
    return uniqueMap.values()[offset:limit+offset]
17367 kshitij.so 2200
 
17469 kshitij.so 2201
 
2202
def getDummyPricing(skuBundleId):
2203
    collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()},'skuBundleId':skuBundleId,'in_stock':1})
2204
    print collection.count()
2205
    cheapest = 99999999
2206
    cheapestDetails= None
2207
    returnMap = {}
2208
 
2209
    for d in collection:
2210
        if d['available_price'] < cheapest:
2211
            cheapestDetails = d
2212
            cheapest = int(d['available_price'])
2213
        if returnMap.has_key(d['source_id']):
17733 kshitij.so 2214
            d = getItemObjForStaticDeals(d,transform=True)
17469 kshitij.so 2215
            d['toShowStore'] = 0
2216
            returnMap[d['source_id']].append(d)
2217
        else:
2218
            temp = []
17733 kshitij.so 2219
            d = getItemObjForStaticDeals(d,transform=True)
17469 kshitij.so 2220
            d['toShowStore'] = 1
2221
            temp.append(d)
2222
            returnMap[d['source_id']] = temp
2223
    returnMap['cheapest'] = cheapestDetails
2224
    for y in returnMap.itervalues():
2225
        if isinstance(y, (list, tuple)):
2226
            (y[len(y)-1])['lastElement'] = 1
2227
        else:
2228
            pass
2229
    if returnMap['cheapest'] ==None:
2230
        dum = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':skuBundleId,'source_id':{"$in":SOURCE_MAP.keys()}})
2231
        returnMap['cheapest'] = {'thumbnail':dum['thumbnail'],'source_product_name':dum['source_product_name']}
2232
    return returnMap
17555 kshitij.so 2233
 
17603 kshitij.so 2234
 
17555 kshitij.so 2235
def addDealObject(data):
17570 kshitij.so 2236
    if data.get('img_url') is None or data.get('img_url')=="" or data.get('name') is None or data.get('name')=="":
2237
        return {0:'Invalid data'}   
17555 kshitij.so 2238
    try:
2239
        max_id = list(get_mongo_connection().Catalog.DealObject.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
2240
        if len(max_id) ==0:
2241
            max_id = 0
17559 kshitij.so 2242
        else:
2243
            max_id = max_id[0]['_id']
2244
        data['_id'] = max_id +1
17555 kshitij.so 2245
        get_mongo_connection().Catalog.DealObject.insert(data)
2246
        return {1:'Data added successfully'}
2247
    except:
2248
        return {0:'Error in adding data'}
2249
 
17561 kshitij.so 2250
def getAllDealObjects(offset, limit):
2251
    data = []
2252
    collection = get_mongo_connection().Catalog.DealObject
2253
    cursor = collection.find({}).skip(offset).limit(limit)
2254
    for val in cursor:
17564 kshitij.so 2255
        data.append({'_id':val['_id'],'name':val['name']})
17561 kshitij.so 2256
    return data
17564 kshitij.so 2257
 
2258
def deleteDealObject(id):
2259
    try:
2260
        get_mongo_connection().Catalog.DealObject.remove({'_id':id})
17616 kshitij.so 2261
        get_mongo_connection().Catalog.FeaturedDealsDealObject.remove({'_id':id})
17564 kshitij.so 2262
        return {1:"Deal Object deleted"}
2263
    except:
2264
        return {0:"Error in deleting object"}
17566 kshitij.so 2265
 
2266
def getDealObjectById(id):
2267
    try:
2268
        data = get_mongo_connection().Catalog.DealObject.find({'_id':id})
2269
        return data
2270
    except:
17570 kshitij.so 2271
        return {}
17561 kshitij.so 2272
 
17570 kshitij.so 2273
def updateDealObject(data):
2274
    try:
2275
        _id = data['_id']
2276
        data.pop('_id')
2277
        get_mongo_connection().Catalog.DealObject.update({'_id':_id},{"$set":data},upsert=False)
2278
        return {1:"Data updated successfully"}
2279
    except:
2280
        return {0:"Error in updating data"}
2281
 
17610 kshitij.so 2282
def getAllFeaturedDealsForDealObject(offset, limit):
2283
    data = []
2284
    collection = get_mongo_connection().Catalog.FeaturedDealsDealObject
2285
    cursor = collection.find({}).skip(offset).limit(limit)
2286
    for val in cursor:
2287
        data.append(val)
2288
    return data
2289
 
2290
def addFeaturedDealForDealObject(data):
2291
    collection = get_mongo_connection().Catalog.FeaturedDealsDealObject
2292
    cursor = collection.find({'_id':data['_id']})
2293
    master = get_mongo_connection().Catalog.DealObject.find_one({'_id':data['_id']})
2294
    if master is None:
2295
        return {0:"Deal Object id wrong"}
2296
    otherInfoObj = data['otherInfo']
2297
    toPop = []
2298
    for x,y in otherInfoObj.iteritems():
2299
        if y==0:
2300
            toPop.append(x)
2301
 
2302
    for popItem in toPop:
2303
        otherInfoObj.pop(popItem)
2304
    if len(otherInfoObj.keys())==0:
2305
        return {0:"No rank info to add"}
2306
 
2307
    for x,y in otherInfoObj.iteritems():
2308
        exist = get_mongo_connection().Catalog.FeaturedDealsDealObject.find({'otherInfo.'+x:y})
2309
        if exist.count() >0:
2310
            return {0:"Rank already assigned Deal Object Id %s"%(exist[0]['_id'])}
2311
    if cursor.count() > 0:
2312
        return {0:"Deal Object Id information already present."}
2313
    else:
2314
        collection.insert(data)
2315
        return {1:"Data added successfully"}
2316
 
17616 kshitij.so 2317
def deleteFeaturedDealObject(id):
2318
    try:
2319
        get_mongo_connection().Catalog.FeaturedDealsDealObject.remove({'_id':id})
2320
        return {1:"Deal Object deleted"}
2321
    except:
2322
        return {0:"Error in deleting object"}
17654 kshitij.so 2323
 
2324
def getSubCategoryForFilter(category_id):
2325
    if mc.get("subCategoryFilter") is None:
2326
        print "Populating subcategory data for category_id %d" %(category_id)
2327
        tabData, mobData, accData = [], [], []
2328
 
2329
        accessoriesDeals = get_mongo_connection().Catalog.Deals.aggregate([
2330
                                                                      {"$match":{"category_id":6,"showDeal":1,"totalPoints":{"$gt":-100}}
2331
                                                                    },
2332
                                                                 {"$group" : 
2333
                                                                  {'_id':{'subCategoryId':'$subCategoryId','subCategory':'$subCategory'},'count':{'$sum':1}}
2334
                                                                  }
2335
                                                                ])
2336
 
2337
        for accessoryDeal in accessoriesDeals['result']:
2338
            if accessoryDeal.get('_id').get('subCategoryId') != 0:
2339
                tempMap = {}
2340
                tempMap['subCategory'] = accessoryDeal.get('_id').get('subCategory')
2341
                tempMap['subCategoryId'] = accessoryDeal.get('_id').get('subCategoryId')
2342
                tempMap['count'] = accessoryDeal.get('count')
2343
                accData.append(tempMap)
2344
 
2345
 
2346
        mc.set("subCategoryFilter",{3:mobData, 5:tabData, 6:accData}, 600)  
2347
 
2348
    return sorted(mc.get("subCategoryFilter").get(category_id), key = lambda x: (-x['count'], x['subCategory']))
17610 kshitij.so 2349
 
17727 kshitij.so 2350
def dummyLogin(data):
17731 kshitij.so 2351
    exist = list(get_mongo_connection().Catalog.DummyUser.find({'email':data['email'],'password':data['password']}))
17727 kshitij.so 2352
    if len(exist) > 0:
17728 kshitij.so 2353
        return {'user_id':exist[0]['_id'],'fullName':exist[0]['fullName']}
17727 kshitij.so 2354
    else:
2355
        return {'user_id':0}
17616 kshitij.so 2356
 
17727 kshitij.so 2357
def dummyRegister(data):
2358
    try:
2359
        exist = list(get_mongo_connection().Catalog.DummyUser.find({'email':data['email']}))
2360
        if len(exist) > 0:
2361
            return {'msg':"Email already registered",'user_id':0}
2362
        else:
2363
            max_id = list(get_mongo_connection().Catalog.DummyUser.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
2364
            if len(max_id) ==0:
2365
                max_id = 0
2366
            else:
2367
                max_id = max_id[0]['_id']
2368
            data['_id'] = max_id +1
2369
            get_mongo_connection().Catalog.DummyUser.insert(data)
17728 kshitij.so 2370
            return {'msg':"Registration successful",'user_id':data['_id'],'fullName':data['fullName']}
17727 kshitij.so 2371
    except:
2372
        return {'msg':"Error in registration.",'user_id':0}
2373
 
17731 kshitij.so 2374
def getDummyUser(user_id):
2375
    exist = list(get_mongo_connection().Catalog.DummyUser.find({'_id':user_id}))
2376
    if len(exist) > 0:
2377
        return exist[0]
2378
    else:
2379
        return {'user_id':0,'fullName':"",'email':"","contactNumber":""}
2380
 
2381
def updateDummyUser(data):
2382
    try:
17732 kshitij.so 2383
        get_mongo_connection().Catalog.DummyUser.update({'_id':data['user_id']},{"$set":data},upsert=False)
17731 kshitij.so 2384
        return {'msg':"Data updated successfuly",'response':1}
2385
    except:
2386
        return {'msg':"Unable to update data",'response':0}
2387
 
2388
 
2389
 
13572 kshitij.so 2390
def main():
17618 kshitij.so 2391
    featuredDeals = mc.get("featured_deals")
2392
    print resetCache("47")
2393
    print datetime.now()
2394
    x=  getNewDeals(47, 6, 0, 20, None, None, None)
2395
    print "=========================="
2396
    for y in x:
2397
        print y[0]['skuBundleId'],
2398
        print '\t',
2399
        print y[0]['brand']
2400
    print datetime.now()
17469 kshitij.so 2401
 
17618 kshitij.so 2402
 
17469 kshitij.so 2403
 
2404
 
13572 kshitij.so 2405
if __name__=='__main__':
13932 amit.gupta 2406
    main()
17469 kshitij.so 2407