Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
15509 manish.sha 1
'''
2
Created on Jan 15, 2015
3
 
4
@author: Manish 
5
'''
6
from bs4 import BeautifulSoup
7
from bson.binary import Binary
8
from datetime import datetime, date, timedelta
9
from dtr import main
15791 manish.sha 10
from dtr.dao import AffiliateInfo, Order, SubOrder, ShopCluesAffiliateInfo
15509 manish.sha 11
from dtr.main import getBrowserObject, ScrapeException, getStore, ParseException, \
12
    Store as MStore, ungzipResponse, tprint
13
from dtr.storage import Mongo
14
from dtr.storage.Mongo import getImgSrc
15
from dtr.utils.utils import fetchResponseUsingProxy
16
from pprint import pprint
17
from pymongo import MongoClient
18
import json
19
import pymongo
20
import re
21
import time
22
import traceback
23
import urllib
15791 manish.sha 24
import urllib2
15509 manish.sha 25
from urlparse import urlparse, parse_qs
15791 manish.sha 26
import xml.etree.ElementTree as ET
27
from dtr.storage import MemCache
15509 manish.sha 28
 
29
USERNAME='profittill2@gmail.com'
30
PASSWORD='spice@2020'
15791 manish.sha 31
AFFLIATE_TRASACTIONS_URL = "https://admin.optimisemedia.com/v2/reports/affiliate/leads/leadsummaryexport.aspx?Contact=796881&Country=26&Agency=95&Merchant=420562&Status=-1&Year=%d&Month=%d&Day=%d&EndYear=%d&EndMonth=%d&EndDay=%d&DateType=0&Sort=CompletionDate&Login=1347562DA5E3EFF6FB1561765C47C782&Format=XML&RestrictURL=0"
15509 manish.sha 32
ORDER_TRACK_URL='http://www.shopclues.com/index.php?dispatch=order_lookup.details'
15791 manish.sha 33
ORDER_TRACK_URL_DB='https://sm.shopclues.com/trackOrder?'
15509 manish.sha 34
BASE_URL= 'http://www.shopclues.com'
35
BASE_MURL= 'http://m.shopclues.com'
36
 
37
class Store(MStore):
38
 
39
    '''
40
    This is to map order statuses of our system to order statuses of snapdeal.
41
    And our statuses will change accordingly.
42
 
43
    '''
44
    OrderStatusMap = {
45
                      MStore.ORDER_PLACED : ['payment successful', 'new order - cod confirmation pending', 'processing', 'quality check','on schedule', 'processing - pickup-initiated', 'processing - ready to dispatch'],
46
                      MStore.ORDER_DELIVERED : ['delivered', 'complete'],
47
                      MStore.ORDER_SHIPPED : ['in transit', 'dispatched','shipped','order handed to courier'],
48
                      MStore.ORDER_CANCELLED : ['payment failed', 'canceled', 'payment declined', 'order on hold - cancellation requested by customer', 'courier returned']
49
                      }
50
    OrderStatusConfirmationMap= {
15791 manish.sha 51
                                 "P" : "Payment Successful",
52
                                 "D" : "Order Declined",
53
                                 "O" : "New Order - COD confirmation Pending"
15509 manish.sha 54
                                 }
55
 
56
    CONF_CB_AMOUNT = MStore.CONF_CB_DISCOUNTED_PRICE
57
 
15791 manish.sha 58
    def convertToObj(self,offer):
59
        orderRef = offer['TransactionId']
60
        orderRef = orderRef[0:len(orderRef)-10]
61
        offer1 = ShopCluesAffiliateInfo(offer['UID'], offer['TransactionTime'], offer['TransactionId'], orderRef,  offer['MerchantRef'], offer['Merchant'], offer['PID'], offer['Product'], float(str(offer['SR'])), float(str(offer['TransactionValue'])), offer['UKey'], offer['ClickTime'], offer['Status'])
62
        return offer1
63
 
