Subversion Repositories SmartDukaan

Rev

Rev 21273 | Rev 21311 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 21273 Rev 21310
Line 9... Line 9...
9
from dtr.dao import AffiliateInfo, Order, SubOrder, FlipkartAffiliateInfo
9
from dtr.dao import AffiliateInfo, Order, SubOrder, FlipkartAffiliateInfo
10
from dtr.main import getBrowserObject, getStore, ParseException, ungzipResponse, \
10
from dtr.main import getBrowserObject, getStore, ParseException, ungzipResponse, \
11
    Store as MStore, sourceMap, tprint
11
    Store as MStore, sourceMap, tprint
12
from dtr.storage.DataService import Clicks, Users, FlipkartOrders, OrdersRaw
12
from dtr.storage.DataService import Clicks, Users, FlipkartOrders, OrdersRaw
13
from dtr.utils import utils
13
from dtr.utils import utils
14
from dtr.utils.utils import fetchResponseUsingProxy, todict, getSkuData,\
14
from dtr.utils.utils import fetchResponseUsingProxy, todict, getSkuData, \
15
    ORDER_PLACED
15
    ORDER_PLACED
16
from elixir import *
16
from elixir import *
17
from pprint import pprint
17
from pprint import pprint
18
from pymongo.mongo_client import MongoClient
18
from pymongo.mongo_client import MongoClient
-
 
19
from urlparse import urlparse
19
import StringIO
20
import StringIO
20
import csv
21
import csv
21
import hashlib
22
import hashlib
22
import importlib
23
import importlib
23
import json
24
import json
24
import mechanize
25
import mechanize
25
import pymongo
26
import pymongo
26
import re
27
import re
-
 
28
import time
27
import traceback
29
import traceback
28
import urllib
30
import urllib
29
import urllib2
31
import urllib2
30
from urlparse import urlparse
-
 
31
import zipfile
32
import zipfile
32
USERNAME='saholic1@gmail.com'
33
USERNAME='saholic1@gmail.com'
33
PASSWORD='spice@2020'
34
PASSWORD='spice@2020'
34
ORDER_TRACK_URL='https://www.flipkart.com/order_details?src=or&pr=1&type=physical&'
35
ORDER_TRACK_URL='https://www.flipkart.com/order_details?src=or&pr=1&type=physical&'
35
AFFILIATE_URL='https://affiliate.flipkart.com/'
36
AFFILIATE_URL='https://affiliate.flipkart.com/'
Line 86... Line 87...
86
        super(Store, self).__init__(store_id)
87
        super(Store, self).__init__(store_id)
87
 
88
 
88
    def getName(self):
89
    def getName(self):
89
        return "flipkart"
90
        return "flipkart"
90
    
91
    
-
 
92
    def _parseJSON(self,merchantOrder, transaction):
-
 
93
        update = False
-
 
94
        if not merchantOrder.subOrders:
-
 
95
            merchantOrder.placedOn = transaction['orderDate'] 
-
 
96
            merchantOrder.paidAmount = transaction['amount']
-
 
97
            subOrders = []
-
 
98
            merchantOrder.subOrders = subOrders
-
 
99
            for shipment in transaction['groupedItems']:
-
 
100
                for item in shipment:
-
 
101
                    productUrl = "https://www.flipkart.com/" + item['itemMetadata']
-
 
102
                    merchantsubOrder = SubOrder(item['title']+ item['itemMetadata']['color'], productUrl, merchantOrder.placedOn, item['amount'],MStore.ORDER_PLACED, item['quantity'])
-
 
103
                    merchantsubOrder.merchantSubOrderId = item['orderItemId']
-
 
104
                    merchantsubOrder.imgUrl  = item['itemMetadata']['images']['1000x1000']
-
 
105
                    productCode=productUrl.split("pid=")[1]
-
 
106
                    merchantsubOrder.productCode = productCode
-
 
107
                    merchantsubOrder.merchantSubOrderId = item['orderItemId']
-
 
108
                    merchantsubOrder.amount = item['sellingPrice']*merchantsubOrder.quantity
-
 
109
                    merchantsubOrder.unitPrice = item['sellingPrice']
-
 
110
                    merchantsubOrder.detailedStatus = item['desktopSubStatus']
-
 
111
                    subOrders.append(merchantsubOrder)
-
 
112
        else:
-
 
113
            update = True
-
 
