Subversion Repositories SmartDukaan

Rev

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