Subversion Repositories SmartDukaan

Rev

Rev 16890 | Rev 17099 | 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
16787 manish.sha 15
from dtr.utils.utils import fetchResponseUsingProxy, PROXY_MESH_GENERAL
15509 manish.sha 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
 
15791 manish.sha 30
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 31
ORDER_TRACK_URL='http://www.shopclues.com/index.php?dispatch=order_lookup.details'
15791 manish.sha 32
ORDER_TRACK_URL_DB='https://sm.shopclues.com/trackOrder?'
15509 manish.sha 33
BASE_URL= 'http://www.shopclues.com'
34
BASE_MURL= 'http://m.shopclues.com'
35
 
36
class Store(MStore):
37
 
38
    '''
39
    This is to map order statuses of our system to order statuses of snapdeal.
40
    And our statuses will change accordingly.
41
 
42
    '''
43
    OrderStatusMap = {
16272 manish.sha 44
                      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 45
                      MStore.ORDER_DELIVERED : ['delivered', 'complete'],
16254 manish.sha 46
                      MStore.ORDER_SHIPPED : ['in transit', 'dispatched','shipped','order handed to courier','order handed over to courier'],
16971 manish.sha 47
                      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','return complete','undelivered - returning to origin', 'canceled - shipment untraceable','order declined']
15509 manish.sha 48
                      }
49
    OrderStatusConfirmationMap= {
15791 manish.sha 50
                                 "P" : "Payment Successful",
51
                                 "D" : "Order Declined",
52
                                 "O" : "New Order - COD confirmation Pending"
15509 manish.sha 53
                                 }
54
 
55
    CONF_CB_AMOUNT = MStore.CONF_CB_DISCOUNTED_PRICE
56
 
16111 manish.sha 57
    def __init__(self,store_id):
58
        super(Store, self).__init__(store_id)
59
 
15791 manish.sha 60
    def convertToObj(self,offer):
16202 manish.sha 61
        orderRef = offer['MerchantRef']
62
        if len(orderRef)>15:
63
            orderRef = orderRef[0:len(orderRef)-10]
16203 manish.sha 64
        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 65
        return offer1
66
 
67
    def _saveToAffiliate(self, offers):
68
        collection = self.db.shopcluesOrderAffiliateInfo
69
        mcollection = self.db.merchantOrder
70
        for offerObj in offers:
71
            offer = self.convertToObj(offerObj)
72
            collection.update({"transactionId":offer.transactionId, "subTagId":offer.subTagId, "payOut":offer.payOut},{"$set":todict(offer)}, upsert=True)
73
            mcollection.update({"subTagId":offer.subTagId, "storeId":self.store_id, "subOrders.missingAff":True}, {"$set":{"subOrders.$.missingAff":False}})
74
 
15940 manish.sha 75
    def scrapeAffiliate(self, startDate=datetime.today() - timedelta(days=10), endDate=datetime.today()):
15791 manish.sha 76
        uri = AFFLIATE_TRASACTIONS_URL%(startDate.year,startDate.month,startDate.day,endDate.year,endDate.month,endDate.day)
77
        root = ET.parse(urllib2.urlopen(uri)).getroot()
78
        if len(root)> 0 and len(root[0])> 0:
79
            offers = []
80
            for child in root[0][0]:
81
                offers.append(child.attrib)
82
            self._saveToAffiliate(offers)
83
 
15509 manish.sha 84
    def _setLastSaleDate(self, saleDate):
85
        self.db.lastSaleDtate.update({'storeId':self.store_id}, {'$set':{'saleDate':saleDate}})
86
 
87
    def getName(self):
88
        return "shopclues"    
89
 
90
    def _getLastSaleDate(self,):
91
        lastDaySaleObj = self.db.lastDaySale.find_one({"storeId":self.store_id})
92
        if lastDaySaleObj is None:
93
            return datetime.min
94
 
95
    def _getStatusFromDetailedStatus(self, detailedStatus):
96
        for key, value in Store.OrderStatusMap.iteritems():
97
            if detailedStatus.lower() in value:
98
                return key
99
        print "Detailed Status need to be mapped", detailedStatus, self.store_id
100
        return None
101
 
15791 manish.sha 102
    def _getSingleSubOrderMap(self, orderId, soup, orderObj):
103
        orderStatus = self.OrderStatusConfirmationMap.get(orderObj['0']['status'])
16420 manish.sha 104
        statusTime= str(to_py_date(long(orderObj['0']['timestamp'])))
15509 manish.sha 105
        productDetailsMap = {}
16230 manish.sha 106
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
107
        orderTable = orderTables[len(orderTables)-1].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:
16420 manish.sha 122
                    if val['child'] is None:
123
                        if str(val['order_id']) == splitKey[0]:
124
                            counts.append(int(splitKey[1]))
125
                    else:
126
                        if str(val['child']) == splitKey[0]:
127
                            counts.append(int(splitKey[1]))
16110 manish.sha 128
 
129
            if len(counts) >0:
130
                newCount = max(counts)
16108 manish.sha 131
            count = newCount +1
16112 manish.sha 132
            if orderObj['0']['is_parent_order'] == 'N':
133
                jsonSubOrdersMap[str(val['order_id'])+'-'+str(count)] = val
134
            else:
16420 manish.sha 135
                if val['child'] is None:
136
                    jsonSubOrdersMap[str(val['order_id'])+'-'+str(count)] = val
137
                else:
138
                    jsonSubOrdersMap[str(val['child'])+'-'+str(count)] = val
15791 manish.sha 139
 
16110 manish.sha 140
 
16275 manish.sha 141
 
15941 manish.sha 142
        print jsonSubOrdersMap.items()
143
 
15791 manish.sha 144
        count = 1
15509 manish.sha 145
        for orderTr in orderTable:
15791 manish.sha 146
            productDetailsSubMap = None
147
            productDetailsSubMap = {}
15509 manish.sha 148
            cols = orderTr.find_all('td')
149
            product_details = cols[0].find_all('a')
150
            #print product_details
151
            productUrl = product_details[0].get('href')
152
            productName = product_details[0].contents[0].strip()
153
            quantity = int(cols[1].text.strip())
15980 manish.sha 154
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 155
            discount = 0
156
            subtotal = 0
157
            if totalColumns == 5:
15949 manish.sha 158
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 159
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 160
                else:
161
                    discount = 0
15980 manish.sha 162
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 163
            else:
15980 manish.sha 164
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15509 manish.sha 165
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
166
            productDetailsSubMap['productName']=productName
15791 manish.sha 167
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+'order_id=' +str(orderId)+'&email_id='+ orderObj['0']['email']
15509 manish.sha 168
            productDetailsSubMap['sellingPrice']=sellingPrice
169
            productDetailsSubMap['quantity']=quantity
170
            productDetailsSubMap['discount']=discount
171
            productDetailsSubMap['subtotal']=subtotal
15942 manish.sha 172
            key = str(orderId)+'-'+str(count)
173
            print 'SubOrder Map Key--',key
15791 manish.sha 174
            jsonSubOrderDetails = jsonSubOrdersMap.get(str(orderId)+'-'+str(count))
175
            productCode = jsonSubOrderDetails['product_code']
176
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 177
            productDetailsSubMap['productCode']=productCode
178
            productDetailsSubMap['imgUrl']=productImgUrl
179
 
15791 manish.sha 180
            productDetailsSubMap['subOrderStatus']=orderStatus
181
            productDetailsSubMap['subOrderStatusTime']=statusTime
182
            productDetailsMap[str(orderId)+'-'+str(count)]=productDetailsSubMap
183
            count = count +1
15509 manish.sha 184
        return productDetailsMap
185
 
15791 manish.sha 186
    def _getMultiSubOrdersMap(self, orderId, soup, orderObj):
16230 manish.sha 187
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
188
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16105 manish.sha 189
        firstRow = orderTable.pop(0)
15791 manish.sha 190
        #totalColumns = len(firstRow.find_all('td'))
15509 manish.sha 191
        productDetailsMap = {}
15791 manish.sha 192
        '''
193
        jsonSubOrdersMap = {}
194
        for val in orderObj['0']['items'].values():
195
            jsonSubOrdersMap[val['order_id']] = val
196
        '''
197
        existingOrders = []
15509 manish.sha 198
        for orderTr in orderTable:
15791 manish.sha 199
            subOrderDetailsMap = {}
200
 
15509 manish.sha 201
            cols = orderTr.find_all('td')
202
            product_details = cols[0].find_all('a')
203
            #print product_details
204
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 205
            if subOrderId in existingOrders:
206
                continue
207
            else:
208
                existingOrders.append(subOrderId)
209
            #productUrl = product_details[0].get('href')
210
            #productName = product_details[0].contents[0].strip()
211
            subOrderTrackingParsingUrl = product_details[1].get('href')
212
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
213
            '''
15509 manish.sha 214
            quantity = int(cols[1].text.strip())
215
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 216
            discount = 0
217
            subtotal = 0
218
            if totalColumns == 5:
219
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
220
                    discount = long(cols[3].text.strip().replace("Rs.",""))
221
                else:
222
                    discount = 0                    
223
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
224
            else:
225
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
15509 manish.sha 226
            productDetailsSubMap['productUrl']=BASE_MURL+productUrl
227
            productDetailsSubMap['productName']=productName
15791 manish.sha 228
            productDetailsSubMap['subOrderTrackingUrl']=ORDER_TRACK_URL_DB+subOrderTrackingUrl
15509 manish.sha 229
            productDetailsSubMap['sellingPrice']=sellingPrice
230
            productDetailsSubMap['quantity']=quantity
231
            productDetailsSubMap['discount']=discount
232
            productDetailsSubMap['subtotal']=subtotal
15791 manish.sha 233
            jsonSubOrderDetails = jsonSubOrdersMap.get(subOrderId)
234
            productCode = jsonSubOrderDetails['product_code']
235
            productImgUrl = jsonSubOrderDetails['images']['image_path'][0]
15509 manish.sha 236
            productDetailsSubMap['productCode']=productCode
237
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 238
            '''
16151 manish.sha 239
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
240
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 241
            '''
15509 manish.sha 242
            subOrderStatusList = orderTrackingPageSoup.findAll(attrs={'class' : 'price ord_status'})
243
            subOrderStatus = subOrderStatusList[0].contents[0].strip()
244
            subOrderStatusTime= orderTrackingPageSoup.findAll(attrs={'class' : 'sts no_mobile'})[1].contents[2].strip()
245
            productDetailsSubMap['subOrderStatus'] = subOrderStatus
246
            productDetailsSubMap['subOrderStatusTime'] = subOrderStatusTime
247
            productDetailsSubMap['parentOrderId']=orderId
15791 manish.sha 248
            '''
