Subversion Repositories SmartDukaan

Rev

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