Subversion Repositories SmartDukaan

Rev

Rev 14948 | Rev 14950 | 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
14650 amit.gupta 9
from datetime import datetime, timedelta
10
from dtr.dao import Order, SubOrder, AmazonAffiliateInfo
14464 amit.gupta 11
from dtr.main import getStore, Store as MStore, ParseException, getBrowserObject, \
14624 amit.gupta 12
    ungzipResponse, tprint
14650 amit.gupta 13
from dtr.sources.flipkart import todict, AFF_REPORT_URL
14749 amit.gupta 14
from dtr.utils.utils import fetchResponseUsingProxy
14162 amit.gupta 15
from paramiko import sftp
16
from paramiko.client import SSHClient
17
from paramiko.sftp_client import SFTPClient
14650 amit.gupta 18
import base64
19
import gzip
14624 amit.gupta 20
import mechanize
14285 amit.gupta 21
import os.path
14162 amit.gupta 22
import paramiko
13774 amit.gupta 23
import re
14033 amit.gupta 24
import time
13809 amit.gupta 25
import traceback
14650 amit.gupta 26
import urllib2
13774 amit.gupta 27
 
28
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
13810 amit.gupta 29
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
13823 amit.gupta 30
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
14624 amit.gupta 31
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
14650 amit.gupta 32
AMAZON_AFF_FILE_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/getReport?filename=saholic-21-orders-report-%s.tsv.gz'
13774 amit.gupta 33
class Store(MStore):
13821 amit.gupta 34
 
14032 amit.gupta 35
    orderStatusRegexMap = { MStore.ORDER_PLACED : ['ordered from', 'not yet dispatched','dispatching now', 'preparing for dispatch'],
14064 amit.gupta 36
                            MStore.ORDER_SHIPPED : ['dispatched on','dispatched', 'on the way', 'out for delivery', 'Out for delivery'],
14032 amit.gupta 37
                            MStore.ORDER_CANCELLED : ['return complete', 'refunded', 'cancelled'],
38
                            MStore.ORDER_DELIVERED : ['delivered']
13821 amit.gupta 39
                           }
13774 amit.gupta 40
 
41
    def __init__(self,store_id):
42
        super(Store, self).__init__(store_id)
43
 
44
    def getName(self):
14749 amit.gupta 45
        return "amazon"
13774 amit.gupta 46
 
14945 amit.gupta 47
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl, track=False):
14949 amit.gupta 48
        print "Order Id to be parsed is : ", orderId
13796 amit.gupta 49
        resp = {}
14813 amit.gupta 50
        resp['result'] = 'ORDER_NOT_CREATED'
13821 amit.gupta 51
        if ORDER_SUCCESS_URL in orderSuccessUrl or THANKYOU_URL in orderSuccessUrl:
13774 amit.gupta 52
            try:
53
                soup = BeautifulSoup(rawHtml)
14608 amit.gupta 54
                try:
55
                    orderUrl = soup.find('div', {"id":"thank-you-box-wrapper"}).div.findAll('div', recursive=False)[1].a['href']
56
                    merchantOrderId = re.findall(r'.*&oid=(.*)&?.*?', orderUrl)[0]
57
                except:
58
                    merchantOrderId = soup.find(id="orders-list").div.span.b.text
14699 amit.gupta 59
                order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, True)
14211 amit.gupta 60
                order.orderSuccessUrl = ORDER_REDIRECT_URL % (merchantOrderId)
61
                order.merchantOrderId = merchantOrderId
14291 amit.gupta 62
                order.requireDetail = True
14698 amit.gupta 63
                order.status = 'html_required'
14297 amit.gupta 64
                order.closed = None
14312 amit.gupta 65
                if self._saveToOrder(todict(order)):
66
                    resp['result'] = 'ORDER_CREATED'
67
                    resp["url"] = ORDER_REDIRECT_URL % (merchantOrderId)
68
                    resp["htmlRequired"] = True
69
                    resp['orderId'] = orderId
70
                else:
71
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
72
 
13774 amit.gupta 73
            except:
14813 amit.gupta 74
                #Write all cases here for Order Not created Known
14809 amit.gupta 75
                try:
14815 amit.gupta 76
                    if 'Securely redirecting you' in soup.h3.text.strip():
14813 amit.gupta 77
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
14809 amit.gupta 78
                    else:
14813 amit.gupta 79
                        raise
14809 amit.gupta 80
                except:
14814 amit.gupta 81
                    try:
14815 amit.gupta 82
                        if soup.h1.text.strip() in ['This is a duplicate order', 'There was a problem with your payment.']:
14814 amit.gupta 83
                            resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
84
                        else:
85
                            raise
86
                    except:
14815 amit.gupta 87
                        if soup.h3.text.strip() == 'Web page not available':
14814 amit.gupta 88
                            resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
14813 amit.gupta 89
            return resp
90
 
13774 amit.gupta 91
        else:
13781 amit.gupta 92
            try:
14722 amit.gupta 93
                mo = self.db.merchantOrder.find_one({"orderId":orderId})
94
                if mo is not None:
14749 amit.gupta 95
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, False)
14722 amit.gupta 96
                    merchantOrder.createdOn = mo.get("createdOn")
97
                    merchantOrder.createdOnInt =  mo.get("createdOnInt")
98
                else:
14945 amit.gupta 99
                    print "Could not find amazon order with order Id", orderId
14749 amit.gupta 100
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14464 amit.gupta 101
                soup = BeautifulSoup(rawHtml)
102
                try:
103
                    self.parseOldStlye(merchantOrder, soup)
104
                except:
14545 amit.gupta 105
                    try:
14566 amit.gupta 106
                        traceback.print_exc()
14545 amit.gupta 107
                        self.parseNewStlye(merchantOrder, soup)
108
                    except:
14566 amit.gupta 109
                        traceback.print_exc()
14545 amit.gupta 110
                        self.parseCancelled(merchantOrder, soup)
14813 amit.gupta 111
                resp['result'] = 'DETAIL_CREATED'
14319 amit.gupta 112
                return resp    
13781 amit.gupta 113
            except:
14813 amit.gupta 114
                order = self.db.merchantOrder.find_one({"orderId":orderId})
115
                if order is not None:
116
                    self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"status":"parse_failed"}})
117
                print "Error occurred"
118
                resp['result'] = 'DETAIL_NOT_CREATED'
119
                traceback.print_exc()
120
            return resp    
13774 amit.gupta 121
 
13868 amit.gupta 122
    #This should be exposed from api for specific sources
123
    def scrapeStoreOrders(self):
14624 amit.gupta 124
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders.closed":False, "subOrders.trackingUrl":{"$exists":True}})
125
        for merchantOrder in orders:
126
            try:
127
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
128
                closed = True
129
                map1 = {}
130
                for subOrder in merchantOrder.get("subOrders"):
131
                    if subOrder.get("closed"):
132
                        continue
133
                    elif subOrder.get("trackingUrl") is None:
134
                        closed = False
135
                        continue
136
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
137
                    trackingUrl = subOrder.get("trackingUrl")
138
                    if not map1.has_key(trackingUrl):
14749 amit.gupta 139
                        map1[trackingUrl] = self.parseTrackingUrl(trackingUrl)
14624 amit.gupta 140
                    newOrder = map1.get(trackingUrl)
141
                    newOrder['cashBackStatus'] = subOrder.get('cashBackStatus')
142
                    updateMap = self.getUpdateMap(newOrder)
143
                    print findMap, "\n", updateMap
144
                    bulk.find(findMap).update({'$set' : updateMap})
145
                    closed = closed and newOrder['closed']
14697 amit.gupta 146
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":closed, "parseError":False}})
14624 amit.gupta 147
                result = bulk.execute()
148
                tprint(result)
149
            except:
14847 amit.gupta 150
                tprint("Could not update " + str(merchantOrder['orderId']) + " For store " + self.getName())
