Subversion Repositories SmartDukaan

Rev

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