Subversion Repositories SmartDukaan

Rev

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