Subversion Repositories SmartDukaan

Rev

Rev 16888 | Rev 16890 | 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'],
16370 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']
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()
16888 manish.sha 519
            if "trackorder" in br.geturl():
520
                if type(orderObj['0']['items']) is list:
521
                    if len(orderObj['0']['promotions'])==1:
522
                        merchantOrder = self._parseSingleOrderUsingJsonWithoutItems(orderId, userId, subTagId, orderObj, orderSuccessUrl)
523
                        merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
524
                        if self._saveToOrder(todict(merchantOrder)):
525
                            resp['result'] = 'ORDER_CREATED'
16889 manish.sha 526
                            return resp
16888 manish.sha 527
                        else:
528
                            resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
16889 manish.sha 529
                            return resp
16888 manish.sha 530
                    '''
531
                    else:
532
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
533
                        return resp
534
 
535
                    elif len(orderObj['0']['promotions'])>1:
536
                        merchantOrder = self._parseMultiOrderUsingJsonWithoutItems(orderId, userId, subTagId, orderObj, orderSuccessUrl)
537
                    '''
538
 
15509 manish.sha 539
            headers = str(page.info()).split('\n')
540
            page = ungzipResponse(page)
541
            jsonResponse = None
542
            for header in headers:
543
                header = header.split(':')
544
                if header[0] == 'Content-Type' and 'json' in header[1]:
545
                    jsonResponse = json.loads(page)
546
            if jsonResponse is not None:
547
                page = jsonResponse['text']
548
 
16370 manish.sha 549
            merchantOrder = self._parseOrders(orderId, merchantOrderId, subTagId, userId, page, orderSuccessUrl, orderObj) 
15509 manish.sha 550
 
15948 manish.sha 551
            merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 552
 
553
            if self._saveToOrder(todict(merchantOrder)):
554
                resp['result'] = 'ORDER_CREATED'
555
            else:
556
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
557
 
558
            return resp
559
        except:
560
            print "Error occurred"
561
            traceback.print_exc()
562
            resp['result'] = 'ORDER_NOT_CREATED'
16120 manish.sha 563
            return resp
15509 manish.sha 564
 
15791 manish.sha 565
    def parseSingleSubOrder(self, soup, emailId, subOrderId):
566
        orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
567
        subOrderStatus = orderStatusList[0].contents[0].strip()
15509 manish.sha 568
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
16230 manish.sha 569
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
570
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
571
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)    
15791 manish.sha 572
        firstRow = orderTable.pop(0)
15949 manish.sha 573
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 574
        subOrders =[]
575
        count =1   
15509 manish.sha 576
        for orderTr in orderTable:
577
            cols = orderTr.find_all('td')
578
            product_details = cols[0].find_all('a')
579
            #print product_details
580
            productUrl = product_details[0].get('href')
581
            productName = product_details[0].contents[0].strip()
582
            quantity = int(cols[1].text.strip())
15980 manish.sha 583
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 584
            discount = 0
585
            subtotal = 0
586
            if totalColumns == 5:
15949 manish.sha 587
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 588
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 589
                else:
590
                    discount = 0
15980 manish.sha 591
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 592
            else:
15980 manish.sha 593
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
16151 manish.sha 594
            productPage = fetchResponseUsingProxy(BASE_MURL+productUrl)
595
            productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 596
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 597
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
598
            productImgUrl = ''
599
            if allproductImageTags is not None and len(allproductImageTags)>0:
600
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
601
 
602
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
15791 manish.sha 603
            subOrder.merchantSubOrderId = str(subOrderId)+'-'+str(count)
15509 manish.sha 604
            subOrder.detailedStatus = subOrderStatus
605
            subOrder.imgUrl = productImgUrl
606
            subOrder.offerDiscount = discount*quantity
607
            subOrder.unitPrice = sellingPrice
608
            subOrder.productCode = productCode
609
            subOrder.amountPaid = subtotal
610
            subOrder.quantity = quantity
15791 manish.sha 611
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB +  'order_id=' +subOrderId+'&email_id='+ emailId
15509 manish.sha 612
            subOrders.append(subOrder)
15791 manish.sha 613
            count = count +1
15509 manish.sha 614
 
615
        subOrders = self.updateCashbackInSubOrders(subOrders)
