Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
13569 amit.gupta 1
'''
2
Created on Jan 15, 2015
3
 
4
@author: amit
5
'''
13690 amit.gupta 6
from BeautifulSoup import BeautifulSoup
13721 amit.gupta 7
from datetime import datetime, date, timedelta
13569 amit.gupta 8
from dtr import main
14412 amit.gupta 9
from dtr.dao import AffiliateInfo, Order, SubOrder, FlipkartAffiliateInfo
13690 amit.gupta 10
from dtr.main import getBrowserObject, getStore, ParseException, ungzipResponse, \
14398 amit.gupta 11
    Store as MStore, sourceMap, tprint
15539 amit.gupta 12
from dtr.reports.affiliatereco import getSkuData
13
from dtr.storage.DataService import Clicks, Users, FlipkartOrders
14
from dtr.utils.utils import fetchResponseUsingProxy
15
from elixir import *
13690 amit.gupta 16
from pprint import pprint
17
from pymongo.mongo_client import MongoClient
18
import hashlib
13658 manas 19
import importlib
13690 amit.gupta 20
import json
21
import mechanize
14412 amit.gupta 22
import pymongo
13658 manas 23
import re
14338 amit.gupta 24
import traceback
13658 manas 25
import urllib
26
 
27
USERNAME='saholic1@gmail.com'
28
PASSWORD='spice@2020'
29
ORDER_TRACK_URL='https://m.flipkart.com/order_details'
13679 manas 30
AFFILIATE_URL='https://www.flipkart.com/affiliate/login'
13690 amit.gupta 31
AFFILIATE_LOGIN_URL='https://www.flipkart.com/affiliate/a_login'
15630 amit.gupta 32
AFF_REPORT_URL='http://www.flipkart.com/affiliate/reports/ordersReport?order_status_filter=%s&startdate=%s&enddate=%s&page=%s'
13690 amit.gupta 33
AFF_STATUS_CANCELLED='cancelled'
34
AFF_STATUS_APPROVED='approved'
35
AFF_STATUS_DISAPPROVED='disapproved'
36
AFF_STATUS_PENDING='pending'
15539 amit.gupta 37
categoryMap = {3:"Mobiles", 5:"Tablets"}
13658 manas 38
 
13679 manas 39
 
13781 amit.gupta 40
class Store(MStore):
13658 manas 41
    OrderStatusMap = {
14679 amit.gupta 42
                      main.Store.ORDER_PLACED : ['approval', 'processing', 'shipping'],
43
                      main.Store.ORDER_DELIVERED : ['your item has been delivered'],
14680 amit.gupta 44
                      main.Store.ORDER_SHIPPED : ['in transit', 'shipment yet to be delivered'],
45
                      main.Store.ORDER_CANCELLED : ['shipment is returned', 'your item has been returned', 'your shipment has been cancelled', 'your shipment has been cancelled.']
13658 manas 46
 
47
                      }
48
    def __init__(self,store_id):
49
        client = MongoClient('mongodb://localhost:27017/')
50
        self.db = client.dtr
51
        super(Store, self).__init__(store_id)
52
 
13569 amit.gupta 53
    def getName(self):
54
        return "flipkart"
55
 
13690 amit.gupta 56
    def scrapeStoreOrders(self,):
57
        orders = self._getActiveOrders()
13721 amit.gupta 58
        for order in orders:
14692 amit.gupta 59
            print "Order", self.store_name, order['orderId']
14398 amit.gupta 60
            try:
61
                closed = True
62
                url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', order['orderSuccessUrl'],re.IGNORECASE)[0]
14757 amit.gupta 63
                page = fetchResponseUsingProxy(url)
14398 amit.gupta 64
                soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
65
 
66
                sections = soup.findAll("div", {"class":"ui-app-card-body"})
67
                sections.pop(1)
13721 amit.gupta 68
 
14398 amit.gupta 69
                mainOrder = soup.find("ul",{"class":"m-bottom p-cart"})
70
                fkSubOrders = mainOrder.findAll("li")
71
 
72
                #remove unwanted list
73
                fkSubOrders.pop(-1)
74
 
75
 
76
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
77
                #fetching suborders details