14692 amit.gupta 151
                self.db.merchantOrder.update({"orderId":merchantOrder['orderId']}, {"$set":{"parseError":True}})
14624 amit.gupta 152
                traceback.print_exc()
153
 
14608 amit.gupta 154
 
155
 
14771 amit.gupta 156
    def parserest(self, soup):
157
        print "Hi"
158
        if soup.find('h1'):
159
            print "OK"
14608 amit.gupta 160
 
14464 amit.gupta 161
    def parseOldStlye(self, merchantOrder, soup):
162
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
163
        table = soup.body.findAll("table", recursive=False)[1]
164
        #print table
165
        tables = table.tr.td.findAll("table", recursive=False)
166
        for tr in tables[2].findAll("tr"):
167
            boldElement = tr.td.b
168
            if "Order Placed" in str(boldElement):
169
                merchantOrder.placedOn = boldElement.next_sibling.strip()
170
            if "order number" in str(boldElement):
171
                merchantOrder.merchantOrderId = boldElement.next_sibling.strip()
172
            if "Order Total" in str(boldElement):
173
                merchantOrder.paidAmount = int(float(boldElement.find('span').contents[-1].replace(',','')))
174
        anchors = table.tr.td.findAll("a", recursive=False)
175
        paymentAnchor = anchors.pop(-1)
176
 
177
        count = 0
178
        subOrders = []
179
        merchantOrder.subOrders = subOrders
180
        counter = 0 
181
        for anchor in anchors:
182
            count += 1
183
            tab = anchor.next_sibling
184
            status = MStore.ORDER_PLACED
185
            subStr = "Delivery #" + str(count) + ":"
186
            if subStr in  tab.find("b").text:
187
                detailedStatus = tab.find("b").text.replace(subStr, '').strip()
188
 
189
            tab = tab.next_sibling.next_sibling
190
            trs = tab.find("table").find('tbody').findAll("tr", recursive = False)
191
 
192
            estimatedDelivery = trs[0].td.find("b").next_sibling.strip()
193
 
194
            orderItemTrs = trs[1].findAll("td", recursive=False)[1].table.tbody.findAll("tr", recursive = False)
195
            i = -1
196
            for orderItemTr in orderItemTrs:
197
                i += 1
198
                if i%2 == 0:
199
                    continue
200
                counter += 1
201
                quantity =  int(re.findall(r'\d+', orderItemTr.td.contents[0])[0])
202
 
203
                productUrl = orderItemTr.td.contents[1].a["href"]
204
                productTitle = orderItemTr.td.contents[1].a.text
205
 
206
                unitPrice = int(float(orderItemTr.findAll('td')[1].span.text.replace('Rs. ','').replace(',','')))
207
 
208
 
209
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, unitPrice*quantity, status, quantity)
210
                subOrder.merchantSubOrderId = str(counter) + " of " + merchantOrder.merchantOrderId
211
                subOrder.estimatedDeliveryDate = estimatedDelivery
14722 amit.gupta 212
                estDlvyTime = datetime.strptime(estimatedDelivery.split('-')[0].strip(), "%A %d %B %Y")
213
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
214
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 215
                subOrder.productCode = productUrl.split('/')[5]
216
                subOrder.detailedStatus = detailedStatus
217
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice*quantity)
218
                cashbackStatus = Store.CB_PENDING
219
                if cashbackAmount <= 0:
220
                    cashbackStatus = Store.CB_NA
221
                subOrder.cashBackStatus = cashbackStatus
222
                subOrder.cashBackAmount = cashbackAmount
223
                if percentage > 0:
224
                    subOrder.cashBackPercentage = percentage
225
                subOrders.append(subOrder)
226
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
227
        totalAmount = 0
228
        grandAmount = 0
229
        for price in priceList:
230
            labelTd = price.td
231
            if 'Subtotal:' in labelTd.text:
232
                totalAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
233
            elif 'Grand Total:' in labelTd.text:
234
                grandAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