64
    def _saveToAffiliate(self, offers):
65
        collection = self.db.shopcluesOrderAffiliateInfo
66
        mcollection = self.db.merchantOrder
67
        for offerObj in offers:
68
            offer = self.convertToObj(offerObj)
69
            collection.update({"transactionId":offer.transactionId, "subTagId":offer.subTagId, "payOut":offer.payOut},{"$set":todict(offer)}, upsert=True)
70
            mcollection.update({"subTagId":offer.subTagId, "storeId":self.store_id, "subOrders.missingAff":True}, {"$set":{"subOrders.$.missingAff":False}})
71
 
15940 manish.sha 72
    def scrapeAffiliate(self, startDate=datetime.today() - timedelta(days=10), endDate=datetime.today()):
15791 manish.sha 73
        uri = AFFLIATE_TRASACTIONS_URL%(startDate.year,startDate.month,startDate.day,endDate.year,endDate.month,endDate.day)
74
        root = ET.parse(urllib2.urlopen(uri)).getroot()
75
        if len(root)> 0 and len(root[0])> 0:
76
            offers = []
77
            for child in root[0][0]:
78
                offers.append(child.attrib)
79
            self._saveToAffiliate(offers)
80
 
15509 manish.sha 81
    def _setLastSaleDate(self, saleDate):
82
        self.db.lastSaleDtate.update({'storeId':self.store_id}, {'$set':{'saleDate':saleDate}})
83
 
84
    def getName(self):
85
        return "shopclues"    
86
 
87
    def _getLastSaleDate(self,):
88
        lastDaySaleObj = self.db.lastDaySale.find_one({"storeId":self.store_id})
89
        if lastDaySaleObj is None:
90
            return datetime.min
91
 
92
    def _getStatusFromDetailedStatus(self, detailedStatus):
93
        for key, value in Store.OrderStatusMap.iteritems():
94
            if detailedStatus.lower() in value:
95
                return key
96
        print "Detailed Status need to be mapped", detailedStatus, self.store_id
97
        return None
98
 
15791 manish.sha 99
    def _getSingleSubOrderMap(self, orderId, soup, orderObj):
100
        orderStatus = self.OrderStatusConfirmationMap.get(orderObj['0']['status'])
101
        statusTime= soup.findAll(attrs={'class' : 'sts no_mobile'})[1].contents[2].strip()
15509 manish.sha 102
        productDetailsMap = {}
103
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 104
        firstRow = orderTable.pop(0)
105
        totalColumns = len(firstRow.find_all('td'))
106
        jsonSubOrdersMap = {}
107
        count = 1
108
 
109
        for val in orderObj['0']['items'].values():
110
            newCount = 0
111
            for key in jsonSubOrdersMap.keys():
112
                splitKey = key.split('-')
113
                if str(val['order_id']) == splitKey[0]:
114
                    newCount = int(splitKey[1])
115
                    break
116
            if newCount >0 :
117
                count = newCount +1
118
                jsonSubOrdersMap[str(val['order_id'])+'-'+str(count)] = val
119
            else:
120
                jsonSubOrdersMap[str(val['order_id'])+'-'+str(count)] = val
121
 
122
            count= count+1
123
 
15941 manish.sha 124
        print jsonSubOrdersMap.items()
125
 
15791 manish.sha 126
        count = 1
15509 manish.sha 127
        for orderTr in orderTable:
15791 manish.sha 128
            productDetailsSubMap = None
129
            productDetailsSubMap = {}
15509 manish.sha 130
            cols = orderTr.find_all('td')
131
            product_details = cols[0].find_all('a')
132
            #print product_details
133
            productUrl = product_details[0].get('href')
134
            productName = product_details[0].contents[0].strip()
135
            quantity = int(cols[1].text.strip())
136
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 137
            discount = 0
138
            subtotal = 0
139
            if totalColumns == 5:
140
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
141
                    discount = long(cols[3].text.strip().replace("Rs.",""))
