Subversion Repositories SmartDukaan

Rev

Rev 19451 | Rev 19455 | 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
19451 manas 4
from dtr.dao import FeaturedDeals, AppTransactions, AppOfferObj, Promotion, NotificationCampaign,CrmRefundWallet
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, \
19451 manas 12
    to_py_date, CB_REJECTED, SUB_CATEGORY_MAP, con
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
19451 manas 27
from dtr.utils import utils
28
from string import lower
17367 kshitij.so 29
try:
30
    import ordereddict
31
except:
32
    pass
13572 kshitij.so 33
 
18830 kshitij.so 34
 
35
import bson.son as son
19207 kshitij.so 36
import math
37
 
13572 kshitij.so 38
con = None
17944 kshitij.so 39
es = None
18052 kshitij.so 40
try:
41
    from elasticsearch import Elasticsearch
42
except:
43
    pass
17936 kshitij.so 44
from shop2020.config.client.ConfigClient import ConfigClient
13572 kshitij.so 45
 
14037 kshitij.so 46
DataService.initialize(db_hostname="localhost")
16304 amit.gupta 47
mc = MemCache("127.0.0.1")
17936 kshitij.so 48
config_client = ConfigClient()
49
elastic_search_host = config_client.get_property('elastic_search_host')
50
elastic_search_port = config_client.get_property('elastic_search_port')
14037 kshitij.so 51
 
17936 kshitij.so 52
 
17944 kshitij.so 53
 
17035 kshitij.so 54
SOURCE_MAP = {1:'AMAZON',2:'FLIPKART',3:'SNAPDEAL',4:'SAHOLIC',5:"SHOPCLUES.COM",6:"PAYTM.COM",7:"HOMESHOP18.COM"}
14482 kshitij.so 55
 
15853 kshitij.so 56
COLLECTION_MAP = {
57
                  'ExceptionalNlc':'skuBundleId',
58
                  'SkuDealerPrices':'skuBundleId',
59
                  'SkuDiscountInfo':'skuBundleId',
60
                  'SkuSchemeDetails':'skuBundleId',
17367 kshitij.so 61
                  'DealPoints':'skuBundleId',
62
                  'FeaturedDeals': 'skuBundleId'
15853 kshitij.so 63
                  }
64
 
19337 manish.sha 65
 
17944 kshitij.so 66
def get_elastic_search_connection():
67
    global es
68
    if es is None:
69
        print "Establishing connection with elastic search %s host and port %s"%(elastic_search_host,elastic_search_port)
70
        es = Elasticsearch([{'host': elastic_search_host, 'port': elastic_search_port}])
71
        return es
72
    return es
73
 
74
 
13572 kshitij.so 75
def get_mongo_connection(host='localhost', port=27017):
76
    global con
77
    if con is None:
78
        print "Establishing connection %s host and port %d" %(host,port)
79
        try:
80
            con = pymongo.MongoClient(host, port)
81
        except Exception, e:
82
            print e
83
            return None
84
    return con
85
 
13907 kshitij.so 86
def populateCashBack():
13921 kshitij.so 87
    print "Populating cashback"
88
    cashBackMap = {}
89
    itemCashBackMap = {}
13907 kshitij.so 90
    cashBack = list(get_mongo_connection().Catalog.CategoryCashBack.find())
91
    for row in cashBack:
13970 kshitij.so 92
        temp_map = {}
93
        temp_list = []
13907 kshitij.so 94
        if cashBackMap.has_key(row['source_id']):
95
            arr = cashBackMap.get(row['source_id'])
96
            for val in arr:
97
                temp_list.append(val)
98
            temp_map[row['category_id']] = row
99
            temp_list.append(temp_map)
100
            cashBackMap[row['source_id']] = temp_list 
101
        else:
102
            temp_map[row['category_id']] = row
103
            temp_list.append(temp_map)
104
            cashBackMap[row['source_id']] = temp_list
13921 kshitij.so 105
    itemCashBack = list(get_mongo_connection().Catalog.ItemCashBack.find())
106
    for row in itemCashBack:
107
        if not itemCashBackMap.has_key(row['skuId']):
108
            itemCashBackMap[row['skuId']] = row
14761 kshitij.so 109
    mc.set("item_cash_back", itemCashBackMap, 24 * 60 * 60)
110
    mc.set("category_cash_back", cashBackMap, 24 * 60 * 60)
13907 kshitij.so 111
 
13572 kshitij.so 112
def addCategoryDiscount(data):
13970 kshitij.so 113
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 114
    query = []
115
    data['brand'] = data['brand'].strip().upper()
13970 kshitij.so 116
    data['discountType'] = data['discountType'].upper().strip()
13572 kshitij.so 117
    query.append({"brand":data['brand']})
118
    query.append({"category_id":data['category_id']})
119
    r = collection.find({"$and":query})
120
    if r.count() > 0:
13639 kshitij.so 121
        return {0:"Brand & Category info already present."}
13572 kshitij.so 122
    else:
123
        collection.insert(data)
13970 kshitij.so 124
        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 125
        return {1:"Data added successfully"}
13572 kshitij.so 126
 
13970 kshitij.so 127
def updateCategoryDiscount(data,_id):
128
    try:
129
        collection = get_mongo_connection().Catalog.CategoryDiscount
130
        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)
131
        get_mongo_connection().Catalog.MasterData.update({'brand':data['brand'],'category_id':data['category_id']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
132
        return {1:"Data updated successfully"}
133
    except:
134
        return {0:"Data not updated."}
135
 
136
 
13572 kshitij.so 137
def getAllCategoryDiscount():
138
    data = []
13970 kshitij.so 139
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 140
    cursor = collection.find()
141
    for val in cursor:
142
        data.append(val)
143
    return data
144
 
14553 kshitij.so 145
def __getBundledSkusfromSku(sku):
146
    masterData =  get_mongo_connection().Catalog.MasterData.find_one({"_id":sku},{"skuBundleId":1})
147
    if masterData is not None:
148
        return list(get_mongo_connection().Catalog.MasterData.find({"skuBundleId":masterData.get('skuBundleId')},{'_id':1,'skuBundleId':1}))
149
    else:
150
        return []
13572 kshitij.so 151
 
15853 kshitij.so 152
def addSchemeDetailsForSku(data):
153
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
154
    result = collection.find_one({'skuBundleId':data['skuBundleId']})
155
    if result is None:
14553 kshitij.so 156
        collection.insert(data)
15853 kshitij.so 157
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14553 kshitij.so 158
        return {1:"Data added successfully"}
15853 kshitij.so 159
    return {1:"BundleId info already present"}
160
 
14069 kshitij.so 161
def getAllSkuWiseSchemeDetails(offset, limit):
13572 kshitij.so 162
    data = []
13970 kshitij.so 163
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
14071 kshitij.so 164
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 165
    for val in cursor:
15853 kshitij.so 166
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
167
        if master is not None:
168
            val['brand'] = master['brand']
169
            val['source_product_name'] = master['source_product_name']
14069 kshitij.so 170
        else:
171
            val['brand'] = ""
172
            val['source_product_name'] = ""
13572 kshitij.so 173
        data.append(val)
174
    return data
175
 
15853 kshitij.so 176
def addSkuDiscountInfo(data):
177
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
178
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
179
    if cursor is not None:
180
        return {0:"BundleId information already present."}
13572 kshitij.so 181
    else:
15853 kshitij.so 182
        collection.insert(data)
183
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 184
        return {1:"Data added successfully"}
13572 kshitij.so 185
 
13970 kshitij.so 186
def getallSkuDiscountInfo(offset, limit):
13572 kshitij.so 187
    data = []
13970 kshitij.so 188
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
189
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 190
    for val in cursor:
15853 kshitij.so 191
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
192
        if master is not None:
193
            val['brand'] = master['brand']
194
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 195
        else:
196
            val['brand'] = ""
197
            val['source_product_name'] = ""
13572 kshitij.so 198
        data.append(val)
199
    return data
200
 
13970 kshitij.so 201
def updateSkuDiscount(data,_id):
202
    try:
203
        collection = get_mongo_connection().Catalog.SkuDiscountInfo
204
        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 205
        get_mongo_connection().Catalog.MasterData.update({'_id':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 206
        return {1:"Data updated successfully"}
207
    except:
208
        return {0:"Data not updated."}
209
 
210
 
15853 kshitij.so 211
def addExceptionalNlc(data):
212
    collection = get_mongo_connection().Catalog.ExceptionalNlc
213
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
214
    if cursor is not None:
215
        return {0:"BundleId information already present."}
13572 kshitij.so 216
    else:
15853 kshitij.so 217
        collection.insert(data)
218
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 219
        return {1:"Data added successfully"}
13572 kshitij.so 220
 
13970 kshitij.so 221
def getAllExceptionlNlcItems(offset, limit):
13572 kshitij.so 222
    data = []
13970 kshitij.so 223
    collection = get_mongo_connection().Catalog.ExceptionalNlc
14071 kshitij.so 224
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 225
    for val in cursor:
15853 kshitij.so 226
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
227
        if master is not None:
228
            val['brand'] = master['brand']
229
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 230
        else:
231
            val['brand'] = ""
232
            val['source_product_name'] = ""
13572 kshitij.so 233
        data.append(val)
234
    return data
235
 
14005 amit.gupta 236
def getMerchantOrdersByUser(userId, page=1, window=50, searchMap={}):
237
    if searchMap is None:
238
        searchMap = {}
13603 amit.gupta 239
    if page==None:
240
        page = 1
241
 
242
    if window==None:
243
        window = 50
244
    result = {}
13582 amit.gupta 245
    skip = (page-1)*window
14005 amit.gupta 246
 
14353 amit.gupta 247
    if userId is not None:
248
        searchMap['userId'] = userId
13603 amit.gupta 249
    collection = get_mongo_connection().Dtr.merchantOrder
14609 amit.gupta 250
    cursor = collection.find(searchMap).sort("orderId",-1)
13603 amit.gupta 251
    total_count = cursor.count()
252
    pages = total_count/window + (0 if total_count%window==0 else 1)  
253
    print "total_count", total_count
254
    if total_count > skip:
13999 amit.gupta 255
        cursor = cursor.skip(skip).limit(window)
13603 amit.gupta 256
        orders = []
257
        for order in cursor:
14002 amit.gupta 258
            del(order["_id"])
259
            orders.append(order)
13603 amit.gupta 260
        result['data'] = orders
261
        result['window'] = window
262
        result['totalCount'] = total_count 
263
        result['currCount'] = cursor.count()
264
        result['totalPages'] = pages
265
        result['currPage'] = page    
266
        return result
267
    else:
268
        return result
13630 kshitij.so 269
 
13927 amit.gupta 270
def getRefunds(userId, page=1, window=10):
271
    if page==None:
272
        page = 1
273
 
274
    if window==None:
13995 amit.gupta 275
        window = 10
13927 amit.gupta 276
    result = {}
277
    skip = (page-1)*window
16737 amit.gupta 278
    con = get_mongo_connection()
279
    collection = con.Dtr.refund
280
    user = con.Dtr.user
16754 amit.gupta 281
    credited = user.find_one({"userId":userId})
282
    if credited:
283
        credited = credited.get("credited")
284
    else:
285
        credited=0
286
 
13927 amit.gupta 287
    cursor = collection.find({"userId":userId})
288
    total_count = cursor.count()
289
    pages = total_count/window + (0 if total_count%window==0 else 1)  
290
    print "total_count", total_count
291
    if total_count > skip:
14668 amit.gupta 292
        cursor = cursor.skip(skip).limit(window).sort([('batch',-1)])
13927 amit.gupta 293
        refunds = []
294
        for refund in cursor:
295
            del(refund["_id"])
296
            refunds.append(refund)
16754 amit.gupta 297
        result['credited'] = credited
13927 amit.gupta 298
        result['data'] = refunds
299
        result['window'] = window
300
        result['totalCount'] = total_count 
301
        result['currCount'] = cursor.count()
302
        result['totalPages'] = pages
303
        result['currPage'] = page    
304
        return result
305
    else:
306
        return result
307
 
308
def getPendingRefunds(userId):
13991 amit.gupta 309
    print type(userId)
13927 amit.gupta 310
    result = get_mongo_connection().Dtr.merchantOrder\
311
        .aggregate([
16398 amit.gupta 312
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED, 'userId':userId}},
13927 amit.gupta 313
                    {'$unwind':"$subOrders"},
16398 amit.gupta 314
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED}},
13927 amit.gupta 315
                    { 
316
                     '$group':{
317
                               '_id':None,
318
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
319
                               }
320
                     }
13987 amit.gupta 321
                ])['result']
322
 
323
    if len(result)>0:
324
        result = result[0]        
325
        result.pop("_id")
326
    else:
327
        result={}
328
        result['amount'] = 0.0
14305 amit.gupta 329
    result['nextCredit'] = datetime.strftime(next_weekday(datetime.now(), int(PythonPropertyReader.getConfig('CREDIT_DAY_OF_WEEK'))),"%Y-%m-%d %H:%M:%S")
13927 amit.gupta 330
    return result
14037 kshitij.so 331
 
14671 amit.gupta 332
def getPendingCashbacks(userId):
333
    result = get_mongo_connection().Dtr.merchantOrder\
334
        .aggregate([
16398 amit.gupta 335
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING, 'userId':userId}},
14671 amit.gupta 336
                    {'$unwind':"$subOrders"},
16398 amit.gupta 337
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING}},
14671 amit.gupta 338
                    { 
339
                     '$group':{
340
                               '_id':None,
341
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
342
                               }
343
                     }
344
                ])['result']
345
 
346
    if len(result)>0:
347
        result = result[0]        
348
        result.pop("_id")
349
    else:
350
        result={}
351
        result['amount'] = 0.0
352
    return result
353
 
17369 kshitij.so 354
def __constructDummyDealObject(skuBundleId):
355
    temp =[]
19193 kshitij.so 356
    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,'netPriceAfterCashBack':1})
17369 kshitij.so 357
    for d in deals:
358
        d['persPoints'] = 0
19441 kshitij.so 359
        d['internalRank'] = 999999
17369 kshitij.so 360
        temp.append(d)
361
    return temp
362
 
363
 
364
 
14037 kshitij.so 365
def __populateCache(userId):
17369 kshitij.so 366
    try:
367
        if mc.get("featured_deals") is None:
368
            __populateFeaturedDeals()
369
        featuredDeals = mc.get("featured_deals")
370
 
371
    except Exception as e:
372
        print traceback.print_exc()
17469 kshitij.so 373
        featuredDeals = {3:{},5:{},6:{}}
17369 kshitij.so 374
 
19441 kshitij.so 375
 
376
    #Not taking into account accessories
377
    featuredDeals.pop(6,None)
378
 
17369 kshitij.so 379
    fd_bundles = []
380
 
381
    for catMap in featuredDeals.itervalues():
382
        for fd_map in catMap.itervalues():
17541 kshitij.so 383
            if not fd_map.get('skuBundleId') in fd_bundles:
384
                fd_bundles.append(fd_map.get('skuBundleId'))
17369 kshitij.so 385
 
14037 kshitij.so 386
    print "Populating memcache for userId",userId
387
    outer_query = []
16067 kshitij.so 388
    outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
14037 kshitij.so 389
    query = {}
16170 kshitij.so 390
    query['$gt'] = -100
14037 kshitij.so 391
    outer_query.append({'totalPoints':query})
19441 kshitij.so 392
    outer_query.append({'category_id':{"$in":[3,5]}})
14037 kshitij.so 393
    brandPrefMap = {}
394
    pricePrefMap = {}
395
    actionsMap = {}
396
    brand_p = session.query(price_preferences).filter_by(user_id=userId).all()
397
    for x in brand_p:
398
        pricePrefMap[x.category_id] = [x.min_price,x.max_price]
399
    for x in session.query(brand_preferences).filter_by(user_id=userId).all():
400
        temp_map = {}
401
        if brandPrefMap.has_key((x.brand).strip().upper()):
402
            val = brandPrefMap.get((x.brand).strip().upper())
403
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
404
            val.append(temp_map)
405
        else:
406
            temp = []
407
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
408
            temp.append(temp_map)
409
            brandPrefMap[(x.brand).strip().upper()] = temp
410
 
411
    for x in session.query(user_actions).filter_by(user_id=userId).all():
412
        actionsMap[x.store_product_id] = 1 if x.action == 'like' else 0
19193 kshitij.so 413
    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,'netPriceAfterCashBack':1}).sort([('totalPoints',pymongo.DESCENDING),('bestSellerPoints',pymongo.DESCENDING),('nlcPoints',pymongo.DESCENDING),('rank',pymongo.DESCENDING)]))
14037 kshitij.so 414
    mobile_deals = []
415
    tablet_deals = []
19441 kshitij.so 416
    #accessories_deals = []
14037 kshitij.so 417
    for deal in all_deals:
19135 kshitij.so 418
 
17369 kshitij.so 419
        try:
420
            fd_bundles.remove(deal.get('skuBundleId'))
421
        except:
422
            pass
423
 
14037 kshitij.so 424
        if actionsMap.get(deal['_id']) == 0:
425
            fav_weight =.25
426
        elif actionsMap.get(deal['_id']) == 1:
427
            fav_weight = 1.5
428
        else:
429
            fav_weight = 1
430
 
431
        if brandPrefMap.get(deal['brand'].strip().upper()) is not None:
17469 kshitij.so 432
 
14037 kshitij.so 433
            brand_weight = 1
434
            for brandInfo in brandPrefMap.get(deal['brand'].strip().upper()):
435
                if brandInfo.get(deal['category_id']) is not None:
436
                    if brandInfo.get(deal['category_id']) == 1:
14055 kshitij.so 437
                        brand_weight = 2.0
14037 kshitij.so 438
        else:
439
            brand_weight = 1
440
 
441
        if pricePrefMap.get(deal['category_id']) is not None:
442
 
443
            if deal['available_price'] >= pricePrefMap.get(deal['category_id'])[0] and deal['available_price'] <= pricePrefMap.get(deal['category_id'])[1]:
444
                asp_weight = 1.5
445
            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]:
446
                asp_weight = 1.2
447
            else:
448
                asp_weight = 1
449
        else:
450
            asp_weight = 1
451
 
452
        persPoints = deal['totalPoints'] * fav_weight * brand_weight * asp_weight
453
        deal['persPoints'] = persPoints
454
 
455
        if deal['category_id'] ==3:
456
            mobile_deals.append(deal)
457
        elif deal['category_id'] ==5:
458
            tablet_deals.append(deal)
19441 kshitij.so 459
        #elif deal['category_id'] ==6:
460
        #    accessories_deals.append(deal)
14037 kshitij.so 461
        else:
462
            continue
463
 
14144 kshitij.so 464
    session.close()
17367 kshitij.so 465
 