78
                for subOrder in fkSubOrders:
79
                    updateMap = {}
80
                    y = subOrder.find("header").findAll("span")
81
                    for suborderId in y:
82
                        if "value emp" in str(suborderId):
83
                            merchantSubOrderId = suborderId.text
84
                            break
14692 amit.gupta 85
                    ul = subOrder.find("ul")
86
                    if ul is None:
87
                        ul = subOrder.findAll("div", recursive=False)[0].div.div
88
                    orderItems = ul.findAll("div", recursive=False)
14398 amit.gupta 89
                    i=0
90
                    for orderItem in orderItems:
91
                        closedStatus = False
92
                        merchantSubOrderId = merchantSubOrderId + str(i)
93
                        subOrder =  self._isSubOrderActive(order, merchantSubOrderId)
94
                        if subOrder is None:
95
                            break
14460 amit.gupta 96
                        elif subOrder['closed']:
97
                            break
14398 amit.gupta 98
                        findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": merchantSubOrderId}
99
                        divs = orderItem.findAll('div', recursive=False)
100
                        orderTracking = divs[2]
101
                        orderTrackingDetDiv = divs[3].find('div',{'class':'c-tabs-content m-top active'})
102
                        orderTrackingDet = orderTrackingDetDiv.find('div',{'class':re.compile('tracking-remark')}).text
103
                        updateMap["subOrders.$.detailedStatus"] = orderTrackingDet
14617 amit.gupta 104
                        status = self._getStatusFromDetailedStatus(orderTrackingDet)
14398 amit.gupta 105
                        tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
106
 
107
                        cashbackStatus = subOrder.get("cashBackStatus") 
108
                        if "approveDetails-complete" in str(tr):
109
                            if "processingDetails-complete" in str(tr):
110
                                if "shippingDetails-complete" in str(tr):
111
                                    if "delivery-complete" in str(tr):
112
                                        status = MStore.ORDER_DELIVERED
113
                                        if cashbackStatus == Store.CB_PENDING:
114
                                            cashbackStatus = Store.CB_APPROVED
115
                                        closedStatus = True
116
                                    else:     
117
                                        status = MStore.ORDER_SHIPPED
118
                                        courierTrackAnchor = orderTrackingDetDiv.find('a')
119
                                        trackingUrl = courierTrackAnchor("href")
120
                                        trackingText = courierTrackAnchor.text
121
                                        courierArr = trackingText.split(' : ')
122
                                        updateMap["subOrders.$.trackingUrl"] = trackingUrl
123
                                        updateMap["subOrders.$.trackingNumber"] = courierArr[1]
124
                                        updateMap["subOrders.$.courierName"] = courierArr[0]
125
                                else:
14692 amit.gupta 126
                                    status = MStore.ORDER_CANCELLED
127
                                    closedStatus = True
128
                                    if cashbackStatus == Store.CB_PENDING:
129
                                        cashbackStatus = Store.CB_CANCELLED
14398 amit.gupta 130
                            else: 
13721 amit.gupta 131
                                status = MStore.ORDER_PLACED
14398 amit.gupta 132
                        elif str(tr) in ["approveDetails-ongoing"]:
133
                            status=MStore.ORDER_PLACED             
14617 amit.gupta 134
                        if "dead" in str(tr) or status==MStore.ORDER_CANCELLED:
14398 amit.gupta 135
                            status = MStore.ORDER_CANCELLED
136
                            closedStatus = True
137
                            if cashbackStatus == Store.CB_PENDING:
138
                                cashbackStatus = Store.CB_CANCELLED
139
 
140
                        updateMap["subOrders.$.cashBackStatus"] = cashbackStatus
141
                        updateMap["subOrders.$.status"] = status
142
                        updateMap["subOrders.$.closed"] = closedStatus
143
                        if closed:
144
                            closed = closedStatus
145
                        bulk.find(findMap).update({'$set' : updateMap})
14692 amit.gupta 146
                bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed, 'parseError':False}})
14398 amit.gupta 147
                bulk.execute()            
148
            except:
14692 amit.gupta 149
                self.db.merchantOrder.update({"orderId":order['orderId']}, {"$set":{"parseError":True}})