249
 
250
            subOrderDetailsMap = self._getSingleSubOrderMap(subOrderId, orderTrackingPageSoup, orderObj)
15509 manish.sha 251
 
15791 manish.sha 252
            productDetailsMap = dict(productDetailsMap.items()+subOrderDetailsMap.items())
15509 manish.sha 253
 
254
        return productDetailsMap
255
 
256
    def updateCashbackInSubOrders(self, subOrders):
257
        for subOrder in subOrders:
258
            cashbackStatus = Store.CB_NA
259
            cashbackAmount = 0
260
            percentage = 0
261
            amount = subOrder.amountPaid
262
            if amount > 0:
263
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amount)
264
                if cashbackAmount > 0:
265
                    cashbackStatus = Store.CB_PENDING
266
            subOrder.cashBackStatus = cashbackStatus
267
            subOrder.cashBackAmount = cashbackAmount
268
            subOrder.cashBackPercentage = percentage
269
        return subOrders
16888 manish.sha 270
 
271
    def _parseSingleOrderUsingJsonWithoutItems(self, orderId, userId, subTagId, orderObj, orderSuccessUrl):
15509 manish.sha 272
 
16888 manish.sha 273
        subOrders=[]
274
 
275
        ordertotal = long(float(orderObj['0']['total']))
276
        ordershippingcost = long(float(orderObj['0']['shipping_cost']))
277
        subtotal = ordertotal-ordershippingcost
278
        placedOn = str(orderObj['0']['last_update'])
279
        totalDiscount = long(float(orderObj['0']['discount']))
280
        totalOrdersAmount = (ordertotal + totalDiscount) - ordershippingcost 
281
        merchantOrderId = orderObj['0']['order_id']
282
        promotionid = orderObj['0']['promotion_ids']
283
        promotionObj = orderObj['0']['promotions'][promotionid]
284
        productCode = str(promotionObj['bonuses'][0]['value'])
285
        skuData = Mongo.getItemByMerchantIdentifier(productCode, 5)        
286
 
287
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
288
        merchantOrder.placedOn = placedOn
289
        merchantOrder.merchantOrderId = str(merchantOrderId)
290
        merchantOrder.paidAmount = ordertotal
291
 
292
 
293
        if len(skuData)>0:
294
            productUrl = BASE_MURL + str(urlparse(skuData.get('marketPlaceUrl')).path)
295
            subOrder = SubOrder(skuData.get('product_name'), productUrl, placedOn, subtotal)
296
            subOrder.merchantSubOrderId = str(merchantOrderId)+'-1'
297
            subOrder.detailedStatus = Store.OrderStatusConfirmationMap.get(str(orderObj['0']['status']))
298
            subOrder.imgUrl = skuData.get('thumbnail')
299
            subOrder.offerDiscount = totalDiscount
300
            subOrder.unitPrice = totalOrdersAmount
301
            subOrder.productCode = productCode
302
            subOrder.amountPaid = subtotal
303
            subOrder.quantity = 1
304
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ str(orderObj['0']['email'])
305
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
306
            subOrder.dealRank = dealRank.get('rank')
307
            subOrder.rankDesc = dealRank.get('description')
308
            subOrders.append(subOrder)
309
        else:
310
            productSearch = fetchResponseUsingProxy(BASE_MURL+'/search?q='+productCode.strip())
311
            productSearchResultPage = BeautifulSoup(productSearch)
312
            productUrl = str(productSearchResultPage.find('a', {'class':'pd-list'})['href'])
313
            style = productSearchResultPage.find('div', {'class':'pd-image'})['style']
314
            imageurl = str(re.findall('url\(\"(.*?)\"\)', style)[0])
315
            productName = str(productSearchResultPage.find('div', {'class':'pdt-name'}).text)
316
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
317
            subOrder.merchantSubOrderId = str(merchantOrderId)+'-1'
318
            subOrder.detailedStatus = Store.OrderStatusConfirmationMap.get(str(orderObj['0']['status']))
319
            subOrder.imgUrl = imageurl
320
            subOrder.offerDiscount = totalDiscount
321
            subOrder.unitPrice = totalOrdersAmount
322
            subOrder.productCode = productCode
323
            subOrder.amountPaid = subtotal
324
            subOrder.quantity = 1
325
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ str(orderObj['0']['email'])
326
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
327
            subOrder.dealRank = 0
328
            subOrder.rankDesc = 'Not Applicable'
329
            subOrders.append(subOrder)
330
 
331
        merchantOrder.totalAmount = totalOrdersAmount
332
        merchantOrder.discountApplied = totalDiscount
333
        merchantOrder.deliveryCharges = ordershippingcost
334
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
335
 
336
        return merchantOrder
337
 
338
    def _parseMultiOrderUsingJsonWithoutItems(self, orderId, userId, subTagId, orderObj, orderSuccessUrl):
339
        pass