466
    mobile_deals = sorted(mobile_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
467
    tablet_deals = sorted(tablet_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
19441 kshitij.so 468
    #accessories_deals = sorted(accessories_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
17367 kshitij.so 469
 
470
 
17369 kshitij.so 471
    if len(fd_bundles) > 0:
472
        print "There is still bundle in feature deals with points less than -100.Lets add info"
473
        for skuBundleId in fd_bundles:
474
            dummyDealObjList = __constructDummyDealObject(skuBundleId)
475
            for dummyDealObj in dummyDealObjList:
476
                if dummyDealObj['category_id'] ==3:
477
                    mobile_deals.append(dummyDealObj)
478
                elif dummyDealObj['category_id'] ==5:
479
                    tablet_deals.append(dummyDealObj)
19441 kshitij.so 480
                #elif dummyDealObj['category_id'] ==6:
481
                #    accessories_deals.append(dummyDealObj)
17369 kshitij.so 482
                else:
483
                    pass
484
 
17469 kshitij.so 485
    for super_category, categoryFeaturedDeals in featuredDeals.iteritems():
486
        for val in categoryFeaturedDeals.itervalues():
487
            dummyDealObjList = __constructDummyDealObject(val.get('skuBundleId'))
488
            for dummyDealObj in dummyDealObjList:
489
                if super_category == dummyDealObj['category_id']:
490
                    continue  
491
 
492
                if super_category ==3:
493
                    mobile_deals.append(dummyDealObj)
494
                elif super_category ==5:
495
                    tablet_deals.append(dummyDealObj)
19441 kshitij.so 496
                #elif super_category ==6:
497
                #    accessories_deals.append(dummyDealObj)
17469 kshitij.so 498
                else:
499
                    pass
500
 
17367 kshitij.so 501
    sortedMapMobiles = {}
502
    rankMapMobiles = {}
503
    rankMobiles = 0
504
 
505
    blockedRanksMobiles = []
506
    blockedSkuBundlesMobiles = []
507
    blockedInfoMobiles = {}
508
 
509
    featuredDealsMobiles = featuredDeals.get(3)
510
 
511
    for k, v in featuredDealsMobiles.iteritems():
17469 kshitij.so 512
        blockedRanksMobiles.append(k-1)
513
        blockedSkuBundlesMobiles.append(v.get('skuBundleId'))
17367 kshitij.so 514
 
515
 
516
    for sorted_deal in mobile_deals:
17369 kshitij.so 517
 
17367 kshitij.so 518
        while(True):
519
            if rankMobiles in blockedRanksMobiles:
520
                rankMobiles = rankMobiles +1
521
            else:
522
                break
523
 
524
        if sorted_deal['skuBundleId'] in blockedSkuBundlesMobiles:
525
            if blockedInfoMobiles.has_key(sorted_deal['skuBundleId']):
526
                blockedInfoMobiles.get(sorted_deal['skuBundleId']).append(sorted_deal)
527
            else:
528
                blockedInfoMobiles[sorted_deal['skuBundleId']] = [sorted_deal]
529
            continue
530
 
531
        if sortedMapMobiles.get(sorted_deal['skuBundleId']) is None:
532
            sortedMapMobiles[sorted_deal['skuBundleId']] = {rankMobiles:[sorted_deal]}
533
            rankMapMobiles[rankMobiles] = (sortedMapMobiles[sorted_deal['skuBundleId']].values())[0]
534
            rankMobiles = rankMobiles +1
535
        else:
536
            for temp_list in sortedMapMobiles.get(sorted_deal['skuBundleId']).itervalues():
537
                temp_list.append(sorted_deal)
538
            rankMapMobiles[(sortedMapMobiles.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
539
 
540
 
541
    for rank in blockedRanksMobiles:
17369 kshitij.so 542
        if blockedInfoMobiles.get((featuredDealsMobiles.get(rank+1)).get('skuBundleId')) is not None:
543
            rankMapMobiles[rank] = blockedInfoMobiles.get((featuredDealsMobiles.get(rank+1)).get('skuBundleId'))
17367 kshitij.so 544
 
545
 
546
    sortedMapTablets = {}
547
    rankMapTablets = {}
548
    rankTablets = 0
549
 
550
    blockedRanksTablets = []
551
    blockedSkuBundlesTablets = []
552
    blockedInfoTablets = {}
553
 
554
    featuredDealsTablets = featuredDeals.get(5)
555
 
556
 
557
    for k, v in featuredDealsTablets.iteritems():
17469 kshitij.so 558
        blockedRanksTablets.append(k-1)
559
        blockedSkuBundlesTablets.append(v.get('skuBundleId'))
560
 
17367 kshitij.so 561
 
562
    for sorted_deal in tablet_deals:
563
        while(True):
564
            if rankTablets in blockedRanksTablets:
565
                rankTablets = rankTablets +1
566
            else:
567
                break
568
 
569
        if sorted_deal['skuBundleId'] in blockedSkuBundlesTablets:
570
            if blockedInfoTablets.has_key(sorted_deal['skuBundleId']):
571
                blockedInfoTablets.get(sorted_deal['skuBundleId']).append(sorted_deal)
572
            else:
573
                blockedInfoTablets[sorted_deal['skuBundleId']] = [sorted_deal]
574
            continue
575
 
576
        if sortedMapTablets.get(sorted_deal['skuBundleId']) is None:
577
            sortedMapTablets[sorted_deal['skuBundleId']] = {rankTablets:[sorted_deal]}
578
            rankMapTablets[rankTablets] = (sortedMapTablets[sorted_deal['skuBundleId']].values())[0]
579
            rankTablets = rankTablets +1
580
        else:
581
            for temp_list in sortedMapTablets.get(sorted_deal['skuBundleId']).itervalues():
582
                temp_list.append(sorted_deal)
583
            rankMapTablets[(sortedMapTablets.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
584
 
585
    for rank in blockedRanksTablets:
17369 kshitij.so 586
        if blockedInfoTablets.get((featuredDealsTablets.get(rank+1)).get('skuBundleId')) is not None:
587
            rankMapTablets[rank] = blockedInfoTablets.get((featuredDealsTablets.get(rank+1)).get('skuBundleId'))
17469 kshitij.so 588
 
17367 kshitij.so 589
 
19441 kshitij.so 590
#     sortedMapAccessories = {}
591
#     rankMapAccessories = {}
592
#     rankAccessories = 0
593
#     
594
#     blockedRanksAccessories = []
595
#     blockedSkuBundlesAccessories = []
596
#     blockedInfoAccessories = {}
597
#     
598
#     featuredDealsAccessories = featuredDeals.get(6)
599
#     
600
#     for k, v in featuredDealsAccessories.iteritems():
601
#         blockedRanksAccessories.append(k-1)
602
#         blockedSkuBundlesAccessories.append(v.get('skuBundleId'))
603
#     
604
#     
605
#     for sorted_deal in accessories_deals:
606
#        
607
#         while(True):
608
#             if rankAccessories in blockedRanksAccessories:
609
#                 rankAccessories = rankAccessories +1
610
#             else:
611
#                 break
612
#              
613
#         if sorted_deal['skuBundleId'] in blockedSkuBundlesAccessories:
614
#             if blockedInfoAccessories.has_key(sorted_deal['skuBundleId']):
615
#                 blockedInfoAccessories.get(sorted_deal['skuBundleId']).append(sorted_deal)
616
#             else:
617
#                 blockedInfoAccessories[sorted_deal['skuBundleId']] = [sorted_deal]
618
#             continue
619
#          
620
#         if sortedMapAccessories.get(sorted_deal['skuBundleId']) is None:
621
#             sortedMapAccessories[sorted_deal['skuBundleId']] = {rankAccessories:[sorted_deal]}
622
#             rankMapAccessories[rankAccessories] = (sortedMapAccessories[sorted_deal['skuBundleId']].values())[0]
623
#             rankAccessories = rankAccessories +1
624
#         else:
625
#             for temp_list in sortedMapAccessories.get(sorted_deal['skuBundleId']).itervalues():
626
#                 temp_list.append(sorted_deal)
627
#             rankMapAccessories[(sortedMapAccessories.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
628
#     
629
#             
630
#     for rank in blockedRanksAccessories:
631
#         if blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId')) is not None:
632
#             rankMapAccessories[rank] = blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId'))
633
#     
634
    specialOffer = None
635
    promoOffer = get_mongo_connection().Catalog.PromoOffer.find_one({'user_id':userId})
636
    try:
637
        if promoOffer is not None:
638
            offer = get_mongo_connection().Catalog.Promotions.find_one({'_id':promoOffer.get('offer_id')})
639
            if offer is None:
640
                raise
641
            promo = Promotion(offer.get('_id'),offer.get('offer_name'),offer.get('offer_description') , offer.get('categories_applicable'), offer.get('sub_categories_not_applicable'),
642
                     offer.get('startDate'), offer.get('endDate'), promoOffer.get('target1'), promoOffer.get('target1_cash_back_percetage'), promoOffer.get('target2'), promoOffer.get('target2_cash_back_percetage'), promoOffer.get('maxCashBack'),offer.get('url'),
643
                     promoOffer.get('pending_order_value'), promoOffer.get('delivered_order_value'), promoOffer.get('last_run_timestamp'))
644
 
645
            specialOffer = promo
646
    except:
647
        traceback.print_exc()
648
 
649
 
650
    mem_cache_val = {3:mobile_deals, 5:tablet_deals,"3_rankMap": rankMapMobiles,"5_rankMap": rankMapTablets, "specialOffer":specialOffer }
651
    mc.set(str(userId), mem_cache_val)
652
 
653
def __populateCacheForAccessories(userId):
654
    try:
655
        if mc.get("featured_deals") is None:
656
            __populateFeaturedDeals()
657
        featuredDeals = mc.get("featured_deals")
658
 
659
    except Exception as e:
660
        print traceback.print_exc()
661
        featuredDeals = {3:{},5:{},6:{}}
662
 
663
 
664
    #Not taking into account mobiles, tablets
665
    featuredDeals.pop(3,None)
666
    featuredDeals.pop(5,None)
667
 
668
    fd_bundles = []
669
 
670
    for catMap in featuredDeals.itervalues():
671
        for fd_map in catMap.itervalues():
672
            if not fd_map.get('skuBundleId') in fd_bundles:
673
                fd_bundles.append(fd_map.get('skuBundleId'))
674
 
675
    print "Populating accessory memcache for userId",userId
676
    outer_query = []
677
    outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
678
    query = {}
679
    query['$gte'] = 0
680
    outer_query.append({'internalRank':query})
681
    outer_query.append({'category_id':{"$in":[6]}})
682
 
683
    accessories_deals = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query},{'_id':1,'category_id':1,'brand':1,'bestSellerPoints':1,'nlcPoints':1,'totalPoints':1,'internalRank':1,'available_price':1,'dealType':1,'source_id':1,'brand_id':1,'skuBundleId':1,'dp':1, 'showDp':1, 'gross_price':1, 'subCategoryId':1,'netPriceAfterCashBack':1}).sort([('internalRank',pymongo.ASCENDING),('bestSellerPoints',pymongo.DESCENDING)]))
684
 
685
    actionsMap = {}
686
 
687
    actionRank = 3
688
    for x in session.query(user_actions).filter_by(user_id=userId).order_by(asc(user_actions.created)).all():
689
        #actionsMap[x.store_product_id] = 1 if x.action == 'like' else 0
690
        action = 1 if x.action == 'like' else 0
691
        if action==1:
692
            actionsMap[x.store_product_id] = {'action':action,'rank':actionRank}
693
            actionRank = actionRank+3
694
        else:
695
            actionsMap[x.store_product_id] = {'action':action,'rank':None}
696
 
697
    session.close()
698
 
699
    psuedo_count = 1
700
 
701
    if actionsMap:
702
        for k,v in actionsMap.iteritems():
703
            if v['action'] == 0:
704
                tmp_deal = get_mongo_connection().Catalog.Deals.find_one({'_id':k})
705
                if tmp_deal is None:
706
                    v['rank'] = 999999
707
                    continue
708
                max_rank = list(get_mongo_connection().Catalog.Deals.find({'subCategoryId':tmp_deal.get('subCategoryId')}).sort([('internalRank',pymongo.DESCENDING)]).limit(1))
709
                if len(max_rank) == 0 or max_rank[0].get('internalRank') is None:
710
                    v['rank'] = 999999
711
                    continue
712
                v['rank'] = max_rank[0]['internalRank'] + 1
713
 
714
    for deal in accessories_deals:
715
 
716
        try:
717
            fd_bundles.remove(deal.get('skuBundleId'))
718
        except:
719
            pass
720
        if actionsMap and actionsMap.get(deal['_id'])!=None:
721
            if actionsMap.get(deal['_id']).get('action') ==1:
722
                actionRank = actionsMap.get(deal['_id']).get('rank')
723
                if actionRank < psuedo_count:
724
                    deal['internalRank'] = actionRank
725
 
726
            elif actionsMap.get(deal['_id']).get('action') ==0:
727
                actionRank = actionsMap.get(deal['_id']).get('rank')
728
                deal['internalRank'] = actionRank
729
            else:
730
                pass
731
        psuedo_count = psuedo_count+1
732
 
733
    if actionsMap:
734
        accessories_deals = sorted(accessories_deals, key = lambda x: (-x['internalRank'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints']),reverse=True)
735
 
736
    if len(fd_bundles) > 0:
737
        print "There is still bundle in feature deals.Lets add info"
738
        for skuBundleId in fd_bundles:
739
            dummyDealObjList = __constructDummyDealObject(skuBundleId)
740
            for dummyDealObj in dummyDealObjList:
741
                if dummyDealObj['category_id'] ==6:
742
                    accessories_deals.append(dummyDealObj)
743
 
744
    for super_category, categoryFeaturedDeals in featuredDeals.iteritems():
745
        for val in categoryFeaturedDeals.itervalues():
746
            dummyDealObjList = __constructDummyDealObject(val.get('skuBundleId'))
747
            for dummyDealObj in dummyDealObjList:
748
                if super_category == dummyDealObj['category_id']:
749
                    continue  
750
                if super_category ==6:
751
                    accessories_deals.append(dummyDealObj)
752
 
753
 
17469 kshitij.so 754
    sortedMapAccessories = {}
755
    rankMapAccessories = {}
756
    rankAccessories = 0
19441 kshitij.so 757
 
17469 kshitij.so 758
    blockedRanksAccessories = []
759
    blockedSkuBundlesAccessories = []
760
    blockedInfoAccessories = {}
19441 kshitij.so 761
 
17469 kshitij.so 762
    featuredDealsAccessories = featuredDeals.get(6)
19441 kshitij.so 763
 
17469 kshitij.so 764
    for k, v in featuredDealsAccessories.iteritems():
765
        blockedRanksAccessories.append(k-1)
766
        blockedSkuBundlesAccessories.append(v.get('skuBundleId'))
19441 kshitij.so 767
 
768
 
17469 kshitij.so 769
    for sorted_deal in accessories_deals:
19441 kshitij.so 770
 
17469 kshitij.so 771
        while(True):
772
            if rankAccessories in blockedRanksAccessories:
773
                rankAccessories = rankAccessories +1
774
            else:
775
                break
19441 kshitij.so 776
 
17469 kshitij.so 777
        if sorted_deal['skuBundleId'] in blockedSkuBundlesAccessories:
778
            if blockedInfoAccessories.has_key(sorted_deal['skuBundleId']):
779
                blockedInfoAccessories.get(sorted_deal['skuBundleId']).append(sorted_deal)
780
            else:
781
                blockedInfoAccessories[sorted_deal['skuBundleId']] = [sorted_deal]
782
            continue
19441 kshitij.so 783
 
17469 kshitij.so 784
        if sortedMapAccessories.get(sorted_deal['skuBundleId']) is None:
785
            sortedMapAccessories[sorted_deal['skuBundleId']] = {rankAccessories:[sorted_deal]}
786
            rankMapAccessories[rankAccessories] = (sortedMapAccessories[sorted_deal['skuBundleId']].values())[0]
787
            rankAccessories = rankAccessories +1
788
        else:
789
            for temp_list in sortedMapAccessories.get(sorted_deal['skuBundleId']).itervalues():
790
                temp_list.append(sorted_deal)
791
            rankMapAccessories[(sortedMapAccessories.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
19441 kshitij.so 792
 
793
 
17469 kshitij.so 794
    for rank in blockedRanksAccessories:
795
        if blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId')) is not None:
796
            rankMapAccessories[rank] = blockedInfoAccessories.get((featuredDealsAccessories.get(rank+1)).get('skuBundleId'))
19441 kshitij.so 797
 
19288 kshitij.so 798
    specialOffer = None
799
    promoOffer = get_mongo_connection().Catalog.PromoOffer.find_one({'user_id':userId})
800
    try:
801
        if promoOffer is not None:
802
            offer = get_mongo_connection().Catalog.Promotions.find_one({'_id':promoOffer.get('offer_id')})
803
            if offer is None:
804
                raise
19352 kshitij.so 805
            promo = Promotion(offer.get('_id'),offer.get('offer_name'),offer.get('offer_description') , offer.get('categories_applicable'), offer.get('sub_categories_not_applicable'),
19331 kshitij.so 806
                     offer.get('startDate'), offer.get('endDate'), promoOffer.get('target1'), promoOffer.get('target1_cash_back_percetage'), promoOffer.get('target2'), promoOffer.get('target2_cash_back_percetage'), promoOffer.get('maxCashBack'),offer.get('url'),
19350 kshitij.so 807
                     promoOffer.get('pending_order_value'), promoOffer.get('delivered_order_value'), promoOffer.get('last_run_timestamp'))
17469 kshitij.so 808
 
19288 kshitij.so 809
            specialOffer = promo
810
    except:
19435 kshitij.so 811
        traceback.print_exc()
19288 kshitij.so 812
 
813
 
19441 kshitij.so 814
    mem_cache_val = {6:accessories_deals,"6_rankMap": rankMapAccessories, "specialOffer":specialOffer }
815
    mc.set(str(userId)+'_acc', mem_cache_val)
816
 
14037 kshitij.so 817
 
818
 
14531 kshitij.so 819
def __populateFeaturedDeals():
17367 kshitij.so 820
    print "Populating featured deals....."
821
    featuredDealsMobiles = {}
822
    featuredDealsTablets = {}
17469 kshitij.so 823
    featuredDealsAccessories = {}
17618 kshitij.so 824
    activeFeaturedDeals = get_mongo_connection().Catalog.FeaturedDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}})
14531 kshitij.so 825
    for activeFeaturedDeal in activeFeaturedDeals:
17367 kshitij.so 826
        deals = get_mongo_connection().Catalog.Deals.find({"skuBundleId":activeFeaturedDeal.get('skuBundleId'),"$or":[{"showDeal":1}, {"prepaidDeal":1}]})
827
        for deal in deals:
828
            if deal.get('available_price') <= activeFeaturedDeal.get('thresholdPrice'):
17469 kshitij.so 829
                for category_id, rank  in activeFeaturedDeal['otherInfo'].iteritems():
830
                    f_deal = {'skuBundleId':activeFeaturedDeal.get('skuBundleId'), 'thresholdPrice':activeFeaturedDeal.get('thresholdPrice'), 'rank':rank,'category_id':int(category_id),'totalPoints':activeFeaturedDeal.get('totalPoints')}
831
                    if f_deal['category_id'] == 3:
832
                        featuredDealsMobiles[rank] = f_deal
833
                    elif f_deal['category_id']==5:
834
                        featuredDealsTablets[rank] = f_deal
835
                    elif f_deal['category_id']==6:
836
                        featuredDealsAccessories[rank] = f_deal
17367 kshitij.so 837
                break
17469 kshitij.so 838
 
839
#                f_deal = {'skuBundleId':activeFeaturedDeal.get('skuBundleId'), 'thresholdPrice':activeFeaturedDeal.get('thresholdPrice'), 'rank':activeFeaturedDeal.get('rank'),'category_id':activeFeaturedDeal.get('category_id'),'totalPoints':activeFeaturedDeal.get('totalPoints')}
840
#                 if activeFeaturedDeal.get('category_id') == 3:
841
#                     featuredDealsMobiles[activeFeaturedDeal.get('rank')] = f_deal
842
#                 else:
843
#                     featuredDealsTablets[activeFeaturedDeal.get('rank')] = f_deal
844
#                 break
845
 
17367 kshitij.so 846
 
17469 kshitij.so 847
    mc.set("featured_deals", {3:featuredDealsMobiles,5:featuredDealsTablets,6:featuredDealsAccessories}, 600)
14037 kshitij.so 848
 
17618 kshitij.so 849
def __populateFeaturedDealsForDealObject():
850
    print "Caching deal objects...."
851
    featuredDealObjectMobiles = {}
852
    featuredDealObjectTablets = {}
853
    featuredDealObjectAccessories = {}
854
    dealObjects = get_mongo_connection().Catalog.FeaturedDealsDealObject.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}})
855
    for dealObject in dealObjects:
856
        d_object = list(get_mongo_connection().Catalog.DealObject.find({'_id':dealObject['_id']}))
857
        if len(d_object) == 0:
858
            continue
859
        for category_id, rank  in dealObject['otherInfo'].iteritems():
860
            d_object[0]['dealObject'] = 1
19288 kshitij.so 861
            f_deal = {'rank':rank,'category_id':int(category_id),'object':d_object[0],'offer_id':dealObject.get('offer_id')}
17618 kshitij.so 862
            if f_deal['category_id'] == 3:
863
                featuredDealObjectMobiles[rank] = f_deal
864
            elif f_deal['category_id']==5:
865
                featuredDealObjectTablets[rank] = f_deal
866
            elif f_deal['category_id']==6:
867
                featuredDealObjectAccessories[rank] = f_deal
868
    mc.set("featured_deals_deal_object", {3:featuredDealObjectMobiles,5:featuredDealObjectTablets,6:featuredDealObjectAccessories}, 600)
17619 kshitij.so 869
    print mc.get('featured_deals_deal_object')
17618 kshitij.so 870
 
14791 kshitij.so 871
def getNewDeals(userId, category_id, offset, limit, sort, direction, filterData=None):
17469 kshitij.so 872
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
13921 kshitij.so 873
        populateCashBack()
14037 kshitij.so 874
 
16079 kshitij.so 875
    dealsListMap = []
14037 kshitij.so 876
    user_specific_deals = mc.get(str(userId))
877
    if user_specific_deals is None:
878
        __populateCache(userId)
879
        user_specific_deals = mc.get(str(userId))
14038 kshitij.so 880
    else:
881
        print "Getting user deals from cache"
14037 kshitij.so 882
    category_specific_deals = user_specific_deals.get(category_id)
883
 
17367 kshitij.so 884
    insert_featured_deals = False
14037 kshitij.so 885
    if sort is None or direction is None:
17367 kshitij.so 886
        insert_featured_deals = True
887
        rankMap = user_specific_deals.get(str(category_id)+"_rankMap")
14037 kshitij.so 888
    else:
889
        if sort == "bestSellerPoints":
890
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['bestSellerPoints'], x['rank'], x['nlcPoints']),reverse=True)
891
        else:
892
            if direction == -1:
893
                rev = True
894
            else:
895
                rev = False
896
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['available_price']),reverse=rev)
897
 
14791 kshitij.so 898
 
17367 kshitij.so 899
    filtered_deals = []
17668 kshitij.so 900
    dataExist = True
14791 kshitij.so 901
    if filterData is not None:
902
        try:
17669 kshitij.so 903
            filtered_deals = filterDeals(category_specific_deals, filterData)
904
            if len(filtered_deals)==0:
905
                dataExist = False
14791 kshitij.so 906
        except:
16067 kshitij.so 907
            traceback.print_exc()
17668 kshitij.so 908
    if dataExist:
14791 kshitij.so 909
 
17668 kshitij.so 910
        if not insert_featured_deals:
911
            sortedMap = {}
912
            rankMap = {}
913
            rank = 0
914
            for sorted_deal in sorted_deals:
915
 
916
                if len(filtered_deals) > 0 and  sorted_deal['skuBundleId'] not in filtered_deals:
917
                    continue
918
 
919
                if sortedMap.get(sorted_deal['skuBundleId']) is None:
920
                    sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
921
                    rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
922
                    rank = rank +1
923
                else:
924
                    for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
925
                        temp_list.append(sorted_deal)
926
                    rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
927
        else:
928
            filterMap = {}
929
            rank = 0
930
            if len(filtered_deals) > 0:
931
                try:
932
                    od = collections.OrderedDict(sorted(rankMap.items()))
933
                except:
934
                    od = ordereddict.OrderedDict(sorted(rankMap.items()))
935
                for k, v in od.iteritems():
936
                    if v[0].get('skuBundleId') in filtered_deals:
937
                        filterMap[rank] = v
938
                        rank =rank+1
939
                rankMap = filterMap
940
 
941
        rankCounter = offset
942
        if filterData is None:
943
            if mc.get("featured_deals_deal_object") is None or not bool(mc.get("featured_deals_deal_object")):
944
                try:
945
                    __populateFeaturedDealsForDealObject()
946
                    fd_dealObject = mc.get("featured_deals_deal_object")
947
                except:
948
                    fd_dealObject = {3:{},5:{},6:{}}
17367 kshitij.so 949
            else:
17668 kshitij.so 950
                fd_dealObject = mc.get("featured_deals_deal_object")
951
 
17367 kshitij.so 952
    else:
17668 kshitij.so 953
        rankMap = {}
17618 kshitij.so 954
 
19288 kshitij.so 955
 
956
    specialOffer = user_specific_deals.get('specialOffer')
957
 
17627 kshitij.so 958
    for dealList in [rankMap.get(k, []) for k in range(offset, offset+limit)]:
17629 kshitij.so 959
        if filterData is None:
17627 kshitij.so 960
            while(True):
961
 
962
                rankCounter = rankCounter+1
963
                if (fd_dealObject.get(category_id).get(rankCounter)) is not None:
19288 kshitij.so 964
                    if (fd_dealObject.get(category_id).get(rankCounter).get('offer_id') !=0):
965
                        #Check whether user can see offer
19435 kshitij.so 966
                        if specialOffer is None or specialOffer.endDate < to_java_date(datetime.now()):
19288 kshitij.so 967
                            continue
19334 kshitij.so 968
                    deal_object_temp = []
969
                    deal_object_temp.append(fd_dealObject.get(category_id).get(rankCounter).get('object'))
970
                    dealsListMap.append(deal_object_temp)
17627 kshitij.so 971
                else:
972
                    break
17620 kshitij.so 973
 
16079 kshitij.so 974
        temp = []
17367 kshitij.so 975
        if dealList is None or len(dealList)==0:
976
            continue
16067 kshitij.so 977
        for d in dealList:
978
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
16320 kshitij.so 979
            if len(item) ==0:
980
                continue
16079 kshitij.so 981
            item[0]['persPoints'] = d['persPoints']
982
            if d['dealType'] == 1 and d['source_id'] ==1:
16511 kshitij.so 983
                try:
984
                    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())}}))
985
                    item[0]['marketPlaceUrl'] = manualDeal[0]['dealUrl'].strip()
986
                except:
987
                    pass
16079 kshitij.so 988
            elif d['source_id'] ==3:
989
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
990
            else:
991
                pass 
992
            try:
993
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
994
                if not cashBack or cashBack.get('cash_back_status')!=1:
14037 kshitij.so 995
                    item[0]['cash_back_type'] = 0
996
                    item[0]['cash_back'] = 0
16079 kshitij.so 997
                else:
17180 kshitij.so 998
                    if cashBack.get('maxCashBack') is not None:
999
 
1000
                        if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*item[0]['available_price'])/100 > cashBack.get('maxCashBack'):
1001
                            cashBack['cash_back_type'] = 2
1002
                            cashBack['cash_back'] = cashBack['maxCashBack']
1003
                        elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
1004
                            cashBack['cash_back'] = cashBack['maxCashBack']
1005
 
16079 kshitij.so 1006
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
1007
                    item[0]['cash_back'] = cashBack['cash_back']
1008
            except:
1009
                print "Error in adding cashback to deals"
1010
                item[0]['cash_back_type'] = 0
1011
                item[0]['cash_back'] = 0
16252 kshitij.so 1012
            try:
1013
                item[0]['dp'] = d['dp']
1014
                item[0]['showDp'] = d['showDp']
1015
            except:
1016
                item[0]['dp'] = 0.0
1017
                item[0]['showDp'] = 0
16483 kshitij.so 1018
            try:
1019
                item[0]['thumbnail'] = item[0]['thumbnail'].strip()
1020
            except:
17115 manish.sha 1021
                pass
17603 kshitij.so 1022
 
1023
            try:
1024
                if item[0]['showVideo']==0:
1025
                    item[0]['videoLink'] =""
1026
            except:
1027
                item[0]['videoLink'] =""
17937 kshitij.so 1028
            try:
1029
                if item[0]['quantity'] >1:
1030
                    ppq = float(item[0]['available_price'])/item[0]['quantity']
1031
 
1032
                    if ppq == round(ppq):
1033
                        item[0]['ppq'] = int(ppq)
1034
                    else:
1035
                        item[0]['ppq'] = round(ppq,2)
1036
                else:
1037
                    item[0]['ppq'] = 0
1038
            except:
1039
                item[0]['ppq'] = 0
17627 kshitij.so 1040
            if filterData is None:
17679 kshitij.so 1041
                if item[0]['category_id']!=6:
1042
                    try:
18830 kshitij.so 1043
                        item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
1044
                        item[0]['filterTextBrand'] = (item[0]['brand'])
17679 kshitij.so 1045
                    except:
18830 kshitij.so 1046
                        pass
17679 kshitij.so 1047
                else:
1048
                    try:
17756 kshitij.so 1049
                        if item[0]['subCategory']=='' or item[0]['subCategory'] is None or item[0]['subCategoryId']==0:
17679 kshitij.so 1050
                            raise
18830 kshitij.so 1051
                        item[0]['filterLinkSubCategory'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['subCategory'])+'&filter=subcategory&subcategories='+str(int(item[0]['subCategoryId']))
1052
                        item[0]['filterTextSubCategory'] = (item[0]['subCategory'])
1053
                        item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
1054
                        item[0]['filterTextBrand'] = (item[0]['brand'])
17679 kshitij.so 1055
                    except:
18830 kshitij.so 1056
                        pass
17771 kshitij.so 1057
            try:
1058
                if item[0]['source_id']==4:
1059
                    item_availability_info = mc.get("item_availability_"+str(item[0]['identifier']).strip())
1060
                    if item_availability_info is None or len(item_availability_info)==0:
1061
                        item[0]['availabilityInfo'] = [{}]
1062
                    else:
1063
                        item[0]['availabilityInfo'] = item_availability_info
1064
            except:
1065
                item[0]['availabilityInfo'] = [{}]
19193 kshitij.so 1066
 
1067
            if item[0]['source_id']==4:
1068
                for av_info in item[0]['availabilityInfo']:
1069
                    if not av_info:
1070
                        continue
1071
                    av_info['cash_back'] = item[0]['cash_back']
1072
                    av_info['cash_back_type'] = item[0]['cash_back_type']
1073
                    netPriceAfterCashBack = av_info['sellingPrice'] 
19199 kshitij.so 1074
                    if av_info['cash_back_type'] ==1:
19207 kshitij.so 1075
                        netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(float(av_info['sellingPrice'])*av_info['cash_back']/100)
19199 kshitij.so 1076
                    elif av_info['cash_back_type'] ==2:
19207 kshitij.so 1077
                        netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(av_info['cash_back'])
19193 kshitij.so 1078
                    else:
1079
                        pass
1080
                    av_info['netPriceAfterCashBack'] = netPriceAfterCashBack
1081
 
1082
            #item[0]['netPriceAfterCashBack'] = d['netPriceAfterCashBack']
1083
 
1084
            if item[0]['source_id'] != SOURCE_MAP.get("PAYTM.COM"):
1085
                if item[0]['codAvailable'] ==1:
1086
                    paytmPrice = item[0]['available_price']
1087
                else:
1088
                    paytmPrice = item[0]['gross_price']
1089
 
1090
                if item[0]['cash_back_type'] ==1:
19207 kshitij.so 1091
                    item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(float(paytmPrice)*item[0]['cash_back']/100)
19193 kshitij.so 1092
                elif item[0]['cash_back_type'] ==2:
19207 kshitij.so 1093
                    item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(item[0]['cash_back'])
19193 kshitij.so 1094
                else:
1095
                    item[0]['netPriceAfterCashBack'] = paytmPrice
1096
 
1097
            else:
1098
                if item[0]['cash_back_type'] ==1:
19207 kshitij.so 1099
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(float(item[0]['available_price'])*item[0]['cash_back']/100)
19193 kshitij.so 1100
                elif item[0]['cash_back_type'] ==2:
19207 kshitij.so 1101
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(item[0]['cash_back'])
19193 kshitij.so 1102
                else:
1103
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price']
1104
 
19441 kshitij.so 1105
            temp.append(item[0])
1106
        if len(temp) > 1:
1107
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
1108
        dealsListMap.append(temp)
1109
    return dealsListMap
1110
 
1111
 
1112
def getAccesoryDeals(userId, category_id, offset, limit, sort, direction, filterData=None):
1113
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
1114
        populateCashBack()
1115
 
1116
    dealsListMap = []
1117
    user_specific_deals = mc.get(str(userId)+'_acc')
1118
    if user_specific_deals is None:
1119
        __populateCacheForAccessories(userId)
1120
        user_specific_deals = mc.get(str(userId)+'_acc')
1121
    else:
1122
        print "Getting user deals from accessory cache"
1123
    category_specific_deals = user_specific_deals.get(category_id)
1124
 
1125
    insert_featured_deals = False
1126
    if sort is None or direction is None:
1127
        insert_featured_deals = True
1128
        rankMap = user_specific_deals.get(str(category_id)+"_rankMap")
1129
    else:
1130
        if sort == "bestSellerPoints":
1131
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['bestSellerPoints'], x['internalRank'], x['nlcPoints']),reverse=True)
1132
        else:
1133
            if direction == -1:
1134
                rev = True
1135
            else:
1136
                rev = False
1137
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['available_price']),reverse=rev)
1138
 
1139
 
1140
    filtered_deals = []
1141
    dataExist = True
1142
    if filterData is not None:
1143
        try:
1144
            filtered_deals = filterDeals(category_specific_deals, filterData)
1145
            if len(filtered_deals)==0:
1146
                dataExist = False
1147
        except:
1148
            traceback.print_exc()
1149
    if dataExist:
1150
 
1151
        if not insert_featured_deals:
1152
            sortedMap = {}
1153
            rankMap = {}
1154
            rank = 0
1155
            for sorted_deal in sorted_deals:
1156
 
1157
                if len(filtered_deals) > 0 and  sorted_deal['skuBundleId'] not in filtered_deals:
1158
                    continue
1159
 
1160
                if sortedMap.get(sorted_deal['skuBundleId']) is None:
1161
                    sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1162
                    rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1163
                    rank = rank +1
1164
                else:
1165
                    for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1166
                        temp_list.append(sorted_deal)
1167
                    rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1168
        else:
1169
            filterMap = {}
1170
            rank = 0
1171
            if len(filtered_deals) > 0:
1172
                try:
1173
                    od = collections.OrderedDict(sorted(rankMap.items()))
1174
                except:
1175
                    od = ordereddict.OrderedDict(sorted(rankMap.items()))
1176
                for k, v in od.iteritems():
1177
                    if v[0].get('skuBundleId') in filtered_deals:
1178
                        filterMap[rank] = v
1179
                        rank =rank+1
1180
                rankMap = filterMap
1181
 
1182
        rankCounter = offset
1183
        if filterData is None:
1184
            if mc.get("featured_deals_deal_object") is None or not bool(mc.get("featured_deals_deal_object")):
1185
                try:
1186
                    __populateFeaturedDealsForDealObject()
1187
                    fd_dealObject = mc.get("featured_deals_deal_object")
1188
                except:
1189
                    fd_dealObject = {3:{},5:{},6:{}}
1190
            else:
1191
                fd_dealObject = mc.get("featured_deals_deal_object")
1192
 
1193
    else:
1194
        rankMap = {}
1195
 
1196
 
1197
    specialOffer = user_specific_deals.get('specialOffer')
1198
 
1199
    for dealList in [rankMap.get(k, []) for k in range(offset, offset+limit)]:
1200
        if filterData is None:
1201
            while(True):
1202
 
1203
                rankCounter = rankCounter+1
1204
                if (fd_dealObject.get(category_id).get(rankCounter)) is not None:
1205
                    if (fd_dealObject.get(category_id).get(rankCounter).get('offer_id') !=0):
1206
                        #Check whether user can see offer
1207
                        if specialOffer is None or specialOffer.endDate < to_java_date(datetime.now()):
1208
                            continue
1209
                    deal_object_temp = []
1210
                    deal_object_temp.append(fd_dealObject.get(category_id).get(rankCounter).get('object'))
1211
                    dealsListMap.append(deal_object_temp)
1212
                else:
1213
                    break
1214
 
1215
        temp = []
1216
        if dealList is None or len(dealList)==0:
1217
            continue
1218
        for d in dealList:
1219
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
1220
            if len(item) ==0:
1221
                continue
1222
            if d['dealType'] == 1 and d['source_id'] ==1:
1223
                try:
1224
                    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())}}))
1225
                    item[0]['marketPlaceUrl'] = manualDeal[0]['dealUrl'].strip()
1226
                except:
1227
                    pass
1228
            elif d['source_id'] ==3:
1229
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
1230
            else:
1231
                pass 
1232
            try:
1233
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
1234
                if not cashBack or cashBack.get('cash_back_status')!=1:
1235
                    item[0]['cash_back_type'] = 0
1236
                    item[0]['cash_back'] = 0
1237
                else:
1238
                    if cashBack.get('maxCashBack') is not None:
1239
 
1240
                        if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*item[0]['available_price'])/100 > cashBack.get('maxCashBack'):
1241
                            cashBack['cash_back_type'] = 2
1242
                            cashBack['cash_back'] = cashBack['maxCashBack']
1243
                        elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
1244
                            cashBack['cash_back'] = cashBack['maxCashBack']
1245
 
1246
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
1247
                    item[0]['cash_back'] = cashBack['cash_back']
1248
            except:
1249
                print "Error in adding cashback to deals"
1250
                item[0]['cash_back_type'] = 0
1251
                item[0]['cash_back'] = 0
1252
            try:
1253
                item[0]['dp'] = d['dp']
1254
                item[0]['showDp'] = d['showDp']
1255
            except:
1256
                item[0]['dp'] = 0.0
1257
                item[0]['showDp'] = 0
1258
            try:
1259
                item[0]['thumbnail'] = item[0]['thumbnail'].strip()
1260
            except:
1261
                pass
1262
 
1263
            try:
1264
                if item[0]['showVideo']==0:
1265
                    item[0]['videoLink'] =""
1266
            except:
1267
                item[0]['videoLink'] =""
1268
            try:
1269
                if item[0]['quantity'] >1:
1270
                    ppq = float(item[0]['available_price'])/item[0]['quantity']
1271
 
1272
                    if ppq == round(ppq):
1273
                        item[0]['ppq'] = int(ppq)
1274
                    else:
1275
                        item[0]['ppq'] = round(ppq,2)
1276
                else:
1277
                    item[0]['ppq'] = 0
1278
            except:
1279
                item[0]['ppq'] = 0
1280
            if filterData is None:
1281
                if item[0]['category_id']!=6:
1282
                    try:
1283
                        item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
1284
                        item[0]['filterTextBrand'] = (item[0]['brand'])
1285
                    except:
1286
                        pass
1287
                else:
1288
                    try:
1289
                        if item[0]['subCategory']=='' or item[0]['subCategory'] is None or item[0]['subCategoryId']==0:
1290
                            raise
1291
                        item[0]['filterLinkSubCategory'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['subCategory'])+'&filter=subcategory&subcategories='+str(int(item[0]['subCategoryId']))
1292
                        item[0]['filterTextSubCategory'] = (item[0]['subCategory'])
1293
                        item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
1294
                        item[0]['filterTextBrand'] = (item[0]['brand'])
1295
                    except:
1296
                        pass
1297
            try:
1298
                if item[0]['source_id']==4:
1299
                    item_availability_info = mc.get("item_availability_"+str(item[0]['identifier']).strip())
1300
                    if item_availability_info is None or len(item_availability_info)==0:
1301
                        item[0]['availabilityInfo'] = [{}]
1302
                    else:
1303
                        item[0]['availabilityInfo'] = item_availability_info
1304
            except:
1305
                item[0]['availabilityInfo'] = [{}]
1306
 
1307
            if item[0]['source_id']==4:
1308
                for av_info in item[0]['availabilityInfo']:
1309
                    if not av_info:
1310
                        continue
1311
                    av_info['cash_back'] = item[0]['cash_back']
1312
                    av_info['cash_back_type'] = item[0]['cash_back_type']
1313
                    netPriceAfterCashBack = av_info['sellingPrice'] 
1314
                    if av_info['cash_back_type'] ==1:
1315
                        netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(float(av_info['sellingPrice'])*av_info['cash_back']/100)
1316
                    elif av_info['cash_back_type'] ==2:
1317
                        netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(av_info['cash_back'])
1318
                    else:
1319
                        pass
1320
                    av_info['netPriceAfterCashBack'] = netPriceAfterCashBack
1321
 
1322
            #item[0]['netPriceAfterCashBack'] = d['netPriceAfterCashBack']
1323
 
1324
            if item[0]['source_id'] != SOURCE_MAP.get("PAYTM.COM"):
1325
                if item[0]['codAvailable'] ==1:
1326
                    paytmPrice = item[0]['available_price']
1327
                else:
1328
                    paytmPrice = item[0]['gross_price']
1329
 
1330
                if item[0]['cash_back_type'] ==1:
1331
                    item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(float(paytmPrice)*item[0]['cash_back']/100)
1332
                elif item[0]['cash_back_type'] ==2:
1333
                    item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(item[0]['cash_back'])
1334
                else:
1335
                    item[0]['netPriceAfterCashBack'] = paytmPrice
1336
 
1337
            else:
1338
                if item[0]['cash_back_type'] ==1:
1339
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(float(item[0]['available_price'])*item[0]['cash_back']/100)
1340
                elif item[0]['cash_back_type'] ==2:
1341
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(item[0]['cash_back'])
1342
                else:
1343
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price']
1344
 
19320 kshitij.so 1345
#             if specialOffer is not None and item[0]['source_id']==4:
1346
#                 if item[0]['category_id'] in specialOffer.categories_applicable and item[0]['subCategoryId'] not in specialOffer.sub_categories_not_applicable:
1347
#                     item[0]['specialOffer'] = specialOffer.__dict__
1348
#             else:
1349
#                 item[0]['specialOffer'] = {}
19288 kshitij.so 1350
 
16079 kshitij.so 1351
            temp.append(item[0])
16125 kshitij.so 1352
        if len(temp) > 1:
16126 kshitij.so 1353
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
16079 kshitij.so 1354
        dealsListMap.append(temp)
1355
    return dealsListMap
14037 kshitij.so 1356
 
19441 kshitij.so 1357
 
14791 kshitij.so 1358
def filterDeals(deals, filterData):
17658 kshitij.so 1359
    print "Filter data ", filterData
14791 kshitij.so 1360
    brandsFiltered = []
17657 kshitij.so 1361
    subCategoryFiltered = []
14791 kshitij.so 1362
    filterArray = filterData.split('|')
1363
    for data in filterArray:
1364
        try:
1365
            filter, info = data.split(':')
1366
        except Exception as ex:
1367
            traceback.print_exc()
1368
            continue
17657 kshitij.so 1369
        if filter == 'brandFilter':
14791 kshitij.so 1370
            toFilter = info.split('^')
1371
            print "brand filter ",toFilter
1372
            for deal in deals:
15151 kshitij.so 1373
                if str(int(deal['brand_id'])) in toFilter:
14791 kshitij.so 1374
                    brandsFiltered.append(deal)
17657 kshitij.so 1375
        elif filter =='subCategoryFilter':
1376
            toFilter = info.split('^')
1377
            print "Sub Category filter ",toFilter
1378
            for deal in deals:
1379
                if str(int(deal['subCategoryId'])) in toFilter:
1380
                    subCategoryFiltered.append(deal)
17668 kshitij.so 1381
    print "No of brand filtered ",len(brandsFiltered)
1382
    print "No of sub-cat filtered ",len(subCategoryFiltered)
17657 kshitij.so 1383
    if len(subCategoryFiltered) == 0:
17367 kshitij.so 1384
        return [trend['skuBundleId'] for trend in brandsFiltered]
17663 kshitij.so 1385
    elif len(brandsFiltered) == 0:
1386
        return [trend['skuBundleId'] for trend in subCategoryFiltered]
17669 kshitij.so 1387
    return [i['skuBundleId'] for i in subCategoryFiltered for j in brandsFiltered if i['_id']==j['_id']]
14791 kshitij.so 1388
 
1389
 
14037 kshitij.so 1390
def getDeals(userId, category_id, offset, limit, sort, direction):
17469 kshitij.so 1391
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14037 kshitij.so 1392
        populateCashBack()
1393
    rank = 1
13771 kshitij.so 1394
    deals = {}
13910 kshitij.so 1395
    outer_query = []
1396
    outer_query.append({"showDeal":1})
1397
    query = {}
1398
    query['$gt'] = 0
1399
    outer_query.append({'totalPoints':query})
1400
    if category_id in (3,5):
1401
        outer_query.append({'category_id':category_id})
13803 kshitij.so 1402
    if sort is None or direction is None:
1403
        direct = -1
13910 kshitij.so 1404
        print outer_query
1405
        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 1406
    else:
13910 kshitij.so 1407
        print outer_query
13803 kshitij.so 1408
        direct = direction
13910 kshitij.so 1409
        if sort == "bestSellerPoints":
1410
            print "yes,sorting by bestSellerPoints"
1411
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([('bestSellerPoints',direct),('rank',direct),('nlcPoints',direct)]).skip(offset).limit(limit))
1412
        else:
1413
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([(sort,direct)]).skip(offset).limit(limit))
13771 kshitij.so 1414
    for d in data:
1415
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
1416
        if not deals.has_key(item[0]['identifier']):
13921 kshitij.so 1417
            item[0]['dealRank'] = rank
1418
            try:
14761 kshitij.so 1419
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
13921 kshitij.so 1420
                if not cashBack or cashBack.get('cash_back_status')!=1:
13928 kshitij.so 1421
                    item[0]['cash_back_type'] = 0
1422
                    item[0]['cash_back'] = 0
13921 kshitij.so 1423
                else:
14766 kshitij.so 1424
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
13928 kshitij.so 1425
                    item[0]['cash_back'] = cashBack['cash_back']
13921 kshitij.so 1426
            except:
1427
                print "Error in adding cashback to deals"
13928 kshitij.so 1428
                item[0]['cash_back_type'] = 0
1429
                item[0]['cash_back'] = 0
13771 kshitij.so 1430
            deals[item[0]['identifier']] = item[0]
13921 kshitij.so 1431
 
13771 kshitij.so 1432
            rank +=1
13785 kshitij.so 1433
    return sorted(deals.values(), key=itemgetter('dealRank'))
1434
 
16222 kshitij.so 1435
def getItem(skuId,showDp=None):
16224 kshitij.so 1436
    temp = []
17469 kshitij.so 1437
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14113 kshitij.so 1438
        populateCashBack()
13795 kshitij.so 1439
    try:
16222 kshitij.so 1440
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'_id':int(skuId)})
1441
        if skuData is None:
1442
            raise
1443
        try:
1444
            cashBack = getCashBack(skuData['_id'], skuData['source_id'], skuData['category_id'])
1445
            if not cashBack or cashBack.get('cash_back_status')!=1:
1446
                skuData['cash_back_type'] = 0
1447
                skuData['cash_back'] = 0
1448
            else:
1449
                skuData['cash_back_type'] = cashBack['cash_back_type']
1450
                skuData['cash_back'] = cashBack['cash_back']
1451
        except:
1452
            print "Error in adding cashback to deals"
1453
            skuData['cash_back_type'] = 0
1454
            skuData['cash_back'] = 0
1455
        skuData['in_stock'] = int(skuData['in_stock'])
1456
        skuData['is_shortage'] = int(skuData['is_shortage'])
1457
        skuData['category_id'] = int(skuData['category_id'])
17607 kshitij.so 1458
        skuData['subCategoryId'] = int(skuData['subCategoryId'])
16222 kshitij.so 1459
        skuData['status'] = int(skuData['status'])
16483 kshitij.so 1460
        try:
1461
            skuData['thumbnail'] = skuData['thumbnail'].strip()
1462
        except:
1463
            pass 
16222 kshitij.so 1464
        if showDp is not None:
1465
            dealerPrice = get_mongo_connection().Catalog.SkuDealerPrices.find_one({'skuBundleId':skuData['skuBundleId']})
1466
            skuData['dp'] = 0.0
1467
            skuData['showDp'] = 0
1468
            if dealerPrice is not None:
1469
                skuData['dp'] = dealerPrice['dp']
1470
                skuData['showDp'] = dealerPrice['showDp']
16224 kshitij.so 1471
        temp.append(skuData)
1472
        return temp
13795 kshitij.so 1473
    except:
16224 kshitij.so 1474
        return []
13836 kshitij.so 1475
 
14761 kshitij.so 1476
def getCashBack(skuId, source_id, category_id):
17469 kshitij.so 1477
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14761 kshitij.so 1478
        populateCashBack()
1479
    itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 1480
    itemCashBack = itemCashBackMap.get(skuId)
1481
    if itemCashBack is not None:
1482
        return itemCashBack
14761 kshitij.so 1483
    cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 1484
    sourceCashBack = cashBackMap.get(source_id)
1485
    if sourceCashBack is not None and len(sourceCashBack) > 0:
1486
        for cashBack in sourceCashBack:
1487
            if cashBack.get(category_id) is None:
1488
                continue
1489
            else:
1490
                return cashBack.get(category_id)
1491
    else:
1492
        return {}
16560 amit.gupta 1493
 
1494
def getBundleBySourceSku(source_id, identifier):
17035 kshitij.so 1495
    if source_id in (1,2,4,5,6,7):
16560 amit.gupta 1496
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
1497
    elif source_id == 3:
1498
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
1499
    else:
1500
        return {}
1501
 
1502
    if not skuData:
1503
        return {}
1504
    else:
16564 amit.gupta 1505
        bundleId = skuData[0]["skuBundleId"]
17035 kshitij.so 1506
        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 1507
                       {"source_id":1, "available_price":1, "marketPlaceUrl":1, "gross_price":1, "codAvailable":1, "source_product_name":1, "offer":1, "coupon":1}))
16579 amit.gupta 1508
        return {'products':itemIds}
16560 amit.gupta 1509
 
1510
 
13921 kshitij.so 1511
 
15129 kshitij.so 1512
def getDealRank(identifier, source_id, userId):
17035 kshitij.so 1513
    if source_id in (1,2,4,5,6,7):
15129 kshitij.so 1514
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
1515
    elif source_id == 3:
1516
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
1517
    else:
16282 amit.gupta 1518
        return {'rank':0, 'description':'Source not valid','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15349 kshitij.so 1519
    if len(skuData) == 0:
16282 amit.gupta 1520
        return {'rank':0, 'description':'No matching product identifier found','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15129 kshitij.so 1521
    user_specific_deals = mc.get(str(userId))
1522
    if user_specific_deals is None:
1523
        __populateCache(userId)
1524
        user_specific_deals = mc.get(str(userId))
1525
    else:
1526
        print "Getting user deals from cache"
1527
    category_id = skuData[0]['category_id']
1528
    category_specific_deals = user_specific_deals.get(category_id)
16280 kshitij.so 1529
 
1530
    dealsData = get_mongo_connection().Catalog.Deals.find_one({'skuBundleId':skuData[0]['skuBundleId']})
1531
    if dealsData is None:
1532
        dealsData = {}
1533
 
15129 kshitij.so 1534
    if category_specific_deals is None or len(category_specific_deals) ==0:
16280 kshitij.so 1535
        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 1536
    sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
16168 kshitij.so 1537
    sortedMap = {}
1538
    rankMap = {}
1539
    rank = 0
15129 kshitij.so 1540
    for sorted_deal in sorted_deals:
16168 kshitij.so 1541
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
1542
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1543
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1544
            rank = rank +1
1545
        else:
1546
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1547
                temp_list.append(sorted_deal)
1548
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1549
 
16187 kshitij.so 1550
    for dealRank ,dealList in rankMap.iteritems():
16168 kshitij.so 1551
        for d in dealList:
16186 kshitij.so 1552
            if d['skuBundleId'] == skuData[0]['skuBundleId']:
16280 kshitij.so 1553
                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 1554
 
16280 kshitij.so 1555
    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 1556
 
1557
 
13836 kshitij.so 1558
def getCashBackDetails(identifier, source_id):
17469 kshitij.so 1559
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
13921 kshitij.so 1560
        populateCashBack()
13771 kshitij.so 1561
 
17035 kshitij.so 1562
    if source_id in (1,2,4,5,6,7):
13839 kshitij.so 1563
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1564
    elif source_id == 3:
13839 kshitij.so 1565
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 1566
    else:
1567
        return {}
13836 kshitij.so 1568
    if len(skuData) > 0:
14761 kshitij.so 1569
        itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 1570
        itemCashBack = itemCashBackMap.get(skuData[0]['_id'])
1571
        if itemCashBack is not None:
1572
            return itemCashBack
14761 kshitij.so 1573
        cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 1574
        sourceCashBack = cashBackMap.get(source_id)
1575
        if sourceCashBack is not None and len(sourceCashBack) > 0:
1576
            for cashBack in sourceCashBack:
1577
                if cashBack.get(skuData[0]['category_id']) is None:
1578
                    continue
1579
                else:
1580
                    return cashBack.get(skuData[0]['category_id'])
13836 kshitij.so 1581
        else:
1582
            return {} 
1583
    else:
1584
        return {}
13986 amit.gupta 1585
 
14398 amit.gupta 1586
def getImgSrc(identifier, source_id):
1587
    skuData = None
17035 kshitij.so 1588
    if source_id in (1,2,4,5,6,7):
14414 amit.gupta 1589
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1590
    elif source_id == 3:
14414 amit.gupta 1591
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 1592
    if skuData is None:
1593
        return {}
1594
    else:
16483 kshitij.so 1595
        try:
1596
            return {'thumbnail':skuData.get('thumbnail').strip()}
1597
        except:
1598
            return {'thumbnail':skuData.get('thumbnail')}
13986 amit.gupta 1599
 
1600
def next_weekday(d, weekday):
1601
    days_ahead = weekday - d.weekday()
1602
    if days_ahead <= 0: # Target day already happened this week
1603
        days_ahead += 7
1604
    return d + timedelta(days_ahead)
1605
 
13771 kshitij.so 1606
 
13970 kshitij.so 1607
def getAllDealerPrices(offset, limit):
1608
    data = []
1609
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1610
    cursor = collection.find().skip(offset).limit(limit)
1611
    for val in cursor:
15853 kshitij.so 1612
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
1613
        if master is not None:
1614
            val['brand'] = master['brand']
1615
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 1616
        else:
1617
            val['brand'] = ""
1618
            val['source_product_name'] = ""
16231 kshitij.so 1619
        val['showDp'] = int(val['showDp'])
13970 kshitij.so 1620
        data.append(val)
1621
    return data
1622
 
15853 kshitij.so 1623
def addSkuDealerPrice(data):
1624
    collection = get_mongo_connection().Catalog.SkuDealerPrices
1625
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
1626
    if cursor is not None:
1627
        return {0:"BundleId information already present."}
13970 kshitij.so 1628
    else:
15853 kshitij.so 1629
        collection.insert(data)
1630
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1631
        return {1:"Data added successfully"}
1632
 
1633
def updateSkuDealerPrice(data, _id):
1634
    try:
1635
        collection = get_mongo_connection().Catalog.SkuDealerPrices
1636
        collection.update({'_id':ObjectId(_id)},{"$set":{'dp':data['dp']}},upsert=False, multi = False)
15853 kshitij.so 1637
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1638
        return {1:"Data updated successfully"}
1639
    except:
1640
        return {0:"Data not updated."}
1641
 
1642
def updateExceptionalNlc(data, _id):
1643
    try:
1644
        collection = get_mongo_connection().Catalog.ExceptionalNlc
1645
        collection.update({'_id':ObjectId(_id)},{"$set":{'maxNlc':data['maxNlc'], 'minNlc':data['minNlc'], 'overrideNlc':data['overrideNlc']}},upsert=False, multi = False)
15853 kshitij.so 1646
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 1647
        return {1:"Data updated successfully"}
1648
    except:
1649
        return {0:"Data not updated."}
1650
 
14041 kshitij.so 1651
def resetCache(userId):
14043 kshitij.so 1652
    try:
1653
        mc.delete(userId)
19441 kshitij.so 1654
        mc.delete(userId+'_acc')
14043 kshitij.so 1655
        return {1:'Cache cleared.'}
1656
    except:
1657
        return {0:'Unable to clear cache.'}
1658
 
15853 kshitij.so 1659
def updateCollection(data):
1660
    try:
1661
        collection = get_mongo_connection().Catalog[data['class']]
1662
        class_name = data.pop('class')
1663
        _id = data.pop('oid')
1664
        result = collection.update({'_id':ObjectId(_id)},{"$set":data},upsert=False, multi = False)
1665
        if class_name != "Notifications":
1666
            record = list(collection.find({'_id':ObjectId(_id)}))
1667
            if class_name !="CategoryDiscount":
1668
                if record[0].has_key('sku'):
1669
                    field = '_id'
1670
                    val = record[0]['sku']
14852 kshitij.so 1671
                else:
15853 kshitij.so 1672
                    field = 'skuBundleId'
1673
                    val = record[0]['skuBundleId']
1674
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False, multi = True)
1675
            else:
1676
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1677
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
16233 kshitij.so 1678
        if class_name =='SkuDealerPrices':
16237 kshitij.so 1679
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':val},{"$set":data},upsert=False, multi=True)
15853 kshitij.so 1680
        return {1:"Data updated successfully"}
1681
    except Exception as e:
1682
        print e
1683
        return {0:"Data not updated."}
14575 kshitij.so 1684
 
14076 kshitij.so 1685
 
14553 kshitij.so 1686
def addNegativeDeals(data, multi):
1687
    if multi !=1: 
1688
        collection = get_mongo_connection().Catalog.NegativeDeals
1689
        cursor = collection.find({"sku":data['sku']})
1690
        if cursor.count() > 0:
1691
            return {0:"Sku information already present."}
1692
        else:
1693
            collection.insert(data)
1694
            return {1:"Data added successfully"}
14481 kshitij.so 1695
    else:
14553 kshitij.so 1696
        skuIds = __getBundledSkusfromSku(data['sku'])
1697
        for sku in skuIds:
1698
            data['sku'] = sku.get('_id')
1699
            collection = get_mongo_connection().Catalog.NegativeDeals
1700
            cursor = collection.find({"sku":data['sku']})
1701
            if cursor.count() > 0:
1702
                continue
1703
            else:
14558 kshitij.so 1704
                data.pop('_id',None)
14553 kshitij.so 1705
                collection.insert(data)
14481 kshitij.so 1706
        return {1:"Data added successfully"}
1707
 
1708
def getAllNegativeDeals(offset, limit):
1709
    data = []
1710
    collection = get_mongo_connection().Catalog.NegativeDeals
1711
    cursor = collection.find().skip(offset).limit(limit)
1712
    for val in cursor:
1713
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1714
        if len(master) > 0:
1715
            val['brand'] = master[0]['brand']
1716
            val['source_product_name'] = master[0]['source_product_name']
1717
            val['skuBundleId'] = master[0]['skuBundleId']
1718
        else:
1719
            val['brand'] = ""
1720
            val['source_product_name'] = ""
1721
            val['skuBundleId'] = ""
1722
        data.append(val)
1723
    return data
1724
 
1725
def getAllManualDeals(offset, limit):
1726
    data = []
1727
    collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1728
    cursor = collection.find().skip(offset).limit(limit)
14481 kshitij.so 1729
    for val in cursor:
1730
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1731
        if len(master) > 0:
1732
            val['brand'] = master[0]['brand']
1733
            val['source_product_name'] = master[0]['source_product_name']
1734
            val['skuBundleId'] = master[0]['skuBundleId']
1735
        else:
1736
            val['brand'] = ""
1737
            val['source_product_name'] = ""
1738
            val['skuBundleId'] = ""
1739
        data.append(val)
1740
    return data
14076 kshitij.so 1741
 
14553 kshitij.so 1742
def addManualDeal(data, multi):
1743
    if multi !=1:
1744
        collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1745
        cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1746
        if cursor.count() > 0:
1747
            return {0:"Sku information already present."}
1748
        else:
1749
            collection.insert(data)
1750
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
1751
            return {1:"Data added successfully"}
14481 kshitij.so 1752
    else:
14553 kshitij.so 1753
        skuIds = __getBundledSkusfromSku(data['sku'])
1754
        for sku in skuIds:
1755
            data['sku'] = sku.get('_id')
1756
            collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 1757
            cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 1758
            if cursor.count() > 0:
1759
                continue
1760
            else:
14558 kshitij.so 1761
                data.pop('_id',None)
14553 kshitij.so 1762
                collection.insert(data)
1763
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14481 kshitij.so 1764
        return {1:"Data added successfully"}
14553 kshitij.so 1765
 
14481 kshitij.so 1766
def deleteDocument(data):
15853 kshitij.so 1767
    print "inside detete document"
14481 kshitij.so 1768
    print data
1769
    try:
1770
        collection = get_mongo_connection().Catalog[data['class']]
1771
        class_name = data.pop('class')
1772
        _id = data.pop('oid')
1773
        record = list(collection.find({'_id':ObjectId(_id)}))
1774
        collection.remove({'_id':ObjectId(_id)})
15075 kshitij.so 1775
        if class_name != "Notifications":
1776
            if class_name !="CategoryDiscount":
15853 kshitij.so 1777
                print record[0]
1778
                if record[0].has_key('sku'):
1779
                    field = '_id'
1780
                    val = record[0]['sku']
1781
                else:
1782
                    field = 'skuBundleId'
1783
                    val = record[0]['skuBundleId']
1784
                print "Updating master"
1785
                print field
1786
                print val
1787
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
15075 kshitij.so 1788
            else:
1789
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
1790
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
14481 kshitij.so 1791
        return {1:"Document deleted successfully"}
1792
    except Exception as e:
1793
        print e
1794
        return {0:"Document not deleted."}
13970 kshitij.so 1795
 
14482 kshitij.so 1796
def searchMaster(offset, limit, search_term):
1797
    data = []
14531 kshitij.so 1798
    if search_term is not None:
14551 kshitij.so 1799
        terms = search_term.split(' ')
1800
        outer_query = []
1801
        for term in terms:
1802
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
14531 kshitij.so 1803
        try:
14551 kshitij.so 1804
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14531 kshitij.so 1805
            for record in collection:
1806
                data.append(record)
1807
        except:
1808
            pass
1809
    else:
1810
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14482 kshitij.so 1811
        for record in collection:
1812
            data.append(record)
1813
    return data
14481 kshitij.so 1814
 
14495 kshitij.so 1815
def getAllFeaturedDeals(offset, limit):
1816
    data = []
1817
    collection = get_mongo_connection().Catalog.FeaturedDeals
17561 kshitij.so 1818
    cursor = collection.find({}).skip(offset).limit(limit)
14495 kshitij.so 1819
    for val in cursor:
17367 kshitij.so 1820
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14495 kshitij.so 1821
        if len(master) > 0:
1822
            val['brand'] = master[0]['brand']
1823
            val['source_product_name'] = master[0]['source_product_name']
1824
            val['skuBundleId'] = master[0]['skuBundleId']
1825
        else:
1826
            val['brand'] = ""
1827
            val['source_product_name'] = ""
1828
            val['skuBundleId'] = ""
1829
        data.append(val)
1830
    return data
1831
 
14553 kshitij.so 1832
def addFeaturedDeal(data, multi):
17367 kshitij.so 1833
    collection = get_mongo_connection().Catalog.FeaturedDeals
1834
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1835
    master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':data['skuBundleId']})
1836
    if master is None:
1837
        return {0:"BundleId is wrong"}
17469 kshitij.so 1838
    otherInfoObj = data['otherInfo']
1839
    toPop = []
1840
    for x,y in otherInfoObj.iteritems():
1841
        if y==0:
1842
            toPop.append(x)
1843
 
1844
    for popItem in toPop:
1845
        otherInfoObj.pop(popItem)
1846
    if len(otherInfoObj.keys())==0:
1847
        return {0:"No rank info to add"}
1848
 
1849
    for x,y in otherInfoObj.iteritems():
1850
        exist = get_mongo_connection().Catalog.FeaturedDeals.find({'otherInfo.'+x:y})
1851
        if exist.count() >0:
1852
            return {0:"Rank already assigned bundleId %s"%(exist[0]['skuBundleId'])}
17367 kshitij.so 1853
    if cursor.count() > 0:
1854
        return {0:"SkuBundleId information already present."}
14495 kshitij.so 1855
    else:
17367 kshitij.so 1856
        collection.insert(data)
14495 kshitij.so 1857
        return {1:"Data added successfully"}
1858
 
14499 kshitij.so 1859
def searchCollection(class_name, sku, skuBundleId):
14497 kshitij.so 1860
    data = []
1861
    collection = get_mongo_connection().Catalog[class_name]
15076 kshitij.so 1862
    if class_name == "Notifications":
1863
        cursor = collection.find({'skuBundleId':skuBundleId})
1864
        for val in cursor:
1865
            master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
1866
            if len(master) > 0:
1867
                val['brand'] = master[0]['brand']
1868
                val['model_name'] = master[0]['model_name']
1869
                val['skuBundleId'] = master[0]['skuBundleId']
1870
            else:
1871
                val['brand'] = ""
1872
                val['model_name'] = ""
1873
                val['skuBundleId'] = val['skuBundleId']
1874
            data.append(val)
15095 kshitij.so 1875
        return data
15853 kshitij.so 1876
    master = None
14499 kshitij.so 1877
    if sku is not None:
15853 kshitij.so 1878
        if COLLECTION_MAP.has_key(class_name):
1879
            master = get_mongo_connection().Catalog.MasterData.find_one({'_id':sku})
1880
            cursor = collection.find({'skuBundleId':master['skuBundleId']})
1881
        else:
1882
            cursor = collection.find({'sku':sku})
14499 kshitij.so 1883
        for val in cursor:
15853 kshitij.so 1884
            if master is None:
1885
                master = get_mongo_connection().Catalog.MasterData.find_one({'_id':val['sku']})
1886
            if master is not None:
1887
                val['brand'] = master['brand']
1888
                val['source_product_name'] = master['source_product_name']
1889
                val['skuBundleId'] = master['skuBundleId']
14499 kshitij.so 1890
            else:
1891
                val['brand'] = ""
1892
                val['source_product_name'] = ""
1893
                val['skuBundleId'] = ""
1894
            data.append(val)
1895
        return data
1896
    else:
15853 kshitij.so 1897
        if not COLLECTION_MAP.has_key(class_name):
1898
            skuIds = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId}).distinct('_id')
1899
            for sku in skuIds:
1900
                cursor = collection.find({'sku':sku})
1901
                for val in cursor:
1902
                    master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1903
                    if len(master) > 0:
1904
                        val['brand'] = master[0]['brand']
1905
                        val['source_product_name'] = master[0]['source_product_name']
1906
                        val['skuBundleId'] = master[0]['skuBundleId']
1907
                    else:
1908
                        val['brand'] = ""
1909
                        val['source_product_name'] = ""
1910
                        val['skuBundleId'] = ""
1911
                    data.append(val)
1912
            return data
1913
        else:
1914
            cursor = collection.find({'skuBundleId':skuBundleId})
14499 kshitij.so 1915
            for val in cursor:
15853 kshitij.so 1916
                master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14499 kshitij.so 1917
                if len(master) > 0:
1918
                    val['brand'] = master[0]['brand']
1919
                    val['source_product_name'] = master[0]['source_product_name']
1920
                else:
1921
                    val['brand'] = ""
1922
                    val['source_product_name'] = ""
1923
                data.append(val)
15853 kshitij.so 1924
            return data
14495 kshitij.so 1925
 
15074 kshitij.so 1926
def __getBrandIdForBrand(brandName, category_id):
1927
    brandInfo = Brands.query.filter(Brands.category_id==category_id).filter(Brands.name == brandName).all()
1928
    if brandInfo is None or len(brandInfo)!=1:
1929
        raise
1930
    else:
1931
        return brandInfo[0].id
1932
 
14588 kshitij.so 1933
def addNewItem(data):
14594 kshitij.so 1934
    try:
1935
        data['updatedOn'] = to_java_date(datetime.now())
1936
        data['addedOn'] = to_java_date(datetime.now())
1937
        data['priceUpdatedOn'] = to_java_date(datetime.now())
1938
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
1939
        max_bundle = list(get_mongo_connection().Catalog.MasterData.find().sort([('skuBundleId',pymongo.DESCENDING)]).limit(1))
1940
        data['_id'] = max_id[0]['_id'] + 1
1941
        data['skuBundleId'] = max_bundle[0]['skuBundleId'] + 1
1942
        data['identifier'] = str(data['identifier'])
1943
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1944
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1945
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17746 kshitij.so 1946
        data['shippingCost'] = float(data['shippingCost'])
17603 kshitij.so 1947
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1948
            return {0:'Sub-Category not selected'}
17608 kshitij.so 1949
        elif data['category_id'] !=6 and data['subCategoryId'] !=0:
1950
            return {0:'Sub-Category not valid'}
1951
        else:
1952
            pass
17604 kshitij.so 1953
        data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
14594 kshitij.so 1954
        get_mongo_connection().Catalog.MasterData.insert(data)
1955
        return {1:'Data added successfully'}
1956
    except Exception as e:
1957
        print e
1958
        return {0:'Unable to add data.'}
15130 kshitij.so 1959
    finally:
1960
        session.close()
14588 kshitij.so 1961
 
1962
def addItemToExistingBundle(data):
1963
    try:
1964
        data['updatedOn'] = to_java_date(datetime.now())
1965
        data['addedOn'] = to_java_date(datetime.now())
1966
        data['priceUpdatedOn'] = to_java_date(datetime.now())
14593 kshitij.so 1967
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
14590 kshitij.so 1968
        data['_id'] = max_id[0]['_id'] + 1
14594 kshitij.so 1969
        data['identifier'] = str(data['identifier'])
1970
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1971
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1972
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17746 kshitij.so 1973
        data['shippingCost'] = float(data['shippingCost'])
17603 kshitij.so 1974
        if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 1975
            return {0:'Sub-Category not selected'}
17608 kshitij.so 1976
        elif data['category_id'] !=6 and data['subCategoryId'] !=0:
1977
            return {0:'Sub-Category not valid'}
1978
        else:
1979
            pass
17604 kshitij.so 1980
        data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
14588 kshitij.so 1981
        get_mongo_connection().Catalog.MasterData.insert(data)
1982
        return {1:'Data added successfully.'}
14594 kshitij.so 1983
    except Exception as e:
1984
        print e
14588 kshitij.so 1985
        return {0:'Unable to add data.'}
15130 kshitij.so 1986
    finally:
1987
        session.close()
14588 kshitij.so 1988
 
1989
def updateMaster(data, multi):
15130 kshitij.so 1990
    try:
1991
        print data
1992
        if multi != 1:
1993
            _id = data.pop('_id')
1994
            skuBundleId = data.pop('skuBundleId')
1995
            data['updatedOn'] = to_java_date(datetime.now())
1996
            data['identifier'] = str(data['identifier'])
1997
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1998
            data['model_name'] = str(data['model_name'])
17746 kshitij.so 1999
            data['shippingCost'] = float(data['shippingCost'])
15130 kshitij.so 2000
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17603 kshitij.so 2001
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 2002
                return {0:'Sub-Category not selected'}
17608 kshitij.so 2003
            elif data['category_id'] !=6 and data['subCategoryId'] !=0:
2004
                return {0:'Sub-Category not valid'}
2005
            else:
2006
                pass
17604 kshitij.so 2007
            data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
15130 kshitij.so 2008
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
2009
            return {1:'Data updated successfully.'}
2010
        else:
2011
            _id = data.pop('_id')
2012
            skuBundleId = data.pop('skuBundleId')
2013
            data['updatedOn'] = to_java_date(datetime.now())
2014
            data['identifier'] = str(data['identifier'])
2015
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
2016
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17115 manish.sha 2017
            data['model_name'] = str(data['model_name'])
17746 kshitij.so 2018
            data['shippingCost'] = float(data['shippingCost'])
17603 kshitij.so 2019
            if data['category_id'] ==6 and data['subCategoryId'] ==0:
17606 kshitij.so 2020
                return {0:'Sub-Category not selected'}
17608 kshitij.so 2021
            elif data['category_id'] !=6 and data['subCategoryId'] !=0:
2022
                return {0:'Sub-Category not valid'}
2023
            else:
2024
                pass
17604 kshitij.so 2025
            data['subCategory'] = SUB_CATEGORY_MAP.get(data['subCategoryId'])
15130 kshitij.so 2026
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
2027
            similarItems = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId})
2028
            for item in similarItems:
2029
                if item['_id'] == _id:
2030
                    continue
2031
                item['updatedOn'] = to_java_date(datetime.now())
2032
                item['thumbnail'] = data['thumbnail']
2033
                item['category'] = data['category']
2034
                item['category_id'] = data['category_id']
2035
                item['is_shortage'] = data['is_shortage']
2036
                item['mrp'] = data['mrp']
2037
                item['status'] = data['status']
2038
                item['maxPrice'] = data['maxPrice']
2039
                item['brand_id'] = data['brand_id']
17603 kshitij.so 2040
                item['subCategoryId'] = data['subCategoryId']
2041
                item['subCategory'] = data['subCategory']
15130 kshitij.so 2042
                similar_item_id = item.pop('_id')
2043
                get_mongo_connection().Catalog.MasterData.update({'_id':similar_item_id},{"$set":item},upsert=False)
2044
            return {1:'Data updated successfully.'}
17603 kshitij.so 2045
    except:
2046
        return {0:'Unable to update data'}
15130 kshitij.so 2047
    finally:
2048
        session.close()
14619 kshitij.so 2049
 
2050
def getLiveCricScore():
2051
    return mc.get('liveScore')
14852 kshitij.so 2052
 
2053
def addBundleToNotification(data):
2054
    try:
15069 kshitij.so 2055
        collection = get_mongo_connection().Catalog.Notifications
14852 kshitij.so 2056
        cursor = collection.find({'skuBundleId':data['skuBundleId']})
2057
        if cursor.count() > 0:
2058
            return {0:"SkuBundleId information already present."}
2059
        else:
2060
            collection.insert(data)
2061
            return {1:'Data updated successfully.'}
2062
    except:
2063
        return {0:'Unable to add data.'}
2064
 
2065
def getAllNotifications(offset, limit):
2066
    data = []
15069 kshitij.so 2067
    collection = get_mongo_connection().Catalog.Notifications
16450 kshitij.so 2068
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
14852 kshitij.so 2069
    for val in cursor:
15072 kshitij.so 2070
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14852 kshitij.so 2071
        if len(master) > 0:
2072
            val['brand'] = master[0]['brand']
15071 kshitij.so 2073
            val['model_name'] = master[0]['model_name']
14852 kshitij.so 2074
            val['skuBundleId'] = master[0]['skuBundleId']
2075
        else:
2076
            val['brand'] = ""
15071 kshitij.so 2077
            val['model_name'] = ""
2078
            val['skuBundleId'] = val['skuBundleId']
14852 kshitij.so 2079
        data.append(val)
2080
    return data
14997 kshitij.so 2081
 
2082
def getBrandsForFilter(category_id):
2083
    if mc.get("brandFilter") is None:
15095 kshitij.so 2084
        print "Populating brand data for category_id %d" %(category_id)
17469 kshitij.so 2085
        tabData, mobData, accData = [], [], []
14997 kshitij.so 2086
        mobileDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 2087
                                                                      {"$match":{"category_id":3,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 2088
                                                                    },
2089
                                                                 {"$group" : 
2090
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
2091
                                                                  }
2092
                                                                ])
14588 kshitij.so 2093
 
14997 kshitij.so 2094
        tabletDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 2095
                                                                      {"$match":{"category_id":5,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 2096
                                                                    },
2097
                                                                 {"$group" : 
2098
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
2099
                                                                  }
2100
                                                                ])
2101
 
17469 kshitij.so 2102
        accessoriesDeals = get_mongo_connection().Catalog.Deals.aggregate([
2103
                                                                      {"$match":{"category_id":6,"showDeal":1,"totalPoints":{"$gt":-100}}
2104
                                                                    },
2105
                                                                 {"$group" : 
2106
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
2107
                                                                  }
2108
                                                                ])
2109
 
14997 kshitij.so 2110
        allDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 2111
                                                                   {"$match":{"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 2112
                                                                    },
2113
                                                                 {"$group" : 
2114
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
2115
                                                                  }
2116
                                                                ])