235
        if grandAmount < totalAmount:
236
            diff = totalAmount - grandAmount
237
            for subOrder in merchantOrder.subOrders:
238
                subOrder.amountPaid -= int(diff*(1-subOrder.amountPaid/totalAmount))
14698 amit.gupta 239
        merchantOrder.status='success'
14464 amit.gupta 240
        self._updateToOrder(todict(merchantOrder))
241
 
242
    def parseNewStlye(self, merchantOrder, soup):
243
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
244
        orderDetailsContainer = soup.body.find(id="orderDetails")
14566 amit.gupta 245
        divAfterH1 = orderDetailsContainer.h1.next_sibling.next_sibling
246
        orderLeftDiv = divAfterH1.div
14464 amit.gupta 247
        placedOnSpan = orderLeftDiv.find("span", {'class':'order-date-invoice-item'})
248
        merchantOrder.placedOn =placedOnSpan.text.split('Ordered on')[1].strip()
249
        merchantOrder.merchantOrderId = placedOnSpan.next_sibling.next_sibling.text.split('Order#')[1].strip()
14566 amit.gupta 250
        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 251
        priceRows = priceBox.findAll('div', {'class':'a-row'})
252
        subTotal = 0
14566 amit.gupta 253
        shippingPrice = 0   
14464 amit.gupta 254
        promoApplied = 0
255
        for priceRow in priceRows:
256
            if "Item(s) Subtotal:" in str(priceRow):
257
                subTotal = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
258
            elif "Shipping:" in str(priceRow):
259
                shippingPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
260
            elif "Grand Total:" in str(priceRow):
261
                grandPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
262
                merchantOrder.paidAmount = grandPrice
263
            elif "Total:" in str(priceRow):
264
                totalPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
265
            elif "Promotion Applied:" in str(priceRow):
266
                promoApplied  += int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
267
        totalPaid = subTotal        
268
        if promoApplied > 0:
269
            totalPaid -= promoApplied
270
            if shippingPrice <= promoApplied:
271
                totalPaid  += shippingPrice
272
 
273
        shipmentDivs = orderDetailsContainer.find('div', {'class':'a-box shipment'}).findAll('div', recursive = False)
274
        subOrders = []
275
        merchantOrder.subOrders = subOrders
276
        i=1
277
        for shipmentDiv in shipmentDivs:
278
            innerBoxes = shipmentDiv.findAll('div', recursive = False)
279
            statusDiv = innerBoxes[0]
280
            subOrderStatus = statusDiv.div.span.text.strip()
14566 amit.gupta 281
            deliverySpan = statusDiv.div.div.find_next_sibling('div').span
14464 amit.gupta 282
            productDivs = innerBoxes[-1].div.div.div.findAll('div', recursive=False)
283
            subOrders = []
284
            merchantOrder.subOrders = subOrders
285
            for i, productDiv in enumerate(productDivs):
286
                i +=1 
287
                imgDiv  = productDiv.div.div
288
                detailDiv = imgDiv.find_next_sibling('div')
289
                detailDivs = detailDiv.findAll('div', recursive=False)
290
                arr = detailDivs[0].a.text.strip().split(" of ", 1)
14465 amit.gupta 291
                (productTitle, quantity) = (arr[-1], (1 if len(arr)==1 else int(arr[0])) )
14820 amit.gupta 292
                try:
293
                    unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
294
                except:
295
                    unitPrice = int(float(detailDivs[3].span.text.replace('Rs. ','').replace(',','')))
14464 amit.gupta 296
                amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
297
                productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
298
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
299
                subOrder.productCode = productUrl.split('/')[5]
300
                subOrder.unitPrice = unitPrice
14566 amit.gupta 301
                subOrder.merchantSubOrderId = str(i) + " of " + merchantOrder.merchantOrderId
14722 amit.gupta 302
                estDlvyTime = datetime.now()
14566 amit.gupta 303
                if deliverySpan is not None:
14756 amit.gupta 304
                    try:
305
                        subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip()
306
                        estDate = subOrder.estimatedDeliveryDate.split("-")[0].strip()
307
                        subOrder.estimatedDeliveryInt = int(time.mktime((datetime.strptime(estDate, "%A %d %B %Y")).timetuple()))
308
                        estDlvyTime = datetime.strptime(estDate, "%A %d %B %Y")
309
                    except:
310
                        subOrder.estimatedDeliveryDate = "Not available"
14722 amit.gupta 311
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
14756 amit.gupta 312
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 313
                subOrder.detailedStatus = subOrderStatus
314
                subOrder.deliveryCharges = shippingPrice
14466 amit.gupta 315
                subOrder.imgUrl = imgDiv.img["src"]
14464 amit.gupta 316
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid)
317
                cashbackStatus = Store.CB_PENDING
318
                if cashbackAmount <= 0:
319
                    cashbackStatus = Store.CB_NA
320
                subOrder.cashBackStatus = cashbackStatus
321
                subOrder.cashBackAmount = cashbackAmount
322
                if percentage > 0:
323
                    subOrder.cashBackPercentage = percentage
324
                subOrders.append(subOrder)
14698 amit.gupta 325
        merchantOrder.status='success'
14464 amit.gupta 326
        self._updateToOrder(todict(merchantOrder))
14545 amit.gupta 327
 
328
    def parseCancelled(self, merchantOrder,soup):
14722 amit.gupta 329
        try:
330
            fonts = soup.body.findAll("table", recursive=False)[1].findAll("font")
331
            if fonts[0].text == "Important Message":
332
                if fonts[1].text=="This order has been cancelled.":
333
                    merchantOrder.closed = True
334
                    merchantOrder.status = "cancelled"
335
                    merchantOrder.requireDetail = False
336
                    self._updateToOrder(todict(merchantOrder))
337
                    return
338
                else:
339
                    raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14545 amit.gupta 340
            else:
341
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14722 amit.gupta 342
        except:
14549 amit.gupta 343
            orderDetails = soup.body.find(id="orderDetails")
344
            if orderDetails is not None and orderDetails.h4.text == "This order has been cancelled.":
345
                merchantOrder.closed = True
14698 amit.gupta 346
                merchantOrder.status = "cancelled"
14549 amit.gupta 347
                merchantOrder.requireDetail = False
348
                self._updateToOrder(todict(merchantOrder))
349
            else:
350
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14464 amit.gupta 351
 
13868 amit.gupta 352
    def getTrackingUrls(self, userId):
14074 amit.gupta 353
 
354
        missingOrderUrls = []
355
        missingOrders = self._getMissingOrders({'userId':userId})
356
        for missingOrder in missingOrders:
357
            missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
14683 amit.gupta 358
        orders = self._getActiveOrders({'userId':userId, "subOrders.trackingUrl":{"$exists":False} })
13882 amit.gupta 359
        count = len(orders)
13879 amit.gupta 360
        print "count", count
14948 amit.gupta 361
        print "Missing Urls"
362
        print "*************"
363
        print missingOrderUrls
13868 amit.gupta 364
        if count > 0:
14684 amit.gupta 365
            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 366
        else: 
14074 amit.gupta 367
            return missingOrderUrls
13927 amit.gupta 368
 
369
    def trackOrdersForUser(self, userId, url, rawHtml):
14285 amit.gupta 370
        directory = "/tmp/User" + str(userId)
371
        if not os.path.exists(directory):
372
            os.makedirs(directory)
14173 amit.gupta 373
 
14945 amit.gupta 374
 
13995 amit.gupta 375
        try:
376
            searchMap = {'userId':userId}
377
            collectionMap = {'merchantOrderId':1}
378
            activeOrders = self._getActiveOrders(searchMap, collectionMap)
14033 amit.gupta 379
            datetimeNow = datetime.now()
380
            timestamp = int(time.mktime(datetimeNow.timetuple()))
14009 amit.gupta 381
            print "url----------------", url