340
        '''
341
        subOrders=[]
342
 
343
        ordertotal = long(float(orderObj['0']['total']))
344
        ordershippingcost = long(float(orderObj['0']['shipping_cost']))
345
        subtotal = ordertotal-ordershippingcost
346
        placedOn = str(orderObj['0']['last_update'])
347
        totalDiscount = long(float(orderObj['0']['discount']))
348
        totalOrdersAmount = (ordertotal + totalDiscount) - ordershippingcost 
349
        merchantOrderId = orderObj['0']['order_id']
350
        promotionids = orderObj['0']['promotion_ids'].split(',')
351
        promotions = orderObj['0']['promotions']
352
 
353
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
354
        merchantOrder.placedOn = placedOn
355
        merchantOrder.merchantOrderId = str(merchantOrderId)
356
        merchantOrder.paidAmount = ordertotal
357
 
358
 
359
        for promotionId in promotionids:
360
            promotion = promotions[promotionId]
361
            productCode = str(promotion['bonuses'][0]['value'])
362
            skuData = Mongo.getItemByMerchantIdentifier(productCode, 5)
363
 
364
 
365
        return None
366
        '''
367
 
15947 manish.sha 368
    def _parseOrders(self, orderId, mpOrderId, subTagId, userId, page, orderSuccessUrl, orderObj):
15509 manish.sha 369
        soup = BeautifulSoup(page)
370
        productDetailsMap = {}
371
        paymentFields = soup.findAll(attrs={'class' : 'box_paymentcalculations_row'})
372
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15948 manish.sha 373
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
15509 manish.sha 374
        ordersubtotal=0
375
        ordercluebucks=0
376
        ordershippingcost=0
377
        ordertotal=0
378
 
379
        for val in paymentFields:
380
            for value in val.contents:
381
                if value is not None:
382
                    if 'div' in str(value).strip():
383
                        if 'Subtotal' in value.text.strip():
15981 manish.sha 384
                            ordersubtotal = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 385
                            print 'Order SubTotal:- ',ordersubtotal
15509 manish.sha 386
                        if 'Shipping Cost' in value.text.strip():
15981 manish.sha 387
                            ordershippingcost = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 388
                            print 'Shipping Cost:- ',ordershippingcost
15509 manish.sha 389
                        if 'Clue' in value.text.strip():
15981 manish.sha 390
                            ordercluebucks = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 391
                            print 'Clue bucks:- ',ordercluebucks
15509 manish.sha 392
                        if 'Total' in value.text.strip():
15791 manish.sha 393
                            ordertotal = val.contents[3].text.strip().replace("Rs.","")
394
                            ordertotal = ordertotal.replace(',','')
16165 manish.sha 395
                            print 'Order Total:- ',ordertotal
15791 manish.sha 396
 
397
        if orderObj['0']['is_parent_order'] == 'N':
15947 manish.sha 398
            productDetailsMap = self._getSingleSubOrderMap(mpOrderId, soup, orderObj)
15509 manish.sha 399
        else:
16420 manish.sha 400
            if orderObj['0']['items'].values()[0]['child'] is None:
401
                productDetailsMap = self._getSingleSubOrderMap(mpOrderId, soup, orderObj)
402
            else:
403
                productDetailsMap = self._getMultiSubOrdersMap(mpOrderId, soup, orderObj)
15509 manish.sha 404
 
15791 manish.sha 405
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
15509 manish.sha 406
        merchantOrder.placedOn = placedOn
15791 manish.sha 407
        merchantOrder.merchantOrderId = orderObj['0']['order_id']
15509 manish.sha 408
        merchantOrder.paidAmount = ordertotal
409
        totalOrdersAmount = 0
410
        totalDiscount = 0
411
        subOrders= []
16281 manish.sha 412
        if len(productDetailsMap)==0:
413
            print 'Unable to get Sub Orders for Now:- ',orderObj['0']['order_id']
15509 manish.sha 414
        for key in productDetailsMap:
415
            subOrderDetail = productDetailsMap.get(key)
416
            totalOrdersAmount = totalOrdersAmount  + (subOrderDetail['sellingPrice'] * subOrderDetail['quantity'])
417
            totalDiscount = totalDiscount + (subOrderDetail['discount'] * subOrderDetail['quantity'])
418
            subOrder = SubOrder(subOrderDetail['productName'], subOrderDetail['productUrl'], placedOn, subOrderDetail['subtotal'])
419
            subOrder.merchantSubOrderId = key
420
            subOrder.detailedStatus = subOrderDetail['subOrderStatus']
421
            subOrder.imgUrl = subOrderDetail['imgUrl']
422
            subOrder.offerDiscount = subOrderDetail['discount'] * subOrderDetail['quantity']
423
            subOrder.unitPrice = subOrderDetail['sellingPrice']
424
            subOrder.productCode = subOrderDetail['productCode']
425
            subOrder.amountPaid = subOrderDetail['subtotal']
426
            subOrder.quantity = subOrderDetail['quantity']
15791 manish.sha 427
            subOrder.tracingkUrl = subOrderDetail['subOrderTrackingUrl']
16097 manish.sha 428
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
429
            subOrder.dealRank = dealRank.get('rank')
430
            subOrder.rankDesc = dealRank.get('description')
16283 amit.gupta 431
            subOrder.maxNlc = dealRank.get('maxNlc')
432
            subOrder.minNlc = dealRank.get('minNlc')
