Subversion Repositories SmartDukaan

Rev

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