14847 amit.gupta 150
                tprint("Could not update " + str(order['orderId']) + ' for store ' + self.getName())
14398 amit.gupta 151
                traceback.print_exc()
13721 amit.gupta 152
    def scrapeAffiliate(self, startDate=None, endDate=None):
153
        #get all yesterday's affiliate in pending or cancelled state and update to system
14461 amit.gupta 154
        offers = []
155
        br = getBrowserObject()
156
        br.open(AFFILIATE_URL)
157
        response = br.response()  # copy
158
        token =  re.findall('window.__FK = "(.*?)"', ungzipResponse(response), re.IGNORECASE)[0]
159
        data = {'__FK':token,
160
                'email':'saholic1@gmail.com',
161
                'password':'e8aacf6fc1e3998186a4a8e56e428f66'
162
        }
163
        br.open(AFFILIATE_LOGIN_URL, urllib.urlencode(data))
15539 amit.gupta 164
        for delta in range(1,2):
14461 amit.gupta 165
            yester5date = date.today() - timedelta(delta)
166
            syester5date = yester5date.strftime('%Y-%m-%d')
167
            for status in [AFF_STATUS_PENDING, AFF_STATUS_CANCELLED, AFF_STATUS_DISAPPROVED]:
15630 amit.gupta 168
                hasPagination=True
169
                page = 0
170
                while hasPagination:
171
                    page +=1
172
                    try:
173
                        br.open(AFF_REPORT_URL % (status, syester5date, syester5date, page))
174
                    except:
175
                        tprint("Could not fetch data for Status %s and date %s"%(status, syester5date))
176
                    page = ungzipResponse(br.response())
177
                    soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
178
                    soup.table
179
                    try:
180
                        tableElement = soup.findAll('table', {'class':'report-table fixtable'})[1]
181
                    except:
182
                        continue
183
                    trElements = tableElement.findAll('tr')
184
                    trElements.pop(0)
185
                    hasPagination = len(trElements) > 0
186
 
187
                    for trElement in trElements:
188
                        tdElements = trElement.findAll('td')
189
                        productCode = re.findall(r'pid=(.*)$', tdElements[0].find('a')['href'])[0]
190
                        quantity =int(tdElements[3].text)
191
                        price = int(float(tdElements[2].text.strip().replace(",","")))
192
                        payOut = int(float(tdElements[6].text.strip().replace(",","")))
193
                        saleAmount = int(float(tdElements[4].text.strip().replace(",","")))
194
                        subTagId = tdElements[7].text.strip()
195
                        category = tdElements[1].text.strip()
196
                        affiliateInfo = FlipkartAffiliateInfo(subTagId, syester5date, productCode, price, quantity, saleAmount, payOut, status, category)
197
                        affiliateInfo.productTitle =  tdElements[0].find('a').text
198
                        #updateMap['subOrders.$.unitPrice'] = price
199
                        #updateMap['subOrders.$.cashBackAmount'], updateMap['subOrders.$.cashBacPercentage'] = self.getCashbackAmount(productCode, price)
200
                        offers.append(affiliateInfo)
14461 amit.gupta 201
        self._saveToAffiliate(offers)
15539 amit.gupta 202
 
203
        yester5date = date.today() - timedelta(1)
204
        syester5date = yester5date.strftime('%Y-%m-%d')
205
        self.db.flipkartOrderAffiliateInfo.find({"saleDate":syester5date})
206
        for order in self.db.flipkartOrderAffiliateInfo.find({"saleDate":syester5date}):
207
            userId = None
208
            subTagId = None
209
            email = None
210
            subTagId = order.get("subTagId")
211
            if subTagId:
212
                click = session.query(Clicks).filter_by(tag = subTagId).first()
213
                if click is not None:
214
                    userId= click.user_id 
215
                    user = session.query(Users.email).filter_by(id = userId).first()
216
                    if user is not None:
217
                        email = user.email
218
 
219
            flipkartOrder = FlipkartOrders()
220
            flipkartOrder.user_id = userId
221
            flipkartOrder.identifier = order.get("identifier")
222
            flipkartOrder.email = email
223
            flipkartOrder.subtagId = order.get("subTagId")
