Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
626 chandransh 1
#!/usr/bin/python
1080 chandransh 2
 
626 chandransh 3
import optparse
1080 chandransh 4
import csv
626 chandransh 5
import xlrd
6
import datetime
7
 
8
if __name__ == '__main__' and __package__ is None:
9
    import sys
10
    import os
11
    sys.path.insert(0, os.getcwd())
12
 
13
from shop2020.thriftpy.model.v1.catalog.ttypes import status
14
from shop2020.model.v1.catalog.impl import DataService
724 chandransh 15
from shop2020.model.v1.catalog.impl.DataService import Item, EntityIDGenerator,\
1356 chandransh 16
    ItemChangeLog, Vendor, VendorItemPricing, VendorItemMapping
626 chandransh 17
from elixir import *
18
 
1810 chandransh 19
def load_item_data(filename, vendorId, category, full_update, dry_run, supplied_product_group):
1250 chandransh 20
    DataService.initialize('catalog')
1356 chandransh 21
 
22
    vendor = Vendor.get_by(id=vendorId)
23
    if vendor is None:
24
        raise Exception("No vendor found for the id: " + str(vendorId))
626 chandransh 25
 
26
    workbook = xlrd.open_workbook(filename)
27
    sheet = workbook.sheet_by_index(0)
28
    num_rows = sheet.nrows
29
    updatedOn = datetime.datetime.now()
1080 chandransh 30
    new_items = []
1264 chandransh 31
    updated_items = []
1356 chandransh 32
 
33
    existing_vendor_item_mappings = VendorItemMapping.query.filter_by(vendor=vendor, vendor_category=category).all()
34
    existing_vendor_item_mappings_set = set([mapping.item_key for mapping in existing_vendor_item_mappings])
35
 
626 chandransh 36
    for rownum in range(1, num_rows):
1080 chandransh 37
        #print sheet.row_values(rownum)
1356 chandransh 38
        catalog_item_id, category_id = [None, None]
1264 chandransh 39
 
1810 chandransh 40
        if supplied_product_group != '':
41
            our_brand, our_model_number, our_color,\
42
            brand, model_number, model_name, color,\
43
            dp, mrp, mop, sp,\
44
            comments, hotspot_category, unused_feature, xfer_price, weight, start_date, deal_text, deal_value = sheet.row_values(rownum)[0:19]
45
            product_group = supplied_product_group
46
        else:
47
            our_brand, our_model_number, our_color,\
48
            product_group, brand, model_number, model_name, color,\
49
            dp, mrp, mop, sp,\
50
            comments, hotspot_category, unused_feature, xfer_price, weight, start_date, deal_text, deal_value = sheet.row_values(rownum)[0:20]
51
 
626 chandransh 52
        if isinstance(model_number, float):
53
            model_number = str(int(model_number))
1810 chandransh 54
 
55
        if our_brand == '':
56
            our_brand = brand
57
        if our_model_number == '':
58
            our_model_number = model_number
59
        if our_color == '':
60
            our_color = color
61
 
1633 chandransh 62
        if sp == '':
63
            sp = mop 
1356 chandransh 64
        item = None
65
        vendor_item_pricing = None
1080 chandransh 66
 
1356 chandransh 67
        key = product_group.strip().lower() + '|' + brand.strip().lower() + '|' + model_number.strip().lower() + '|' + color.strip().lower()
68
        if key in existing_vendor_item_mappings_set:
69
            existing_vendor_item_mappings_set.remove(key)
70
            item = VendorItemMapping.query.filter_by(vendor=vendor, item_key=key, vendor_category=category).one().item
71
 
626 chandransh 72
        if item is None:
1080 chandransh 73
            #print "[ADDING:]{0} {1} {2} {3} to our catalogue.".format(product_group, brand, model_number, color)
74
            new_items.append(rownum)
626 chandransh 75
            item = Item()
1356 chandransh 76
            item.product_group = product_group
1810 chandransh 77
            item.brand = our_brand
78
            item.model_number = our_model_number
79
            item.color = our_color
626 chandransh 80
            item.status = status.IN_PROCESS
81
            item.addedOn = updatedOn
1089 chandransh 82
            item.hotspotCategory = category
1356 chandransh 83
 
1506 chandransh 84
            if category == 'Handsets':
85
                item.preferredWarehouse = 1
86
            else:
87
                item.preferredWarehouse = 2
88
 
1356 chandransh 89
            vendor_item_mapping = VendorItemMapping(vendor=vendor, item=item, item_key=key, vendor_category=category)
