Subversion Repositories SmartDukaan

Rev

Rev 18384 | Rev 19349 | 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')
18384 amit.gupta 314
            subOrder.maxNlc = dealRank.get('maxNlc')
315
            subOrder.minNlc = dealRank.get('minNlc')
316
            subOrder.db = dealRank.get('dp')
317
            subOrder.itemStatus = dealRank.get('status')
16888 manish.sha 318
            subOrders.append(subOrder)
319
        else:
320
            productSearch = fetchResponseUsingProxy(BASE_MURL+'/search?q='+productCode.strip())
321
            productSearchResultPage = BeautifulSoup(productSearch)
322
            productUrl = str(productSearchResultPage.find('a', {'class':'pd-list'})['href'])
323
            style = productSearchResultPage.find('div', {'class':'pd-image'})['style']
324
            imageurl = str(re.findall('url\(\"(.*?)\"\)', style)[0])
325
            productName = str(productSearchResultPage.find('div', {'class':'pdt-name'}).text)
326
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
327
            subOrder.merchantSubOrderId = str(merchantOrderId)+'-1'
328
            subOrder.detailedStatus = Store.OrderStatusConfirmationMap.get(str(orderObj['0']['status']))
329
            subOrder.imgUrl = imageurl
330
            subOrder.offerDiscount = totalDiscount
331
            subOrder.unitPrice = totalOrdersAmount
332
            subOrder.productCode = productCode
333
            subOrder.amountPaid = subtotal
334
            subOrder.quantity = 1
335
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ str(orderObj['0']['email'])
336
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
337
            subOrder.dealRank = 0
338
            subOrder.rankDesc = 'Not Applicable'
339
            subOrders.append(subOrder)
340
 
341
        merchantOrder.totalAmount = totalOrdersAmount
342
        merchantOrder.discountApplied = totalDiscount
343
        merchantOrder.deliveryCharges = ordershippingcost
344
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
345
 
346
        return merchantOrder
347
 
348
    def _parseMultiOrderUsingJsonWithoutItems(self, orderId, userId, subTagId, orderObj, orderSuccessUrl):
349
        pass
350
        '''
351
        subOrders=[]
352
 
353
        ordertotal = long(float(orderObj['0']['total']))
354
        ordershippingcost = long(float(orderObj['0']['shipping_cost']))
355
        subtotal = ordertotal-ordershippingcost
356
        placedOn = str(orderObj['0']['last_update'])
357
        totalDiscount = long(float(orderObj['0']['discount']))
358
        totalOrdersAmount = (ordertotal + totalDiscount) - ordershippingcost 
359
        merchantOrderId = orderObj['0']['order_id']
360
        promotionids = orderObj['0']['promotion_ids'].split(',')
361
        promotions = orderObj['0']['promotions']
362
 
363
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
364
        merchantOrder.placedOn = placedOn
365
        merchantOrder.merchantOrderId = str(merchantOrderId)
366
        merchantOrder.paidAmount = ordertotal
367
 
368
 
369
        for promotionId in promotionids:
370
            promotion = promotions[promotionId]
371
            productCode = str(promotion['bonuses'][0]['value'])
372
            skuData = Mongo.getItemByMerchantIdentifier(productCode, 5)
373
 
374
 
375
        return None
376
        '''
377
 
15947 manish.sha 378
    def _parseOrders(self, orderId, mpOrderId, subTagId, userId, page, orderSuccessUrl, orderObj):
15509 manish.sha 379
        soup = BeautifulSoup(page)
380
        productDetailsMap = {}
381
        paymentFields = soup.findAll(attrs={'class' : 'box_paymentcalculations_row'})
382
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15948 manish.sha 383
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
15509 manish.sha 384
        ordersubtotal=0
385
        ordercluebucks=0
386
        ordershippingcost=0
387
        ordertotal=0
388
 
389
        for val in paymentFields:
390
            for value in val.contents:
391
                if value is not None:
392
                    if 'div' in str(value).strip():
393
                        if 'Subtotal' in value.text.strip():
15981 manish.sha 394
                            ordersubtotal = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 395
                            print 'Order SubTotal:- ',ordersubtotal
