Subversion Repositories SmartDukaan

Rev

Rev 17115 | Rev 17280 | 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, \
16894 manish.sha 8
    user_app_installs, appmasters
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, \
12
    to_py_date, CB_REJECTED
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
13572 kshitij.so 23
 
16894 manish.sha 24
 
13572 kshitij.so 25
con = None
26
 
14037 kshitij.so 27
DataService.initialize(db_hostname="localhost")
16304 amit.gupta 28
mc = MemCache("127.0.0.1")
14037 kshitij.so 29
 
17035 kshitij.so 30
SOURCE_MAP = {1:'AMAZON',2:'FLIPKART',3:'SNAPDEAL',4:'SAHOLIC',5:"SHOPCLUES.COM",6:"PAYTM.COM",7:"HOMESHOP18.COM"}
14482 kshitij.so 31
 
15853 kshitij.so 32
COLLECTION_MAP = {
33
                  'ExceptionalNlc':'skuBundleId',
34
                  'SkuDealerPrices':'skuBundleId',
35
                  'SkuDiscountInfo':'skuBundleId',
36
                  'SkuSchemeDetails':'skuBundleId',
16488 kshitij.so 37
                  'DealPoints':'skuBundleId'
15853 kshitij.so 38
                  }
39
 
13572 kshitij.so 40
def get_mongo_connection(host='localhost', port=27017):
41
    global con
42
    if con is None:
43
        print "Establishing connection %s host and port %d" %(host,port)
44
        try:
45
            con = pymongo.MongoClient(host, port)
46
        except Exception, e:
47
            print e
48
            return None
49
    return con
50
 
13907 kshitij.so 51
def populateCashBack():
13921 kshitij.so 52
    print "Populating cashback"
53
    cashBackMap = {}
54
    itemCashBackMap = {}
13907 kshitij.so 55
    cashBack = list(get_mongo_connection().Catalog.CategoryCashBack.find())
56
    for row in cashBack:
13970 kshitij.so 57
        temp_map = {}
58
        temp_list = []
13907 kshitij.so 59
        if cashBackMap.has_key(row['source_id']):
60
            arr = cashBackMap.get(row['source_id'])
61
            for val in arr:
62
                temp_list.append(val)
63
            temp_map[row['category_id']] = row
64
            temp_list.append(temp_map)
65
            cashBackMap[row['source_id']] = temp_list 
66
        else:
67
            temp_map[row['category_id']] = row
68
            temp_list.append(temp_map)
69
            cashBackMap[row['source_id']] = temp_list
13921 kshitij.so 70
    itemCashBack = list(get_mongo_connection().Catalog.ItemCashBack.find())
71
    for row in itemCashBack:
72
        if not itemCashBackMap.has_key(row['skuId']):
73
            itemCashBackMap[row['skuId']] = row
14761 kshitij.so 74
    mc.set("item_cash_back", itemCashBackMap, 24 * 60 * 60)
75
    mc.set("category_cash_back", cashBackMap, 24 * 60 * 60)
13907 kshitij.so 76
 
13572 kshitij.so 77
def addCategoryDiscount(data):
13970 kshitij.so 78
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 79
    query = []
80
    data['brand'] = data['brand'].strip().upper()
13970 kshitij.so 81
    data['discountType'] = data['discountType'].upper().strip()
13572 kshitij.so 82
    query.append({"brand":data['brand']})
83
    query.append({"category_id":data['category_id']})
84
    r = collection.find({"$and":query})
85
    if r.count() > 0:
13639 kshitij.so 86
        return {0:"Brand & Category info already present."}
13572 kshitij.so 87
    else:
88
        collection.insert(data)
13970 kshitij.so 89
        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 90
        return {1:"Data added successfully"}
13572 kshitij.so 91
 
13970 kshitij.so 92
def updateCategoryDiscount(data,_id):
93
    try:
94
        collection = get_mongo_connection().Catalog.CategoryDiscount
95
        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)
96
        get_mongo_connection().Catalog.MasterData.update({'brand':data['brand'],'category_id':data['category_id']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
97
        return {1:"Data updated successfully"}
98
    except:
99
        return {0:"Data not updated."}
100
 
101
 
13572 kshitij.so 102
def getAllCategoryDiscount():
103
    data = []
13970 kshitij.so 104
    collection = get_mongo_connection().Catalog.CategoryDiscount
13572 kshitij.so 105
    cursor = collection.find()
106
    for val in cursor:
107
        data.append(val)
108
    return data
109
 
14553 kshitij.so 110
def __getBundledSkusfromSku(sku):
111
    masterData =  get_mongo_connection().Catalog.MasterData.find_one({"_id":sku},{"skuBundleId":1})
112
    if masterData is not None:
113
        return list(get_mongo_connection().Catalog.MasterData.find({"skuBundleId":masterData.get('skuBundleId')},{'_id':1,'skuBundleId':1}))
114
    else:
115
        return []
13572 kshitij.so 116
 
15853 kshitij.so 117
def addSchemeDetailsForSku(data):
118
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
119
    result = collection.find_one({'skuBundleId':data['skuBundleId']})
120
    if result is None:
14553 kshitij.so 121
        collection.insert(data)
15853 kshitij.so 122
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14553 kshitij.so 123
        return {1:"Data added successfully"}
15853 kshitij.so 124
    return {1:"BundleId info already present"}
125
 
14069 kshitij.so 126
def getAllSkuWiseSchemeDetails(offset, limit):
13572 kshitij.so 127
    data = []
13970 kshitij.so 128
    collection = get_mongo_connection().Catalog.SkuSchemeDetails
14071 kshitij.so 129
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 130
    for val in cursor:
15853 kshitij.so 131
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
132
        if master is not None:
133
            val['brand'] = master['brand']
134
            val['source_product_name'] = master['source_product_name']
14069 kshitij.so 135
        else:
136
            val['brand'] = ""
137
            val['source_product_name'] = ""
13572 kshitij.so 138
        data.append(val)
139
    return data
140
 
15853 kshitij.so 141
def addSkuDiscountInfo(data):
142
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
143
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
144
    if cursor is not None:
145
        return {0:"BundleId information already present."}
13572 kshitij.so 146
    else:
15853 kshitij.so 147
        collection.insert(data)
148
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 149
        return {1:"Data added successfully"}
13572 kshitij.so 150
 
13970 kshitij.so 151
def getallSkuDiscountInfo(offset, limit):
13572 kshitij.so 152
    data = []
13970 kshitij.so 153
    collection = get_mongo_connection().Catalog.SkuDiscountInfo
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']
13970 kshitij.so 160
        else:
161
            val['brand'] = ""
162
            val['source_product_name'] = ""
13572 kshitij.so 163
        data.append(val)
164
    return data
165
 
13970 kshitij.so 166
def updateSkuDiscount(data,_id):
167
    try:
168
        collection = get_mongo_connection().Catalog.SkuDiscountInfo
169
        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 170
        get_mongo_connection().Catalog.MasterData.update({'_id':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 171
        return {1:"Data updated successfully"}
172
    except:
173
        return {0:"Data not updated."}
174
 
175
 
15853 kshitij.so 176
def addExceptionalNlc(data):
177
    collection = get_mongo_connection().Catalog.ExceptionalNlc
178
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
179
    if cursor is not None:
180
        return {0:"BundleId information already present."}
13572 kshitij.so 181
    else:
15853 kshitij.so 182
        collection.insert(data)
183
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13639 kshitij.so 184
        return {1:"Data added successfully"}
13572 kshitij.so 185
 
13970 kshitij.so 186
def getAllExceptionlNlcItems(offset, limit):
13572 kshitij.so 187
    data = []
13970 kshitij.so 188
    collection = get_mongo_connection().Catalog.ExceptionalNlc
14071 kshitij.so 189
    cursor = collection.find().skip(offset).limit(limit)
13572 kshitij.so 190
    for val in cursor:
15853 kshitij.so 191
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
192
        if master is not None:
193
            val['brand'] = master['brand']
194
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 195
        else:
196
            val['brand'] = ""
197
            val['source_product_name'] = ""
13572 kshitij.so 198
        data.append(val)
199
    return data
200
 
14005 amit.gupta 201
def getMerchantOrdersByUser(userId, page=1, window=50, searchMap={}):
202
    if searchMap is None:
203
        searchMap = {}
13603 amit.gupta 204
    if page==None:
205
        page = 1
206
 
207
    if window==None:
208
        window = 50
209
    result = {}
13582 amit.gupta 210
    skip = (page-1)*window
14005 amit.gupta 211
 
14353 amit.gupta 212
    if userId is not None:
213
        searchMap['userId'] = userId
13603 amit.gupta 214
    collection = get_mongo_connection().Dtr.merchantOrder
14609 amit.gupta 215
    cursor = collection.find(searchMap).sort("orderId",-1)
13603 amit.gupta 216
    total_count = cursor.count()
217
    pages = total_count/window + (0 if total_count%window==0 else 1)  
218
    print "total_count", total_count
219
    if total_count > skip:
13999 amit.gupta 220
        cursor = cursor.skip(skip).limit(window)
13603 amit.gupta 221
        orders = []
222
        for order in cursor:
14002 amit.gupta 223
            del(order["_id"])
224
            orders.append(order)
13603 amit.gupta 225
        result['data'] = orders
226
        result['window'] = window
227
        result['totalCount'] = total_count 
228
        result['currCount'] = cursor.count()
229
        result['totalPages'] = pages
230
        result['currPage'] = page    
231
        return result
232
    else:
233
        return result
13630 kshitij.so 234
 
13927 amit.gupta 235
def getRefunds(userId, page=1, window=10):
236
    if page==None:
237
        page = 1
238
 
239
    if window==None:
13995 amit.gupta 240
        window = 10
13927 amit.gupta 241
    result = {}
242
    skip = (page-1)*window
16737 amit.gupta 243
    con = get_mongo_connection()
244
    collection = con.Dtr.refund
245
    user = con.Dtr.user
16754 amit.gupta 246
    credited = user.find_one({"userId":userId})
247
    if credited:
248
        credited = credited.get("credited")
249
    else:
250
        credited=0
251
 
13927 amit.gupta 252
    cursor = collection.find({"userId":userId})
253
    total_count = cursor.count()
254
    pages = total_count/window + (0 if total_count%window==0 else 1)  
255
    print "total_count", total_count
256
    if total_count > skip:
14668 amit.gupta 257
        cursor = cursor.skip(skip).limit(window).sort([('batch',-1)])
13927 amit.gupta 258
        refunds = []
259
        for refund in cursor:
260
            del(refund["_id"])
261
            refunds.append(refund)
16754 amit.gupta 262
        result['credited'] = credited
13927 amit.gupta 263
        result['data'] = refunds
264
        result['window'] = window
265
        result['totalCount'] = total_count 
266
        result['currCount'] = cursor.count()
267
        result['totalPages'] = pages
268
        result['currPage'] = page    
269
        return result
270
    else:
271
        return result
272
 
273
def getPendingRefunds(userId):
13991 amit.gupta 274
    print type(userId)
13927 amit.gupta 275
    result = get_mongo_connection().Dtr.merchantOrder\
276
        .aggregate([
16398 amit.gupta 277
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED, 'userId':userId}},
13927 amit.gupta 278
                    {'$unwind':"$subOrders"},
16398 amit.gupta 279
                    {'$match':{'subOrders.cashBackStatus':CB_APPROVED}},
13927 amit.gupta 280
                    { 
281
                     '$group':{
282
                               '_id':None,
283
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
284
                               }
285
                     }
13987 amit.gupta 286
                ])['result']
287
 
288
    if len(result)>0:
289
        result = result[0]        
290
        result.pop("_id")
291
    else:
292
        result={}
293
        result['amount'] = 0.0
14305 amit.gupta 294
    result['nextCredit'] = datetime.strftime(next_weekday(datetime.now(), int(PythonPropertyReader.getConfig('CREDIT_DAY_OF_WEEK'))),"%Y-%m-%d %H:%M:%S")
13927 amit.gupta 295
    return result
14037 kshitij.so 296
 
14671 amit.gupta 297
def getPendingCashbacks(userId):
298
    result = get_mongo_connection().Dtr.merchantOrder\
299
        .aggregate([
16398 amit.gupta 300
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING, 'userId':userId}},
14671 amit.gupta 301
                    {'$unwind':"$subOrders"},
16398 amit.gupta 302
                    {'$match':{'subOrders.cashBackStatus':CB_PENDING}},
14671 amit.gupta 303
                    { 
304
                     '$group':{
305
                               '_id':None,
306
                               'amount': { '$sum':'$subOrders.cashBackAmount'},
307
                               }
308
                     }
309
                ])['result']
