Subversion Repositories SmartDukaan

Rev

Rev 14847 | Rev 15630 | 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'
32
AFF_REPORT_URL='http://www.flipkart.com/affiliate/reports/ordersReport?order_status_filter=%s&startdate=%s&enddate=%s'
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]:
168
                try:
169
                    br.open(AFF_REPORT_URL % (status, syester5date, syester5date))
170
                except:
171
                    tprint("Could not fetch data for Status %s and date %s"%(status, syester5date))
172
                page = ungzipResponse(br.response())
173
                soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
174
                soup.table
175
                try:
176
                    tableElement = soup.findAll('table', {'class':'report-table fixtable'})[1]
177
                except:
178
                    continue
179
                trElements = tableElement.findAll('tr')
180
                trElements.pop(0)
181
                for trElement in trElements:
182
                    tdElements = trElement.findAll('td')
183
                    productCode = re.findall(r'pid=(.*)$', tdElements[0].find('a')['href'])[0]
184
                    quantity =int(tdElements[3].text)
185
                    price = int(float(tdElements[2].text.strip().replace(",","")))
186
                    payOut = int(float(tdElements[6].text.strip().replace(",","")))
187
                    saleAmount = int(float(tdElements[4].text.strip().replace(",","")))
188
                    subTagId = tdElements[7].text.strip()
189
                    category = tdElements[1].text.strip()
14648 amit.gupta 190
                    affiliateInfo = FlipkartAffiliateInfo(subTagId, syester5date, productCode, price, quantity, saleAmount, payOut, status, category)
191
                    affiliateInfo.productTitle =  tdElements[0].find('a').text
14461 amit.gupta 192
                    #updateMap['subOrders.$.unitPrice'] = price
193
                    #updateMap['subOrders.$.cashBackAmount'], updateMap['subOrders.$.cashBacPercentage'] = self.getCashbackAmount(productCode, price)
194
                    offers.append(affiliateInfo)
195
        self._saveToAffiliate(offers)
15539 amit.gupta 196
 
197
        yester5date = date.today() - timedelta(1)
198
        syester5date = yester5date.strftime('%Y-%m-%d')
199
        self.db.flipkartOrderAffiliateInfo.find({"saleDate":syester5date})
200
        for order in self.db.flipkartOrderAffiliateInfo.find({"saleDate":syester5date}):
201
            userId = None
202
            subTagId = None
203
            email = None
204
            subTagId = order.get("subTagId")
205
            if subTagId:
206
                click = session.query(Clicks).filter_by(tag = subTagId).first()
207
                if click is not None:
208
                    userId= click.user_id 
209
                    user = session.query(Users.email).filter_by(id = userId).first()
210
                    if user is not None:
211
                        email = user.email
212
 
213
            flipkartOrder = FlipkartOrders()
214
            flipkartOrder.user_id = userId
215
            flipkartOrder.identifier = order.get("identifier")
216
            flipkartOrder.email = email
217
            flipkartOrder.subtagId = order.get("subTagId")
218
            flipkartOrder.created = datetime.strptime(order.get("saleDate"), "%Y-%m-%d")
219
            flipkartOrder.status = order.get("conversionStatus")
220
            flipkartOrder.title = order.get("productTitle")
221
            flipkartOrder.price = order.get("price")
222
            flipkartOrder.quantity = order.get("quantity")
223
            flipkartOrder.productCode = order.get("productCode")
224
            skuData = getSkuData(2, order.get("productCode"))
225
            if skuData is not None:
226
                flipkartOrder.catalogId = skuData.get("skuBundleId")
227
                flipkartOrder.brand = skuData.get("brand")
228
                flipkartOrder.model = skuData.get("model_name")
229
                flipkartOrder.category = categoryMap.get(skuData.get("category_id"))
230
                flipkartOrder.title =skuData.get("source_product_name")
231
 
232
        session.commit()
13721 amit.gupta 233
 