15509 manish.sha 396
                        if 'Shipping Cost' in value.text.strip():
15981 manish.sha 397
                            ordershippingcost = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 398
                            print 'Shipping Cost:- ',ordershippingcost
15509 manish.sha 399
                        if 'Clue' in value.text.strip():
15981 manish.sha 400
                            ordercluebucks = long(val.contents[3].text.strip().replace("Rs.","").replace(',',''))
16165 manish.sha 401
                            print 'Clue bucks:- ',ordercluebucks
15509 manish.sha 402
                        if 'Total' in value.text.strip():
15791 manish.sha 403
                            ordertotal = val.contents[3].text.strip().replace("Rs.","")
404
                            ordertotal = ordertotal.replace(',','')
16165 manish.sha 405
                            print 'Order Total:- ',ordertotal
15791 manish.sha 406
 
407
        if orderObj['0']['is_parent_order'] == 'N':
15947 manish.sha 408
            productDetailsMap = self._getSingleSubOrderMap(mpOrderId, soup, orderObj)
15509 manish.sha 409
        else:
16420 manish.sha 410
            if orderObj['0']['items'].values()[0]['child'] is None:
411
                productDetailsMap = self._getSingleSubOrderMap(mpOrderId, soup, orderObj)
412
            else:
413
                productDetailsMap = self._getMultiSubOrdersMap(mpOrderId, soup, orderObj)
15509 manish.sha 414
 
15791 manish.sha 415
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
15509 manish.sha 416
        merchantOrder.placedOn = placedOn
15791 manish.sha 417
        merchantOrder.merchantOrderId = orderObj['0']['order_id']
15509 manish.sha 418
        merchantOrder.paidAmount = ordertotal
419
        totalOrdersAmount = 0
420
        totalDiscount = 0
421
        subOrders= []
16281 manish.sha 422
        if len(productDetailsMap)==0:
423
            print 'Unable to get Sub Orders for Now:- ',orderObj['0']['order_id']
15509 manish.sha 424
        for key in productDetailsMap:
425
            subOrderDetail = productDetailsMap.get(key)
426
            totalOrdersAmount = totalOrdersAmount  + (subOrderDetail['sellingPrice'] * subOrderDetail['quantity'])
427
            totalDiscount = totalDiscount + (subOrderDetail['discount'] * subOrderDetail['quantity'])
428
            subOrder = SubOrder(subOrderDetail['productName'], subOrderDetail['productUrl'], placedOn, subOrderDetail['subtotal'])
429
            subOrder.merchantSubOrderId = key
430
            subOrder.detailedStatus = subOrderDetail['subOrderStatus']
431
            subOrder.imgUrl = subOrderDetail['imgUrl']
432
            subOrder.offerDiscount = subOrderDetail['discount'] * subOrderDetail['quantity']
433
            subOrder.unitPrice = subOrderDetail['sellingPrice']
434
            subOrder.productCode = subOrderDetail['productCode']
435
            subOrder.amountPaid = subOrderDetail['subtotal']
436
            subOrder.quantity = subOrderDetail['quantity']
15791 manish.sha 437
            subOrder.tracingkUrl = subOrderDetail['subOrderTrackingUrl']
16097 manish.sha 438
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
439
            subOrder.dealRank = dealRank.get('rank')
440
            subOrder.rankDesc = dealRank.get('description')
16283 amit.gupta 441
            subOrder.maxNlc = dealRank.get('maxNlc')
442
            subOrder.minNlc = dealRank.get('minNlc')
443
            subOrder.db = dealRank.get('dp')
444
            subOrder.itemStatus = dealRank.get('status')
15509 manish.sha 445
            subOrders.append(subOrder)
446
        merchantOrder.totalAmount = totalOrdersAmount
447
        merchantOrder.discountApplied = totalDiscount
448
        merchantOrder.deliveryCharges = ordershippingcost
449
        merchantOrder.subOrders = self.updateCashbackInSubOrders(subOrders)
450
 
451
        return merchantOrder
452
 
453
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
454
        resp = {}