142
                else:
143
                    discount = 0
144
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
145
            else:
146
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
15509 manish.sha 147
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
148
            productDetailsSubMap['productName']=productName
15791 manish.sha 149
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+'order_id=' +str(orderId)+'&email_id='+ orderObj['0']['email']
15509 manish.sha 150
            productDetailsSubMap['sellingPrice']=sellingPrice
151
            productDetailsSubMap['quantity']=quantity
152
            productDetailsSubMap['discount']=discount
153
            productDetailsSubMap['subtotal']=subtotal
15791 manish.sha 154
            jsonSubOrderDetails = jsonSubOrdersMap.get(str(orderId)+'-'+str(count))
155
            productCode = jsonSubOrderDetails['product_code']
156
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 157
            productDetailsSubMap['productCode']=productCode
158
            productDetailsSubMap['imgUrl']=productImgUrl
159
 
15791 manish.sha 160
            productDetailsSubMap['subOrderStatus']=orderStatus
161
            productDetailsSubMap['subOrderStatusTime']=statusTime
162
            productDetailsMap[str(orderId)+'-'+str(count)]=productDetailsSubMap
163
            count = count +1
15509 manish.sha 164
        return productDetailsMap
165
 
15791 manish.sha 166
    def _getMultiSubOrdersMap(self, orderId, soup, orderObj):
15509 manish.sha 167
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 168
        #firstRow = orderTable.pop(0)
169
        #totalColumns = len(firstRow.find_all('td'))
15509 manish.sha 170
        productDetailsMap = {}
15791 manish.sha 171
        '''
172
        jsonSubOrdersMap = {}
173
        for val in orderObj['0']['items'].values():
174
            jsonSubOrdersMap[val['order_id']] = val
175
        '''
176
        existingOrders = []
15509 manish.sha 177
        for orderTr in orderTable:
15791 manish.sha 178
            subOrderDetailsMap = {}
179
 
15509 manish.sha 180
            cols = orderTr.find_all('td')
181
            product_details = cols[0].find_all('a')
182
            #print product_details
183
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 184
            if subOrderId in existingOrders:
185
                continue
186
            else:
187
                existingOrders.append(subOrderId)
188
            #productUrl = product_details[0].get('href')
189
            #productName = product_details[0].contents[0].strip()
190
            subOrderTrackingParsingUrl = product_details[1].get('href')
191
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
192
            '''
15509 manish.sha 193
            quantity = int(cols[1].text.strip())
194
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 195
            discount = 0
196
            subtotal = 0
197
            if totalColumns == 5:
198
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
199
                    discount = long(cols[3].text.strip().replace("Rs.",""))
200
                else:
201
                    discount = 0                    
202
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
203
            else:
204
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
15509 manish.sha 205
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
206
            productDetailsSubMap['productName']=productName
15791 manish.sha 207
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+subOrderTrackingUrl
15509 manish.sha 208
            productDetailsSubMap['sellingPrice']=sellingPrice
209
            productDetailsSubMap['quantity']=quantity
210
            productDetailsSubMap['discount']=discount
211
            productDetailsSubMap['subtotal']=subtotal
15791 manish.sha 212
            jsonSubOrderDetails = jsonSubOrdersMap.get(subOrderId)
213
            productCode = jsonSubOrderDetails['product_code']
214
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 215
            productDetailsSubMap['productCode']=productCode
216
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 217
            '''
15509 manish.sha 218
            br1 = getBrowserObject()
15791 manish.sha 219
            orderTrackingPage = br1.open(BASE_URL+'&'+subOrderTrackingParsingUrl)
15509 manish.sha 220
            headers = str(orderTrackingPage.info()).split('\n')
221
            orderTrackingPage= ungzipResponse(orderTrackingPage)
222
            jsonResponse = None
223
            for header in headers:
224
                header = header.split(':')
225
                if header[0] == 'Content-Type' and 'json' in header[1]:
226
                    jsonResponse = json.loads(orderTrackingPage)
227
 
228
            orderTrackingPageSoup = None
229
            if jsonResponse is not None:
230
                orderTrackingPageSoup = BeautifulSoup(str(jsonResponse['text']))
231
            else:
232
                orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 233
            '''
15509 manish.sha 234
            subOrderStatusList = orderTrackingPageSoup.findAll(attrs={'class' : 'price ord_status'})
235
            subOrderStatus = subOrderStatusList[0].contents[0].strip()
236
            subOrderStatusTime= orderTrackingPageSoup.findAll(attrs={'class' : 'sts no_mobile'})[1].contents[2].strip()
237
            productDetailsSubMap['subOrderStatus'] = subOrderStatus
238
            productDetailsSubMap['subOrderStatusTime'] = subOrderStatusTime
239
            productDetailsSubMap['parentOrderId']=orderId
15791 manish.sha 240
            '''
241
 
242
            subOrderDetailsMap = self._getSingleSubOrderMap(subOrderId, orderTrackingPageSoup, orderObj)
15509 manish.sha 243
 
15791 manish.sha 244
            productDetailsMap = dict(productDetailsMap.items()+subOrderDetailsMap.items())
15509 manish.sha 245
 
246
        return productDetailsMap
247
 
248
    def updateCashbackInSubOrders(self, subOrders):
249
        for subOrder in subOrders:
250
            cashbackStatus = Store.CB_NA
251
            cashbackAmount = 0
252
            percentage = 0
253
            amount = subOrder.amountPaid
254
            if amount > 0:
255
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amount)
256
                if cashbackAmount > 0:
257
                    cashbackStatus = Store.CB_PENDING
258
            subOrder.cashBackStatus = cashbackStatus
259
            subOrder.cashBackAmount = cashbackAmount
260
            subOrder.cashBackPercentage = percentage
261
        return subOrders
262
 
15791 manish.sha 263
    def _parseOrders(self, orderId, subTagId, userId, page, orderSuccessUrl, orderObj):
15509 manish.sha 264
        soup = BeautifulSoup(page)
265
        productDetailsMap = {}
266
        paymentFields = soup.findAll(attrs={'class' : 'box_paymentcalculations_row'})
267
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
268
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
269
        ordersubtotal=0
270
        ordercluebucks=0
271
        ordershippingcost=0
272
        ordertotal=0
273
 
274
        for val in paymentFields:
275
            for value in val.contents:
276
                if value is not None:
277
                    if 'div' in str(value).strip():
278
                        if 'Subtotal' in value.text.strip():
279
                            ordersubtotal = long(val.contents[3].text.strip().replace("Rs.",""))
280
                            print ordersubtotal
281
                        if 'Shipping Cost' in value.text.strip():
282
                            ordershippingcost = long(val.contents[3].text.strip().replace("Rs.",""))
283
                            print ordershippingcost
284
                        if 'Clue' in value.text.strip():
285
                            ordercluebucks = long(val.contents[3].text.strip().replace("Rs.",""))
286
                            print ordercluebucks
287
                        if 'Total' in value.text.strip():
15791 manish.sha 288
                            ordertotal = val.contents[3].text.strip().replace("Rs.","")
289
                            ordertotal = ordertotal.replace(',','')
15509 manish.sha 290
                            print ordertotal
15791 manish.sha 291
 
292
        if orderObj['0']['is_parent_order'] == 'N':
293
            productDetailsMap = self._getSingleSubOrderMap(orderId, soup, orderObj)
15509 manish.sha 294
        else:
15791 manish.sha 295
            productDetailsMap = self._getMultiSubOrdersMap(orderId, soup, orderObj)
15509 manish.sha 296
 
15791 manish.sha 297
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
15509 manish.sha 298
        merchantOrder.placedOn = placedOn
15791 manish.sha 299
        merchantOrder.merchantOrderId = orderObj['0']['order_id']