2117
        #print mobileDeals
2118
        #print "==========Mobile data ends=========="
2119
 
2120
        #print tabletDeals
2121
        #print "==========Tablet data ends=========="
2122
 
2123
        #print allDeals
2124
        #print "==========All deal data ends========="
2125
 
2126
        for mobileDeal in mobileDeals['result']:
2127
            if mobileDeal.get('_id').get('brand_id') != 0:
2128
                tempMap = {}
2129
                tempMap['brand'] = mobileDeal.get('_id').get('brand')
2130
                tempMap['brand_id'] = mobileDeal.get('_id').get('brand_id')
2131
                tempMap['count'] = mobileDeal.get('count')
2132
                mobData.append(tempMap)
2133
 
2134
        for tabletDeal in tabletDeals['result']:
2135
            if tabletDeal.get('_id').get('brand_id') != 0:
2136
                tempMap = {}
2137
                tempMap['brand'] = tabletDeal.get('_id').get('brand')
2138
                tempMap['brand_id'] = tabletDeal.get('_id').get('brand_id')
2139
                tempMap['count'] = tabletDeal.get('count')
2140
                tabData.append(tempMap)
2141
 
17469 kshitij.so 2142
        for accessoryDeal in accessoriesDeals['result']:
2143
            if accessoryDeal.get('_id').get('brand_id') != 0:
2144
                tempMap = {}
2145
                tempMap['brand'] = accessoryDeal.get('_id').get('brand')
2146
                tempMap['brand_id'] = accessoryDeal.get('_id').get('brand_id')
2147
                tempMap['count'] = accessoryDeal.get('count')
2148
                accData.append(tempMap)
14997 kshitij.so 2149
 
17469 kshitij.so 2150
 
14997 kshitij.so 2151
        brandMap = {}
2152
        for allDeal in allDeals['result']:
2153
            if allDeal.get('_id').get('brand_id') != 0:
2154
                if brandMap.has_key(allDeal.get('_id').get('brand')):
15002 kshitij.so 2155
                    brand_ids = brandMap.get(allDeal.get('_id').get('brand')).get('brand_ids')
14997 kshitij.so 2156
                    brand_ids.append(allDeal.get('_id').get('brand_id'))
15003 kshitij.so 2157
                    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 2158
                else:
2159
                    temp = []
2160
                    temp.append(allDeal.get('_id').get('brand_id'))
15002 kshitij.so 2161
                    brandMap[allDeal.get('_id').get('brand')] = {'brand_ids':temp,'count':allDeal.get('count')}
14997 kshitij.so 2162
 
17469 kshitij.so 2163
        mc.set("brandFilter",{0:brandMap, 3:mobData, 5:tabData, 6:accData}, 600)  
14997 kshitij.so 2164
 
15062 kshitij.so 2165
    return sorted(mc.get("brandFilter").get(category_id), key = lambda x: (-x['count'], x['brand']))
15375 kshitij.so 2166
 
15459 kshitij.so 2167
def getStaticDeals(offset, limit, category_id, direction):
15375 kshitij.so 2168
    user_specific_deals = mc.get("staticDeals")
2169
    if user_specific_deals is None:
2170
        __populateStaticDeals()
2171
        user_specific_deals = mc.get("staticDeals")
15459 kshitij.so 2172
    rev = False
2173
    if direction is None or direction == -1:
2174
        rev=True
2175
    return sorted((user_specific_deals.get(category_id))[offset:offset+limit],reverse=rev)
15375 kshitij.so 2176
 
2177
def __populateStaticDeals():
2178
    print "Populating memcache for static deals"
2179
    outer_query = []
2180
    outer_query.append({"showDeal":1})
2181
    query = {}
16170 kshitij.so 2182
    query['$gt'] = -100
15375 kshitij.so 2183
    outer_query.append({'totalPoints':query})
2184
    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)]))
2185
    mobile_deals = []
2186
    tablet_deals = []
2187
    for deal in all_deals:
2188
        item = get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']})
2189
        if deal['category_id'] ==3:
2190
            mobile_deals.append(getItemObjForStaticDeals(item[0]))
2191
        elif deal['category_id'] ==5:
2192
            tablet_deals.append(getItemObjForStaticDeals(item[0]))
2193
        else:
2194
            continue
2195
 
2196
    random.shuffle(mobile_deals,random.random)
2197
    random.shuffle(tablet_deals,random.random)
2198
 
2199
    mem_cache_val = {3:mobile_deals, 5:tablet_deals}
2200
    mc.set("staticDeals", mem_cache_val, 3600)
2201
 
17733 kshitij.so 2202
def getItemObjForStaticDeals(item,transform=None):
2203
    mpu = str(item.get('marketPlaceUrl'))
2204
    if transform:
2205
        if mpu.find("snapdeal")!=-1:
2206
            mpu = "http://m.snapdeal.com"+mpu[mpu.find("/product"):]
2207
        elif mpu.find("homeshop18")!=-1:
2208
            mpu = "http://m.homeshop18.com/product.mobi?productId="+item['identifier']
17735 kshitij.so 2209
        elif mpu.find("saholic.com")!=-1:
17746 kshitij.so 2210
            mpu = "http://m."+mpu[mpu.find("saholic.com"):]
17735 kshitij.so 2211
        elif mpu.find("shopclues.com")!=-1:
17733 kshitij.so 2212
            mpu = "http://m."+mpu[mpu.find("shopclues.com"):]
2213
        else:
2214
            pass
2215
 
2216
    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 2217
 
2218
def getItemByMerchantIdentifier(identifier, source_id):
2219
    skuData = None
17035 kshitij.so 2220
    if source_id in (1,2,4,5,6,7):
16300 manas 2221
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
2222
    elif source_id == 3:
2223
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
2224
    if skuData is None:
2225
        return {}
2226
    else:
2227
        return skuData
15375 kshitij.so 2228
 
17936 kshitij.so 2229
def getDealsForNotification(skuBundleIds,skipSplitting=False):
2230
    if not skipSplitting:
2231
        bundles= [int(skuBundleId) for skuBundleId in skuBundleIds.split(',')]
2232
        print bundles
2233
    else:
2234
        bundles = skuBundleIds
16406 kshitij.so 2235
    dealsList = []
16364 kshitij.so 2236
    dealsListMap = []
16406 kshitij.so 2237
    for bundleId in bundles:
2238
        outer_query = []
2239
        outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
2240
        outer_query.append({'skuBundleId':bundleId})
2241
        deals = get_mongo_connection().Catalog.Deals.find({"$and":outer_query})
2242
        for deal in deals:
2243
            dealsList.append(deal)
16364 kshitij.so 2244
    sortedMap = {}
2245
    rankMap = {}
2246
    rank = 0
16406 kshitij.so 2247
    for sorted_deal in dealsList:
16364 kshitij.so 2248
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
2249
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
2250
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
2251
            rank = rank +1
2252
        else:
2253
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
2254
                temp_list.append(sorted_deal)
2255
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
2256
 
16367 kshitij.so 2257
    for dealList in [rankMap.get(k, []) for k in range(0, len(bundles))]:
16364 kshitij.so 2258
        temp = []
2259
        for d in dealList:
2260
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
2261
            if len(item) ==0:
2262
                continue
2263
            if d['dealType'] == 1 and d['source_id'] ==1:
2264
                item[0]['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(item[0]['identifier'].strip())
2265
            elif d['source_id'] ==3:
2266
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
2267
            else:
2268
                pass 
2269
            try:
2270
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
2271
                if not cashBack or cashBack.get('cash_back_status')!=1:
2272
                    item[0]['cash_back_type'] = 0
2273
                    item[0]['cash_back'] = 0
2274
                else:
2275
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
2276
                    item[0]['cash_back'] = cashBack['cash_back']
2277
            except:
2278
                print "Error in adding cashback to deals"
2279
                item[0]['cash_back_type'] = 0
2280
                item[0]['cash_back'] = 0
2281
            try:
2282
                item[0]['dp'] = d['dp']
2283
                item[0]['showDp'] = d['showDp']
2284
            except:
2285
                item[0]['dp'] = 0.0
2286
                item[0]['showDp'] = 0
17727 kshitij.so 2287
 
2288
            try:
2289
                if item[0]['showVideo']==0:
2290
                    item[0]['videoLink'] =""
2291
            except:
2292
                item[0]['videoLink'] =""
2293
            try:
2294
                if item[0]['quantity'] >1:
2295
                    ppq = float(item[0]['available_price'])/item[0]['quantity']
2296
 
2297
                    if ppq == round(ppq):
2298
                        item[0]['ppq'] = int(ppq)
2299
                    else:
2300
                        item[0]['ppq'] = round(ppq,2)
2301
                else:
2302
                    item[0]['ppq'] = 0
2303
            except:
2304
                item[0]['ppq'] = 0
2305
            if item[0]['category_id']!=6:
2306
                try:
18830 kshitij.so 2307
                    item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
2308
                    item[0]['filterTextBrand'] = (item[0]['brand'])
17727 kshitij.so 2309
                except:
18830 kshitij.so 2310
                    pass
17727 kshitij.so 2311
            else:
2312
                try:
18051 kshitij.so 2313
                    if item[0]['subCategory']=='' or item[0]['subCategory'] is None or item[0]['subCategoryId']==0:
17727 kshitij.so 2314
                        raise
18830 kshitij.so 2315
                    item[0]['filterLinkSubCategory'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['subCategory'])+'&filter=subcategory&subcategories='+str(int(item[0]['subCategoryId']))
2316
                    item[0]['filterTextSubCategory'] = (item[0]['subCategory'])
2317
                    item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
2318
                    item[0]['filterTextBrand'] = (item[0]['brand'])
17727 kshitij.so 2319
                except:
18830 kshitij.so 2320
                    pass
17944 kshitij.so 2321
            try:
2322
                if item[0]['source_id']==4:
2323
                    item_availability_info = mc.get("item_availability_"+str(item[0]['identifier']).strip())
2324
                    if item_availability_info is None or len(item_availability_info)==0:
2325
                        item[0]['availabilityInfo'] = [{}]
2326
                    else:
2327
                        item[0]['availabilityInfo'] = item_availability_info
2328
            except:
2329
                item[0]['availabilityInfo'] = [{}]
19135 kshitij.so 2330
 
19193 kshitij.so 2331
            if item[0]['source_id']==4:
2332
                for av_info in item[0]['availabilityInfo']:
2333
                    if not av_info:
2334
                        continue
2335
                    av_info['cash_back'] = item[0]['cash_back']
2336
                    av_info['cash_back_type'] = item[0]['cash_back_type']
2337
                    netPriceAfterCashBack = av_info['sellingPrice'] 
19199 kshitij.so 2338
                    if av_info['cash_back_type'] ==1:
19207 kshitij.so 2339
                        netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(float(av_info['sellingPrice'])*av_info['cash_back']/100)
19199 kshitij.so 2340
                    elif av_info['cash_back_type'] ==2:
19207 kshitij.so 2341
                        netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(av_info['cash_back'])
19193 kshitij.so 2342
                    else:
2343
                        pass
2344
                    av_info['netPriceAfterCashBack'] = netPriceAfterCashBack
2345
 
2346
            if item[0]['source_id'] != SOURCE_MAP.get("PAYTM.COM"):
2347
                if item[0]['codAvailable'] ==1:
2348
                    paytmPrice = item[0]['available_price']
2349
                else:
2350
                    paytmPrice = item[0]['gross_price']
2351
 
2352
                if item[0]['cash_back_type'] ==1:
19207 kshitij.so 2353
                    item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(float(paytmPrice)*item[0]['cash_back']/100)
19193 kshitij.so 2354
                elif item[0]['cash_back_type'] ==2:
19207 kshitij.so 2355
                    item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(item[0]['cash_back'])
19193 kshitij.so 2356
                else:
2357
                    item[0]['netPriceAfterCashBack'] = paytmPrice
2358
 
2359
            else:
2360
                if item[0]['cash_back_type'] ==1:
19207 kshitij.so 2361
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(float(item[0]['available_price'])*item[0]['cash_back']/100)
19193 kshitij.so 2362
                elif item[0]['cash_back_type'] ==2:
19207 kshitij.so 2363
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(item[0]['cash_back'])
19193 kshitij.so 2364
                else:
2365
                    item[0]['netPriceAfterCashBack'] = item[0]['available_price']
2366
 
2367
 
19135 kshitij.so 2368
            item[0]['totalPoints'] = d['totalPoints']
17727 kshitij.so 2369
 
16364 kshitij.so 2370
            temp.append(item[0])
2371
        if len(temp) > 1:
2372
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
2373
        dealsListMap.append(temp)
2374
    return dealsListMap
2375
 
16373 manas 2376
def getSkuBrandData(sku):
2377
    if sku is None:
2378
        return {}
2379
    else:
2380
        orders = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':sku})
2381
        if orders is None:
2382
            return {}
2383
        return orders
16488 kshitij.so 2384
 
2385
def addDealPoints(data):
2386
    collection = get_mongo_connection().Catalog.DealPoints
2387
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
2388
    if cursor.count() > 0:
2389
        return {0:"Sku information already present."}
2390
    else:
2391
        collection.insert(data)
2392
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
2393
        return {1:"Data added successfully"}
2394
 
2395
def getAllBundlesWithDealPoints(offset, limit):
2396
    data = []
2397
    collection = get_mongo_connection().Catalog.DealPoints
2398
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
2399
    for val in cursor:
2400
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val.get('skuBundleId')})
2401
        if master is not None:
2402
            val['brand'] = master['brand']
2403
            val['source_product_name'] = master['product_name']
2404
        else:
2405
            val['brand'] = ""
2406
            val['source_product_name'] = ""
2407
        data.append(val)
2408
    return data
16546 kshitij.so 2409
 
2410
def generateRedirectUrl(retailer_id, app_id):
2411
    try:
16663 manish.sha 2412
        if retailer_id <= 0:
2413
            return {'url':"","message":"Retailer Id not valid"}
16546 kshitij.so 2414
        d_app_offer = app_offers.get_by(id=app_id)
16605 manish.sha 2415
    except:
2416
        traceback.print_exc()
16546 kshitij.so 2417
    finally:
2418
        session.close()
2419
    if d_app_offer is None:
2420
        return {'url':"","message":"App id doesn't exist"}
16364 kshitij.so 2421
 
16915 manish.sha 2422
    final_user_payout = 0
2423
    if d_app_offer.override_payout:
2424
        final_user_payout = d_app_offer.overriden_payout
2425
    else:
2426
        final_user_payout = d_app_offer.user_payout
16546 kshitij.so 2427
 
16915 manish.sha 2428
    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)
2429
 
16546 kshitij.so 2430
    get_mongo_connection().AppOrder.AppTransaction.insert(appTransactions.__dict__)
2431
    embedd = str((appTransactions.__dict__).get('_id'))
16548 kshitij.so 2432
    try:
2433
        index = d_app_offer.link.index(".freeb.co.in")
2434
    except:
16605 manish.sha 2435
        traceback.print_exc()
16548 kshitij.so 2436
        return {'url':"","message":"Substring not found"}
2437
    redirect_url = d_app_offer.link[0:index]+"."+embedd+d_app_offer.link[index:]
16546 kshitij.so 2438
    get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(embedd)},{"$set":{'redirect_url':redirect_url}})
16548 kshitij.so 2439
    return {'url':redirect_url,"message":"Success"}
16556 kshitij.so 2440
 
2441
def addPayout(payout, transaction_id):
2442
    try:
16764 manish.sha 2443
        print 'Got Response for Transaction Id:- '+ str(transaction_id)+ ' and Actual Payout:- '+str(payout)
16556 kshitij.so 2444
        transaction = list(get_mongo_connection().AppOrder.AppTransaction.find({'_id':ObjectId(transaction_id)}))
2445
        if len(transaction) > 0:
2446
            if (transaction[0])['payout_status'] ==1:
16753 manish.sha 2447
                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 2448
 
2449
                approvedAppTransaction = approved_app_transactions.get_by(transaction_id=transaction_id)
2450
                if approvedAppTransaction is None:
2451
                    approvedAppTransaction = approved_app_transactions()
16919 manish.sha 2452
                    approvedAppTransaction.app_id = transaction[0].get('app_id')
16782 manish.sha 2453
                    approvedAppTransaction.cash_back_description = CB_APPROVED
16919 manish.sha 2454
                    approvedAppTransaction.retailer_id = transaction[0].get('retailer_id')
16782 manish.sha 2455
                    approvedAppTransaction.transaction_id = transaction_id
16919 manish.sha 2456
                    approvedAppTransaction.transaction_time = to_py_date(long(transaction[0].get('transaction_time')))
2457
                    approvedAppTransaction.redirect_url = transaction[0].get('redirect_url')
16782 manish.sha 2458
                    approvedAppTransaction.payout_status = 2
2459
                    approvedAppTransaction.payout_description = CB_APPROVED
2460
                    approvedAppTransaction.cashback_status = 2 
2461
                    approvedAppTransaction.payout_amount = long(payout)
2462
                    approvedAppTransaction.payout_time = datetime.now()
16919 manish.sha 2463
                    approvedAppTransaction.offer_price = long(transaction[0].get('offer_price')) 
2464
                    approvedAppTransaction.overridenCashBack = transaction[0].get('overridenCashBack')
2465
                    approvedAppTransaction.isCashBackOverriden = transaction[0].get('isCashBackOverriden')
2466
                    approvedAppTransaction.user_payout = transaction[0].get('user_payout')
16782 manish.sha 2467
                    approvedAppTransaction.cashBackConsidered = False
16915 manish.sha 2468
                    if transaction[0].get('final_user_payout') is not None:
2469
                        approvedAppTransaction.final_user_payout = transaction[0].get('final_user_payout')
2470
                    else:
16919 manish.sha 2471
                        if transaction[0].get('isCashBackOverriden'):
2472
                            approvedAppTransaction.final_user_payout = transaction[0].get('overridenCashBack')
16915 manish.sha 2473
                        else:
16919 manish.sha 2474
                            approvedAppTransaction.final_user_payout = transaction[0].get('user_payout')
16782 manish.sha 2475
                    session.commit()
2476
 
2477
                    updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
16631 manish.sha 2478
                else:
16783 manish.sha 2479
                    approvedAppTransaction.payout_amount = long(payout)
2480
                    approvedAppTransaction.payout_time = datetime.now()
2481
                    if approvedAppTransaction.cashBackConsidered == False:
2482
                        updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
2483
                    session.commit()
16782 manish.sha 2484
 
2485
                    '''
2486
                    try:
2487
                        if int(transaction[0]['offer_price']) != payout or int(transaction[0]['user_payout']) < payout:
2488
                            _sendAlertForAppPayouts(int(transaction[0]['app_id']), int(transaction[0]['offer_price']), int(transaction[0]['user_payout']), payout)
2489
                    except:
2490
                        print traceback.print_exc()
2491
                    '''
16556 kshitij.so 2492
                return {'status':'ok','message':'Payout updated'}
2493
            elif (transaction[0])['payout_status'] ==2:
2494
                return {'status':'ok','message':'Payout already processed'}
2495
            else:
2496
                return {'status':'fail','message':'Something is wrong'}
2497
        else:
2498
            return {'status':'fail','message':'transaction_id not found'}
2499
    except:
16657 manish.sha 2500
        print traceback.print_exc()
16631 manish.sha 2501
        try:
16753 manish.sha 2502
            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 2503
        except:
2504
            print 'Data Inconsistency in Cashback Process'
16636 manish.sha 2505
            print traceback.print_exc()
16559 kshitij.so 2506
        return  {'status':'fail','message':'Something is wrong'}
16885 kshitij.so 2507
    finally:
2508
        session.close()
16556 kshitij.so 2509
 
16631 manish.sha 2510
def _updateApprovedCashbackToUser(approvedAppTransactionId):
2511
    approvedAppTransaction = approved_app_transactions.get_by(id=approvedAppTransactionId)
16915 manish.sha 2512
    if approvedAppTransaction.retailer_id < 0:
2513
        return False
2514
 
16631 manish.sha 2515
    currentMonth = datetime.today().month
2516
    currentDay = datetime.today().day
2517
    currentYear = datetime.today().year
2518
    fortNight = (currentMonth - 1)*2 + (currentDay/15)
2519
    if currentDay == 30 or currentDay ==31:
2520
        fortNight = fortNight-1
2521
    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()
2522
    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()
2523
    try:
2524
        if userAppCashbackObj is None:
2525
            userAppCashbackObj = user_app_cashbacks()
2526
            userAppCashbackObj.user_id = approvedAppTransaction.retailer_id
2527
            userAppCashbackObj.status = 'Approved'
16915 manish.sha 2528
            userAppCashbackObj.amount = approvedAppTransaction.final_user_payout
16631 manish.sha 2529
            userAppCashbackObj.fortnightOfYear = fortNight
2530
            userAppCashbackObj.yearVal = currentYear
2531
        else:
16915 manish.sha 2532
            userAppCashbackObj.amount = userAppCashbackObj.amount + approvedAppTransaction.final_user_payout
16631 manish.sha 2533
 
2534
        if userAppInstallObj is None:
2535
            app_offer = app_offers.get_by(id=approvedAppTransaction.app_id)
2536
            userAppInstallObj = user_app_installs()
2537
            userAppInstallObj.user_id = approvedAppTransaction.retailer_id
2538
            userAppInstallObj.fortnightOfYear = fortNight
2539
            userAppInstallObj.transaction_date = datetime(currentYear, currentMonth, currentDay, 0, 0, 0, 0).date()
2540
            userAppInstallObj.app_id = approvedAppTransaction.app_id
2541
            userAppInstallObj.app_name = app_offer.app_name
2542
            userAppInstallObj.installCount = 1
16915 manish.sha 2543
            userAppInstallObj.payoutAmount = approvedAppTransaction.final_user_payout
16631 manish.sha 2544
        else:
2545
            userAppInstallObj.installCount = userAppInstallObj.installCount + 1
16915 manish.sha 2546
            userAppInstallObj.payoutAmount = userAppInstallObj.payoutAmount +approvedAppTransaction.final_user_payout
16631 manish.sha 2547
 
2548
        approvedAppTransaction.cashBackConsidered = True
2549
        session.commit()
2550
        return True
2551
    except:
2552
        session.rollback()
16636 manish.sha 2553
        print traceback.print_exc()
16631 manish.sha 2554
        return False
16693 manish.sha 2555
 
2556
def _sendAlertForAppPayouts(app_id, offerPrice, userPayout, payout):
2557
    m = Email('localhost')
2558
    mFrom = "dtr@shop2020.in"
2559
    m.setFrom(mFrom)
2560
    mTo = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com','chaitnaya.vats@saholic.com','manoj.kumar@saholic.com','manish.sharma@shop2020.in']
2561
    for receipient in mTo:
2562
        m.addRecipient(receipient)
2563
    appOffer = app_offers.get_by(id=app_id)
2564
    if offerPrice != payout:
2565
        m.setSubject("Mismatch in Offer Price and Actual Pay Out for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
2566
        message1 = "Offer Price:- "+ str(appOffer.offer_price) + "\n" + "Actual Pay Out:- "+ str(payout)
2567
        m.setTextBody(message1)
2568
    if userPayout > payout:
2569
        m.setSubject("User Pay Out greater than actual PayOut for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
2570
        message2 = "User Pay Out Price:- "+ str(appOffer.user_payout) + "\n" + "Actual Pay Out:- "+ str(payout)
2571
        m.setTextBody(message2)
2572
    m.send()
16631 manish.sha 2573
 
16789 amit.gupta 2574
def rejectCashback(orderId, subOrderId):
16833 amit.gupta 2575
    cashBack = get_mongo_connection().Dtr.merchantOrder.update({"orderId":orderId, "subOrders.merchantSubOrderId":subOrderId}, 
16789 amit.gupta 2576
                                                               {"$set":{"subOrders.$.cashBackStatus":CB_REJECTED}})
16837 amit.gupta 2577
    print cashBack
16836 amit.gupta 2578
    return cashBack.get("nModified")
16894 manish.sha 2579
 
2580
def getAppOffers(retailer_id):
2581
    if not bool(mc.get("cached_app_offers_"+str(retailer_id))):
2582
        populateAppOffers(retailer_id)
2583
    return mc.get("cached_app_offers_"+str(retailer_id)) 
2584
 
2585
def populateAppOffers(retailerId):
2586
    retailerId = int(retailerId)
2587
    #offset = req.get_param_as_int("offset")
2588
    #limit = req.get_param_as_int("limit")
16941 manish.sha 2589
    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()
2590
    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 2591
    #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()
2592
 
2593
    appOffersMap = {}
2594
    priorityList = []
2595
    priorityMap = {}
2596
    for offer in priortizeders:
16941 manish.sha 2597
        if priorityMap.has_key(long(offer[1])):
2598
            offersVal = priorityMap.get(long(offer[1]))
2599
            offersVal.append(offer)
2600
            priorityMap[long(offer[1])]=offersVal
2601
        else:
2602
            offersVal = []
2603
            offersVal.append(offer)
2604
            priorityMap[long(offer[1])]=offersVal
2605
 
16894 manish.sha 2606
    priorityList = sorted(priorityMap)
2607
 
2608
    maxCount = len(nonPriortizedOffers) + len(priortizeders)
2609
 
16909 manish.sha 2610
    if priorityList is not None and len(priorityList)>0:
2611
        if maxCount < max(priorityList):
2612
            maxCount = max(priorityList)
16894 manish.sha 2613
 
2614
    count = 1
2615
    blockedPlaces = []
2616
    availablePlaces = []
2617
    while count <= maxCount:
2618
        if count in priorityList:
2619
            blockedPlaces.append(count)
2620
        else:
2621
            availablePlaces.append(count)
2622
        count = count +1
16941 manish.sha 2623
    print 'Blocked Places', blockedPlaces
16894 manish.sha 2624
    for val in blockedPlaces:
16941 manish.sha 2625
        key = val
2626
        for offerObj in priorityMap.get(val):
2627
            while appOffersMap.has_key(key):
2628
                key = key+1
2629
            appOffersMap[key] = long(offerObj[0])
2630
            if key in availablePlaces:
2631
                availablePlaces.remove(key)
2632
 
2633
    print 'Available Places', availablePlaces
2634
 
16894 manish.sha 2635
    i=0
2636
    for val in availablePlaces:
16899 manish.sha 2637
        if i<len(nonPriortizedOffers):
16902 manish.sha 2638
            appOffersMap[val]= long(nonPriortizedOffers[i][0])
16899 manish.sha 2639
        else:
2640
            break
2641
        i=i+1
16901 manish.sha 2642
    print 'AppOffersMap', appOffersMap
16894 manish.sha 2643
 
2644
    finalAppOffersMap = {}
2645
    if len(appOffersMap) > 0:
2646
        for key in sorted(appOffersMap):               
2647
            finalAppOffersMap[key] = appOffersMap[key]
2648
 
2649
        mc.set("cached_app_offers_"+str(retailerId), finalAppOffersMap, 120)
2650
    else:
2651
        print 'No Offers'
2652
        mc.set("cached_app_offers_"+str(retailerId), {}, 10)              
17280 manish.sha 2653
 
19337 manish.sha 2654
def sendNotification(userIds, campaignName, title, message,notificationtype, url, expiresat='2999-01-01', sendsms=False, smstext=None, mongoHost='localhost'):
2655
    max_id = list(get_mongo_connection(host=mongoHost).User.notificationcampaigns.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
2656
    if len(max_id) ==0:
2657
        max_id = 0
2658
    else:
2659
        max_id = max_id[0]['_id']
2660
    max_id = max_id +1
19362 manish.sha 2661
    campaign = NotificationCampaign(max_id, campaignName, title, message, "SELECT User.id from users User where User.id="+str(userIds[0]), url, to_java_date(datetime.now()), to_java_date(datetime.now()+timedelta(days=730)), notificationtype, 'active', sendsms, smstext, 0, 0, 'BATCH_CREDIT')
19337 manish.sha 2662
    get_mongo_connection(host=mongoHost).User.notificationcampaigns.insert(campaign.__dict__)
17302 kshitij.so 2663
 
2664
def getDummyDeals(categoryId, offset, limit):
2665
    outer_query = []
2666
    outer_query.append({"showDeal":1})
2667
    outer_query.append({"category_id":categoryId})
2668
    query = {}
2669
    query['$gt'] = -100
2670
    outer_query.append({'totalPoints':query})
2671
    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))
2672
    returnObj = []
2673
    for deal in all_deals:
17306 kshitij.so 2674
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
17734 kshitij.so 2675
        returnObj.append(getItemObjForStaticDeals(item[0],transform=True))
17302 kshitij.so 2676
    return returnObj
17367 kshitij.so 2677
 
17469 kshitij.so 2678
def searchDummyDeals(search_term , limit, offset):
17367 kshitij.so 2679
    data = []
2680
    uniqueMap = {}
2681
    if search_term is not None:
2682
        terms = search_term.split(' ')
2683
        outer_query = []
2684
        for term in terms:
2685
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
2686
        try:
2687
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}})
2688
            for record in collection:
2689
                data.append(record)
2690
        except:
2691
            pass
2692
    else:
2693
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}})
2694
        for record in collection:
2695
            data.append(record)
2696
    for x in data:
2697
        if not uniqueMap.has_key(x['skuBundleId']):
17469 kshitij.so 2698
            uniqueMap[x['skuBundleId']] = {'source_product_name':x['source_product_name'],'skuBundleId':x['skuBundleId'],'thumbnail':x['thumbnail']}
17367 kshitij.so 2699
 
17469 kshitij.so 2700
    if (offset + limit) > len(uniqueMap.values()):
2701
        limit = len(uniqueMap.values()) - offset - 1
2702
 
2703
    count = 0
2704
#     for x in uniqueMap.values():
2705
#         print count,
2706
#         print '\t',
2707
#         print x
2708
#         count = count+1
17555 kshitij.so 2709
 
17469 kshitij.so 2710
    print offset
2711
    print limit
2712
 
2713
    return uniqueMap.values()[offset:limit+offset]
17367 kshitij.so 2714
 
17469 kshitij.so 2715
 
2716
def getDummyPricing(skuBundleId):
2717
    collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()},'skuBundleId':skuBundleId,'in_stock':1})
2718
    print collection.count()
2719
    cheapest = 99999999
2720
    cheapestDetails= None
2721
    returnMap = {}
2722
 
2723
    for d in collection:
2724
        if d['available_price'] < cheapest:
2725
            cheapestDetails = d
2726
            cheapest = int(d['available_price'])
2727
        if returnMap.has_key(d['source_id']):
17733 kshitij.so 2728
            d = getItemObjForStaticDeals(d,transform=True)
17469 kshitij.so 2729
            d['toShowStore'] = 0
2730
            returnMap[d['source_id']].append(d)
2731
        else:
2732
            temp = []
17733 kshitij.so 2733
            d = getItemObjForStaticDeals(d,transform=True)
17469 kshitij.so 2734
            d['toShowStore'] = 1
2735
            temp.append(d)
2736
            returnMap[d['source_id']] = temp
2737
    returnMap['cheapest'] = cheapestDetails
2738
    for y in returnMap.itervalues():
2739
        if isinstance(y, (list, tuple)):
2740
            (y[len(y)-1])['lastElement'] = 1
2741
        else:
2742
            pass
2743
    if returnMap['cheapest'] ==None:
2744
        dum = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':skuBundleId,'source_id':{"$in":SOURCE_MAP.keys()}})
2745
        returnMap['cheapest'] = {'thumbnail':dum['thumbnail'],'source_product_name':dum['source_product_name']}
2746
    return returnMap
17555 kshitij.so 2747
 
17603 kshitij.so 2748
 
17555 kshitij.so 2749
def addDealObject(data):
17570 kshitij.so 2750
    if data.get('img_url') is None or data.get('img_url')=="" or data.get('name') is None or data.get('name')=="":
2751
        return {0:'Invalid data'}   
17555 kshitij.so 2752
    try:
2753
        max_id = list(get_mongo_connection().Catalog.DealObject.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
2754
        if len(max_id) ==0:
2755
            max_id = 0
17559 kshitij.so 2756
        else:
2757
            max_id = max_id[0]['_id']
2758
        data['_id'] = max_id +1
17555 kshitij.so 2759
        get_mongo_connection().Catalog.DealObject.insert(data)
2760
        return {1:'Data added successfully'}
2761
    except:
2762
        return {0:'Error in adding data'}
2763
 
17561 kshitij.so 2764
def getAllDealObjects(offset, limit):
2765
    data = []
2766
    collection = get_mongo_connection().Catalog.DealObject
2767
    cursor = collection.find({}).skip(offset).limit(limit)
2768
    for val in cursor:
17564 kshitij.so 2769
        data.append({'_id':val['_id'],'name':val['name']})
17561 kshitij.so 2770
    return data
17564 kshitij.so 2771
 
2772
def deleteDealObject(id):
2773
    try:
2774
        get_mongo_connection().Catalog.DealObject.remove({'_id':id})
17616 kshitij.so 2775
        get_mongo_connection().Catalog.FeaturedDealsDealObject.remove({'_id':id})
17564 kshitij.so 2776
        return {1:"Deal Object deleted"}
2777
    except:
2778
        return {0:"Error in deleting object"}
17566 kshitij.so 2779
 
2780
def getDealObjectById(id):
2781
    try:
2782
        data = get_mongo_connection().Catalog.DealObject.find({'_id':id})
2783
        return data
2784
    except:
17570 kshitij.so 2785
        return {}
17561 kshitij.so 2786
 
17570 kshitij.so 2787
def updateDealObject(data):
2788
    try:
2789
        _id = data['_id']
2790
        data.pop('_id')
2791
        get_mongo_connection().Catalog.DealObject.update({'_id':_id},{"$set":data},upsert=False)
2792
        return {1:"Data updated successfully"}
2793
    except:
2794
        return {0:"Error in updating data"}
2795
 
17610 kshitij.so 2796
def getAllFeaturedDealsForDealObject(offset, limit):
2797
    data = []
2798
    collection = get_mongo_connection().Catalog.FeaturedDealsDealObject
2799
    cursor = collection.find({}).skip(offset).limit(limit)
2800
    for val in cursor:
2801
        data.append(val)
2802
    return data
2803
 
2804
def addFeaturedDealForDealObject(data):
19280 kshitij.so 2805
    print data
2806
 
17610 kshitij.so 2807
    collection = get_mongo_connection().Catalog.FeaturedDealsDealObject
2808
    cursor = collection.find({'_id':data['_id']})
2809
    master = get_mongo_connection().Catalog.DealObject.find_one({'_id':data['_id']})
2810
    if master is None:
2811
        return {0:"Deal Object id wrong"}
2812
    otherInfoObj = data['otherInfo']
2813
    toPop = []
2814
    for x,y in otherInfoObj.iteritems():
19280 kshitij.so 2815
        if y==0 or y=="":
17610 kshitij.so 2816
            toPop.append(x)
2817
 
2818
    for popItem in toPop:
2819
        otherInfoObj.pop(popItem)
2820
    if len(otherInfoObj.keys())==0:
2821
        return {0:"No rank info to add"}
2822
 
2823
    for x,y in otherInfoObj.iteritems():
2824
        exist = get_mongo_connection().Catalog.FeaturedDealsDealObject.find({'otherInfo.'+x:y})
2825
        if exist.count() >0:
2826
            return {0:"Rank already assigned Deal Object Id %s"%(exist[0]['_id'])}
2827
    if cursor.count() > 0:
2828
        return {0:"Deal Object Id information already present."}
2829
    else:
2830
        collection.insert(data)
2831
        return {1:"Data added successfully"}
2832
 
17616 kshitij.so 2833
def deleteFeaturedDealObject(id):
2834
    try:
2835
        get_mongo_connection().Catalog.FeaturedDealsDealObject.remove({'_id':id})
2836
        return {1:"Deal Object deleted"}
2837
    except:
2838
        return {0:"Error in deleting object"}
17654 kshitij.so 2839
 
2840
def getSubCategoryForFilter(category_id):
2841
    if mc.get("subCategoryFilter") is None:
2842
        print "Populating subcategory data for category_id %d" %(category_id)
2843
        tabData, mobData, accData = [], [], []
2844
 
2845
        accessoriesDeals = get_mongo_connection().Catalog.Deals.aggregate([
2846
                                                                      {"$match":{"category_id":6,"showDeal":1,"totalPoints":{"$gt":-100}}
2847
                                                                    },
2848
                                                                 {"$group" : 
2849
                                                                  {'_id':{'subCategoryId':'$subCategoryId','subCategory':'$subCategory'},'count':{'$sum':1}}
2850
                                                                  }
2851
                                                                ])
2852
 
2853
        for accessoryDeal in accessoriesDeals['result']:
2854
            if accessoryDeal.get('_id').get('subCategoryId') != 0:
2855
                tempMap = {}
2856
                tempMap['subCategory'] = accessoryDeal.get('_id').get('subCategory')
2857
                tempMap['subCategoryId'] = accessoryDeal.get('_id').get('subCategoryId')
2858
                tempMap['count'] = accessoryDeal.get('count')
2859
                accData.append(tempMap)
2860
 
2861
 
2862
        mc.set("subCategoryFilter",{3:mobData, 5:tabData, 6:accData}, 600)  
2863
 
2864
    return sorted(mc.get("subCategoryFilter").get(category_id), key = lambda x: (-x['count'], x['subCategory']))
17610 kshitij.so 2865
 
17727 kshitij.so 2866
def dummyLogin(data):
17731 kshitij.so 2867
    exist = list(get_mongo_connection().Catalog.DummyUser.find({'email':data['email'],'password':data['password']}))
17727 kshitij.so 2868
    if len(exist) > 0:
17728 kshitij.so 2869
        return {'user_id':exist[0]['_id'],'fullName':exist[0]['fullName']}
17727 kshitij.so 2870
    else:
2871
        return {'user_id':0}
17616 kshitij.so 2872
 
17727 kshitij.so 2873
def dummyRegister(data):
2874
    try:
2875
        exist = list(get_mongo_connection().Catalog.DummyUser.find({'email':data['email']}))
2876
        if len(exist) > 0:
2877
            return {'msg':"Email already registered",'user_id':0}
2878
        else:
2879
            max_id = list(get_mongo_connection().Catalog.DummyUser.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
2880
            if len(max_id) ==0:
2881
                max_id = 0
2882
            else:
2883
                max_id = max_id[0]['_id']
2884
            data['_id'] = max_id +1
2885
            get_mongo_connection().Catalog.DummyUser.insert(data)
17728 kshitij.so 2886
            return {'msg':"Registration successful",'user_id':data['_id'],'fullName':data['fullName']}
17727 kshitij.so 2887
    except:
2888
        return {'msg':"Error in registration.",'user_id':0}
2889
 
17731 kshitij.so 2890
def getDummyUser(user_id):
2891
    exist = list(get_mongo_connection().Catalog.DummyUser.find({'_id':user_id}))
2892
    if len(exist) > 0:
2893
        return exist[0]
2894
    else:
2895
        return {'user_id':0,'fullName':"",'email':"","contactNumber":""}
2896
 
2897
def updateDummyUser(data):
2898
    try:
17732 kshitij.so 2899
        get_mongo_connection().Catalog.DummyUser.update({'_id':data['user_id']},{"$set":data},upsert=False)
17731 kshitij.so 2900
        return {'msg':"Data updated successfuly",'response':1}
2901
    except:
2902
        return {'msg':"Unable to update data",'response':0}
17936 kshitij.so 2903
 
18089 kshitij.so 2904
def getDealsForSearchText(subCategoryIds, searchTerm, offset, limit):
2905
    subCategories= [int(subCategoryId) for subCategoryId in subCategoryIds.split('^')]
18106 kshitij.so 2906
    print "SubCategories are ",subCategories
17936 kshitij.so 2907
    payload = {
18106 kshitij.so 2908
    "query": {
17936 kshitij.so 2909
        "bool": {
18106 kshitij.so 2910
            "must": [{
2911
                    "match": {
2912
                        "title": {
2913
                            "query": searchTerm,
2914
                            "operator": "and"
2915
                        }
17936 kshitij.so 2916
                    }
18106 kshitij.so 2917
                },
2918
 
2919
                {
2920
                    "in": {
2921
                        "subCategoryId": subCategories
2922
                    }
17936 kshitij.so 2923
                }
18106 kshitij.so 2924
 
2925
            ]
17936 kshitij.so 2926
        }
19135 kshitij.so 2927
    },
2928
    "sort": { "dealPoints": { "order": "desc" }}
18106 kshitij.so 2929
}
17944 kshitij.so 2930
    result =  get_elastic_search_connection().search(index="my_index", body=payload, from_=offset, size=limit)
17936 kshitij.so 2931
    totalCount= result['hits']['total']
2932
    temp = []
2933
    bundles = []
2934
    if len(result['hits']['hits']) > 0:
2935
        for x in result['hits']['hits']:
2936
            tempMap = {}
2937
            tempMap = {'skuBundleId':x['_source']['id'],'title':x['_source']['title']}
2938
            temp.append(tempMap)
2939
            bundles.append(x['_source']['id'])
18271 kshitij.so 2940
    #return temp
17936 kshitij.so 2941
    return getDealsForNotification(bundles, skipSplitting=True)
17731 kshitij.so 2942
 
18089 kshitij.so 2943
def getCountForSearchText(subCategoryIds, searchTerm):
2944
    subCategories= [int(subCategoryId) for subCategoryId in subCategoryIds.split('^')]
17936 kshitij.so 2945
    payload = {
18106 kshitij.so 2946
    "query": {
17936 kshitij.so 2947
        "bool": {
18106 kshitij.so 2948
            "must": [{
2949
                    "match": {
2950
                        "title": {
2951
                            "query": searchTerm,
2952
                            "operator": "and"
2953
                        }
17936 kshitij.so 2954
                    }
18106 kshitij.so 2955
                },
2956
 
2957
                {
2958
                    "in": {
2959
                        "subCategoryId": subCategories
2960
                    }
17936 kshitij.so 2961
                }
18106 kshitij.so 2962
 
2963
            ]
17936 kshitij.so 2964
        }
2965
    }
18106 kshitij.so 2966
}
17731 kshitij.so 2967
 
17944 kshitij.so 2968
    result =  get_elastic_search_connection().search(index="my_index", body=payload)
17936 kshitij.so 2969
    totalCount= result['hits']['total']
2970
    return {'searchTerm':searchTerm,'count':totalCount}
18271 kshitij.so 2971
 
2972
def getDealById(id):
2973
    item = list(get_mongo_connection().Catalog.MasterData.find({'_id':int(id)}))
2974
    d = get_mongo_connection().Catalog.Deals.find_one({'_id':int(id)})
19193 kshitij.so 2975
    if len(item) ==0:
2976
        return {}
18271 kshitij.so 2977
    if d is None:
2978
        d = {'showDp':0,'dp':0}
2979
    try:
2980
        cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
2981
        if not cashBack or cashBack.get('cash_back_status')!=1:
2982
            item[0]['cash_back_type'] = 0
2983
            item[0]['cash_back'] = 0
2984
        else:
2985
            if cashBack.get('maxCashBack') is not None:
2986
 
2987
                if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*item[0]['available_price'])/100 > cashBack.get('maxCashBack'):
2988
                    cashBack['cash_back_type'] = 2
2989
                    cashBack['cash_back'] = cashBack['maxCashBack']
2990
                elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
2991
                    cashBack['cash_back'] = cashBack['maxCashBack']
17936 kshitij.so 2992
 
18271 kshitij.so 2993
            item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
2994
            item[0]['cash_back'] = cashBack['cash_back']
2995
    except:
2996
        print "Error in adding cashback to deals"
2997
        item[0]['cash_back_type'] = 0
2998
        item[0]['cash_back'] = 0
2999
    try:
3000
        item[0]['dp'] = d['dp']
3001
        item[0]['showDp'] = d['showDp']
3002
    except:
3003
        item[0]['dp'] = 0.0
3004
        item[0]['showDp'] = 0
3005
    try:
3006
        item[0]['thumbnail'] = item[0]['thumbnail'].strip()
3007
    except:
3008
        pass
3009
 
3010
    try:
3011
        if item[0]['showVideo']==0:
3012
            item[0]['videoLink'] =""
3013
    except:
3014
        item[0]['videoLink'] =""
3015
    try:
3016
        if item[0]['quantity'] >1:
3017
            ppq = float(item[0]['available_price'])/item[0]['quantity']
3018
 
3019
            if ppq == round(ppq):
3020
                item[0]['ppq'] = int(ppq)
3021
            else:
3022
                item[0]['ppq'] = round(ppq,2)
3023
        else:
3024
            item[0]['ppq'] = 0
3025
    except:
3026
        item[0]['ppq'] = 0
3027
    if item[0]['category_id']!=6:
3028
        try:
18830 kshitij.so 3029
            item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
3030
            item[0]['filterTextBrand'] = (item[0]['brand'])
18271 kshitij.so 3031
        except:
18830 kshitij.so 3032
            pass
18271 kshitij.so 3033
    else:
3034
        try:
3035
            if item[0]['subCategory']=='' or item[0]['subCategory'] is None or item[0]['subCategoryId']==0:
3036
                raise
18830 kshitij.so 3037
            item[0]['filterLinkSubCategory'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['subCategory'])+'&filter=subcategory&subcategories='+str(int(item[0]['subCategoryId']))
3038
            item[0]['filterTextSubCategory'] = (item[0]['subCategory'])
3039
            item[0]['filterLinkBrand'] = '/category/'+str(int(item[0]['category_id']))+'?searchFor='+urllib.quote(item[0]['brand'])+'&filter=brand&brands='+str(int(item[0]['brand_id']))
3040
            item[0]['filterTextBrand'] = (item[0]['brand'])
18271 kshitij.so 3041
        except:
18830 kshitij.so 3042
            pass
18271 kshitij.so 3043
    try:
3044
        if item[0]['source_id']==4:
3045
            item_availability_info = mc.get("item_availability_"+str(item[0]['identifier']).strip())
3046
            if item_availability_info is None or len(item_availability_info)==0:
3047
                item[0]['availabilityInfo'] = [{}]
3048
            else:
3049
                item[0]['availabilityInfo'] = item_availability_info
3050
    except:
3051
        item[0]['availabilityInfo'] = [{}]
19193 kshitij.so 3052
 
3053
    if item[0]['source_id']==4:
3054
        for av_info in item[0]['availabilityInfo']:
3055
            if not av_info:
3056
                continue
3057
            av_info['cash_back'] = item[0]['cash_back']
3058
            av_info['cash_back_type'] = item[0]['cash_back_type']
3059
            netPriceAfterCashBack = av_info['sellingPrice'] 
19199 kshitij.so 3060
            if av_info['cash_back_type'] ==1:
19207 kshitij.so 3061
                netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(float(av_info['sellingPrice'])*av_info['cash_back']/100)
19199 kshitij.so 3062
            elif av_info['cash_back_type'] ==2:
19207 kshitij.so 3063
                netPriceAfterCashBack = av_info['sellingPrice'] - math.floor(av_info['cash_back'])
19193 kshitij.so 3064
            else:
3065
                pass
3066
            av_info['netPriceAfterCashBack'] = netPriceAfterCashBack
3067
 
3068
    if item[0]['source_id'] != SOURCE_MAP.get("PAYTM.COM"):
3069
        if item[0]['codAvailable'] ==1:
3070
            paytmPrice = item[0]['available_price']
3071
        else:
3072
            paytmPrice = item[0]['gross_price']
3073
 
3074
        if item[0]['cash_back_type'] ==1:
19207 kshitij.so 3075
            item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(float(paytmPrice)*item[0]['cash_back']/100)
19193 kshitij.so 3076
        elif item[0]['cash_back_type'] ==2:
19207 kshitij.so 3077
            item[0]['netPriceAfterCashBack'] = paytmPrice -  math.floor(item[0]['cash_back'])
19193 kshitij.so 3078
        else:
3079
            item[0]['netPriceAfterCashBack'] = paytmPrice
3080
 
3081
    else:
3082
        if item[0]['cash_back_type'] ==1:
19207 kshitij.so 3083
            item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(float(item[0]['available_price'])*item[0]['cash_back']/100)
19193 kshitij.so 3084
        elif item[0]['cash_back_type'] ==2:
19207 kshitij.so 3085
            item[0]['netPriceAfterCashBack'] = item[0]['available_price'] -  math.floor(item[0]['cash_back'])
19193 kshitij.so 3086
        else:
3087
            item[0]['netPriceAfterCashBack'] = item[0]['available_price']
3088
 
18271 kshitij.so 3089
    return item[0]
3090
 
19288 kshitij.so 3091
def getOfferForUser(userId):
3092
    specialOffer = {}
3093
    promoOffer = get_mongo_connection().Catalog.PromoOffer.find_one({'user_id':userId})
3094
    try:
3095
        if promoOffer is not None:
3096
            offer = get_mongo_connection().Catalog.Promotions.find_one({'_id':promoOffer.get('offer_id')})
3097
            if offer is None:
3098
                raise
19355 kshitij.so 3099
            promo = Promotion(offer.get('_id'),offer.get('offer_name'),offer.get('offer_description') , offer.get('categories_applicable'), offer.get('sub_categories_not_applicable'),
19331 kshitij.so 3100
                     offer.get('startDate'), offer.get('endDate'), promoOffer.get('target1'), promoOffer.get('target1_cash_back_percetage'), promoOffer.get('target2'), promoOffer.get('target2_cash_back_percetage'), promoOffer.get('maxCashBack'), offer.get('url'),
19350 kshitij.so 3101
                     promoOffer.get('pending_order_value'), promoOffer.get('delivered_order_value'), promoOffer.get('last_run_timestamp'))
19354 kshitij.so 3102
 
19355 kshitij.so 3103
            promo.offer_description = "Get upto %d%% cashback"%(promo.target2_cash_back_percetage)
3104
 
19288 kshitij.so 3105
            specialOffer = promo.__dict__
3106
    except:
3107
        pass
3108
    return specialOffer
3109
 
19389 kshitij.so 3110
def getBrandSubCategoryInfo(category_id, id_list, type):
19402 kshitij.so 3111
    try:
3112
        id_list_mapping = {}
3113
        if type == "brandInfo":
3114
            brands = [int(brand_id) for brand_id in id_list.split('^')]
3115
            for brand in brands:
3116
                tm_brand = get_mongo_connection().Catalog.Deals.find_one({'brand_id':brand},{'brand':1})
3117
                id_list_mapping[brand] = tm_brand.get('brand')
3118
        elif type == "subCategoryInfo":
3119
            subCategories = [int(subCategoryId) for subCategoryId in id_list.split('^')]
3120
            for subCat in subCategories:
3121
                id_list_mapping[subCat] = SUB_CATEGORY_MAP.get(subCat)
3122
        else:
3123
            return {}
19389 kshitij.so 3124
 
19402 kshitij.so 3125
        if mc.get("brandSubCategoryInfo") is None:
3126
            collection =  get_mongo_connection().Catalog.Deals
3127
            result = collection.aggregate( 
3128
                    [
3129
                        {'$match':{'category_id':category_id,'showDeal':1}},
3130
                        {"$group": { "_id": { "subCategoryId": "$subCategoryId", "brand_id": "$brand_id", "brand":"$brand","subCategory":"$subCategory" }, "count": {"$sum": 1} } }
3131
                    ]
3132
                );
3133
            #from pprint import pprint
3134
            #pprint(result)
3135
 
3136
            subCategoryMap = {}
3137
            brandMap = {}
3138
 
3139
            for data in result['result']:
3140
                result_set = data['_id']
3141
                count = data['count']
3142
                subCategoryId = result_set['subCategoryId']
3143
                brand_id = result_set['brand_id']
3144
                subCategory = result_set['subCategory']
3145
                brand = result_set['brand']
3146
 
3147
                if subCategoryMap.has_key(subCategoryId):
3148
                    subCategoryMap.get(subCategoryId).append({'brand_id':brand_id, 'count':count, 'subCategory':subCategory, 'brand':brand})
3149
                else:
3150
                    subCategoryMap[subCategoryId] = [{'brand_id':brand_id, 'count':count, 'subCategory':subCategory, 'brand':brand}]
3151
 
3152
                if brandMap.has_key(brand_id):
3153
                    brandMap.get(brand_id).append({'subCategoryId':subCategoryId, 'count':count, 'subCategory':subCategory, 'brand':brand})
3154
                else:
3155
                    brandMap[brand_id] = [{'subCategoryId':subCategoryId, 'count':count, 'subCategory':subCategory, 'brand':brand}]
3156
 
3157
            mc.set("brandSubCategoryInfo",{'subCategoryMap':subCategoryMap, 'brandMap': brandMap}, 600)
19389 kshitij.so 3158
 
19402 kshitij.so 3159
 
3160
        returnMap = {}    
3161
        brandSubCategoryInfo = mc.get("brandSubCategoryInfo")
3162
        if brandSubCategoryInfo is None:
3163
            return {'idListInfo':id_list_mapping,'result':[]}
3164
 
3165
        if type == "subCategoryInfo":
3166
            if brandSubCategoryInfo.get('subCategoryMap') is None:
3167
                return {'idListInfo':id_list_mapping,'result':[]}
3168
            subCategories = [int(subCategoryId) for subCategoryId in id_list.split('^')]
3169
            subCategoryMap = brandSubCategoryInfo.get('subCategoryMap')
3170
            for subCategory in subCategories:
3171
                tempList = subCategoryMap.get(subCategory)
3172
                print tempList
3173
                if tempList is None:
3174
                    continue
3175
                for v in tempList:
3176
                    if returnMap.has_key(v['brand_id']):
3177
                        existing = returnMap.get(v['brand_id'])
3178
                        existing['count'] = existing['count'] + v['count'] 
3179
                    else:
3180
                        returnMap[v['brand_id']] = {'brand_id':v['brand_id'],'brand':v['brand'],'count':v['count']}
19389 kshitij.so 3181
 
19402 kshitij.so 3182
 
3183
        elif type == "brandInfo":
3184
            if brandSubCategoryInfo.get('brandMap') is None:
3185
                return {'idListInfo':id_list_mapping,'result':[]}
3186
            brands = [int(brand_id) for brand_id in id_list.split('^')]
3187
            brandMap = brandSubCategoryInfo.get('brandMap')
3188
            for brand_id in brands:
3189
                tempList = brandMap.get(brand_id)
3190
                print tempList
3191
                if tempList is None:
3192
                    continue
3193
                for v in tempList:
3194
                    if returnMap.has_key(v['subCategoryId']):
3195
                        existing = returnMap.get(v['subCategoryId'])
3196
                        existing['count'] = existing['count'] + v['count'] 
3197
                    else:
3198
                        returnMap[v['subCategoryId']] = {'subCategoryId':v['subCategoryId'],'subCategory':v['subCategory'],'count':v['count']}
19389 kshitij.so 3199
 
19402 kshitij.so 3200
        return {'idListInfo':id_list_mapping,'result':returnMap.values()}
3201
    except:
3202
        traceback.print_exc()
3203
        return {}
19389 kshitij.so 3204
 
19451 manas 3205
def refundAmountInWallet(jsonReq):
3206
    userId = int(jsonReq.get('user_id'))
3207
    emailId = jsonReq.get('email_id')
3208
    amount = int(jsonReq.get('amount'))
3209
    store = jsonReq.get('store')
3210
    refundType = jsonReq.get('type')
3211
    mobileNumber = jsonReq.get('mobile')
3212
    referenceId = jsonReq.get('reference_no')
3213
    referenceDescription = jsonReq.get('reference_description')
3214
    if lower(refundType)=='refund':
3215
        refundType = utils.CREDIT_TYPE_REFUND
3216
    elif lower(refundType)=='adjustment':
3217
        refundType = utils.CREDIT_TYPE_ADJUSTMENT
3218
    collection = get_mongo_connection().Dtr.crmrefundwallet
3219
    offer1 = CrmRefundWallet(userId,emailId,mobileNumber,amount,refundType,store,referenceId,referenceDescription,utils.REFUND_ADJUSTMENT_MAP.get(0),datetime.now())    
3220
    dict1 = todict(offer1)
3221
    collection.save(dict1)
3222
    return True
3223
 
3224
def fetchCrmRefundUsers(status,offset,limit):
3225
    cursor = list(get_mongo_connection().Dtr.crmrefundwallet.find({"status":status}).skip(offset).limit(limit).sort("created_timestamp",-1))
3226
    return cursor
3227
 
19453 manas 3228
def todict(obj, classkey=None):
3229
    if isinstance(obj, dict):
3230
        data = {}
3231
        for (k, v) in obj.items():
3232
            data[k] = todict(v, classkey)
3233
        return data
3234
    elif hasattr(obj, "_ast"):
3235
        return todict(obj._ast())
3236
    elif hasattr(obj, "__iter__"):
3237
        return [todict(v, classkey) for v in obj]
3238
    elif hasattr(obj, "__dict__"):
3239
        data = dict([(key, todict(value, classkey)) 
3240
            for key, value in obj.__dict__.iteritems() 
3241
            if not callable(value) and not key.startswith('_')])
3242
        if classkey is not None and hasattr(obj, "__class__"):
3243
            data[classkey] = obj.__class__.__name__
3244
        return data
3245
    else:
3246
        return obj
3247
 
13572 kshitij.so 3248
def main():
19435 kshitij.so 3249
    resetCache("47")
19441 kshitij.so 3250
    getAccesoryDeals(47, 6, 0, 20, None, None, None)
17944 kshitij.so 3251
 
13572 kshitij.so 3252
if __name__=='__main__':
19451 manas 3253
    main()