Subversion Repositories SmartDukaan

Rev

Rev 14608 | Rev 14650 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13774 amit.gupta 1
# coding=utf-8
13569 amit.gupta 2
'''
3
Created on Jan 15, 2015
4
 
5
@author: amit
6
'''
13774 amit.gupta 7
from base64 import encode
8
from bs4 import BeautifulSoup
14162 amit.gupta 9
from datetime import datetime
13774 amit.gupta 10
from dtr.dao import Order, SubOrder
14464 amit.gupta 11
from dtr.main import getStore, Store as MStore, ParseException, getBrowserObject, \
14624 amit.gupta 12
    ungzipResponse, tprint
13774 amit.gupta 13
from dtr.sources.flipkart import todict
14162 amit.gupta 14
from paramiko import sftp
15
from paramiko.client import SSHClient
16
from paramiko.sftp_client import SFTPClient
14624 amit.gupta 17
import mechanize
14285 amit.gupta 18
import os.path
14162 amit.gupta 19
import paramiko
13774 amit.gupta 20
import re
14033 amit.gupta 21
import time
13809 amit.gupta 22
import traceback
13774 amit.gupta 23
 
24
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
13810 amit.gupta 25
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
13823 amit.gupta 26
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
14624 amit.gupta 27
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
13774 amit.gupta 28
class Store(MStore):
13821 amit.gupta 29
 
14032 amit.gupta 30
    orderStatusRegexMap = { MStore.ORDER_PLACED : ['ordered from', 'not yet dispatched','dispatching now', 'preparing for dispatch'],
14064 amit.gupta 31
                            MStore.ORDER_SHIPPED : ['dispatched on','dispatched', 'on the way', 'out for delivery', 'Out for delivery'],
14032 amit.gupta 32
                            MStore.ORDER_CANCELLED : ['return complete', 'refunded', 'cancelled'],
33
                            MStore.ORDER_DELIVERED : ['delivered']
13821 amit.gupta 34
                           }
13774 amit.gupta 35
 
36
    def __init__(self,store_id):
37
        super(Store, self).__init__(store_id)
38
 
39
    def getName(self):
40
        return "flipkart"
41
 
14202 amit.gupta 42
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl, insert=False):
13796 amit.gupta 43
        resp = {}
13821 amit.gupta 44
        if ORDER_SUCCESS_URL in orderSuccessUrl or THANKYOU_URL in orderSuccessUrl:
13774 amit.gupta 45
            try:
46
                soup = BeautifulSoup(rawHtml)
14608 amit.gupta 47
                try:
48
                    orderUrl = soup.find('div', {"id":"thank-you-box-wrapper"}).div.findAll('div', recursive=False)[1].a['href']
49
                    merchantOrderId = re.findall(r'.*&oid=(.*)&?.*?', orderUrl)[0]
50
                except:
51
                    merchantOrderId = soup.find(id="orders-list").div.span.b.text
14211 amit.gupta 52
                order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, False)
53
                order.orderSuccessUrl = ORDER_REDIRECT_URL % (merchantOrderId)
54
                order.merchantOrderId = merchantOrderId
14291 amit.gupta 55
                order.requireDetail = True
14297 amit.gupta 56
                order.closed = None
14312 amit.gupta 57
                if self._saveToOrder(todict(order)):
58
                    resp['result'] = 'ORDER_CREATED'
59
                    resp["url"] = ORDER_REDIRECT_URL % (merchantOrderId)
60
                    resp["htmlRequired"] = True
61
                    resp['orderId'] = orderId
62
                else:
63
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
64
 
13796 amit.gupta 65
                return resp
13774 amit.gupta 66
            except:
14312 amit.gupta 67
                resp["result"] = 'ORDER_NOT_CREATED'
13796 amit.gupta 68
                return resp
13774 amit.gupta 69
 
70
        else:
13781 amit.gupta 71
            try:
72
                merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14464 amit.gupta 73
                soup = BeautifulSoup(rawHtml)
74
                try:
75
                    self.parseOldStlye(merchantOrder, soup)
76
                except:
14545 amit.gupta 77
                    try:
14566 amit.gupta 78
                        traceback.print_exc()
14545 amit.gupta 79
                        self.parseNewStlye(merchantOrder, soup)
80
                    except:
14566 amit.gupta 81
                        traceback.print_exc()
14545 amit.gupta 82
                        self.parseCancelled(merchantOrder, soup)
14319 amit.gupta 83
                resp['result'] = 'ORDER_CREATED'