15791 manish.sha 616
        return subOrders
15509 manish.sha 617
 
15791 manish.sha 618
    def parseMultiSubOrders(self, soup, emailId):
16230 manish.sha 619
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
620
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16145 manish.sha 621
        firstRow = orderTable.pop(0)
15791 manish.sha 622
        '''
623
        totalColumns = len(firstRow.find_all('td'))
624
 
15509 manish.sha 625
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15791 manish.sha 626
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
627
        '''    
15509 manish.sha 628
        subOrders = []
15791 manish.sha 629
        existingOrders = []
15509 manish.sha 630
        for orderTr in orderTable:
631
            cols = orderTr.find_all('td')
632
            product_details = cols[0].find_all('a')
633
            #print product_details
634
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 635
            if subOrderId in existingOrders:
636
                continue
637
            else:
638
                existingOrders.append(subOrderId)
639
            '''
15509 manish.sha 640
            productUrl = product_details[0].get('href')
641
            productName = product_details[0].contents[0].strip()
15791 manish.sha 642
            '''
643
            subOrderTrackingParsingUrl = product_details[1].get('href')
644
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
645
            '''
15509 manish.sha 646
            quantity = int(cols[1].text.strip())
647
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 648
            discount = 0
649
            subtotal = 0
650
            if totalColumns == 5:
651
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
652
                    discount = long(cols[3].text.strip().replace("Rs.",""))
653
                else:
654
                    discount = 0
655
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
656
            else:
657
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
658
 
15509 manish.sha 659
            br = getBrowserObject()
660
            productPage = br.open(BASE_MURL+productUrl)
661
            productPageHeaders = str(productPage.info()).split('\n')
662
            productPage = ungzipResponse(productPage)
663
            jsonProductResponse = None
664
            for header in productPageHeaders:
665
                header = header.split(':')
666
                if header[0] == 'Content-Type' and 'json' in header[1]:
667
                    jsonProductResponse = json.loads(productPage)
668
            productPageSoup= None
669
            if jsonProductResponse is not None:
670
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
671
            else:
672
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 673
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 674
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
675
            productImgUrl = ''
676
            if allproductImageTags is not None and len(allproductImageTags)>0:
677
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
678
            productDetailsSubMap['productCode']=productCode
679
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 680
            '''
16151 manish.sha 681
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
682
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 683
            subOrdersDetails = self.parseSingleSubOrder(orderTrackingPageSoup, emailId, subOrderId)
684
            subOrders = list(set(subOrders + subOrdersDetails))
15509 manish.sha 685
 
15791 manish.sha 686
        return subOrders
15509 manish.sha 687
 
688
    def scrapeStoreOrders(self,):
689
        #collectionMap = {'palcedOn':1}
690
        searchMap = {}
691
        collectionMap = {"orderTrackingUrl":1}
692
        orders = self._getActiveOrders(searchMap,collectionMap)
693
        for order in orders:
694
            print "Order", self.store_name, order['orderId'], order['orderTrackingUrl']
16138 manish.sha 695
            url = ORDER_TRACK_URL +'&'+ order['orderTrackingUrl'].split('trackOrder?')[1]
16141 manish.sha 696
            print url
16249 manish.sha 697
            page = None
698
            retry = 1
699
            while retry <=3: 
700
                try: 
701
                    page = fetchResponseUsingProxy(url)
702
                    break
703
                except:
16250 manish.sha 704
                    traceback.print_exc()
16249 manish.sha 705
                    retry = retry + 1
706
 
15509 manish.sha 707
            soup = BeautifulSoup(page)
708
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
709
            closed = True
16144 manish.sha 710
            orderIdSpan = soup.body.find("span", {'class':'price ord_no'})
711
            if orderIdSpan is not None:
16143 manish.sha 712
                orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
713
                if orderStatusList is not None and len(orderStatusList)>0:
714
                    subOrderId = soup.findAll(attrs={'class':'price ord_no'})[0].text.strip()
715
                    orderStatus = orderStatusList[0].contents[0].strip()
16230 manish.sha 716
                    orderTables = soup.body.findAll("table", {'class':'table product-list'})
16229 manish.sha 717
                    orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16143 manish.sha 718
                    orderTable.pop(0)
719
                    count = 1
