Subversion Repositories SmartDukaan

Rev

Rev 16371 | Rev 16474 | 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
15346 amit.gupta 27
from dtr.storage.Mongo import getDealRank
15555 amit.gupta 28
from dtr.storage.DataService import OrdersRaw
29
from elixir import *
13774 amit.gupta 30
 
31
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
13810 amit.gupta 32
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
13823 amit.gupta 33
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
14624 amit.gupta 34
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
14650 amit.gupta 35
AMAZON_AFF_FILE_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/getReport?filename=saholic-21-orders-report-%s.tsv.gz'
13774 amit.gupta 36
class Store(MStore):
13821 amit.gupta 37
 
14032 amit.gupta 38
    orderStatusRegexMap = { MStore.ORDER_PLACED : ['ordered from', 'not yet dispatched','dispatching now', 'preparing for dispatch'],
14064 amit.gupta 39
                            MStore.ORDER_SHIPPED : ['dispatched on','dispatched', 'on the way', 'out for delivery', 'Out for delivery'],
14032 amit.gupta 40
                            MStore.ORDER_CANCELLED : ['return complete', 'refunded', 'cancelled'],
41
                            MStore.ORDER_DELIVERED : ['delivered']
13821 amit.gupta 42
                           }
13774 amit.gupta 43
 
44
    def __init__(self,store_id):
45
        super(Store, self).__init__(store_id)
46
 
47
    def getName(self):
14749 amit.gupta 48
        return "amazon"
13774 amit.gupta 49
 
14945 amit.gupta 50
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl, track=False):
14958 amit.gupta 51
        parseString = "Tracking" if track else "Transacted"
52
        print parseString, "Order Id to be parsed is :", orderId
13796 amit.gupta 53
        resp = {}
14813 amit.gupta 54
        resp['result'] = 'ORDER_NOT_CREATED'
13821 amit.gupta 55
        if ORDER_SUCCESS_URL in orderSuccessUrl or THANKYOU_URL in orderSuccessUrl:
13774 amit.gupta 56
            try:
57
                soup = BeautifulSoup(rawHtml)
14608 amit.gupta 58
                try:
59
                    orderUrl = soup.find('div', {"id":"thank-you-box-wrapper"}).div.findAll('div', recursive=False)[1].a['href']
60
                    merchantOrderId = re.findall(r'.*&oid=(.*)&?.*?', orderUrl)[0]
61
                except:
62
                    merchantOrderId = soup.find(id="orders-list").div.span.b.text
14699 amit.gupta 63
                order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, True)
14972 amit.gupta 64
                order.orderTrackingUrl = ORDER_REDIRECT_URL % (merchantOrderId)
65
                order.orderSuccessUrl = orderSuccessUrl
14211 amit.gupta 66
                order.merchantOrderId = merchantOrderId
14291 amit.gupta 67
                order.requireDetail = True
14698 amit.gupta 68
                order.status = 'html_required'
14297 amit.gupta 69
                order.closed = None
14312 amit.gupta 70
                if self._saveToOrder(todict(order)):
71
                    resp['result'] = 'ORDER_CREATED'
72
                    resp["url"] = ORDER_REDIRECT_URL % (merchantOrderId)
73
                    resp["htmlRequired"] = True
74
                    resp['orderId'] = orderId
75
                else:
76
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
77
 
13774 amit.gupta 78
            except:
14813 amit.gupta 79
                #Write all cases here for Order Not created Known
14809 amit.gupta 80
                try:
14815 amit.gupta 81
                    if 'Securely redirecting you' in soup.h3.text.strip():
14813 amit.gupta 82
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
14809 amit.gupta 83
                    else:
14813 amit.gupta 84
                        raise
14809 amit.gupta 85
                except:
14814 amit.gupta 86
                    try:
16283 amit.gupta 87
                        if soup.h1.text.strip() in ['This is a duplicate order', 'There was a problem with your payment.', 'Your Orders']:
14814 amit.gupta 88
                            resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
89
                        else:
90
                            raise
91
                    except:
15046 amit.gupta 92
                        try:
93
                            if soup.h2.text.strip() == 'Web page not available':
94
                                resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
95
                            else:
96
                                raise
97
                        except:
15565 amit.gupta 98
                            try:
15569 amit.gupta 99
                                if soup.find(id="loading-spinner-img") is not None or soup.find(id="anonCarousel1") is not None or soup.find(id="ap_signin_pagelet_title") is not None:
15565 amit.gupta 100
                                    resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
101
                                else:
102
                                    raise
103
                            except:
104
                                resp['result'] = 'ORDER_NOT_CREATED_UNKNOWN'
105
 
13774 amit.gupta 106
        else:
13781 amit.gupta 107
            try:
14722 amit.gupta 108
                mo = self.db.merchantOrder.find_one({"orderId":orderId})
109
                if mo is not None:
14749 amit.gupta 110
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, False)
14722 amit.gupta 111
                    merchantOrder.createdOn = mo.get("createdOn")
112
                    merchantOrder.createdOnInt =  mo.get("createdOnInt")
113
                else:
14945 amit.gupta 114
                    print "Could not find amazon order with order Id", orderId
14749 amit.gupta 115
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14464 amit.gupta 116
                soup = BeautifulSoup(rawHtml)
117
                try:
14961 amit.gupta 118
                    self.parseNewStlye(merchantOrder, soup)
15046 amit.gupta 119
                    resp['result'] = 'DETAIL_CREATED'
14464 amit.gupta 120
                except:
14545 amit.gupta 121
                    try:
14566 amit.gupta 122
                        traceback.print_exc()
14961 amit.gupta 123
                        self.parseOldStlye(merchantOrder, soup)
15046 amit.gupta 124
                        resp['result'] = 'DETAIL_CREATED'
14545 amit.gupta 125
                    except:
14566 amit.gupta 126
                        traceback.print_exc()
15056 amit.gupta 127
                        try:
128
                            self.parseCancelled(merchantOrder, soup)
129
                            resp['result'] = 'ORDER_CANCELLED'
130
                        except:
15059 amit.gupta 131
                            try:
16283 amit.gupta 132
                                if soup.h1.span.text=="Account" or soup.h1 in ["Your Account"]:
15059 amit.gupta 133
                                    resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
134
                                else:
135
                                    raise
136
                            except:
