Subversion Repositories SmartDukaan

Rev

Rev 16228 | Rev 16230 | 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 = {
16199 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',''],
15509 manish.sha 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):
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 = {}
108
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 109
        firstRow = orderTable.pop(0)
15949 manish.sha 110
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 111
        jsonSubOrdersMap = {}
112
        count = 1
113
 
114
        for val in orderObj['0']['items'].values():
115
            newCount = 0
16110 manish.sha 116
            counts = []
15791 manish.sha 117
            for key in jsonSubOrdersMap.keys():
118
                splitKey = key.split('-')
16112 manish.sha 119
                if orderObj['0']['is_parent_order'] == 'N':
120
                    if str(val['order_id']) == splitKey[0]:
121
                        counts.append(int(splitKey[1]))
122
                else:
123
                    if str(val['child']) == splitKey[0]:
124
                        counts.append(int(splitKey[1]))
16110 manish.sha 125
 
126
            if len(counts) >0:
127
                newCount = max(counts)
16108 manish.sha 128
            count = newCount +1
16112 manish.sha 129
            if orderObj['0']['is_parent_order'] == 'N':
130
                jsonSubOrdersMap[str(val['order_id'])+'-'+str(count)] = val
131
            else:
132
                jsonSubOrdersMap[str(val['child'])+'-'+str(count)] = val
15791 manish.sha 133
 
16110 manish.sha 134
 
15941 manish.sha 135
        print jsonSubOrdersMap.items()
136
 
15791 manish.sha 137
        count = 1
15509 manish.sha 138
        for orderTr in orderTable:
15791 manish.sha 139
            productDetailsSubMap = None
140
            productDetailsSubMap = {}
15509 manish.sha 141
            cols = orderTr.find_all('td')
142
            product_details = cols[0].find_all('a')
143
            #print product_details
144
            productUrl = product_details[0].get('href')
145
            productName = product_details[0].contents[0].strip()
146
            quantity = int(cols[1].text.strip())
15980 manish.sha 147
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 148
            discount = 0
149
            subtotal = 0
150
            if totalColumns == 5:
15949 manish.sha 151
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 152
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 153
                else:
154
                    discount = 0
15980 manish.sha 155
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 156
            else:
15980 manish.sha 157
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 158
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
159
            productDetailsSubMap['productName']=productName
15791 manish.sha 160
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+'order_id=' +str(orderId)+'&email_id='+ orderObj['0']['email']
15509 manish.sha 161
            productDetailsSubMap['sellingPrice']=sellingPrice
162
            productDetailsSubMap['quantity']=quantity
163
            productDetailsSubMap['discount']=discount
164
            productDetailsSubMap['subtotal']=subtotal
15942 manish.sha 165
            key = str(orderId)+'-'+str(count)
166
            print 'SubOrder Map Key--',key
15791 manish.sha 167
            jsonSubOrderDetails = jsonSubOrdersMap.get(str(orderId)+'-'+str(count))
168
            productCode = jsonSubOrderDetails['product_code']
169
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 170
            productDetailsSubMap['productCode']=productCode
171
            productDetailsSubMap['imgUrl']=productImgUrl
172
 
15791 manish.sha 173
            productDetailsSubMap['subOrderStatus']=orderStatus
174
            productDetailsSubMap['subOrderStatusTime']=statusTime
175
            productDetailsMap[str(orderId)+'-'+str(count)]=productDetailsSubMap
176
            count = count +1
15509 manish.sha 177
        return productDetailsMap
178
 
15791 manish.sha 179
    def _getMultiSubOrdersMap(self, orderId, soup, orderObj):
15509 manish.sha 180
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
16105 manish.sha 181
        firstRow = orderTable.pop(0)
15791 manish.sha 182
        #totalColumns = len(firstRow.find_all('td'))
15509 manish.sha 183
        productDetailsMap = {}
15791 manish.sha 184
        '''
185
        jsonSubOrdersMap = {}
186
        for val in orderObj['0']['items'].values():
187
            jsonSubOrdersMap[val['order_id']] = val
188
        '''
189
        existingOrders = []
15509 manish.sha 190
        for orderTr in orderTable:
15791 manish.sha 191
            subOrderDetailsMap = {}
192
 
15509 manish.sha 193
            cols = orderTr.find_all('td')
194
            product_details = cols[0].find_all('a')