224
            flipkartOrder.created = datetime.strptime(order.get("saleDate"), "%Y-%m-%d")
225
            flipkartOrder.status = order.get("conversionStatus")
226
            flipkartOrder.title = order.get("productTitle")
227
            flipkartOrder.price = order.get("price")
228
            flipkartOrder.quantity = order.get("quantity")
229
            flipkartOrder.productCode = order.get("productCode")
230
            skuData = getSkuData(2, order.get("productCode"))
231
            if skuData is not None:
232
                flipkartOrder.catalogId = skuData.get("skuBundleId")
233
                flipkartOrder.brand = skuData.get("brand")
234
                flipkartOrder.model = skuData.get("model_name")
235
                flipkartOrder.category = categoryMap.get(skuData.get("category_id"))
236
                flipkartOrder.title =skuData.get("source_product_name")
237
 
238
        session.commit()
13721 amit.gupta 239
 
14412 amit.gupta 240
    def _saveToAffiliate(self, offers):
241
        collection = self.db.flipkartOrderAffiliateInfo
14460 amit.gupta 242
        mcollection = self.db.merchantOrder
243
        for offer in offers:
244
            result1 = collection.update({"subTagId":offer.subTagId, "price":offer.price, "quantity":offer.quantity, "saleDate":offer.saleDate, "productCode":offer.productCode},{"$set":todict(offer)}, upsert=True)
245
            if result1.get("upserted") is not None:
246
                result2 = mcollection.update({"subTagId":offer.subTagId, "storeId":self.store_id, "subOrders.missingAff":True, "subOrders.productCode":offer.productCode}, {"$set":{"subOrders.$.missingAff":False}}, multi=True)
247
                if result2.get("updatedExisting") is True:
248
                    mcollection.update({"_id":result1.get("upserted")}, {"missingOrders":False})
249
 
14412 amit.gupta 250
 
251
 
13658 manas 252
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
13796 amit.gupta 253
        resp= {}
13781 amit.gupta 254
        try:
255
            br = getBrowserObject()
256
            url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
257
 
258
            response = br.open(url)
259
            page = ungzipResponse(response)
260
 
261
            merchantOrderId = re.findall('reference_id=(.*?)&', orderSuccessUrl,re.IGNORECASE)[0]
262
            print merchantOrderId
263
 
264
            soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
265
 
266
            sections = soup.findAll("div", {"class":"ui-app-card-body"})
267
            sections.pop(1)
268
 
269
            merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14145 amit.gupta 270
            merchantOrder.orderTrackingUrl = url
13781 amit.gupta 271
            for data in sections:
272
                name = data.findAll("span")
273
                i=0
274
                while i< len(name):
275
                    if "key" in str(name[i]):
276
                        if "Grand Total" in str(name[i]):
277
                            #Total Amount
278
                            merchantOrder.paidAmount = int(re.findall(r'\d+', name[i+1].text)[0])
279
                        elif "Order Date" in str(name[i]):
280
                            merchantOrder.placedOn = name[i+1].text 
281
                    i=i+1    
282
 
283
            merchantOrder.merchantOrderId = merchantOrderId
284
 
285
            mainOrder = soup.find("ul",{"class":"m-bottom p-cart"})
286
            fkSubOrders = mainOrder.findAll("li")
287
            #remove unwanted list
288
            fkSubOrders.pop(-1)
289
            subOrders = []
290
            merchantOrder.subOrders = subOrders
291
 
292
            #fetching suborders details
293
            for subOrder in fkSubOrders:
294
                y = subOrder.find("header").findAll("span")
295
                for suborderId in y:
296
                    if "value emp" in str(suborderId):
297
                        merchantSubOrderId = suborderId.text
298
                        break
299
                orderItems = subOrder.find("ul").findAll("div", recursive=False)
300
                i=0
301
                for orderItem in orderItems:
302
                    merchantOrder.placedOn
303
                    merchantSubOrderId = merchantSubOrderId + str(i)
304
                    divs = orderItem.findAll('div', recursive=False)
305
                    content = divs[0]
306
                    orderTracking = divs[2]
307
                    orderTrackingDet = divs[3]
308
 
309
 
310
                    imgUrl = content.find('img')['src']