137
                                if soup.find(id="ap_signin_pagelet_title").h1.text.strip()=="Sign In":
138
                                    resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
139
                                else:
140
                                    raise
13781 amit.gupta 141
            except:
14813 amit.gupta 142
                order = self.db.merchantOrder.find_one({"orderId":orderId})
143
                if order is not None:
144
                    self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"status":"parse_failed"}})
145
                print "Error occurred"
15046 amit.gupta 146
                resp['result'] = 'DETAIL_NOT_CREATED_UNKNOWN'
14813 amit.gupta 147
                traceback.print_exc()
15046 amit.gupta 148
        return resp    
13774 amit.gupta 149
 
13868 amit.gupta 150
    #This should be exposed from api for specific sources
151
    def scrapeStoreOrders(self):
14624 amit.gupta 152
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders.closed":False, "subOrders.trackingUrl":{"$exists":True}})
153
        for merchantOrder in orders:
14981 amit.gupta 154
            executeBulk = False
14624 amit.gupta 155
            try:
156
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
157
                closed = True
158
                map1 = {}
159
                for subOrder in merchantOrder.get("subOrders"):
160
                    if subOrder.get("closed"):
161
                        continue
162
                    elif subOrder.get("trackingUrl") is None:
163
                        closed = False
164
                        continue
14981 amit.gupta 165
                    executeBulk = True
14624 amit.gupta 166
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
167
                    trackingUrl = subOrder.get("trackingUrl")
168
                    if not map1.has_key(trackingUrl):
16468 amit.gupta 169
                        map1[trackingUrl] = self.parseTrackingUrl(trackingUrl, merchantOrder.get("orderId"))
14624 amit.gupta 170
                    newOrder = map1.get(trackingUrl)
16371 amit.gupta 171
                    updateMap = self.getUpdateMap(newOrder, subOrder.get('cashBackStatus'))
14624 amit.gupta 172
                    print findMap, "\n", updateMap
173
                    bulk.find(findMap).update({'$set' : updateMap})
174
                    closed = closed and newOrder['closed']
14981 amit.gupta 175
                if executeBulk:
14697 amit.gupta 176
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":closed, "parseError":False}})
14981 amit.gupta 177
                    bulk.execute()
14624 amit.gupta 178
            except:
14847 amit.gupta 179
                tprint("Could not update " + str(merchantOrder['orderId']) + " For store " + self.getName())
14692 amit.gupta 180
                self.db.merchantOrder.update({"orderId":merchantOrder['orderId']}, {"$set":{"parseError":True}})
14624 amit.gupta 181
                traceback.print_exc()
182
 
14608 amit.gupta 183
 
184
 
14771 amit.gupta 185
    def parserest(self, soup):
186
        print "Hi"
187
        if soup.find('h1'):
188
            print "OK"
14608 amit.gupta 189
 
14464 amit.gupta 190
    def parseOldStlye(self, merchantOrder, soup):
191
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
192
        table = soup.body.findAll("table", recursive=False)[1]
193
        #print table
194
        tables = table.tr.td.findAll("table", recursive=False)
195
        for tr in tables[2].findAll("tr"):
196
            boldElement = tr.td.b
197
            if "Order Placed" in str(boldElement):
198
                merchantOrder.placedOn = boldElement.next_sibling.strip()
199
            if "order number" in str(boldElement):
200
                merchantOrder.merchantOrderId = boldElement.next_sibling.strip()
201
            if "Order Total" in str(boldElement):
202
                merchantOrder.paidAmount = int(float(boldElement.find('span').contents[-1].replace(',','')))
203
        anchors = table.tr.td.findAll("a", recursive=False)
204
        paymentAnchor = anchors.pop(-1)
205
 
206
        count = 0
207
        subOrders = []
208
        merchantOrder.subOrders = subOrders
209
        counter = 0 
210
        for anchor in anchors:
211
            count += 1
212
            tab = anchor.next_sibling
213
            status = MStore.ORDER_PLACED
214
            subStr = "Delivery #" + str(count) + ":"
215
            if subStr in  tab.find("b").text:
216
                detailedStatus = tab.find("b").text.replace(subStr, '').strip()
217
 
218
            tab = tab.next_sibling.next_sibling
219
            trs = tab.find("table").find('tbody').findAll("tr", recursive = False)
220
 
221
            estimatedDelivery = trs[0].td.find("b").next_sibling.strip()
222
 
223
            orderItemTrs = trs[1].findAll("td", recursive=False)[1].table.tbody.findAll("tr", recursive = False)
224
            i = -1
225
            for orderItemTr in orderItemTrs:
226
                i += 1
227
                if i%2 == 0:
228
                    continue
229
                counter += 1
230
                quantity =  int(re.findall(r'\d+', orderItemTr.td.contents[0])[0])
231
 
232
                productUrl = orderItemTr.td.contents[1].a["href"]
233
                productTitle = orderItemTr.td.contents[1].a.text
234
 
235
                unitPrice = int(float(orderItemTr.findAll('td')[1].span.text.replace('Rs. ','').replace(',','')))
236
 
237
 
238
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, unitPrice*quantity, status, quantity)
239
                subOrder.merchantSubOrderId = str(counter) + " of " + merchantOrder.merchantOrderId
240
                subOrder.estimatedDeliveryDate = estimatedDelivery
14722 amit.gupta 241
                estDlvyTime = datetime.strptime(estimatedDelivery.split('-')[0].strip(), "%A %d %B %Y")
242
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
243
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 244
                subOrder.productCode = productUrl.split('/')[5]
245
                subOrder.detailedStatus = detailedStatus
246
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice*quantity)
15346 amit.gupta 247
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
248
                subOrder.dealRank = dealRank.get('rank')
249
                subOrder.rankDesc = dealRank.get('description')
16283 amit.gupta 250
                subOrder.maxNlc = dealRank.get('maxNlc')
251
                subOrder.minNlc = dealRank.get('minNlc')
252
                subOrder.db = dealRank.get('dp')
253
                subOrder.itemStatus = dealRank.get('status')
14464 amit.gupta 254
                cashbackStatus = Store.CB_PENDING
255
                if cashbackAmount <= 0:
256
                    cashbackStatus = Store.CB_NA
257
                subOrder.cashBackStatus = cashbackStatus
