Subversion Repositories SmartDukaan

Rev

Rev 16108 | Rev 16110 | 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
16097 manish.sha 28
from dtr.storage.Mongo import getDealRank
15509 manish.sha 29
 
30
USERNAME='profittill2@gmail.com'
31
PASSWORD='spice@2020'
15791 manish.sha 32
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 33
ORDER_TRACK_URL='http://www.shopclues.com/index.php?dispatch=order_lookup.details'
15791 manish.sha 34
ORDER_TRACK_URL_DB='https://sm.shopclues.com/trackOrder?'
15509 manish.sha 35
BASE_URL= 'http://www.shopclues.com'
36
BASE_MURL= 'http://m.shopclues.com'
37
 
38
class Store(MStore):
39
 
40
    '''
41
    This is to map order statuses of our system to order statuses of snapdeal.
42
    And our statuses will change accordingly.
43
 
44
    '''
45
    OrderStatusMap = {
46
                      MStore.ORDER_PLACED : ['payment successful', 'new order - cod confirmation pending', 'processing', 'quality check','on schedule', 'processing - pickup-initiated', 'processing - ready to dispatch'],
47
                      MStore.ORDER_DELIVERED : ['delivered', 'complete'],
48
                      MStore.ORDER_SHIPPED : ['in transit', 'dispatched','shipped','order handed to courier'],
49
                      MStore.ORDER_CANCELLED : ['payment failed', 'canceled', 'payment declined', 'order on hold - cancellation requested by customer', 'courier returned']
50
                      }
51
    OrderStatusConfirmationMap= {
15791 manish.sha 52
                                 "P" : "Payment Successful",
53
                                 "D" : "Order Declined",
54
                                 "O" : "New Order - COD confirmation Pending"
15509 manish.sha 55
                                 }
56
 
57
    CONF_CB_AMOUNT = MStore.CONF_CB_DISCOUNTED_PRICE
58
 
15791 manish.sha 59
    def convertToObj(self,offer):
60
        orderRef = offer['TransactionId']
61
        orderRef = orderRef[0:len(orderRef)-10]
62
        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'])
63
        return offer1
64
 
65
    def _saveToAffiliate(self, offers):
66
        collection = self.db.shopcluesOrderAffiliateInfo
67
        mcollection = self.db.merchantOrder
68
        for offerObj in offers:
69
            offer = self.convertToObj(offerObj)
70
            collection.update({"transactionId":offer.transactionId, "subTagId":offer.subTagId, "payOut":offer.payOut},{"$set":todict(offer)}, upsert=True)
71
            mcollection.update({"subTagId":offer.subTagId, "storeId":self.store_id, "subOrders.missingAff":True}, {"$set":{"subOrders.$.missingAff":False}})
72
 
15940 manish.sha 73
    def scrapeAffiliate(self, startDate=datetime.today() - timedelta(days=10), endDate=datetime.today()):
15791 manish.sha 74
        uri = AFFLIATE_TRASACTIONS_URL%(startDate.year,startDate.month,startDate.day,endDate.year,endDate.month,endDate.day)
75
        root = ET.parse(urllib2.urlopen(uri)).getroot()
76
        if len(root)> 0 and len(root[0])> 0:
77
            offers = []
78
            for child in root[0][0]:
79
                offers.append(child.attrib)
80
            self._saveToAffiliate(offers)
81
 
15509 manish.sha 82
    def _setLastSaleDate(self, saleDate):
83
        self.db.lastSaleDtate.update({'storeId':self.store_id}, {'$set':{'saleDate':saleDate}})
84
 
85
    def getName(self):
86
        return "shopclues"    
87
 
88
    def _getLastSaleDate(self,):
89
        lastDaySaleObj = self.db.lastDaySale.find_one({"storeId":self.store_id})
90
        if lastDaySaleObj is None:
91
            return datetime.min
92
 
93
    def _getStatusFromDetailedStatus(self, detailedStatus):
94
        for key, value in Store.OrderStatusMap.iteritems():
95
            if detailedStatus.lower() in value:
96
                return key
97
        print "Detailed Status need to be mapped", detailedStatus, self.store_id
98
        return None
99
 
15791 manish.sha 100
    def _getSingleSubOrderMap(self, orderId, soup, orderObj):
101
        orderStatus = self.OrderStatusConfirmationMap.get(orderObj['0']['status'])
