Subversion Repositories SmartDukaan

Rev

Rev 16274 | Rev 16281 | 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 = {
16272 manish.sha 46
                      MStore.ORDER_PLACED : ['payment successful', 'new order - cod confirmation pending', 'processing', 'quality check','on schedule', 'processing - pickup initiated', 'processing - ready to dispatch','processing - procurement delay from merchant','processing - slight procurment delay from merchant','cod order confirmed by customer'],
15509 manish.sha 47
                      MStore.ORDER_DELIVERED : ['delivered', 'complete'],
16254 manish.sha 48
                      MStore.ORDER_SHIPPED : ['in transit', 'dispatched','shipped','order handed to courier','order handed over to courier'],
16249 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','canceled - address not shippable']
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):
16202 manish.sha 63
        orderRef = offer['MerchantRef']
64
        if len(orderRef)>15:
65
            orderRef = orderRef[0:len(orderRef)-10]
16203 manish.sha 66
        offer1 = ShopCluesAffiliateInfo(offer['UID'], offer['TransactionTime'], offer['TransactionId'], orderRef,  orderRef, offer['Merchant'], offer['PID'], offer['Product'], float(str(offer['SR'])), float(str(offer['TransactionValue'])), offer['UKey'], offer['ClickTime'], offer['Status'])
15791 manish.sha 67
        return offer1
68
 
69
    def _saveToAffiliate(self, offers):
70
        collection = self.db.shopcluesOrderAffiliateInfo
71
        mcollection = self.db.merchantOrder
72
        for offerObj in offers:
73
            offer = self.convertToObj(offerObj)
74
            collection.update({"transactionId":offer.transactionId, "subTagId":offer.subTagId, "payOut":offer.payOut},{"$set":todict(offer)}, upsert=True)
75
            mcollection.update({"subTagId":offer.subTagId, "storeId":self.store_id, "subOrders.missingAff":True}, {"$set":{"subOrders.$.missingAff":False}})
76
 
15940 manish.sha 77
    def scrapeAffiliate(self, startDate=datetime.today() - timedelta(days=10), endDate=datetime.today()):
15791 manish.sha 78
        uri = AFFLIATE_TRASACTIONS_URL%(startDate.year,startDate.month,startDate.day,endDate.year,endDate.month,endDate.day)
79
        root = ET.parse(urllib2.urlopen(uri)).getroot()
80
        if len(root)> 0 and len(root[0])> 0:
81
            offers = []
82
            for child in root[0][0]:
83
                offers.append(child.attrib)
84
            self._saveToAffiliate(offers)
85
 
15509 manish.sha 86
    def _setLastSaleDate(self, saleDate):
87
        self.db.lastSaleDtate.update({'storeId':self.store_id}, {'$set':{'saleDate':saleDate}})
88
 
89
    def getName(self):
90
        return "shopclues"    
91
 
92
    def _getLastSaleDate(self,):
93
        lastDaySaleObj = self.db.lastDaySale.find_one({"storeId":self.store_id})
94
        if lastDaySaleObj is None:
95
            return datetime.min
96
 
97
    def _getStatusFromDetailedStatus(self, detailedStatus):
98
        for key, value in Store.OrderStatusMap.iteritems():
99
            if detailedStatus.lower() in value:
100
                return key
101
        print "Detailed Status need to be mapped", detailedStatus, self.store_id
102
        return None
103
 
15791 manish.sha 104
    def _getSingleSubOrderMap(self, orderId, soup, orderObj):
105
        orderStatus = self.OrderStatusConfirmationMap.get(orderObj['0']['status'])
106
        statusTime= soup.findAll(attrs={'class' : 'sts no_mobile'})[1].contents[2].strip()
15509 manish.sha 107
        productDetailsMap = {}
16230 manish.sha 108
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
109
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
15791 manish.sha 110
        firstRow = orderTable.pop(0)
15949 manish.sha 111
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 112
        jsonSubOrdersMap = {}
113
        count = 1
114
 
115
        for val in orderObj['0']['items'].values():
116
            newCount = 0
16110 manish.sha 117
            counts = []
15791 manish.sha 118
            for key in jsonSubOrdersMap.keys():
119
                splitKey = key.split('-')
16112 manish.sha 120
                if orderObj['0']['is_parent_order'] == 'N':
