Subversion Repositories SmartDukaan

Rev

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