433
            subOrder.db = dealRank.get('dp')
434
            subOrder.itemStatus = dealRank.get('status')
15509 manish.sha 435
            subOrders.append(subOrder)
436
        merchantOrder.totalAmount = totalOrdersAmount
437
        merchantOrder.discountApplied = totalDiscount
438
        merchantOrder.deliveryCharges = ordershippingcost
439
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
440
 
441
        return merchantOrder
442
 
443
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
444
        resp = {}
445
        try:
15791 manish.sha 446
            rawHtmlSoup = BeautifulSoup(rawHtml)
447
            emailId = None
448
            orderObj = None
449
            merchantOrderId = None
450
            for script in rawHtmlSoup.find_all('script'):
451
                if 'orderConfirmation' in script.text:
16274 manish.sha 452
                    print script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0]
15791 manish.sha 453
                    orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
454
                    if merchantOrderId is None:
455
                        merchantOrderId = orderObj['0']['order_id']
456
                        emailId = orderObj['0']['email']
16197 manish.sha 457
            if orderObj is None or merchantOrderId is None:
16226 manish.sha 458
                orderIdDiv = rawHtmlSoup.body.find("div", {'class':'conf_succes'})
459
                if orderIdDiv is None:
460
                    orderIdArt = rawHtmlSoup.body.find("article", {'class':'white'})
461
                    if orderIdArt is None:
462
                        resp['result'] = 'ORDER_NOT_CREATED_UNKNOWN'
463
                        return resp
464
                    else:
465
                        orderIdDiv= orderIdArt.find('p', recursive=False)
466
                        orderIdVal = str(orderIdDiv.text.split(' : ')[1])
467
                        print "Opening Shopclues Login Page"
468
                        login_url = "https://sm.shopclues.com/login"
469
                        br1 = login(login_url)
470
                        orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
471
                        orderDetailPage = ungzipResponse(orderDetailPage)
472
                        rawHtmlSoup = BeautifulSoup(orderDetailPage)
473
                        for script in rawHtmlSoup.find_all('script'):
474
                            if 'orderConfirmation' in script.text:
475
                                orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
476
                                if merchantOrderId is None:
477
                                    merchantOrderId = orderObj['0']['order_id']
478
                                    emailId = orderObj['0']['email']
479
                        logoutpage = br1.open("https://sm.shopclues.com/logout")
480
                        print br1.geturl()
481
                else:
482
                    orderIdDiv= orderIdDiv.find('div', recursive=False)
483
                    orderIdVal = str(orderIdDiv.span.text)
484
                    print "Opening Shopclues Login Page"
485
                    login_url = "https://sm.shopclues.com/login"
486
                    br1 = login(login_url)
487
                    orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
488
                    orderDetailPage = ungzipResponse(orderDetailPage)
489
                    rawHtmlSoup = BeautifulSoup(orderDetailPage)
490
                    for script in rawHtmlSoup.find_all('script'):
491
                        if 'orderConfirmation' in script.text:
492
                            orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
493
                            if merchantOrderId is None:
494
                                merchantOrderId = orderObj['0']['order_id']
495
                                emailId = orderObj['0']['email']
496
                    logoutpage = br1.open("https://sm.shopclues.com/logout")
497
                    print br1.geturl()
498
 
16275 manish.sha 499
            if type(orderObj['0']['items']) is list:
500
                print "Opening Shopclues Login Page"
501
                login_url = "https://sm.shopclues.com/login"
502
                br1 = login(login_url)
503
                orderDetailPage = br1.open("https://sm.shopclues.com/orderconfirmation?order_id="+str(merchantOrderId)+"&status=P")
504
                orderDetailPage = ungzipResponse(orderDetailPage)
505
                rawHtmlSoup = BeautifulSoup(orderDetailPage)
506
                for script in rawHtmlSoup.find_all('script'):
507
                    if 'orderConfirmation' in script.text:
508
                        orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
509
                        if merchantOrderId is None:
510
                            merchantOrderId = orderObj['0']['order_id']
511
                            emailId = orderObj['0']['email']
512
                logoutpage = br1.open("https://sm.shopclues.com/logout")
513
                print br1.geturl()
514
 
15509 manish.sha 515
            br = getBrowserObject()
15791 manish.sha 516
            url = ORDER_TRACK_URL +'&order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 517
            page = br.open(url)
16889 manish.sha 518
            print 'Track Order Url ', br.geturl()
16890 manish.sha 519
            if type(orderObj['0']['items']) is list:
520
                if len(orderObj['0']['promotions'])==1:
521
                    merchantOrder = self._parseSingleOrderUsingJsonWithoutItems(orderId, userId, subTagId, orderObj, orderSuccessUrl)
522
                    merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
523
                    if self._saveToOrder(todict(merchantOrder)):
524
                        resp['result'] = 'ORDER_CREATED'
525
                        return resp
526
                    else:
527
                        resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
528
                        return resp
16888 manish.sha 529
                    '''
530
                    else:
531
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
532
                        return resp
533
 
534
                    elif len(orderObj['0']['promotions'])>1:
535
                        merchantOrder = self._parseMultiOrderUsingJsonWithoutItems(orderId, userId, subTagId, orderObj, orderSuccessUrl)
536
                    '''
537
 