455
        try:
15791 manish.sha 456
            rawHtmlSoup = BeautifulSoup(rawHtml)
457
            emailId = None
458
            orderObj = None
459
            merchantOrderId = None
460
            for script in rawHtmlSoup.find_all('script'):
461
                if 'orderConfirmation' in script.text:
18086 manish.sha 462
                    print script.text.strip().split('\n')[0].split('orderConfirmation = ')[1]
463
                    orderStr = script.text.strip().split('\n')[0].split('orderConfirmation = ')[1]
464
                    orderStr = orderStr[:-1]
465
                    orderObj = json.loads(orderStr)
15791 manish.sha 466
                    if merchantOrderId is None:
467
                        merchantOrderId = orderObj['0']['order_id']
468
                        emailId = orderObj['0']['email']
16197 manish.sha 469
            if orderObj is None or merchantOrderId is None:
16226 manish.sha 470
                orderIdDiv = rawHtmlSoup.body.find("div", {'class':'conf_succes'})
471
                if orderIdDiv is None:
472
                    orderIdArt = rawHtmlSoup.body.find("article", {'class':'white'})
473
                    if orderIdArt is None:
18062 manish.sha 474
                        otpInput = rawHtmlSoup.body.find("input", {'id':'cod_otp'})
475
                        if otpInput is None:
476
                            resp['result'] = 'ORDER_NOT_CREATED_UNKNOWN'
477
                            return resp
478
                        else:
479
                            resp['result'] = 'ORDER_IGNORED_OTP'
480
                            return resp
16226 manish.sha 481
                    else:
482
                        orderIdDiv= orderIdArt.find('p', recursive=False)
483
                        orderIdVal = str(orderIdDiv.text.split(' : ')[1])
484
                        print "Opening Shopclues Login Page"
18086 manish.sha 485
                        login_url = "https://smo.shopclues.com/login"
16226 manish.sha 486
                        br1 = login(login_url)