195
            #print product_details
196
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 197
            if subOrderId in existingOrders:
198
                continue
199
            else:
200
                existingOrders.append(subOrderId)
201
            #productUrl = product_details[0].get('href')
202
            #productName = product_details[0].contents[0].strip()
203
            subOrderTrackingParsingUrl = product_details[1].get('href')
204
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
205
            '''
15509 manish.sha 206
            quantity = int(cols[1].text.strip())
207
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 208
            discount = 0
209
            subtotal = 0
210
            if totalColumns == 5:
211
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
212
                    discount = long(cols[3].text.strip().replace("Rs.",""))
213
                else:
214
                    discount = 0                    
215
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
216
            else:
217
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
15509 manish.sha 218
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
219
            productDetailsSubMap['productName']=productName
15791 manish.sha 220
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+subOrderTrackingUrl
15509 manish.sha 221
            productDetailsSubMap['sellingPrice']=sellingPrice
222
            productDetailsSubMap['quantity']=quantity
223
            productDetailsSubMap['discount']=discount
224
            productDetailsSubMap['subtotal']=subtotal
15791 manish.sha 225
            jsonSubOrderDetails = jsonSubOrdersMap.get(subOrderId)
226
            productCode = jsonSubOrderDetails['product_code']
227
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 228
            productDetailsSubMap['productCode']=productCode
229
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 230
            '''
16151 manish.sha 231
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
232
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 233
            '''
15509 manish.sha 234
            subOrderStatusList = orderTrackingPageSoup.findAll(attrs={'class' : 'price ord_status'})
235
            subOrderStatus = subOrderStatusList[0].contents[0].strip()
236
            subOrderStatusTime= orderTrackingPageSoup.findAll(attrs={'class' : 'sts no_mobile'})[1].contents[2].strip()
237
            productDetailsSubMap['subOrderStatus'] = subOrderStatus
238
            productDetailsSubMap['subOrderStatusTime'] = subOrderStatusTime
239
            productDetailsSubMap['parentOrderId']=orderId
15791 manish.sha 240
            '''
241
 
242
            subOrderDetailsMap = self._getSingleSubOrderMap(subOrderId, orderTrackingPageSoup, orderObj)
15509 manish.sha 243
 
15791 manish.sha 244
            productDetailsMap = dict(productDetailsMap.items()+subOrderDetailsMap.items())
15509 manish.sha 245
 
246
        return productDetailsMap
247
 
248
    def updateCashbackInSubOrders(self, subOrders):
249
        for subOrder in subOrders:
250
            cashbackStatus = Store.CB_NA
251
            cashbackAmount = 0
252
            percentage = 0
253
            amount = subOrder.amountPaid
254
            if amount > 0:
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(',',''))
16165 manish.sha 280
                            print 'Order SubTotal:- ',ordersubtotal
15509 manish.sha 281
                        if 'Shipping Cost' in value.text.strip():
15981 manish.sha 282
                            ordershippingcost = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 283
                            print 'Shipping Cost:- ',ordershippingcost
15509 manish.sha 284
                        if 'Clue' in value.text.strip():
15981 manish.sha 285
                            ordercluebucks = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 286
                            print 'Clue bucks:- ',ordercluebucks
15509 manish.sha 287
                        if 'Total' in value.text.strip():
15791 manish.sha 288
                            ordertotal = val.contents[3].text.strip().replace("Rs.","")
289
                            ordertotal = ordertotal.replace(',','')
16165 manish.sha 290
                            print 'Order Total:- ',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
        merchantOrder.totalAmount = totalOrdersAmount
323
        merchantOrder.discountApplied = totalDiscount
324
        merchantOrder.deliveryCharges = ordershippingcost
325
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
326
 
327
        return merchantOrder
328
 
329
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
330
        resp = {}
331
        try:
15791 manish.sha 332
            rawHtmlSoup = BeautifulSoup(rawHtml)
333
            emailId = None
334
            orderObj = None
335
            merchantOrderId = None
336
            for script in rawHtmlSoup.find_all('script'):
337
                if 'orderConfirmation' in script.text:
338
                    orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
339
                    if merchantOrderId is None:
340
                        merchantOrderId = orderObj['0']['order_id']
341
                        emailId = orderObj['0']['email']
16197 manish.sha 342
            if orderObj is None or merchantOrderId is None:
16226 manish.sha 343
                orderIdDiv = rawHtmlSoup.body.find("div", {'class':'conf_succes'})
344
                if orderIdDiv is None:
345
                    orderIdArt = rawHtmlSoup.body.find("article", {'class':'white'})
346
                    if orderIdArt is None:
347
                        resp['result'] = 'ORDER_NOT_CREATED_UNKNOWN'
348
                        return resp
349
                    else:
350
                        orderIdDiv= orderIdArt.find('p', recursive=False)
351
                        orderIdVal = str(orderIdDiv.text.split(' : ')[1])
352
                        print "Opening Shopclues Login Page"
353
                        login_url = "https://sm.shopclues.com/login"
354
                        br1 = login(login_url)
355
                        orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
356
                        orderDetailPage = ungzipResponse(orderDetailPage)
357
                        rawHtmlSoup = BeautifulSoup(orderDetailPage)
358
                        for script in rawHtmlSoup.find_all('script'):
359
                            if 'orderConfirmation' in script.text:
360
                                orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
361
                                if merchantOrderId is None:
362
                                    merchantOrderId = orderObj['0']['order_id']
363
                                    emailId = orderObj['0']['email']
364
                        logoutpage = br1.open("https://sm.shopclues.com/logout")
365
                        print br1.geturl()
366
                else:
367
                    orderIdDiv= orderIdDiv.find('div', recursive=False)
368
                    orderIdVal = str(orderIdDiv.span.text)
369
                    print "Opening Shopclues Login Page"
370
                    login_url = "https://sm.shopclues.com/login"
371
                    br1 = login(login_url)
372
                    orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
373
                    orderDetailPage = ungzipResponse(orderDetailPage)
374
                    rawHtmlSoup = BeautifulSoup(orderDetailPage)
375
                    for script in rawHtmlSoup.find_all('script'):
376
                        if 'orderConfirmation' in script.text:
377
                            orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
378
                            if merchantOrderId is None:
379
                                merchantOrderId = orderObj['0']['order_id']
380
                                emailId = orderObj['0']['email']
381
                    logoutpage = br1.open("https://sm.shopclues.com/logout")
382
                    print br1.geturl()
383
 
15509 manish.sha 384
            br = getBrowserObject()
15791 manish.sha 385
            url = ORDER_TRACK_URL +'&order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 386
            page = br.open(url)
387
            headers = str(page.info()).split('\n')
388
            page = ungzipResponse(page)
389
            jsonResponse = None
390
            for header in headers:
391
                header = header.split(':')
392
                if header[0] == 'Content-Type' and 'json' in header[1]:
393
                    jsonResponse = json.loads(page)
394
            if jsonResponse is not None:
395
                page = jsonResponse['text']
396
 
15947 manish.sha 397
            merchantOrder = self._parseOrders(orderId, merchantOrderId, subTagId, userId, page, orderSuccessUrl, orderObj)
15509 manish.sha 398
 
15948 manish.sha 399
            merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 400
 
401
            if self._saveToOrder(todict(merchantOrder)):
402
                resp['result'] = 'ORDER_CREATED'
403
            else:
404
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
405
 
406
            return resp
407
        except:
408
            print "Error occurred"
409
            traceback.print_exc()
410
            resp['result'] = 'ORDER_NOT_CREATED'
16120 manish.sha 411
            return resp
15509 manish.sha 412
 
15791 manish.sha 413
    def parseSingleSubOrder(self, soup, emailId, subOrderId):
414
        orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
415
        subOrderStatus = orderStatusList[0].contents[0].strip()
15509 manish.sha 416
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15948 manish.sha 417
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")    
15509 manish.sha 418
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
15791 manish.sha 419
        firstRow = orderTable.pop(0)
15949 manish.sha 420
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 421
        subOrders =[]
422
        count =1   
15509 manish.sha 423
        for orderTr in orderTable:
424
            cols = orderTr.find_all('td')
425
            product_details = cols[0].find_all('a')
426
            #print product_details
427
            productUrl = product_details[0].get('href')
428
            productName = product_details[0].contents[0].strip()
429
            quantity = int(cols[1].text.strip())
15980 manish.sha 430
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 431
            discount = 0
432
            subtotal = 0
433
            if totalColumns == 5:
15949 manish.sha 434
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 435
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 436
                else:
437
                    discount = 0
15980 manish.sha 438
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 439
            else:
15980 manish.sha 440
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
16151 manish.sha 441
            productPage = fetchResponseUsingProxy(BASE_MURL+productUrl)
442
            productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 443
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 444
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
445
            productImgUrl = ''
446
            if allproductImageTags is not None and len(allproductImageTags)>0:
447
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
448
 
449
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
15791 manish.sha 450
            subOrder.merchantSubOrderId = str(subOrderId)+'-'+str(count)
15509 manish.sha 451
            subOrder.detailedStatus = subOrderStatus
452
            subOrder.imgUrl = productImgUrl
453
            subOrder.offerDiscount = discount*quantity
454
            subOrder.unitPrice = sellingPrice
455
            subOrder.productCode = productCode
456
            subOrder.amountPaid = subtotal
457
            subOrder.quantity = quantity
15791 manish.sha 458
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB +  'order_id=' +subOrderId+'&email_id='+ emailId
15509 manish.sha 459
            subOrders.append(subOrder)
15791 manish.sha 460
            count = count +1
15509 manish.sha 461
 
462
        subOrders = self.updateCashbackInSubOrders(subOrders)
15791 manish.sha 463
        return subOrders
15509 manish.sha 464
 
15791 manish.sha 465
    def parseMultiSubOrders(self, soup, emailId):
15509 manish.sha 466
        orderTable = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
16145 manish.sha 467
        firstRow = orderTable.pop(0)
15791 manish.sha 468
        '''
469
        totalColumns = len(firstRow.find_all('td'))
470
 
15509 manish.sha 471
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15791 manish.sha 472
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
473
        '''    
15509 manish.sha 474
        subOrders = []
15791 manish.sha 475
        existingOrders = []
15509 manish.sha 476
        for orderTr in orderTable:
477
            cols = orderTr.find_all('td')
478
            product_details = cols[0].find_all('a')
479
            #print product_details
480
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 481
            if subOrderId in existingOrders:
482
                continue
483
            else:
484
                existingOrders.append(subOrderId)
485
            '''
15509 manish.sha 486
            productUrl = product_details[0].get('href')
487
            productName = product_details[0].contents[0].strip()
15791 manish.sha 488
            '''
489
            subOrderTrackingParsingUrl = product_details[1].get('href')
490
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
491
            '''
15509 manish.sha 492
            quantity = int(cols[1].text.strip())
493
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 494
            discount = 0
495
            subtotal = 0
496
            if totalColumns == 5:
497
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
498
                    discount = long(cols[3].text.strip().replace("Rs.",""))
499
                else:
500
                    discount = 0
501
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
502
            else:
503
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
504
 
15509 manish.sha 505
            br = getBrowserObject()
506
            productPage = br.open(BASE_MURL+productUrl)
507
            productPageHeaders = str(productPage.info()).split('\n')
508
            productPage = ungzipResponse(productPage)
509
            jsonProductResponse = None
510
            for header in productPageHeaders:
511
                header = header.split(':')
512
                if header[0] == 'Content-Type' and 'json' in header[1]:
513
                    jsonProductResponse = json.loads(productPage)
514
            productPageSoup= None
515
            if jsonProductResponse is not None:
516
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
517
            else:
518
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 519
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 520
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
521
            productImgUrl = ''
522
            if allproductImageTags is not None and len(allproductImageTags)>0:
523
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
524
            productDetailsSubMap['productCode']=productCode
525
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 526
            '''
16151 manish.sha 527
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
528
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 529
            subOrdersDetails = self.parseSingleSubOrder(orderTrackingPageSoup, emailId, subOrderId)
530
            subOrders = list(set(subOrders + subOrdersDetails))
15509 manish.sha 531
 
15791 manish.sha 532
        return subOrders
15509 manish.sha 533
 
534
    def scrapeStoreOrders(self,):
535
        #collectionMap = {'palcedOn':1}
536
        searchMap = {}
537
        collectionMap = {"orderTrackingUrl":1}
538
        orders = self._getActiveOrders(searchMap,collectionMap)
539
        for order in orders:
540
            print "Order", self.store_name, order['orderId'], order['orderTrackingUrl']
16138 manish.sha 541
            url = ORDER_TRACK_URL +'&'+ order['orderTrackingUrl'].split('trackOrder?')[1]