15509 manish.sha 538
            headers = str(page.info()).split('\n')
539
            page = ungzipResponse(page)
540
            jsonResponse = None
541
            for header in headers:
542
                header = header.split(':')
543
                if header[0] == 'Content-Type' and 'json' in header[1]:
544
                    jsonResponse = json.loads(page)
545
            if jsonResponse is not None:
546
                page = jsonResponse['text']
547
 
16370 manish.sha 548
            merchantOrder = self._parseOrders(orderId, merchantOrderId, subTagId, userId, page, orderSuccessUrl, orderObj) 
15509 manish.sha 549
 
15948 manish.sha 550
            merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 551
 
552
            if self._saveToOrder(todict(merchantOrder)):
553
                resp['result'] = 'ORDER_CREATED'
554
            else:
555
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
556
 
557
            return resp
558
        except:
559
            print "Error occurred"
560
            traceback.print_exc()
561
            resp['result'] = 'ORDER_NOT_CREATED'
16120 manish.sha 562
            return resp
15509 manish.sha 563
 
15791 manish.sha 564
    def parseSingleSubOrder(self, soup, emailId, subOrderId):
565
        orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
566
        subOrderStatus = orderStatusList[0].contents[0].strip()
15509 manish.sha 567
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
16230 manish.sha 568
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
569
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
570
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)    
15791 manish.sha 571
        firstRow = orderTable.pop(0)
15949 manish.sha 572
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 573
        subOrders =[]
574
        count =1   
15509 manish.sha 575
        for orderTr in orderTable:
576
            cols = orderTr.find_all('td')
577
            product_details = cols[0].find_all('a')
578
            #print product_details
579
            productUrl = product_details[0].get('href')
580
            productName = product_details[0].contents[0].strip()
581
            quantity = int(cols[1].text.strip())
15980 manish.sha 582
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 583
            discount = 0
584
            subtotal = 0
585
            if totalColumns == 5:
15949 manish.sha 586
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 587
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 588
                else:
589
                    discount = 0
15980 manish.sha 590
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 591
            else:
15980 manish.sha 592
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
16151 manish.sha 593
            productPage = fetchResponseUsingProxy(BASE_MURL+productUrl)
594
            productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 595
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 596
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
597
            productImgUrl = ''
598
            if allproductImageTags is not None and len(allproductImageTags)>0:
599
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
600
 
601
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
15791 manish.sha 602
            subOrder.merchantSubOrderId = str(subOrderId)+'-'+str(count)
15509 manish.sha 603
            subOrder.detailedStatus = subOrderStatus
604
            subOrder.imgUrl = productImgUrl
605
            subOrder.offerDiscount = discount*quantity
606
            subOrder.unitPrice = sellingPrice
607
            subOrder.productCode = productCode
608
            subOrder.amountPaid = subtotal
609
            subOrder.quantity = quantity
15791 manish.sha 610
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB +  'order_id=' +subOrderId+'&email_id='+ emailId
15509 manish.sha 611
            subOrders.append(subOrder)
15791 manish.sha 612
            count = count +1
15509 manish.sha 613
 
614
        subOrders = self.updateCashbackInSubOrders(subOrders)
15791 manish.sha 615
        return subOrders
15509 manish.sha 616
 
15791 manish.sha 617
    def parseMultiSubOrders(self, soup, emailId):
16230 manish.sha 618
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
619
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16145 manish.sha 620
        firstRow = orderTable.pop(0)
15791 manish.sha 621
        '''
622
        totalColumns = len(firstRow.find_all('td'))
623
 
15509 manish.sha 624
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15791 manish.sha 625
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
626
        '''    
15509 manish.sha 627
        subOrders = []
15791 manish.sha 628
        existingOrders = []
15509 manish.sha 629
        for orderTr in orderTable:
630
            cols = orderTr.find_all('td')
631
            product_details = cols[0].find_all('a')
632
            #print product_details
633
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 634
            if subOrderId in existingOrders:
635
                continue
636
            else:
637
                existingOrders.append(subOrderId)
638
            '''
15509 manish.sha 639
            productUrl = product_details[0].get('href')
640
            productName = product_details[0].contents[0].strip()
15791 manish.sha 641
            '''
642
            subOrderTrackingParsingUrl = product_details[1].get('href')
643
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
644
            '''
15509 manish.sha 645
            quantity = int(cols[1].text.strip())
646
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 647
            discount = 0
648
            subtotal = 0
649
            if totalColumns == 5:
650
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
651
                    discount = long(cols[3].text.strip().replace("Rs.",""))
652
                else:
653
                    discount = 0
654
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
655
            else:
656
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
657
 
15509 manish.sha 658
            br = getBrowserObject()
659
            productPage = br.open(BASE_MURL+productUrl)
660
            productPageHeaders = str(productPage.info()).split('\n')
661
            productPage = ungzipResponse(productPage)
662
            jsonProductResponse = None
663
            for header in productPageHeaders:
664
                header = header.split(':')
665
                if header[0] == 'Content-Type' and 'json' in header[1]:
666
                    jsonProductResponse = json.loads(productPage)
667
            productPageSoup= None
668
            if jsonProductResponse is not None:
669
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
670
            else:
671
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 672
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 673
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
674
            productImgUrl = ''
675
            if allproductImageTags is not None and len(allproductImageTags)>0:
676
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
677
            productDetailsSubMap['productCode']=productCode
678
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 679
            '''
