Subversion Repositories SmartDukaan

Rev

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