Subversion Repositories SmartDukaan

Rev

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