Subversion Repositories SmartDukaan

Rev

Rev 20498 | Rev 20699 | 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
17231 amit.gupta 9
from datetime import datetime, timedelta, date
16874 amit.gupta 10
from dtr.api.Order import process_rejects
18028 amit.gupta 11
from dtr.dao import Order, SubOrder, AmazonAffiliateInfo, obj
14464 amit.gupta 12
from dtr.main import getStore, Store as MStore, ParseException, getBrowserObject, \
14624 amit.gupta 13
    ungzipResponse, tprint
17307 amit.gupta 14
from dtr.storage.DataService import OrdersRaw, Orders, Order_Parse_Info, \
16986 amit.gupta 15
    All_user_addresses
16874 amit.gupta 16
from dtr.storage.Mongo import getDealRank
17307 amit.gupta 17
from dtr.utils import utils
18440 amit.gupta 18
from dtr.utils.utils import fetchResponseUsingProxy, readSSh, todict
16874 amit.gupta 19
from elixir import *
14650 amit.gupta 20
import base64
16874 amit.gupta 21
import dtr
14650 amit.gupta 22
import gzip
14624 amit.gupta 23
import mechanize
14285 amit.gupta 24
import os.path
18376 amit.gupta 25
from pyquery import PyQuery as pq
13774 amit.gupta 26
import re
14033 amit.gupta 27
import time
13809 amit.gupta 28
import traceback
14650 amit.gupta 29
import urllib2
20687 amit.gupta 30
import urlparse
13774 amit.gupta 31
 
32
ORDER_REDIRECT_URL = 'https://www.amazon.in/gp/css/summary/edit.html?orderID=%s'
13810 amit.gupta 33
ORDER_SUCCESS_URL = 'https://www.amazon.in/gp/buy/spc/handlers/static-submit-decoupled.html'
13823 amit.gupta 34
THANKYOU_URL = 'https://www.amazon.in/gp/buy/thankyou/handlers/display.html'
14624 amit.gupta 35
AMAZON_AFF_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/listReports'
14650 amit.gupta 36
AMAZON_AFF_FILE_URL = 'https://assoc-datafeeds-eu.amazon.com/datafeed/getReport?filename=saholic-21-orders-report-%s.tsv.gz'
13774 amit.gupta 37
class Store(MStore):
13821 amit.gupta 38
 
17348 amit.gupta 39
    orderStatusRegexMap = { MStore.ORDER_PLACED : ['ordered from', 'not yet dispatched','dispatching now', 'preparing for dispatch', 'order received'],
14064 amit.gupta 40
                            MStore.ORDER_SHIPPED : ['dispatched on','dispatched', 'on the way', 'out for delivery', 'Out for delivery'],
17324 amit.gupta 41
                            MStore.ORDER_CANCELLED : ['return complete', 'refunded', 'cancelled', 'replacement complete', 'return received'],
17258 amit.gupta 42
                            MStore.ORDER_DELIVERED : ['delivered', 'your package was delivered', 'package was handed directly to customer']
13821 amit.gupta 43
                           }
13774 amit.gupta 44
 
45
    def __init__(self,store_id):
46
        super(Store, self).__init__(store_id)
47
 
48
    def getName(self):
14749 amit.gupta 49
        return "amazon"
13774 amit.gupta 50
 
14945 amit.gupta 51
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl, track=False):
17718 amit.gupta 52
        rawHtml = re.sub(r'[^\x00-\x7F]+',' ', rawHtml)
14958 amit.gupta 53
        parseString = "Tracking" if track else "Transacted"
54
        print parseString, "Order Id to be parsed is :", orderId
13796 amit.gupta 55
        resp = {}
14813 amit.gupta 56
        resp['result'] = 'ORDER_NOT_CREATED'
13821 amit.gupta 57
        if ORDER_SUCCESS_URL in orderSuccessUrl or THANKYOU_URL in orderSuccessUrl:
13774 amit.gupta 58
            try:
17600 amit.gupta 59
                doc = pq(rawHtml)
14608 amit.gupta 60
                try:
17600 amit.gupta 61
                    orderUrl = doc('a.a-touch-link').attr.href
14608 amit.gupta 62
                    merchantOrderId = re.findall(r'.*&oid=(.*)&?.*?', orderUrl)[0]
63
                except:
17600 amit.gupta 64
                    merchantOrderId = doc("#orders-list>div>span>b").html()
20687 amit.gupta 65
                    if not merchantOrderId:
66
                        merchantOrderId = urlparse.parse_qs(urlparse.urlsplit(orderSuccessUrl).query)
67
                    else:
68
                        raise
14699 amit.gupta 69
                order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, True)
14972 amit.gupta 70
                order.orderTrackingUrl = ORDER_REDIRECT_URL % (merchantOrderId)
71
                order.orderSuccessUrl = orderSuccessUrl
14211 amit.gupta 72
                order.merchantOrderId = merchantOrderId
14291 amit.gupta 73
                order.requireDetail = True
14698 amit.gupta 74
                order.status = 'html_required'
14297 amit.gupta 75
                order.closed = None
14312 amit.gupta 76
                if self._saveToOrder(todict(order)):
77
                    resp['result'] = 'ORDER_CREATED'
78
                    resp["url"] = ORDER_REDIRECT_URL % (merchantOrderId)
79
                    resp["htmlRequired"] = True
80
                    resp['orderId'] = orderId
81
                else:
82
                    resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
83
 
13774 amit.gupta 84
            except:
14813 amit.gupta 85
                #Write all cases here for Order Not created Known
18158 amit.gupta 86
                soup = BeautifulSoup(rawHtml, "html5lib")
14809 amit.gupta 87
                try:
16874 amit.gupta 88
                    if not soup.body:
89
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
17359 amit.gupta 90
                    elif 'Securely redirecting you' in soup.find("h3").text.strip() or soup.find("h3").text.strip()=="Orders":
14813 amit.gupta 91
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
14809 amit.gupta 92
                    else:
14813 amit.gupta 93
                        raise
14809 amit.gupta 94
                except:
14814 amit.gupta 95
                    try:
17356 amit.gupta 96
                        if soup.find("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', 'Edit quantities'] or "Saved for later" in soup.find("h1").text.strip():
14814 amit.gupta 97
                            resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
98
                        else:
99
                            raise
100
                    except:
15046 amit.gupta 101
                        try:
17356 amit.gupta 102
                            if soup.find("h2").text.strip() in ['Web page not available','Webpage not available', 'Do you have an Amazon password?']:
15046 amit.gupta 103
                                resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
104
                            else:
105
                                raise
106
                        except:
15565 amit.gupta 107
                            try:
16876 amit.gupta 108
                                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 109
                                    resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
16877 amit.gupta 110
                                elif soup.find("b", {'class':'h1'}).text.strip().find("We're sorry") > -1:
111
                                    resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
15565 amit.gupta 112
                                else:
113
                                    raise
114
                            except:
115
                                resp['result'] = 'ORDER_NOT_CREATED_UNKNOWN'
116
 
13774 amit.gupta 117
        else:
13781 amit.gupta 118
            try:
14722 amit.gupta 119
                mo = self.db.merchantOrder.find_one({"orderId":orderId})
120
                if mo is not None:
14749 amit.gupta 121
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl, False)
14722 amit.gupta 122
                    merchantOrder.createdOn = mo.get("createdOn")
