Subversion Repositories SmartDukaan

Rev

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