Subversion Repositories SmartDukaan

Rev

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