| 22256 |
amit.gupta |
1 |
from datetime import datetime
|
|
|
2 |
from dtr.storage.MemCache import MemCache
|
|
|
3 |
from dtr.utils.utils import get_mongo_connection, SOURCE_MAP
|
| 17772 |
kshitij.so |
4 |
from elixir import *
|
| 22256 |
amit.gupta |
5 |
from shop2020.clients.InventoryClient import InventoryClient
|
| 17772 |
kshitij.so |
6 |
from shop2020.model.v1.catalog.impl import DataService as CatalogDataService
|
| 22256 |
amit.gupta |
7 |
from shop2020.model.v1.catalog.impl.DataService import Item, PrivateDeals, \
|
|
|
8 |
BulkItemPricing, Tag_Listing
|
| 17772 |
kshitij.so |
9 |
from shop2020.model.v1.inventory.impl import DataService as InventoryDataService
|
|
|
10 |
from shop2020.model.v1.inventory.impl.DataService import ItemAvailabilityCache
|
|
|
11 |
import optparse
|
|
|
12 |
import traceback
|
|
|
13 |
|
|
|
14 |
parser = optparse.OptionParser()
|
|
|
15 |
parser.add_option("-H", "--host", dest="hostname",
|
|
|
16 |
default="localhost",
|
|
|
17 |
type="string", help="The HOST where the DB server is running",
|
|
|
18 |
metavar="host")
|
|
|
19 |
parser.add_option("-m", "--m", dest="mongoHost",
|
|
|
20 |
default="localhost",
|
|
|
21 |
type="string", help="The HOST where the mongo server is running",
|
|
|
22 |
metavar="mongo_host")
|
|
|
23 |
|
|
|
24 |
(options, args) = parser.parse_args()
|
|
|
25 |
|
|
|
26 |
bundleMap = {}
|
|
|
27 |
inventoryMap = {}
|
|
|
28 |
memCon = None
|
| 18635 |
kshitij.so |
29 |
maxQuantity = 100
|
| 17993 |
kshitij.so |
30 |
flaggedItems = []
|
| 18487 |
kshitij.so |
31 |
itemPricingMap = {}
|
| 22256 |
amit.gupta |
32 |
#listingPricing map is {<itemId>:[{tag_id:<tagId>, selling_price:<sellingPrice>, mop:<mop>}]}
|
|
|
33 |
listingPricingMap = {}
|
| 18635 |
kshitij.so |
34 |
bulkItemsMap = {}
|
| 17772 |
kshitij.so |
35 |
|
| 17993 |
kshitij.so |
36 |
def get_inventory_client():
|
|
|
37 |
ic = InventoryClient("inventory_service_server_host2","inventory_service_server_port2").get_client()
|
|
|
38 |
return ic
|
|
|
39 |
|
| 17772 |
kshitij.so |
40 |
def get_memcache_connection(host='127.0.0.1'):
|
|
|
41 |
global memCon
|
|
|
42 |
if memCon is None:
|
|
|
43 |
print "Establishing connection %s host" %(host)
|
|
|
44 |
try:
|
|
|
45 |
memCon = MemCache(host)
|
|
|
46 |
except Exception, e:
|
|
|
47 |
print e
|
|
|
48 |
return None
|
|
|
49 |
return memCon
|
|
|
50 |
|
|
|
51 |
def populateSaholicBundles():
|
|
|
52 |
global bundleMap
|
| 20999 |
kshitij.so |
53 |
allSaholicBundles = get_mongo_connection(host=options.mongoHost).Catalog.MasterData.find({'source_id':SOURCE_MAP.get('SAHOLIC'),'category_id':{"$in":[3,5,6]}})
|
| 17772 |
kshitij.so |
54 |
for item in allSaholicBundles:
|
|
|
55 |
try:
|
|
|
56 |
if item.get('identifier') is not None or item.get('identifier').strip()!="":
|
|
|
57 |
#validItems.append({'_id':item.get('_id'),'catalog_item_id':long(item.get('identifier'))})
|
|
|
58 |
bundleMap[long(item.get('identifier'))] = []
|
|
|
59 |
|
|
|
60 |
else:
|
|
|
61 |
print "Identifier not valid for %d"%(item.get('_id'))
|
| 17986 |
kshitij.so |
62 |
print item.get('identifier')
|
| 17772 |
kshitij.so |
63 |
except Exception as e:
|
|
|
64 |
print e
|
|
|
65 |
print "Exception Identifier not valid for %d"%(item.get('_id'))
|
|
|
66 |
|
|
|
67 |
def addItemIdInfo():
|
|
|
68 |
global bundleMap
|
| 18481 |
kshitij.so |
69 |
global itemPricingMap
|
| 17933 |
kshitij.so |
70 |
try:
|
|
|
71 |
CatalogDataService.initialize(db_hostname=options.hostname,setup=False)
|
| 23356 |
amit.gupta |
72 |
item_id_tags = session.query(Tag_Listing).filter(Tag_Listing.active==True).all()
|
| 22256 |
amit.gupta |
73 |
item_id_tags_map = {}
|
|
|
74 |
for item_id_tag in item_id_tags:
|
|
|
75 |
if not item_id_tags_map.has_key(item_id_tag.item_id):
|
|
|
76 |
item_id_tags_map[item_id_tag.item_id] = []
|
|
|
77 |
item_id_tags_map.get(item_id_tag.item_id).append(item_id_tag.tag_id)
|
|
|
78 |
|
| 17933 |
kshitij.so |
79 |
totalLength = len(bundleMap.keys())
|
|
|
80 |
fetch =100
|
|
|
81 |
start = 0
|
|
|
82 |
toBreak = False
|
|
|
83 |
while(True):
|
|
|
84 |
print start
|
|
|
85 |
print fetch
|
|
|
86 |
if fetch > totalLength:
|
|
|
87 |
fetch = totalLength
|
|
|
88 |
toBreak = True
|
|
|
89 |
|
|
|
90 |
item_list = bundleMap.keys()[start:fetch]
|
| 22256 |
amit.gupta |
91 |
#No more normal deals only privatedeals are to be considered here
|
|
|
92 |
items = session.query(Item,PrivateDeals).join((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(Item.catalog_item_id.in_(item_list)).all()
|
| 17933 |
kshitij.so |
93 |
for i in items:
|
|
|
94 |
d_item = i[0]
|
|
|
95 |
d_privatedeal = i[1]
|
|
|
96 |
tempList = bundleMap.get(d_item.catalog_item_id)
|
| 22256 |
amit.gupta |
97 |
# sellingPrice = d_item.sellingPrice
|
|
|
98 |
# sellingPriceType = "Normal"
|
| 17933 |
kshitij.so |
99 |
if d_privatedeal is not None and d_privatedeal.isActive==1 and d_privatedeal.startDate < datetime.now() and d_privatedeal.endDate > datetime.now() and d_privatedeal.dealPrice >0:
|
|
|
100 |
sellingPrice = d_privatedeal.dealPrice
|
|
|
101 |
sellingPriceType = "Private deal price"
|
| 22256 |
amit.gupta |
102 |
temp = {'item_id':d_item.id,'color':d_item.color,'sellingPrice':sellingPrice,'sellingPriceType':sellingPriceType,'minBuyQuantity':d_item.minimumBuyQuantity,
|
|
|
103 |
'quantityStep':d_item.quantityStep,'maxQuantity':d_item.maximumBuyQuantity}
|
|
|
104 |
if item_id_tags_map.has_key(d_item.id):
|
|
|
105 |
temp['tag_ids'] = item_id_tags_map.get(d_item.id)
|
|
|
106 |
tempList.append(temp)
|
|
|
107 |
itemPricingMap[d_item.id] =sellingPrice
|
|
|
108 |
|
| 17933 |
kshitij.so |
109 |
if toBreak:
|
|
|
110 |
print "Breaking"
|
|
|
111 |
break
|
|
|
112 |
start = fetch
|
|
|
113 |
fetch = start + fetch
|
|
|
114 |
finally:
|
|
|
115 |
session.close()
|
| 17772 |
kshitij.so |
116 |
|
|
|
117 |
def addInfoToMemCache():
|
|
|
118 |
for k, v in bundleMap.iteritems():
|
| 23356 |
amit.gupta |
119 |
itemList = []
|
| 17772 |
kshitij.so |
120 |
for item in v:
|
|
|
121 |
availability = inventoryMap.get(item.get('item_id'))
|
| 23356 |
amit.gupta |
122 |
if availability is None or availability == 0:
|
|
|
123 |
continue
|
| 17772 |
kshitij.so |
124 |
item['availability'] = availability
|
|
|
125 |
if availability < maxQuantity:
|
| 18417 |
kshitij.so |
126 |
temp_maxQuantity = availability
|
| 17772 |
kshitij.so |
127 |
else:
|
| 18417 |
kshitij.so |
128 |
temp_maxQuantity = maxQuantity
|
| 18535 |
kshitij.so |
129 |
if item.get('maxQuantity') is None or item.get('maxQuantity')==0:
|
|
|
130 |
item['maxQuantity'] = temp_maxQuantity
|
|
|
131 |
else:
|
|
|
132 |
item['maxQuantity'] = min(availability,item.get('maxQuantity'))
|
|
|
133 |
if item['minBuyQuantity'] > availability:
|
|
|
134 |
item['minBuyQuantity'] = availability
|
| 18635 |
kshitij.so |
135 |
checkBulkPrices(item)
|
| 18540 |
kshitij.so |
136 |
item['bulkPricing'] = sorted(item['bulkPricing'], key=lambda k: k['quantity'],reverse=False)
|
| 23356 |
amit.gupta |
137 |
itemList.append(item)
|
|
|
138 |
if len(itemList) > 0:
|
|
|
139 |
temp = sorted(itemList, key = lambda x: (x['availability']),reverse=True)
|
|
|
140 |
mc = get_memcache_connection(host=options.mongoHost)
|
|
|
141 |
mc.set(str("item_availability_"+str(k)), temp, 60*60)
|
|
|
142 |
else:
|
|
|
143 |
mc = get_memcache_connection(host=options.mongoHost)
|
|
|
144 |
mc.delete(str("item_availability_"+str(k)))
|
| 17772 |
kshitij.so |
145 |
|
| 18635 |
kshitij.so |
146 |
def checkBulkPrices(item):
|
|
|
147 |
adjusted = False
|
|
|
148 |
"""Lets check minBuyQty exist in bulkPricing"""
|
|
|
149 |
minBuyQty = item['minBuyQuantity']
|
|
|
150 |
for bulkPricingDict in item['bulkPricing']:
|
|
|
151 |
if bulkPricingDict.get('quantity') == minBuyQty:
|
|
|
152 |
adjusted = True
|
|
|
153 |
if minBuyQty > 1 and not adjusted:
|
|
|
154 |
allBulkPricing = bulkItemsMap.get(item.get('item_id'))
|
| 19243 |
kshitij.so |
155 |
if allBulkPricing is None or len(allBulkPricing) == 0:
|
| 18635 |
kshitij.so |
156 |
item['bulkPricing'] = [{'quantity':minBuyQty,'price':item.get('sellingPrice')}]
|
|
|
157 |
else:
|
|
|
158 |
allBulkPricing = sorted(allBulkPricing, key=lambda k: k['quantity'],reverse=False)
|
|
|
159 |
effectiveBulkPrice = None
|
|
|
160 |
for bulkPricing in allBulkPricing:
|
|
|
161 |
if bulkPricing.get('quantity') < minBuyQty:
|
|
|
162 |
effectiveBulkPrice = bulkPricing
|
|
|
163 |
if effectiveBulkPrice is None:
|
|
|
164 |
item['bulkPricing'].append({'quantity':minBuyQty,'price':item.get('sellingPrice')})
|
|
|
165 |
else:
|
|
|
166 |
item['bulkPricing'].append({'quantity':minBuyQty,'price':effectiveBulkPrice['price']})
|
|
|
167 |
toremove = []
|
|
|
168 |
for bulkPricing in item['bulkPricing']:
|
|
|
169 |
if bulkPricing['quantity'] < item['minBuyQuantity'] or bulkPricing['quantity'] > item['maxQuantity']:
|
|
|
170 |
toremove.append(bulkPricing)
|
|
|
171 |
for removePricing in toremove:
|
|
|
172 |
item['bulkPricing'].remove(removePricing)
|
|
|
173 |
|
|
|
174 |
|
| 17993 |
kshitij.so |
175 |
def flagNoAvailableItems():
|
|
|
176 |
global flaggedItems
|
|
|
177 |
for k, v in bundleMap.iteritems():
|
|
|
178 |
for item in v:
|
|
|
179 |
availability = inventoryMap.get(item.get('item_id'))
|
|
|
180 |
if availability is None:
|
|
|
181 |
flaggedItems.append(item.get('item_id'))
|
|
|
182 |
|
| 18186 |
kshitij.so |
183 |
def addBulkPricingInfo():
|
| 18635 |
kshitij.so |
184 |
global bulkItemsMap
|
| 18186 |
kshitij.so |
185 |
bulkItems = session.query(BulkItemPricing).all()
|
|
|
186 |
for item in bulkItems:
|
|
|
187 |
if bulkItemsMap.has_key(item.item_id):
|
|
|
188 |
temp_list = bulkItemsMap.get(item.item_id)
|
|
|
189 |
temp_list.append({'quantity':item.quantity,'price':item.price})
|
|
|
190 |
else:
|
|
|
191 |
bulkItemsMap[item.item_id] = [{'quantity':item.quantity,'price':item.price}]
|
|
|
192 |
for k, v in bundleMap.iteritems():
|
|
|
193 |
for item in v:
|
|
|
194 |
bulkPricing = bulkItemsMap.get(item.get('item_id'))
|
|
|
195 |
if bulkPricing is None:
|
|
|
196 |
item['bulkPricing'] = []
|
|
|
197 |
else:
|
| 18481 |
kshitij.so |
198 |
singleUnitPricing = False
|
|
|
199 |
for temp in bulkPricing:
|
|
|
200 |
if temp.get('quantity') ==1:
|
|
|
201 |
singleUnitPricing = True
|
|
|
202 |
if not singleUnitPricing:
|
|
|
203 |
bulkPricing.append({'quantity':1,'price':itemPricingMap.get(item.get('item_id'))})
|
| 18635 |
kshitij.so |
204 |
item['bulkPricing'] = bulkPricing
|
| 18186 |
kshitij.so |
205 |
|
| 17772 |
kshitij.so |
206 |
|
|
|
207 |
def fetchItemAvailablity():
|
|
|
208 |
global inventoryMap
|
| 18186 |
kshitij.so |
209 |
try:
|
| 17933 |
kshitij.so |
210 |
InventoryDataService.initialize(db_hostname=options.hostname,setup=False)
|
|
|
211 |
allInventory = session.query(ItemAvailabilityCache).filter(ItemAvailabilityCache.sourceId==1).all()
|
|
|
212 |
for itemInventory in allInventory:
|
|
|
213 |
inventoryMap[itemInventory.itemId] = itemInventory.totalAvailability
|
|
|
214 |
finally:
|
|
|
215 |
session.close()
|
| 17772 |
kshitij.so |
216 |
|
| 23356 |
amit.gupta |
217 |
def flagFofoMissingItems():
|
|
|
218 |
try:
|
|
|
219 |
CatalogDataService.initialize(db_hostname=options.hostname,setup=False)
|
|
|
220 |
item_id_tags = session.query(Tag_Listing).filter(Tag_Listing.active==True).all()
|
|
|
221 |
for item_id_tag in item_id_tags:
|
|
|
222 |
if item_id_tag.item_id not in flaggedItems:
|
|
|
223 |
flaggedItems.append(item_id_tag.item_id)
|
|
|
224 |
finally:
|
|
|
225 |
session.close()
|
| 17772 |
kshitij.so |
226 |
if __name__ == '__main__':
|
|
|
227 |
populateSaholicBundles()
|
|
|
228 |
addItemIdInfo()
|
| 18186 |
kshitij.so |
229 |
addBulkPricingInfo()
|
| 22256 |
amit.gupta |
230 |
#Gets tagListing
|
|
|
231 |
|
| 17772 |
kshitij.so |
232 |
fetchItemAvailablity()
|
| 17993 |
kshitij.so |
233 |
flagNoAvailableItems()
|
| 23356 |
amit.gupta |
234 |
flagFofoMissingItems()
|
| 17993 |
kshitij.so |
235 |
if len(flaggedItems) > 0:
|
|
|
236 |
print "Flagged items ",flaggedItems
|
|
|
237 |
get_inventory_client().updateItemAvailabilityForItemIds(flaggedItems)
|
|
|
238 |
fetchItemAvailablity()
|
| 17772 |
kshitij.so |
239 |
addInfoToMemCache()
|
|
|
240 |
mc = get_memcache_connection(host=options.mongoHost)
|
| 22259 |
amit.gupta |
241 |
print mc.get("item_availability_1019937")
|