123
                    merchantOrder.createdOnInt =  mo.get("createdOnInt")
124
                else:
14945 amit.gupta 125
                    print "Could not find amazon order with order Id", orderId
14749 amit.gupta 126
                    merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
18158 amit.gupta 127
                soup = BeautifulSoup(rawHtml, "html5lib")
17331 amit.gupta 128
                if not soup.body:
17319 amit.gupta 129
                    resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
130
                else:   
14545 amit.gupta 131
                    try:
17319 amit.gupta 132
                        self.parseNewStlye(merchantOrder, soup)
15046 amit.gupta 133
                        resp['result'] = 'DETAIL_CREATED'
14545 amit.gupta 134
                    except:
15056 amit.gupta 135
                        try:
17319 amit.gupta 136
                            traceback.print_exc()
18376 amit.gupta 137
                            self.parseAnotherStlye(merchantOrder, pq(rawHtml))
17319 amit.gupta 138
                            resp['result'] = 'DETAIL_CREATED'
15056 amit.gupta 139
                        except:
15059 amit.gupta 140
                            try:
18376 amit.gupta 141
                                traceback.print_exc()
142
                                self.parseOldStlye(merchantOrder, soup)
143
                                resp['result'] = 'DETAIL_CREATED'
15059 amit.gupta 144
                            except:
18376 amit.gupta 145
                                traceback.print_exc()
17319 amit.gupta 146
                                try:
18376 amit.gupta 147
                                    self.parseCancelled(merchantOrder, soup)
148
                                    resp['result'] = 'ORDER_CANCELLED'
17319 amit.gupta 149
                                except:
18376 amit.gupta 150
                                    try:
151
                                        if soup.find("h1").text.strip() in ["Your Account"] or soup.find("h1").span.text=="Account":
152
                                            resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
153
                                        else:
154
                                            raise
155
                                    except:
156
                                        if soup.find(id="ap_signin_pagelet_title").find("h1").text.strip()=="Sign In":
157
                                            resp['result'] = 'DETAIL_NOT_CREATED_KNOWN'
158
                                        else:
159
                                            raise
17599 amit.gupta 160
                if resp['result'] == 'DETAIL_NOT_CREATED_KNOWN':
17357 amit.gupta 161
                    self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"status":"html_required"}})
13781 amit.gupta 162
            except:
17666 amit.gupta 163
                self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"status":"html_required"}})
14813 amit.gupta 164
                print "Error occurred"
15046 amit.gupta 165
                resp['result'] = 'DETAIL_NOT_CREATED_UNKNOWN'
14813 amit.gupta 166
                traceback.print_exc()
15046 amit.gupta 167
        return resp    
13774 amit.gupta 168
 
13868 amit.gupta 169
    #This should be exposed from api for specific sources
170
    def scrapeStoreOrders(self):
18725 amit.gupta 171
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders.closed":False, "subOrders.trackingUrl":{"$exists":True}, "subOrders.login":{"$exists":False}})
14624 amit.gupta 172
        for merchantOrder in orders:
14981 amit.gupta 173
            executeBulk = False
14624 amit.gupta 174
            try:
175
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
176
                closed = True
177
                map1 = {}
178
                for subOrder in merchantOrder.get("subOrders"):
179
                    if subOrder.get("closed"):
180
                        continue
181
                    elif subOrder.get("trackingUrl") is None:
182
                        closed = False
183
                        continue
184
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
185
                    trackingUrl = subOrder.get("trackingUrl")
186
                    if not map1.has_key(trackingUrl):
16468 amit.gupta 187
                        map1[trackingUrl] = self.parseTrackingUrl(trackingUrl, merchantOrder.get("orderId"))
14624 amit.gupta 188
                    newOrder = map1.get(trackingUrl)
16474 amit.gupta 189
                    if newOrder:
190
                        executeBulk = True
191
                        updateMap = self.getUpdateMap(newOrder, subOrder.get('cashBackStatus'))
192
                        print findMap, "\n", updateMap
193
                        bulk.find(findMap).update({'$set' : updateMap})
194
                        closed = closed and newOrder['closed']
14981 amit.gupta 195
                if executeBulk:
14697 amit.gupta 196
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":closed, "parseError":False}})
14981 amit.gupta 197
                    bulk.execute()
14624 amit.gupta 198
            except:
14847 amit.gupta 199
                tprint("Could not update " + str(merchantOrder['orderId']) + " For store " + self.getName())
14692 amit.gupta 200
                self.db.merchantOrder.update({"orderId":merchantOrder['orderId']}, {"$set":{"parseError":True}})
14624 amit.gupta 201
                traceback.print_exc()
202
 
14608 amit.gupta 203
 
204
 
14771 amit.gupta 205
    def parserest(self, soup):
206
        print "Hi"
207
        if soup.find('h1'):
208
            print "OK"
14608 amit.gupta 209
 
14464 amit.gupta 210
    def parseOldStlye(self, merchantOrder, soup):
211
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
212
        table = soup.body.findAll("table", recursive=False)[1]
213
        #print table
214
        tables = table.tr.td.findAll("table", recursive=False)
215
        for tr in tables[2].findAll("tr"):
216
            boldElement = tr.td.b
217
            if "Order Placed" in str(boldElement):
218
                merchantOrder.placedOn = boldElement.next_sibling.strip()
219
            if "order number" in str(boldElement):
220
                merchantOrder.merchantOrderId = boldElement.next_sibling.strip()
221
            if "Order Total" in str(boldElement):
222
                merchantOrder.paidAmount = int(float(boldElement.find('span').contents[-1].replace(',','')))
223
        anchors = table.tr.td.findAll("a", recursive=False)
224
        paymentAnchor = anchors.pop(-1)
225
 
226
        count = 0
227
        subOrders = []
228
        merchantOrder.subOrders = subOrders
229
        counter = 0 
230
        for anchor in anchors:
231
            count += 1
232
            tab = anchor.next_sibling
233
            status = MStore.ORDER_PLACED
234
            subStr = "Delivery #" + str(count) + ":"
235
            if subStr in  tab.find("b").text:
236
                detailedStatus = tab.find("b").text.replace(subStr, '').strip()
237
 
238
            tab = tab.next_sibling.next_sibling
239
            trs = tab.find("table").find('tbody').findAll("tr", recursive = False)
240
 
241
            estimatedDelivery = trs[0].td.find("b").next_sibling.strip()
242
 
243
            orderItemTrs = trs[1].findAll("td", recursive=False)[1].table.tbody.findAll("tr", recursive = False)
244
            i = -1
245
            for orderItemTr in orderItemTrs:
246
                i += 1
247
                if i%2 == 0:
248
                    continue
249
                counter += 1
