Subversion Repositories SmartDukaan

Rev

Rev 17788 | Rev 17937 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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