258
                subOrder.cashBackAmount = cashbackAmount
259
                if percentage > 0:
260
                    subOrder.cashBackPercentage = percentage
261
                subOrders.append(subOrder)
262
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
263
        totalAmount = 0
264
        grandAmount = 0
265
        for price in priceList:
266
            labelTd = price.td
267
            if 'Subtotal:' in labelTd.text:
268
                totalAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
269
            elif 'Grand Total:' in labelTd.text:
270
                grandAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
271
        if grandAmount < totalAmount:
272
            diff = totalAmount - grandAmount
273
            for subOrder in merchantOrder.subOrders:
274
                subOrder.amountPaid -= int(diff*(1-subOrder.amountPaid/totalAmount))
14698 amit.gupta 275
        merchantOrder.status='success'
14464 amit.gupta 276
        self._updateToOrder(todict(merchantOrder))
277
 
278
    def parseNewStlye(self, merchantOrder, soup):
279
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
280
        orderDetailsContainer = soup.body.find(id="orderDetails")
14566 amit.gupta 281
        divAfterH1 = orderDetailsContainer.h1.next_sibling.next_sibling
282
        orderLeftDiv = divAfterH1.div
14464 amit.gupta 283
        placedOnSpan = orderLeftDiv.find("span", {'class':'order-date-invoice-item'})
284
        merchantOrder.placedOn =placedOnSpan.text.split('Ordered on')[1].strip()
285
        merchantOrder.merchantOrderId = placedOnSpan.next_sibling.next_sibling.text.split('Order#')[1].strip()
15555 amit.gupta 286
        try:
287
            priceBox = divAfterH1.next_sibling.next_sibling.next_sibling.next_sibling.find("div", {"class":"a-box-inner"}).div.div.findAll('div', recursive=False)[-1]
288
        except:
289
            priceBox = divAfterH1.next_sibling.next_sibling.next_sibling.next_sibling.find("div", {"class":"a-box a-last"}).div.div.findAll('div', recursive=False)[-1]
14464 amit.gupta 290
        priceRows = priceBox.findAll('div', {'class':'a-row'})
291
        subTotal = 0
14566 amit.gupta 292
        shippingPrice = 0   
14464 amit.gupta 293
        promoApplied = 0
294
        for priceRow in priceRows:
295
            if "Item(s) Subtotal:" in str(priceRow):
296
                subTotal = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
297
            elif "Shipping:" in str(priceRow):
298
                shippingPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
299
            elif "Grand Total:" in str(priceRow):
300
                grandPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
301
                merchantOrder.paidAmount = grandPrice
302
            elif "Total:" in str(priceRow):
303
                totalPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
304
            elif "Promotion Applied:" in str(priceRow):
305
                promoApplied  += int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
306
        totalPaid = subTotal        
307
        if promoApplied > 0:
308
            totalPaid -= promoApplied
309
            if shippingPrice <= promoApplied:
310
                totalPaid  += shippingPrice
15473 amit.gupta 311
 
15474 amit.gupta 312
        shipmentDivs = orderDetailsContainer.find('div', class_='shipment').findAll('div', recursive = False)
14464 amit.gupta 313
        subOrders = []
314
        merchantOrder.subOrders = subOrders
315
        i=1
15473 amit.gupta 316
        closedStatus = True
14464 amit.gupta 317
        for shipmentDiv in shipmentDivs:
318
            innerBoxes = shipmentDiv.findAll('div', recursive = False)
319
            statusDiv = innerBoxes[0]
320
            subOrderStatus = statusDiv.div.span.text.strip()
14566 amit.gupta 321
            deliverySpan = statusDiv.div.div.find_next_sibling('div').span
14464 amit.gupta 322
            productDivs = innerBoxes[-1].div.div.div.findAll('div', recursive=False)
323
            subOrders = []
324
            merchantOrder.subOrders = subOrders
325
            for i, productDiv in enumerate(productDivs):
326
                i +=1 
327
                imgDiv  = productDiv.div.div
328
                detailDiv = imgDiv.find_next_sibling('div')
329
                detailDivs = detailDiv.findAll('div', recursive=False)
330
                arr = detailDivs[0].a.text.strip().split(" of ", 1)
14465 amit.gupta 331
                (productTitle, quantity) = (arr[-1], (1 if len(arr)==1 else int(arr[0])) )
14820 amit.gupta 332
                try:
333
                    unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
334
                except:
335
                    unitPrice = int(float(detailDivs[3].span.text.replace('Rs. ','').replace(',','')))
14464 amit.gupta 336
                amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
337
                productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
338
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
339
                subOrder.productCode = productUrl.split('/')[5]
340
                subOrder.unitPrice = unitPrice
14566 amit.gupta 341
                subOrder.merchantSubOrderId = str(i) + " of " + merchantOrder.merchantOrderId
14722 amit.gupta 342
                estDlvyTime = datetime.now()
14566 amit.gupta 343
                if deliverySpan is not None:
14756 amit.gupta 344
                    try:
345
                        subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip()
346
                        estDate = subOrder.estimatedDeliveryDate.split("-")[0].strip()
347
                        subOrder.estimatedDeliveryInt = int(time.mktime((datetime.strptime(estDate, "%A %d %B %Y")).timetuple()))
348
                        estDlvyTime = datetime.strptime(estDate, "%A %d %B %Y")
349
                    except:
15473 amit.gupta 350
                        if "Delivered on" in deliverySpan.text:
351
                            subOrder.deliveredOn = deliverySpan.text.split(":")[1].strip() 
14756 amit.gupta 352
                        subOrder.estimatedDeliveryDate = "Not available"
15473 amit.gupta 353
 
14722 amit.gupta 354
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
14756 amit.gupta 355
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 356
                subOrder.detailedStatus = subOrderStatus
357
                subOrder.deliveryCharges = shippingPrice
14466 amit.gupta 358
                subOrder.imgUrl = imgDiv.img["src"]
14464 amit.gupta 359
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid)
15346 amit.gupta 360
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
361
                subOrder.dealRank = dealRank.get('rank')
362
                subOrder.rankDesc = dealRank.get('description')
14464 amit.gupta 363
                cashbackStatus = Store.CB_PENDING
364
                if cashbackAmount <= 0:
365
                    cashbackStatus = Store.CB_NA
