Subversion Repositories SmartDukaan

Rev

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