Subversion Repositories SmartDukaan

Rev

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