102
        statusTime= soup.findAll(attrs={'class' : 'sts no_mobile'})[1].contents[2].strip()
15509 manish.sha 103
        productDetailsMap = {}
104
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 105
        firstRow = orderTable.pop(0)
15949 manish.sha 106
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 107
        jsonSubOrdersMap = {}
108
        count = 1
109
 
110
        for val in orderObj['0']['items'].values():
111
            newCount = 0
112
            for key in jsonSubOrdersMap.keys():
113
                splitKey = key.split('-')
16107 manish.sha 114
                if str(val['child']) == splitKey[0]:
15791 manish.sha 115
                    newCount = int(splitKey[1])
116
                    break
16108 manish.sha 117
            count = newCount +1
118
            jsonSubOrdersMap[str(val['child'])+'-'+str(count)] = val
16109 manish.sha 119
            if newCount>0:
120
                count = 1
15791 manish.sha 121
 
15941 manish.sha 122
        print jsonSubOrdersMap.items()
123
 
15791 manish.sha 124
        count = 1
15509 manish.sha 125
        for orderTr in orderTable:
15791 manish.sha 126
            productDetailsSubMap = None
127
            productDetailsSubMap = {}
15509 manish.sha 128
            cols = orderTr.find_all('td')
129
            product_details = cols[0].find_all('a')
130
            #print product_details
131
            productUrl = product_details[0].get('href')
132
            productName = product_details[0].contents[0].strip()
133
            quantity = int(cols[1].text.strip())
15980 manish.sha 134
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 135
            discount = 0
136
            subtotal = 0
137
            if totalColumns == 5:
15949 manish.sha 138
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 139
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 140
                else:
141
                    discount = 0
15980 manish.sha 142
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 143
            else:
15980 manish.sha 144
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 145
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
146
            productDetailsSubMap['productName']=productName
15791 manish.sha 147
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+'order_id=' +str(orderId)+'&email_id='+ orderObj['0']['email']
15509 manish.sha 148
            productDetailsSubMap['sellingPrice']=sellingPrice
149
            productDetailsSubMap['quantity']=quantity
150
            productDetailsSubMap['discount']=discount
151
            productDetailsSubMap['subtotal']=subtotal
15942 manish.sha 152
            key = str(orderId)+'-'+str(count)
153
            print 'SubOrder Map Key--',key
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)
16105 manish.sha 168
        firstRow = orderTable.pop(0)
15791 manish.sha 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()
16106 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
 
