Subversion Repositories SmartDukaan

Rev

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