250
                quantity =  int(re.findall(r'\d+', orderItemTr.td.contents[0])[0])
251
 
252
                productUrl = orderItemTr.td.contents[1].a["href"]
253
                productTitle = orderItemTr.td.contents[1].a.text
254
 
255
                unitPrice = int(float(orderItemTr.findAll('td')[1].span.text.replace('Rs. ','').replace(',','')))
256
 
257
 
258
                subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, unitPrice*quantity, status, quantity)
259
                subOrder.merchantSubOrderId = str(counter) + " of " + merchantOrder.merchantOrderId
260
                subOrder.estimatedDeliveryDate = estimatedDelivery
14722 amit.gupta 261
                estDlvyTime = datetime.strptime(estimatedDelivery.split('-')[0].strip(), "%A %d %B %Y")
262
                createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
263
                subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
14464 amit.gupta 264
                subOrder.productCode = productUrl.split('/')[5]
265
                subOrder.detailedStatus = detailedStatus
18028 amit.gupta 266
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, unitPrice)
15346 amit.gupta 267
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
268
                subOrder.dealRank = dealRank.get('rank')
269
                subOrder.rankDesc = dealRank.get('description')
16283 amit.gupta 270
                subOrder.maxNlc = dealRank.get('maxNlc')
271
                subOrder.minNlc = dealRank.get('minNlc')
272
                subOrder.db = dealRank.get('dp')
273
                subOrder.itemStatus = dealRank.get('status')
14464 amit.gupta 274
                cashbackStatus = Store.CB_PENDING
275
                if cashbackAmount <= 0:
276
                    cashbackStatus = Store.CB_NA
277
                subOrder.cashBackStatus = cashbackStatus
18028 amit.gupta 278
                subOrder.cashBackAmount = cashbackAmount*quantity
14464 amit.gupta 279
                if percentage > 0:
280
                    subOrder.cashBackPercentage = percentage
281
                subOrders.append(subOrder)
282
        priceList = paymentAnchor.next_sibling.next_sibling.next_sibling.table.table.tbody.tbody.tbody.findAll('tr', recursive=False)
283
        totalAmount = 0
284
        grandAmount = 0
285
        for price in priceList:
286
            labelTd = price.td
287
            if 'Subtotal:' in labelTd.text:
288
                totalAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
289
            elif 'Grand Total:' in labelTd.text:
290
                grandAmount += int(float(labelTd.next_sibling.next_sibling.find('span').contents[-1].replace(',','')))
291
        if grandAmount < totalAmount:
292
            diff = totalAmount - grandAmount
293
            for subOrder in merchantOrder.subOrders:
294
                subOrder.amountPaid -= int(diff*(1-subOrder.amountPaid/totalAmount))
14698 amit.gupta 295
        merchantOrder.status='success'
14464 amit.gupta 296
        self._updateToOrder(todict(merchantOrder))
18376 amit.gupta 297
 
298
    def parseAnotherStlye(self, merchantOrder, pqobj):
299
        counter=0
300
        detailSection = None
301
        shipmentSection = None
302
        summarySection = None
303
        for el in pqobj('.a-section'):
304
            if "View order details" in pq(el).text():
305
                detailSection =  pq(el)
306
                counter += 1
307
            if "Shipment details" in pq(el).text():
308
                shipmentSection =  pq(el)
309
                counter += 1
310
            if "Order Summary" in pq(el).text():
311
                summarySection = pq(el)
312
                counter += 1
313
            if counter == 3:
314
                break
315
 
316
        i=-1    
317
        for s in shipmentSection('.a-box-group'):
318
            shipmentGroup = pq(s)
319
            for shipment in shipmentGroup('.a-box'):
320
                i += 1 
321
                if i==0:
322
                    continue
323
                shipment = pq(shipment)
324
                shipmentStatusSection = shipment('.a-section:eq(0)')
325
                productDetails = shipment('.a-section:eq(1)>.a-row')
18380 amit.gupta 326
                print shipmentStatusSection('h3').text(), shipmentStatusSection('p').text(), shipmentStatusSection('span').text()
18376 amit.gupta 327
                for productDetail in productDetails:
328
                    productDetail = pq(productDetail)
329
                    pImg = productDetail.children('div').eq(0)
330
                    pQty = productDetail.children('div').eq(1)
331
                    #print pImg('a').attr('href'), pImg('a').attr('title'), pImg('img').attr('src'), pQty('.a-row:nth-child(2)')('span').text().split(':')[1].strip(), pQty('span.currencyINR')
18725 amit.gupta 332
                    productUrl = pImg('a').attr('href'), 
333
                    qty = pQty('.a-row:nth-child(2)')('span').text().split(':')[1].strip()
334
                    price = int(float(pQty('nobr').text().replace('Rs.','').replace(',', '')))
335
                    #subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
18376 amit.gupta 336
        raise   
337
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
338
        merchantOrder.placedOn
339
        merchantOrder.merchantOrderId
340
        merchantOrder.paidAmount
14464 amit.gupta 341
 
342
    def parseNewStlye(self, merchantOrder, soup):
20498 amit.gupta 343
        isPrime = False
14464 amit.gupta 344
        merchantOrder.orderTrackingUrl = merchantOrder.orderSuccessUrl
20498 amit.gupta 345
        for script in soup.findAll("script"):
346
            if script.text:
347
                print script.text
348
                if "\"isPrime\":" in script.text:
349
                    isPrime = "\"isPrime\":1" in script.text
350
                    break
14464 amit.gupta 351
        orderDetailsContainer = soup.body.find(id="orderDetails")
14566 amit.gupta 352
        divAfterH1 = orderDetailsContainer.h1.next_sibling.next_sibling
353
        orderLeftDiv = divAfterH1.div
14464 amit.gupta 354
        placedOnSpan = orderLeftDiv.find("span", {'class':'order-date-invoice-item'})
355
        merchantOrder.placedOn =placedOnSpan.text.split('Ordered on')[1].strip()
356
        merchantOrder.merchantOrderId = placedOnSpan.next_sibling.next_sibling.text.split('Order#')[1].strip()
15555 amit.gupta 357
        try:
358
            priceBox = divAfterH1.next_sibling.next_sibling.next_sibling.next_sibling.find("div", {"class":"a-box-inner"}).div.div.findAll('div', recursive=False)[-1]
359
        except:
360
            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 361
        priceRows = priceBox.findAll('div', {'class':'a-row'})
362
        subTotal = 0
14566 amit.gupta 363
        shippingPrice = 0   
14464 amit.gupta 364
        promoApplied = 0
365
        for priceRow in priceRows:
366
            if "Item(s) Subtotal:" in str(priceRow):
367
                subTotal = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
368
            elif "Shipping:" in str(priceRow):
369
                shippingPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
370
            elif "Grand Total:" in str(priceRow):
371
                grandPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
372
                merchantOrder.paidAmount = grandPrice
373
            elif "Total:" in str(priceRow):
374
                totalPrice  = int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
375
            elif "Promotion Applied:" in str(priceRow):