121
                    if str(val['order_id']) == splitKey[0]:
122
                        counts.append(int(splitKey[1]))
123
                else:
124
                    if str(val['child']) == splitKey[0]:
125
                        counts.append(int(splitKey[1]))
16110 manish.sha 126
 
127
            if len(counts) >0:
128
                newCount = max(counts)
16108 manish.sha 129
            count = newCount +1
16112 manish.sha 130
            if orderObj['0']['is_parent_order'] == 'N':
131
                jsonSubOrdersMap[str(val['order_id'])+'-'+str(count)] = val
132
            else:
133
                jsonSubOrdersMap[str(val['child'])+'-'+str(count)] = val
15791 manish.sha 134
 
16110 manish.sha 135
 
16275 manish.sha 136
 
15941 manish.sha 137
        print jsonSubOrdersMap.items()
138
 
15791 manish.sha 139
        count = 1
15509 manish.sha 140
        for orderTr in orderTable:
15791 manish.sha 141
            productDetailsSubMap = None
142
            productDetailsSubMap = {}
15509 manish.sha 143
            cols = orderTr.find_all('td')
144
            product_details = cols[0].find_all('a')
145
            #print product_details
146
            productUrl = product_details[0].get('href')
147
            productName = product_details[0].contents[0].strip()
148
            quantity = int(cols[1].text.strip())
15980 manish.sha 149
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 150
            discount = 0
151
            subtotal = 0
152
            if totalColumns == 5:
15949 manish.sha 153
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 154
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 155
                else:
156
                    discount = 0
15980 manish.sha 157
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 158
            else:
15980 manish.sha 159
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 160
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
161
            productDetailsSubMap['productName']=productName
15791 manish.sha 162
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+'order_id=' +str(orderId)+'&email_id='+ orderObj['0']['email']
15509 manish.sha 163
            productDetailsSubMap['sellingPrice']=sellingPrice
164
            productDetailsSubMap['quantity']=quantity
165
            productDetailsSubMap['discount']=discount
166
            productDetailsSubMap['subtotal']=subtotal
15942 manish.sha 167
            key = str(orderId)+'-'+str(count)
168
            print 'SubOrder Map Key--',key
15791 manish.sha 169
            jsonSubOrderDetails = jsonSubOrdersMap.get(str(orderId)+'-'+str(count))
170
            productCode = jsonSubOrderDetails['product_code']
171
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 172
            productDetailsSubMap['productCode']=productCode
173
            productDetailsSubMap['imgUrl']=productImgUrl
174
 
15791 manish.sha 175
            productDetailsSubMap['subOrderStatus']=orderStatus
176
            productDetailsSubMap['subOrderStatusTime']=statusTime
177
            productDetailsMap[str(orderId)+'-'+str(count)]=productDetailsSubMap
178
            count = count +1
15509 manish.sha 179
        return productDetailsMap
180
 
15791 manish.sha 181
    def _getMultiSubOrdersMap(self, orderId, soup, orderObj):
16230 manish.sha 182
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
183
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16105 manish.sha 184
        firstRow = orderTable.pop(0)
15791 manish.sha 185
        #totalColumns = len(firstRow.find_all('td'))
15509 manish.sha 186
        productDetailsMap = {}
15791 manish.sha 187
        '''
188
        jsonSubOrdersMap = {}
189
        for val in orderObj['0']['items'].values():
190
            jsonSubOrdersMap[val['order_id']] = val
191
        '''
192
        existingOrders = []
15509 manish.sha 193
        for orderTr in orderTable:
15791 manish.sha 194
            subOrderDetailsMap = {}
195
 
15509 manish.sha 196
            cols = orderTr.find_all('td')
197
            product_details = cols[0].find_all('a')
198
            #print product_details
199
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 200
            if subOrderId in existingOrders:
201
                continue
202
            else:
203
                existingOrders.append(subOrderId)
204
            #productUrl = product_details[0].get('href')
205
            #productName = product_details[0].contents[0].strip()
206
            subOrderTrackingParsingUrl = product_details[1].get('href')