310
 
311
    if len(result)>0:
312
        result = result[0]        
313
        result.pop("_id")
314
    else:
315
        result={}
316
        result['amount'] = 0.0
317
    return result
318
 
14037 kshitij.so 319
def __populateCache(userId):
320
    print "Populating memcache for userId",userId
321
    outer_query = []
16067 kshitij.so 322
    outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
14037 kshitij.so 323
    query = {}
16170 kshitij.so 324
    query['$gt'] = -100
14037 kshitij.so 325
    outer_query.append({'totalPoints':query})
326
    brandPrefMap = {}
327
    pricePrefMap = {}
328
    actionsMap = {}
329
    brand_p = session.query(price_preferences).filter_by(user_id=userId).all()
330
    for x in brand_p:
331
        pricePrefMap[x.category_id] = [x.min_price,x.max_price]
332
    for x in session.query(brand_preferences).filter_by(user_id=userId).all():
333
        temp_map = {}
334
        if brandPrefMap.has_key((x.brand).strip().upper()):
335
            val = brandPrefMap.get((x.brand).strip().upper())
336
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
337
            val.append(temp_map)
338
        else:
339
            temp = []
340
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
341
            temp.append(temp_map)
342
            brandPrefMap[(x.brand).strip().upper()] = temp
343
 
344
    for x in session.query(user_actions).filter_by(user_id=userId).all():
345
        actionsMap[x.store_product_id] = 1 if x.action == 'like' else 0
16458 kshitij.so 346
    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}).sort([('totalPoints',pymongo.DESCENDING),('bestSellerPoints',pymongo.DESCENDING),('nlcPoints',pymongo.DESCENDING),('rank',pymongo.DESCENDING)]))
14037 kshitij.so 347
    all_category_deals = []
348
    mobile_deals = []
349
    tablet_deals = []
350
    for deal in all_deals:
351
        if actionsMap.get(deal['_id']) == 0:
352
            fav_weight =.25
353
        elif actionsMap.get(deal['_id']) == 1:
354
            fav_weight = 1.5
355
        else:
356
            fav_weight = 1
357
 
358
        if brandPrefMap.get(deal['brand'].strip().upper()) is not None:
359
            brand_weight = 1
360
            for brandInfo in brandPrefMap.get(deal['brand'].strip().upper()):
361
                if brandInfo.get(deal['category_id']) is not None:
362
                    if brandInfo.get(deal['category_id']) == 1:
14055 kshitij.so 363
                        brand_weight = 2.0
14037 kshitij.so 364
        else:
365
            brand_weight = 1
366
 
367
        if pricePrefMap.get(deal['category_id']) is not None:
368
 
369
            if deal['available_price'] >= pricePrefMap.get(deal['category_id'])[0] and deal['available_price'] <= pricePrefMap.get(deal['category_id'])[1]:
370
                asp_weight = 1.5
371
            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]:
372
                asp_weight = 1.2
373
            else:
374
                asp_weight = 1
375
        else:
376
            asp_weight = 1
377
 
378
        persPoints = deal['totalPoints'] * fav_weight * brand_weight * asp_weight
379
        deal['persPoints'] = persPoints
380
 
381
        if deal['category_id'] ==3:
382
            mobile_deals.append(deal)
383
        elif deal['category_id'] ==5:
384
            tablet_deals.append(deal)
385
        else:
386
            continue
387
        all_category_deals.append(deal)
388
 
14144 kshitij.so 389
    session.close()
14037 kshitij.so 390
    mem_cache_val = {3:mobile_deals, 5:tablet_deals, 0:all_deals}
391
    mc.set(str(userId), mem_cache_val)
392
 
393
 
14531 kshitij.so 394
def __populateFeaturedDeals():
395
    all_category_fd = []
396
    mobile_fd = []
397
    tablet_fd = []
14550 kshitij.so 398
    activeFeaturedDeals = get_mongo_connection().Catalog.FeaturedDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}}).sort({'rank':pymongo.ASCENDING})
14531 kshitij.so 399
    for activeFeaturedDeal in activeFeaturedDeals:
400
        for k,v in activeFeaturedDeal['rankDetails']:
401
            featuredDeal = FeaturedDeals(activeFeaturedDeal['sku'], int(k), activeFeaturedDeal['thresholdPrice'], int(v))
402
            if featuredDeal.category_id == 0:
403
                all_category_fd.append(featuredDeal)
404
            elif featuredDeal.category_id == 3:
405
                mobile_fd.append(featuredDeal)
406
            elif featuredDeal.category_id == 5:
407
                tablet_fd.append(featuredDeal)
408
            else:
409
                continue
14550 kshitij.so 410
    mc.set("featured_deals_category_"+str(0), all_category_fd, 3600)
411
    mc.set("featured_deals_category_"+str(3), mobile_fd, 3600)
412
    mc.set("featured_deals_category_"+str(5), tablet_fd, 3600)
14037 kshitij.so 413
 
14791 kshitij.so 414
def getNewDeals(userId, category_id, offset, limit, sort, direction, filterData=None):
14761 kshitij.so 415
    if not bool(mc.get("category_cash_back")):
13921 kshitij.so 416
        populateCashBack()
14037 kshitij.so 417
 
14550 kshitij.so 418
    try:
419
        if mc.get("featured_deals_category_"+str(category_id)) is None:
420
            __populateFeaturedDeals()
421
    except:
422
        pass 
14531 kshitij.so 423
 
13771 kshitij.so 424
    rank = 1
16079 kshitij.so 425
    dealsListMap = []
14037 kshitij.so 426
    user_specific_deals = mc.get(str(userId))
427
    if user_specific_deals is None:
428
        __populateCache(userId)
429
        user_specific_deals = mc.get(str(userId))
14038 kshitij.so 430
    else:
431
        print "Getting user deals from cache"
14037 kshitij.so 432
    category_specific_deals = user_specific_deals.get(category_id)
433
 
434
    if sort is None or direction is None:
435
        sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
436
    else:
437
        if sort == "bestSellerPoints":
438
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['bestSellerPoints'], x['rank'], x['nlcPoints']),reverse=True)
439
        else:
440
            if direction == -1:
441
                rev = True
442
            else:
443
                rev = False
444
            sorted_deals = sorted(category_specific_deals, key = lambda x: (x['available_price']),reverse=rev)
445
 
14791 kshitij.so 446
 
447
    print "============================"
448
    if filterData is not None:
449
        try:
450
            sorted_deals = filterDeals(sorted_deals, filterData)
451
        except:
16067 kshitij.so 452
            traceback.print_exc()
14791 kshitij.so 453
 
16067 kshitij.so 454
 
455
    sortedMap = {}
456
    rankMap = {}
457
    rank = 0
458
    for sorted_deal in sorted_deals:
459
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
460
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
461
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
462
            rank = rank +1
463
        else:
464
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
465
                temp_list.append(sorted_deal)
16079 kshitij.so 466
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
16067 kshitij.so 467
 
468
    for dealList in [rankMap.get(k, []) for k in range(offset, offset+limit)]:
16079 kshitij.so 469
        temp = []
16067 kshitij.so 470
        for d in dealList:
471
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
16320 kshitij.so 472
            if len(item) ==0:
473
                continue
16079 kshitij.so 474
            item[0]['persPoints'] = d['persPoints']
475
            if d['dealType'] == 1 and d['source_id'] ==1:
16511 kshitij.so 476
                try:
477
                    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())}}))
478
                    item[0]['marketPlaceUrl'] = manualDeal[0]['dealUrl'].strip()
479
                except:
480
                    pass
16079 kshitij.so 481
            elif d['source_id'] ==3:
482
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
483
            else:
484
                pass 
485
            try:
486
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
487
                if not cashBack or cashBack.get('cash_back_status')!=1:
14037 kshitij.so 488
                    item[0]['cash_back_type'] = 0
489
                    item[0]['cash_back'] = 0
16079 kshitij.so 490
                else:
17180 kshitij.so 491
                    if cashBack.get('maxCashBack') is not None:
492
 
493
                        if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*item[0]['available_price'])/100 > cashBack.get('maxCashBack'):
494
                            cashBack['cash_back_type'] = 2
495
                            cashBack['cash_back'] = cashBack['maxCashBack']
496
                        elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
497
                            cashBack['cash_back'] = cashBack['maxCashBack']
498
 
16079 kshitij.so 499
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
500
                    item[0]['cash_back'] = cashBack['cash_back']
501
            except:
502
                print "Error in adding cashback to deals"
503
                item[0]['cash_back_type'] = 0
504
                item[0]['cash_back'] = 0
16252 kshitij.so 505
            try:
506
                item[0]['dp'] = d['dp']
507
                item[0]['showDp'] = d['showDp']
508
            except:
509
                item[0]['dp'] = 0.0
510
                item[0]['showDp'] = 0
16483 kshitij.so 511
            try:
512
                item[0]['thumbnail'] = item[0]['thumbnail'].strip()
513
            except:
17115 manish.sha 514
                pass
16079 kshitij.so 515
            temp.append(item[0])
16125 kshitij.so 516
        if len(temp) > 1:
16126 kshitij.so 517
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
16079 kshitij.so 518
        dealsListMap.append(temp)
519
    return dealsListMap
14037 kshitij.so 520
 
14791 kshitij.so 521
def filterDeals(deals, filterData):
522
    dealFiltered = []
523
    brandsFiltered = []
524
    filterArray = filterData.split('|')
525
    for data in filterArray:
526
        try:
527
            filter, info = data.split(':')
528
        except Exception as ex:
529
            traceback.print_exc()
530
            continue
531
        if filter == 'dealFilter':
532
            toFilter = info.split('^')
533
            print "deal filter ",toFilter
534
            if 'deals' in toFilter:
535
                dealFiltered = deals
536
                continue
537
            for filterVal in toFilter:
538
                if filterVal == 'dod':
539
                    for deal in deals:
540
                        if deal['dealType'] == 1:
541
                            dealFiltered.append(deal)
542
        elif filter == 'brandFilter':
543
            toFilter = info.split('^')
544
            print "brand filter ",toFilter
545
            if len(toFilter) == 0 or (len(toFilter)==1 and toFilter[0]==''):
546
                brandsFiltered = deals
547
            for deal in deals:
15151 kshitij.so 548
                if str(int(deal['brand_id'])) in toFilter:
14791 kshitij.so 549
                    brandsFiltered.append(deal)
15040 kshitij.so 550
    if len(dealFiltered) == 0:
551
        return brandsFiltered
14791 kshitij.so 552
    return [i for i in dealFiltered for j in brandsFiltered if i['_id']==j['_id']]
553
 
554
 
14037 kshitij.so 555
def getDeals(userId, category_id, offset, limit, sort, direction):
14761 kshitij.so 556
    if not bool(mc.get("category_cash_back")):
14037 kshitij.so 557
        populateCashBack()
558
    rank = 1
13771 kshitij.so 559
    deals = {}
13910 kshitij.so 560
    outer_query = []
561
    outer_query.append({"showDeal":1})
562
    query = {}
563
    query['$gt'] = 0
564
    outer_query.append({'totalPoints':query})
565
    if category_id in (3,5):
566
        outer_query.append({'category_id':category_id})
13803 kshitij.so 567
    if sort is None or direction is None:
568
        direct = -1
13910 kshitij.so 569
        print outer_query
570
        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 571
    else:
13910 kshitij.so 572
        print outer_query
13803 kshitij.so 573
        direct = direction
13910 kshitij.so 574
        if sort == "bestSellerPoints":
575
            print "yes,sorting by bestSellerPoints"
576
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([('bestSellerPoints',direct),('rank',direct),('nlcPoints',direct)]).skip(offset).limit(limit))
577
        else:
578
            data = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([(sort,direct)]).skip(offset).limit(limit))
13771 kshitij.so 579
    for d in data:
580
        item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
581
        if not deals.has_key(item[0]['identifier']):
13921 kshitij.so 582
            item[0]['dealRank'] = rank
583
            try:
14761 kshitij.so 584
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
13921 kshitij.so 585
                if not cashBack or cashBack.get('cash_back_status')!=1:
13928 kshitij.so 586
                    item[0]['cash_back_type'] = 0
587
                    item[0]['cash_back'] = 0
13921 kshitij.so 588
                else:
14766 kshitij.so 589
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
13928 kshitij.so 590
                    item[0]['cash_back'] = cashBack['cash_back']
13921 kshitij.so 591
            except:
592
                print "Error in adding cashback to deals"
13928 kshitij.so 593
                item[0]['cash_back_type'] = 0
594
                item[0]['cash_back'] = 0
13771 kshitij.so 595
            deals[item[0]['identifier']] = item[0]
13921 kshitij.so 596
 
13771 kshitij.so 597
            rank +=1
13785 kshitij.so 598
    return sorted(deals.values(), key=itemgetter('dealRank'))
599
 
16222 kshitij.so 600
def getItem(skuId,showDp=None):
16224 kshitij.so 601
    temp = []
14761 kshitij.so 602
    if not bool(mc.get("category_cash_back")):
14113 kshitij.so 603
        populateCashBack()
13795 kshitij.so 604
    try:
16222 kshitij.so 605
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'_id':int(skuId)})
606
        if skuData is None:
607
            raise
608
        try:
609
            cashBack = getCashBack(skuData['_id'], skuData['source_id'], skuData['category_id'])
610
            if not cashBack or cashBack.get('cash_back_status')!=1:
611
                skuData['cash_back_type'] = 0
612
                skuData['cash_back'] = 0
613
            else:
614
                skuData['cash_back_type'] = cashBack['cash_back_type']
615
                skuData['cash_back'] = cashBack['cash_back']
616
        except:
617
            print "Error in adding cashback to deals"
618
            skuData['cash_back_type'] = 0
619
            skuData['cash_back'] = 0
620
        skuData['in_stock'] = int(skuData['in_stock'])
621
        skuData['is_shortage'] = int(skuData['is_shortage'])
622
        skuData['category_id'] = int(skuData['category_id'])
623
        skuData['status'] = int(skuData['status'])
16483 kshitij.so 624
        try:
625
            skuData['thumbnail'] = skuData['thumbnail'].strip()
626
        except:
627
            pass 
16222 kshitij.so 628
        if showDp is not None:
629
            dealerPrice = get_mongo_connection().Catalog.SkuDealerPrices.find_one({'skuBundleId':skuData['skuBundleId']})
630
            skuData['dp'] = 0.0
631
            skuData['showDp'] = 0
632
            if dealerPrice is not None:
633
                skuData['dp'] = dealerPrice['dp']
634
                skuData['showDp'] = dealerPrice['showDp']
16224 kshitij.so 635
        temp.append(skuData)
636
        return temp
13795 kshitij.so 637
    except:
16224 kshitij.so 638
        return []
13836 kshitij.so 639
 
14761 kshitij.so 640
def getCashBack(skuId, source_id, category_id):
641
    if not bool(mc.get("category_cash_back")):
642
        populateCashBack()
643
    itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 644
    itemCashBack = itemCashBackMap.get(skuId)
645
    if itemCashBack is not None:
646
        return itemCashBack
14761 kshitij.so 647
    cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 648
    sourceCashBack = cashBackMap.get(source_id)
649
    if sourceCashBack is not None and len(sourceCashBack) > 0:
650
        for cashBack in sourceCashBack:
651
            if cashBack.get(category_id) is None:
652
                continue
653
            else:
654
                return cashBack.get(category_id)
655
    else:
656
        return {}
16560 amit.gupta 657
 
658
def getBundleBySourceSku(source_id, identifier):
17035 kshitij.so 659
    if source_id in (1,2,4,5,6,7):
16560 amit.gupta 660
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
661
    elif source_id == 3:
662
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
663
    else:
664
        return {}
665
 
666
    if not skuData:
667
        return {}
668
    else:
16564 amit.gupta 669
        bundleId = skuData[0]["skuBundleId"]
17035 kshitij.so 670
        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 671
                       {"source_id":1, "available_price":1, "marketPlaceUrl":1, "gross_price":1, "codAvailable":1, "source_product_name":1, "offer":1, "coupon":1}))
16579 amit.gupta 672
        return {'products':itemIds}
16560 amit.gupta 673
 
674
 
13921 kshitij.so 675
 
15129 kshitij.so 676
def getDealRank(identifier, source_id, userId):
17035 kshitij.so 677
    if source_id in (1,2,4,5,6,7):
15129 kshitij.so 678
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
679
    elif source_id == 3:
680
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
681
    else:
16282 amit.gupta 682
        return {'rank':0, 'description':'Source not valid','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15349 kshitij.so 683
    if len(skuData) == 0:
16282 amit.gupta 684
        return {'rank':0, 'description':'No matching product identifier found','maxNlc':None, 'minNlc':None,'status':None,'dp':None}
15129 kshitij.so 685
    user_specific_deals = mc.get(str(userId))
686
    if user_specific_deals is None:
687
        __populateCache(userId)
688
        user_specific_deals = mc.get(str(userId))
689
    else:
690
        print "Getting user deals from cache"
691
    category_id = skuData[0]['category_id']
692
    category_specific_deals = user_specific_deals.get(category_id)
16280 kshitij.so 693
 
694
    dealsData = get_mongo_connection().Catalog.Deals.find_one({'skuBundleId':skuData[0]['skuBundleId']})
695
    if dealsData is None:
696
        dealsData = {}
697
 
15129 kshitij.so 698
    if category_specific_deals is None or len(category_specific_deals) ==0:
16280 kshitij.so 699
        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 700
    sorted_deals = sorted(category_specific_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
16168 kshitij.so 701
    sortedMap = {}
702
    rankMap = {}
703
    rank = 0
15129 kshitij.so 704
    for sorted_deal in sorted_deals:
16168 kshitij.so 705
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
706
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
707
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
708
            rank = rank +1
709
        else:
710
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
711
                temp_list.append(sorted_deal)
712
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
713
 
16187 kshitij.so 714
    for dealRank ,dealList in rankMap.iteritems():
16168 kshitij.so 715
        for d in dealList:
16186 kshitij.so 716
            if d['skuBundleId'] == skuData[0]['skuBundleId']:
16280 kshitij.so 717
                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 718
 
16280 kshitij.so 719
    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 720
 
721
 
13836 kshitij.so 722
def getCashBackDetails(identifier, source_id):
14761 kshitij.so 723
    if not bool(mc.get("category_cash_back")):
13921 kshitij.so 724
        populateCashBack()
13771 kshitij.so 725
 
17035 kshitij.so 726
    if source_id in (1,2,4,5,6,7):
13839 kshitij.so 727
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'identifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 728
    elif source_id == 3:
13839 kshitij.so 729
        skuData = list(get_mongo_connection().Catalog.MasterData.find({'secondaryIdentifier':identifier.strip(), 'source_id':source_id}))
13840 kshitij.so 730
    else:
731
        return {}
13836 kshitij.so 732
    if len(skuData) > 0:
14761 kshitij.so 733
        itemCashBackMap = mc.get("item_cash_back")
13921 kshitij.so 734
        itemCashBack = itemCashBackMap.get(skuData[0]['_id'])
735
        if itemCashBack is not None:
736
            return itemCashBack
14761 kshitij.so 737
        cashBackMap = mc.get("category_cash_back")
13921 kshitij.so 738
        sourceCashBack = cashBackMap.get(source_id)
739
        if sourceCashBack is not None and len(sourceCashBack) > 0:
740
            for cashBack in sourceCashBack:
741
                if cashBack.get(skuData[0]['category_id']) is None:
742
                    continue
743
                else:
744
                    return cashBack.get(skuData[0]['category_id'])
13836 kshitij.so 745
        else:
746
            return {} 
747
    else:
748
        return {}
13986 amit.gupta 749
 
14398 amit.gupta 750
def getImgSrc(identifier, source_id):
751
    skuData = None
17035 kshitij.so 752
    if source_id in (1,2,4,5,6,7):
14414 amit.gupta 753
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 754
    elif source_id == 3:
14414 amit.gupta 755
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
14398 amit.gupta 756
    if skuData is None:
757
        return {}
758
    else:
16483 kshitij.so 759
        try:
760
            return {'thumbnail':skuData.get('thumbnail').strip()}
761
        except:
762
            return {'thumbnail':skuData.get('thumbnail')}
13986 amit.gupta 763
 
764
def next_weekday(d, weekday):
765
    days_ahead = weekday - d.weekday()
766
    if days_ahead <= 0: # Target day already happened this week
767
        days_ahead += 7
768
    return d + timedelta(days_ahead)
769
 
13771 kshitij.so 770
 
13970 kshitij.so 771
def getAllDealerPrices(offset, limit):
772
    data = []
773
    collection = get_mongo_connection().Catalog.SkuDealerPrices
774
    cursor = collection.find().skip(offset).limit(limit)
775
    for val in cursor:
15853 kshitij.so 776
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val['skuBundleId']})
777
        if master is not None:
778
            val['brand'] = master['brand']
779
            val['source_product_name'] = master['source_product_name']
13970 kshitij.so 780
        else:
781
            val['brand'] = ""
782
            val['source_product_name'] = ""
16231 kshitij.so 783
        val['showDp'] = int(val['showDp'])
13970 kshitij.so 784
        data.append(val)
785
    return data
786
 
15853 kshitij.so 787
def addSkuDealerPrice(data):
788
    collection = get_mongo_connection().Catalog.SkuDealerPrices
789
    cursor = collection.find_one({"skuBundleId":data['skuBundleId']})
790
    if cursor is not None:
791
        return {0:"BundleId information already present."}
13970 kshitij.so 792
    else:
15853 kshitij.so 793
        collection.insert(data)
794
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 795
        return {1:"Data added successfully"}
796
 
797
def updateSkuDealerPrice(data, _id):
798
    try:
799
        collection = get_mongo_connection().Catalog.SkuDealerPrices
800
        collection.update({'_id':ObjectId(_id)},{"$set":{'dp':data['dp']}},upsert=False, multi = False)
15853 kshitij.so 801
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 802
        return {1:"Data updated successfully"}
803
    except:
804
        return {0:"Data not updated."}
805
 
806
def updateExceptionalNlc(data, _id):
807
    try:
808
        collection = get_mongo_connection().Catalog.ExceptionalNlc
809
        collection.update({'_id':ObjectId(_id)},{"$set":{'maxNlc':data['maxNlc'], 'minNlc':data['minNlc'], 'overrideNlc':data['overrideNlc']}},upsert=False, multi = False)
15853 kshitij.so 810
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
13970 kshitij.so 811
        return {1:"Data updated successfully"}
812
    except:
813
        return {0:"Data not updated."}
814
 
14041 kshitij.so 815
def resetCache(userId):
14043 kshitij.so 816
    try:
817
        mc.delete(userId)
818
        return {1:'Cache cleared.'}
819
    except:
820
        return {0:'Unable to clear cache.'}
821
 
15853 kshitij.so 822
def updateCollection(data):
14083 kshitij.so 823
    print data
15853 kshitij.so 824
    try:
825
        collection = get_mongo_connection().Catalog[data['class']]
826
        class_name = data.pop('class')
827
        _id = data.pop('oid')
828
        result = collection.update({'_id':ObjectId(_id)},{"$set":data},upsert=False, multi = False)
829
        if class_name != "Notifications":
830
            record = list(collection.find({'_id':ObjectId(_id)}))
831
            if class_name !="CategoryDiscount":
832
                if record[0].has_key('sku'):
833
                    field = '_id'
834
                    val = record[0]['sku']
14852 kshitij.so 835
                else:
15853 kshitij.so 836
                    field = 'skuBundleId'
837
                    val = record[0]['skuBundleId']
838
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False, multi = True)
839
            else:
840
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
841
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
16233 kshitij.so 842
        if class_name =='SkuDealerPrices':
16237 kshitij.so 843
            get_mongo_connection().Catalog.Deals.update({'skuBundleId':val},{"$set":data},upsert=False, multi=True)
15853 kshitij.so 844
        return {1:"Data updated successfully"}
845
    except Exception as e:
846
        print e
847
        return {0:"Data not updated."}
14575 kshitij.so 848
 
14076 kshitij.so 849
 
14553 kshitij.so 850
def addNegativeDeals(data, multi):
851
    if multi !=1: 
852
        collection = get_mongo_connection().Catalog.NegativeDeals
853
        cursor = collection.find({"sku":data['sku']})
854
        if cursor.count() > 0:
855
            return {0:"Sku information already present."}
856
        else:
857
            collection.insert(data)
858
            return {1:"Data added successfully"}
14481 kshitij.so 859
    else:
14553 kshitij.so 860
        skuIds = __getBundledSkusfromSku(data['sku'])
861
        for sku in skuIds:
862
            data['sku'] = sku.get('_id')
863
            collection = get_mongo_connection().Catalog.NegativeDeals
864
            cursor = collection.find({"sku":data['sku']})
865
            if cursor.count() > 0:
866
                continue
867
            else:
14558 kshitij.so 868
                data.pop('_id',None)
14553 kshitij.so 869
                collection.insert(data)
14481 kshitij.so 870
        return {1:"Data added successfully"}
871
 
872
def getAllNegativeDeals(offset, limit):
873
    data = []
874
    collection = get_mongo_connection().Catalog.NegativeDeals
875
    cursor = collection.find().skip(offset).limit(limit)
876
    for val in cursor:
877
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
878
        if len(master) > 0:
879
            val['brand'] = master[0]['brand']
880
            val['source_product_name'] = master[0]['source_product_name']
881
            val['skuBundleId'] = master[0]['skuBundleId']
882
        else:
883
            val['brand'] = ""
884
            val['source_product_name'] = ""
885
            val['skuBundleId'] = ""
886
        data.append(val)
887
    return data
888
 
889
def getAllManualDeals(offset, limit):
890
    data = []
891
    collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 892
    cursor = collection.find().skip(offset).limit(limit)
14481 kshitij.so 893
    for val in cursor:
894
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
895
        if len(master) > 0:
896
            val['brand'] = master[0]['brand']
897
            val['source_product_name'] = master[0]['source_product_name']
898
            val['skuBundleId'] = master[0]['skuBundleId']
899
        else:
900
            val['brand'] = ""
901
            val['source_product_name'] = ""
902
            val['skuBundleId'] = ""
903
        data.append(val)
904
    return data
14076 kshitij.so 905
 
14553 kshitij.so 906
def addManualDeal(data, multi):
907
    if multi !=1:
908
        collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 909
        cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 910
        if cursor.count() > 0:
911
            return {0:"Sku information already present."}
912
        else:
913
            collection.insert(data)
914
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
915
            return {1:"Data added successfully"}
14481 kshitij.so 916
    else:
14553 kshitij.so 917
        skuIds = __getBundledSkusfromSku(data['sku'])
918
        for sku in skuIds:
919
            data['sku'] = sku.get('_id')
920
            collection = get_mongo_connection().Catalog.ManualDeals
15090 kshitij.so 921
            cursor = collection.find({'sku':data['sku']})
14553 kshitij.so 922
            if cursor.count() > 0:
923
                continue
924
            else:
14558 kshitij.so 925
                data.pop('_id',None)
14553 kshitij.so 926
                collection.insert(data)
927
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14481 kshitij.so 928
        return {1:"Data added successfully"}
14553 kshitij.so 929
 
14481 kshitij.so 930
def deleteDocument(data):
15853 kshitij.so 931
    print "inside detete document"
14481 kshitij.so 932
    print data
933
    try:
934
        collection = get_mongo_connection().Catalog[data['class']]
935
        class_name = data.pop('class')
936
        _id = data.pop('oid')
937
        record = list(collection.find({'_id':ObjectId(_id)}))
938
        collection.remove({'_id':ObjectId(_id)})
15075 kshitij.so 939
        if class_name != "Notifications":
940
            if class_name !="CategoryDiscount":
15853 kshitij.so 941
                print record[0]
942
                if record[0].has_key('sku'):
943
                    field = '_id'
944
                    val = record[0]['sku']
945
                else:
946
                    field = 'skuBundleId'
947
                    val = record[0]['skuBundleId']
948
                print "Updating master"
949
                print field
950
                print val
951
                get_mongo_connection().Catalog.MasterData.update({field:val},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
15075 kshitij.so 952
            else:
953
                get_mongo_connection().Catalog.MasterData.update({'brand':re.compile(record[0]['brand'], re.IGNORECASE),'category_id':record[0]['category_id']}, \
954
                                                                 {"$set":{'updatedOn':to_java_date(datetime.now())}},upsert=False,multi=True)
14481 kshitij.so 955
        return {1:"Document deleted successfully"}
956
    except Exception as e:
957
        print e
958
        return {0:"Document not deleted."}
13970 kshitij.so 959
 
14482 kshitij.so 960
def searchMaster(offset, limit, search_term):
961
    data = []
14531 kshitij.so 962
    if search_term is not None:
14551 kshitij.so 963
        terms = search_term.split(' ')
964
        outer_query = []
965
        for term in terms:
966
            outer_query.append({"source_product_name":re.compile(term, re.IGNORECASE)})
14531 kshitij.so 967
        try:
14551 kshitij.so 968
            collection = get_mongo_connection().Catalog.MasterData.find({"$and":outer_query,'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14531 kshitij.so 969
            for record in collection:
970
                data.append(record)
971
        except:
972
            pass
973
    else:
974
        collection = get_mongo_connection().Catalog.MasterData.find({'source_id':{'$in':SOURCE_MAP.keys()}}).skip(offset).limit(limit)
14482 kshitij.so 975
        for record in collection:
976
            data.append(record)
977
    return data
14481 kshitij.so 978
 
14495 kshitij.so 979
def getAllFeaturedDeals(offset, limit):
980
    data = []
981
    collection = get_mongo_connection().Catalog.FeaturedDeals
982
    cursor = collection.find({'endDate':{'$gte':to_java_date(datetime.now())}}).skip(offset).limit(limit)
983
    for val in cursor:
984
        master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
985
        if len(master) > 0:
986
            val['brand'] = master[0]['brand']
987
            val['source_product_name'] = master[0]['source_product_name']
988
            val['skuBundleId'] = master[0]['skuBundleId']
989
        else:
990
            val['brand'] = ""
991
            val['source_product_name'] = ""
992
            val['skuBundleId'] = ""
993
        data.append(val)
994
    return data
995
 
14553 kshitij.so 996
def addFeaturedDeal(data, multi):
997
    if multi !=1:
998
        collection = get_mongo_connection().Catalog.FeaturedDeals
999
        cursor = collection.find({'sku':data['sku'],'startDate':{'$lte':data['startDate']},'endDate':{'$gte':data['endDate']}})
1000
        if cursor.count() > 0:
1001
            return {0:"Sku information already present."}
1002
        else:
1003
            collection.insert(data)
1004
            get_mongo_connection().Catalog.MasterData.update({'_id':data['sku']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=False)
1005
            return {1:"Data added successfully"}
14495 kshitij.so 1006
    else:
14553 kshitij.so 1007
        skuIds = __getBundledSkusfromSku(data['sku'])
1008
        for sku in skuIds:
1009
            data['sku'] = sku.get('_id')
1010
            collection = get_mongo_connection().Catalog.FeaturedDeals
1011
            cursor = collection.find({'sku':data['sku'],'startDate':{'$lte':data['startDate']},'endDate':{'$gte':data['endDate']}})
1012
            if cursor.count() > 0:
1013
                continue
1014
            else:
14558 kshitij.so 1015
                data.pop('_id',None)
14553 kshitij.so 1016
                collection.insert(data)
1017
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':sku.get('skuBundleId')},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
14495 kshitij.so 1018
        return {1:"Data added successfully"}
1019
 
14499 kshitij.so 1020
def searchCollection(class_name, sku, skuBundleId):
14497 kshitij.so 1021
    data = []
1022
    collection = get_mongo_connection().Catalog[class_name]
15076 kshitij.so 1023
    if class_name == "Notifications":
1024
        cursor = collection.find({'skuBundleId':skuBundleId})
1025
        for val in cursor:
1026
            master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
1027
            if len(master) > 0:
1028
                val['brand'] = master[0]['brand']
1029
                val['model_name'] = master[0]['model_name']
1030
                val['skuBundleId'] = master[0]['skuBundleId']
1031
            else:
1032
                val['brand'] = ""
1033
                val['model_name'] = ""
1034
                val['skuBundleId'] = val['skuBundleId']
1035
            data.append(val)
15095 kshitij.so 1036
        return data
15853 kshitij.so 1037
    master = None
14499 kshitij.so 1038
    if sku is not None:
15853 kshitij.so 1039
        if COLLECTION_MAP.has_key(class_name):
1040
            master = get_mongo_connection().Catalog.MasterData.find_one({'_id':sku})
1041
            cursor = collection.find({'skuBundleId':master['skuBundleId']})
1042
        else:
1043
            cursor = collection.find({'sku':sku})
14499 kshitij.so 1044
        for val in cursor:
15853 kshitij.so 1045
            if master is None:
1046
                master = get_mongo_connection().Catalog.MasterData.find_one({'_id':val['sku']})
1047
            if master is not None:
1048
                val['brand'] = master['brand']
1049
                val['source_product_name'] = master['source_product_name']
1050
                val['skuBundleId'] = master['skuBundleId']
14499 kshitij.so 1051
            else:
1052
                val['brand'] = ""
1053
                val['source_product_name'] = ""
1054
                val['skuBundleId'] = ""
1055
            data.append(val)
1056
        return data
1057
    else:
15853 kshitij.so 1058
        if not COLLECTION_MAP.has_key(class_name):
1059
            skuIds = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId}).distinct('_id')
1060
            for sku in skuIds:
1061
                cursor = collection.find({'sku':sku})
1062
                for val in cursor:
1063
                    master = list(get_mongo_connection().Catalog.MasterData.find({'_id':val['sku']}))
1064
                    if len(master) > 0:
1065
                        val['brand'] = master[0]['brand']
1066
                        val['source_product_name'] = master[0]['source_product_name']
1067
                        val['skuBundleId'] = master[0]['skuBundleId']
1068
                    else:
1069
                        val['brand'] = ""
1070
                        val['source_product_name'] = ""
1071
                        val['skuBundleId'] = ""
1072
                    data.append(val)
1073
            return data
1074
        else:
1075
            cursor = collection.find({'skuBundleId':skuBundleId})
14499 kshitij.so 1076
            for val in cursor:
15853 kshitij.so 1077
                master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14499 kshitij.so 1078
                if len(master) > 0:
1079
                    val['brand'] = master[0]['brand']
1080
                    val['source_product_name'] = master[0]['source_product_name']
1081
                else:
1082
                    val['brand'] = ""
1083
                    val['source_product_name'] = ""
1084
                data.append(val)
15853 kshitij.so 1085
            return data
14495 kshitij.so 1086
 
15074 kshitij.so 1087
def __getBrandIdForBrand(brandName, category_id):
1088
    brandInfo = Brands.query.filter(Brands.category_id==category_id).filter(Brands.name == brandName).all()
1089
    if brandInfo is None or len(brandInfo)!=1:
1090
        raise
1091
    else:
1092
        return brandInfo[0].id
1093
 
14588 kshitij.so 1094
def addNewItem(data):
14594 kshitij.so 1095
    try:
1096
        data['updatedOn'] = to_java_date(datetime.now())
1097
        data['addedOn'] = to_java_date(datetime.now())
1098
        data['priceUpdatedOn'] = to_java_date(datetime.now())
1099
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
1100
        max_bundle = list(get_mongo_connection().Catalog.MasterData.find().sort([('skuBundleId',pymongo.DESCENDING)]).limit(1))
1101
        data['_id'] = max_id[0]['_id'] + 1
1102
        data['skuBundleId'] = max_bundle[0]['skuBundleId'] + 1
1103
        data['identifier'] = str(data['identifier'])
1104
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1105
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1106
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
14594 kshitij.so 1107
        get_mongo_connection().Catalog.MasterData.insert(data)
1108
        return {1:'Data added successfully'}
1109
    except Exception as e:
1110
        print e
1111
        return {0:'Unable to add data.'}
15130 kshitij.so 1112
    finally:
1113
        session.close()
14588 kshitij.so 1114
 
1115
def addItemToExistingBundle(data):
1116
    try:
1117
        data['updatedOn'] = to_java_date(datetime.now())
1118
        data['addedOn'] = to_java_date(datetime.now())
1119
        data['priceUpdatedOn'] = to_java_date(datetime.now())
14593 kshitij.so 1120
        max_id = list(get_mongo_connection().Catalog.MasterData.find().sort([('_id',pymongo.DESCENDING)]).limit(1))
14590 kshitij.so 1121
        data['_id'] = max_id[0]['_id'] + 1
14594 kshitij.so 1122
        data['identifier'] = str(data['identifier'])
1123
        data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1124
        data['model_name'] = str(data['model_name'])
15074 kshitij.so 1125
        data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
14588 kshitij.so 1126
        get_mongo_connection().Catalog.MasterData.insert(data)
1127
        return {1:'Data added successfully.'}
14594 kshitij.so 1128
    except Exception as e:
1129
        print e
14588 kshitij.so 1130
        return {0:'Unable to add data.'}
15130 kshitij.so 1131
    finally:
1132
        session.close()
14588 kshitij.so 1133
 
1134
def updateMaster(data, multi):
15130 kshitij.so 1135
    try:
1136
        print data
1137
        if multi != 1:
1138
            _id = data.pop('_id')
1139
            skuBundleId = data.pop('skuBundleId')
1140
            data['updatedOn'] = to_java_date(datetime.now())
1141
            data['identifier'] = str(data['identifier'])
1142
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
17115 manish.sha 1143
            data['model_name'] = str(data['model_name'])
15130 kshitij.so 1144
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
1145
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1146
            return {1:'Data updated successfully.'}
1147
        else:
1148
            _id = data.pop('_id')
1149
            skuBundleId = data.pop('skuBundleId')
1150
            data['updatedOn'] = to_java_date(datetime.now())
1151
            data['identifier'] = str(data['identifier'])
1152
            data['secondaryIdentifier'] = str(data['secondaryIdentifier'])
1153
            data['brand_id'] = __getBrandIdForBrand(data['brand'], data['category_id'])
17115 manish.sha 1154
            data['model_name'] = str(data['model_name'])
15130 kshitij.so 1155
            get_mongo_connection().Catalog.MasterData.update({'_id':_id},{"$set":data},upsert=False)
1156
            similarItems = get_mongo_connection().Catalog.MasterData.find({'skuBundleId':skuBundleId})
1157
            for item in similarItems:
1158
                if item['_id'] == _id:
1159
                    continue
1160
                item['updatedOn'] = to_java_date(datetime.now())
1161
                item['thumbnail'] = data['thumbnail']
1162
                item['category'] = data['category']
1163
                item['category_id'] = data['category_id']
1164
                item['tagline'] = data['tagline']
1165
                item['is_shortage'] = data['is_shortage']
1166
                item['mrp'] = data['mrp']
1167
                item['status'] = data['status']
1168
                item['maxPrice'] = data['maxPrice']
1169
                item['brand_id'] = data['brand_id']
1170
                similar_item_id = item.pop('_id')
1171
                get_mongo_connection().Catalog.MasterData.update({'_id':similar_item_id},{"$set":item},upsert=False)
1172
            return {1:'Data updated successfully.'}
1173
    finally:
1174
        session.close()
14619 kshitij.so 1175
 
1176
def getLiveCricScore():
1177
    return mc.get('liveScore')
14852 kshitij.so 1178
 
1179
def addBundleToNotification(data):
1180
    try:
15069 kshitij.so 1181
        collection = get_mongo_connection().Catalog.Notifications
14852 kshitij.so 1182
        cursor = collection.find({'skuBundleId':data['skuBundleId']})
1183
        if cursor.count() > 0:
1184
            return {0:"SkuBundleId information already present."}
1185
        else:
1186
            collection.insert(data)
1187
            return {1:'Data updated successfully.'}
1188
    except:
1189
        return {0:'Unable to add data.'}
1190
 
1191
def getAllNotifications(offset, limit):
1192
    data = []
15069 kshitij.so 1193
    collection = get_mongo_connection().Catalog.Notifications
16450 kshitij.so 1194
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
14852 kshitij.so 1195
    for val in cursor:
15072 kshitij.so 1196
        master = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':val['skuBundleId']}))
14852 kshitij.so 1197
        if len(master) > 0:
1198
            val['brand'] = master[0]['brand']
15071 kshitij.so 1199
            val['model_name'] = master[0]['model_name']
14852 kshitij.so 1200
            val['skuBundleId'] = master[0]['skuBundleId']
1201
        else:
1202
            val['brand'] = ""
15071 kshitij.so 1203
            val['model_name'] = ""
1204
            val['skuBundleId'] = val['skuBundleId']
14852 kshitij.so 1205
        data.append(val)
1206
    return data
14997 kshitij.so 1207
 
1208
def getBrandsForFilter(category_id):
1209
    if mc.get("brandFilter") is None:
15095 kshitij.so 1210
        print "Populating brand data for category_id %d" %(category_id)
14997 kshitij.so 1211
        tabData, mobData = [], []
1212
        mobileDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1213
                                                                      {"$match":{"category_id":3,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1214
                                                                    },
1215
                                                                 {"$group" : 
1216
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1217
                                                                  }
1218
                                                                ])
14588 kshitij.so 1219
 
14997 kshitij.so 1220
        tabletDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1221
                                                                      {"$match":{"category_id":5,"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1222
                                                                    },
1223
                                                                 {"$group" : 
1224
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1225
                                                                  }
1226
                                                                ])