311
                    lineDet = content.find("div",{"class":"product-info"})
312
                    productTitle = lineDet.find("a",{"class":"product-title"}).text
313
                    productUrl =  str(lineDet.find("a")['href'])
314
 
315
                    start='pid='
316
                    s=str(lineDet.find("a")['href'])
14339 amit.gupta 317
                    productCode = re.findall(re.escape(start)+"(.*)",s)[0].strip()
13781 amit.gupta 318
                    mname = lineDet.findAll("span")
319
                    k=0
320
                    while k<len(mname):
321
                        if "note" in str(mname[k]):
322
                            if "Color:" in str(mname[k]):
323
                                productTitle = productTitle + " " + mname[k+1].text
324
 
325
                            elif "Qty:" in str(mname[k]):
326
                                quantity = int(mname[k+1].text)
327
                            elif "Subtotal:" in str(mname[k]):
14343 amit.gupta 328
                                amountPaid = int(re.findall(r'\d+', mname[k+1].text)[0])
13781 amit.gupta 329
                            elif "Delivery:" in str(mname[k]):
330
                                #Delivery Date for sub order
331
                                print "Delivery Date " +mname[k+1].text
332
                        k=k+1
14343 amit.gupta 333
                    merchantsubOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid,MStore.ORDER_PLACED, quantity)
13781 amit.gupta 334
                    merchantsubOrder.imgUrl  = imgUrl
335
                    merchantsubOrder.productCode = productCode
336
                    merchantsubOrder.merchantSubOrderId = merchantSubOrderId
14337 amit.gupta 337
                    print "productCode", productCode
14340 amit.gupta 338
                    print "amountPaid", amountPaid
14336 amit.gupta 339
                    cashbackAmount, cashbackPercent = self.getCashbackAmount(productCode, amountPaid)
13781 amit.gupta 340
                    cashbackStatus = Store.CB_PENDING
341
                    if cashbackAmount <= 0:
342
                        cashbackStatus = Store.CB_NA
343
                    merchantsubOrder.cashBackAmount = cashbackAmount
344
                    merchantsubOrder.cashBackStatus = cashbackStatus      
345
                    merchantsubOrder.cashBackPercentage = cashbackPercent      
346
 
347
                    subOrders.append(merchantsubOrder)
348
                    #To track shipping details         
349
                    status=-1    
350
                    tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
351
                    if "approveDetails-complete" in str(tr):
352
                        if "processingDetails-complete" in str(tr):
353
                            if "shippingDetails-complete" in str(tr):
354
                                if "delivery-complete" in str(tr):
355
                                    status = MStore.ORDER_DELIVERED
356
                                else:     
357
                                    status = MStore.ORDER_SHIPPED
358
                                    orderTracking.find('div', {'class':'tracking-remark active'})
359
                            else:
360
                                status = MStore.ORDER_PLACED
361
                        else: 
13690 amit.gupta 362
                            status = MStore.ORDER_PLACED
13781 amit.gupta 363
                    elif str(tr) in ["approveDetails-ongoing"]:
364
                        status=MStore.ORDER_PLACED             
14692 amit.gupta 365
                    if "dead" in str(tr) or "shippingDetails-returnOngoing" in str(tr) or "shippingDetails-return" in str(tr):
13781 amit.gupta 366
                        status = MStore.ORDER_CANCELLED    
367
                    print "Sub Order Status " + str(status)                      
368
 
369
                    trackingDetailsActive = orderTrackingDet.find("div",{"class":"c-tabs-content m-top active"})
370
                    print "Sub order tracking description " + trackingDetailsActive.text
14312 amit.gupta 371
            if self._saveToOrder(todict(merchantOrder)):
372
                resp['result'] = 'ORDER_CREATED'
373
            else:
374
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
375
 
13796 amit.gupta 376
            return resp 
13781 amit.gupta 377
        except:
14338 amit.gupta 378
            traceback.print_exc()
14312 amit.gupta 379
            resp['result'] = 'ORDER_NOT_CREATED'
13796 amit.gupta 380
            return resp 
13781 amit.gupta 381
 
14617 amit.gupta 382
    def _getStatusFromDetailedStatus(self, detailedStatus):