114
            for shipment in transaction['groupedItems']:
-
 
115
                for item in shipment:
-
 
116
                    subOrder = self._isSubOrderActive(merchantOrder,  item['orderItemId'])
-
 
117
                    if subOrder:
-
 
118
                        subOrder.detailedStatus = item['desktopSubStatus']
-
 
119
        
-
 
120
        self.populateDerivedFields(merchantOrder, update)
-
 
121
    
-
 
122
    def _getActiveOrders(self, searchMap={}, collectionMap={}):
-
 
123
        collection = self.db.merchantOrder
-
 
124
        searchMap = dict(searchMap.items()+ {"closed": False, "storeId" : self.store_id}.items()) 
-
 
125
        #collectionMap =  dict(collectionMap.items() + {"orderSuccessUrl":1, "orderId":1,"subOrders":1, "placedOn":1, "orderTracking"}.items())
-
 
126
        stores = collection.find(searchMap)
-
 
127
        return [store for store in stores]    
-
 
128
    
-
 
129
    
91
    def trackOrdersForUser(self, userId, url, rawHtml):
130
    def trackOrdersForUser(self, userId, url, rawHtml):
92
        rawHtml = re.sub(r'[^\x00-\x7F]+',' ', rawHtml)
131
        rawHtml = re.sub(r'[^\x00-\x7F]+',' ', rawHtml)
93
        if url not in TRACK_URLS:
132
        if url not in TRACK_URLS:
94
            for lis in re.findall('SN:"(.*?)"', rawHtml):
133
            for lis in re.findall('SN:"(.*?)"', rawHtml):
95
                TRACK_HEADERS['sn'] = lis
134
                TRACK_HEADERS['sn'] = lis
96
                break
135
                break
97
            for lis in re.findall('SN:"(.*?)"', rawHtml):
136
            for lis in re.findall('SN:"(.*?)"', rawHtml):
98
                TRACK_HEADERS['User-Agent'] = lis.split(" fkUA")[0]
137
                TRACK_HEADERS['User-Agent'] = lis.split(" fkUA")[0]
99
                TRACK_HEADERS['x-user-agent'] = lis
138
                TRACK_HEADERS['x-user-agent'] = lis
100
                break
139
                break
-
 
140
            if self._getActiveOrders({"createdOnInt":int(time.mktime(datetime.now().timetuple()))}):
-
 
141
                return {"headers":TRACK_HEADERS, "urls":TRACK_URLS}
101
            
142
            else:
102
            return {"headers":TRACK_HEADERS, "urls":TRACK_URLS}
143
                return {"headers":TRACK_HEADERS, "urls":[]}
103
        else:
144
        else:
-
 
145
            jsonObject = json.loads(rawHtml)
-
 
146
            #Get only orders less than one month old
-
 
147
            activeOrders = self._getActiveOrders({"createdOnInt":{"$gt":int(time.mktime(datetime.now().timetuple() - 30*86400))}})
-
 
148
            for order in activeOrders:
-
 
149
                for transaction in jsonObject['RESPONSE']['orderGranularDetails']:
-
 
150
                    if transaction['orderId'][:-3] == order["mechantOrderId"]:
-
 
151
                        self._parseJSON(order, transaction)
-
 
152
                        break
-
 
153
                
-
 
154
                
-
 
155
                
104
            return 'PARSED_SUCCESS'
156
            return 'PARSED_SUCCESS'
105
            #parse json here
-
 
106
            #jsonObject = json.loads(readSSh("/home/amit/node/serve/res.json"))
-
 
107
 
157
 
108
    
158
    
109
    def requestDownload(self):
159
    def requestDownload(self):
110
    #"https://affiliate.flipkart.com/downloads/a_downloadRequest?type=OrdersReport&parameters=%7B%22filter%22%3A%22approved%22%2C%22till%22%3A%222015-10-03%22%2C%22from%22%3A%222015-04-03%22%7D"
160
    #"https://affiliate.flipkart.com/downloads/a_downloadRequest?type=OrdersReport&parameters=%7B%22filter%22%3A%22approved%22%2C%22till%22%3A%222015-10-03%22%2C%22from%22%3A%222015-04-03%22%7D"
111
        requestReportUrl = "https://affiliate.flipkart.com/downloads/a_downloadRequest?type=OrdersReport&parameters=%s"