366
                subOrder.cashBackStatus = cashbackStatus
367
                subOrder.cashBackAmount = cashbackAmount
368
                if percentage > 0:
369
                    subOrder.cashBackPercentage = percentage
15473 amit.gupta 370
                if hasattr(subOrder, 'deliveredOn'):                               
371
                    subOrder.status = Store.ORDER_DELIVERED
372
                    subOrder.closed = True
373
                    if subOrder.cashBackStatus == Store.CB_PENDING:
374
                        subOrder.cashBackStatus = Store.CB_APPROVED
375
                elif closedStatus:
376
                    closedStatus= False
14464 amit.gupta 377
                subOrders.append(subOrder)
14698 amit.gupta 378
        merchantOrder.status='success'
15473 amit.gupta 379
        merchantOrder.closed = closedStatus
14464 amit.gupta 380
        self._updateToOrder(todict(merchantOrder))
14545 amit.gupta 381
 
382
    def parseCancelled(self, merchantOrder,soup):
14722 amit.gupta 383
        try:
384
            fonts = soup.body.findAll("table", recursive=False)[1].findAll("font")
385
            if fonts[0].text == "Important Message":
386
                if fonts[1].text=="This order has been cancelled.":
387
                    merchantOrder.closed = True
388
                    merchantOrder.status = "cancelled"
389
                    merchantOrder.requireDetail = False
390
                    self._updateToOrder(todict(merchantOrder))
391
                    return
392
                else:
393
                    raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14545 amit.gupta 394
            else:
395
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14722 amit.gupta 396
        except:
14549 amit.gupta 397
            orderDetails = soup.body.find(id="orderDetails")
398
            if orderDetails is not None and orderDetails.h4.text == "This order has been cancelled.":
399
                merchantOrder.closed = True
14698 amit.gupta 400
                merchantOrder.status = "cancelled"
14549 amit.gupta 401
                merchantOrder.requireDetail = False
402
                self._updateToOrder(todict(merchantOrder))
403
            else:
404
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14464 amit.gupta 405
 
13868 amit.gupta 406
    def getTrackingUrls(self, userId):
14074 amit.gupta 407
 
408
        missingOrderUrls = []
409
        missingOrders = self._getMissingOrders({'userId':userId})
410
        for missingOrder in missingOrders:
411
            missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
14683 amit.gupta 412
        orders = self._getActiveOrders({'userId':userId, "subOrders.trackingUrl":{"$exists":False} })
13882 amit.gupta 413
        count = len(orders)
13879 amit.gupta 414
        print "count", count
14948 amit.gupta 415
        print "Missing Urls"
416
        print "*************"
417
        print missingOrderUrls
13868 amit.gupta 418
        if count > 0:
14684 amit.gupta 419
            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 420
        else: 
14074 amit.gupta 421
            return missingOrderUrls
13927 amit.gupta 422
 
423
    def trackOrdersForUser(self, userId, url, rawHtml):
14985 amit.gupta 424
        directory = "/AmazonTrack/User" + str(userId)
14285 amit.gupta 425
        if not os.path.exists(directory):
426
            os.makedirs(directory)
14173 amit.gupta 427
 
14945 amit.gupta 428
 
13995 amit.gupta 429
        try:
430
            searchMap = {'userId':userId}
431
            collectionMap = {'merchantOrderId':1}
432
            activeOrders = self._getActiveOrders(searchMap, collectionMap)
14033 amit.gupta 433
            datetimeNow = datetime.now()
434
            timestamp = int(time.mktime(datetimeNow.timetuple()))
14009 amit.gupta 435
            print "url----------------", url
14008 amit.gupta 436
 
14320 amit.gupta 437
            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 438
                if url == 'https://www.amazon.in/gp/css/order-history':
439
                    filename = directory + "/orderSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')
440
                else:   
441
                    filename = directory + "/cancelledSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')   
442
                f = open(filename,'w')
443
                f.write(rawHtml) # python will convert \n to os.linesep
444
                f.close() # you can omit in most cases as the destructor will call if
13995 amit.gupta 445
                soup = BeautifulSoup(rawHtml)
446
                allOrders = soup.find(id="ordersContainer").findAll('div', {'class':'a-box-group a-spacing-base order'})
447
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
448
                for activeOrder in activeOrders:
449
                    for orderEle in allOrders:
450
                        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'})
451
                        merchantOrderId = orderdiv.find('span', {'class':'a-color-secondary value'}).text.strip()
452
                        if merchantOrderId==activeOrder['merchantOrderId']:
453
                            closed = True
454
                            shipments = orderEle.findAll('div',{'class':re.compile('.*?a-box.*?')}, recursive=False)
455
                            shipments.pop(0)
456
                            for shipment in shipments:
457
                                shipdiv = shipment.find('div', {'class':'a-box-inner'})
14050 amit.gupta 458
                                sdivs = shipment.div.div.findAll('div', recursive=False)
14065 amit.gupta 459
                                orderStatus = sdivs[0].span.text.strip()
14050 amit.gupta 460
                                status = self._getStatusFromDetailedStatus(orderStatus)
461
                                if status == MStore.ORDER_DELIVERED:
14299 amit.gupta 462
                                    deliveredOn = sdivs[0].findAll('span')[-1].text.strip()
14962 amit.gupta 463
                                    try:
464
                                        deliveredOn = deliveredOn.split(":")[1].strip()
465
                                    except:
466
                                        deliveredOn = "" 
14335 amit.gupta 467
                                deliveryestimatespan = sdivs[0].find('span', {'class':'a-color-success'})
468
                                deliveryEstimate = None
469
                                if deliveryestimatespan is not None:
470
                                    deliveryEstimate = deliveryestimatespan.find('span', {'class':'a-text-bold'}).text.strip()
471
                                productDivs = shipdiv.find('div', {'class':re.compile('.*?a-spacing-top-medium.*?')}).find('div', {'class':'a-row'}).findAll('div', recursive=False)
13995 amit.gupta 472
                                trackingUrl = None
473
                                for buttonDiv in shipdiv.findAll('span', {'class':'a-button-inner'}):
474
                                    if buttonDiv.find('a').text.strip()=='Track package':
475
                                        trackingUrl = buttonDiv.find('a')['href'].strip()
476
                                        if not trackingUrl.startswith("http"):
