Subversion Repositories SmartDukaan

Rev

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