Subversion Repositories SmartDukaan

Rev

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