Subversion Repositories SmartDukaan

Rev

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