376
                promoApplied  += int(float(priceRow.div.next_sibling.next_sibling.span.span.text.replace('Rs.','').replace(',', '')))
377
        totalPaid = subTotal        
378
        if promoApplied > 0:
379
            totalPaid -= promoApplied
380
            if shippingPrice <= promoApplied:
381
                totalPaid  += shippingPrice
15473 amit.gupta 382
 
17601 amit.gupta 383
        shipmentDivs = orderDetailsContainer.findAll('div', class_='shipment')
14464 amit.gupta 384
        subOrders = []
385
        merchantOrder.subOrders = subOrders
15473 amit.gupta 386
        closedStatus = True
17601 amit.gupta 387
        subOrders = []
18161 amit.gupta 388
        j=0
14464 amit.gupta 389
        for shipmentDiv in shipmentDivs:
17601 amit.gupta 390
            shipmentDiv = shipmentDiv.div
17361 amit.gupta 391
            try:
392
                trackingUrl = 'http://www.amazon.in/' + shipmentDiv.find('span', class_='track-package-button').span.a.get('href')
393
            except:
394
                trackingUrl= None
395
 
17347 amit.gupta 396
            deliverySpanTop = None
14464 amit.gupta 397
            innerBoxes = shipmentDiv.findAll('div', recursive = False)
398
            statusDiv = innerBoxes[0]
399
            subOrderStatus = statusDiv.div.span.text.strip()
17347 amit.gupta 400
            try:
401
                deliverySpanTop = statusDiv.div.div.find_next_sibling('div').span
402
            except:
17617 amit.gupta 403
                pass
18030 amit.gupta 404
            #if not deliverySpanTop:
405
            productDivs = innerBoxes[-1].div.div.findAll('div', recursive=False)
14464 amit.gupta 406
            merchantOrder.subOrders = subOrders
407
            for i, productDiv in enumerate(productDivs):
17347 amit.gupta 408
                deliverySpan = deliverySpanTop
409
                if not deliverySpanTop:
410
                    if i%2==1:
411
                        continue
18028 amit.gupta 412
                    deliverySpan = productDiv.div.div.span
18156 amit.gupta 413
                    try:
414
                        productDiv = productDivs[i+1]
415
                    except:
416
                        pass
18028 amit.gupta 417
                for  prodRow in productDiv.findAll('div', recursive=False):
418
                    j += 1
419
                    imgDiv  = prodRow.div.div
420
                    detailDiv = imgDiv.find_next_sibling('div')
421
                    detailDivs = detailDiv.findAll('div', recursive=False)
422
                    arr = re.split("^(\d+) of", detailDivs[0].a.text.strip())
423
                    (productTitle, quantity) = (arr[-1], (1 if len(arr)<2 else int(arr[1])) )
14756 amit.gupta 424
                    try:
18028 amit.gupta 425
                        unitPrice = int(float(detailDivs[2].span.text.replace('Rs. ','').replace(',','')))
14756 amit.gupta 426
                    except:
18028 amit.gupta 427
                        unitPrice = int(float(detailDivs[3].span.text.replace('Rs. ','').replace(',','')))
428
                    amountPaid = int((unitPrice*quantity*totalPaid)/subTotal)
429
                    productUrl = "http://www.amazon.in" + detailDivs[0].a.get('href')
430
                    subOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid, MStore.ORDER_PLACED, quantity)
431
                    subOrder.productCode = productUrl.split('/')[5]
432
                    subOrder.unitPrice = unitPrice
433
                    subOrder.merchantSubOrderId = str(j) + " of " + merchantOrder.merchantOrderId
434
                    estDlvyTime = datetime.now()
435
                    if deliverySpan is not None:
436
                        try:
437
                            subOrder.estimatedDeliveryDate = deliverySpan.span.text.strip()
438
                            estDate = subOrder.estimatedDeliveryDate.split("-")[0].strip()
439
                            subOrder.estimatedDeliveryInt = int(time.mktime((datetime.strptime(estDate, "%A %d %B %Y")).timetuple()))
440
                            estDlvyTime = datetime.strptime(estDate, "%A %d %B %Y")
441
                        except:
442
                            if "Delivered on" in deliverySpan.text:
443
                                subOrder.deliveredOn = deliverySpan.text.split(":")[1].strip() 
444
                            subOrder.estimatedDeliveryDate = "Not available"
445
 
446
                    createdOn = datetime.fromtimestamp(merchantOrder.createdOnInt)
447
                    subOrder.trackAfter = int(time.mktime(max(estDlvyTime-timedelta(days=4),createdOn + timedelta(days=3)).timetuple()))
448
                    subOrder.detailedStatus = subOrderStatus
449
                    status=MStore.ORDER_PLACED
17599 amit.gupta 450
                    try:
18028 amit.gupta 451
                        status = self._getStatusFromDetailedStatus(subOrderStatus)
17599 amit.gupta 452
                    except:
453
                        try:
18028 amit.gupta 454
                            dateString = subOrderStatus.split("Delivered ")[1].strip()
455
                            subOrder.status = MStore.ORDER_DELIVERED
456
                            subOrder.detailedStatus = 'Delivered'
457
                            dateString = getDateStringDelivered(dateString)
17631 amit.gupta 458
                            if dateString is not None:
18028 amit.gupta 459
                                subOrder.deliveredOn = datetime.strftime(dateString, '%d-%b-%y')
17599 amit.gupta 460
                        except:
18028 amit.gupta 461
                            try:
462
                                dateString = subOrderStatus.split("Arriving ")[1].split("by")[0].strip()
463
                                subOrder.status = MStore.ORDER_SHIPPED
464
                                dateString = getDateStringArriving(dateString)
465
                                if dateString is not None:
466
                                    subOrder.deliveryEstimate = datetime.strftime(dateString, '%d-%b-%y')
467
                                else:
468
                                    subOrder.deliveryEstimate = subOrderStatus.split("Arriving ")[1].split("by")[0].strip()
469
                            except:
470
                                print "Unknown status Alert -", status
471
 
472
                    subOrder.deliveryCharges = shippingPrice
473
                    if trackingUrl:
18156 amit.gupta 474
                        subOrder.trackingUrl  = trackingUrl
18028 amit.gupta 475
                    subOrder.imgUrl = imgDiv.img["src"]
20498 amit.gupta 476
                    if isPrime:
477
                        (cashbackAmount, percentage) = (0,0)
478
                    else:
479
                        (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amountPaid/quantity)
18028 amit.gupta 480
                    dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
481
                    subOrder.dealRank = dealRank.get('rank')
482
                    subOrder.rankDesc = dealRank.get('description')
18384 amit.gupta 483
                    subOrder.maxNlc = dealRank.get('maxNlc')
484
                    subOrder.minNlc = dealRank.get('minNlc')
485
                    subOrder.db = dealRank.get('dp')
486
                    subOrder.itemStatus = dealRank.get('status')
18028 amit.gupta 487
                    cashbackStatus = Store.CB_PENDING
488
                    if cashbackAmount <= 0:
489
                        cashbackStatus = Store.CB_NA
