Subversion Repositories SmartDukaan

Rev

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