16151 manish.sha 680
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
681
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 682
            subOrdersDetails = self.parseSingleSubOrder(orderTrackingPageSoup, emailId, subOrderId)
683
            subOrders = list(set(subOrders + subOrdersDetails))
15509 manish.sha 684
 
15791 manish.sha 685
        return subOrders
15509 manish.sha 686
 
687
    def scrapeStoreOrders(self,):
688
        #collectionMap = {'palcedOn':1}
689
        searchMap = {}
690
        collectionMap = {"orderTrackingUrl":1}
691
        orders = self._getActiveOrders(searchMap,collectionMap)
692
        for order in orders:
693
            print "Order", self.store_name, order['orderId'], order['orderTrackingUrl']
16138 manish.sha 694
            url = ORDER_TRACK_URL +'&'+ order['orderTrackingUrl'].split('trackOrder?')[1]
16141 manish.sha 695
            print url
16249 manish.sha 696
            page = None
697
            retry = 1
698
            while retry <=3: 
699
                try: 
700
                    page = fetchResponseUsingProxy(url)
701
                    break
702
                except:
16250 manish.sha 703
                    traceback.print_exc()
16249 manish.sha 704
                    retry = retry + 1
705
 
15509 manish.sha 706
            soup = BeautifulSoup(page)
707
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
708
            closed = True
16144 manish.sha 709
            orderIdSpan = soup.body.find("span", {'class':'price ord_no'})
710
            if orderIdSpan is not None:
16143 manish.sha 711
                orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
712
                if orderStatusList is not None and len(orderStatusList)>0:
713
                    subOrderId = soup.findAll(attrs={'class':'price ord_no'})[0].text.strip()
714
                    orderStatus = orderStatusList[0].contents[0].strip()
16230 manish.sha 715
                    orderTables = soup.body.findAll("table", {'class':'table product-list'})
16229 manish.sha 716
                    orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16143 manish.sha 717
                    orderTable.pop(0)
718
                    count = 1
719
                    while count <= len(orderTable):
16160 manish.sha 720
                        subbulk = self.db.merchantOrder.initialize_ordered_bulk_op()
16152 manish.sha 721
                        print 'Sub Order Id', str(subOrderId)+'-'+str(count)
16143 manish.sha 722
                        subOrder =  self._isSubOrderActive(order, str(subOrderId)+'-'+str(count))
723
                        if subOrder is None:
724
                            try:
16787 manish.sha 725
                                print 'Email Id:- '+ str(order['orderTrackingUrl'].split('email_id=')[1])+' and Order Id:- ' + str(subOrderId)
16143 manish.sha 726
                                subOrders = self.parseSingleSubOrder(soup, order['orderTrackingUrl'].split('email_id=')[1], subOrderId)
727
                                for subOrder in subOrders:
728
                                    if subOrder is None:
729
                                        continue
730
                                    self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
731
                                    print "Added new suborders to Order id - ", order['orderId']
732
                                    closed = False
733
                            except:
16227 manish.sha 734
                                traceback.print_exc()
16143 manish.sha 735
                                pass
16227 manish.sha 736
                            count = count+1
16143 manish.sha 737
                            continue
738
                        elif subOrder['closed']:
16226 manish.sha 739
                            count = count+1
16143 manish.sha 740
                            continue
741
                        else:
16163 manish.sha 742
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": str(subOrderId)+'-'+str(count)}
16143 manish.sha 743
                            updateMap = {}
744
                            updateMap["subOrders.$.detailedStatus"] = orderStatus
745
                            status = self._getStatusFromDetailedStatus(orderStatus) 
746
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
747
                            if status is not None:
748
                                updateMap["subOrders.$.status"] = status
749
                            if closedStatus:
750
                                #if status is closed then change the paybackStatus accordingly
16155 manish.sha 751
                                print 'Order Closed'
16143 manish.sha 752
                                updateMap["subOrders.$.closed"] = True
753
                                if status == Store.ORDER_DELIVERED:
754
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
755
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
756
                                elif status == Store.ORDER_CANCELLED:
757
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
758
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
759
                            else:
15791 manish.sha 760
                                closed = False
16155 manish.sha 761
                                print 'Order not Closed'
16161 manish.sha 762
 
16158 manish.sha 763
                            subbulk.find(findMap).update({'$set' : updateMap})
764
                            subresult = subbulk.execute()
765
                            tprint(subresult)
16164 manish.sha 766
                        count = count +1
16156 manish.sha 767
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
768
                    result = bulk.execute()
769
                    tprint(result)
16143 manish.sha 770
 
771
                else:
16788 manish.sha 772
                    subOrdersList = []
773
                    try:
774
                        subOrdersList = self.parseMultiSubOrders(soup, order['orderTrackingUrl'].split('email_id=')[1])
775
                    except:
776
                        print 'Unable to parse', order['orderId'], order['orderTrackingUrl']
777
                        continue
16143 manish.sha 778
                    for subOrderObj in subOrdersList:
16159 manish.sha 779
                        subbulk1 = self.db.merchantOrder.initialize_ordered_bulk_op()
16143 manish.sha 780
                        subOrder =  self._isSubOrderActive(order, subOrderObj.merchantSubOrderId)
