Subversion Repositories SmartDukaan

Rev

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