18086 manish.sha 487
                        orderDetailPage = br1.open("https://smo.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
16226 manish.sha 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']
18086 manish.sha 496
                        logoutpage = br1.open("https://smo.shopclues.com/logout")
16226 manish.sha 497
                        print br1.geturl()
498
                else:
499
                    orderIdDiv= orderIdDiv.find('div', recursive=False)
500
                    orderIdVal = str(orderIdDiv.span.text)
501
                    print "Opening Shopclues Login Page"
18086 manish.sha 502
                    login_url = "https://smo.shopclues.com/login"
16226 manish.sha 503
                    br1 = login(login_url)
18086 manish.sha 504
                    orderDetailPage = br1.open("https://smo.shopclues.com/orderconfirmation?order_id="+orderIdVal+"&status=P")
16226 manish.sha 505
                    orderDetailPage = ungzipResponse(orderDetailPage)
506
                    rawHtmlSoup = BeautifulSoup(orderDetailPage)
507
                    for script in rawHtmlSoup.find_all('script'):
508
                        if 'orderConfirmation' in script.text:
509
                            orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
510
                            if merchantOrderId is None:
511
                                merchantOrderId = orderObj['0']['order_id']
512
                                emailId = orderObj['0']['email']
18086 manish.sha 513
                    logoutpage = br1.open("https://smo.shopclues.com/logout")
16226 manish.sha 514
                    print br1.geturl()
515
 
16275 manish.sha 516
            if type(orderObj['0']['items']) is list:
517
                print "Opening Shopclues Login Page"
18086 manish.sha 518
                login_url = "https://smo.shopclues.com/login"
16275 manish.sha 519
                br1 = login(login_url)
18086 manish.sha 520
                orderDetailPage = br1.open("https://smo.shopclues.com/orderconfirmation?order_id="+str(merchantOrderId)+"&status=P")
16275 manish.sha 521
                orderDetailPage = ungzipResponse(orderDetailPage)
522
                rawHtmlSoup = BeautifulSoup(orderDetailPage)
523
                for script in rawHtmlSoup.find_all('script'):
524
                    if 'orderConfirmation' in script.text:
525
                        orderObj = json.loads(script.text.strip().split('\n')[0].split('orderConfirmation = ')[1].split(';')[0])
526
                        if merchantOrderId is None:
527
                            merchantOrderId = orderObj['0']['order_id']
528
                            emailId = orderObj['0']['email']
18086 manish.sha 529
                logoutpage = br1.open("https://smo.shopclues.com/logout")
16275 manish.sha 530
                print br1.geturl()
531
 
15509 manish.sha 532
            br = getBrowserObject()
15791 manish.sha 533
            url = ORDER_TRACK_URL +'&order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 534
            page = br.open(url)
16889 manish.sha 535
            print 'Track Order Url ', br.geturl()
16890 manish.sha 536
            if type(orderObj['0']['items']) is list:
537
                if len(orderObj['0']['promotions'])==1:
538
                    merchantOrder = self._parseSingleOrderUsingJsonWithoutItems(orderId, userId, subTagId, orderObj, orderSuccessUrl)
539
                    merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
540
                    if self._saveToOrder(todict(merchantOrder)):
541
                        resp['result'] = 'ORDER_CREATED'
542
                        return resp
543
                    else:
544
                        resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
545
                        return resp
16888 manish.sha 546
                    '''
547
                    else:
548
                        resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
549
                        return resp
550
 
551
                    elif len(orderObj['0']['promotions'])>1:
552
                        merchantOrder = self._parseMultiOrderUsingJsonWithoutItems(orderId, userId, subTagId, orderObj, orderSuccessUrl)
553
                    '''
554
 
15509 manish.sha 555
            headers = str(page.info()).split('\n')
556
            page = ungzipResponse(page)
557
            jsonResponse = None
558
            for header in headers:
559
                header = header.split(':')
560
                if header[0] == 'Content-Type' and 'json' in header[1]:
561
                    jsonResponse = json.loads(page)
562
            if jsonResponse is not None:
563
                page = jsonResponse['text']
564
 
16370 manish.sha 565
            merchantOrder = self._parseOrders(orderId, merchantOrderId, subTagId, userId, page, orderSuccessUrl, orderObj) 
15509 manish.sha 566
 
15948 manish.sha 567
            merchantOrder.orderTrackingUrl = ORDER_TRACK_URL_DB + 'order_id=' +str(merchantOrderId)+'&email_id='+ emailId
15509 manish.sha 568
 
569
            if self._saveToOrder(todict(merchantOrder)):
570
                resp['result'] = 'ORDER_CREATED'
571
            else:
572
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
573
 
574
            return resp
575
        except:
576
            print "Error occurred"
577
            traceback.print_exc()
578
            resp['result'] = 'ORDER_NOT_CREATED'
16120 manish.sha 579
            return resp
15509 manish.sha 580
 
15791 manish.sha 581
    def parseSingleSubOrder(self, soup, emailId, subOrderId):
582
        orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
583
        subOrderStatus = orderStatusList[0].contents[0].strip()
15509 manish.sha 584
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
16230 manish.sha 585
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("\r","").replace("  ","")
586
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
587
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)    
15791 manish.sha 588
        firstRow = orderTable.pop(0)
15949 manish.sha 589
        totalColumns = len(firstRow.find_all('th'))
15791 manish.sha 590
        subOrders =[]
591
        count =1   
15509 manish.sha 592
        for orderTr in orderTable:
593
            cols = orderTr.find_all('td')
594
            product_details = cols[0].find_all('a')
595
            #print product_details
596
            productUrl = product_details[0].get('href')
597
            productName = product_details[0].contents[0].strip()
598
            quantity = int(cols[1].text.strip())