781
                        if subOrder is None:
782
                            self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrderObj])}}})
783
                            print "Added new suborders to Order id - ", order['orderId']
784
                            closed = False
785
                            continue
786
                        elif subOrder['closed']:
787
                            continue
15791 manish.sha 788
                        else:
16143 manish.sha 789
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
790
                            updateMap = {}
791
                            updateMap["subOrders.$.detailedStatus"] = subOrderObj.detailedStatus
792
                            status = self._getStatusFromDetailedStatus(orderStatus) 
793
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
794
                            if status is not None:
795
                                updateMap["subOrders.$.status"] = status
796
                            if closedStatus:
797
                                #if status is closed then change the paybackStatus accordingly
798
                                updateMap["subOrders.$.closed"] = True
799
                                if status == Store.ORDER_DELIVERED:
800
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
801
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
802
                                elif status == Store.ORDER_CANCELLED:
803
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
804
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
805
                            else:
806
                                closed = False
16159 manish.sha 807
                            subbulk1.find(findMap).update({'$set' : updateMap})
808
                            subresult1 = subbulk1.execute()
809
                            tprint(subresult1)
16156 manish.sha 810
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
811
                    result = bulk.execute()
812
                    tprint(result)
15509 manish.sha 813
            else:
16143 manish.sha 814
                print 'Soup Object not found for this Order', order['orderId'], order['orderTrackingUrl']
815
                continue      
15791 manish.sha 816
 
817
    '''
818
    def getTrackingUrls(self, userId):
819
        missingOrderUrls = ['https://sm.shopclues.com/myaccount','https://sm.shopclues.com/myorders']
820
        return missingOrderUrls
15509 manish.sha 821
 
15791 manish.sha 822
    def parseMyProfileForEmailId(self, userId, url, rawhtml):
823
        profileSoup = BeautifulSoup(rawhtml)
824
        if profileSoup.find('input', {'name':'user_email'}) is not None:
825
            emailId = profileSoup.find('input', {'name':'user_email'})['value']
826
            if emailId is not None and emailId.strip() !='':
827
                mc = MemCache()
828
                mc.set(str(userId), emailId, 600)
829
                return 'EMAIL_SET_SUCCESS'
830
            else:
831
                return 'EMAIL_NOT_FOUND'
832
        else:
833
            return 'EMAIL_NOT_FOUND'
15509 manish.sha 834
 
15791 manish.sha 835
    def parseMyOrdersForEmailId(self, userId, url, rawhtml):
836
        myOrdersPageSoup = BeautifulSoup(rawhtml)
837
        if myOrdersPageSoup.find('a', {'class':'detail'}) is not None:
838
            emailId = myOrdersPageSoup.find('a', {'class':'detail'})['href'].split('&')[1].split('=')[1]
839
            mc = MemCache()
840
            mc.set(str(userId), emailId, 600)
841
            return 'EMAIL_SET_SUCCESS'
842
        else:
843
            return 'EMAIL_NOT_FOUND'
844
    '''        
845
 
16420 manish.sha 846
def to_py_date(java_timestamp):
16424 manish.sha 847
    date = datetime.fromtimestamp(java_timestamp)
16420 manish.sha 848
    return date       
15791 manish.sha 849
 
15509 manish.sha 850
def todict(obj, classkey=None):
851
    if isinstance(obj, dict):
852
        data = {}
853
        for (k, v) in obj.items():
854
            data[k] = todict(v, classkey)
855
        return data
856
    elif hasattr(obj, "_ast"):
857
        return todict(obj._ast())
858
    elif hasattr(obj, "__iter__"):
859
        return [todict(v, classkey) for v in obj]
860
    elif hasattr(obj, "__dict__"):
861
        data = dict([(key, todict(value, classkey)) 
862
            for key, value in obj.__dict__.iteritems() 
863
            if not callable(value) and not key.startswith('_')])
864
        if classkey is not None and hasattr(obj, "__class__"):
865
            data[classkey] = obj.__class__.__name__
866
        return data
867
    else:
16226 manish.sha 868
        return obj
869
 
870
def login(url):
871
    br = getBrowserObject()
16787 manish.sha 872
    br.set_proxies({"http": PROXY_MESH_GENERAL})
16226 manish.sha 873
    br.open(url)
874
    response = br.open(url)
875
    ungzipResponseBr(response, br)
876
    #html = response.read()
877
    #print html
878
    br.select_form(nr=0)
879
    br.form['user'] = "imanthetester@gmail.com"
880
    br.form['password'] = "$Dl8uk"
881
    response = br.submit()
882
    print "********************"
883
    print "Attempting to Login"
884
    print "********************"
885
    #ungzipResponse(response, br)
886
    return br
15791 manish.sha 887
 
16226 manish.sha 888
def ungzipResponseBr(r,b):
889
    headers = r.info()
890
    if headers['Content-Encoding']=='gzip':
891
        import gzip
892
        print "********************"
893
        print "Deflating gzip response"
894
        print "********************"
895
        gz = gzip.GzipFile(fileobj=r, mode='rb')
896
        html = gz.read()
897
        gz.close()
898
        headers["Content-type"] = "text/html; charset=utf-8"
899
        r.set_data( html )
900
        b.set_response(r)    
901
 
15509 manish.sha 902