Subversion Repositories SmartDukaan

Rev

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