Subversion Repositories SmartDukaan

Rev

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