Subversion Repositories SmartDukaan

Rev

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