Subversion Repositories SmartDukaan

Rev

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