14008 amit.gupta 382
 
14320 amit.gupta 383
            if url == 'https://www.amazon.in/gp/css/order-history' or 'https://www.amazon.in/gp/css/order-history/?orderFilter=cancelled' in url:
14945 amit.gupta 384
                if url == 'https://www.amazon.in/gp/css/order-history':
385
                    filename = directory + "/orderSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')
386
                else:   
387
                    filename = directory + "/cancelledSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')   
388
                f = open(filename,'w')
389
                f.write(rawHtml) # python will convert \n to os.linesep
390
                f.close() # you can omit in most cases as the destructor will call if
13995 amit.gupta 391
                soup = BeautifulSoup(rawHtml)
392
                allOrders = soup.find(id="ordersContainer").findAll('div', {'class':'a-box-group a-spacing-base order'})
393
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
394
                for activeOrder in activeOrders:
395
                    for orderEle in allOrders:
396
                        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'})
397
                        merchantOrderId = orderdiv.find('span', {'class':'a-color-secondary value'}).text.strip()
398
                        if merchantOrderId==activeOrder['merchantOrderId']:
399
                            closed = True
400
                            shipments = orderEle.findAll('div',{'class':re.compile('.*?a-box.*?')}, recursive=False)
401
                            shipments.pop(0)
402
                            for shipment in shipments:
403
                                shipdiv = shipment.find('div', {'class':'a-box-inner'})
14050 amit.gupta 404
                                sdivs = shipment.div.div.findAll('div', recursive=False)
14065 amit.gupta 405
                                orderStatus = sdivs[0].span.text.strip()
14050 amit.gupta 406
                                status = self._getStatusFromDetailedStatus(orderStatus)
407
                                if status == MStore.ORDER_DELIVERED:
14299 amit.gupta 408
                                    deliveredOn = sdivs[0].findAll('span')[-1].text.strip()
14050 amit.gupta 409
                                    deliveredOn = deliveredOn.split(":")[1].strip()
14335 amit.gupta 410
                                deliveryestimatespan = sdivs[0].find('span', {'class':'a-color-success'})
411
                                deliveryEstimate = None
412
                                if deliveryestimatespan is not None:
413
                                    deliveryEstimate = deliveryestimatespan.find('span', {'class':'a-text-bold'}).text.strip()
414
                                productDivs = shipdiv.find('div', {'class':re.compile('.*?a-spacing-top-medium.*?')}).find('div', {'class':'a-row'}).findAll('div', recursive=False)
13995 amit.gupta 415
                                trackingUrl = None
416
                                for buttonDiv in shipdiv.findAll('span', {'class':'a-button-inner'}):
417
                                    if buttonDiv.find('a').text.strip()=='Track package':
418
                                        trackingUrl = buttonDiv.find('a')['href'].strip()
419
                                        if not trackingUrl.startswith("http"):
14608 amit.gupta 420
                                            trackingUrl = "http://www.amazon.in" + trackingUrl
13995 amit.gupta 421
                                        break
422
                                for prodDiv in productDivs:
423
                                    prodDiv.find('div', {'class':'a-fixed-left-grid-inner'})
424
                                    productTitle = prodDiv.find('div', {'class':'a-fixed-left-grid-inner'}).find("div", {'class':'a-row'}).find('a').text.strip()
425
                                    imgUrl = prodDiv.find("img")["src"]
426
                                    for subOrder in activeOrder['subOrders']:
427
                                        if subOrder['productTitle'] == productTitle:
428
                                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId")}
429
                                            updateMap = {}
430
                                            closedStatus = False
431
                                            updateMap['subOrders.$.imgUrl'] = imgUrl
14033 amit.gupta 432
                                            updateMap['subOrders.$.lastTracked'] = timestamp
13995 amit.gupta 433
                                            updateMap['subOrders.$.detailedStatus'] = orderStatus
434
                                            cashbackStatus = subOrder.get("cashBackStatus")
435
                                            updateMap['subOrders.$.status'] = status 