1359 chandransh 90
            vendor_item_pricing = VendorItemPricing(vendor=vendor, item=item)
91
 
626 chandransh 92
            session.add(item)
1356 chandransh 93
            session.add(vendor_item_mapping)
1359 chandransh 94
            session.add(vendor_item_pricing)
1080 chandransh 95
 
96
            if catalog_item_id !=None and catalog_item_id != "":
97
                #Add category and entity id
98
                item.catalog_item_id = int(catalog_item_id)
99
                item.category = int(category_id)
100
                item.status = status.ACTIVE
101
            else:
102
                # Check if a similar item already exists in our database
1810 chandransh 103
                similar_item = Item.query.filter_by(product_group=product_group, brand = our_brand, model_number=our_model_number, hotspotCategory=category).first()
1356 chandransh 104
                print "[SIMILAR ITEM FOUND:] FOR {0} {1} {2} {3}".format(product_group, brand, model_number, color)
105
 
1080 chandransh 106
                if similar_item is None or similar_item.catalog_item_id is None:
107
                    # If there is no similar item in the database from before,
108
                    # use the entity_id_generator
109
                    entity_id = EntityIDGenerator.query.first()
110
                    item.catalog_item_id = entity_id.id + 1
111
                    entity_id.id = entity_id.id  + 1
112
                else:
113
                    #If a similar item already exists for a product group, brand and model_number, set it as same.
114
                    item.catalog_item_id = similar_item.catalog_item_id
115
                    item.category = similar_item.category
1356 chandransh 116
                    item.status = similar_item.status
626 chandransh 117
        else:
1356 chandransh 118
            # If this item already existed and one of its price parameters has changed
1278 chandransh 119
            # in which case we add it to the list of updated items for reporting.
1356 chandransh 120
            vendor_item_pricing = VendorItemPricing.get_by(vendor=vendor, item=item)
121
            if vendor_item_pricing is None:
122
                vendor_item_pricing = VendorItemPricing(vendor=vendor, item=item)
123
                session.add(vendor_item_pricing)
124
 
1633 chandransh 125
            if item.mrp != mrp or vendor_item_pricing.dealerPrice != dp or vendor_item_pricing.transfer_price != xfer_price or item.sellingPrice != sp:
126
                updated_items.append(sheet.row_values(rownum)[0:19] + [item.mrp, item.dealerPrice, item.transfer_price])
1080 chandransh 127
 
128
        if category_id !=None and category_id != "":
129
            item.category = int(category_id)
130
 
131
        if dp != "":
132
            item.dealerPrice = dp
133
            item.sellingPrice = dp
1356 chandransh 134
            vendor_item_pricing.dealerPrice = dp
629 rajveer 135
 
1080 chandransh 136
        if mrp != "" and mop != "" and mrp <  mop:
1271 chandransh 137
            raise Exception("[BAD MRP and MOP:] for {0} {1} {2} {3}. MRP={4}. MOP={5}".format(product_group, brand, model_number, color, mrp, mop))
1080 chandransh 138
 
1633 chandransh 139
        if mrp != "" and sp != "" and mrp < sp:
140
            raise Exception("[BAD MRP and SP:] for {0} {1} {2} {3}. MRP={4}. SP={5}".format(product_group, brand, model_number, color, mrp, sp))
141
 
1080 chandransh 142
        if mop != "" and xfer_price != "" and xfer_price > mop:
1271 chandransh 143
            raise Exception("[BAD MOP and TP:] for {0} {1} {2} {3}. TP={4}. MOP={5}".format(product_group, brand, model_number, color, xfer_price, mop))
1320 chandransh 144
#        if mrp != "":
145
#            if item.mrp == None or item.mrp >= mrp:
146
#                item.mrp = mrp
147
#            else:
148
#                raise Exception("[NEW MRP MORE THAN old MRP:] for {0} {1} {2} {3}. Old mrp={4}. New MRP={5}".format(product_group, brand, model_number, color, item.mrp, mrp))
873 rajveer 149
 
1431 chandransh 150
        if mrp != "":
151
            item.mrp = mrp
152
 
629 rajveer 153
        if mop != "":
154
            item.mop = mop
1356 chandransh 155
            vendor_item_pricing.mop = mop
1080 chandransh 156
 
724 chandransh 157
        if xfer_price !="":
158
            item.transfer_price = xfer_price
1356 chandransh 159
            vendor_item_pricing.transfer_price = xfer_price
1080 chandransh 160
 
1431 chandransh 161
        if item.startDate == None or item.startDate == '':