161
        requestReportUrl = "https://affiliate.flipkart.com/downloads/a_downloadRequest?type=OrdersReport&parameters=%s"
Line 315... Line 365...
315
                "_id":affiliateorderitemid
365
                "_id":affiliateorderitemid
316
        }
366
        }
317
        return saleMap
367
        return saleMap
318
            
368
            
319
            
369
            
320
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
370
def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
321
        resp= {}
371
    resp= {}
322
        try:
372
    try:
323
            merchantOrderId = re.findall('reference_id=(.*?)&', orderSuccessUrl,re.IGNORECASE)[0]
-
 
324
            if len(self.db.merchantOrder.find({"merchantOrderId":merchantOrderId})) == 0:
-
 
325
                br = getBrowserObject(mobileAgent)
-
 
326
                url = ORDER_TRACK_URL + urlparse(orderSuccessUrl).query 
373
        url = ORDER_TRACK_URL + urlparse(orderSuccessUrl).query 
327
               
-
 
328
                response = br.open(url)
-
 
329
                page = ungzipResponse(response)
-
 
330
                
-
 
331
                print merchantOrderId
-
 
332
                
-
 
333
                soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
-
 
334
                
-
 
335
                sections = soup.findAll("div", {"class":"ui-app-card-body"})
-
 
336
                sections.pop(1)
-
 
337
        
-
 
338
                merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
374
        merchantOrderId = re.findall('reference_id=(.*?)&', orderSuccessUrl,re.IGNORECASE)[0]
339
                merchantOrder.closed = True
-
 
340
                merchantOrder.orderTrackingUrl = url
-
 
341
                for data in sections:
-
 
342
                    name = data.findAll("span")
-
 
343
                    i=0
-
 
344
                    while i< len(name):
-
 
345
                        if "key" in str(name[i]):
-
 
346
                            if "Grand Total" in str(name[i]):
-
 
347
                                #Total Amount
-
 
348
                                merchantOrder.paidAmount = int(re.findall(r'\d+', name[i+1].text)[0])
-
 
349
                            elif "Order Date" in str(name[i]):
-
 
350
                                merchantOrder.placedOn = name[i+1].text 
-
 
351
                        i=i+1    
-
 
352
                
-
 
353
                merchantOrder.merchantOrderId = merchantOrderId
-
 
354
        
-
 
355
                mainOrder = soup.find("ul",{"class":"m-bottom p-cart"})
-
 
356
                fkSubOrders = mainOrder.findAll("li")
-
 
357
                #remove unwanted list
-
 
358
                fkSubOrders.pop(-1)
-
 
359
                subOrders = []
-
 
360
                merchantOrder.subOrders = subOrders
-
 
361
        
-
 
362
                for subOrder in fkSubOrders:
-
 
363
                    orderItems = subOrder.findAll("div", "product-list-item", recursive=True)
-
 
364
                    for orderItem in orderItems:
-
 
365
                        if not orderItem.has_key("id"):
-
 
366
                            continue
-
 
367
                        divs = orderItem.findAll('div', recursive=False)
-
 
368
                        content = divs[0]
-
 
369
                        orderTracking = divs[2]
-
 
370
                        merchantSubOrderId = divs[3].get('id')
-
 
371
                        imgUrl = content.find('img')['src']
-
 
372
                        lineDet = content.find("div",{"class":"product-info"})
-
 
373
                        productTitle = lineDet.find("a",{"class":"product-title"}).text
-
 
374
                        productUrl =  str(lineDet.find("a")['href'])
-
 
375
        
-
 
376
                        start='pid='
-
 
377
                        s=str(lineDet.find("a")['href'])
-
 
378
                        productCode = re.findall(re.escape(start)+"(.*)",s)[0].strip()
-
 
379
                        mname = lineDet.findAll("span")
-
 
380
                        k=0
-
 
381
                        while k<len(mname):
-
 
382
                            if "note" in str(mname[k]):
-
 
383
                                if "Color:" in str(mname[k]):
-
 
384
                                    productTitle = productTitle + " " + mname[k+1].text
-
 
385
                                    
-
 
386
                                elif "Qty:" in str(mname[k]):
-
 
387
                                    quantity = int(mname[k+1].text)
-
 
388
                                elif "Subtotal:" in str(mname[k]):
-
 
389
                                    amountPaid = int(re.findall(r'\d+', mname[k+1].text)[0])
-
 
