Subversion Repositories SmartDukaan

Rev

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