207
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
208
            '''
15509 manish.sha 209
            quantity = int(cols[1].text.strip())
210
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 211
            discount = 0
212
            subtotal = 0
213
            if totalColumns == 5:
214
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
215
                    discount = long(cols[3].text.strip().replace("Rs.",""))
216
                else:
217
                    discount = 0                    
218
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
219
            else:
220
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
15509 manish.sha 221
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
222
            productDetailsSubMap['productName']=productName
15791 manish.sha 223
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+subOrderTrackingUrl
15509 manish.sha 224
            productDetailsSubMap['sellingPrice']=sellingPrice
225
            productDetailsSubMap['quantity']=quantity
226
            productDetailsSubMap['discount']=discount
227
            productDetailsSubMap['subtotal']=subtotal
15791 manish.sha 228
            jsonSubOrderDetails = jsonSubOrdersMap.get(subOrderId)
229
            productCode = jsonSubOrderDetails['product_code']
230
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 231
            productDetailsSubMap['productCode']=productCode
232
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 233
            '''
16151 manish.sha 234
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
235
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 236
            '''
15509 manish.sha 237
            subOrderStatusList = orderTrackingPageSoup.findAll(attrs={'class' : 'price ord_status'})
238
            subOrderStatus = subOrderStatusList[0].contents[0].strip()
239
            subOrderStatusTime= orderTrackingPageSoup.findAll(attrs={'class' : 'sts no_mobile'})[1].contents[2].strip()
240
            productDetailsSubMap['subOrderStatus'] = subOrderStatus
241
            productDetailsSubMap['subOrderStatusTime'] = subOrderStatusTime
242
            productDetailsSubMap['parentOrderId']=orderId
15791 manish.sha 243
            '''
244
 
245
            subOrderDetailsMap = self._getSingleSubOrderMap(subOrderId, orderTrackingPageSoup, orderObj)
15509 manish.sha 246
 
15791 manish.sha 247
            productDetailsMap = dict(productDetailsMap.items()+subOrderDetailsMap.items())
15509 manish.sha 248
 
249
        return productDetailsMap
250
 
251
    def updateCashbackInSubOrders(self, subOrders):
252
        for subOrder in subOrders:
253
            cashbackStatus = Store.CB_NA
254
            cashbackAmount = 0
255
            percentage = 0
256
            amount = subOrder.amountPaid
257
            if amount > 0:
258
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amount)
259
                if cashbackAmount > 0:
260
                    cashbackStatus = Store.CB_PENDING
261
            subOrder.cashBackStatus = cashbackStatus
262
            subOrder.cashBackAmount = cashbackAmount
263
            subOrder.cashBackPercentage = percentage
264
        return subOrders
265
 
15947 manish.sha 266
    def _parseOrders(self, orderId, mpOrderId, subTagId, userId, page, orderSuccessUrl, orderObj):
15509 manish.sha 267
        soup = BeautifulSoup(page)
268
        productDetailsMap = {}
269
        paymentFields = soup.findAll(attrs={'class' : 'box_paymentcalculations_row'})
270
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15948 manish.sha 271
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
15509 manish.sha 272
        ordersubtotal=0
273
        ordercluebucks=0
274
        ordershippingcost=0
275
        ordertotal=0
276
 
277
        for val in paymentFields:
278
            for value in val.contents:
279
                if value is not None:
280
                    if 'div' in str(value).strip():
281
                        if 'Subtotal' in value.text.strip():
15981 manish.sha 282
                            ordersubtotal = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 283
                            print 'Order SubTotal:- ',ordersubtotal
15509 manish.sha 284
                        if 'Shipping Cost' in value.text.strip():
15981 manish.sha 285
                            ordershippingcost = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 286
                            print 'Shipping Cost:- ',ordershippingcost
15509 manish.sha 287
                        if 'Clue' in value.text.strip():
15981 manish.sha 288
                            ordercluebucks = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 289
                            print 'Clue bucks:- ',ordercluebucks
15509 manish.sha 290
                        if 'Total' in value.text.strip():
15791 manish.sha 291
                            ordertotal = val.contents[3].text.strip().replace("Rs.","")
292
                            ordertotal = ordertotal.replace(',','')
16165 manish.sha 293
                            print 'Order Total:- ',ordertotal
15791 manish.sha 294
 
295
        if orderObj['0']['is_parent_order'] == 'N':
15947 manish.sha 296
            productDetailsMap = self._getSingleSubOrderMap(mpOrderId, soup, orderObj)
