Subversion Repositories SmartDukaan

Rev

Rev 20360 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13828 kshitij.so 1
from elixir import * 
2
from shop2020.model.v1.catalog.impl import DataService
3
from shop2020.model.v1.catalog.impl.DataService import PrivateDeals, Item
4
from sqlalchemy.sql.functions import now
5
from datetime import datetime, timedelta
6
import pymongo
7
from dtr.utils.utils import to_java_date
13843 kshitij.so 8
import optparse
14325 kshitij.so 9
from dtr.storage.MemCache import MemCache
14705 kshitij.so 10
from dtr.utils.utils import getCashBack
20347 kshitij.so 11
from dtr.utils.utils import getNlcPoints, DEAL_PRIORITY
15268 kshitij.so 12
import traceback
13828 kshitij.so 13
 
14
dealsMap = {}
15
con = None
16
dealsCatalogIds = []
17
itemCatalogMap = {}
18
 
13843 kshitij.so 19
parser = optparse.OptionParser()
14259 kshitij.so 20
parser.add_option("-H", "--host", dest="hostname",
13843 kshitij.so 21
                      default="localhost",
22
                      type="string", help="The HOST where the DB server is running",
14259 kshitij.so 23
                      metavar="db_host")
14253 kshitij.so 24
parser.add_option("-m", "--m", dest="mongoHost",
25
                      default="localhost",
26
                      type="string", help="The HOST where the mongo server is running",
27
                      metavar="mongo_host")
13828 kshitij.so 28
 
13849 kshitij.so 29
(options, args) = parser.parse_args()
14325 kshitij.so 30
 
31
mc = MemCache(options.mongoHost)
32
 
13843 kshitij.so 33
DataService.initialize(db_hostname=options.hostname)
34
 
16869 kshitij.so 35
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5,'PAYTM.COM':6}
16019 kshitij.so 36
 
14253 kshitij.so 37
def get_mongo_connection(host=options.mongoHost, port=27017):
13828 kshitij.so 38
    global con
39
    if con is None:
40
        print "Establishing connection %s host and port %d" %(host,port)
41
        try:
42
            con = pymongo.MongoClient(host, port)
43
        except Exception, e:
44
            print e
45
            return None
46
    return con
47
 
19188 kshitij.so 48
def getNetPriceForItem(itemId, source_id, category_id ,price):
49
    cash_back_type = 0
50
    cash_back = 0
51
    try:
52
        cashBack = getCashBack(itemId, source_id, category_id, mc, options.mongoHost)
53
        if not cashBack or cashBack.get('cash_back_status')!=1:
54
            cash_back_type = 0
55
            cash_back = 0 
56
 
57
        else:
58
            if cashBack['cash_back_type'] in (1,2):
59
 
60
                if cashBack.get('maxCashBack') is not None:
61
 
62
                    if cashBack.get('cash_back_type') ==1 and (float(cashBack.get('cash_back'))*price)/100 > cashBack.get('maxCashBack'):
63
                        cashBack['cash_back_type'] = 2
64
                        cashBack['cash_back'] = cashBack['maxCashBack']
65
                    elif cashBack.get('cash_back_type') ==2 and cashBack.get('cash_back') > cashBack.get('maxCashBack'):
66
                        cashBack['cash_back'] = cashBack['maxCashBack']
67
                    else:
68
                        pass
69
 
70
 
71
 
72
                cash_back_type = cashBack['cash_back_type']
73
                cash_back = float(cashBack['cash_back'])
74
    except Exception as cashBackEx:
75
        pass
76
 
77
    if cash_back_type ==1:
78
        return (price - float(cash_back)*price/100)
79
    elif cash_back_type ==2:
80
        return (price - cash_back)
81
    else:
82
        return price
83
 
84
 
13828 kshitij.so 85
def getPrivateDeals():
14259 kshitij.so 86
    try:
87
        global dealsMap
88
        dealsMap = dict()
89
        all_active_items_query =  session.query(PrivateDeals).filter(PrivateDeals.isActive==True).filter(now().between(PrivateDeals.startDate, PrivateDeals.endDate))
90
        all_active_private_deals = all_active_items_query.all()
91
        if all_active_private_deals is not None or all_active_private_deals!=[]:
92
            for active_private_deal in all_active_private_deals:
15268 kshitij.so 93
                print active_private_deal.item_id
14259 kshitij.so 94
                item = Item.get_by(id = active_private_deal.item_id)
95
                if item.sellingPrice >  active_private_deal.dealPrice and item.status==3:
96
                    dealsMap[active_private_deal.item_id] = active_private_deal
97
    finally:
98
        session.close()
13828 kshitij.so 99
 
100
def getItemsToUpdate():
101
    global dealsCatalogIds
102
    global itemCatalogMap
15268 kshitij.so 103
    toScrapMap = {}
21008 kshitij.so 104
    bestSellers = list(get_mongo_connection().Catalog.MasterData.find({"source_id":4,"category_id":{"$in":[3,5,6]}}))
14130 kshitij.so 105
    for bestSeller in bestSellers: 
106
        saholicCatalogIds = list(get_mongo_connection().Catalog.MasterData.find({'skuBundleId':bestSeller['skuBundleId'],'source_id':4}))
107
        for d in saholicCatalogIds:
108
            if d['source_id']!=4:
109
                continue
15268 kshitij.so 110
            d['dealFlag'] = 0
111
            d['dealType'] = 0
112
            toScrapMap[d['_id']] = d
14130 kshitij.so 113
            dealsCatalogIds.append(long(d['identifier'].strip()))
16180 kshitij.so 114
    dealFlagged = list(get_mongo_connection().Catalog.Deals.find({'source_id':4,'showDeal':1,'totalPoints':{'$gt':-100}}))
15268 kshitij.so 115
    for deal in dealFlagged:
116
        if not toScrapMap.has_key(deal['_id']):
117
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':deal['_id']}))
118
            data[0]['dealFlag'] = 0
119
            data[0]['dealType'] = 0
120
            toScrapMap[deal['_id']] = data[0]
121
            if long(data[0]['identifier'].strip()) not in dealsCatalogIds: 
122
                dealsCatalogIds.append(long(data[0]['identifier'].strip()))