15509 manish.sha 300
        merchantOrder.paidAmount = ordertotal
301
        totalOrdersAmount = 0
302
        totalDiscount = 0
303
        subOrders= []
304
        for key in productDetailsMap:
305
            subOrderDetail = productDetailsMap.get(key)
306
            totalOrdersAmount = totalOrdersAmount  + (subOrderDetail['sellingPrice'] * subOrderDetail['quantity'])
307
            totalDiscount = totalDiscount + (subOrderDetail['discount'] * subOrderDetail['quantity'])
308
            subOrder = SubOrder(subOrderDetail['productName'], subOrderDetail['productUrl'], placedOn, subOrderDetail['subtotal'])
309
            subOrder.merchantSubOrderId = key
310
            subOrder.detailedStatus = subOrderDetail['subOrderStatus']
311
            subOrder.imgUrl = subOrderDetail['imgUrl']
312
            subOrder.offerDiscount = subOrderDetail['discount'] * subOrderDetail['quantity']
313
            subOrder.unitPrice = subOrderDetail['sellingPrice']
314
            subOrder.productCode = subOrderDetail['productCode']
315
            subOrder.amountPaid = subOrderDetail['subtotal']
316
            subOrder.quantity = subOrderDetail['quantity']
15791 manish.sha 317
            subOrder.tracingkUrl = subOrderDetail['subOrderTrackingUrl']
15509 manish.sha 318
            subOrders.append(subOrder)
319
        print totalOrdersAmount, totalDiscount
320
        merchantOrder.totalAmount = totalOrdersAmount
321
        merchantOrder.discountApplied = totalDiscount
322
        merchantOrder.deliveryCharges = ordershippingcost
323
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
324
 
325
        return merchantOrder
326
 
327
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
328
        resp = {}
329
        try:
15791 manish.sha 330
            rawHtmlSoup = BeautifulSoup(rawHtml)
331
            emailId = None
332
            orderObj = None
333
            merchantOrderId = None
334
            for script in rawHtmlSoup.find_all('script'):
335
                if 'orderConfirmation' in script.text:
336
                    orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
337
                    if merchantOrderId is None:
338
                        merchantOrderId = orderObj['0']['order_id']
339
                        emailId = orderObj['0']['email']
340
 
15509 manish.sha 341
            br = getBrowserObject()
15791 manish.sha 342
            url = ORDER_TRACK_URL +'&order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 343
            page = br.open(url)
344
            headers = str(page.info()).split('\n')
345
            page = ungzipResponse(page)
346
            jsonResponse = None
347
            for header in headers:
348
                header = header.split(':')
349
                if header[0] == 'Content-Type' and 'json' in header[1]:
350
                    jsonResponse = json.loads(page)
351
            if jsonResponse is not None:
352
                page = jsonResponse['text']
353
 
15791 manish.sha 354
            merchantOrder = self._parseOrders(orderId, subTagId, userId, page, orderSuccessUrl, orderObj)
15509 manish.sha 355
 
15791 manish.sha 356
            merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(orderId)+'&email_id='+ emailId
15509 manish.sha 357
 
358
            if self._saveToOrder(todict(merchantOrder)):
359
                resp['result'] = 'ORDER_CREATED'
360
            else:
361
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
362
 
363
            return resp
364
        except:
365
            print "Error occurred"
366
            traceback.print_exc()
367
            resp['result'] = 'ORDER_NOT_CREATED'
368
 
15791 manish.sha 369
    def parseSingleSubOrder(self, soup, emailId, subOrderId):
370
        orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
371
        subOrderStatus = orderStatusList[0].contents[0].strip()
15509 manish.sha 372
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
373
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")    
374
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 375
        firstRow = orderTable.pop(0)
376
        totalColumns = len(firstRow.find_all('td'))
377
        subOrders =[]
378
        count =1   
15509 manish.sha 379
        for orderTr in orderTable:
380
            cols = orderTr.find_all('td')