15509 manish.sha 297
        else:
15947 manish.sha 298
            productDetailsMap = self._getMultiSubOrdersMap(mpOrderId, soup, orderObj)
15509 manish.sha 299
 
15791 manish.sha 300
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
15509 manish.sha 301
        merchantOrder.placedOn = placedOn
15791 manish.sha 302
        merchantOrder.merchantOrderId = orderObj['0']['order_id']
15509 manish.sha 303
        merchantOrder.paidAmount = ordertotal
304
        totalOrdersAmount = 0
305
        totalDiscount = 0
306
        subOrders= []
307
        for key in productDetailsMap:
308
            subOrderDetail = productDetailsMap.get(key)
309
            totalOrdersAmount = totalOrdersAmount  + (subOrderDetail['sellingPrice'] * subOrderDetail['quantity'])
310
            totalDiscount = totalDiscount + (subOrderDetail['discount'] * subOrderDetail['quantity'])
311
            subOrder = SubOrder(subOrderDetail['productName'], subOrderDetail['productUrl'], placedOn, subOrderDetail['subtotal'])
312
            subOrder.merchantSubOrderId = key
313
            subOrder.detailedStatus = subOrderDetail['subOrderStatus']
314
            subOrder.imgUrl = subOrderDetail['imgUrl']
315
            subOrder.offerDiscount = subOrderDetail['discount'] * subOrderDetail['quantity']
316
            subOrder.unitPrice = subOrderDetail['sellingPrice']
317
            subOrder.productCode = subOrderDetail['productCode']
318
            subOrder.amountPaid = subOrderDetail['subtotal']
319
            subOrder.quantity = subOrderDetail['quantity']
15791 manish.sha 320
            subOrder.tracingkUrl = subOrderDetail['subOrderTrackingUrl']
16097 manish.sha 321
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
322
            subOrder.dealRank = dealRank.get('rank')
323
            subOrder.rankDesc = dealRank.get('description')
15509 manish.sha 324
            subOrders.append(subOrder)
325
        merchantOrder.totalAmount = totalOrdersAmount
326
        merchantOrder.discountApplied = totalDiscount
327
        merchantOrder.deliveryCharges = ordershippingcost
328
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
329
 
330
        return merchantOrder
331
 
332
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
333
        resp = {}
334
        try:
15791 manish.sha 335
            rawHtmlSoup = BeautifulSoup(rawHtml)
336
            emailId = None
337
            orderObj = None
338
            merchantOrderId = None
339
            for script in rawHtmlSoup.find_all('script'):
340
                if 'orderConfirmation' in script.text:
16274 manish.sha 341
                    print script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0]
15791 manish.sha 342
                    orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
343
                    if merchantOrderId is None:
344
                        merchantOrderId = orderObj['0']['order_id']
345
                        emailId = orderObj['0']['email']
16197 manish.sha 346
            if orderObj is None or merchantOrderId is None:
16226 manish.sha 347
                orderIdDiv = rawHtmlSoup.body.find("div", {'class':'conf_succes'})
348
                if orderIdDiv is None:
349
                    orderIdArt = rawHtmlSoup.body.find("article", {'class':'white'})
350
                    if orderIdArt is None:
351
                        resp['result'] = 'ORDER_NOT_CREATED_UNKNOWN'
352
                        return resp
353
                    else:
354
                        orderIdDiv= orderIdArt.find('p', recursive=False)
355
                        orderIdVal = str(orderIdDiv.text.split(' : ')[1])
356
                        print "Opening Shopclues Login Page"
357
                        login_url = "https://sm.shopclues.com/login"
358
                        br1 = login(login_url)
359
                        orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
360
                        orderDetailPage = ungzipResponse(orderDetailPage)
361
                        rawHtmlSoup = BeautifulSoup(orderDetailPage)
362
                        for script in rawHtmlSoup.find_all('script'):
363
                            if 'orderConfirmation' in script.text:
364
                                orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
365
                                if merchantOrderId is None:
366
                                    merchantOrderId = orderObj['0']['order_id']
367
                                    emailId = orderObj['0']['email']
368
                        logoutpage = br1.open("https://sm.shopclues.com/logout")
369
                        print br1.geturl()
370
                else:
371
                    orderIdDiv= orderIdDiv.find('div', recursive=False)