84
                return resp    
13781 amit.gupta 85
            except:
13809 amit.gupta 86
                print "Error occurred"
87
                traceback.print_exc()
14312 amit.gupta 88
                resp['result'] = 'ORDER_NOT_CREATED'
13796 amit.gupta 89
                return resp    
13774 amit.gupta 90
 
13868 amit.gupta 91
    #This should be exposed from api for specific sources
92
    def scrapeStoreOrders(self):
14624 amit.gupta 93
        br = getBrowserObject()
94
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders.closed":False, "subOrders.trackingUrl":{"$exists":True}})
95
        for merchantOrder in orders:
96
            try:
97
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
98
                closed = True
99
                map1 = {}
100
                for subOrder in merchantOrder.get("subOrders"):
101
                    if subOrder.get("closed"):
102
                        continue
103
                    elif subOrder.get("trackingUrl") is None:
104
                        closed = False
105
                        continue
106
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
107
                    trackingUrl = subOrder.get("trackingUrl")
108
                    if not map1.has_key(trackingUrl):
109
                        map1[trackingUrl] = self.parseTrackingUrl(br, trackingUrl)
110
                    newOrder = map1.get(trackingUrl)
111
                    newOrder['cashBackStatus'] = subOrder.get('cashBackStatus')
112
                    updateMap = self.getUpdateMap(newOrder)
113
                    print findMap, "\n", updateMap
114
                    bulk.find(findMap).update({'$set' : updateMap})
115
                    closed = closed and newOrder['closed']
116
                if closed:
117
                    print "Closed", {"orderId":merchantOrder.get("orderId")},  {"closed":True}
118
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":True}})
119
                result = bulk.execute()
120
                tprint(result)
121
            except:
122
                tprint("Could not update " + str(merchantOrder['orderId']))
123
                traceback.print_exc()
124
 
14608 amit.gupta 125
 
126
 
127
 
14464 amit.gupta 128
    def parseOldStlye(self, merchantOrder, soup):
129
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
130
        table = soup.body.findAll("table", recursive=False)[1]
131
        #print table
132
        tables = table.tr.td.findAll("table", recursive=False)
133
        for tr in tables[2].findAll("tr"):
134
            boldElement = tr.td.b
135
            if "Order Placed" in str(boldElement):
136
                merchantOrder.placedOn = boldElement.next_sibling.strip()
137
            if "order number" in str(boldElement):
138
                merchantOrder.merchantOrderId = boldElement.next_sibling.strip()
139
            if "Order Total" in str(boldElement):
140
                merchantOrder.paidAmount = int(float(boldElement.find('span').contents[-1].replace(',','')))
141
        anchors = table.tr.td.findAll("a", recursive=False)
142
        paymentAnchor = anchors.pop(-1)
143
 
144
        count = 0
145
        subOrders = []
146
        merchantOrder.subOrders = subOrders
147
        counter = 0 
148
        for anchor in anchors:
149
            count += 1
150
            tab = anchor.next_sibling
151
            status = MStore.ORDER_PLACED
152
            subStr = "Delivery #" + str(count) + ":"
153
            if subStr in  tab.find("b").text:
154
                detailedStatus = tab.find("b").text.replace(subStr, '').strip()
155
 
156
            tab = tab.next_sibling.next_sibling
157
            trs = tab.find("table").find('tbody').findAll("tr", recursive = False)
158
 
159
            estimatedDelivery = trs[0].td.find("b").next_sibling.strip()
160
 
161
            orderItemTrs = trs[1].findAll("td", recursive=False)[1].table.tbody.findAll("tr", recursive = False)
162
            i = -1
163
            for orderItemTr in orderItemTrs:
164
                i += 1
165
                if i%2 == 0:
166
                    continue
167
                counter += 1
168
                quantity =  int(re.findall(r'\d+', orderItemTr.td.contents[0])[0])
169
 
170
                productUrl = orderItemTr.td.contents[1].a["href"]
171
                productTitle = orderItemTr.td.contents[1].a.text
172
 
173
                unitPrice = int(float(orderItemTr.findAll('td')[1].span.text.replace('Rs. ','').replace(',','')))
174
 
175
 
176
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, unitPrice*quantity, status, quantity)
177
                subOrder.merchantSubOrderId = str(counter) + " of " + merchantOrder.merchantOrderId
178
                subOrder.estimatedDeliveryDate = estimatedDelivery
