Subversion Repositories SmartDukaan

Rev

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