372
                    orderIdVal = str(orderIdDiv.span.text)
373
                    print "Opening Shopclues Login Page"
374
                    login_url = "https://sm.shopclues.com/login"
375
                    br1 = login(login_url)
376
                    orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
377
                    orderDetailPage = ungzipResponse(orderDetailPage)
378
                    rawHtmlSoup = BeautifulSoup(orderDetailPage)
379
                    for script in rawHtmlSoup.find_all('script'):
380
                        if 'orderConfirmation' in script.text:
381
                            orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
382
                            if merchantOrderId is None:
383
                                merchantOrderId = orderObj['0']['order_id']
384
                                emailId = orderObj['0']['email']
385
                    logoutpage = br1.open("https://sm.shopclues.com/logout")
386
                    print br1.geturl()
387
 
16275 manish.sha 388
            if type(orderObj['0']['items']) is list:
389
                print "Opening Shopclues Login Page"
390
                login_url = "https://sm.shopclues.com/login"
391
                br1 = login(login_url)
392
                orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+str(merchantOrderId)+"&status=P")
393
                orderDetailPage = ungzipResponse(orderDetailPage)
394
                rawHtmlSoup = BeautifulSoup(orderDetailPage)
395
                for script in rawHtmlSoup.find_all('script'):
396
                    if 'orderConfirmation' in script.text:
397
                        orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
398
                        if merchantOrderId is None:
399
                            merchantOrderId = orderObj['0']['order_id']
400
                            emailId = orderObj['0']['email']
401
                logoutpage = br1.open("https://sm.shopclues.com/logout")
402
                print br1.geturl()
403
 
15509 manish.sha 404
            br = getBrowserObject()
15791 manish.sha 405
            url = ORDER_TRACK_URL +'&order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 406
            page = br.open(url)
407
            headers = str(page.info()).split('\n')
408
            page = ungzipResponse(page)
409
            jsonResponse = None
410
            for header in headers:
411
                header = header.split(':')
412
                if header[0] == 'Content-Type' and 'json' in header[1]:
413
                    jsonResponse = json.loads(page)
414
            if jsonResponse is not None:
415
                page = jsonResponse['text']
416
 
15947 manish.sha 417
            merchantOrder = self._parseOrders(orderId, merchantOrderId, subTagId, userId, page, orderSuccessUrl, orderObj)
15509 manish.sha 418
 
15948 manish.sha 419
            merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 420
 
421
            if self._saveToOrder(todict(merchantOrder)):
422
                resp['result'] = 'ORDER_CREATED'
423
            else:
424
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
425
 
426
            return resp
427
        except:
428
            print "Error occurred"
429
            traceback.print_exc()
430
            resp['result'] = 'ORDER_NOT_CREATED'
16120 manish.sha 431
            return resp
15509 manish.sha 432
 
15791 manish.sha 433
    def parseSingleSubOrder(self, soup, emailId, subOrderId):
434
        orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
435
        subOrderStatus = orderStatusList[0].contents[0].strip()
15509 manish.sha 436
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
16230 manish.sha 437
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
438
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
439
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)    
15791 manish.sha 440
        firstRow = orderTable.pop(0)
15949 manish.sha 441
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 442
        subOrders =[]
443
        count =1   
15509 manish.sha 444
        for orderTr in orderTable:
445
            cols = orderTr.find_all('td')
446
            product_details = cols[0].find_all('a')
447
            #print product_details
448
            productUrl = product_details[0].get('href')
449
            productName = product_details[0].contents[0].strip()
450
            quantity = int(cols[1].text.strip())
15980 manish.sha 451
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 452
            discount = 0
453
            subtotal = 0
454
            if totalColumns == 5:
15949 manish.sha 455
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 456
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 457
                else:
458
                    discount = 0
15980 manish.sha 459
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 460
            else:
15980 manish.sha 461
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
16151 manish.sha 462
            productPage = fetchResponseUsingProxy(BASE_MURL+productUrl)
463
            productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 464
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 465
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
466
            productImgUrl = ''
467
            if allproductImageTags is not None and len(allproductImageTags)>0:
468
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
469
 
470
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
15791 manish.sha 471
            subOrder.merchantSubOrderId = str(subOrderId)+'-'+str(count)