720
                    while count <= len(orderTable):
16160 manish.sha 721
                        subbulk = self.db.merchantOrder.initialize_ordered_bulk_op()
16152 manish.sha 722
                        print 'Sub Order Id', str(subOrderId)+'-'+str(count)
16143 manish.sha 723
                        subOrder =  self._isSubOrderActive(order, str(subOrderId)+'-'+str(count))
724
                        if subOrder is None:
725
                            try:
16787 manish.sha 726
                                print 'Email Id:- '+ str(order['orderTrackingUrl'].split('email_id=')[1])+' and Order Id:- ' + str(subOrderId)
16143 manish.sha 727
                                subOrders = self.parseSingleSubOrder(soup, order['orderTrackingUrl'].split('email_id=')[1], subOrderId)
728
                                for subOrder in subOrders:
729
                                    if subOrder is None:
730
                                        continue
731
                                    self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
732
                                    print "Added new suborders to Order id - ", order['orderId']
733
                                    closed = False
734
                            except:
16227 manish.sha 735
                                traceback.print_exc()
16143 manish.sha 736
                                pass
16227 manish.sha 737
                            count = count+1
16143 manish.sha 738
                            continue
739
                        elif subOrder['closed']:
16226 manish.sha 740
                            count = count+1
16143 manish.sha 741
                            continue
742
                        else:
16163 manish.sha 743
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": str(subOrderId)+'-'+str(count)}
16143 manish.sha 744
                            updateMap = {}
745
                            updateMap["subOrders.$.detailedStatus"] = orderStatus
746
                            status = self._getStatusFromDetailedStatus(orderStatus) 
747
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
748
                            if status is not None:
749
                                updateMap["subOrders.$.status"] = status
750
                            if closedStatus:
751
                                #if status is closed then change the paybackStatus accordingly
16155 manish.sha 752
                                print 'Order Closed'
16143 manish.sha 753
                                updateMap["subOrders.$.closed"] = True
754
                                if status == Store.ORDER_DELIVERED:
755
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
756
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
757
                                elif status == Store.ORDER_CANCELLED:
758
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
759
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
760
                            else:
15791 manish.sha 761
                                closed = False
16155 manish.sha 762
                                print 'Order not Closed'
16161 manish.sha 763
 
16158 manish.sha 764
                            subbulk.find(findMap).update({'$set' : updateMap})
765
                            subresult = subbulk.execute()
766
                            tprint(subresult)
16164 manish.sha 767
                        count = count +1
16156 manish.sha 768
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
769
                    result = bulk.execute()
770
                    tprint(result)
16143 manish.sha 771
 
772
                else:
16788 manish.sha 773
                    subOrdersList = []
774
                    try:
775
                        subOrdersList = self.parseMultiSubOrders(soup, order['orderTrackingUrl'].split('email_id=')[1])
776
                    except:
777
                        print 'Unable to parse', order['orderId'], order['orderTrackingUrl']
778
                        continue
16143 manish.sha 779
                    for subOrderObj in subOrdersList:
16159 manish.sha 780
                        subbulk1 = self.db.merchantOrder.initialize_ordered_bulk_op()
16143 manish.sha 781
                        subOrder =  self._isSubOrderActive(order, subOrderObj.merchantSubOrderId)
782
                        if subOrder is None:
783
                            self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrderObj])}}})
784
                            print "Added new suborders to Order id - ", order['orderId']
785
                            closed = False
786
                            continue
787
                        elif subOrder['closed']:
788
                            continue
15791 manish.sha 789
                        else:
16143 manish.sha 790
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
791
                            updateMap = {}
792
                            updateMap["subOrders.$.detailedStatus"] = subOrderObj.detailedStatus
793
                            status = self._getStatusFromDetailedStatus(orderStatus) 
794
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
795
                            if status is not None:
796
                                updateMap["subOrders.$.status"] = status
797
                            if closedStatus:
798
                                #if status is closed then change the paybackStatus accordingly
799
                                updateMap["subOrders.$.closed"] = True
800
                                if status == Store.ORDER_DELIVERED:
801
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
802
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
803
                                elif status == Store.ORDER_CANCELLED:
804
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
805
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
806
                            else:
807
                                closed = False
16159 manish.sha 808
                            subbulk1.find(findMap).update({'$set' : updateMap})