14412 amit.gupta 234
    def _saveToAffiliate(self, offers):
235
        collection = self.db.flipkartOrderAffiliateInfo
14460 amit.gupta 236
        mcollection = self.db.merchantOrder
237
        for offer in offers:
238
            result1 = collection.update({"subTagId":offer.subTagId, "price":offer.price, "quantity":offer.quantity, "saleDate":offer.saleDate, "productCode":offer.productCode},{"$set":todict(offer)}, upsert=True)
239
            if result1.get("upserted") is not None:
240
                result2 = mcollection.update({"subTagId":offer.subTagId, "storeId":self.store_id, "subOrders.missingAff":True, "subOrders.productCode":offer.productCode}, {"$set":{"subOrders.$.missingAff":False}}, multi=True)
241
                if result2.get("updatedExisting") is True:
242
                    mcollection.update({"_id":result1.get("upserted")}, {"missingOrders":False})
243
 
14412 amit.gupta 244
 
245
 
13658 manas 246
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
13796 amit.gupta 247
        resp= {}
13781 amit.gupta 248
        try:
249
            br = getBrowserObject()
250
            url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
251
 
252
            response = br.open(url)
253
            page = ungzipResponse(response)
254
 
255
            merchantOrderId = re.findall('reference_id=(.*?)&', orderSuccessUrl,re.IGNORECASE)[0]
256
            print merchantOrderId
257
 
258
            soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
259
 
260
            sections = soup.findAll("div", {"class":"ui-app-card-body"})
261
            sections.pop(1)
262
 
263
            merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14145 amit.gupta 264
            merchantOrder.orderTrackingUrl = url
13781 amit.gupta 265
            for data in sections:
266
                name = data.findAll("span")
267
                i=0
268
                while i< len(name):
269
                    if "key" in str(name[i]):
270
                        if "Grand Total" in str(name[i]):
271
                            #Total Amount
272
                            merchantOrder.paidAmount = int(re.findall(r'\d+', name[i+1].text)[0])
273
                        elif "Order Date" in str(name[i]):
274
                            merchantOrder.placedOn = name[i+1].text 
275
                    i=i+1    
276
 
277
            merchantOrder.merchantOrderId = merchantOrderId
278
 
279
            mainOrder = soup.find("ul",{"class":"m-bottom p-cart"})
280
            fkSubOrders = mainOrder.findAll("li")
281
            #remove unwanted list
282
            fkSubOrders.pop(-1)
283
            subOrders = []
284
            merchantOrder.subOrders = subOrders
285
 
286
            #fetching suborders details
287
            for subOrder in fkSubOrders:
288
                y = subOrder.find("header").findAll("span")
289
                for suborderId in y:
290
                    if "value emp" in str(suborderId):
291
                        merchantSubOrderId = suborderId.text
292
                        break
293
                orderItems = subOrder.find("ul").findAll("div", recursive=False)
294
                i=0
295
                for orderItem in orderItems:
296
                    merchantOrder.placedOn
297
                    merchantSubOrderId = merchantSubOrderId + str(i)
298
                    divs = orderItem.findAll('div', recursive=False)
299
                    content = divs[0]
300
                    orderTracking = divs[2]
301
                    orderTrackingDet = divs[3]
302
 
303
 
304
                    imgUrl = content.find('img')['src']
305
                    lineDet = content.find("div",{"class":"product-info"})
306
                    productTitle = lineDet.find("a",{"class":"product-title"}).text
307
                    productUrl =  str(lineDet.find("a")['href'])
308
 
309
                    start='pid='
310
                    s=str(lineDet.find("a")['href'])
14339 amit.gupta 311
                    productCode = re.findall(re.escape(start)+"(.*)",s)[0].strip()
13781 amit.gupta 312
                    mname = lineDet.findAll("span")
313
                    k=0
314
                    while k<len(mname):
315
                        if "note" in str(mname[k]):