15509 manish.sha 472
            subOrder.detailedStatus = subOrderStatus
473
            subOrder.imgUrl = productImgUrl
474
            subOrder.offerDiscount = discount*quantity
475
            subOrder.unitPrice = sellingPrice
476
            subOrder.productCode = productCode
477
            subOrder.amountPaid = subtotal
478
            subOrder.quantity = quantity
15791 manish.sha 479
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB +  'order_id=' +subOrderId+'&email_id='+ emailId
15509 manish.sha 480
            subOrders.append(subOrder)
15791 manish.sha 481
            count = count +1
15509 manish.sha 482
 
483
        subOrders = self.updateCashbackInSubOrders(subOrders)
15791 manish.sha 484
        return subOrders
15509 manish.sha 485
 
15791 manish.sha 486
    def parseMultiSubOrders(self, soup, emailId):
16230 manish.sha 487
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
488
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16145 manish.sha 489
        firstRow = orderTable.pop(0)
15791 manish.sha 490
        '''
491
        totalColumns = len(firstRow.find_all('td'))
492
 
15509 manish.sha 493
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15791 manish.sha 494
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
495
        '''    
15509 manish.sha 496
        subOrders = []
15791 manish.sha 497
        existingOrders = []
15509 manish.sha 498
        for orderTr in orderTable:
499
            cols = orderTr.find_all('td')
500
            product_details = cols[0].find_all('a')
501
            #print product_details
502
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 503
            if subOrderId in existingOrders:
504
                continue
505
            else:
506
                existingOrders.append(subOrderId)
507
            '''
15509 manish.sha 508
            productUrl = product_details[0].get('href')
509
            productName = product_details[0].contents[0].strip()
15791 manish.sha 510
            '''
511
            subOrderTrackingParsingUrl = product_details[1].get('href')
512
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
513
            '''
15509 manish.sha 514
            quantity = int(cols[1].text.strip())
515
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 516
            discount = 0
517
            subtotal = 0
518
            if totalColumns == 5:
519
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
520
                    discount = long(cols[3].text.strip().replace("Rs.",""))
521
                else:
522
                    discount = 0
523
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
524
            else:
525
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
526
 
15509 manish.sha 527
            br = getBrowserObject()
528
            productPage = br.open(BASE_MURL+productUrl)
529
            productPageHeaders = str(productPage.info()).split('\n')
530
            productPage = ungzipResponse(productPage)
531
            jsonProductResponse = None
532
            for header in productPageHeaders:
533
                header = header.split(':')
534
                if header[0] == 'Content-Type' and 'json' in header[1]:
535
                    jsonProductResponse = json.loads(productPage)
536
            productPageSoup= None
537
            if jsonProductResponse is not None:
538
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
539
            else:
540
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 541
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 542
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
543
            productImgUrl = ''
544
            if allproductImageTags is not None and len(allproductImageTags)>0:
545
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
546
            productDetailsSubMap['productCode']=productCode
547
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 548
            '''
16151 manish.sha 549
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
550
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 551
            subOrdersDetails = self.parseSingleSubOrder(orderTrackingPageSoup, emailId, subOrderId)
552
            subOrders = list(set(subOrders + subOrdersDetails))
15509 manish.sha 553
 
15791 manish.sha 554
        return subOrders
15509 manish.sha 555
 
556
    def scrapeStoreOrders(self,):
557
        #collectionMap = {'palcedOn':1}
558
        searchMap = {}
559
        collectionMap = {"orderTrackingUrl":1}
560
        orders = self._getActiveOrders(searchMap,collectionMap)
561
        for order in orders:
562
            print "Order", self.store_name, order['orderId'], order['orderTrackingUrl']
16138 manish.sha 563
            url = ORDER_TRACK_URL +'&'+ order['orderTrackingUrl'].split('trackOrder?')[1]
16141 manish.sha 564
            print url
16249 manish.sha 565
            page = None
566
            retry = 1
567
            while retry <=3: 
568
                try: 
569
                    page = fetchResponseUsingProxy(url)
570
                    break
571
                except:
16250 manish.sha 572
                    traceback.print_exc()
16249 manish.sha 573
                    retry = retry + 1
574
 
15509 manish.sha 575
            soup = BeautifulSoup(page)
576
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
577
            closed = True