490
                    subOrder.cashBackStatus = cashbackStatus
491
                    subOrder.cashBackAmount = cashbackAmount*quantity
492
                    if percentage > 0:
493
                        subOrder.cashBackPercentage = percentage
494
                    if hasattr(subOrder, 'deliveredOn') or subOrder.status==Store.ORDER_DELIVERED:                               
495
                        subOrder.status = Store.ORDER_DELIVERED
496
                        subOrder.closed = True
497
                        if subOrder.cashBackStatus == Store.CB_PENDING:
498
                            subOrder.cashBackStatus = Store.CB_APPROVED
499
                    elif closedStatus:
500
                        closedStatus= False
501
                    subOrders.append(subOrder)
14698 amit.gupta 502
        merchantOrder.status='success'
15473 amit.gupta 503
        merchantOrder.closed = closedStatus
14464 amit.gupta 504
        self._updateToOrder(todict(merchantOrder))
14545 amit.gupta 505
 
506
    def parseCancelled(self, merchantOrder,soup):
14722 amit.gupta 507
        try:
508
            fonts = soup.body.findAll("table", recursive=False)[1].findAll("font")
509
            if fonts[0].text == "Important Message":
510
                if fonts[1].text=="This order has been cancelled.":
511
                    merchantOrder.closed = True
512
                    merchantOrder.status = "cancelled"
513
                    merchantOrder.requireDetail = False
514
                    self._updateToOrder(todict(merchantOrder))
515
                    return
516
                else:
517
                    raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14545 amit.gupta 518
            else:
519
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14722 amit.gupta 520
        except:
14549 amit.gupta 521
            orderDetails = soup.body.find(id="orderDetails")
522
            if orderDetails is not None and orderDetails.h4.text == "This order has been cancelled.":
523
                merchantOrder.closed = True
14698 amit.gupta 524
                merchantOrder.status = "cancelled"
14549 amit.gupta 525
                merchantOrder.requireDetail = False
526
                self._updateToOrder(todict(merchantOrder))
527
            else:
528
                raise ParseException("parseCancelled", "Found detailed status" + fonts[1].text)
14464 amit.gupta 529
 
13868 amit.gupta 530
    def getTrackingUrls(self, userId):
14074 amit.gupta 531
 
532
        missingOrderUrls = []
533
        missingOrders = self._getMissingOrders({'userId':userId})
534
        for missingOrder in missingOrders:
535
            missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
17453 amit.gupta 536
        orders = self._getActiveOrders({'userId':userId})
13882 amit.gupta 537
        count = len(orders)
13879 amit.gupta 538
        print "count", count
14948 amit.gupta 539
        print "Missing Urls"
540
        print "*************"
541
        print missingOrderUrls
13868 amit.gupta 542
        if count > 0:
14684 amit.gupta 543
            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 544
        else: 
14074 amit.gupta 545
            return missingOrderUrls
13927 amit.gupta 546
 
547
    def trackOrdersForUser(self, userId, url, rawHtml):
17718 amit.gupta 548
        rawHtml = re.sub(r'[^\x00-\x7F]+',' ', rawHtml)
14985 amit.gupta 549
        directory = "/AmazonTrack/User" + str(userId)
14285 amit.gupta 550
        if not os.path.exists(directory):
551
            os.makedirs(directory)
14173 amit.gupta 552
 
14945 amit.gupta 553
 
13995 amit.gupta 554
        try:
555
            searchMap = {'userId':userId}
556
            collectionMap = {'merchantOrderId':1}
557
            activeOrders = self._getActiveOrders(searchMap, collectionMap)
14033 amit.gupta 558
            datetimeNow = datetime.now()
559
            timestamp = int(time.mktime(datetimeNow.timetuple()))
14009 amit.gupta 560
            print "url----------------", url
17465 amit.gupta 561
            cancelledSummary = False
14320 amit.gupta 562
            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 563
                if url == 'https://www.amazon.in/gp/css/order-history':
564
                    filename = directory + "/orderSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')
565
                else:   
17465 amit.gupta 566
                    filename = directory + "/cancelledSummary" + datetime.strftime(datetime.now(), '%d-%m:%H:%M:%S')
567
                    cancelledSummary = True   
14945 amit.gupta 568
                f = open(filename,'w')
569
                f.write(rawHtml) # python will convert \n to os.linesep
570
                f.close() # you can omit in most cases as the destructor will call if
18158 amit.gupta 571
                soup = BeautifulSoup(rawHtml,'html5lib')
13995 amit.gupta 572
                allOrders = soup.find(id="ordersContainer").findAll('div', {'class':'a-box-group a-spacing-base order'})
573
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
574
                for activeOrder in activeOrders:
17307 amit.gupta 575
                    matched=False
13995 amit.gupta 576
                    for orderEle in allOrders:
17254 amit.gupta 577
                        deliveredOn = None
578
                        deliveryEstimate = None
17258 amit.gupta 579
                        shippingEstimate = None
13995 amit.gupta 580
                        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'})
581
                        merchantOrderId = orderdiv.find('span', {'class':'a-color-secondary value'}).text.strip()
582
                        if merchantOrderId==activeOrder['merchantOrderId']:
17307 amit.gupta 583
                            matched=True
13995 amit.gupta 584
                            closed = True
17465 amit.gupta 585
                            if not cancelledSummary:
586
                                shipments = orderEle.findAll('div',{'class':re.compile('.*?shipment.*?')}, recursive=False)
587
                            else:
588
                                shipments = orderEle.findAll('div',{'class':re.compile('.*?a-box.*?')}, recursive=False)
589
                                shipments.pop(0)
13995 amit.gupta 590
                            for shipment in shipments:
17307 amit.gupta 591
                                orderStatusDesc = None
13995 amit.gupta 592
                                shipdiv = shipment.find('div', {'class':'a-box-inner'})
14050 amit.gupta 593
                                sdivs = shipment.div.div.findAll('div', recursive=False)
17254 amit.gupta 594
                                try:
17270 amit.gupta 595
                                    orderStatus = sdivs[0].span.text.strip()
596
                                    status = self._getStatusFromDetailedStatus(orderStatus)
17254 amit.gupta 597
                                except:
17270 amit.gupta 598
                                    try:
599
                                        dateString = orderStatus.split("Delivered ")[1].strip()
600
                                        status = MStore.ORDER_DELIVERED
601
                                        deliveredOn = datetime.strftime(getDateStringDelivered(dateString), '%d-%b-%y')
602
                                    except:
603
                                        try:
17271 amit.gupta 604
                                            dateString = sdivs[0].span.text.strip().split("Arriving ")[1].split("by")[0].strip()
17270 amit.gupta 605
                                            status = MStore.ORDER_SHIPPED
606
                                            deliveryEstimate = datetime.strftime(getDateStringArriving(dateString), '%d-%b-%y')
607
                                        except:
608
                                            print "Unknown status Alert -", orderStatus
17348 amit.gupta 609
                                print merchantOrderId, "Order Status", orderStatus
