Subversion Repositories SmartDukaan

Rev

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

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