15980 manish.sha 599
            sellingPrice = long(cols[2].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 600
            discount = 0
601
            subtotal = 0
602
            if totalColumns == 5:
15949 manish.sha 603
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
15980 manish.sha 604
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 605
                else:
606
                    discount = 0
15980 manish.sha 607
                subtotal = long(cols[4].text.strip().replace("Rs.","").replace(',',''))
17100 manish.sha 608
            elif totalColumns == 6:
609
                if cols[3].text.strip()!='-' and 'Rs.' in cols[3].text.strip():
610
                    discount = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
611
                else:
612
                    discount = 0
613
                subtotal = long(cols[5].text.strip().replace("Rs.","").replace(',',''))
15791 manish.sha 614
            else:
15980 manish.sha 615
                subtotal = long(cols[3].text.strip().replace("Rs.","").replace(',',''))
16151 manish.sha 616
            productPage = fetchResponseUsingProxy(BASE_MURL+productUrl)
617
            productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 618
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 619
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
620
            productImgUrl = ''
621
            if allproductImageTags is not None and len(allproductImageTags)>0:
622
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
623
 
624
            subOrder = SubOrder(productName, productUrl, placedOn, subtotal)
15791 manish.sha 625
            subOrder.merchantSubOrderId = str(subOrderId)+'-'+str(count)
15509 manish.sha 626
            subOrder.detailedStatus = subOrderStatus
627
            subOrder.imgUrl = productImgUrl
628
            subOrder.offerDiscount = discount*quantity
629
            subOrder.unitPrice = sellingPrice
630
            subOrder.productCode = productCode
631
            subOrder.amountPaid = subtotal
632
            subOrder.quantity = quantity
15791 manish.sha 633
            subOrder.tracingkUrl = ORDER_TRACK_URL_DB +  'order_id=' +subOrderId+'&email_id='+ emailId
15509 manish.sha 634
            subOrders.append(subOrder)
15791 manish.sha 635
            count = count +1
15509 manish.sha 636
 
637
        subOrders = self.updateCashbackInSubOrders(subOrders)
15791 manish.sha 638
        return subOrders
15509 manish.sha 639
 
15791 manish.sha 640
    def parseMultiSubOrders(self, soup, emailId):
16230 manish.sha 641
        orderTables = soup.body.findAll("table", {'class':'table product-list'})
642
        orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16145 manish.sha 643
        firstRow = orderTable.pop(0)
15791 manish.sha 644
        '''
645
        totalColumns = len(firstRow.find_all('td'))
646
 
15509 manish.sha 647
        orderDateList = soup.findAll(attrs={'class':'price ord_date'})
15791 manish.sha 648
        placedOn= orderDateList[0].text.strip().replace("\t","").replace("\n","").replace("  ","")
649
        '''    
15509 manish.sha 650
        subOrders = []
15791 manish.sha 651
        existingOrders = []
15509 manish.sha 652
        for orderTr in orderTable:
653
            cols = orderTr.find_all('td')
654
            product_details = cols[0].find_all('a')
655
            #print product_details
656
            subOrderId= product_details[1].contents[0].strip()
15791 manish.sha 657
            if subOrderId in existingOrders:
658
                continue
659
            else:
660
                existingOrders.append(subOrderId)
661
            '''
15509 manish.sha 662
            productUrl = product_details[0].get('href')
663
            productName = product_details[0].contents[0].strip()
15791 manish.sha 664
            '''
665
            subOrderTrackingParsingUrl = product_details[1].get('href')
666
            #subOrderTrackingUrl = subOrderTrackingParsingUrl.split('order_lookup.details&')[1]
667
            '''
15509 manish.sha 668
            quantity = int(cols[1].text.strip())
669
            sellingPrice = long(cols[2].text.strip().replace("Rs.",""))
15791 manish.sha 670
            discount = 0
671
            subtotal = 0
672
            if totalColumns == 5:
673
                if cols[3].text.strip()!='-' or 'Rs.' in cols[3].text.strip():
674
                    discount = long(cols[3].text.strip().replace("Rs.",""))
675
                else:
676
                    discount = 0
677
                subtotal = long(cols[4].text.strip().replace("Rs.",""))
678
            else:
679
                subtotal = long(cols[3].text.strip().replace("Rs.",""))
680
 
15509 manish.sha 681
            br = getBrowserObject()
682
            productPage = br.open(BASE_MURL+productUrl)
683
            productPageHeaders = str(productPage.info()).split('\n')
684
            productPage = ungzipResponse(productPage)
685
            jsonProductResponse = None
686
            for header in productPageHeaders:
687
                header = header.split(':')
688
                if header[0] == 'Content-Type' and 'json' in header[1]:
689
                    jsonProductResponse = json.loads(productPage)
690
            productPageSoup= None
691
            if jsonProductResponse is not None:
692
                productPageSoup = BeautifulSoup(jsonProductResponse['text'])
693
            else:
694
                productPageSoup = BeautifulSoup(productPage)
15791 manish.sha 695
            productCode = productPageSoup.find('input', {'type':'hidden'})['value']
15509 manish.sha 696
            allproductImageTags = productPageSoup.findAll(attrs={'class' : 'pd-image'})
697
            productImgUrl = ''
698
            if allproductImageTags is not None and len(allproductImageTags)>0:
699
                productImgUrl= allproductImageTags[0].get('style').split("background:url('")[1].split("')no-repeat center")[0].strip()
700
            productDetailsSubMap['productCode']=productCode
701
            productDetailsSubMap['imgUrl']=productImgUrl
15791 manish.sha 702
            '''
16151 manish.sha 703
            orderTrackingPage = fetchResponseUsingProxy(BASE_URL+subOrderTrackingParsingUrl)
704
            orderTrackingPageSoup = BeautifulSoup(orderTrackingPage)
15791 manish.sha 705
            subOrdersDetails = self.parseSingleSubOrder(orderTrackingPageSoup, emailId, subOrderId)
706
            subOrders = list(set(subOrders + subOrdersDetails))
15509 manish.sha 707
 
15791 manish.sha 708
        return subOrders
15509 manish.sha 709
 
710
    def scrapeStoreOrders(self,):
711
        #collectionMap = {'palcedOn':1}
712
        searchMap = {}
713
        collectionMap = {"orderTrackingUrl":1}
714
        orders = self._getActiveOrders(searchMap,collectionMap)
715
        for order in orders:
716
            print "Order", self.store_name, order['orderId'], order['orderTrackingUrl']
18575 manish.sha 717
            url = ORDER_TRACK_URL
718
            if 'trackOrder' in order['orderTrackingUrl']:
719
                url = url +'&'+ order['orderTrackingUrl'].split('trackOrder?')[1]
720
            else:
721
                url = url +'&'+ order['orderTrackingUrl'].split('msgorderdetails?')[1]
16141 manish.sha 722
            print url
16249 manish.sha 723
            page = None
724
            retry = 1
725
            while retry <=3: 
726
                try: 
727
                    page = fetchResponseUsingProxy(url)
728
                    break
729
                except:
16250 manish.sha 730
                    traceback.print_exc()
16249 manish.sha 731
                    retry = retry + 1
732
 
15509 manish.sha 733
            soup = BeautifulSoup(page)
734
            bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
735
            closed = True
16144 manish.sha 736
            orderIdSpan = soup.body.find("span", {'class':'price ord_no'})
737
            if orderIdSpan is not None:
16143 manish.sha 738
                orderStatusList = soup.findAll(attrs={'class' : 'price ord_status'})
739
                if orderStatusList is not None and len(orderStatusList)>0:
740
                    subOrderId = soup.findAll(attrs={'class':'price ord_no'})[0].text.strip()
741
                    orderStatus = orderStatusList[0].contents[0].strip()
16230 manish.sha 742
                    orderTables = soup.body.findAll("table", {'class':'table product-list'})
16229 manish.sha 743
                    orderTable = orderTables[len(orderTables)-1].findAll('tr', recursive=False)
16143 manish.sha 744
                    orderTable.pop(0)
745
                    count = 1
746
                    while count <= len(orderTable):
16160 manish.sha 747
                        subbulk = self.db.merchantOrder.initialize_ordered_bulk_op()
16152 manish.sha 748
                        print 'Sub Order Id', str(subOrderId)+'-'+str(count)
16143 manish.sha 749
                        subOrder =  self._isSubOrderActive(order, str(subOrderId)+'-'+str(count))
750
                        if subOrder is None:
751
                            try:
16787 manish.sha 752
                                print 'Email Id:- '+ str(order['orderTrackingUrl'].split('email_id=')[1])+' and Order Id:- ' + str(subOrderId)
16143 manish.sha 753
                                subOrders = self.parseSingleSubOrder(soup, order['orderTrackingUrl'].split('email_id=')[1], subOrderId)
754
                                for subOrder in subOrders:
755
                                    if subOrder is None:
756
                                        continue
757
                                    self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
758
                                    print "Added new suborders to Order id - ", order['orderId']
759
                                    closed = False
760
                            except:
16227 manish.sha 761
                                traceback.print_exc()
16143 manish.sha 762
                                pass
16227 manish.sha 763
                            count = count+1
16143 manish.sha 764
                            continue
765
                        elif subOrder['closed']:
16226 manish.sha 766
                            count = count+1
16143 manish.sha 767
                            continue
768
                        else:
16163 manish.sha 769
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": str(subOrderId)+'-'+str(count)}
16143 manish.sha 770
                            updateMap = {}
771
                            updateMap["subOrders.$.detailedStatus"] = orderStatus
772
                            status = self._getStatusFromDetailedStatus(orderStatus) 
773
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
774
                            if status is not None:
775
                                updateMap["subOrders.$.status"] = status
776
                            if closedStatus:
777
                                #if status is closed then change the paybackStatus accordingly
16155 manish.sha 778
                                print 'Order Closed'
16143 manish.sha 779
                                updateMap["subOrders.$.closed"] = True
780
                                if status == Store.ORDER_DELIVERED:
781
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
782
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
783
                                elif status == Store.ORDER_CANCELLED:
784
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
785
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
786
                            else:
15791 manish.sha 787
                                closed = False
16155 manish.sha 788
                                print 'Order not Closed'
16161 manish.sha 789
 
16158 manish.sha 790
                            subbulk.find(findMap).update({'$set' : updateMap})
791
                            subresult = subbulk.execute()
792
                            tprint(subresult)
16164 manish.sha 793
                        count = count +1
16156 manish.sha 794
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
795
                    result = bulk.execute()
796
                    tprint(result)
16143 manish.sha 797
 
798
                else:
16788 manish.sha 799
                    subOrdersList = []
800
                    try:
801
                        subOrdersList = self.parseMultiSubOrders(soup, order['orderTrackingUrl'].split('email_id=')[1])
802
                    except:
803
                        print 'Unable to parse', order['orderId'], order['orderTrackingUrl']
804
                        continue
16143 manish.sha 805
                    for subOrderObj in subOrdersList:
16159 manish.sha 806
                        subbulk1 = self.db.merchantOrder.initialize_ordered_bulk_op()
16143 manish.sha 807
                        subOrder =  self._isSubOrderActive(order, subOrderObj.merchantSubOrderId)
808
                        if subOrder is None:
809
                            self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrderObj])}}})
