Subversion Repositories SmartDukaan

Rev

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