Subversion Repositories SmartDukaan

Rev

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