162
            item.startDate = datetime.datetime.now()
1080 chandransh 163
 
1633 chandransh 164
        item.sellingPrice = sp
1080 chandransh 165
        item.model_name = model_name
166
 
629 rajveer 167
        if weight != "":    
168
            item.weight = weight
1264 chandransh 169
#        if start_date != "":
170
#            item.startDate = datetime.datetime(*xlrd.xldate_as_tuple(start_date, workbook.datemode))
1080 chandransh 171
 
172
#        item.bestDealText = deal_text
173
#        if deal_value != "":
174
#            item.bestDealValue = deal_value
175
#        item.comments = comments
176
 
626 chandransh 177
        item.updatedOn = updatedOn
724 chandransh 178
 
179
        item_change_log = ItemChangeLog()
180
        item_change_log.new_status = item.status
181
        item_change_log.timestamp = updatedOn
182
        item_change_log.item = item
1080 chandransh 183
 
184
        if not dry_run:
185
            session.commit()
186
 
1264 chandransh 187
    write_report("new_items.csv", new_items, sheet, False)
188
    write_report("updated_items.csv", updated_items, sheet, True)
1356 chandransh 189
    phased_out_items = [key.split('|') for key in list(existing_vendor_item_mappings_set)]
1264 chandransh 190
    write_report("phased_out_items.csv", phased_out_items, sheet, True)
1080 chandransh 191
 
192
    if (not dry_run) and full_update:
193
        query_string =  "UPDATE " + str(Item.table) + " SET status=" + str(status.PHASED_OUT) + ", updatedOn='"+ str(updatedOn) +"'"+\
194
                        " WHERE updatedOn <> '" + str(updatedOn) + "' AND hotspotCategory='" + category +"'";
195
        session.execute(query_string, mapper=Item)
626 chandransh 196
        session.commit()
197
 
198
    print "Successfully updated the item list information."
199
 
1264 chandransh 200
def write_report(filename, items, sheet, is_item):
1080 chandransh 201
    items_writer = csv.writer(open(filename, "wb"), delimiter=',', quoting=csv.QUOTE_ALL)
1264 chandransh 202
    items_writer.writerow(sheet.row_values(0) + ['Old MRP', 'Old DP', 'Old TP'])
203
    if is_item:
204
        for item in items:
205
            #print item
206
            items_writer.writerow([str(value) for value in item])
207
    else:
208
        for i in items:
209
            #print sheet.row_values(i)
210
            items_writer.writerow([str(value) for value in sheet.row_values(i)])
1080 chandransh 211
 
626 chandransh 212
def main():
213
    parser = optparse.OptionParser()
214
    parser.add_option("-f", "--file", dest="filename",
215
                   default="ItemList.xls", type="string",
216
                   help="Read the item list from FILE",
217
                   metavar="FILE")
1080 chandransh 218
    parser.add_option("-c", "--category", dest="category",
219
                      type="string",
220
                      help="Update the list only for the products belonging to CATEGORY",
221
                      metavar="CATEGORY")
1356 chandransh 222
    parser.add_option("-v", "--vendor", dest="vendor",
223
                      type="int",
224
                      help="Update the pricing information for VENDOR",
225
                      metavar="VENDOR")
1080 chandransh 226
    parser.add_option("-d", "--dry-run", dest="dry_run",
227
                      action="store_true",
228
                      help="Dry run only reporting on pending changes.Please note that some of the items can be reported twice.")
229
    parser.add_option("-a", "--full", dest="full_update",
230
                      action="store_true",
231
                      help="In a full update, all older items are marked as PHASED_OUT. Also see -pm.")
232
    parser.add_option("-p", "--partial", dest="full_update",
233
                      action="store_false",
234
                      help="In a partial update, older items are left as is. Also see -fm.")
1356 chandransh 235
    parser.add_option("-g", "--product-group", dest="product_group",
236
                      type="string",
237
                      help="Set GROUP as the product group for all items added/updated during this run.",
238
                      metavar="GROUP")
239
    parser.set_defaults(full_update=True, dry_run=False, category="Handsets", vendor=1)
626 chandransh 240
    (options, args) = parser.parse_args()
241
    if len(args) != 0:
242
        parser.error("You've supplied extra arguments. Are you sure you want to run this program?")
243
    filename = options.filename
1356 chandransh 244
    load_item_data(filename, options.vendor, options.category, options.full_update, options.dry_run, options.product_group)
626 chandransh 245
 
246
if __name__ == '__main__':
247
    main()