Subversion Repositories SmartDukaan

Rev

Rev 18535 | Rev 18549 | 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 = []
18487 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
18535 kshitij.so 111
            if item.get('maxQuantity') is None or item.get('maxQuantity')==0:
112
                item['maxQuantity'] = temp_maxQuantity
113
            else:
114
                item['maxQuantity'] = min(availability,item.get('maxQuantity'))
115
            if item['minBuyQuantity'] > availability:
116
                item['minBuyQuantity'] = availability
18540 kshitij.so 117
            if k==1007389:
118
                print item['bulkPricing']
119
            toremove = []
18535 kshitij.so 120
            for bulkPricing in item['bulkPricing']:
18540 kshitij.so 121
                if k==1007389:
122
                    print bulkPricing
18535 kshitij.so 123
                if bulkPricing['quantity'] < item['minBuyQuantity'] or bulkPricing['quantity'] > item['maxQuantity']:
18540 kshitij.so 124
                    if k==1007389:
125
                        print "Removing ",bulkPricing
126
                        toremove.append(bulkPricing)
127
            for removePricing in toremove:
128
                item['bulkPricing'].remove(removePricing)
129
            if k==1007389:
130
                print "Final bulk pricing ",item['bulkPricing']
131
            item['bulkPricing'] = sorted(item['bulkPricing'], key=lambda k: k['quantity'],reverse=False)
17772 kshitij.so 132
        temp = sorted(v, key = lambda x: (x['availability']),reverse=True)
133
        mc = get_memcache_connection(host=options.mongoHost)
17986 kshitij.so 134
        mc.set(str("item_availability_"+str(k)), temp, 60*60)
17772 kshitij.so 135
 
17993 kshitij.so 136
def flagNoAvailableItems():
137
    global flaggedItems
138
    for k, v in bundleMap.iteritems():
139
        for item in v:
140
            availability = inventoryMap.get(item.get('item_id'))
141
            if availability is None:
142
                flaggedItems.append(item.get('item_id'))
143
 
18186 kshitij.so 144
def addBulkPricingInfo():
145
    bulkItemsMap = {}
146
    bulkItems = session.query(BulkItemPricing).all()
147
    for item in bulkItems:
148
        if bulkItemsMap.has_key(item.item_id):
149
            temp_list = bulkItemsMap.get(item.item_id)
150
            temp_list.append({'quantity':item.quantity,'price':item.price}) 
151
        else:
152
            bulkItemsMap[item.item_id] = [{'quantity':item.quantity,'price':item.price}]
153
    for k, v in bundleMap.iteritems():
154
        for item in v:
155
            bulkPricing = bulkItemsMap.get(item.get('item_id'))
156
            if bulkPricing is None:
157
                item['bulkPricing'] = []
158
            else:
18481 kshitij.so 159
                singleUnitPricing = False
160
                for temp in bulkPricing:
161
                    if temp.get('quantity') ==1:
162
                        singleUnitPricing = True
163
                if not singleUnitPricing:
164
                    bulkPricing.append({'quantity':1,'price':itemPricingMap.get(item.get('item_id'))})
18186 kshitij.so 165
                item['bulkPricing'] = bulkPricing 
166
 
17772 kshitij.so 167
 
168
def fetchItemAvailablity():
169
    global inventoryMap
18186 kshitij.so 170
    try: 
17933 kshitij.so 171
        InventoryDataService.initialize(db_hostname=options.hostname,setup=False)
172
        allInventory = session.query(ItemAvailabilityCache).filter(ItemAvailabilityCache.sourceId==1).all()
173
        for itemInventory in allInventory:
174
            inventoryMap[itemInventory.itemId] = itemInventory.totalAvailability
175
    finally:
176
        session.close()
17772 kshitij.so 177
 
178
if __name__ == '__main__':
179
    populateSaholicBundles()
180
    addItemIdInfo()
18186 kshitij.so 181
    addBulkPricingInfo()
17772 kshitij.so 182
    fetchItemAvailablity()
17993 kshitij.so 183
    flagNoAvailableItems()
184
    if len(flaggedItems) > 0:
185
        print "Flagged items ",flaggedItems
186
        get_inventory_client().updateItemAvailabilityForItemIds(flaggedItems)
187
        fetchItemAvailablity()
17772 kshitij.so 188
    addInfoToMemCache()
189
    mc = get_memcache_connection(host=options.mongoHost)
18540 kshitij.so 190
    print mc.get("item_availability_1007389")