Subversion Repositories SmartDukaan

Rev

Rev 18444 | Rev 18487 | 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
28
maxQuantity = 20
17993 kshitij.so 29
flaggedItems = []
18481 kshitij.so 30
itemPricingMap = []
17772 kshitij.so 31
 
17993 kshitij.so 32
def get_inventory_client():
33
    ic = InventoryClient("inventory_service_server_host2","inventory_service_server_port2").get_client()
34
    return ic
35
 
17772 kshitij.so 36
def get_memcache_connection(host='127.0.0.1'):
37
    global memCon
38
    if memCon is None:
39
        print "Establishing connection %s host" %(host)
40
        try:
41
            memCon = MemCache(host)
42
        except Exception, e:
43
            print e
44
            return None
45
    return memCon
46
 
47
def populateSaholicBundles():
48
    global bundleMap
49
    allSaholicBundles = get_mongo_connection(host=options.mongoHost).Catalog.MasterData.find({'source_id':SOURCE_MAP.get('SAHOLIC')})
50
    for item in allSaholicBundles:
51
        try:
52
            if item.get('identifier') is not None or item.get('identifier').strip()!="":
53
                #validItems.append({'_id':item.get('_id'),'catalog_item_id':long(item.get('identifier'))})
54
                bundleMap[long(item.get('identifier'))] = []
55
 
56
            else:
57
                print "Identifier not valid for %d"%(item.get('_id'))
17986 kshitij.so 58
                print item.get('identifier')
17772 kshitij.so 59
        except Exception as e:
60
            print e
61
            print "Exception Identifier not valid for %d"%(item.get('_id'))
62
 
63
def addItemIdInfo():
64
    global bundleMap
18481 kshitij.so 65
    global itemPricingMap
17933 kshitij.so 66
    try:
67
        CatalogDataService.initialize(db_hostname=options.hostname,setup=False)
68
        totalLength = len(bundleMap.keys())
69
        fetch =100
70
        start = 0
71
        toBreak = False
72
        while(True):
73
            print start
74
            print fetch
75
            if fetch > totalLength:
76
                fetch = totalLength
77
                toBreak = True
78
 
79
            item_list = bundleMap.keys()[start:fetch]
80
            items = session.query(Item,PrivateDeals).outerjoin((PrivateDeals,Item.id==PrivateDeals.item_id)).filter(Item.catalog_item_id.in_(item_list)).all()
81
            for i in items:
82
                d_item = i[0]
83
                d_privatedeal = i[1]
84
                tempList = bundleMap.get(d_item.catalog_item_id)
85
                sellingPrice = d_item.sellingPrice
86
                sellingPriceType = "Normal"
87
                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:
88
                    sellingPrice = d_privatedeal.dealPrice
89
                    sellingPriceType = "Private deal price"
18417 kshitij.so 90
                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 91
                itemPricingMap[d_item.id] =sellingPrice
17933 kshitij.so 92
            if toBreak:
93
                print "Breaking"
94
                break
95
            start = fetch
96
            fetch = start + fetch
97
    finally:
98
        session.close()
17772 kshitij.so 99
 
100
def addInfoToMemCache():
101
    for k, v in bundleMap.iteritems():
102
        for item in v:
103
            availability = inventoryMap.get(item.get('item_id'))
104
            if availability is None:
105
                availability = 0
106
            item['availability'] = availability
107
            if availability < maxQuantity:
18417 kshitij.so 108
                temp_maxQuantity = availability
17772 kshitij.so 109
            else:
18417 kshitij.so 110
                temp_maxQuantity = maxQuantity
18444 kshitij.so 111
        if item.get('maxQuantity') is None or item.get('maxQuantity')==0:
18417 kshitij.so 112
            item['maxQuantity'] = temp_maxQuantity
18444 kshitij.so 113
        else:
114
            item['maxQuantity'] = min(availability,item.get('maxQuantity'))
17772 kshitij.so 115
        temp = sorted(v, key = lambda x: (x['availability']),reverse=True)
116
        mc = get_memcache_connection(host=options.mongoHost)
17986 kshitij.so 117
        mc.set(str("item_availability_"+str(k)), temp, 60*60)
17772 kshitij.so 118
 
17993 kshitij.so 119
def flagNoAvailableItems():
120
    global flaggedItems
121
    for k, v in bundleMap.iteritems():
122
        for item in v:
123
            availability = inventoryMap.get(item.get('item_id'))
124
            if availability is None:
125
                flaggedItems.append(item.get('item_id'))
126
 
18186 kshitij.so 127
def addBulkPricingInfo():
128
    bulkItemsMap = {}
129
    bulkItems = session.query(BulkItemPricing).all()
130
    for item in bulkItems:
131
        if bulkItemsMap.has_key(item.item_id):
132
            temp_list = bulkItemsMap.get(item.item_id)
133
            temp_list.append({'quantity':item.quantity,'price':item.price}) 
134
        else:
135
            bulkItemsMap[item.item_id] = [{'quantity':item.quantity,'price':item.price}]
136
    for k, v in bundleMap.iteritems():
137
        for item in v:
138
            bulkPricing = bulkItemsMap.get(item.get('item_id'))
139
            if bulkPricing is None:
140
                item['bulkPricing'] = []
141
            else:
18481 kshitij.so 142
                singleUnitPricing = False
143
                for temp in bulkPricing:
144
                    if temp.get('quantity') ==1:
145
                        singleUnitPricing = True
146
                if not singleUnitPricing:
147
                    bulkPricing.append({'quantity':1,'price':itemPricingMap.get(item.get('item_id'))})
18186 kshitij.so 148
                item['bulkPricing'] = bulkPricing 
149
 
17772 kshitij.so 150
 
151
def fetchItemAvailablity():
152
    global inventoryMap
18186 kshitij.so 153
    try: 
17933 kshitij.so 154
        InventoryDataService.initialize(db_hostname=options.hostname,setup=False)
155
        allInventory = session.query(ItemAvailabilityCache).filter(ItemAvailabilityCache.sourceId==1).all()
156
        for itemInventory in allInventory:
157
            inventoryMap[itemInventory.itemId] = itemInventory.totalAvailability
158
    finally:
159
        session.close()
17772 kshitij.so 160
 
161
if __name__ == '__main__':
162
    populateSaholicBundles()
163
    addItemIdInfo()
18186 kshitij.so 164
    addBulkPricingInfo()
17772 kshitij.so 165
    fetchItemAvailablity()
17993 kshitij.so 166
    flagNoAvailableItems()
167
    if len(flaggedItems) > 0:
168
        print "Flagged items ",flaggedItems
169
        get_inventory_client().updateItemAvailabilityForItemIds(flaggedItems)
170
        fetchItemAvailablity()
17772 kshitij.so 171
    addInfoToMemCache()
172
    mc = get_memcache_connection(host=options.mongoHost)
173
    print mc.get("item_availability_1005556")