Subversion Repositories SmartDukaan

Rev

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