1227
 
1228
        allDeals = get_mongo_connection().Catalog.Deals.aggregate([
16170 kshitij.so 1229
                                                                   {"$match":{"showDeal":1,"totalPoints":{"$gt":-100}}
14997 kshitij.so 1230
                                                                    },
1231
                                                                 {"$group" : 
1232
                                                                  {'_id':{'brand_id':'$brand_id','brand':'$brand'},'count':{'$sum':1}}
1233
                                                                  }
1234
                                                                ])
1235
        #print mobileDeals
1236
        #print "==========Mobile data ends=========="
1237
 
1238
        #print tabletDeals
1239
        #print "==========Tablet data ends=========="
1240
 
1241
        #print allDeals
1242
        #print "==========All deal data ends========="
1243
 
1244
        for mobileDeal in mobileDeals['result']:
1245
            if mobileDeal.get('_id').get('brand_id') != 0:
1246
                tempMap = {}
1247
                tempMap['brand'] = mobileDeal.get('_id').get('brand')
1248
                tempMap['brand_id'] = mobileDeal.get('_id').get('brand_id')
1249
                tempMap['count'] = mobileDeal.get('count')
1250
                mobData.append(tempMap)
1251
 
1252
        for tabletDeal in tabletDeals['result']:
1253
            if tabletDeal.get('_id').get('brand_id') != 0:
1254
                tempMap = {}
1255
                tempMap['brand'] = tabletDeal.get('_id').get('brand')
1256
                tempMap['brand_id'] = tabletDeal.get('_id').get('brand_id')
1257
                tempMap['count'] = tabletDeal.get('count')
1258
                tabData.append(tempMap)
1259
 
1260
 
1261
        brandMap = {}
1262
        for allDeal in allDeals['result']:
1263
            if allDeal.get('_id').get('brand_id') != 0:
1264
                if brandMap.has_key(allDeal.get('_id').get('brand')):
15002 kshitij.so 1265
                    brand_ids = brandMap.get(allDeal.get('_id').get('brand')).get('brand_ids')
14997 kshitij.so 1266
                    brand_ids.append(allDeal.get('_id').get('brand_id'))
15003 kshitij.so 1267
                    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 1268
                else:
1269
                    temp = []
1270
                    temp.append(allDeal.get('_id').get('brand_id'))
15002 kshitij.so 1271
                    brandMap[allDeal.get('_id').get('brand')] = {'brand_ids':temp,'count':allDeal.get('count')}
14997 kshitij.so 1272
 
1273
        mc.set("brandFilter",{0:brandMap, 3:mobData, 5:tabData}, 600)  
1274
 
15062 kshitij.so 1275
    return sorted(mc.get("brandFilter").get(category_id), key = lambda x: (-x['count'], x['brand']))
15375 kshitij.so 1276
 
15459 kshitij.so 1277
def getStaticDeals(offset, limit, category_id, direction):
15375 kshitij.so 1278
    user_specific_deals = mc.get("staticDeals")
1279
    if user_specific_deals is None:
1280
        __populateStaticDeals()
1281
        user_specific_deals = mc.get("staticDeals")
15459 kshitij.so 1282
    rev = False
1283
    if direction is None or direction == -1:
1284
        rev=True
1285
    return sorted((user_specific_deals.get(category_id))[offset:offset+limit],reverse=rev)
15375 kshitij.so 1286
 
1287
def __populateStaticDeals():
1288
    print "Populating memcache for static deals"
1289
    outer_query = []
1290
    outer_query.append({"showDeal":1})
1291
    query = {}
16170 kshitij.so 1292
    query['$gt'] = -100
15375 kshitij.so 1293
    outer_query.append({'totalPoints':query})
1294
    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)]))
1295
    mobile_deals = []
1296
    tablet_deals = []
1297
    for deal in all_deals:
1298
        item = get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']})
1299
        if deal['category_id'] ==3:
1300
            mobile_deals.append(getItemObjForStaticDeals(item[0]))
1301
        elif deal['category_id'] ==5:
1302
            tablet_deals.append(getItemObjForStaticDeals(item[0]))
1303
        else:
1304
            continue
1305
 
1306
    random.shuffle(mobile_deals,random.random)
1307
    random.shuffle(tablet_deals,random.random)
1308
 
1309
    mem_cache_val = {3:mobile_deals, 5:tablet_deals}
1310
    mc.set("staticDeals", mem_cache_val, 3600)
1311
 
1312
def getItemObjForStaticDeals(item):
15379 kshitij.so 1313
    return {'marketPlaceUrl':item.get('marketPlaceUrl'),'available_price':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 1314
 
1315
def getItemByMerchantIdentifier(identifier, source_id):
1316
    skuData = None
17035 kshitij.so 1317
    if source_id in (1,2,4,5,6,7):
16300 manas 1318
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier.strip(), 'source_id':source_id})
1319
    elif source_id == 3:
1320
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier.strip(), 'source_id':source_id})
1321
    if skuData is None:
1322
        return {}
1323
    else:
1324
        return skuData
15375 kshitij.so 1325
 
16364 kshitij.so 1326
def getDealsForNotification(skuBundleIds):
1327
    bundles= [int(skuBundleId) for skuBundleId in skuBundleIds.split(',')]
1328
    print bundles
16406 kshitij.so 1329
    dealsList = []
16364 kshitij.so 1330
    dealsListMap = []
16406 kshitij.so 1331
    for bundleId in bundles:
1332
        outer_query = []
1333
        outer_query.append({ "$or": [ { "showDeal": 1} , { "prepaidDeal": 1 } ] })
1334
        outer_query.append({'skuBundleId':bundleId})
1335
        deals = get_mongo_connection().Catalog.Deals.find({"$and":outer_query})
1336
        for deal in deals:
1337
            dealsList.append(deal)
16364 kshitij.so 1338
    sortedMap = {}
1339
    rankMap = {}
1340
    rank = 0
16406 kshitij.so 1341
    for sorted_deal in dealsList:
16364 kshitij.so 1342
        if sortedMap.get(sorted_deal['skuBundleId']) is None:
1343
            sortedMap[sorted_deal['skuBundleId']] = {rank:[sorted_deal]}
1344
            rankMap[rank] = (sortedMap[sorted_deal['skuBundleId']].values())[0]
1345
            rank = rank +1
1346
        else:
1347
            for temp_list in sortedMap.get(sorted_deal['skuBundleId']).itervalues():
1348
                temp_list.append(sorted_deal)
1349
            rankMap[(sortedMap.get(sorted_deal['skuBundleId']).keys())[0]] = temp_list
1350
 
16367 kshitij.so 1351
    for dealList in [rankMap.get(k, []) for k in range(0, len(bundles))]:
16364 kshitij.so 1352
        temp = []
1353
        for d in dealList:
1354
            item = list(get_mongo_connection().Catalog.MasterData.find({'_id':d['_id']}))
1355
            if len(item) ==0:
1356
                continue
1357
            if d['dealType'] == 1 and d['source_id'] ==1:
1358
                item[0]['marketPlaceUrl'] = "http://www.amazon.in/dp/%s"%(item[0]['identifier'].strip())
1359
            elif d['source_id'] ==3:
1360
                item[0]['marketPlaceUrl'] = item[0]['marketPlaceUrl']+'?supc='+item[0].get('identifier')
1361
            else:
1362
                pass 
1363
            try:
1364
                cashBack = getCashBack(item[0]['_id'], item[0]['source_id'], item[0]['category_id'])
1365
                if not cashBack or cashBack.get('cash_back_status')!=1:
1366
                    item[0]['cash_back_type'] = 0
1367
                    item[0]['cash_back'] = 0
1368
                else:
1369
                    item[0]['cash_back_type'] = int(cashBack['cash_back_type'])
1370
                    item[0]['cash_back'] = cashBack['cash_back']
1371
            except:
1372
                print "Error in adding cashback to deals"
1373
                item[0]['cash_back_type'] = 0
1374
                item[0]['cash_back'] = 0
1375
            try:
1376
                item[0]['dp'] = d['dp']
1377
                item[0]['showDp'] = d['showDp']
1378
            except:
1379
                item[0]['dp'] = 0.0
1380
                item[0]['showDp'] = 0
1381
            temp.append(item[0])
1382
        if len(temp) > 1:
1383
            temp = sorted(temp, key = lambda x: (x['available_price']),reverse=False)
1384
        dealsListMap.append(temp)
1385
    return dealsListMap
1386
 
16373 manas 1387
def getSkuBrandData(sku):
1388
    if sku is None:
1389
        return {}
1390
    else:
1391
        orders = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':sku})
1392
        if orders is None:
1393
            return {}
1394
        return orders
16488 kshitij.so 1395
 
1396
def addDealPoints(data):
1397
    collection = get_mongo_connection().Catalog.DealPoints
1398
    cursor = collection.find({'skuBundleId':data['skuBundleId']})
1399
    if cursor.count() > 0:
1400
        return {0:"Sku information already present."}
1401
    else:
1402
        collection.insert(data)
1403
        get_mongo_connection().Catalog.MasterData.update({'skuBundleId':data['skuBundleId']},{"$set":{'updatedOn':to_java_date(datetime.now())}},multi=True)
1404
        return {1:"Data added successfully"}
1405
 
1406
def getAllBundlesWithDealPoints(offset, limit):
1407
    data = []
1408
    collection = get_mongo_connection().Catalog.DealPoints
1409
    cursor = collection.find().sort([('endDate',pymongo.DESCENDING)]).skip(offset).limit(limit)
1410
    for val in cursor:
1411
        master = get_mongo_connection().Catalog.MasterData.find_one({'skuBundleId':val.get('skuBundleId')})
1412
        if master is not None:
1413
            val['brand'] = master['brand']
1414
            val['source_product_name'] = master['product_name']
1415
        else:
1416
            val['brand'] = ""
1417
            val['source_product_name'] = ""
1418
        data.append(val)
1419
    return data
16546 kshitij.so 1420
 
1421
def generateRedirectUrl(retailer_id, app_id):
1422
    try:
16663 manish.sha 1423
        if retailer_id <= 0:
1424
            return {'url':"","message":"Retailer Id not valid"}
16546 kshitij.so 1425
        d_app_offer = app_offers.get_by(id=app_id)
16605 manish.sha 1426
    except:
1427
        traceback.print_exc()
16546 kshitij.so 1428
    finally:
1429
        session.close()
1430
    if d_app_offer is None:
1431
        return {'url':"","message":"App id doesn't exist"}
16364 kshitij.so 1432
 
16915 manish.sha 1433
    final_user_payout = 0
1434
    if d_app_offer.override_payout:
1435
        final_user_payout = d_app_offer.overriden_payout
1436
    else:
1437
        final_user_payout = d_app_offer.user_payout
16546 kshitij.so 1438
 
16915 manish.sha 1439
    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)
1440
 
16546 kshitij.so 1441
    get_mongo_connection().AppOrder.AppTransaction.insert(appTransactions.__dict__)
1442
    embedd = str((appTransactions.__dict__).get('_id'))
16548 kshitij.so 1443
    try:
1444
        index = d_app_offer.link.index(".freeb.co.in")
1445
    except:
16605 manish.sha 1446
        traceback.print_exc()
16548 kshitij.so 1447
        return {'url':"","message":"Substring not found"}
1448
    redirect_url = d_app_offer.link[0:index]+"."+embedd+d_app_offer.link[index:]
16546 kshitij.so 1449
    get_mongo_connection().AppOrder.AppTransaction.update({'_id':ObjectId(embedd)},{"$set":{'redirect_url':redirect_url}})
16548 kshitij.so 1450
    return {'url':redirect_url,"message":"Success"}
16556 kshitij.so 1451
 
1452
def addPayout(payout, transaction_id):
1453
    try:
16764 manish.sha 1454
        print 'Got Response for Transaction Id:- '+ str(transaction_id)+ ' and Actual Payout:- '+str(payout)
16556 kshitij.so 1455
        transaction = list(get_mongo_connection().AppOrder.AppTransaction.find({'_id':ObjectId(transaction_id)}))
1456
        if len(transaction) > 0:
1457
            if (transaction[0])['payout_status'] ==1:
16753 manish.sha 1458
                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 1459
 
1460
                approvedAppTransaction = approved_app_transactions.get_by(transaction_id=transaction_id)
1461
                if approvedAppTransaction is None:
1462
                    approvedAppTransaction = approved_app_transactions()
16919 manish.sha 1463
                    approvedAppTransaction.app_id = transaction[0].get('app_id')
16782 manish.sha 1464
                    approvedAppTransaction.cash_back_description = CB_APPROVED
16919 manish.sha 1465
                    approvedAppTransaction.retailer_id = transaction[0].get('retailer_id')
16782 manish.sha 1466
                    approvedAppTransaction.transaction_id = transaction_id
16919 manish.sha 1467
                    approvedAppTransaction.transaction_time = to_py_date(long(transaction[0].get('transaction_time')))
1468
                    approvedAppTransaction.redirect_url = transaction[0].get('redirect_url')
16782 manish.sha 1469
                    approvedAppTransaction.payout_status = 2
1470
                    approvedAppTransaction.payout_description = CB_APPROVED
1471
                    approvedAppTransaction.cashback_status = 2 
1472
                    approvedAppTransaction.payout_amount = long(payout)
1473
                    approvedAppTransaction.payout_time = datetime.now()
16919 manish.sha 1474
                    approvedAppTransaction.offer_price = long(transaction[0].get('offer_price')) 
1475
                    approvedAppTransaction.overridenCashBack = transaction[0].get('overridenCashBack')
1476
                    approvedAppTransaction.isCashBackOverriden = transaction[0].get('isCashBackOverriden')
1477
                    approvedAppTransaction.user_payout = transaction[0].get('user_payout')
16782 manish.sha 1478
                    approvedAppTransaction.cashBackConsidered = False
16915 manish.sha 1479
                    if transaction[0].get('final_user_payout') is not None:
1480
                        approvedAppTransaction.final_user_payout = transaction[0].get('final_user_payout')
1481
                    else:
16919 manish.sha 1482
                        if transaction[0].get('isCashBackOverriden'):
1483
                            approvedAppTransaction.final_user_payout = transaction[0].get('overridenCashBack')
16915 manish.sha 1484
                        else:
16919 manish.sha 1485
                            approvedAppTransaction.final_user_payout = transaction[0].get('user_payout')
16782 manish.sha 1486
                    session.commit()
1487
 
1488
                    updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