381
            product_details = cols[0].find_all('a')
382
            #print product_details
383
            productUrl = product_details[0].get('href')
384
            productName = product_details[0].contents[0].strip()
385
            quantity = int(cols[1].text.strip())
386
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 387
            discount = 0
388
            subtotal = 0
389
            if totalColumns == 5:
390
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
391
                    discount = long(cols[3].text.strip().replace("Rs.",""))
392
                else:
393
                    discount = 0
394
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
395
            else:
396
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
15509 manish.sha 397
            br = getBrowserObject()
398
            productPage = br.open(BASE_MURL+productUrl)
399
            productPageHeaders = str(productPage.info()).split('\n')
400
            productPage = ungzipResponse(productPage)
401
            jsonProductResponse = None
402
            for header in productPageHeaders:
403
                header = header.split(':')
404
                if header[0] == 'Content-Type' and 'json' in header[1]:
405
                    jsonProductResponse = json.loads(productPage)
406
            productPageSoup= None
407
            if jsonProductResponse is not None:
408
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
409
            else:
410
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 411
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 412
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
413
            productImgUrl = ''
414
            if allproductImageTags is not None and len(allproductImageTags)>0:
415
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
416
 
417
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
15791 manish.sha 418
            subOrder.merchantSubOrderId = str(subOrderId)+'-'+str(count)
15509 manish.sha 419
            subOrder.detailedStatus = subOrderStatus
420
            subOrder.imgUrl = productImgUrl
421
            subOrder.offerDiscount = discount*quantity
422
            subOrder.unitPrice = sellingPrice
423
            subOrder.productCode = productCode
424
            subOrder.amountPaid = subtotal
425
            subOrder.quantity = quantity
15791 manish.sha 426
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB +  'order_id=' +subOrderId+'&email_id='+ emailId
15509 manish.sha 427
            subOrders.append(subOrder)
15791 manish.sha 428
            count = count +1
15509 manish.sha 429
 
430
        subOrders = self.updateCashbackInSubOrders(subOrders)
15791 manish.sha 431
        return subOrders
15509 manish.sha 432
 
15791 manish.sha 433
    def parseMultiSubOrders(self, soup, emailId):
15509 manish.sha 434
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 435
        '''
436
        firstRow = orderTable.pop(0)
437
        totalColumns = len(firstRow.find_all('td'))
438
 
15509 manish.sha 439
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15791 manish.sha 440
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
441
        '''    
15509 manish.sha 442
        subOrders = []
15791 manish.sha 443
        existingOrders = []
15509 manish.sha 444
        for orderTr in orderTable:
445
            cols = orderTr.find_all('td')
446
            product_details = cols[0].find_all('a')
447
            #print product_details
448
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 449
            if subOrderId in existingOrders:
450
                continue
451
            else:
452
                existingOrders.append(subOrderId)
453
            '''
15509 manish.sha 454
            productUrl = product_details[0].get('href')
455
            productName = product_details[0].contents[0].strip()
15791 manish.sha 456
            '''
457
            subOrderTrackingParsingUrl = product_details[1].get('href')
458
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
459
            '''
15509 manish.sha 460
            quantity = int(cols[1].text.strip())
461
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 462
            discount = 0
463
            subtotal = 0
464
            if totalColumns == 5:
465
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
466
                    discount = long(cols[3].text.strip().replace("Rs.",""))
467
                else:
468
                    discount = 0
469
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
470
            else:
471
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
472
 
15509 manish.sha 473
            br = getBrowserObject()
474
            productPage = br.open(BASE_MURL+productUrl)
475
            productPageHeaders = str(productPage.info()).split('\n')
476
            productPage = ungzipResponse(productPage)
477
            jsonProductResponse = None
478
            for header in productPageHeaders:
479
                header = header.split(':')
480
                if header[0] == 'Content-Type' and 'json' in header[1]:
481
                    jsonProductResponse = json.loads(productPage)
482
            productPageSoup= None
483
            if jsonProductResponse is not None:
484
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
485
            else:
486
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 487
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 488
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
489
            productImgUrl = ''
490
            if allproductImageTags is not None and len(allproductImageTags)>0:
491
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
492
            productDetailsSubMap['productCode']=productCode
493
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 494
            '''