15947 manish.sha 263
    def _parseOrders(self, orderId, mpOrderId, 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'})
15948 manish.sha 268
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
15509 manish.sha 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():
15981 manish.sha 279
                            ordersubtotal = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 280
                            print ordersubtotal
281
                        if 'Shipping Cost' in value.text.strip():
15981 manish.sha 282
                            ordershippingcost = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 283
                            print ordershippingcost
284
                        if 'Clue' in value.text.strip():
15981 manish.sha 285
                            ordercluebucks = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 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':
15947 manish.sha 293
            productDetailsMap = self._getSingleSubOrderMap(mpOrderId, soup, orderObj)
15509 manish.sha 294
        else:
15947 manish.sha 295
            productDetailsMap = self._getMultiSubOrdersMap(mpOrderId, 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']
16097 manish.sha 318
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
319
            subOrder.dealRank = dealRank.get('rank')
320
            subOrder.rankDesc = dealRank.get('description')
15509 manish.sha 321
            subOrders.append(subOrder)
322
        print totalOrdersAmount, totalDiscount
323
        merchantOrder.totalAmount = totalOrdersAmount
324
        merchantOrder.discountApplied = totalDiscount
325
        merchantOrder.deliveryCharges = ordershippingcost
326
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
327
 
328
        return merchantOrder
329
 
330
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
331
        resp = {}
332
        try:
15791 manish.sha 333
            rawHtmlSoup = BeautifulSoup(rawHtml)
334
            emailId = None
335
            orderObj = None
336
            merchantOrderId = None
337
            for script in rawHtmlSoup.find_all('script'):
338
                if 'orderConfirmation' in script.text:
339
                    orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
340
                    if merchantOrderId is None:
341
                        merchantOrderId = orderObj['0']['order_id']
342
                        emailId = orderObj['0']['email']
343
 
15509 manish.sha 344
            br = getBrowserObject()
15791 manish.sha 345
            url = ORDER_TRACK_URL +'&order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 346
            page = br.open(url)
347
            headers = str(page.info()).split('\n')
348
            page = ungzipResponse(page)
349
            jsonResponse = None
350
            for header in headers:
351
                header = header.split(':')
352
                if header[0] == 'Content-Type' and 'json' in header[1]:
353
                    jsonResponse = json.loads(page)
354
            if jsonResponse is not None:
355
                page = jsonResponse['text']
356
 
15947 manish.sha 357
            merchantOrder = self._parseOrders(orderId, merchantOrderId, subTagId, userId, page, orderSuccessUrl, orderObj)
15509 manish.sha 358
 
15948 manish.sha 359
            merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 360
 
361
            if self._saveToOrder(todict(merchantOrder)):
362
                resp['result'] = 'ORDER_CREATED'
363
            else:
364
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
365
 
366
            return resp
367
        except:
368
            print "Error occurred"
369
            traceback.print_exc()
370
            resp['result'] = 'ORDER_NOT_CREATED'
371
 
15791 manish.sha 372
    def parseSingleSubOrder(self, soup, emailId, subOrderId):
373
        orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
374
        subOrderStatus = orderStatusList[0].contents[0].strip()
15509 manish.sha 375
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15948 manish.sha 376
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")    
15509 manish.sha 377
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 378
        firstRow = orderTable.pop(0)
15949 manish.sha 379
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 380
        subOrders =[]
381
        count =1   
15509 manish.sha 382
        for orderTr in orderTable:
383
            cols = orderTr.find_all('td')
384
            product_details = cols[0].find_all('a')
385
            #print product_details
386
            productUrl = product_details[0].get('href')
387
            productName = product_details[0].contents[0].strip()
388
            quantity = int(cols[1].text.strip())
15980 manish.sha 389
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 390
            discount = 0
391
            subtotal = 0
392
            if totalColumns == 5:
15949 manish.sha 393
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 394
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 395
                else:
396
                    discount = 0
15980 manish.sha 397
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 398
            else:
15980 manish.sha 399
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 400
            br = getBrowserObject()
401
            productPage = br.open(BASE_MURL+productUrl)
402
            productPageHeaders = str(productPage.info()).split('\n')
403
            productPage = ungzipResponse(productPage)
404
            jsonProductResponse = None
405
            for header in productPageHeaders:
406
                header = header.split(':')
407
                if header[0] == 'Content-Type' and 'json' in header[1]:
408
                    jsonProductResponse = json.loads(productPage)
409
            productPageSoup= None
410
            if jsonProductResponse is not None:
411
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
412
            else:
413
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 414
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 415
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
416
            productImgUrl = ''
417
            if allproductImageTags is not None and len(allproductImageTags)>0:
418
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
419
 
420
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
15791 manish.sha 421
            subOrder.merchantSubOrderId = str(subOrderId)+'-'+str(count)
15509 manish.sha 422
            subOrder.detailedStatus = subOrderStatus
423
            subOrder.imgUrl = productImgUrl
424
            subOrder.offerDiscount = discount*quantity
425
            subOrder.unitPrice = sellingPrice
426
            subOrder.productCode = productCode
427
            subOrder.amountPaid = subtotal
428
            subOrder.quantity = quantity
15791 manish.sha 429
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB +  'order_id=' +subOrderId+'&email_id='+ emailId
15509 manish.sha 430
            subOrders.append(subOrder)
15791 manish.sha 431
            count = count +1
15509 manish.sha 432
 
433
        subOrders = self.updateCashbackInSubOrders(subOrders)
15791 manish.sha 434
        return subOrders
15509 manish.sha 435
 
15791 manish.sha 436
    def parseMultiSubOrders(self, soup, emailId):
15509 manish.sha 437
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 438
        '''
439
        firstRow = orderTable.pop(0)
440
        totalColumns = len(firstRow.find_all('td'))
441
 
15509 manish.sha 442
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15791 manish.sha 443
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
444
        '''    
15509 manish.sha 445
        subOrders = []
15791 manish.sha 446
        existingOrders = []
15509 manish.sha 447
        for orderTr in orderTable:
448
            cols = orderTr.find_all('td')
449
            product_details = cols[0].find_all('a')
450
            #print product_details
451
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 452
            if subOrderId in existingOrders:
453
                continue
454
            else:
455
                existingOrders.append(subOrderId)
456
            '''
15509 manish.sha 457
            productUrl = product_details[0].get('href')
458
            productName = product_details[0].contents[0].strip()
15791 manish.sha 459
            '''
460
            subOrderTrackingParsingUrl = product_details[1].get('href')
461
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
462
            '''
15509 manish.sha 463
            quantity = int(cols[1].text.strip())
464
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 465
            discount = 0
466
            subtotal = 0
467
            if totalColumns == 5:
468
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
469
                    discount = long(cols[3].text.strip().replace("Rs.",""))
470
                else:
471
                    discount = 0
472
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
473
            else:
474
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
475
 
15509 manish.sha 476
            br = getBrowserObject()
477
            productPage = br.open(BASE_MURL+productUrl)
478
            productPageHeaders = str(productPage.info()).split('\n')
479
            productPage = ungzipResponse(productPage)
480
            jsonProductResponse = None
481
            for header in productPageHeaders:
482
                header = header.split(':')
483
                if header[0] == 'Content-Type' and 'json' in header[1]:
484
                    jsonProductResponse = json.loads(productPage)
485
            productPageSoup= None
486
            if jsonProductResponse is not None:
487
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
488
            else:
489
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 490
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 491
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
492
            productImgUrl = ''
493
            if allproductImageTags is not None and len(allproductImageTags)>0:
494
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
495
            productDetailsSubMap['productCode']=productCode
496
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 497
            '''
15509 manish.sha 498
            br1 = getBrowserObject()
15791 manish.sha 499
            orderTrackingPage = br1.open(BASE_URL+'&'+subOrderTrackingParsingUrl)
15509 manish.sha 500
            headers = str(orderTrackingPage.info()).split('\n')
501
            orderTrackingPage= ungzipResponse(orderTrackingPage)
502
            jsonResponse = None
503
            for header in headers:
504
                header = header.split(':')
505
                if header[0] == 'Content-Type' and 'json' in header[1]:
506
                    jsonResponse = json.loads(orderTrackingPage)
507
 
508
            orderTrackingPageSoup = None
509
            if jsonResponse is not None:
510
                orderTrackingPageSoup = BeautifulSoup(str(jsonResponse['text']))
511
            else:
512
                orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 513
            subOrdersDetails = self.parseSingleSubOrder(orderTrackingPageSoup, emailId, subOrderId)
514
            subOrders = list(set(subOrders + subOrdersDetails))
15509 manish.sha 515
 
15791 manish.sha 516
        return subOrders
15509 manish.sha 517
 
518
    def scrapeStoreOrders(self,):
519
        #collectionMap = {'palcedOn':1}
520
        searchMap = {}
521
        collectionMap = {"orderTrackingUrl":1}
522
        orders = self._getActiveOrders(searchMap,collectionMap)
523
        for order in orders:
524
            print "Order", self.store_name, order['orderId'], order['orderTrackingUrl']
15791 manish.sha 525
            url = ORDER_TRACK_URL + order['orderTrackingUrl'].split('trackOrder?')[1]
15509 manish.sha 526
            page = fetchResponseUsingProxy(url)
527
            soup = BeautifulSoup(page)
528
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
529
            closed = True
530
            orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
531
            if orderStatusList is not None and len(orderStatusList)>0:
532
                subOrderId = soup.findAll(attrs={'class':'price ord_no'})[0].text.strip()
533
                orderStatus = orderStatusList[0].contents[0].strip()
15791 manish.sha 534
                orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
535
                orderTable.pop(0)
536
                count = 1
537
                while count <= len(orderTable):
538
                    subOrder =  self._isSubOrderActive(order, str(subOrderId)+'-'+str(count))
539
                    count = count +1
540
                    if subOrder is None:
541
                        try:
542
                            subOrders = self.parseSingleSubOrder(soup, order['orderTrackingUrl'].split('email_id=')[1], subOrderId)
543
                            for subOrder in subOrders:
544
                                if subOrder is None:
545
                                    continue
546
                                self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
547
                                print "Added new suborders to Order id - ", order['orderId']
548
                                closed = False
549
                        except:
550
                            pass
551
                        continue
552
                    elif subOrder['closed']:
553
                        continue
15509 manish.sha 554
                    else:
15791 manish.sha 555
                        findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
556
                        updateMap = {}
557
                        updateMap["subOrders.$.detailedStatus"] = orderStatus
558
                        status = self._getStatusFromDetailedStatus(orderStatus) 
559
                        closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
560
                        if status is not None:
561
                            updateMap["subOrders.$.status"] = status
562
                        if closedStatus:
563
                            #if status is closed then change the paybackStatus accordingly
564
                            updateMap["subOrders.$.closed"] = True
565
                            if status == Store.ORDER_DELIVERED:
566
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
567
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
568
                            elif status == Store.ORDER_CANCELLED:
569
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
570
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
571
                        else:
572
                            closed = False
573
                        bulk.find(findMap).update({'$set' : updateMap})
15509 manish.sha 574
 
575
            else:
15791 manish.sha 576
                subOrdersList = self.parseMultiSubOrders(soup, order['orderTrackingUrl'].split('email_id=')[1])
15509 manish.sha 577
                for subOrderObj in subOrdersList:
578
                    subOrder =  self._isSubOrderActive(order, subOrderObj.merchantSubOrderId)
579
                    if subOrder is None:
580
                        self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrderObj])}}})