179
                subOrder.productCode = productUrl.split('/')[5]
180
                subOrder.detailedStatus = detailedStatus
181
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice*quantity)
182
                cashbackStatus = Store.CB_PENDING
183
                if cashbackAmount <= 0:
184
                    cashbackStatus = Store.CB_NA
185
                subOrder.cashBackStatus = cashbackStatus
186
                subOrder.cashBackAmount = cashbackAmount
187
                if percentage > 0:
188
                    subOrder.cashBackPercentage = percentage
189
                subOrders.append(subOrder)
190
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
191
        totalAmount = 0
192
        grandAmount = 0
193
        for price in priceList:
194
            labelTd = price.td
195
            if 'Subtotal:' in labelTd.text:
196
                totalAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
197
            elif 'Grand Total:' in labelTd.text:
198
                grandAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
199
        if grandAmount < totalAmount:
200
            diff = totalAmount - grandAmount
201
            for subOrder in merchantOrder.subOrders:
202
                subOrder.amountPaid -= int(diff*(1-subOrder.amountPaid/totalAmount))
203
        self._updateToOrder(todict(merchantOrder))
204
 
205
    def parseNewStlye(self, merchantOrder, soup):
206
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
207
        orderDetailsContainer = soup.body.find(id="orderDetails")
14566 amit.gupta 208
        divAfterH1 = orderDetailsContainer.h1.next_sibling.next_sibling
209
        orderLeftDiv = divAfterH1.div
14464 amit.gupta 210
        placedOnSpan = orderLeftDiv.find("span", {'class':'order-date-invoice-item'})
211
        merchantOrder.placedOn =placedOnSpan.text.split('Ordered on')[1].strip()
212
        merchantOrder.merchantOrderId = placedOnSpan.next_sibling.next_sibling.text.split('Order#')[1].strip()
14566 amit.gupta 213
        priceBox = divAfterH1.next_sibling.next_sibling.next_sibling.next_sibling.find("div", {"class":"a-box-inner"}).div.div.findAll('div', recursive=False)[-1]
14464 amit.gupta 214
        priceRows = priceBox.findAll('div', {'class':'a-row'})
215
        subTotal = 0
14566 amit.gupta 216
        shippingPrice = 0   
14464 amit.gupta 217
        promoApplied = 0
218
        for priceRow in priceRows:
219
            if "Item(s) Subtotal:" in str(priceRow):
220
                subTotal = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
221
            elif "Shipping:" in str(priceRow):
222
                shippingPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
223
            elif "Grand Total:" in str(priceRow):
224
                grandPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
225
                merchantOrder.paidAmount = grandPrice
226
            elif "Total:" in str(priceRow):
227
                totalPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
228
            elif "Promotion Applied:" in str(priceRow):
229
                promoApplied  += int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
230
        totalPaid = subTotal        
231
        if promoApplied > 0:
232
            totalPaid -= promoApplied
233
            if shippingPrice <= promoApplied:
234
                totalPaid  += shippingPrice
235
 
236
        shipmentDivs = orderDetailsContainer.find('div', {'class':'a-box shipment'}).findAll('div', recursive = False)
237
        subOrders = []
238
        merchantOrder.subOrders = subOrders
239
        i=1
240
        for shipmentDiv in shipmentDivs:
241
            innerBoxes = shipmentDiv.findAll('div', recursive = False)
242
            statusDiv = innerBoxes[0]
243
            subOrderStatus = statusDiv.div.span.text.strip()
14566 amit.gupta 244
            deliverySpan = statusDiv.div.div.find_next_sibling('div').span
14464 amit.gupta 245
            productDivs = innerBoxes[-1].div.div.div.findAll('div', recursive=False)
246
            subOrders = []
247
            merchantOrder.subOrders = subOrders
248
            for i, productDiv in enumerate(productDivs):
249
                i +=1 
250
                imgDiv  = productDiv.div.div
251
                detailDiv = imgDiv.find_next_sibling('div')
252
                detailDivs = detailDiv.findAll('div', recursive=False)
253
                arr = detailDivs[0].a.text.strip().split(" of ", 1)
14465 amit.gupta 254
                (productTitle, quantity) = (arr[-1], (1 if len(arr)==1 else int(arr[0])) )
14464 amit.gupta 255
                unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
256
                amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
257
                productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
258
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
259
                subOrder.productCode = productUrl.split('/')[5]
260
                subOrder.unitPrice = unitPrice
