Subversion Repositories SmartDukaan

Rev

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