Subversion Repositories SmartDukaan

Rev

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