Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
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")