810
                            print "Added new suborders to Order id - ", order['orderId']
811
                            closed = False
812
                            continue
813
                        elif subOrder['closed']:
814
                            continue
15791 manish.sha 815
                        else:
16143 manish.sha 816
                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": subOrderId}
817
                            updateMap = {}
818
                            updateMap["subOrders.$.detailedStatus"] = subOrderObj.detailedStatus
819
                            status = self._getStatusFromDetailedStatus(orderStatus) 
820
                            closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
821
                            if status is not None:
822
                                updateMap["subOrders.$.status"] = status
823
                            if closedStatus:
824
                                #if status is closed then change the paybackStatus accordingly
825
                                updateMap["subOrders.$.closed"] = True
826
                                if status == Store.ORDER_DELIVERED:
827
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
828
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
829
                                elif status == Store.ORDER_CANCELLED:
830
                                    if subOrder.get("cashBackStatus") == Store.CB_PENDING:
831
                                        updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
832
                            else:
833
                                closed = False
16159 manish.sha 834
                            subbulk1.find(findMap).update({'$set' : updateMap})
835
                            subresult1 = subbulk1.execute()
836
                            tprint(subresult1)
16156 manish.sha 837
                    bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
838
                    result = bulk.execute()
839
                    tprint(result)
15509 manish.sha 840
            else:
16143 manish.sha 841
                print 'Soup Object not found for this Order', order['orderId'], order['orderTrackingUrl']
842
                continue      
15791 manish.sha 843
 
844
    '''
845
    def getTrackingUrls(self, userId):
18086 manish.sha 846
        missingOrderUrls = ['https://smo.shopclues.com/myaccount','https://smo.shopclues.com/myorders']
15791 manish.sha 847
        return missingOrderUrls
15509 manish.sha 848
 
15791 manish.sha 849
    def parseMyProfileForEmailId(self, userId, url, rawhtml):
850
        profileSoup = BeautifulSoup(rawhtml)
851
        if profileSoup.find('input', {'name':'user_email'}) is not None:
852
            emailId = profileSoup.find('input', {'name':'user_email'})['value']
853
            if emailId is not None and emailId.strip() !='':
854
                mc = MemCache()
855
                mc.set(str(userId), emailId, 600)
856
                return 'EMAIL_SET_SUCCESS'
857
            else:
858
                return 'EMAIL_NOT_FOUND'
859
        else:
860
            return 'EMAIL_NOT_FOUND'
15509 manish.sha 861
 
15791 manish.sha 862
    def parseMyOrdersForEmailId(self, userId, url, rawhtml):
863
        myOrdersPageSoup = BeautifulSoup(rawhtml)
864
        if myOrdersPageSoup.find('a', {'class':'detail'}) is not None:
865
            emailId = myOrdersPageSoup.find('a', {'class':'detail'})['href'].split('&')[1].split('=')[1]
866
            mc = MemCache()
867
            mc.set(str(userId), emailId, 600)
868
            return 'EMAIL_SET_SUCCESS'
869
        else:
870
            return 'EMAIL_NOT_FOUND'
871
    '''        