436
 
437
                                            if status==MStore.ORDER_DELIVERED:                               
14291 amit.gupta 438
                                                updateMap['subOrders.$.deliveredOn'] = deliveredOn
13995 amit.gupta 439
                                                closedStatus = True
440
                                                updateMap['subOrders.$.closed'] = True
441
                                                if cashbackStatus == Store.CB_PENDING:
14607 amit.gupta 442
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
13995 amit.gupta 443
                                            if status==MStore.ORDER_CANCELLED:     
444
                                                closedStatus = True
445
                                                updateMap['subOrders.$.closed'] = True
446
                                                if cashbackStatus == Store.CB_PENDING:
447
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
448
                                            if status==MStore.ORDER_SHIPPED:   
449
                                                updateMap['subOrders.$.estimatedDeliveryDate'] = deliveryEstimate
450
                                                if trackingUrl is not None:
451
                                                    updateMap['subOrders.$.trackingUrl'] = trackingUrl
452
                                            if not closedStatus:
453
                                                closed = False
454
                                            bulk.find(findMap).update({'$set' : updateMap})
455
                                            break
456
                            bulk.find({'orderId': activeOrder['orderId']}).update({'$set':{'closed': closed}})            
14080 amit.gupta 457
                bulk.execute()
458
                return 'PARSED_SUCCESS'
459
            else:
14086 amit.gupta 460
                merchantOrderId = re.findall(r'https://www.amazon.in/gp/css/summary/edit.html\?orderID=(.*)?', url, re.IGNORECASE)[0] 
14085 amit.gupta 461
                merchantOrder = self.db.merchantOrder.find_one({"merchantOrderId":merchantOrderId})
14945 amit.gupta 462
 
463
                filename = directory + "/" + merchantOrderId   
464
                f = open(filename,'w')
465
                f.write(rawHtml) # python will convert \n to os.linesep
466
                f.close() # you can omit in most cases as the destructor will call if
467
                self.parseOrderRawHtml(merchantOrder['orderId'], merchantOrder['subTagId'], merchantOrder['userId'], rawHtml, url, True)['result']
14080 amit.gupta 468
                return 'PARSED_SUCCESS'
469
                pass
14008 amit.gupta 470
            return 'PARSED_SUCCESS_NO_ORDERS'
13995 amit.gupta 471
        except:
472
            traceback.print_exc()    
473
            return 'PARSED_FAILED'
474
 
475
    def _getStatusFromDetailedStatus(self, detailedStatus):
14061 amit.gupta 476
        if "ordered from" in detailedStatus.lower():
477
            return MStore.ORDER_PLACED 
478
 
13995 amit.gupta 479
        for key, value in self.orderStatusRegexMap.iteritems():
14032 amit.gupta 480
            if detailedStatus.lower() in value:
13995 amit.gupta 481
                return key
482
 
14676 amit.gupta 483
        print "Detailed Status need to be mapped", "Store:", self.store_id
13995 amit.gupta 484
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
14624 amit.gupta 485
    def scrapeAffiliate(self, startDate=None, endDate=None):
14650 amit.gupta 486
        br = getBrowserObject()
487
        br.add_password('https://assoc-datafeeds-eu.amazon.com', 'Saholic', 'Fnubyvp')
488
        url = AMAZON_AFF_URL
489
        response = br.open(url)
490
        #get data for past 40 days and store it to mongo
491
        dt = datetime.now()
14701 amit.gupta 492
        dat = dt - timedelta(days=2)
14651 amit.gupta 493
        url = AMAZON_AFF_FILE_URL%(datetime.strftime(dat, "%Y%m%d"))
494
        response = br.open(url)
495
        page = gzip.GzipFile(fileobj=response, mode='rb').read()
496
        j=-1
497
        for row in page.split("\n"):
498
            j += 1
499
            if j== 0 or j==1:
500
                continue
501
            fields = row.split("\t")
502
            if len(fields)>1:
503
                print fields
