Subversion Repositories SmartDukaan

Rev

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