14608 amit.gupta 477
                                            trackingUrl = "http://www.amazon.in" + trackingUrl
13995 amit.gupta 478
                                        break
479
                                for prodDiv in productDivs:
480
                                    prodDiv.find('div', {'class':'a-fixed-left-grid-inner'})
481
                                    productTitle = prodDiv.find('div', {'class':'a-fixed-left-grid-inner'}).find("div", {'class':'a-row'}).find('a').text.strip()
482
                                    imgUrl = prodDiv.find("img")["src"]
483
                                    for subOrder in activeOrder['subOrders']:
484
                                        if subOrder['productTitle'] == productTitle:
485
                                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId")}
486
                                            updateMap = {}
487
                                            closedStatus = False
488
                                            updateMap['subOrders.$.imgUrl'] = imgUrl
14033 amit.gupta 489
                                            updateMap['subOrders.$.lastTracked'] = timestamp
13995 amit.gupta 490
                                            updateMap['subOrders.$.detailedStatus'] = orderStatus
491
                                            cashbackStatus = subOrder.get("cashBackStatus")
492
                                            updateMap['subOrders.$.status'] = status 
493
 
494
                                            if status==MStore.ORDER_DELIVERED:                               
14291 amit.gupta 495
                                                updateMap['subOrders.$.deliveredOn'] = deliveredOn
13995 amit.gupta 496
                                                closedStatus = True
497
                                                updateMap['subOrders.$.closed'] = True
498
                                                if cashbackStatus == Store.CB_PENDING:
14607 amit.gupta 499
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
13995 amit.gupta 500
                                            if status==MStore.ORDER_CANCELLED:     
501
                                                closedStatus = True
502
                                                updateMap['subOrders.$.closed'] = True
503
                                                if cashbackStatus == Store.CB_PENDING:
504
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
505
                                            if status==MStore.ORDER_SHIPPED:   
506
                                                updateMap['subOrders.$.estimatedDeliveryDate'] = deliveryEstimate
507
                                                if trackingUrl is not None:
508
                                                    updateMap['subOrders.$.trackingUrl'] = trackingUrl
509
                                            if not closedStatus:
510
                                                closed = False
511
                                            bulk.find(findMap).update({'$set' : updateMap})
512
                                            break
513
                            bulk.find({'orderId': activeOrder['orderId']}).update({'$set':{'closed': closed}})            
14080 amit.gupta 514
                bulk.execute()
515
                return 'PARSED_SUCCESS'
516
            else:
15563 amit.gupta 517
                merchantOrderId = re.findall(r'https://www.amazon.in/gp/css/summary/edit.html\?orderID=(.*)?', url, re.IGNORECASE)[0]
518
                print  "merchantOrderId", merchantOrderId
14085 amit.gupta 519
                merchantOrder = self.db.merchantOrder.find_one({"merchantOrderId":merchantOrderId})
14945 amit.gupta 520
 
521
                filename = directory + "/" + merchantOrderId   
522
                f = open(filename,'w')
523
                f.write(rawHtml) # python will convert \n to os.linesep
524
                f.close() # you can omit in most cases as the destructor will call if
15555 amit.gupta 525
                result = self.parseOrderRawHtml(merchantOrder['orderId'], merchantOrder['subTagId'], merchantOrder['userId'], rawHtml, url, True)['result']
15562 amit.gupta 526
                print "result", result
15555 amit.gupta 527
                try:
15560 amit.gupta 528
                    order1 = session.query(OrdersRaw).filter_by(id=merchantOrder['orderId']).first()
529
                    order1.status = result
530
                    order1.rawhtml = rawHtml
15555 amit.gupta 531
                    session.commit()
15561 amit.gupta 532
                except:
533
                    traceback.print_exc()
15555 amit.gupta 534
                finally:
535
                    session.close()
14080 amit.gupta 536
                return 'PARSED_SUCCESS'
537
                pass
14008 amit.gupta 538
            return 'PARSED_SUCCESS_NO_ORDERS'
13995 amit.gupta 539
        except:
540
            traceback.print_exc()    
541
            return 'PARSED_FAILED'
542
 
543
    def _getStatusFromDetailedStatus(self, detailedStatus):
14061 amit.gupta 544
        if "ordered from" in detailedStatus.lower():
545
            return MStore.ORDER_PLACED 
546
 
13995 amit.gupta 547
        for key, value in self.orderStatusRegexMap.iteritems():
14032 amit.gupta 548
            if detailedStatus.lower() in value:
13995 amit.gupta 549
                return key
550
 
14676 amit.gupta 551
        print "Detailed Status need to be mapped", "Store:", self.store_id
13995 amit.gupta 552
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
14624 amit.gupta 553
    def scrapeAffiliate(self, startDate=None, endDate=None):
14650 amit.gupta 554
        br = getBrowserObject()
555
        br.add_password('https://assoc-datafeeds-eu.amazon.com', 'Saholic', 'Fnubyvp')
556
        url = AMAZON_AFF_URL
557
        response = br.open(url)
558
        #get data for past 40 days and store it to mongo
559
        dt = datetime.now()
14701 amit.gupta 560
        dat = dt - timedelta(days=2)
14651 amit.gupta 561
        url = AMAZON_AFF_FILE_URL%(datetime.strftime(dat, "%Y%m%d"))
562
        response = br.open(url)
563
        page = gzip.GzipFile(fileobj=response, mode='rb').read()
564
        j=-1
565
        for row in page.split("\n"):
566
            j += 1
567
            if j== 0 or j==1:
568
                continue
569
            fields = row.split("\t")
570
            if len(fields)>1:
571
                print fields
572
                amazonAffiliate = AmazonAffiliateInfo(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7], fields[8], fields[9])
573
                print amazonAffiliate
574
                self.db.amazonAffiliateInfo.insert(todict(amazonAffiliate))
575
            else:
576
                break
14650 amit.gupta 577
 
14608 amit.gupta 578
 
16468 amit.gupta 579
    def parseTrackingUrl(self, trackingUrl, orderId):
14624 amit.gupta 580
        subOrder = {}
14749 amit.gupta 581
        page = fetchResponseUsingProxy(trackingUrl)
16468 amit.gupta 582
        status = MStore.ORDER_SHIPPED
583
        #print page
14624 amit.gupta 584
        soup = BeautifulSoup(page)