316
                            if "Color:" in str(mname[k]):
317
                                productTitle = productTitle + " " + mname[k+1].text
318
 
319
                            elif "Qty:" in str(mname[k]):
320
                                quantity = int(mname[k+1].text)
321
                            elif "Subtotal:" in str(mname[k]):
14343 amit.gupta 322
                                amountPaid = int(re.findall(r'\d+', mname[k+1].text)[0])
13781 amit.gupta 323
                            elif "Delivery:" in str(mname[k]):
324
                                #Delivery Date for sub order
325
                                print "Delivery Date " +mname[k+1].text
326
                        k=k+1
14343 amit.gupta 327
                    merchantsubOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid,MStore.ORDER_PLACED, quantity)
13781 amit.gupta 328
                    merchantsubOrder.imgUrl  = imgUrl
329
                    merchantsubOrder.productCode = productCode
330
                    merchantsubOrder.merchantSubOrderId = merchantSubOrderId
14337 amit.gupta 331
                    print "productCode", productCode
14340 amit.gupta 332
                    print "amountPaid", amountPaid
14336 amit.gupta 333
                    cashbackAmount, cashbackPercent = self.getCashbackAmount(productCode, amountPaid)
13781 amit.gupta 334
                    cashbackStatus = Store.CB_PENDING
335
                    if cashbackAmount <= 0:
336
                        cashbackStatus = Store.CB_NA
337
                    merchantsubOrder.cashBackAmount = cashbackAmount
338
                    merchantsubOrder.cashBackStatus = cashbackStatus      
339
                    merchantsubOrder.cashBackPercentage = cashbackPercent      
340
 
341
                    subOrders.append(merchantsubOrder)
342
                    #To track shipping details         
343
                    status=-1    
344
                    tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
345
                    if "approveDetails-complete" in str(tr):
346
                        if "processingDetails-complete" in str(tr):
347
                            if "shippingDetails-complete" in str(tr):
348
                                if "delivery-complete" in str(tr):
349
                                    status = MStore.ORDER_DELIVERED
350
                                else:     
351
                                    status = MStore.ORDER_SHIPPED
352
                                    orderTracking.find('div', {'class':'tracking-remark active'})
353
                            else:
354
                                status = MStore.ORDER_PLACED
355
                        else: 
13690 amit.gupta 356
                            status = MStore.ORDER_PLACED
13781 amit.gupta 357
                    elif str(tr) in ["approveDetails-ongoing"]:
358
                        status=MStore.ORDER_PLACED             
14692 amit.gupta 359
                    if "dead" in str(tr) or "shippingDetails-returnOngoing" in str(tr) or "shippingDetails-return" in str(tr):
13781 amit.gupta 360
                        status = MStore.ORDER_CANCELLED    
361
                    print "Sub Order Status " + str(status)                      
362
 
363
                    trackingDetailsActive = orderTrackingDet.find("div",{"class":"c-tabs-content m-top active"})
364
                    print "Sub order tracking description " + trackingDetailsActive.text
14312 amit.gupta 365
            if self._saveToOrder(todict(merchantOrder)):
366
                resp['result'] = 'ORDER_CREATED'
367
            else:
368
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
369
 
13796 amit.gupta 370
            return resp 
13781 amit.gupta 371
        except:
14338 amit.gupta 372
            traceback.print_exc()
14312 amit.gupta 373
            resp['result'] = 'ORDER_NOT_CREATED'
13796 amit.gupta 374
            return resp 
13781 amit.gupta 375
 
14617 amit.gupta 376
    def _getStatusFromDetailedStatus(self, detailedStatus):
377
        for key, value in Store.OrderStatusMap.iteritems():
14626 amit.gupta 378
            if detailedStatus.lower() in value:
14617 amit.gupta 379
                return key
14676 amit.gupta 380
        print "Detailed Status need to be mapped", detailedStatus, "Store:", self.store_name
