Subversion Repositories SmartDukaan

Rev

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