504
                amazonAffiliate = AmazonAffiliateInfo(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7], fields[8], fields[9])
505
                print amazonAffiliate
506
                self.db.amazonAffiliateInfo.insert(todict(amazonAffiliate))
507
            else:
508
                break
14650 amit.gupta 509
 
14608 amit.gupta 510
 
14749 amit.gupta 511
    def parseTrackingUrl(self, trackingUrl):
14624 amit.gupta 512
        subOrder = {}
14749 amit.gupta 513
        page = fetchResponseUsingProxy(trackingUrl)
14624 amit.gupta 514
        soup = BeautifulSoup(page)
515
        alertContainer = soup.find("div", {"class":"a-box-inner a-alert-container"})
516
        if alertContainer is not None:
517
            statusText = alertContainer.h4.span.text
518
            detailedStatus = statusText.split(":")[0].strip()
519
            subOrder['detailedStatus'] = detailedStatus
520
            if detailedStatus.lower() == "in transit":
521
                pass
522
            elif detailedStatus.lower() == "undeliverable":
523
                subOrder['status'] = MStore.ORDER_CANCELLED
524
                return subOrder
525
        else:
526
            summaryLeft = soup.find(id="summaryLeft")
527
            statusText = summaryLeft.h2.text
528
            detailedStatus = statusText.split(":")[0].strip()
529
            subOrder['detailedStatus'] = detailedStatus
530
            if detailedStatus.lower() == "delivered":
531
                subOrder['deliveredOn'] = summaryLeft.findAll("span")[-2].text.strip()
532
                subOrder['status'] = MStore.ORDER_DELIVERED
533
                return subOrder
534
            else:
535
                subOrder['expectedDelivery'] = summaryLeft.findAll("span")[-1].text.strip()
536
        return subOrder
537
 
538
 
539
 
14608 amit.gupta 540
 
541
 
13927 amit.gupta 542
 
543
 
13774 amit.gupta 544
def main():
14945 amit.gupta 545
    readSSh("/tmp/order2015-04-23 12:39:09.743683")
546
    #store = getStore(1)
14756 amit.gupta 547
    #store.scrapeStoreOrders()
14650 amit.gupta 548
#    br = mechanize.Browser()
549
#    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'),
550
#                     ('Accept', 'text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8'),
551
#                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
552
#                     ('Accept-Language', 'en-US,en;q=0.8'),                     
553
#                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
554
#    store.scrapeStoreOrders()
14945 amit.gupta 555
    #store.parseOrderRawHtml(1306, "13232", 14, readSSh("/home/amit/322.html"), "https://www.amazon.in/gp/css/summary/edit.html?orderID=171-5570474-5548341")
14722 amit.gupta 556
    #store.parseOrderRawHtml(2121, "13232", 14, readSSh("/home/amit/f1.html"), "https://www.amazon.in/gp/css/summary/edit.html?orderID=171-5196461-3230730")
14813 amit.gupta 557
    #readSSh("/tmp/User211/2015-04-12 10:32:41.905765")
14703 amit.gupta 558
    #store.scrapeAffiliate()
14162 amit.gupta 559
def readSSh(fileName):
560
    try:
561
            str1 = open(fileName).read()
562
            return str1
563
    except:
564
        ssh_client = SSHClient()
565
        str1 = ""
566
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
567
        ssh_client.connect('104.200.25.40', 22, 'root', 'ecip$dtrMay2014')
568
        sftp_client = ssh_client.open_sftp()
569
        try:
14299 amit.gupta 570
            if not os.path.exists(os.path.dirname(fileName)):
571
                os.makedirs(os.path.dirname(fileName))
14162 amit.gupta 572
            sftp_client.get(fileName, fileName)
573
            try:
574
                str1 = open(fileName).read()
575
                return str1
576
            finally:
577
                pass
578
        except:
579
            "could not read"
580
        return str1
13774 amit.gupta 581
 
582
 
583
if __name__ == '__main__':
14284 amit.gupta 584
        main()