15509 manish.sha 495
            br1 = getBrowserObject()
15791 manish.sha 496
            orderTrackingPage = br1.open(BASE_URL+'&'+subOrderTrackingParsingUrl)
15509 manish.sha 497
            headers = str(orderTrackingPage.info()).split('\n')
498
            orderTrackingPage= ungzipResponse(orderTrackingPage)
499
            jsonResponse = None
500
            for header in headers:
501
                header = header.split(':')
502
                if header[0] == 'Content-Type' and 'json' in header[1]:
503
                    jsonResponse = json.loads(orderTrackingPage)
504
 
505
            orderTrackingPageSoup = None
506
            if jsonResponse is not None:
507
                orderTrackingPageSoup = BeautifulSoup(str(jsonResponse['text']))
508
            else:
509
                orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 510
            subOrdersDetails = self.parseSingleSubOrder(orderTrackingPageSoup, emailId, subOrderId)
511
            subOrders = list(set(subOrders + subOrdersDetails))
15509 manish.sha 512
 
15791 manish.sha 513
        return subOrders
15509 manish.sha 514
 
515
    def scrapeStoreOrders(self,):
516
        #collectionMap = {'palcedOn':1}
517
        searchMap = {}
518
        collectionMap = {"orderTrackingUrl":1}
519
        orders = self._getActiveOrders(searchMap,collectionMap)
520
        for order in orders:
521
            print "Order", self.store_name, order['orderId'], order['orderTrackingUrl']
15791 manish.sha 522
            url = ORDER_TRACK_URL + order['orderTrackingUrl'].split('trackOrder?')[1]
15509 manish.sha 523
            page = fetchResponseUsingProxy(url)
524
            soup = BeautifulSoup(page)
525
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
526
            closed = True
527
            orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
528
            if orderStatusList is not None and len(orderStatusList)>0:
529
                subOrderId = soup.findAll(attrs={'class':'price ord_no'})[0].text.strip()
530
                orderStatus = orderStatusList[0].contents[0].strip()
15791 manish.sha 531
                orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
532
                orderTable.pop(0)
533
                count = 1
534
                while count <= len(orderTable):
535
                    subOrder =  self._isSubOrderActive(order, str(subOrderId)+'-'+str(count))
536
                    count = count +1
537
                    if subOrder is None:
538
                        try:
539
                            subOrders = self.parseSingleSubOrder(soup, order['orderTrackingUrl'].split('email_id=')[1], subOrderId)
540
                            for subOrder in subOrders:
541
                                if subOrder is None:
542
                                    continue
543
                                self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
544
                                print "Added new suborders to Order id - ", order['orderId']
545
                                closed = False
546
                        except:
547
                            pass
548
                        continue
549
                    elif subOrder['closed']:
550
                        continue
15509 manish.sha 551
                    else:
15791 manish.sha 552
                        findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
553
                        updateMap = {}
554
                        updateMap["subOrders.$.detailedStatus"] = orderStatus
555
                        status = self._getStatusFromDetailedStatus(orderStatus) 
556
                        closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
557
                        if status is not None:
558
                            updateMap["subOrders.$.status"] = status
559
                        if closedStatus:
560
                            #if status is closed then change the paybackStatus accordingly
561
                            updateMap["subOrders.$.closed"] = True
562
                            if status == Store.ORDER_DELIVERED:
563
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
564
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
565
                            elif status == Store.ORDER_CANCELLED:
566
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
567
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
568
                        else:
569
                            closed = False
570
                        bulk.find(findMap).update({'$set' : updateMap})
15509 manish.sha 571
 
572
            else:
15791 manish.sha 573
                subOrdersList = self.parseMultiSubOrders(soup, order['orderTrackingUrl'].split('email_id=')[1])
15509 manish.sha 574
                for subOrderObj in subOrdersList:
575
                    subOrder =  self._isSubOrderActive(order, subOrderObj.merchantSubOrderId)
576
                    if subOrder is None:
577
                        self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrderObj])}}})
578
                        print "Added new suborders to Order id - ", order['orderId']
579
                        closed = False
580
                        continue
581
                    elif subOrder['closed']:
582
                        continue
583
                    else:
584
                        findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
585
                        updateMap = {}
586
                        updateMap["subOrders.$.detailedStatus"] = subOrderObj.detailedStatus
587
                        status = self._getStatusFromDetailedStatus(orderStatus) 
588
                        closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
589
                        if status is not None:
590
                            updateMap["subOrders.$.status"] = status
591
                        if closedStatus:
592
                            #if status is closed then change the paybackStatus accordingly
593
                            updateMap["subOrders.$.closed"] = True
594
                            if status == Store.ORDER_DELIVERED:
595
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
596
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
597
                            elif status == Store.ORDER_CANCELLED:
598
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
599
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
600
                        else:
601
                            closed = False
15510 manish.sha 602
                        bulk.find(findMap).update({'$set' : updateMap})
15509 manish.sha 603
            bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
604
            result = bulk.execute()
605
            tprint(result)      
15791 manish.sha 606
 
607
    '''
608
    def getTrackingUrls(self, userId):
609
        missingOrderUrls = ['https://sm.shopclues.com/myaccount','https://sm.shopclues.com/myorders']
610
        return missingOrderUrls
15509 manish.sha 611
 
15791 manish.sha 612
    def parseMyProfileForEmailId(self, userId, url, rawhtml):
613
        profileSoup = BeautifulSoup(rawhtml)
614
        if profileSoup.find('input', {'name':'user_email'}) is not None:
615
            emailId = profileSoup.find('input', {'name':'user_email'})['value']
616
            if emailId is not None and emailId.strip() !='':
617
                mc = MemCache()
618
                mc.set(str(userId), emailId, 600)
619
                return 'EMAIL_SET_SUCCESS'
620
            else:
621
                return 'EMAIL_NOT_FOUND'
622
        else:
623
            return 'EMAIL_NOT_FOUND'
15509 manish.sha 624
 
15791 manish.sha 625
    def parseMyOrdersForEmailId(self, userId, url, rawhtml):
626
        myOrdersPageSoup = BeautifulSoup(rawhtml)
627
        if myOrdersPageSoup.find('a', {'class':'detail'}) is not None:
628
            emailId = myOrdersPageSoup.find('a', {'class':'detail'})['href'].split('&')[1].split('=')[1]
629
            mc = MemCache()
630
            mc.set(str(userId), emailId, 600)
631
            return 'EMAIL_SET_SUCCESS'
632
        else:
633
            return 'EMAIL_NOT_FOUND'
634
    '''        
635
 
636
 
15509 manish.sha 637
def todict(obj, classkey=None):
638
    if isinstance(obj, dict):
639
        data = {}
640
        for (k, v) in obj.items():
641
            data[k] = todict(v, classkey)
642
        return data
643
    elif hasattr(obj, "_ast"):
644
        return todict(obj._ast())
645
    elif hasattr(obj, "__iter__"):
646
        return [todict(v, classkey) for v in obj]
647
    elif hasattr(obj, "__dict__"):
648
        data = dict([(key, todict(value, classkey)) 
649
            for key, value in obj.__dict__.iteritems() 
650
            if not callable(value) and not key.startswith('_')])
651
        if classkey is not None and hasattr(obj, "__class__"):
652
            data[classkey] = obj.__class__.__name__
653
        return data
654
    else:
15791 manish.sha 655
        return obj    
656
 
15509 manish.sha 657