Subversion Repositories SmartDukaan

Rev

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