Subversion Repositories SmartDukaan

Rev

Rev 18635 | Rev 20999 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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