390
                                elif "Delivery:" in str(mname[k]):
-
 
391
                                    #Delivery Date for sub order
-
 
392
                                    print "Delivery Date " +mname[k+1].text
-
 
393
                            k=k+1
-
 
394
                        merchantsubOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid,MStore.ORDER_PLACED, quantity)
-
 
395
                        merchantsubOrder.imgUrl  = imgUrl
-
 
396
                        merchantsubOrder.productCode = productCode
-
 
397
                        merchantsubOrder.merchantSubOrderId = merchantSubOrderId
-
 
398
                        print "productCode", productCode
-
 
399
                        print "amountPaid", amountPaid
-
 
400
                        cashbackAmount, cashbackPercent = self.getCashbackAmount(productCode, amountPaid)
-
 
401
                        cashbackStatus = Store.CB_PENDING
-
 
402
                        if cashbackAmount <= 0:
-
 
403
                            cashbackStatus = Store.CB_NA
-
 
404
                        merchantsubOrder.cashBackAmount = cashbackAmount
-
 
405
                        merchantsubOrder.cashBackStatus = cashbackStatus      
-
 
406
                        merchantsubOrder.cashBackPercentage = cashbackPercent
-
 
407
                        activePart = orderItem.find("div", "c-tabs-content m-top active")
-
 
408
                        if activePart is not None:
-
 
409
                            merchantsubOrder.detailedStatus = str(activePart.find("div", "tracking-remark").text)   
-
 
410
                        
-
 
411
                        #To track shipping details         
-
 
412
                        status=ORDER_PLACED
-
 
413
                        tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
-
 
414
                        if "approveDetails-ongoing" in str(tr) or "processingDetails-ongoing" in str(tr):
-
 
415
                            pass
-
 
416
                        elif "shippingDetails-ongoing" in str(tr):
-
 
417
                            status = MStore.ORDER_SHIPPED
-
 
418
                        elif "delivery-complete" in str(tr):
-
 
419
                            status = MStore.ORDER_DELIVERED
-
 
420
                            if cashbackStatus!=MStore.CB_NA:
-
 
421
                                merchantsubOrder.cashBackStatus = MStore.CB_APPROVED
-
 
422
                            merchantsubOrder.closed = True
-
 
423
                        if "dead" in str(tr) or "shippingDetails-returnOngoing" in str(tr) or "shippingDetails-return" in str(tr):
-
 
424
                            status = MStore.ORDER_CANCELLED
-
 
425
                            if merchantsubOrder.cashBackStatus != MStore.CB_NA:    
-
 
426
                                merchantsubOrder.cashBackStatus = MStore.CB_CANCELLED
-
 
427
                            merchantsubOrder.closed = True
-
 
428
                        print "Sub Order Status " + str(status)
-
 
429
                        merchantsubOrder.status=status
-
 
430
                        if merchantOrder.closed:
-
 
431
                            merchantOrder.closed = merchantsubOrder.closed 
-
 
432
                        subOrders.append(merchantsubOrder)
-
 
433
    
375
    
-
 
376
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
-
 
377
        merchantOrder.closed = False
434
                if self._saveToOrder(todict(merchantOrder)):
378
        merchantOrder.merchantOrderId = merchantOrderId
435
                    resp['result'] = 'ORDER_CREATED'
379
        merchantOrder.orderTrackingUrl = url
436
                else:
380
        merchantOrder.requireDetail = True
-
 
381
        if self._saveToOrder(todict(merchantOrder)):
437
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
382
            resp['result'] = 'ORDER_CREATED'
438
            else:
383
        else:
439
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
384
            resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
440
                
385
            
441
            return resp 
386
        return resp 
442
        except:
387
    except:
443
            traceback.print_exc()
388
        traceback.print_exc()
444
            resp['result'] = 'ORDER_NOT_CREATED'
389
        resp['result'] = 'ORDER_NOT_CREATED'
445
            return resp 
390
        return resp 
-
 
391
        
-
 
392
 
446
            
393
            
447
    def _getStatusFromDetailedStatus(self, detailedStatus):
394
    def _getStatusFromDetailedStatus(self, detailedStatus):
448
        for key, value in Store.OrderStatusMap.iteritems():
395
        for key, value in Store.OrderStatusMap.iteritems():
449
            if detailedStatus.lower() in value:
396
            if detailedStatus.lower() in value:
450
                return key
397
                return key