Subversion Repositories SmartDukaan

Rev

Rev 17335 | Rev 17348 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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