17256 amit.gupta 610
                                try:
17270 amit.gupta 611
                                    orderStatusDesc = sdivs[0].findAll('div')[1].div.text.strip()
612
                                except:
17271 amit.gupta 613
                                    try:
614
                                        orderStatusDesc = sdivs[0].findAll('div')[1].text.strip()
615
                                    except:
17307 amit.gupta 616
                                        print "Order Status Description None or empty for", merchantOrderId, "and User", userId
17270 amit.gupta 617
 
17271 amit.gupta 618
                                if orderStatusDesc: 
17348 amit.gupta 619
                                    print merchantOrderId, "Order status desc", orderStatusDesc
17271 amit.gupta 620
                                    try:
17348 amit.gupta 621
                                        status = self._getStatusFromDetailedStatus(orderStatus)
622
                                    except:
623
                                        pass
624
                                    try:
17271 amit.gupta 625
                                        if "Dispatch estimate" in orderStatusDesc:
626
                                            shippingEstimate = orderStatus.split("Dispatch estimate").split("-")[0].strip()
627
                                        elif "Delivery estimate" in orderStatus:
628
                                            deliveryEstimate = orderStatus.split("Delivery estimate").split("-")[0].strip()
629
                                        elif "Arriving" in orderStatus:
630
                                            deliveryEstimate = datetime.strftime(getDateStringArriving(orderStatus.split("Arriving")[1].strip().split("by")[0].strip()), '%d-%b-%y')
631
                                    except:
632
                                        print "Could not find anything relevent for merchantOrder", merchantOrderId, "and User", userId 
633
                                        closed=False
634
                                        status = None
17258 amit.gupta 635
 
14335 amit.gupta 636
                                productDivs = shipdiv.find('div', {'class':re.compile('.*?a-spacing-top-medium.*?')}).find('div', {'class':'a-row'}).findAll('div', recursive=False)
13995 amit.gupta 637
                                trackingUrl = None
638
                                for buttonDiv in shipdiv.findAll('span', {'class':'a-button-inner'}):
639
                                    if buttonDiv.find('a').text.strip()=='Track package':
640
                                        trackingUrl = buttonDiv.find('a')['href'].strip()
641
                                        if not trackingUrl.startswith("http"):
14608 amit.gupta 642
                                            trackingUrl = "http://www.amazon.in" + trackingUrl
13995 amit.gupta 643
                                        break
644
                                for prodDiv in productDivs:
645
                                    prodDiv.find('div', {'class':'a-fixed-left-grid-inner'})
646
                                    productTitle = prodDiv.find('div', {'class':'a-fixed-left-grid-inner'}).find("div", {'class':'a-row'}).find('a').text.strip()
647
                                    imgUrl = prodDiv.find("img")["src"]
648
                                    for subOrder in activeOrder['subOrders']:
17307 amit.gupta 649
                                        if subOrder['closed']==True:
650
                                            continue
17230 amit.gupta 651
                                        if subOrder['productTitle'] in productTitle:
13995 amit.gupta 652
                                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId")}
653
                                            updateMap = {}
654
                                            closedStatus = False
655
                                            updateMap['subOrders.$.imgUrl'] = imgUrl
14033 amit.gupta 656
                                            updateMap['subOrders.$.lastTracked'] = timestamp
17258 amit.gupta 657
                                            if status:
17348 amit.gupta 658
                                                updateMap['subOrders.$.detailedStatus'] = orderStatus
17258 amit.gupta 659
                                                updateMap['subOrders.$.status'] = status 
660
                                                cashbackStatus = subOrder.get("cashBackStatus")
13995 amit.gupta 661
 
17251 amit.gupta 662
                                            if status==MStore.ORDER_DELIVERED:
17271 amit.gupta 663
                                                if deliveredOn:                               
17254 amit.gupta 664
                                                    updateMap['subOrders.$.deliveredOn'] = deliveredOn
13995 amit.gupta 665
                                                closedStatus = True
666
                                                updateMap['subOrders.$.closed'] = True
667
                                                if cashbackStatus == Store.CB_PENDING:
14607 amit.gupta 668
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_APPROVED
13995 amit.gupta 669
                                            if status==MStore.ORDER_CANCELLED:     
670
                                                closedStatus = True
671
                                                updateMap['subOrders.$.closed'] = True
672
                                                if cashbackStatus == Store.CB_PENDING:
673
                                                    updateMap['subOrders.$.cashBackStatus'] = Store.CB_CANCELLED
17254 amit.gupta 674
                                            if status==MStore.ORDER_SHIPPED:
675
                                                if deliveryEstimate:   
676
                                                    updateMap['subOrders.$.estimatedDeliveryDate'] = deliveryEstimate
13995 amit.gupta 677
                                                if trackingUrl is not None:
678
                                                    updateMap['subOrders.$.trackingUrl'] = trackingUrl
17322 amit.gupta 679
                                                    updateMap['subOrders.$.trackMissing'] = False
17258 amit.gupta 680
                                            if shippingEstimate:   
681
                                                updateMap['subOrders.$.estimatedShippingDate'] = shippingEstimate
13995 amit.gupta 682
                                            if not closedStatus:
683
                                                closed = False
17307 amit.gupta 684
                                            #{"subOrders.closed":False,"subOrders.trackingUrl":{"$exists":False},"subOrders.trackAfter":{"$lt":utils.getCurrTimeStamp()}
17359 amit.gupta 685
                                            updateMap['status']='success'
13995 amit.gupta 686
                                            bulk.find(findMap).update({'$set' : updateMap})
687
                                            break
17321 amit.gupta 688
                            bulk.find({'orderId': activeOrder['orderId']}).update({"$set":{'closed':closed}})
17307 amit.gupta 689
                            break
690
                    if not matched:
17319 amit.gupta 691
                        updateMap = {'subOrders.$.trackMissing': True}
17307 amit.gupta 692
                        for subOrder in activeOrder['subOrders']:
693
                            if subOrder['closed']==True:
694
                                continue
695
                            findMap = {"orderId": activeOrder['orderId'], "subOrders.merchantSubOrderId": subOrder.get("merchantSubOrderId"), 
696
                                       "subOrders.trackAfter":{"$lt":utils.getCurrTimeStamp()}}
697
                            bulk.find({'orderId': activeOrder['orderId']})
698
                            bulk.find(findMap).update({'$set':updateMap})
14080 amit.gupta 699
                bulk.execute()
700
                return 'PARSED_SUCCESS'
701
            else:
15563 amit.gupta 702
                merchantOrderId = re.findall(r'https://www.amazon.in/gp/css/summary/edit.html\?orderID=(.*)?', url, re.IGNORECASE)[0]
703
                print  "merchantOrderId", merchantOrderId
14085 amit.gupta 704
                merchantOrder = self.db.merchantOrder.find_one({"merchantOrderId":merchantOrderId})
14945 amit.gupta 705
 
706
                filename = directory + "/" + merchantOrderId   
707
                f = open(filename,'w')
708
                f.write(rawHtml) # python will convert \n to os.linesep