383
        for key, value in Store.OrderStatusMap.iteritems():
14626 amit.gupta 384
            if detailedStatus.lower() in value:
14617 amit.gupta 385
                return key
14676 amit.gupta 386
        print "Detailed Status need to be mapped", detailedStatus, "Store:", self.store_name
14617 amit.gupta 387
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
13658 manas 388
 
389
    def flipkartOrderTracking(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
390
        br = getBrowserObject()
391
        url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
392
 
393
        response = br.open(url)
394
        page = ungzipResponse(response, br)
395
 
396
 
397
        soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
398
 
399
 
400
        mainOrder = soup.findAll("ul",{"class":"m-bottom p-cart"})
401
        #fetching suborders details
402
        for subOrder in mainOrder:
403
            subOrd = subOrder.findAll("li")
404
 
405
            subOrd.pop(len(subOrd)-1)
406
            for productInfo in subOrd:
407
                status=-1    
408
                #To track shipping details         
409
                n = productInfo.findAll("div",{"class":"tracking-progress grid-row cf"})
410
                for trackingStatus in n:
411
                    tr = trackingStatus.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
412
                    if "approveDetails-complete" in str(tr):
13679 manas 413
                        print "Here"
13658 manas 414
                        if "processingDetails-complete" in str(tr):
13679 manas 415
                            print "There"
13658 manas 416
                            if "shippingDetails-complete" in str(tr):
13679 manas 417
                                print "Share"
13658 manas 418
                                if "delivery-complete" in str(tr):
13679 manas 419
                                    print "Last"
13658 manas 420
                                    status = 3
421
                                else:     
422
                                    status = 2
423
                            else:
424
                                status = 1 
425
                        else: 
426
                            status = 0     
427
                    if "dead" in str(tr):
428
                        status = 4    
429
                print status                      
430
 
431
 
432
def _saveToOrderFlipkart(self, order):
433
        collection = self.db.merchantOrder
434
        order = collection.insert(order)
435
 
13690 amit.gupta 436
 
437
 
438
def hex_md5(password):
439
    m = hashlib.md5()
440
    print(m.digest())
441
 
13658 manas 442
def main():
443
 
444
    store = getStore(2)
15630 amit.gupta 445
    store.scrapeAffiliate()
446
    #store.scrapeStoreOrders()
13658 manas 447
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3016502908102575&token=0db4c692bacbfbfc158b52358ac9e91e&src=or&pr=1')
448
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3018701137253850&token=f7402ddcf2b63b37cc6bc528cc115d2f&src=or&pr=1')
13679 manas 449
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
13658 manas 450
    #store.flipkartOrderTracking(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
13679 manas 451
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019365336126533&token=dbce2bd4dc4023295b436a7d3c7986c9&src=or&pr=1')
452
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://dl.flipkart.com/orderresponse?reference_id=OD1019453634552336&token=e8e04871ad65b532aa53fa82bb34b901&src=or&pr=1')
13690 amit.gupta 453
    #hex_md5('spice@2020')
14351 amit.gupta 454
    #store.getCashbackAmount('MOBDVHC6XKKPZ3GZ', 5999)
13679 manas 455
 
13690 amit.gupta 456
 
13658 manas 457
if __name__ == '__main__':
458
        main()
459
 
13690 amit.gupta 460
 
461
 
462
 
13658 manas 463
def todict(obj, classkey=None):
464
    if isinstance(obj, dict):
465
        data = {}
466
        for (k, v) in obj.items():
467
            data[k] = todict(v, classkey)
468
        return data
469
    elif hasattr(obj, "_ast"):
470
        return todict(obj._ast())
471
    elif hasattr(obj, "__iter__"):
472
        return [todict(v, classkey) for v in obj]
473
    elif hasattr(obj, "__dict__"):
474
        data = dict([(key, todict(value, classkey)) 
475
            for key, value in obj.__dict__.iteritems() 
476
            if not callable(value) and not key.startswith('_')])
477
        if classkey is not None and hasattr(obj, "__class__"):
478
            data[classkey] = obj.__class__.__name__
479
        return data
480
    else:
13690 amit.gupta 481
        return obj
482
 
14145 amit.gupta 483