16144 manish.sha 578
            orderIdSpan = soup.body.find("span", {'class':'price ord_no'})
579
            if orderIdSpan is not None:
16143 manish.sha 580
                orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
581
                if orderStatusList is not None and len(orderStatusList)>0:
582
                    subOrderId = soup.findAll(attrs={'class':'price ord_no'})[0].text.strip()
583
                    orderStatus = orderStatusList[0].contents[0].strip()
16230 manish.sha 584
                    orderTables = soup.body.findAll("table", {'class':'table product-list'})
16229 manish.sha 585
                    orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16143 manish.sha 586
                    orderTable.pop(0)
587
                    count = 1
588
                    while count <= len(orderTable):
16160 manish.sha 589
                        subbulk = self.db.merchantOrder.initialize_ordered_bulk_op()
16152 manish.sha 590
                        print 'Sub Order Id', str(subOrderId)+'-'+str(count)
16143 manish.sha 591
                        subOrder =  self._isSubOrderActive(order, str(subOrderId)+'-'+str(count))
592
                        if subOrder is None:
593
                            try:
594
                                subOrders = self.parseSingleSubOrder(soup, order['orderTrackingUrl'].split('email_id=')[1], subOrderId)
595
                                for subOrder in subOrders:
596
                                    if subOrder is None:
597
                                        continue
598
                                    self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
599
                                    print "Added new suborders to Order id - ", order['orderId']
600
                                    closed = False
601
                            except:
16227 manish.sha 602
                                traceback.print_exc()
16143 manish.sha 603
                                pass
16227 manish.sha 604
                            count = count+1
16143 manish.sha 605
                            continue
606
                        elif subOrder['closed']:
16226 manish.sha 607
                            count = count+1
16143 manish.sha 608
                            continue
609
                        else:
16163 manish.sha 610
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": str(subOrderId)+'-'+str(count)}
16143 manish.sha 611
                            updateMap = {}
612
                            updateMap["subOrders.$.detailedStatus"] = orderStatus
613
                            status = self._getStatusFromDetailedStatus(orderStatus) 
614
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
615
                            if status is not None:
616
                                updateMap["subOrders.$.status"] = status
617
                            if closedStatus:
618
                                #if status is closed then change the paybackStatus accordingly
16155 manish.sha 619
                                print 'Order Closed'
16143 manish.sha 620
                                updateMap["subOrders.$.closed"] = True
621
                                if status == Store.ORDER_DELIVERED:
622
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
623
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
624
                                elif status == Store.ORDER_CANCELLED:
625
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
626
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
627
                            else:
15791 manish.sha 628
                                closed = False
16155 manish.sha 629
                                print 'Order not Closed'
16161 manish.sha 630
 
16158 manish.sha 631
                            subbulk.find(findMap).update({'$set' : updateMap})
632
                            subresult = subbulk.execute()
633
                            tprint(subresult)
16164 manish.sha 634
                        count = count +1
16156 manish.sha 635
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
636
                    result = bulk.execute()
637
                    tprint(result)
16143 manish.sha 638
 
639
                else:
640
                    subOrdersList = self.parseMultiSubOrders(soup, order['orderTrackingUrl'].split('email_id=')[1])
641
                    for subOrderObj in subOrdersList:
16159 manish.sha 642
                        subbulk1 = self.db.merchantOrder.initialize_ordered_bulk_op()
16143 manish.sha 643
                        subOrder =  self._isSubOrderActive(order, subOrderObj.merchantSubOrderId)
644
                        if subOrder is None:
645
                            self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrderObj])}}})
646
                            print "Added new suborders to Order id - ", order['orderId']
647
                            closed = False
648
                            continue
649
                        elif subOrder['closed']:
650
                            continue
15791 manish.sha 651
                        else:
16143 manish.sha 652
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
653
                            updateMap = {}
654
                            updateMap["subOrders.$.detailedStatus"] = subOrderObj.detailedStatus
655
                            status = self._getStatusFromDetailedStatus(orderStatus) 
656
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
657
                            if status is not None:
658
                                updateMap["subOrders.$.status"] = status
659
                            if closedStatus:
660
                                #if status is closed then change the paybackStatus accordingly
661
                                updateMap["subOrders.$.closed"] = True
662
                                if status == Store.ORDER_DELIVERED:
663
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
664
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
665
                                elif status == Store.ORDER_CANCELLED:
666
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
667
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
668
                            else:
669
                                closed = False
16159 manish.sha 670
                            subbulk1.find(findMap).update({'$set' : updateMap})
671
                            subresult1 = subbulk1.execute()
672
                            tprint(subresult1)
16156 manish.sha 673
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
674
                    result = bulk.execute()
675
                    tprint(result)
15509 manish.sha 676
            else:
16143 manish.sha 677
                print 'Soup Object not found for this Order', order['orderId'], order['orderTrackingUrl']
678
                continue      
15791 manish.sha 679
 
680
    '''
681
    def getTrackingUrls(self, userId):
682
        missingOrderUrls = ['https://sm.shopclues.com/myaccount','https://sm.shopclues.com/myorders']
683
        return missingOrderUrls
15509 manish.sha 684
 
15791 manish.sha 685
    def parseMyProfileForEmailId(self, userId, url, rawhtml):
686
        profileSoup = BeautifulSoup(rawhtml)
687
        if profileSoup.find('input', {'name':'user_email'}) is not None:
688
            emailId = profileSoup.find('input', {'name':'user_email'})['value']
689
            if emailId is not None and emailId.strip() !='':
690
                mc = MemCache()
691
                mc.set(str(userId), emailId, 600)
692
                return 'EMAIL_SET_SUCCESS'
693
            else:
694
                return 'EMAIL_NOT_FOUND'
695
        else:
696
            return 'EMAIL_NOT_FOUND'
15509 manish.sha 697
 
15791 manish.sha 698
    def parseMyOrdersForEmailId(self, userId, url, rawhtml):
699
        myOrdersPageSoup = BeautifulSoup(rawhtml)
700
        if myOrdersPageSoup.find('a', {'class':'detail'}) is not None:
701
            emailId = myOrdersPageSoup.find('a', {'class':'detail'})['href'].split('&')[1].split('=')[1]
702
            mc = MemCache()
703
            mc.set(str(userId), emailId, 600)
704
            return 'EMAIL_SET_SUCCESS'
705
        else:
706
            return 'EMAIL_NOT_FOUND'
707
    '''        
708
 
709
 
15509 manish.sha 710
def todict(obj, classkey=None):
711
    if isinstance(obj, dict):
712
        data = {}
713
        for (k, v) in obj.items():
714
            data[k] = todict(v, classkey)
715
        return data
716
    elif hasattr(obj, "_ast"):
717
        return todict(obj._ast())
718
    elif hasattr(obj, "__iter__"):
719
        return [todict(v, classkey) for v in obj]
720
    elif hasattr(obj, "__dict__"):
721
        data = dict([(key, todict(value, classkey)) 
722
            for key, value in obj.__dict__.iteritems() 
723
            if not callable(value) and not key.startswith('_')])
724
        if classkey is not None and hasattr(obj, "__class__"):
725
            data[classkey] = obj.__class__.__name__
726
        return data
727
    else:
16226 manish.sha 728
        return obj
729
 
730
def login(url):
731
    br = getBrowserObject()
16235 manish.sha 732
    br.set_proxies({"http": "us-il.proxymesh.com:31280"})
16226 manish.sha 733
    br.open(url)
734
    response = br.open(url)
735
    ungzipResponseBr(response, br)
736
    #html = response.read()
737
    #print html
738
    br.select_form(nr=0)
739
    br.form['user'] = "imanthetester@gmail.com"
740
    br.form['password'] = "$Dl8uk"
741
    response = br.submit()
742
    print "********************"
743
    print "Attempting to Login"
744
    print "********************"
745
    #ungzipResponse(response, br)
746
    return br
15791 manish.sha 747
 
16226 manish.sha 748
def ungzipResponseBr(r,b):
749
    headers = r.info()
750
    if headers['Content-Encoding']=='gzip':
751
        import gzip
752
        print "********************"
753
        print "Deflating gzip response"
754
        print "********************"
755
        gz = gzip.GzipFile(fileobj=r, mode='rb')
756
        html = gz.read()
757
        gz.close()
758
        headers["Content-type"] = "text/html; charset=utf-8"
759
        r.set_data( html )
760
        b.set_response(r)    
761
 
15509 manish.sha 762