123
    manualDeals = list(get_mongo_connection().Catalog.ManualDeals.find({'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())},'source_id':4}))
124
    for manualDeal in manualDeals:
125
        if not toScrapMap.has_key(manualDeal['sku']):
126
            data = list(get_mongo_connection().Catalog.MasterData.find({'_id':manualDeal['sku']}))
127
            if len(data) > 0:
128
                data[0]['dealFlag'] = 1
129
                data[0]['dealType'] = manualDeal['dealType']
130
                toScrapMap[manualDeal['sku']] = data[0]
131
                if long(data[0]['identifier'].strip()) not in dealsCatalogIds: 
132
                    dealsCatalogIds.append(long(data[0]['identifier'].strip()))
133
        else:
134
            data = toScrapMap.get(manualDeal['sku'])
135
            data['dealFlag'] = 1
136
            data['dealType'] = manualDeal['dealType']
137
 
13828 kshitij.so 138
    items = Item.query.filter(Item.catalog_item_id.in_(dealsCatalogIds)).all()
139
    for item in items:
140
        temp = []
141
        if not itemCatalogMap.has_key(item.catalog_item_id):
142
            temp.append(item)
14179 kshitij.so 143
            print "****",item.catalog_item_id
13828 kshitij.so 144
            itemCatalogMap[item.catalog_item_id] = temp
145
        else:
146
            val = itemCatalogMap.get(item.catalog_item_id)
147
            for l in val:
148
                temp.append(l)
149
            temp.append(item)
150
            itemCatalogMap[item.catalog_item_id] = temp
151
 
15268 kshitij.so 152
    for saholicCatalogId in toScrapMap.itervalues():
14129 kshitij.so 153
        if saholicCatalogId['source_id']!=4:
154
            continue
13916 kshitij.so 155
        d_items = itemCatalogMap.get(long(saholicCatalogId['identifier'].strip()))
13828 kshitij.so 156
        available_price = None
14179 kshitij.so 157
        in_stock = 0
158
        if d_items is not None:
13828 kshitij.so 159
            for d_item in d_items:
14179 kshitij.so 160
                in_stock = 0 
13828 kshitij.so 161
                if d_item.status == 3:
162
                    in_stock =1
14179 kshitij.so 163
                else:
164
                    continue
165
                if dealsMap.get(d_item.id) is not None:
166
                    available_price = dealsMap.get(d_item.id).dealPrice
167
                if (available_price !=None):
13828 kshitij.so 168
                    break
14179 kshitij.so 169
        if (available_price is None):
170
            in_stock = 0
171
            if d_items is not None:
172
                for d_item in d_items:
173
                    if d_item.status == 3:
174
                        available_price = d_item.sellingPrice
175
                        in_stock =1
176
                        break
13828 kshitij.so 177
        print long(saholicCatalogId['identifier'])
178
        print in_stock
179
        print available_price
180
        print dealsMap.get(d_item.id)
181
        print "++++++++++++++++++++++++++"
13850 kshitij.so 182
        if available_price > 0 or available_price is not None:
20347 kshitij.so 183
            netPriceAfterCashBack = getNetPriceForItem(saholicCatalogId['_id'], SOURCE_MAP.get('SAHOLIC'), saholicCatalogId['category_id'], available_price)
14127 kshitij.so 184
            get_mongo_connection().Catalog.MasterData.update({'_id':saholicCatalogId['_id']}, {'$set' : {'available_price':available_price,'updatedOn':to_java_date(datetime.now()),'priceUpdatedOn':to_java_date(datetime.now()),'in_stock':in_stock}}, multi=True)
19188 kshitij.so 185
            get_mongo_connection().Catalog.Deals.update({'_id':saholicCatalogId['_id']}, {'$set' : {'available_price':available_price , 'in_stock':in_stock,'netPriceAfterCashBack':netPriceAfterCashBack}}, multi=True)
13828 kshitij.so 186
        else:
20347 kshitij.so 187
            netPriceAfterCashBack = getNetPriceForItem(saholicCatalogId['_id'], SOURCE_MAP.get('SAHOLIC'), saholicCatalogId['category_id'], saholicCatalogId['available_price'])
14127 kshitij.so 188
            get_mongo_connection().Catalog.MasterData.update({'_id':saholicCatalogId['_id']}, {'$set' : {'updatedOn':to_java_date(datetime.now()),'in_stock':in_stock,'priceUpdatedOn':to_java_date(datetime.now())}}, multi=True)
19188 kshitij.so 189
            get_mongo_connection().Catalog.Deals.update({'_id':saholicCatalogId['_id']}, {'$set' : {'in_stock':in_stock,'netPriceAfterCashBack':netPriceAfterCashBack}}, multi=True)
13828 kshitij.so 190
 
13916 kshitij.so 191
        try:
15268 kshitij.so 192
            recomputeDeal(saholicCatalogId)
13916 kshitij.so 193
        except:
194
            print "Unable to compute deal for ",saholicCatalogId['skuBundleId']
195
 
14325 kshitij.so 196
def populateNegativeDeals():
197
    negativeDeals = get_mongo_connection().Catalog.NegativeDeals.find().distinct('sku')
15268 kshitij.so 198
    mc.set("negative_deals", negativeDeals, 600)
199
 
16504 kshitij.so 200
#def recomputePoints(item, deal):
201
#    try:
202
#        if item.get('available_price') == deal['available_price']:
203
#            print "No need to compute points for %d , as price is still same" %(item['_id'])
204
#            raise
205
#    except:
206
#        traceback.print_exc()
207
#        nlcPoints = deal['nlcPoints']
208
#    
209
#    bundleDealPoints = list(get_mongo_connection().Catalog.DealPoints.find({'skuBundleId':item['skuBundleId'],'startDate':{'$lte':to_java_date(datetime.now())},'endDate':{'$gte':to_java_date(datetime.now())}}))
210
#    if len(bundleDealPoints) > 0:
211
#        item['manualDealThresholdPrice'] = bundleDealPoints[0]['dealThresholdPrice']
212
#        dealPoints = bundleDealPoints[0]['dealPoints']
213
#    else:
214
#        dealPoints = 0
215
#        item['manualDealThresholdPrice'] = None
216
#    
217
#    
218
#    get_mongo_connection().Catalog.Deals.update({'_id':deal['_id']},{"$set":{'totalPoints':deal['totalPoints'] - deal['nlcPoints'] + nlcPoints - deal['dealPoints'] +dealPoints , 'nlcPoints': nlcPoints, 'dealPoints': dealPoints, 'manualDealThresholdPrice': item['manualDealThresholdPrice']}})
15268 kshitij.so 219
 
220
def recomputeDeal(item):
13916 kshitij.so 221
    """Lets recompute deal for this bundle"""
16019 kshitij.so 222
    print "Recomputing for bundleId %d" %(item.get('skuBundleId'))
15268 kshitij.so 223
    skuBundleId = item['skuBundleId']
13916 kshitij.so 224
 
19188 kshitij.so 225
    similarItems = list(get_mongo_connection().Catalog.Deals.find({'skuBundleId':skuBundleId}).sort([('netPriceAfterCashBack',pymongo.ASCENDING)]))
13916 kshitij.so 226
    bestPrice = float("inf")
227
    bestOne = None
228
    toUpdate = []
16019 kshitij.so 229
    prepaidBestPrice = float("inf")
230
    prepaidBestOne = None
13916 kshitij.so 231
    for similarItem in similarItems:
16019 kshitij.so 232
        if similarItem['codAvailable'] ==1:
233
            if mc.get("negative_deals") is None:
234
                populateNegativeDeals()
16180 kshitij.so 235
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 236
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
237
                continue
238
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
239
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
240
                continue
19188 kshitij.so 241
            if similarItem.get('netPriceAfterCashBack') < bestPrice:
16019 kshitij.so 242
                bestOne = similarItem
19188 kshitij.so 243
                bestPrice = similarItem.get('netPriceAfterCashBack')
20347 kshitij.so 244
            elif similarItem.get('netPriceAfterCashBack') == bestPrice:
245
 
246
                try:
247
                    if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(bestOne['source_id']))):
248
                        continue
249
                except:
250
                    traceback.print_exc()
251
 
252
 
16019 kshitij.so 253
                bestOne = similarItem
19188 kshitij.so 254
                bestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 255
            else:
256
                pass
13916 kshitij.so 257
        else:
16019 kshitij.so 258
            if mc.get("negative_deals") is None:
259
                populateNegativeDeals()
16180 kshitij.so 260
            if similarItem['in_stock'] == 0  or similarItem['_id'] in mc.get("negative_deals"):
16019 kshitij.so 261
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0, 'prepaidDeal':0 }})
262
                continue