14566 amit.gupta 261
                subOrder.merchantSubOrderId = str(i) + " of " + merchantOrder.merchantOrderId
262
                if deliverySpan is not None:
263
                    subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip() 
14464 amit.gupta 264
                subOrder.detailedStatus = subOrderStatus
265
                subOrder.deliveryCharges = shippingPrice
14466 amit.gupta 266
                subOrder.imgUrl = imgDiv.img["src"]
14464 amit.gupta 267
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid)
268
                cashbackStatus = Store.CB_PENDING
269
                if cashbackAmount <= 0:
270
                    cashbackStatus = Store.CB_NA
271
                subOrder.cashBackStatus = cashbackStatus
272
                subOrder.cashBackAmount = cashbackAmount
273
                if percentage > 0:
274
                    subOrder.cashBackPercentage = percentage
275
                subOrders.append(subOrder)
276
        self._updateToOrder(todict(merchantOrder))
14545 amit.gupta 277
 
278
    def parseCancelled(self, merchantOrder,soup):
279
        fonts = soup.body.findAll("table", recursive=False)[1].findAll("font")
280
        if fonts[0].text == "Important Message":
281
            if fonts[1].text=="This order has been cancelled.":
282
                merchantOrder.closed = True
283
                merchantOrder.status = "Cancelled"
284
                merchantOrder.requireDetail = False
285
                self._updateToOrder(todict(merchantOrder))
286
            else:
287
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14549 amit.gupta 288
        else:
289
            orderDetails = soup.body.find(id="orderDetails")
290
            if orderDetails is not None and orderDetails.h4.text == "This order has been cancelled.":
291
                merchantOrder.closed = True
292
                merchantOrder.status = "Cancelled"
293
                merchantOrder.requireDetail = False
294
                self._updateToOrder(todict(merchantOrder))
295
            else:
296
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14464 amit.gupta 297
 
13868 amit.gupta 298
    def getTrackingUrls(self, userId):
14074 amit.gupta 299
 
300
        missingOrderUrls = []
301
        missingOrders = self._getMissingOrders({'userId':userId})
302
        for missingOrder in missingOrders:
303
            missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
14624 amit.gupta 304
        orders = self._getActiveOrders({'userId':userId, "$exists":{"subOrders.trackingUrl":False} })
13882 amit.gupta 305
        count = len(orders)
13879 amit.gupta 306
        print "count", count
13868 amit.gupta 307
        if count > 0:
14320 amit.gupta 308
            return missingOrderUrls + ['https://www.amazon.in/gp/css/order-history', 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled', 'https://www.amazon.in/gp/css/order-history?orderFilter=cancelled&startIndex=10']
13959 amit.gupta 309
        else: 
14074 amit.gupta 310
            return missingOrderUrls
13927 amit.gupta 311
 
312
    def trackOrdersForUser(self, userId, url, rawHtml):
14285 amit.gupta 313
        directory = "/tmp/User" + str(userId)
314
        if not os.path.exists(directory):
315
            os.makedirs(directory)
14298 amit.gupta 316
        filename = directory + "/" + str(datetime.now())
317
        print "filename---", filename
318
        f = open(filename,'w')
14173 amit.gupta 319
        f.write(rawHtml) # python will convert \n to os.linesep
320
        f.close() # you can omit in most cases as the destructor will call if
321
 
13995 amit.gupta 322
        try:
323
            searchMap = {'userId':userId}
324
            collectionMap = {'merchantOrderId':1}
325
            activeOrders = self._getActiveOrders(searchMap, collectionMap)
14033 amit.gupta 326
            datetimeNow = datetime.now()
327
            timestamp = int(time.mktime(datetimeNow.timetuple()))
14009 amit.gupta 328
            print "url----------------", url
14008 amit.gupta 329
 
14320 amit.gupta 330
            if url == 'https://www.amazon.in/gp/css/order-history' or 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled' in url:
13995 amit.gupta 331
                soup = BeautifulSoup(rawHtml)
332
                allOrders = soup.find(id="ordersContainer").findAll('div', {'class':'a-box-group a-spacing-base order'})
333
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
334
                for activeOrder in activeOrders:
335
                    for orderEle in allOrders:
336
                        orderdiv = orderEle.find('div', {'class':'a-box a-color-offset-background order-info'}).find('div', {'class':'a-fixed-right-grid-col actions a-col-right'})
337
                        merchantOrderId = orderdiv.find('span', {'class':'a-color-secondary value'}).text.strip()
338
                        if merchantOrderId==activeOrder['merchantOrderId']:
339
                            closed = True
340
                            shipments = orderEle.findAll('div',{'class':re.compile('.*?a-box.*?')}, recursive=False)
341
                            shipments.pop(0)
342
                            for shipment in shipments:
343
                                shipdiv = shipment.find('div', {'class':'a-box-inner'})
14050 amit.gupta 344
                                sdivs = shipment.div.div.findAll('div', recursive=False)
14065 amit.gupta 345
                                orderStatus = sdivs[0].span.text.strip()
14050 amit.gupta 346
                                status = self._getStatusFromDetailedStatus(orderStatus)
347
                                if status == MStore.ORDER_DELIVERED:
14299 amit.gupta 348
                                    deliveredOn = sdivs[0].findAll('span')[-1].text.strip()
14050 amit.gupta 349
                                    deliveredOn = deliveredOn.split(":")[1].strip()
14335 amit.gupta 350
                                deliveryestimatespan = sdivs[0].find('span', {'class':'a-color-success'})
351
                                deliveryEstimate = None
352
                                if deliveryestimatespan is not None:
353
                                    deliveryEstimate = deliveryestimatespan.find('span', {'class':'a-text-bold'}).text.strip()
354
                                productDivs = shipdiv.find('div', {'class':re.compile('.*?a-spacing-top-medium.*?')}).find('div', {'class':'a-row'}).findAll('div', recursive=False)
13995 amit.gupta 355
                                trackingUrl = None
356
                                for buttonDiv in shipdiv.findAll('span', {'class':'a-button-inner'}):
357
                                    if buttonDiv.find('a').text.strip()=='Track package':
358
                                        trackingUrl = buttonDiv.find('a')['href'].strip()
359
                                        if not trackingUrl.startswith("http"):
14608 amit.gupta 360
                                            trackingUrl = "http://www.amazon.in" + trackingUrl
13995 amit.gupta 361
                                        break
362
                                for prodDiv in productDivs:
363
                                    prodDiv.find('div', {'class':'a-fixed-left-grid-inner'})
364
                                    productTitle = prodDiv.find('div', {'class':'a-fixed-left-grid-inner'}).find("div", {'class':'a-row'}).find('a').text.strip()
365
                                    imgUrl = prodDiv.find("img")["src"]
366
                                    for subOrder in activeOrder['subOrders']:
367
                                        if subOrder['productTitle'] == productTitle:
368
                                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId")}
369
                                            updateMap = {}
370
                                            closedStatus = False
371
                                            updateMap['subOrders.$.imgUrl'] = imgUrl
14033 amit.gupta 372
                                            updateMap['subOrders.$.lastTracked'] = timestamp
13995 amit.gupta 373
                                            updateMap['subOrders.$.detailedStatus'] = orderStatus
374
                                            cashbackStatus = subOrder.get("cashBackStatus")
375
                                            updateMap['subOrders.$.status'] = status 
376
 
377
                                            if status==MStore.ORDER_DELIVERED:                               
14291 amit.gupta 378
                                                updateMap['subOrders.$.deliveredOn'] = deliveredOn
13995 amit.gupta 379
                                                closedStatus = True
380
                                                updateMap['subOrders.$.closed'] = True
381
                                                if cashbackStatus == Store.CB_PENDING:
14607 amit.gupta 382
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
13995 amit.gupta 383
                                            if status==MStore.ORDER_CANCELLED:     
384
                                                closedStatus = True
385
                                                updateMap['subOrders.$.closed'] = True
386
                                                if cashbackStatus == Store.CB_PENDING:
387
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
388
                                            if status==MStore.ORDER_SHIPPED:   
389
                                                updateMap['subOrders.$.estimatedDeliveryDate'] = deliveryEstimate
390
                                                if trackingUrl is not None:
391
                                                    updateMap['subOrders.$.trackingUrl'] = trackingUrl
392
                                            if not closedStatus:
393
                                                closed = False
394
                                            bulk.find(findMap).update({'$set' : updateMap})
395
                                            break
396
                            bulk.find({'orderId': activeOrder['orderId']}).update({'$set':{'closed': closed}})            
14080 amit.gupta 397
                bulk.execute()
398
                return 'PARSED_SUCCESS'
399
            else:
14086 amit.gupta 400
                merchantOrderId = re.findall(r'https://www.amazon.in/gp/css/summary/edit.html\?orderID=(.*)?', url, re.IGNORECASE)[0] 
14085 amit.gupta 401
                merchantOrder = self.db.merchantOrder.find_one({"merchantOrderId":merchantOrderId})
14312 amit.gupta 402
                self.parseOrderRawHtml(merchantOrder['orderId'], merchantOrder['subTagId'], merchantOrder['userId'], rawHtml, url, False)['result']
14080 amit.gupta 403
                return 'PARSED_SUCCESS'
404
                pass
14008 amit.gupta 405
            return 'PARSED_SUCCESS_NO_ORDERS'
13995 amit.gupta 406
        except:
407
            traceback.print_exc()    
408
            return 'PARSED_FAILED'
409
 
410
    def _getStatusFromDetailedStatus(self, detailedStatus):
14061 amit.gupta 411
        if "ordered from" in detailedStatus.lower():
412
            return MStore.ORDER_PLACED 
413
 
13995 amit.gupta 414
        for key, value in self.orderStatusRegexMap.iteritems():
14032 amit.gupta 415
            if detailedStatus.lower() in value:
13995 amit.gupta 416
                return key
417
 
418
        print "Detailed Status need to be mapped"
14062 amit.gupta 419
        print "Found new order status", detailedStatus
13995 amit.gupta 420
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
14624 amit.gupta 421
    def scrapeAffiliate(self, startDate=None, endDate=None):
422
        pass
14608 amit.gupta 423
 
14624 amit.gupta 424
 
14608 amit.gupta 425
    def parseTrackingUrl(self, br, trackingUrl):
14624 amit.gupta 426
        subOrder = {}
14608 amit.gupta 427
        response = br.open(trackingUrl)
428
        page = ungzipResponse(response)
14624 amit.gupta 429
        soup = BeautifulSoup(page)
430
        alertContainer = soup.find("div", {"class":"a-box-inner a-alert-container"})
431
        if alertContainer is not None:
432
            statusText = alertContainer.h4.span.text
433
            detailedStatus = statusText.split(":")[0].strip()
434
            subOrder['detailedStatus'] = detailedStatus
435
            if detailedStatus.lower() == "in transit":
436
                pass
437
            elif detailedStatus.lower() == "undeliverable":
438
                subOrder['status'] = MStore.ORDER_CANCELLED
439
                return subOrder
440
        else:
441
            summaryLeft = soup.find(id="summaryLeft")
442
            statusText = summaryLeft.h2.text
443
            detailedStatus = statusText.split(":")[0].strip()
444
            subOrder['detailedStatus'] = detailedStatus
445
            if detailedStatus.lower() == "delivered":
446
                subOrder['deliveredOn'] = summaryLeft.findAll("span")[-2].text.strip()
447
                subOrder['status'] = MStore.ORDER_DELIVERED
448
                return subOrder
449
            else:
450
                subOrder['expectedDelivery'] = summaryLeft.findAll("span")[-1].text.strip()
451
        return subOrder
452
 
453
 
454
 
14608 amit.gupta 455
 
456
 
13927 amit.gupta 457
 
458
 
13774 amit.gupta 459
def main():
460
    store = getStore(1)
14624 amit.gupta 461
    br = mechanize.Browser()
462
    br.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'),
463
                     ('Accept', 'text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8'),
464
                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
465
                     ('Accept-Language', 'en-US,en;q=0.8'),                     
466
                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
467
    store.scrapeStoreOrders()
468
    #store.parseOrderRawHtml(2121, "13232", 14, readSSh("/home/amit/917.html"), "https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html/ref=ox_spc_place_order?ie=UTF8&hasWorkingJavascript=")
14162 amit.gupta 469
def readSSh(fileName):
470
    try:
471
            str1 = open(fileName).read()
472
            return str1
473
    except:
474
        ssh_client = SSHClient()
475
        str1 = ""
476
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
477
        ssh_client.connect('104.200.25.40', 22, 'root', 'ecip$dtrMay2014')
478
        sftp_client = ssh_client.open_sftp()
479
        try:
14299 amit.gupta 480
            if not os.path.exists(os.path.dirname(fileName)):
481
                os.makedirs(os.path.dirname(fileName))
14162 amit.gupta 482
            sftp_client.get(fileName, fileName)
483
            try:
484
                str1 = open(fileName).read()
485
                return str1
486
            finally:
487
                pass
488
        except:
489
            "could not read"
490
        return str1
13774 amit.gupta 491
 
492
 
493
if __name__ == '__main__':
14284 amit.gupta 494
        main()