709
                f.close() # you can omit in most cases as the destructor will call if
15555 amit.gupta 710
                result = self.parseOrderRawHtml(merchantOrder['orderId'], merchantOrder['subTagId'], merchantOrder['userId'], rawHtml, url, True)['result']
15562 amit.gupta 711
                print "result", result
15555 amit.gupta 712
                try:
15560 amit.gupta 713
                    order1 = session.query(OrdersRaw).filter_by(id=merchantOrder['orderId']).first()
714
                    order1.status = result
715
                    order1.rawhtml = rawHtml
17358 amit.gupta 716
                    order1.order_url = url
15555 amit.gupta 717
                    session.commit()
15561 amit.gupta 718
                except:
719
                    traceback.print_exc()
15555 amit.gupta 720
                finally:
721
                    session.close()
14080 amit.gupta 722
                return 'PARSED_SUCCESS'
723
                pass
14008 amit.gupta 724
            return 'PARSED_SUCCESS_NO_ORDERS'
13995 amit.gupta 725
        except:
726
            traceback.print_exc()    
727
            return 'PARSED_FAILED'
728
 
729
    def _getStatusFromDetailedStatus(self, detailedStatus):
14061 amit.gupta 730
        if "ordered from" in detailedStatus.lower():
731
            return MStore.ORDER_PLACED 
732
 
13995 amit.gupta 733
        for key, value in self.orderStatusRegexMap.iteritems():
14032 amit.gupta 734
            if detailedStatus.lower() in value:
13995 amit.gupta 735
                return key
736
 
17253 amit.gupta 737
        print "Detailed Status need to be mapped", "Store:", self.store_id, detailedStatus
13995 amit.gupta 738
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
14624 amit.gupta 739
    def scrapeAffiliate(self, startDate=None, endDate=None):
14650 amit.gupta 740
        br = getBrowserObject()
741
        br.add_password('https://assoc-datafeeds-eu.amazon.com', 'Saholic', 'Fnubyvp')
742
        url = AMAZON_AFF_URL
743
        response = br.open(url)
744
        #get data for past 40 days and store it to mongo
745
        dt = datetime.now()
14701 amit.gupta 746
        dat = dt - timedelta(days=2)
14651 amit.gupta 747
        url = AMAZON_AFF_FILE_URL%(datetime.strftime(dat, "%Y%m%d"))
748
        response = br.open(url)
749
        page = gzip.GzipFile(fileobj=response, mode='rb').read()
750
        j=-1
751
        for row in page.split("\n"):
752
            j += 1
753
            if j== 0 or j==1:
754
                continue
755
            fields = row.split("\t")
756
            if len(fields)>1:
757
                print fields
758
                amazonAffiliate = AmazonAffiliateInfo(fields[0], fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7], fields[8], fields[9])
759
                print amazonAffiliate
760
                self.db.amazonAffiliateInfo.insert(todict(amazonAffiliate))
761
            else:
762
                break
14650 amit.gupta 763
 
14608 amit.gupta 764
 
16468 amit.gupta 765
    def parseTrackingUrl(self, trackingUrl, orderId):
16474 amit.gupta 766
        print trackingUrl
14624 amit.gupta 767
        subOrder = {}
14749 amit.gupta 768
        page = fetchResponseUsingProxy(trackingUrl)
16468 amit.gupta 769
        status = MStore.ORDER_SHIPPED
770
        #print page
14624 amit.gupta 771
        soup = BeautifulSoup(page)
16468 amit.gupta 772
        header1 = soup.find("h1") 
773
        if header1:
18727 amit.gupta 774
            if header1.text=="Sign In" or header1.text.strip()=="Login":
16468 amit.gupta 775
                print "Login page is displayed for order id", orderId
17307 amit.gupta 776
                self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"trackError":True}})
18725 amit.gupta 777
                subOrder['login'] = True
14624 amit.gupta 778
                return subOrder
16468 amit.gupta 779
        try:
16474 amit.gupta 780
            print "Tracking page is displayed for order id", orderId
16468 amit.gupta 781
            detailedStatus = soup.find("div", {"class":"top"}).span.text.strip()
782
            try:
783
                displayStatus = soup.find("div",{"class":"a-column a-span12 shipment-status-content"}).span.text.strip()
784
            except:
785
                displayStatus = detailedStatus
786
            print displayStatus
787
            if detailedStatus.lower().find("delivered")>=0:
788
                print detailedStatus
789
                displayStatus = "Delivered"
790
                status = "Delivered"
791
                try:
792
                    subOrder["deliveredOn"] = detailedStatus.split("on")[1].strip()
793
                except:
794
                    pass
795
 
796
            elif detailedStatus.lower() == 'returned':
797
                status = 'Cancelled'
798
            subOrder['status'] = status
799
            subOrder['detailedStatus'] = displayStatus 
17350 amit.gupta 800
            self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"trackError":False}})    
16468 amit.gupta 801
 
802
        except:
17350 amit.gupta 803
            self.db.merchantOrder.update({"orderId":orderId}, {"$set":{"trackError":True}})    
16468 amit.gupta 804
            print "failed to parse", orderId
805
            traceback.print_exc()
806
 
14624 amit.gupta 807
        return subOrder
808
 
809
 
810
 
16980 amit.gupta 811
    def parseInfo(self,):
812
        from pyquery import PyQuery as pq
16986 amit.gupta 813
        orders = list(session.query(Orders).filter_by(store_id=self.store_id).filter_by(status='DETAIL_CREATED').group_by(Orders.user_id).all())
16980 amit.gupta 814
        try:
815
            for order in orders:
816
                try:
817
                    doc = pq(order.rawhtml)
818
                    #a1= " ".join(["" if not div.text else div.text.replace("\t","").replace("\n","").replace(" ", "") for div in pq(doc('article')[-1])('div')])
819
                    lists = doc('ul.displayAddressUL li')
16986 amit.gupta 820
                    orderInfo = All_user_addresses()
16980 amit.gupta 821
                    orderInfo.address = lists[-3].text
822
                    orderInfo.user_id = order.user_id
16986 amit.gupta 823
                    orderInfo.source = 'order' 
824
                    #orderInfo.order_id = order.id
825
                    #orderInfo.email = None
826
                    #orderInfo.name = lists[0].text 
827
                    #orderInfo.mobile = None
16980 amit.gupta 828
                    adSplit = lists[-2].text.split(",")
829
                    match = re.match(r"([a-z ]+)([0-9]+)", adSplit[1], re.I)
830
                    if match:
831
                        items = match.groups()
16986 amit.gupta 832
                    orderInfo.city = adSplit[0].strip()
833
                    orderInfo.pincode = items[1].strip()
834
                    orderInfo.state = items[0].strip().title()
16980 amit.gupta 835
                    session.commit()
836
                except:
837
                    session.rollback()
838
                    continue
839
        finally:
840
            session.close()
14608 amit.gupta 841
 
13927 amit.gupta 842
 
843
 
13774 amit.gupta 844
def main():
16874 amit.gupta 845
    store = getStore(1)