809
                            subresult1 = subbulk1.execute()
810
                            tprint(subresult1)
16156 manish.sha 811
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
812
                    result = bulk.execute()
813
                    tprint(result)
15509 manish.sha 814
            else:
16143 manish.sha 815
                print 'Soup Object not found for this Order', order['orderId'], order['orderTrackingUrl']
816
                continue      
15791 manish.sha 817
 
818
    '''
819
    def getTrackingUrls(self, userId):
820
        missingOrderUrls = ['https://sm.shopclues.com/myaccount','https://sm.shopclues.com/myorders']
821
        return missingOrderUrls
15509 manish.sha 822
 
15791 manish.sha 823
    def parseMyProfileForEmailId(self, userId, url, rawhtml):
824
        profileSoup = BeautifulSoup(rawhtml)
825
        if profileSoup.find('input', {'name':'user_email'}) is not None:
826
            emailId = profileSoup.find('input', {'name':'user_email'})['value']
827
            if emailId is not None and emailId.strip() !='':
828
                mc = MemCache()
829
                mc.set(str(userId), emailId, 600)
830
                return 'EMAIL_SET_SUCCESS'
831
            else:
832
                return 'EMAIL_NOT_FOUND'
833
        else:
834
            return 'EMAIL_NOT_FOUND'
15509 manish.sha 835
 
15791 manish.sha 836
    def parseMyOrdersForEmailId(self, userId, url, rawhtml):
837
        myOrdersPageSoup = BeautifulSoup(rawhtml)
838
        if myOrdersPageSoup.find('a', {'class':'detail'}) is not None:
839
            emailId = myOrdersPageSoup.find('a', {'class':'detail'})['href'].split('&')[1].split('=')[1]
840
            mc = MemCache()
841
            mc.set(str(userId), emailId, 600)
842
            return 'EMAIL_SET_SUCCESS'
843
        else:
844
            return 'EMAIL_NOT_FOUND'
845
    '''        
846
 
16420 manish.sha 847
def to_py_date(java_timestamp):
16424 manish.sha 848
    date = datetime.fromtimestamp(java_timestamp)
16420 manish.sha 849
    return date       
15791 manish.sha 850
 
15509 manish.sha 851
def todict(obj, classkey=None):
852
    if isinstance(obj, dict):
853
        data = {}
854
        for (k, v) in obj.items():
855
            data[k] = todict(v, classkey)
856
        return data
857
    elif hasattr(obj, "_ast"):
858
        return todict(obj._ast())
859
    elif hasattr(obj, "__iter__"):
860
        return [todict(v, classkey) for v in obj]
861
    elif hasattr(obj, "__dict__"):
862
        data = dict([(key, todict(value, classkey)) 
863
            for key, value in obj.__dict__.iteritems() 
864
            if not callable(value) and not key.startswith('_')])
865
        if classkey is not None and hasattr(obj, "__class__"):
866
            data[classkey] = obj.__class__.__name__
867
        return data
868
    else:
16226 manish.sha 869
        return obj
870
 
871
def login(url):
872
    br = getBrowserObject()
16787 manish.sha 873
    br.set_proxies({"http": PROXY_MESH_GENERAL})
16226 manish.sha 874
    br.open(url)
875
    response = br.open(url)
876
    ungzipResponseBr(response, br)
877
    #html = response.read()
878
    #print html
879
    br.select_form(nr=0)
880
    br.form['user'] = "imanthetester@gmail.com"
881
    br.form['password'] = "$Dl8uk"
882
    response = br.submit()
883
    print "********************"
884
    print "Attempting to Login"
885
    print "********************"
886
    #ungzipResponse(response, br)
887
    return br
15791 manish.sha 888
 
16226 manish.sha 889
def ungzipResponseBr(r,b):
890
    headers = r.info()
891
    if headers['Content-Encoding']=='gzip':
892
        import gzip
893
        print "********************"
894
        print "Deflating gzip response"
895
        print "********************"
896
        gz = gzip.GzipFile(fileobj=r, mode='rb')
897
        html = gz.read()
898
        gz.close()
899
        headers["Content-type"] = "text/html; charset=utf-8"
900
        r.set_data( html )
901
        b.set_response(r)    
902
 
15509 manish.sha 903