581
                        print "Added new suborders to Order id - ", order['orderId']
582
                        closed = False
583
                        continue
584
                    elif subOrder['closed']:
585
                        continue
586
                    else:
587
                        findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
588
                        updateMap = {}
589
                        updateMap["subOrders.$.detailedStatus"] = subOrderObj.detailedStatus
590
                        status = self._getStatusFromDetailedStatus(orderStatus) 
591
                        closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
592
                        if status is not None:
593
                            updateMap["subOrders.$.status"] = status
594
                        if closedStatus:
595
                            #if status is closed then change the paybackStatus accordingly
596
                            updateMap["subOrders.$.closed"] = True
597
                            if status == Store.ORDER_DELIVERED:
598
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
599
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
600
                            elif status == Store.ORDER_CANCELLED:
601
                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
602
                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
603
                        else:
604
                            closed = False
15510 manish.sha 605
                        bulk.find(findMap).update({'$set' : updateMap})
15509 manish.sha 606
            bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
607
            result = bulk.execute()
608
            tprint(result)      
15791 manish.sha 609
 
610
    '''
611
    def getTrackingUrls(self, userId):
612
        missingOrderUrls = ['https://sm.shopclues.com/myaccount','https://sm.shopclues.com/myorders']
613
        return missingOrderUrls
15509 manish.sha 614
 
15791 manish.sha 615
    def parseMyProfileForEmailId(self, userId, url, rawhtml):
616
        profileSoup = BeautifulSoup(rawhtml)
617
        if profileSoup.find('input', {'name':'user_email'}) is not None:
618
            emailId = profileSoup.find('input', {'name':'user_email'})['value']
619
            if emailId is not None and emailId.strip() !='':
620
                mc = MemCache()
621
                mc.set(str(userId), emailId, 600)
622
                return 'EMAIL_SET_SUCCESS'
623
            else:
624
                return 'EMAIL_NOT_FOUND'
625
        else:
626
            return 'EMAIL_NOT_FOUND'
15509 manish.sha 627
 
15791 manish.sha 628
    def parseMyOrdersForEmailId(self, userId, url, rawhtml):
629
        myOrdersPageSoup = BeautifulSoup(rawhtml)
630
        if myOrdersPageSoup.find('a', {'class':'detail'}) is not None:
631
            emailId = myOrdersPageSoup.find('a', {'class':'detail'})['href'].split('&')[1].split('=')[1]
632
            mc = MemCache()
633
            mc.set(str(userId), emailId, 600)
634
            return 'EMAIL_SET_SUCCESS'
635
        else:
636
            return 'EMAIL_NOT_FOUND'
637
    '''        
638
 
639
 
15509 manish.sha 640
def todict(obj, classkey=None):
641
    if isinstance(obj, dict):
642
        data = {}
643
        for (k, v) in obj.items():
644
            data[k] = todict(v, classkey)
645
        return data
646
    elif hasattr(obj, "_ast"):
647
        return todict(obj._ast())
648
    elif hasattr(obj, "__iter__"):
649
        return [todict(v, classkey) for v in obj]
650
    elif hasattr(obj, "__dict__"):
651
        data = dict([(key, todict(value, classkey)) 
652
            for key, value in obj.__dict__.iteritems() 
653
            if not callable(value) and not key.startswith('_')])
654
        if classkey is not None and hasattr(obj, "__class__"):
655
            data[classkey] = obj.__class__.__name__
656
        return data
657
    else:
15791 manish.sha 658
        return obj    
659
 
15509 manish.sha 660