20498 amit.gupta 846
    store.parseOrderRawHtml("444444", '123', 14, readSSh('/home/amit/amit.txt'), 'https://www.amazon.in/gp/css/summary/edit.html?orderID=402-0540293-4683515')
847
#    orders = list(session.query(OrdersRaw).filter_by(status = 'DETAIL_NOT_CREATED_UNKNOWN').filter(OrdersRaw.id > 61071).all())
848
#    session.close()
849
#    for o in orders:
850
#        try:
851
#            store.trackOrdersForUser(o.id, o.order_url, o.rawhtml)
852
#        finally:
853
#            session.close()
17631 amit.gupta 854
    #store.trackOrdersForUser(10466, 'https://www.amazon.in/gp/css/summary/edit.html?orderID=403-7498756-0837158', readSSh('/AmazonTrack/User10466/403-7498756-0837158'))
18030 amit.gupta 855
    #store.trackOrdersForUser(46195, 'https://www.amazon.in/gp/css/summary/edit.html?orderID=404-4294022-1187515', readSSh('/home/amit/amazon.html'))
17231 amit.gupta 856
 
857
def getSummaryFile(directory):
858
    date1 = datetime(2015,1,1)
859
    finalFile = None
860
    try:
861
        for file in os.listdir(directory):
862
            if file.startswith("orderSummary"):
863
                date2 = datetime.strptime("2015-" + file.split("orderSummary")[1].split(":")[0], "%Y-%d-%m")
864
                if date2 > date1:
865
                    date1 = date2
866
                    finalFile=file
867
    except:
868
        print "Missing directory"
17251 amit.gupta 869
    return finalFile 
17231 amit.gupta 870
 
15555 amit.gupta 871
 
872
def parseDetailNotCreated():
873
    try:
874
        store=getStore(1)
875
        orders = session.query(OrdersRaw).filter_by(status='DETAIL_NOT_CREATED_UNKNOWN').all()
15558 amit.gupta 876
        session.close()
15555 amit.gupta 877
        for order in orders:
878
            store.trackOrdersForUser(order.id, order.order_url, order.rawhtml)
879
 
880
    finally:
881
        session.close()
17251 amit.gupta 882
 
883
def getDateStringDelivered(dateString='Monday'):
17254 amit.gupta 884
    print dateString
17251 amit.gupta 885
    if dateString.lower()=='today':
886
        return date.today()
887
    if dateString.lower()=='yesterday':
888
        return date.today() - timedelta(days=1)
889
    try:
890
        return datetime.strptime(dateString, '%d-%b-%y')
891
    except:
892
        try:
893
            #get Closest Date from today
894
            curDate = date.today()
895
            curTime = datetime(curDate.year, curDate.month, curDate.day)
896
            curYear = curDate.year
897
            prevYear = curYear - 1
17254 amit.gupta 898
            dateMax = datetime.strptime(dateString + " " + str(curYear), "%A, %d %b %Y")
899
            dateMin = datetime.strptime(dateString + " " + str(prevYear), "%A, %d %b %Y")
17251 amit.gupta 900
            if dateMax <= curTime:
901
                return dateMax
902
            else:
903
                return dateMin 
904
        except:
17254 amit.gupta 905
            try:
906
                days_of_week = ['sunday','monday','tuesday','wednesday',
907
                            'thursday','friday','saturday']
908
                deltaDays = curDate.isoweekday() - days_of_week.index(dateString.lower())
909
                if deltaDays <= 0:
910
                    deltaDays= deltaDays + 7
911
                curDate = curDate - timedelta(days=deltaDays)
912
                print datetime.strftime(curDate, '%d-%b-%y')
913
                return curDate
914
            except:
915
                print "could not parse"
916
                return None
15565 amit.gupta 917
 
17254 amit.gupta 918
def getDateStringArriving(dateString='Thursday'):
919
    print dateString
920
    if dateString.lower()=='today':
921
        return date.today()
922
    if dateString.lower()=='tomorrow':
923
        return date.today() + timedelta(days=1)
924
    try:
925
        return datetime.strptime(dateString, '%d-%b-%y')
926
    except:
927
        try:
928
            #get Closest Date from today
929
            curDate = date.today()
930
            curTime = datetime(curDate.year, curDate.month, curDate.day)
931
            curYear = curDate.year
932
            nextYear = curYear + 1
933
            dateMin = datetime.strptime(dateString + " " + str(curYear), "%A, %d %b %Y")
934
            dateMax = datetime.strptime(dateString + " " + str(nextYear), "%A, %d %b %Y")
935
            if dateMin >= curTime:
936
                return dateMin
937
            else:
938
                return dateMax 
939
        except:
940
            try:
941
                days_of_week = ['sunday','monday','tuesday','wednesday',
942
                            'thursday','friday','saturday']
943
                deltaDays = days_of_week.index(dateString.lower()) - curDate.isoweekday()
944
                if deltaDays < 0:
945
                    deltaDays= deltaDays + 7
946
                curDate = curDate + timedelta(days=deltaDays)
947
                return curDate
948
            except:
949
                print "Could not parse"
950
                return None 
951
 
18028 amit.gupta 952
def main1():
953
    store = getStore(1)
954
    for merchantOrder in store.db.merchantOrder.find({"subOrders":{"$elemMatch":{"cashBackStatus":"Not Applicable", "cashBackPercentage":{"$gt":0}}}}):
955
        mo = obj(merchantOrder)
956
        for subOrder in mo.subOrders:
957
            subOrder.closed=False 
958
        print "orderId", mo.orderId
959
        store.populateDerivedFields(mo, False)
960
        store.db.merchantOrder.update({"orderId":mo.orderId}, {"$set":todict(mo)})
961
        break
962
 
963
 
15565 amit.gupta 964
def parseOrderNotCreated():
965
    try:
966
        store=getStore(1)
967
        orders = session.query(OrdersRaw).filter_by(status='ORDER_NOT_CREATED_UNKNOWN').all()
968
        session.close()
969
        for order in orders:
15567 amit.gupta 970
            result = store.parseOrderRawHtml(order.id, order.sub_tag, order.user_id, order.rawhtml, order.order_url)['result']
971
            order1 = session.query(OrdersRaw).filter_by(id=order.id).first()
972
            order1.status = result
973
            session.commit()
15565 amit.gupta 974
    finally:
975
        session.close()
15555 amit.gupta 976
 
13774 amit.gupta 977
if __name__ == '__main__':
17599 amit.gupta 978
#    readSSh("/AmazonTrack/User2942/402-2467356-7564367")
979
#    readSSh("/AmazonTrack/User10466/orderSummary18-11:21:32:36")
18156 amit.gupta 980
#    readSSh("/AmazonTrack/User5525/171-0333104-6169933")
18159 amit.gupta 981
    main()
982
    #store=getStore(1)
983
    #store.trackOrdersForUser(5525, "https://www.amazon.in/gp/css/summary/edit.html?orderID=171-0333104-6169933", readSSh("/AmazonTrack/User5525/171-0333104-6169933"))