16631 manish.sha 1489
                else:
16783 manish.sha 1490
                    approvedAppTransaction.payout_amount = long(payout)
1491
                    approvedAppTransaction.payout_time = datetime.now()
1492
                    if approvedAppTransaction.cashBackConsidered == False:
1493
                        updateResult = _updateApprovedCashbackToUser(approvedAppTransaction.id)
1494
                    session.commit()
16782 manish.sha 1495
 
1496
                    '''
1497
                    try:
1498
                        if int(transaction[0]['offer_price']) != payout or int(transaction[0]['user_payout']) < payout:
1499
                            _sendAlertForAppPayouts(int(transaction[0]['app_id']), int(transaction[0]['offer_price']), int(transaction[0]['user_payout']), payout)
1500
                    except:
1501
                        print traceback.print_exc()
1502
                    '''
16556 kshitij.so 1503
                return {'status':'ok','message':'Payout updated'}
1504
            elif (transaction[0])['payout_status'] ==2:
1505
                return {'status':'ok','message':'Payout already processed'}
1506
            else:
1507
                return {'status':'fail','message':'Something is wrong'}
1508
        else:
1509
            return {'status':'fail','message':'transaction_id not found'}
1510
    except:
16657 manish.sha 1511
        print traceback.print_exc()
16631 manish.sha 1512
        try:
16753 manish.sha 1513
            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 1514
        except:
1515
            print 'Data Inconsistency in Cashback Process'
16636 manish.sha 1516
            print traceback.print_exc()
16559 kshitij.so 1517
        return  {'status':'fail','message':'Something is wrong'}
16885 kshitij.so 1518
    finally:
1519
        session.close()
16556 kshitij.so 1520
 
16631 manish.sha 1521
def _updateApprovedCashbackToUser(approvedAppTransactionId):
1522
    approvedAppTransaction = approved_app_transactions.get_by(id=approvedAppTransactionId)
16915 manish.sha 1523
    if approvedAppTransaction.retailer_id < 0:
1524
        return False
1525
 
16631 manish.sha 1526
    currentMonth = datetime.today().month
1527
    currentDay = datetime.today().day
1528
    currentYear = datetime.today().year
1529
    fortNight = (currentMonth - 1)*2 + (currentDay/15)
1530
    if currentDay == 30 or currentDay ==31:
1531
        fortNight = fortNight-1
1532
    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()
1533
    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()
1534
    try:
1535
        if userAppCashbackObj is None:
1536
            userAppCashbackObj = user_app_cashbacks()
1537
            userAppCashbackObj.user_id = approvedAppTransaction.retailer_id
1538
            userAppCashbackObj.status = 'Approved'
16915 manish.sha 1539
            userAppCashbackObj.amount = approvedAppTransaction.final_user_payout
16631 manish.sha 1540
            userAppCashbackObj.fortnightOfYear = fortNight
1541
            userAppCashbackObj.yearVal = currentYear
1542
        else:
16915 manish.sha 1543
            userAppCashbackObj.amount = userAppCashbackObj.amount + approvedAppTransaction.final_user_payout
16631 manish.sha 1544
 
1545
        if userAppInstallObj is None:
1546
            app_offer = app_offers.get_by(id=approvedAppTransaction.app_id)
1547
            userAppInstallObj = user_app_installs()
1548
            userAppInstallObj.user_id = approvedAppTransaction.retailer_id
1549
            userAppInstallObj.fortnightOfYear = fortNight
1550
            userAppInstallObj.transaction_date = datetime(currentYear, currentMonth, currentDay, 0, 0, 0, 0).date()
1551
            userAppInstallObj.app_id = approvedAppTransaction.app_id
1552
            userAppInstallObj.app_name = app_offer.app_name
1553
            userAppInstallObj.installCount = 1
16915 manish.sha 1554
            userAppInstallObj.payoutAmount = approvedAppTransaction.final_user_payout
16631 manish.sha 1555
        else:
1556
            userAppInstallObj.installCount = userAppInstallObj.installCount + 1
16915 manish.sha 1557
            userAppInstallObj.payoutAmount = userAppInstallObj.payoutAmount +approvedAppTransaction.final_user_payout
16631 manish.sha 1558
 
1559
        approvedAppTransaction.cashBackConsidered = True
1560
        session.commit()
1561
        return True
1562
    except:
1563
        session.rollback()
16636 manish.sha 1564
        print traceback.print_exc()
16631 manish.sha 1565
        return False
16693 manish.sha 1566
 
1567
def _sendAlertForAppPayouts(app_id, offerPrice, userPayout, payout):
1568
    m = Email('localhost')
1569
    mFrom = "dtr@shop2020.in"
1570
    m.setFrom(mFrom)
1571
    mTo = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com','chaitnaya.vats@saholic.com','manoj.kumar@saholic.com','manish.sharma@shop2020.in']
1572
    for receipient in mTo:
1573
        m.addRecipient(receipient)
1574
    appOffer = app_offers.get_by(id=app_id)
1575
    if offerPrice != payout:
1576
        m.setSubject("Mismatch in Offer Price and Actual Pay Out for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1577
        message1 = "Offer Price:- "+ str(appOffer.offer_price) + "\n" + "Actual Pay Out:- "+ str(payout)
1578
        m.setTextBody(message1)
1579
    if userPayout > payout:
1580
        m.setSubject("User Pay Out greater than actual PayOut for App Id:- "+str(appOffer.id)+" App Name:- "+str(appOffer.app_name))
1581
        message2 = "User Pay Out Price:- "+ str(appOffer.user_payout) + "\n" + "Actual Pay Out:- "+ str(payout)
1582
        m.setTextBody(message2)
1583
    m.send()
16631 manish.sha 1584
 
16789 amit.gupta 1585
def rejectCashback(orderId, subOrderId):
16833 amit.gupta 1586
    cashBack = get_mongo_connection().Dtr.merchantOrder.update({"orderId":orderId, "subOrders.merchantSubOrderId":subOrderId}, 
16789 amit.gupta 1587
                                                               {"$set":{"subOrders.$.cashBackStatus":CB_REJECTED}})
16837 amit.gupta 1588
    print cashBack
16836 amit.gupta 1589
    return cashBack.get("nModified")
16894 manish.sha 1590
 
1591
def getAppOffers(retailer_id):
1592
    if not bool(mc.get("cached_app_offers_"+str(retailer_id))):
1593
        populateAppOffers(retailer_id)
1594
    return mc.get("cached_app_offers_"+str(retailer_id)) 
1595
 
1596
def populateAppOffers(retailerId):
1597
    retailerId = int(retailerId)
1598
    #offset = req.get_param_as_int("offset")
1599
    #limit = req.get_param_as_int("limit")
16941 manish.sha 1600
    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()
1601
    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 1602
    #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()
1603
 
1604
    appOffersMap = {}
1605
    priorityList = []
1606
    priorityMap = {}
1607
    for offer in priortizeders:
16941 manish.sha 1608
        if priorityMap.has_key(long(offer[1])):
1609
            offersVal = priorityMap.get(long(offer[1]))
1610
            offersVal.append(offer)
1611
            priorityMap[long(offer[1])]=offersVal
1612
        else:
1613
            offersVal = []
1614
            offersVal.append(offer)
1615
            priorityMap[long(offer[1])]=offersVal
1616
 
16894 manish.sha 1617
    priorityList = sorted(priorityMap)
1618
 
1619
    maxCount = len(nonPriortizedOffers) + len(priortizeders)
1620
 
16909 manish.sha 1621
    if priorityList is not None and len(priorityList)>0:
1622
        if maxCount < max(priorityList):
1623
            maxCount = max(priorityList)
16894 manish.sha 1624
 
1625
    count = 1
1626
    blockedPlaces = []
1627
    availablePlaces = []
1628
    while count <= maxCount:
1629
        if count in priorityList:
1630
            blockedPlaces.append(count)
1631
        else:
1632
            availablePlaces.append(count)
1633
        count = count +1
16941 manish.sha 1634
    print 'Blocked Places', blockedPlaces
16894 manish.sha 1635
    for val in blockedPlaces:
16941 manish.sha 1636
        key = val
1637
        for offerObj in priorityMap.get(val):
1638
            while appOffersMap.has_key(key):
1639
                key = key+1
1640
            appOffersMap[key] = long(offerObj[0])
1641
            if key in availablePlaces:
1642
                availablePlaces.remove(key)
1643
 
1644
    print 'Available Places', availablePlaces
1645
 
16894 manish.sha 1646
    i=0
1647
    for val in availablePlaces:
16899 manish.sha 1648
        if i<len(nonPriortizedOffers):
16902 manish.sha 1649
            appOffersMap[val]= long(nonPriortizedOffers[i][0])
16899 manish.sha 1650
        else:
1651
            break
1652
        i=i+1
16901 manish.sha 1653
    print 'AppOffersMap', appOffersMap
16894 manish.sha 1654
 
1655
    finalAppOffersMap = {}
1656
    if len(appOffersMap) > 0:
1657
        for key in sorted(appOffersMap):               
1658
            finalAppOffersMap[key] = appOffersMap[key]
1659
 
1660
        mc.set("cached_app_offers_"+str(retailerId), finalAppOffersMap, 120)
1661
    else:
1662
        print 'No Offers'
1663
        mc.set("cached_app_offers_"+str(retailerId), {}, 10)              
16693 manish.sha 1664
 
16546 kshitij.so 1665
 
13572 kshitij.so 1666
def main():
17035 kshitij.so 1667
    #generateRedirectUrl(101,1)
17180 kshitij.so 1668
    print (getCashBackDetails('1351153', 3))
16781 manish.sha 1669
    #print addPayout("10", "55db82c0bcabd7fc59e0a71")
13811 kshitij.so 1670
 
13921 kshitij.so 1671
 
15375 kshitij.so 1672
 
13572 kshitij.so 1673
if __name__=='__main__':
13932 amit.gupta 1674
    main()