16141 manish.sha 542
            print url
15509 manish.sha 543
            page = fetchResponseUsingProxy(url)
544
            soup = BeautifulSoup(page)
545
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
546
            closed = True
16144 manish.sha 547
            orderIdSpan = soup.body.find("span", {'class':'price ord_no'})
548
            if orderIdSpan is not None:
16143 manish.sha 549
                orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
550
                if orderStatusList is not None and len(orderStatusList)>0:
551
                    subOrderId = soup.findAll(attrs={'class':'price ord_no'})[0].text.strip()
552
                    orderStatus = orderStatusList[0].contents[0].strip()
16228 manish.sha 553
                    orderTables = soup.body.find("table", {'class':'table product-list'}).findAll('tr', recursive=False)
16229 manish.sha 554
                    orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16143 manish.sha 555
                    orderTable.pop(0)
556
                    count = 1
557
                    while count <= len(orderTable):
16160 manish.sha 558
                        subbulk = self.db.merchantOrder.initialize_ordered_bulk_op()
16152 manish.sha 559
                        print 'Sub Order Id', str(subOrderId)+'-'+str(count)
16143 manish.sha 560
                        subOrder =  self._isSubOrderActive(order, str(subOrderId)+'-'+str(count))
561
                        if subOrder is None:
562
                            try:
563
                                subOrders = self.parseSingleSubOrder(soup, order['orderTrackingUrl'].split('email_id=')[1], subOrderId)
564
                                for subOrder in subOrders:
565
                                    if subOrder is None:
566
                                        continue
567
                                    self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
568
                                    print "Added new suborders to Order id - ", order['orderId']
569
                                    closed = False
570
                            except:
16227 manish.sha 571
                                traceback.print_exc()
16143 manish.sha 572
                                pass
16227 manish.sha 573
                            count = count+1
16143 manish.sha 574
                            continue
575
                        elif subOrder['closed']:
16226 manish.sha 576
                            count = count+1
16143 manish.sha 577
                            continue
578
                        else:
16163 manish.sha 579
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": str(subOrderId)+'-'+str(count)}
16143 manish.sha 580
                            updateMap = {}
581
                            updateMap["subOrders.$.detailedStatus"] = orderStatus
582
                            status = self._getStatusFromDetailedStatus(orderStatus) 
583
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
584
                            if status is not None:
585
                                updateMap["subOrders.$.status"] = status
586
                            if closedStatus:
587
                                #if status is closed then change the paybackStatus accordingly
16155 manish.sha 588
                                print 'Order Closed'
16143 manish.sha 589
                                updateMap["subOrders.$.closed"] = True
590
                                if status == Store.ORDER_DELIVERED:
591
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
592
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
593
                                elif status == Store.ORDER_CANCELLED:
594
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
595
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
596
                            else:
15791 manish.sha 597
                                closed = False
16155 manish.sha 598
                                print 'Order not Closed'
16161 manish.sha 599
 
16158 manish.sha 600
                            subbulk.find(findMap).update({'$set' : updateMap})
601
                            subresult = subbulk.execute()
602
                            tprint(subresult)
16164 manish.sha 603
                        count = count +1
16156 manish.sha 604
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
605
                    result = bulk.execute()
606
                    tprint(result)
16143 manish.sha 607
 
608
                else:
609
                    subOrdersList = self.parseMultiSubOrders(soup, order['orderTrackingUrl'].split('email_id=')[1])
610
                    for subOrderObj in subOrdersList:
16159 manish.sha 611
                        subbulk1 = self.db.merchantOrder.initialize_ordered_bulk_op()
16143 manish.sha 612
                        subOrder =  self._isSubOrderActive(order, subOrderObj.merchantSubOrderId)
613
                        if subOrder is None:
614
                            self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrderObj])}}})
615
                            print "Added new suborders to Order id - ", order['orderId']
616
                            closed = False
617
                            continue
618
                        elif subOrder['closed']:
619
                            continue
15791 manish.sha 620
                        else:
16143 manish.sha 621
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
622
                            updateMap = {}
623
                            updateMap["subOrders.$.detailedStatus"] = subOrderObj.detailedStatus
624
                            status = self._getStatusFromDetailedStatus(orderStatus) 
625
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
626
                            if status is not None:
627
                                updateMap["subOrders.$.status"] = status
628
                            if closedStatus:
629
                                #if status is closed then change the paybackStatus accordingly
630
                                updateMap["subOrders.$.closed"] = True
631
                                if status == Store.ORDER_DELIVERED:
632
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
633
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
634
                                elif status == Store.ORDER_CANCELLED:
635
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
636
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
637
                            else:
638
                                closed = False
16159 manish.sha 639
                            subbulk1.find(findMap).update({'$set' : updateMap})
640
                            subresult1 = subbulk1.execute()
641
                            tprint(subresult1)
16156 manish.sha 642
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
643
                    result = bulk.execute()
644
                    tprint(result)
15509 manish.sha 645
            else:
16143 manish.sha 646
                print 'Soup Object not found for this Order', order['orderId'], order['orderTrackingUrl']
647
                continue      
15791 manish.sha 648
 
649
    '''
650
    def getTrackingUrls(self, userId):
651
        missingOrderUrls = ['https://sm.shopclues.com/myaccount','https://sm.shopclues.com/myorders']
652
        return missingOrderUrls
15509 manish.sha 653
 
15791 manish.sha 654
    def parseMyProfileForEmailId(self, userId, url, rawhtml):
655
        profileSoup = BeautifulSoup(rawhtml)
656
        if profileSoup.find('input', {'name':'user_email'}) is not None:
657
            emailId = profileSoup.find('input', {'name':'user_email'})['value']
658
            if emailId is not None and emailId.strip() !='':
659
                mc = MemCache()
660
                mc.set(str(userId), emailId, 600)
661
                return 'EMAIL_SET_SUCCESS'
662
            else:
663
                return 'EMAIL_NOT_FOUND'
664
        else:
665
            return 'EMAIL_NOT_FOUND'
15509 manish.sha 666
 
15791 manish.sha 667
    def parseMyOrdersForEmailId(self, userId, url, rawhtml):
668
        myOrdersPageSoup = BeautifulSoup(rawhtml)
669
        if myOrdersPageSoup.find('a', {'class':'detail'}) is not None:
670
            emailId = myOrdersPageSoup.find('a', {'class':'detail'})['href'].split('&')[1].split('=')[1]
671
            mc = MemCache()
672
            mc.set(str(userId), emailId, 600)
673
            return 'EMAIL_SET_SUCCESS'
674
        else:
675
            return 'EMAIL_NOT_FOUND'
676
    '''        
677
 
678
 
15509 manish.sha 679
def todict(obj, classkey=None):
680
    if isinstance(obj, dict):
681
        data = {}
682
        for (k, v) in obj.items():
683
            data[k] = todict(v, classkey)
684
        return data
685
    elif hasattr(obj, "_ast"):
686
        return todict(obj._ast())
687
    elif hasattr(obj, "__iter__"):
688
        return [todict(v, classkey) for v in obj]
689
    elif hasattr(obj, "__dict__"):
690
        data = dict([(key, todict(value, classkey)) 
691
            for key, value in obj.__dict__.iteritems() 
692
            if not callable(value) and not key.startswith('_')])
693
        if classkey is not None and hasattr(obj, "__class__"):
694
            data[classkey] = obj.__class__.__name__
695
        return data
696
    else:
16226 manish.sha 697
        return obj
698
 
699
def login(url):
700
    br = getBrowserObject()
701
    br.open(url)
702
    response = br.open(url)
703
    ungzipResponseBr(response, br)
704
    #html = response.read()
705
    #print html
706
    br.select_form(nr=0)
707
    br.form['user'] = "imanthetester@gmail.com"
708
    br.form['password'] = "$Dl8uk"
709
    response = br.submit()
710
    print "********************"
711
    print "Attempting to Login"
712
    print "********************"
713
    #ungzipResponse(response, br)
714
    return br
15791 manish.sha 715
 
16226 manish.sha 716
def ungzipResponseBr(r,b):
717
    headers = r.info()
718
    if headers['Content-Encoding']=='gzip':
719
        import gzip
720
        print "********************"
721
        print "Deflating gzip response"
722
        print "********************"
723
        gz = gzip.GzipFile(fileobj=r, mode='rb')
724
        html = gz.read()
725
        gz.close()
726
        headers["Content-type"] = "text/html; charset=utf-8"
727
        r.set_data( html )
728
        b.set_response(r)    
729
 
15509 manish.sha 730