Subversion Repositories SmartDukaan

Rev

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