14617 amit.gupta 381
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
13658 manas 382
 
383
    def flipkartOrderTracking(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
384
        br = getBrowserObject()
385
        url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
386
 
387
        response = br.open(url)
388
        page = ungzipResponse(response, br)
389
 
390
 
391
        soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
392
 
393
 
394
        mainOrder = soup.findAll("ul",{"class":"m-bottom p-cart"})
395
        #fetching suborders details
396
        for subOrder in mainOrder:
397
            subOrd = subOrder.findAll("li")
398
 
399
            subOrd.pop(len(subOrd)-1)
400
            for productInfo in subOrd:
401
                status=-1    
402
                #To track shipping details         
403
                n = productInfo.findAll("div",{"class":"tracking-progress grid-row cf"})
404
                for trackingStatus in n:
405
                    tr = trackingStatus.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
406
                    if "approveDetails-complete" in str(tr):
13679 manas 407
                        print "Here"
13658 manas 408
                        if "processingDetails-complete" in str(tr):
13679 manas 409
                            print "There"
13658 manas 410
                            if "shippingDetails-complete" in str(tr):
13679 manas 411
                                print "Share"
13658 manas 412
                                if "delivery-complete" in str(tr):
13679 manas 413
                                    print "Last"
13658 manas 414
                                    status = 3
415
                                else:     
416
                                    status = 2
417
                            else:
418
                                status = 1 
419
                        else: 
420
                            status = 0     
421
                    if "dead" in str(tr):
422
                        status = 4    
423
                print status                      
424
 
425
 
426
def _saveToOrderFlipkart(self, order):
427
        collection = self.db.merchantOrder
428
        order = collection.insert(order)
429
 
13690 amit.gupta 430
 
431
 
432
def hex_md5(password):
433
    m = hashlib.md5()
434
    print(m.digest())
435
 
13658 manas 436
def main():
437
 
438
    store = getStore(2)
14692 amit.gupta 439
    #store.scrapeAffiliate()
440
    store.scrapeStoreOrders()
13658 manas 441
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3016502908102575&token=0db4c692bacbfbfc158b52358ac9e91e&src=or&pr=1')
442
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3018701137253850&token=f7402ddcf2b63b37cc6bc528cc115d2f&src=or&pr=1')
13679 manas 443
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
13658 manas 444
    #store.flipkartOrderTracking(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
13679 manas 445
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019365336126533&token=dbce2bd4dc4023295b436a7d3c7986c9&src=or&pr=1')
446
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://dl.flipkart.com/orderresponse?reference_id=OD1019453634552336&token=e8e04871ad65b532aa53fa82bb34b901&src=or&pr=1')
13690 amit.gupta 447
    #hex_md5('spice@2020')
14351 amit.gupta 448
    #store.getCashbackAmount('MOBDVHC6XKKPZ3GZ', 5999)
13679 manas 449
 
13690 amit.gupta 450
 
13658 manas 451
if __name__ == '__main__':
452
        main()
453
 
13690 amit.gupta 454
 
455
 
456
 
13658 manas 457
def todict(obj, classkey=None):
458
    if isinstance(obj, dict):
459
        data = {}
460
        for (k, v) in obj.items():
461
            data[k] = todict(v, classkey)
462
        return data
463
    elif hasattr(obj, "_ast"):
464
        return todict(obj._ast())
465
    elif hasattr(obj, "__iter__"):
466
        return [todict(v, classkey) for v in obj]
467
    elif hasattr(obj, "__dict__"):
468
        data = dict([(key, todict(value, classkey)) 
469
            for key, value in obj.__dict__.iteritems() 
470
            if not callable(value) and not key.startswith('_')])
471
        if classkey is not None and hasattr(obj, "__class__"):
472
            data[classkey] = obj.__class__.__name__
473
        return data
474
    else:
13690 amit.gupta 475
        return obj
476
 
14145 amit.gupta 477