Subversion Repositories SmartDukaan

Rev

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