16468 amit.gupta 585
        header1 = soup.find("h1") 
586
        if header1:
587
            if header1.text=="Sign In":
588
                print "Login page is displayed for order id", orderId
14624 amit.gupta 589
                return subOrder
16468 amit.gupta 590
        try:
591
            detailedStatus = soup.find("div", {"class":"top"}).span.text.strip()
592
            try:
593
                displayStatus = soup.find("div",{"class":"a-column a-span12 shipment-status-content"}).span.text.strip()
594
            except:
595
                displayStatus = detailedStatus
596
            print displayStatus
597
            if detailedStatus.lower().find("delivered")>=0:
598
                print detailedStatus
599
                displayStatus = "Delivered"
600
                status = "Delivered"
601
                try:
602
                    subOrder["deliveredOn"] = detailedStatus.split("on")[1].strip()
603
                except:
604
                    pass
605
 
606
            elif detailedStatus.lower() == 'returned':
607
                status = 'Cancelled'
608
            subOrder['status'] = status
609
            subOrder['detailedStatus'] = displayStatus 
610
 
611
 
612
        except:
613
            print "failed to parse", orderId
614
            traceback.print_exc()
615
 
14624 amit.gupta 616
        return subOrder
617
 
618
 
619
 
14608 amit.gupta 620
 
621
 
13927 amit.gupta 622
 
623
 
13774 amit.gupta 624
def main():
16283 amit.gupta 625
    #str1 = readSSh("/AmazonTrack/User2466/orderSummary28-06:13:25:08")
16468 amit.gupta 626
    #str1 = readSSh("/AmazonTrack/User2466/orderSummary24-06:17:38:04")
627
    #str1 = readSSh("/AmazonTrack/User2466/orderSummary24-06:17:38:01")
628
    #str1 = readSSh("/AmazonTrack/User2466/orderSummary24-06:17:31:53")
16283 amit.gupta 629
    #str1 = readSSh("/AmazonTrack/User2466/orderSummary28-06:13:25:08")
630
    #str1 = readSSh("/AmazonTrack/User2466/orderSummary28-06:13:25:08")
15046 amit.gupta 631
    #readSSh("/tmp/User2/404-2225153-7073122")
