Subversion Repositories SmartDukaan

Rev

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