Subversion Repositories SmartDukaan

Rev

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