16468 amit.gupta 632
    all={2769:'http://www.amazon.in/gp/css/shiptrack/view.html/ref=oh_aui_direct_track_pkg_o00_s00?ie=UTF8&marketplaceOfOrigin=&orderID=402-3378626-7402755&orderingShipmentId=759313961106&packageId=1&ref=',2924:'http://www.amazon.in/gp/css/shiptrack/view.html/ref=oh_aui_direct_track_pkg_o04_s00?ie=UTF8&marketplaceOfOrigin=&orderID=404-1934145-4940333&orderingShipmentId=761351446106&packageId=1&ref=',3013:'http://www.amazon.in/gp/css/shiptrack/view.html/ref=oh_aui_direct_track_pkg_o03_s00?ie=UTF8&marketplaceOfOrigin=&orderID=404-2323646-9315538&orderingShipmentId=1157078607092&packageId=1&ref=',4804:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljokmpnqlonpq&orderId=171-6936083-5808328&packageIndex=0&shipmentId=Dc7LxLj8R',6447:'http://www.amazon.in/gp/css/shiptrack/view.html/ref=oh_aui_direct_track_pkg_o00_s00?ie=UTF8&marketplaceOfOrigin=&orderID=402-5267336-7658751&orderingShipmentId=796566362106&packageId=1&ref=',6764:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljnplqntnqmnq&orderId=403-1762134-8866741&packageIndex=0&shipmentId=D1Q77kmKR',6807:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkqjsvipqoptq&orderId=403-2423963-4963501&packageIndex=0&shipmentId=DVLdJkmgR',6823:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llljooomtkqvq&orderId=171-4857073-8237901&packageIndex=0&shipmentId=DVCh1YmQR',6887:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkqkkuprtlqvq&orderId=171-2588190-5695535&packageIndex=0&shipmentId=DVmbM1mJR',7054:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljrgnvllmrptq&orderId=171-1005907-4197952&packageIndex=0&shipmentId=DVG4nnmjR',7237:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llnoptjttjsnq&orderId=404-9151579-1801132&packageIndex=0&shipmentId=Dn8Ht6mFR',7457:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljnllolormovq&orderId=404-7441140-2089951&packageIndex=0&shipmentId=DRTdg5xBN',7740:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lmjkmopqkmsvq&orderId=403-3268269-3497105&packageIndex=0&shipmentId=DXMRKmmrR',8237:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lmjkrqnosrmvq&orderId=402-9929953-1629148&packageIndex=0&shipmentId=D09sZsxsN',8238:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llllooltlktpq&orderId=402-5577202-4121143&packageIndex=0&shipmentId=DgcwgQmrR',8595:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkkmrvhqqkqvq&orderId=403-6686659-8341932&packageIndex=0&shipmentId=DVxlhWmSR',8948:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljrnmwpplknpq&orderId=404-4274603-2058711&packageIndex=0&shipmentId=DN0JbVkpR',8979:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lknktuorqoqrq&orderId=403-7785786-1441940&packageIndex=0&shipmentId=DgprHkkwR',9184:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkjkswoprrlpq&orderId=404-1980439-1674729&packageIndex=0&shipmentId=DwpFBGkzR',9207:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkrnrwqnmllpq&orderId=402-2502378-3282757&packageIndex=0&shipmentId=D6GzwWkdR',9285:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljrnqwnqtmsrq&orderId=402-6126669-4675512&packageIndex=0&shipmentId=D12qBGk4R',9317:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkllqwqumnonq&orderId=404-6368449-3713921&packageIndex=0&shipmentId=DnQQynkYR',9324:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkknpsmntintq&orderId=171-1046230-1213920&packageIndex=0&shipmentId=DVQ7ymkXR',9431:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkknrpmtplkvq&orderId=404-2574261-0426710&packageIndex=0&shipmentId=DwXFY7kdR',9478:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkrolsqqnrmnq&orderId=403-4677805-1690750&packageIndex=0&shipmentId=DXdmD1kbR',9638:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkjlrtklqrsvq&orderId=171-1377835-5105921&packageIndex=0&shipmentId=DGcWzZkkR',9682:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqmnxhsrmtpq&orderId=171-8612308-2068349&packageIndex=0&shipmentId=D68pzLkQR',9687:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmjruqnpisvq&orderId=171-7128133-7135565&packageIndex=0&shipmentId=DVFsz7ktR',10997:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lllopvkrspsrq&orderId=404-2248175-7727520&packageIndex=0&shipmentId=DCScLlkVR',11163:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmkrtklkklpq&orderId=404-5372353-5006730&packageIndex=0&shipmentId=DJg71dkyR',11186:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqnntlsrokvq&orderId=403-6324939-6097130&packageIndex=0&shipmentId=DbvXwRJnN',11204:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljsnnroqposrq&orderId=404-3954569-0847544&packageIndex=0&shipmentId=Dc2PMzkgR',11238:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkngkqknsnovq&orderId=404-1477032-5612314&packageIndex=0&shipmentId=D61zJTklR',11343:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lknmlqmtljovq&orderId=403-5524974-9827564&packageIndex=0&shipmentId=DJkXxdk0R',11453:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkkoovkmrqkvq&orderId=403-5642828-3766719&packageIndex=0&shipmentId=DCntPFkjR',11591:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkolmumlpqqrq&orderId=171-3814201-4799568&packageIndex=0&shipmentId=DCG2tpkpR',11635:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lknmqoosoittq&orderId=404-9470010-7402734&packageIndex=0&shipmentId=DlQ3DtJPN',11640:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqooropkjlpq&orderId=404-3232667-5995557&packageIndex=0&shipmentId=DPVnD3JDN',11744:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llmglsmrtpttq&orderId=402-4019238-8089904&packageIndex=0&shipmentId=DJNjd7k0R',11860:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkkotvntmomnq&orderId=402-7210209-6944332&packageIndex=0&shipmentId=DnJ0SlkpR',11868:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkklrsolmmrpq&orderId=402-2531669-1663506&packageIndex=0&shipmentId=DVzlS6kRR',12007:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmlouqltkkvq&orderId=404-4771533-2973951&packageIndex=0&shipmentId=DntClfklR',12252:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmhlqmtmoorq&orderId=404-9456048-1325927&packageIndex=0&shipmentId=DwxCpVkLR',12287:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lmjprxoqlmknq&orderId=402-8827174-6026750&packageIndex=0&shipmentId=D1RtCxk2R',12537:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmhnulqprovq&orderId=404-4769504-7022766&packageIndex=0&shipmentId=DNv7XsktR',12585:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkkpsqqpojmnq&orderId=403-7086035-8821110&packageIndex=0&shipmentId=Dnxk8lknR',12633:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lmnosrklnqmnq&orderId=403-1160367-3817142&packageIndex=0&shipmentId=DgtZ89kZR',12636:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkompsjlrnonq&orderId=404-3266783-3721114&packageIndex=0&shipmentId=Dw1P8VkgR',12695:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrjlqjonrkvq&orderId=171-7770062-0732332&packageIndex=0&shipmentId=DNfzgMkYR',12698:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llmplskprqtpq&orderId=403-9002502-2997950&packageIndex=0&shipmentId=Dncfg3kZR',12707:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkojoppqrrnpq&orderId=403-4036602-9350752&packageIndex=0&shipmentId=D19yglk0R',12709:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkplmujmslmrq&orderId=403-0058301-2031560&packageIndex=0&shipmentId=DnWPg7kHR',12757:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkplmwnnoisrq&orderId=404-1058705-4321945&packageIndex=0&shipmentId=DnZWqWkdR',12845:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llmpmvjnmrovq&orderId=171-6343010-3411517&packageIndex=0&shipmentId=DGT3qYk8R',12881:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkqppxoumkrpq&orderId=171-9174388-6523515&packageIndex=0&shipmentId=DwdvZTkZR',12892:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrjmxmqtrqvq&orderId=404-4120934-8469951&packageIndex=0&shipmentId=D6lpZqkTR',12906:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkjpovnlmpqnq&orderId=171-4125889-1889940&packageIndex=0&shipmentId=DXw8ZJk7R',12915:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqprqiupptpq&orderId=403-3197160-3069940&packageIndex=0&shipmentId=DJzhZYk3R',12916:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmmmxpummqrq&orderId=403-6420484-5933945&packageIndex=0&shipmentId=DCzsZ6kCR',12917:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkqpqojtnpmnq&orderId=402-4411340-4496326&packageIndex=0&shipmentId=D6kcZPkZR',12922:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llmpnoqlnprpq&orderId=403-1132143-3111517&packageIndex=0&shipmentId=DJ6bZzksR',12925:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqprqkmlikrq&orderId=403-8668894-6525135&packageIndex=0&shipmentId=DVQlZJkRR',12972:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lklgkvkusmkvq&orderId=404-0137476-1498700&packageIndex=0&shipmentId=DJltjQk9R',12980:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkojqonsplmvq&orderId=404-3833239-9846705&packageIndex=0&shipmentId=D6lgj0k9R',12983:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkomruounrqrq&orderId=404-3320980-8441119&packageIndex=0&shipmentId=DMH6v4JYN',13007:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkplouinnpovq&orderId=402-0535763-2745962&packageIndex=0&shipmentId=DGBWHV3sR',13021:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqpruhlrjkvq&orderId=402-8874256-6725968&packageIndex=0&shipmentId=D6ZljckdR',13026:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkplouknqlmnq&orderId=403-9754892-7644334&packageIndex=0&shipmentId=DG9CjqkTR',13033:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkomrwoomlrtq&orderId=402-1262452-1058755&packageIndex=0&shipmentId=D1bdjfkLR',13071:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmhqvhopnqvq&orderId=403-7740399-1427531&packageIndex=0&shipmentId=Dcn8fWkXR',13104:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkplprkrsnltq&orderId=403-5474992-4257913&packageIndex=0&shipmentId=DC6tfVk1R',13121:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqpsslmqnntq&orderId=402-9481155-4197915&packageIndex=0&shipmentId=Dng9fXkbR',13122:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkmhrphpkjorq&orderId=402-7287272-2137155&packageIndex=0&shipmentId=DNgpHj3VR',13131:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkshrxntppnpq&orderId=402-3547176-4158757&packageIndex=0&shipmentId=D31Rh7k8R',13161:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrjornsnmtpq&orderId=404-0451908-9529119&packageIndex=0&shipmentId=DP7WvnJ8N',13223:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkqpruhpqiqrq&orderId=403-8450087-2700305&packageIndex=0&shipmentId=DNxth6knR',13224:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkonlxjrtmonq&orderId=403-4869051-2325127&packageIndex=0&shipmentId=D1xhhXkSR',13250:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkomtslttpsrq&orderId=404-2537009-6415557&packageIndex=0&shipmentId=D31WhrkjR',13380:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llqptqmtmpkrq&orderId=404-3722195-9238730&packageIndex=0&shipmentId=DNksRV33R',13470:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrgkplmkqnpq&orderId=171-0897884-0532300&packageIndex=0&shipmentId=D1wxRC32R',13575:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lknprrinmkltq&orderId=402-9225456-2338705&packageIndex=0&shipmentId=DS6FcbJdN',13667:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkonormlrkmvq&orderId=403-4129374-6176330&packageIndex=0&shipmentId=DV7zFl35R',13795:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lknnppqmomkvq&orderId=404-0117880-4748356&packageIndex=0&shipmentId=DJypk73wR',13914:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrjtxhttilpq&orderId=171-0960593-7418702&packageIndex=0&shipmentId=DChSHc39R',13921:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llngkpktsmptq&orderId=403-2864741-1405962&packageIndex=0&shipmentId=DcbvHv3lR',13938:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lknnrqkoolntq&orderId=402-7351523-5146761&packageIndex=0&shipmentId=DGkVHD38R',14142:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrgqumlpqsrq&orderId=402-5647686-2086731&packageIndex=0&shipmentId=DXqLBW3DR',14162:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrknpmlqjrpq&orderId=404-8441935-9383513&packageIndex=0&shipmentId=DVMpBg3ZR',14315:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=llrknxoosnonq&orderId=403-0899217-3921942&packageIndex=0&shipmentId=D16qwd3FR',14500:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lmkolvosslkrq&orderId=403-4437734-8835562&packageIndex=0&shipmentId=D6vqYD32R',14513:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkpmsthnkjnpq&orderId=402-0499221-8384341&packageIndex=0&shipmentId=DPbFLJJ3N',14599:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkngrqnmmmovq&orderId=404-8192799-8830754&packageIndex=0&shipmentId=DnxvF63HR',14999:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkqmkqmmrqqvq&orderId=403-4817762-5489935&packageIndex=0&shipmentId=DGZ5VT3gR'}
633
    all ={11642:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=lkoimxjprionq&orderId=404-8168821-8300356&packageIndex=0&shipmentId=D0tJDZJhN', 7794:'http://www.amazon.in/gp/your-account/ship-track/ref=oh_aui_st_v2_btn?ie=UTF8&itemId=ljqmlqkmroonq&orderId=402-4679832-9733904&packageIndex=0&shipmentId=DyxpqQxBN'}
634
    for orderId, trackingUrl in all.iteritems():
635
        store = getStore(1)
636
        print store.parseTrackingUrl(trackingUrl, orderId)
14756 amit.gupta 637
    #store.scrapeStoreOrders()
14650 amit.gupta 638
#    br = mechanize.Browser()
639
#    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'),
640
#                     ('Accept', 'text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8'),
641
#                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
642
#                     ('Accept-Language', 'en-US,en;q=0.8'),                     
643
#                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]
644
#    store.scrapeStoreOrders()
16283 amit.gupta 645
    #store.parseOrderRawHtml(5322, "13232", 14, readSSh("/home/amit/5322"), "https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html/ref=ox_spc_place_order?ie=UTF8&fromAnywhere=1&hasWorkingJav")
15555 amit.gupta 646
    #store.trackOrdersForUser(4355, "https://www.amazon.in/gp/css/summary/edit.html?orderID=171-4824011-7090713", readSSh("~/4355"))
14813 amit.gupta 647
    #readSSh("/tmp/User211/2015-04-12 10:32:41.905765")
14703 amit.gupta 648
    #store.scrapeAffiliate()
15565 amit.gupta 649
    #parseDetailNotCreated()
16283 amit.gupta 650
    #parseOrderNotCreated()
15555 amit.gupta 651
 
652
def parseDetailNotCreated():
653
    try:
654
        store=getStore(1)
655
        orders = session.query(OrdersRaw).filter_by(status='DETAIL_NOT_CREATED_UNKNOWN').all()
15558 amit.gupta 656
        session.close()
15555 amit.gupta 657
        for order in orders:
658
            store.trackOrdersForUser(order.id, order.order_url, order.rawhtml)
659
 
660
    finally:
661
        session.close()
15565 amit.gupta 662
 
663
def parseOrderNotCreated():
664
    try:
665
        store=getStore(1)
666
        orders = session.query(OrdersRaw).filter_by(status='ORDER_NOT_CREATED_UNKNOWN').all()
667
        session.close()
668
        for order in orders:
15567 amit.gupta 669
            result = store.parseOrderRawHtml(order.id, order.sub_tag, order.user_id, order.rawhtml, order.order_url)['result']
670
            order1 = session.query(OrdersRaw).filter_by(id=order.id).first()
671
            order1.status = result
672
            session.commit()
15565 amit.gupta 673
 
674
    finally:
675
        session.close()
15555 amit.gupta 676
 
14162 amit.gupta 677
def readSSh(fileName):
678
    try:
15046 amit.gupta 679
        str1 = open(fileName).read()
680
        return str1
14162 amit.gupta 681
    except:
682
        ssh_client = SSHClient()
683
        str1 = ""
684
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
15056 amit.gupta 685
        ssh_client.connect('dtr', 22, 'root', 'ecip$dtrMay2014')
14162 amit.gupta 686
        sftp_client = ssh_client.open_sftp()
687
        try:
14299 amit.gupta 688
            if not os.path.exists(os.path.dirname(fileName)):
689
                os.makedirs(os.path.dirname(fileName))
14162 amit.gupta 690
            sftp_client.get(fileName, fileName)
691
            try:
692
                str1 = open(fileName).read()
693
                return str1
694
            finally:
695
                pass
696
        except:
697
            "could not read"
698
        return str1
13774 amit.gupta 699
 
700
 
701
if __name__ == '__main__':
14284 amit.gupta 702
        main()