872
 
16420 manish.sha 873
def to_py_date(java_timestamp):
16424 manish.sha 874
    date = datetime.fromtimestamp(java_timestamp)
16420 manish.sha 875
    return date       
15791 manish.sha 876
 
15509 manish.sha 877
def todict(obj, classkey=None):
878
    if isinstance(obj, dict):
879
        data = {}
880
        for (k, v) in obj.items():
881
            data[k] = todict(v, classkey)
882
        return data
883
    elif hasattr(obj, "_ast"):
884
        return todict(obj._ast())
885
    elif hasattr(obj, "__iter__"):
886
        return [todict(v, classkey) for v in obj]
887
    elif hasattr(obj, "__dict__"):
888
        data = dict([(key, todict(value, classkey)) 
889
            for key, value in obj.__dict__.iteritems() 
890
            if not callable(value) and not key.startswith('_')])
891
        if classkey is not None and hasattr(obj, "__class__"):
892
            data[classkey] = obj.__class__.__name__
893
        return data
894
    else:
16226 manish.sha 895
        return obj
896
 
897
def login(url):
898
    br = getBrowserObject()
16787 manish.sha 899
    br.set_proxies({"http": PROXY_MESH_GENERAL})
16226 manish.sha 900
    br.open(url)
901
    response = br.open(url)
902
    ungzipResponseBr(response, br)
903
    #html = response.read()
904
    #print html
905
    br.select_form(nr=0)
906
    br.form['user'] = "imanthetester@gmail.com"
907
    br.form['password'] = "$Dl8uk"
908
    response = br.submit()
909
    print "********************"
910
    print "Attempting to Login"
911
    print "********************"
912
    #ungzipResponse(response, br)
913
    return br
15791 manish.sha 914
 
16226 manish.sha 915
def ungzipResponseBr(r,b):
916
    headers = r.info()
917
    if headers['Content-Encoding']=='gzip':
918
        import gzip
919
        print "********************"
920
        print "Deflating gzip response"
921
        print "********************"
922
        gz = gzip.GzipFile(fileobj=r, mode='rb')
923
        html = gz.read()
924
        gz.close()
925
        headers["Content-type"] = "text/html; charset=utf-8"
926
        r.set_data( html )
927
        b.set_response(r)    
928
 
15509 manish.sha 929