263
            if similarItem['source_id'] == SOURCE_MAP.get('SHOPCLUES.COM') and similarItem['rank']==0:
264
                get_mongo_connection().Catalog.Deals.update({ '_id' : similarItem['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':0 }})
265
                continue
19188 kshitij.so 266
            if similarItem.get('netPriceAfterCashBack') < prepaidBestPrice:
16019 kshitij.so 267
                prepaidBestOne = similarItem
19188 kshitij.so 268
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
20347 kshitij.so 269
            elif similarItem.get('netPriceAfterCashBack') == prepaidBestPrice:
270
 
271
                try:
20360 kshitij.so 272
                    if (DEAL_PRIORITY.index(int(similarItem['source_id'])) > DEAL_PRIORITY.index(int(prepaidBestOne['source_id']))):
20347 kshitij.so 273
                        continue
274
                except:
275
                    traceback.print_exc()
276
 
16019 kshitij.so 277
                prepaidBestOne = similarItem
19188 kshitij.so 278
                prepaidBestPrice = similarItem.get('netPriceAfterCashBack')
16019 kshitij.so 279
            else:
280
                pass
16026 kshitij.so 281
    if bestOne is not None or prepaidBestOne is not None:
13916 kshitij.so 282
        for similarItem in similarItems:
283
            toUpdate.append(similarItem['_id'])
16026 kshitij.so 284
        if bestOne is not None:
285
            toUpdate.remove(bestOne['_id'])
286
            get_mongo_connection().Catalog.Deals.update({ '_id' : bestOne['_id'] }, {'$set':{'showDeal':1,'prepaidDeal':0 }})
287
        if prepaidBestOne is not None:
16075 kshitij.so 288
            if bestOne is not None:
19188 kshitij.so 289
                if prepaidBestOne.get('netPriceAfterCashBack') < bestOne.get('netPriceAfterCashBack'): 
16075 kshitij.so 290
                    toUpdate.remove(prepaidBestOne['_id'])
291
                    get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
292
            else:
293
                toUpdate.remove(prepaidBestOne['_id'])
294
                get_mongo_connection().Catalog.Deals.update({ '_id' : prepaidBestOne['_id'] }, {'$set':{'showDeal':0,'prepaidDeal':1 }})
13916 kshitij.so 295
    if len(toUpdate) > 0:
16019 kshitij.so 296
        get_mongo_connection().Catalog.Deals.update({ '_id' : { "$in": toUpdate } }, {'$set':{'showDeal':0,'prepaidDeal':0 }},upsert=False, multi=True)
297
 
13916 kshitij.so 298
 
13828 kshitij.so 299
def main():
300
    getPrivateDeals()
14259 kshitij.so 301
    try:
302
        getItemsToUpdate()
303
    finally:
304
        session.close()
15268 kshitij.so 305
    print "Done with saholic pricing"
13828 kshitij.so 306
 
307
if __name__=='__main__':
308
    main()