Subversion Repositories SmartDukaan

Rev

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