Subversion Repositories SmartDukaan

Rev

Rev 20393 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13569 amit.gupta 1
'''
2
Created on Jan 15, 2015
3
 
4
@author: amit
5
'''
14854 amit.gupta 6
from bs4 import BeautifulSoup
13569 amit.gupta 7
from bson.binary import Binary
13680 amit.gupta 8
from datetime import datetime, date, timedelta
13569 amit.gupta 9
from dtr import main
16975 amit.gupta 10
from dtr.api.Service import Orders
13576 amit.gupta 11
from dtr.dao import AffiliateInfo, Order, SubOrder
14398 amit.gupta 12
from dtr.main import getBrowserObject, ScrapeException, getStore, ParseException, \
13
    Store as MStore, ungzipResponse, tprint
14415 amit.gupta 14
from dtr.storage import Mongo
17387 amit.gupta 15
from dtr.storage.DataService import Order_Parse_Info, All_user_addresses, \
16
    OrdersRaw
15350 amit.gupta 17
from dtr.storage.Mongo import getImgSrc, getDealRank
16946 amit.gupta 18
from dtr.utils import utils
17387 amit.gupta 19
from dtr.utils.utils import fetchResponseUsingProxy, readSSh
16975 amit.gupta 20
from elixir import *
13662 amit.gupta 21
from pprint import pprint
13569 amit.gupta 22
from pymongo import MongoClient
17387 amit.gupta 23
from pyquery import PyQuery
15350 amit.gupta 24
from urlparse import urlparse, parse_qs
16946 amit.gupta 25
from xlrd import open_workbook
16975 amit.gupta 26
import csv
13569 amit.gupta 27
import json
16946 amit.gupta 28
import os.path
13569 amit.gupta 29
import pymongo
30
import re
14443 amit.gupta 31
import time
13662 amit.gupta 32
import traceback
13569 amit.gupta 33
import urllib
17667 amit.gupta 34
import urllib2
13603 amit.gupta 35
 
13721 amit.gupta 36
USERNAME='profittill2@gmail.com'
13569 amit.gupta 37
PASSWORD='spice@2020'
16946 amit.gupta 38
AFFILIATE_URL='http://affiliate.snapdeal.com/login/'
13569 amit.gupta 39
POST_URL='https://api-p03.hasoffers.com/v3/Affiliate_Report.json'
40
ORDER_TRACK_URL='https://m.snapdeal.com/orderSummary'
41
CONFIG_URL='http://affiliate.snapdeal.com/publisher/js/config.php'
42
 
17667 amit.gupta 43
#NEW_REPORT_URI_TEMPLATE = "http://affiliate.snapdeal.com/affiliate/reports/orders/report/?fromDate=%s&toDate=%s&dump_report=True&request_type=product&status=%s"
44
AFF_URL_TEMPLATE = "http://affiliate-feeds.snapdeal.com/feed/api/order?startDate=%s&endDate=%s&status=%s"
16946 amit.gupta 45
#"http://affiliate.snapdeal.com/affiliate/reports/orders/report/?fromDate=2015-04-01&toDate=2015-09-15&dump_report=True&request_type=product&status=cancelled
46
#"http://affiliate.snapdeal.com/affiliate/reports/orders/report/?fromDate=07-09-2015&toDate=13-09-2015&dump_report=True&request_type=product&status=cancelled
47
 
17667 amit.gupta 48
AFF_ID = "33550"
49
AFF_TOKEN="66d526141b9d39c4b2b4ff76eadc34"
50
 
20158 naman 51
headers = { 
52
            'User-agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25',
53
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
54
            'Accept-Language' : 'en-US,en;q=0.8',                     
55
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
56
            'Connection':'keep-alive',
57
            'Accept-Encoding' : 'gzip,deflate,sdch'
58
        }
59
 
13662 amit.gupta 60
class Store(MStore):
13569 amit.gupta 61
 
62
    '''
63
    This is to map order statuses of our system to order statuses of snapdeal.
64
    And our statuses will change accordingly.
65
 
66
    '''
67
    OrderStatusMap = {
17394 amit.gupta 68
                      MStore.ORDER_PLACED : ['in progress', 'pending for verification', 'not available', 'in process', 
69
                                             'processing', 'processed', 'under verification', 'readying for dispatch',
20159 naman 70
                                             'waiting for courier to pick up', 'processing initiated','prepared for dispatch','dispatching soon',                                        
20162 naman 71
                                             'item packed. dispatching soon.','cancellation requested'],
17394 amit.gupta 72
                      MStore.ORDER_DELIVERED : ['delivered','delivered successfully!'],
20159 naman 73
                      MStore.ORDER_SHIPPED : ['in transit', 'dispatched', 'handed over to courier', 'undelivered. update delivery details!','out for delivery',
74
                                              'undelivered. edit delivery details!','undelivered' ,'all delivery attempts failed','delivery attempt failed',
75
                                              'delivery details updated'],
20472 amit.gupta 76
                      MStore.ORDER_CANCELLED : ['closed for vendor reallocation', 'cancelled', 'product returned by courier', 'returned', 'n/a', 'courier returned','verification failed' 
17394 amit.gupta 77
                                                'a new order placed with a different seller', 'closed', 'cancellation in progress', 'verification failed. order cancelled', 
20159 naman 78
                                                'cancelled. payment refunded','closed. new order placed','cancelling','cancelling order','order cancelled',
79
                                                'payment failed. order cancelled','returned to snapdeal','pickup sent','refund approved','refund successful!',
80
                                                'undelivered. order cancelled','order cancelled. refunded successfully','return request registered','pickup failed. please reschedule',
20393 amit.gupta 81
                                                'replacement order successfully placed','replacement request received', 'verification failed due to nbp. order cancelled', 
82
                                                'verification failed due to where customer don\'t want order. order cancelled']
13569 amit.gupta 83
                      }
13662 amit.gupta 84
    CONF_CB_AMOUNT = MStore.CONF_CB_DISCOUNTED_PRICE
13569 amit.gupta 85
    def __init__(self,store_id):
86
        super(Store, self).__init__(store_id)
87
 
88
    def getName(self):
89
        return "snapdeal"
90
 
91
    def scrapeAffiliate(self, startDate=None, endDate=None):
17667 amit.gupta 92
 
17009 amit.gupta 93
        endDate=date.today() - timedelta(days=1)
16946 amit.gupta 94
        if startDate is None:
17048 amit.gupta 95
            startDate = endDate - timedelta(days=45)
16946 amit.gupta 96
 
17667 amit.gupta 97
        endDate = endDate.strftime('%Y-%m-%d')
98
        startDate = startDate.strftime('%Y-%m-%d')
16946 amit.gupta 99
        statuses=['cancelled', 'approved']
17667 amit.gupta 100
 
16946 amit.gupta 101
        for status in statuses:
17667 amit.gupta 102
            nextUrl = AFF_URL_TEMPLATE%(startDate, endDate, status)
103
            while nextUrl:
104
                req = urllib2.Request(nextUrl)
105
                nextUrl=''
106
                req.add_header('Snapdeal-Affiliate-Id', AFF_ID)
107
                req.add_header('Snapdeal-Token-Id', AFF_TOKEN)
108
                req.add_header('Accept', 'application/json')
109
                resp = urllib2.urlopen(req)
110
                ordersDict = json.loads(resp.read())
111
 
112
                self._saveToAffiliate(ordersDict['productDetails'], status)
13569 amit.gupta 113
 
13662 amit.gupta 114
    def _setLastSaleDate(self, saleDate):
13680 amit.gupta 115
        self.db.lastSaleDtate.update({'storeId':self.store_id}, {'$set':{'saleDate':saleDate}})
13569 amit.gupta 116
 
13662 amit.gupta 117
 
118
 
119
    def _getLastSaleDate(self,):
120
        lastDaySaleObj = self.db.lastDaySale.find_one({"storeId":self.store_id})
121
        if lastDaySaleObj is None:
122
            return datetime.min
123
 
14854 amit.gupta 124
 
125
 
126
    def _parseB(self, orderId, subTagId, userId, page, orderSuccessUrl):
127
        soup = BeautifulSoup(page)
128
 
129
        orderDetailContainerDivs = soup.body.find("div", {'class':'cardLayoutWrap'}).findAll('div', recursive=False)
130
        orderDetailDiv = orderDetailContainerDivs.pop(0)
131
        paymentDetailDiv  = orderDetailContainerDivs.pop(0)
132
        subOrders = orderDetailContainerDivs
133
 
134
        placedOn = orderDetailDiv.span.text.split(':')[1].strip()
135
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
136
        merchantOrder.placedOn = placedOn
137
        merchantOrder.merchantOrderId = parse_qs(urlparse(orderSuccessUrl).query)['order'][0]
138
 
139
        paymentDivs = paymentDetailDiv.findAll('div', recursive=False)
140
        paymentDivs.pop(0)
141
        for orderTr in paymentDivs:
142
            orderTrString = str(orderTr)
143
            if "Total Amount Paid" in orderTrString:
144
                amountPaid = orderTr.div.find('div', {'class':'detailBlock'}).text.strip()
145
                merchantOrder.paidAmount = int(re.findall(r'\d+', amountPaid)[0])
146
            elif "Total Amount" in orderTrString:
147
                merchantOrder.totalAmount = re.findall(r'\d+', orderTrString)[0]
148
            elif "Delivery Charges" in orderTrString:
149
                merchantOrder.deliveryCharges = re.findall(r'\d+', orderTrString)[0]
150
            elif "Discount Applied" in orderTrString:
151
                merchantOrder.discountApplied = re.findall(r'\d+', orderTrString)[0]
152
            elif "Offer Discount" in orderTrString:
153
                merchantOrder.discountApplied = re.findall(r'\d+', orderTrString)[0]
154
 
155
        merchantSubOrders = []
156
        for subOrderElement in subOrders:
14883 amit.gupta 157
            subOrder = self.parseSubOrderB(subOrderElement, placedOn)
158
            if subOrder is not None:
15350 amit.gupta 159
                dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
160
                subOrder.dealRank = dealRank.get('rank')
161
                subOrder.rankDesc = dealRank.get('description')
16283 amit.gupta 162
                subOrder.maxNlc = dealRank.get('maxNlc')
163
                subOrder.minNlc = dealRank.get('minNlc')
164
                subOrder.db = dealRank.get('dp')
165
                subOrder.itemStatus = dealRank.get('status')
14883 amit.gupta 166
                merchantSubOrders.append(subOrder)
14854 amit.gupta 167
        merchantOrder.subOrders = merchantSubOrders
168
        return merchantOrder
169
 
13760 amit.gupta 170
    def _parse(self, orderId, subTagId, userId, page, orderSuccessUrl):
13662 amit.gupta 171
 
13760 amit.gupta 172
        #page=page.decode("utf-8")
14854 amit.gupta 173
        soup = BeautifulSoup(page)
13760 amit.gupta 174
        #orderHead = soup.find(name, attrs, recursive, text)
175
        sections = soup.findAll("section")
176
 
177
        #print sections
178
 
179
        order = sections[1]
180
        orderTrs = order.findAll("tr")
181
 
182
        placedOn = str(orderTrs[0].findAll("td")[1].text)
183
 
184
        #Pop two section elements
185
        sections.pop(0) 
186
        sections.pop(0)
187
        subOrders = sections
188
 
189
 
190
        merchantSubOrders = []
191
 
192
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
14447 amit.gupta 193
        merchantOrder.placedOn = placedOn
14023 amit.gupta 194
        merchantOrder.merchantOrderId = re.findall(r'\d+', str(soup.find("div", {"class":"deals_heading"})))[1]
13760 amit.gupta 195
        for orderTr in orderTrs:
196
            orderTrString = str(orderTr)
197
            if "Total Amount" in orderTrString:
198
                merchantOrder.totalAmount = re.findall(r'\d+', orderTrString)[0]
199
            elif "Delivery Charges" in orderTrString:
200
                merchantOrder.deliveryCharges = re.findall(r'\d+', orderTrString)[0]
201
            elif "Discount Applied" in orderTrString:
202
                merchantOrder.discountApplied = re.findall(r'\d+', orderTrString)[0]
203
            elif "Paid Amount" in orderTrString:
204
                merchantOrder.paidAmount = re.findall(r'\d+', orderTrString)[0]
205
 
206
        for subOrderElement in subOrders:
13809 amit.gupta 207
            subOrders = self.parseSubOrder(subOrderElement, placedOn)                           
208
            merchantSubOrders.extend(subOrders)   
13760 amit.gupta 209
 
210
        merchantOrder.subOrders = merchantSubOrders
211
        return merchantOrder
212
 
213
    def parseSubOrder(self, subOrderElement, placedOn):
13809 amit.gupta 214
        subOrders = []
13760 amit.gupta 215
        productUrl = str(subOrderElement.find("a")['href'])
216
        subTable = subOrderElement.find("table", {"class":"lrPad"})
217
        subTrs = subTable.findAll("tr")
218
        unitPrice=None
14458 amit.gupta 219
        offerDiscount = 0
13760 amit.gupta 220
        deliveryCharges = None
221
        amountPaid = None
14458 amit.gupta 222
        amount = 0
14473 amit.gupta 223
        sdCash = 0
224
        unitPrice = 0
13760 amit.gupta 225
        for subTr in subTrs:
226
            subTrString = str(subTr)
227
            if "Unit Price" in subTrString:
14473 amit.gupta 228
                unitPrice = int(re.findall(r'\d+', subTrString)[0])
13760 amit.gupta 229
            if "Quantity" in subTrString:
14458 amit.gupta 230
                qty = int(re.findall(r'\d+', subTrString)[0])
13760 amit.gupta 231
            elif "Offer Discount" in subTrString:
14458 amit.gupta 232
                offerDiscount +=   int(re.findall(r'\d+', subTrString)[0])
14861 amit.gupta 233
            elif "SD Cash" in subTrString:
14473 amit.gupta 234
                sdCash =   int(re.findall(r'\d+', subTrString)[0])
13760 amit.gupta 235
            elif "Delivery Charges" in subTrString:
14473 amit.gupta 236
                deliveryCharges =   int(re.findall(r'\d+', subTrString)[0])
13760 amit.gupta 237
            elif "Subtotal" in subTrString:
238
                if int(qty) > 0:
14459 amit.gupta 239
                    amountPaid =   int(re.findall(r'\d+', subTrString)[0])/qty
13760 amit.gupta 240
                else:
14459 amit.gupta 241
                    amountPaid =   0
14458 amit.gupta 242
        if qty>0:
14473 amit.gupta 243
            amount = unitPrice - offerDiscount - sdCash
244
            amount = 0 if amount < 0 else amount
13760 amit.gupta 245
 
14459 amit.gupta 246
        div1 = subOrderElement.find("div", {"class": "blk lrPad subordrs"})
247
        if div1 is None:
13760 amit.gupta 248
            raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
249
 
14459 amit.gupta 250
        for strDiv in str(div1).split("<div class=\"seperator\"></div>"):
251
            div = BeautifulSoup(strDiv)
13760 amit.gupta 252
            productTitle = str(subOrderElement.find("a").text)
253
            productUrl = "http://m.snapdeal.com/" + productUrl 
254
            subOrder = SubOrder(productTitle, productUrl, placedOn, amountPaid)
255
 
256
            subOrder.amountPaid = amountPaid
257
            subOrder.deliveryCharges = deliveryCharges
258
            subOrder.offerDiscount = offerDiscount
13809 amit.gupta 259
            subOrder.unitPrice = int(unitPrice)
13760 amit.gupta 260
            subOrder.productCode = re.findall(r'\d+$', productUrl)[0]
14415 amit.gupta 261
            subOrder.imgUrl = Mongo.getImgSrc(subOrder.productCode, self.store_id).get('thumbnail')
14458 amit.gupta 262
            cashbackStatus = Store.CB_NA
263
            cashbackAmount = 0
264
            percentage = 0
265
            if amount > 0:
266
                (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amount)
14473 amit.gupta 267
                if cashbackAmount > 0:
14476 amit.gupta 268
                    cashbackStatus = Store.CB_PENDING
13760 amit.gupta 269
            subOrder.cashBackStatus = cashbackStatus
270
            subOrder.cashBackAmount = cashbackAmount
14458 amit.gupta 271
            subOrder.cashBackPercentage = percentage
13760 amit.gupta 272
 
273
 
274
            trackAnchor = div.find("a")   
275
            if trackAnchor is not None:
276
                subOrder.tracingkUrl = str(trackAnchor['href'])
277
 
278
            divStr = str(div)
279
            divStr = divStr.replace("\n","").replace("\t", "")
280
 
281
            for line in divStr.split("<br />"):
282
                if "Suborder ID" in line:
283
                    subOrder.merchantSubOrderId = re.findall(r'\d+', line)[0]   
284
                elif "Status" in line:
14402 amit.gupta 285
                    print line
13760 amit.gupta 286
                    subOrder.detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
287
                elif "Est. Shipping Date" in line:
288
                    subOrder.estimatedShippingDate = line.split(":")[1].strip()
289
                elif "Est. Delivery Date" in line:
290
                    subOrder.estimatedDeliveryDate = line.split(":")[1].strip()
291
                elif "Courier Name" in line:
292
                    subOrder.courierName = line.split(":")[1].strip()
293
                elif "Tracking No" in line:
294
                    subOrder.trackingNumber = line.split(":")[1].strip()
13809 amit.gupta 295
            subOrders.append(subOrder)
296
        return subOrders
13760 amit.gupta 297
 
14854 amit.gupta 298
    def parseSubOrderB(self, subOrderElement, placedOn):
299
        subOrders = []
300
        prodDivs = subOrderElement.findAll('div', recursive=False)
301
        prodDetailDiv = prodDivs[1].findAll('div', recursive=False)
302
 
303
        offerDiscount = 0
304
        deliveryCharges = None
305
        amountPaid = 0
306
        sdCash = 0
307
        unitPrice = 0
308
 
309
        paymentDivs = prodDivs[2].findAll('div', recursive=False)
310
        for paymentDiv in paymentDivs:
311
            strPaymentDiv = str(paymentDiv)
312
            if "Unit Price" in strPaymentDiv:
14883 amit.gupta 313
                try:
314
                    unitPrice = int(re.findall(r'\d+', strPaymentDiv)[0])
315
                except:
316
                    return None
14872 amit.gupta 317
            elif "Offer Discount" in strPaymentDiv:
318
                offerDiscount += int(re.findall(r'\d+', strPaymentDiv)[0])
319
            elif "Discount" in strPaymentDiv:
320
                offerDiscount += int(re.findall(r'\d+', strPaymentDiv)[0])
14861 amit.gupta 321
            elif "SD Cash" in strPaymentDiv:
14854 amit.gupta 322
                sdCash =   int(re.findall(r'\d+', strPaymentDiv)[0])
323
            elif "Delivery Charges" in strPaymentDiv:
324
                deliveryCharges =   int(re.findall(r'\d+', strPaymentDiv)[0])
325
            elif "Subtotal" in strPaymentDiv:
326
                amountPaid =   int(re.findall(r'\d+', paymentDiv.find('div', {'class':'itemPriceDetail'}).text)[0])
327
 
328
        amount = unitPrice - offerDiscount - sdCash
329
 
330
        imgDiv = prodDetailDiv[0]
331
        otherDiv = prodDetailDiv[1]
332
        productTitle = otherDiv.find('div',{'class':'orderName'}).text.strip()
333
 
334
        productUrl = imgDiv.a['href']
335
        subOrder = SubOrder(productTitle, productUrl, placedOn, amountPaid)
14863 amit.gupta 336
        subOrder.merchantSubOrderId = prodDivs[0].text.split(':')[1].strip()
14854 amit.gupta 337
        subOrder.detailedStatus = otherDiv.find('div',{'class':'orderStatus'}).span.text.strip()
15882 amit.gupta 338
        if subOrder.detailedStatus.lower() == "processing":
339
            processingDetailedStatus = subOrderElement.find('div', {'class':'trackingMessage'}).text.strip()
340
            if processingDetailedStatus.lower() == 'a new order placed with a different seller':
341
                subOrder.detailedStatus = processingDetailedStatus
14854 amit.gupta 342
        deliveryStatus = otherDiv.find('div',{'class':'orderDelivery'})
343
        if deliveryStatus is not None:
344
            delString = deliveryStatus.text.strip()
345
            arr = delString.split(':')
346
            if "On" in arr[0]:
347
                subOrder.deliveredOn = arr[1].strip()
348
            elif "Exp. Delivery by" in arr[0]:
349
                subOrder.estimatedDeliveryDate = arr[1].strip()
15877 amit.gupta 350
            elif "Est. delivery between" in arr[0]:
15880 amit.gupta 351
                subOrder.estimatedDeliveryDate = arr[0].split("between")[1].strip()
15881 amit.gupta 352
            elif "Est. shipping between" in arr[0]:
353
                subOrder.estimatedShippingDate = arr[0].split("between")[1].strip()
14854 amit.gupta 354
            else:
355
                subOrder.estimatedShippingDate = arr[1].strip()
356
 
357
        subOrder.imgUrl = imgDiv.a.img['src']
358
        subOrder.productCode = re.findall(r'\d+$', productUrl)[0]
359
        subOrder.deliveryCharges = deliveryCharges
360
        subOrder.offerDiscount = offerDiscount
361
        subOrder.unitPrice = int(unitPrice)
362
        cashbackStatus = Store.CB_NA
363
        cashbackAmount = 0
364
        percentage = 0
365
        if amountPaid > 0:
366
            (cashbackAmount, percentage) = self.getCashbackAmount(subOrder.productCode, amount)
367
            if cashbackAmount > 0:
368
                cashbackStatus = Store.CB_PENDING
369
        subOrder.cashBackStatus = cashbackStatus
370
        subOrder.cashBackAmount = cashbackAmount
371
        subOrder.cashBackPercentage = percentage
372
 
373
 
374
        courierDet = subOrderElement.find('div', {'class':'courierDetail'})
375
        if courierDet is not None:
376
            subOrder.courierName = courierDet.span.text.strip()
377
        trackingDet = subOrderElement.find('div', {'class':'trackingNo'})
378
        if trackingDet is not None:
379
            subOrder.trackingUrl = trackingDet.span.a['href']
380
            subOrder.trackingNumber = trackingDet.span.a.text.strip()
381
 
382
        subOrders.append(subOrder)
383
        return subOrder
17387 amit.gupta 384
 
18038 amit.gupta 385
    def getOrderJSON(self, pq, supcMap):
17387 amit.gupta 386
        #print rawHtml
387
#        replace_with = {
388
#        '<': '&gt;',
389
#        '>': '&lt;',
390
#        '&': '&amp;',
391
#        '"': '&quot;', # should be escaped in attributes
392
#        "'": '&apos;'    # should be escaped in attributes
393
#        }
394
        jsonValue = pq("#orderJSON").attr("value")
395
        jsonValue.replace("&quot;", '"')
396
        jsonValue.replace("&amp;", '&')
397
        jsonValue.replace("&gt;", '>')
398
        jsonValue.replace("&lt;", '<')
399
        jsonValue.replace("&apos;", "'")
400
        allSupcElements = pq('div.mdt-layout')('div.mdt-card')('div.order-item')
401
        for supcElement in allSupcElements:
402
            try:
403
                supcElement = pq(supcElement)
404
                title = supcElement('div.order-heading').text().strip()
405
                productUrl = supcElement.attr("data-href")
406
                imgUrl = supcElement.find('img').attr('src')
18037 amit.gupta 407
                try:
408
                    supc = self.catalogdb.MasterData.find_one({"secondaryIdentifier":productUrl.split("/")[-1], "source_id":self.store_id})
409
                    if supc is None:
18054 amit.gupta 410
                        raise
411
                    else:
412
                        supc = supc['identifier'] 
18037 amit.gupta 413
                except:
18060 amit.gupta 414
                    try:
415
                        supc = imgUrl.split('-')[-3]
416
                    except:
417
                        supc = self.db.sdIdentifiers.find_one({"secondaryIdentifier":productUrl.split("/")[-1]})
418
                        if supc is None:
419
                            raise
420
                        else:
421
                            supc = supc['identifier']
18054 amit.gupta 422
 
17387 amit.gupta 423
                supcMap[supc] = {'title':title, 'imgUrl':imgUrl, 'productUrl':productUrl}
424
            except:
425
                pass
426
        return json.loads(jsonValue)
14854 amit.gupta 427
 
13576 amit.gupta 428
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
13760 amit.gupta 429
                    #print merchantOrder
13796 amit.gupta 430
        resp = {}
17855 amit.gupta 431
        orderPart = re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
432
        url = ORDER_TRACK_URL + orderPart
433
        moId =  orderPart.split("order=")[-1].split("&")[0]
434
        if self.db.merchantOrder.find_one({"merchantOrderId":moId}):
18163 amit.gupta 435
            resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
17855 amit.gupta 436
            return resp
17387 amit.gupta 437
        supcMap = {}
13582 amit.gupta 438
        try:
18038 amit.gupta 439
            pq = PyQuery(rawHtml)
14854 amit.gupta 440
            try:
18038 amit.gupta 441
                if pq("title").text()=="Webpage not available":
442
                    raise                
443
                orderJSON = self.getOrderJSON(pq, supcMap)
14854 amit.gupta 444
            except:
18038 amit.gupta 445
                resp['result'] = 'ORDER_NOT_CREATED_KNOWN'
446
                return resp
447
                '''page =fetchResponseUsingProxy(url)
17387 amit.gupta 448
                try:
449
                    merchantOrder = self._parseB(orderId, subTagId, userId, page, orderSuccessUrl)
450
                except:
451
                    traceback.print_exc()
18038 amit.gupta 452
                    merchantOrder = self._parse(orderId, subTagId, userId, page, orderSuccessUrl)'''
453
 
454
            merchantOrder = self._parseC(orderId, subTagId, userId, supcMap, orderJSON, orderSuccessUrl)
14312 amit.gupta 455
            merchantOrder.orderTrackingUrl = url
456
 
457
            if self._saveToOrder(todict(merchantOrder)):
458
                resp['result'] = 'ORDER_CREATED'
459
            else:
460
                resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
17387 amit.gupta 461
            print "=================", resp, orderId, "=============="
13796 amit.gupta 462
            return resp
13582 amit.gupta 463
        except:
464
            print "Error occurred"
13603 amit.gupta 465
            traceback.print_exc()
14312 amit.gupta 466
            resp['result'] = 'ORDER_NOT_CREATED'
17387 amit.gupta 467
            print "=================", resp, orderId, "=============="
13796 amit.gupta 468
            return resp
13781 amit.gupta 469
 
13569 amit.gupta 470
 
471
        #soup = BeautifulSoup(rawHtml,convertEntities=BeautifulSoup.HTML_ENTITIES)
472
        #soup.find(name, attrs, recursive, text)
17387 amit.gupta 473
    def _parseC(self, orderId, subTagId, userId, supcMap, orderJSON, orderSuccessUrl):
474
        print orderJSON
475
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
476
        placedOn = datetime.strftime(utils.fromTimeStamp(orderJSON['created']/1000), "%a, %d %b, %Y")
477
        merchantOrder.placedOn = placedOn
478
        merchantOrder.merchantOrderId = orderJSON['code']
479
        merchantOrder.paidAmount = orderJSON['paidAmount']
480
        merchantOrder.deliveryCharges = orderJSON['shippingCharges']
481
        merchantOrder.closed= False
482
        merchantSubOrders = []
483
        for s in orderJSON['suborders']:
484
            print s
485
            if not supcMap.has_key(s['supcCode']):
17455 amit.gupta 486
                skuData = Mongo.get_mongo_connection().Catalog.MasterData.find_one({'identifier':s['supcCode'], 'source_id':self.store_id})
487
                if skuData is None:
20154 kshitij.so 488
                    url = "http://www.snapdeal.com/search?keyword=%s"%s['supcCode']
17455 amit.gupta 489
                    html = utils.fetchResponseUsingProxy(url)
490
                    html = html.replace("&#13;", "")
20154 kshitij.so 491
                    pq = PyQuery(html)
492
                    tag = pq('div.product-tuple-listing')
493
                    for resultDiv in tag:
494
                        pq_resultDiv = pq(resultDiv)
495
                        if (pq_resultDiv.attr['data-defaultsupcforfmcg']).strip() == s['supcCode'].strip():
496
                            productUrl =  pq_resultDiv('div.product-tuple-image').children('a').attr('href')
497
                            imgUrl =  pq_resultDiv('div.product-tuple-image').children('a').children('img').attr('src')
498
                            title = pq_resultDiv('p.product-title').text()
499
                            break
17455 amit.gupta 500
                else:
501
                    title = skuData['product_name']
502
                    productUrl = skuData['marketPlaceUrl']
503
                    imgUrl = skuData['thumbnail']
17387 amit.gupta 504
                supcMap[s['supcCode']] = {'title':title, 'imgUrl':imgUrl, 'productUrl':productUrl}
505
            map1 = supcMap[s['supcCode']]
506
 
507
            amountPaid = s['paidAmount']
508
            productTitle = map1['title']
509
            productUrl = map1['productUrl'] 
510
            subOrder = SubOrder(productTitle, productUrl, placedOn, amountPaid)
511
            if(s.get('deliveryDate') is not None):
512
                print "Delivered On", 
17394 amit.gupta 513
                subOrder.deliveredOn = datetime.strftime(utils.fromTimeStamp(s.get('deliveryDate')/1000),'%d %b, %Y')
17387 amit.gupta 514
                subOrder.status = MStore.ORDER_DELIVERED
515
                subOrder.detailedStatus = MStore.ORDER_DELIVERED
516
            elif s['suborderStatus'].get('macroDescription')== 'Closed':
517
                if s['suborderStatus'].get('value')== 'Close for vendor reallocation':
518
                    subOrder.detailedStatus = 'Close for vendor reallocation'
519
                    subOrder.status = MStore.ORDER_CANCELLED
520
 
521
            try:
522
                subOrder.detailedStatus = s['suborderStatus']['macroDescription']
523
                subOrder.status = self._getStatusFromDetailedStatus(subOrder.detailedStatus)
524
            except:
525
                print "----------------", s['suborderStatus']
13576 amit.gupta 526
 
17387 amit.gupta 527
            subOrder.merchantSubOrderId = s['code']
528
            subOrder.deliveryCharges = s['shippingCharges']
17389 amit.gupta 529
            subOrder.productCode = re.findall(r'\d+$', productUrl)[0]
18384 amit.gupta 530
            dealRank = getDealRank(subOrder.productCode, self.store_id, merchantOrder.userId)
531
            subOrder.dealRank = dealRank.get('rank')
532
            subOrder.rankDesc = dealRank.get('description')
533
            subOrder.maxNlc = dealRank.get('maxNlc')
534
            subOrder.minNlc = dealRank.get('minNlc')
535
            subOrder.db = dealRank.get('dp')
536
            subOrder.itemStatus = dealRank.get('status')
17387 amit.gupta 537
            subOrder.imgUrl = map1['imgUrl']
538
            subOrder.unitPrice = s['offerPrice']  -s['internalCashbackValue'] - s['externalCashbackValue']
539
            subOrder.amount = subOrder.unitPrice - s['offerDiscount'] - s['sdCash']
540
            try:
541
                try:
542
                    if s['shipDateRange']['start']==s['shipDateRange']['end']:
17394 amit.gupta 543
                        subOrder.estimatedShippingDate = datetime.strftime(utils.fromTimeStamp(s['shipDateRange']['start']/1000),'%d %b, %Y') 
17387 amit.gupta 544
                    else:
17394 amit.gupta 545
                        subOrder.estimatedShippingDate = datetime.strftime(utils.fromTimeStamp(s['shipDateRange']['start']/1000),'%d %b, %Y') + " - " + datetime.strftime(utils.fromTimeStamp(s['shipDateRange']['end']/1000),'%d %b, %Y')
17387 amit.gupta 546
                except:   
547
                    if s['deliveryDateRange']['start']==s['deliveryDateRange']['end']:
17394 amit.gupta 548
                        subOrder.estimatedDeliveryDate = datetime.strftime(utils.fromTimeStamp(s['deliveryDateRange']['start']/1000),'%d %b, %Y') 
17387 amit.gupta 549
                    else:
17394 amit.gupta 550
                        subOrder.estimatedDeliveryDate = datetime.strftime(utils.fromTimeStamp(s['deliveryDateRange']['start']/1000),'%d %b, %Y') + " - " + datetime.strftime(utils.fromTimeStamp(s['deliveryDateRange']['end']/1000),'%d %b, %Y')   
17387 amit.gupta 551
            except:
552
                pass
553
            subOrder.offerDiscount = s['offerDiscount']
554
            subOrder.unitPrice = s['offerPrice']
555
            merchantSubOrders.append(subOrder)
556
 
557
        merchantOrder.subOrders = merchantSubOrders
558
        self.populateDerivedFields(merchantOrder)
559
        return merchantOrder
560
 
13576 amit.gupta 561
    def _getStatusFromDetailedStatus(self, detailedStatus):
562
        for key, value in Store.OrderStatusMap.iteritems():
14678 amit.gupta 563
            if detailedStatus.lower() in value:
13576 amit.gupta 564
                return key
20393 amit.gupta 565
            elif 'order cancelled' in detailedStatus.lower():
566
                return key
14675 amit.gupta 567
        print "Detailed Status need to be mapped", detailedStatus, self.store_id
14861 amit.gupta 568
        return None
13569 amit.gupta 569
 
13610 amit.gupta 570
 
13569 amit.gupta 571
    def scrapeStoreOrders(self,):
13760 amit.gupta 572
        #collectionMap = {'palcedOn':1}
13576 amit.gupta 573
        orders = self._getActiveOrders()
574
        for order in orders:
17394 amit.gupta 575
            order = obj(order)
576
            print "Order", self.store_name, order.orderId
14398 amit.gupta 577
            try:
17394 amit.gupta 578
                url = order.orderTrackingUrl
20158 naman 579
                page = fetchResponseUsingProxy(url, headers=headers)
14398 amit.gupta 580
                #page=page.decode("utf-8")
14861 amit.gupta 581
                try:
17394 amit.gupta 582
                    pq = PyQuery(page)
583
                    subOrderStatusMap={}
584
                    for el in pq('div.cardLayout.pad-10.mb-10'):
585
                        elpq = PyQuery(el)
586
                        try:
587
                            subOrderId = elpq("div.subOrderId").text().split(":")[1].strip()
588
                            subOrderStatusMap[subOrderId] = elpq
589
                        except:
590
                            pass
591
                    closedForReco = {}
592
                    for suborder in order.subOrders:
593
                        if suborder.closed:
594
                            if suborder.merchantSubOrderId in subOrderStatusMap:
595
                                del subOrderStatusMap[suborder.merchantSubOrderId]
596
                                continue
597
                        if subOrderStatusMap.has_key(suborder.merchantSubOrderId):
598
                            elpq = subOrderStatusMap.get(suborder.merchantSubOrderId)
599
                            del subOrderStatusMap[suborder.merchantSubOrderId]
600
                            if elpq("#trackLink").attr("href"):
601
                                suborder.trackingUrl = elpq("#trackLink").attr("href")
602
                            if elpq('span.subOrdStatusText').text():
603
                                suborder.estimatedDeliveryDate=elpq('span.subOrdStatusText').text().strip()
604
                            suborder.detailedStatus = elpq("div.orderStatus span").text().strip()
19428 manas 605
                            if suborder.detailedStatus in ['Closed. New Order Placed','Closed. Placing New Order'] :
17394 amit.gupta 606
                                closedForReco[suborder.merchantSubOrderId] = suborder
607
                            suborder.status = self._getStatusFromDetailedStatus(suborder.detailedStatus)
608
 
609
                    if len(closedForReco) ==  len(subOrderStatusMap) and len(closedForReco)>0:
610
                        productCode = ''
611
                        allProductsSame = True
612
                        for subOrderId, subo in closedForReco.iteritems():
613
                            if productCode == '':
614
                                productCode = subo.productCode
615
                                continue
616
                            if subo.productCode != productCode:
617
                                allProductsSame = False
618
                                break
619
                        subOrderStatusMap
620
                        if allProductsSame:
621
                            print "singlereco", order.orderId
622
                            for key, elpq in subOrderStatusMap.iteritems():
18160 amit.gupta 623
                                suborderNew = obj(todict(suborder))
17394 amit.gupta 624
                                suborderNew.merchantSubOrderId = key
625
                                if elpq("#trackLink").attr("href"):
626
                                    suborderNew.trackingUrl = elpq("#trackLink").attr("href")
627
                                if elpq('span.subOrdStatusText').text():
628
                                    suborderNew.estimatedDeliveryDate=elpq('span.subOrdStatusText').text().strip()
629
                                suborderNew.detailedStatus = elpq("div.orderStatus span").text().strip()
17462 amit.gupta 630
                                suborderNew.status = self._getStatusFromDetailedStatus(suborderNew.detailedStatus)
17394 amit.gupta 631
                                order.subOrders.append(suborderNew)
632
                        else:
17436 amit.gupta 633
                            print "All products not same referring transaction url", order.orderId
17394 amit.gupta 634
                    else: 
635
                        pass
636
                        #Lookout for ordersummary page for exact mapping        
17451 amit.gupta 637
                    self.populateDerivedFields(order, update=True)
17394 amit.gupta 638
                    self._updateToOrder(todict(order))
14861 amit.gupta 639
                except:
640
                    traceback.print_exc()
17394 amit.gupta 641
                    soup = BeautifulSoup(page)
642
                    try:
643
                        self.tryBParsing(order, soup)
644
                    except:
645
                        traceback.print_exc()
646
                        sections = soup.findAll("section")
647
                        orderEl = sections[1]
648
                        orderTrs = orderEl.findAll("tr")
649
 
650
                        placedOn = str(orderTrs[0].findAll("td")[1].text)
651
                        sections.pop(0)
652
                        sections.pop(0)
653
 
654
                        subOrders = sections
655
                        bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
656
                        closed = True
657
                        for subOrderElement in subOrders:
658
                            div1 = subOrderElement.findAll("div", {"class": "blk lrPad subordrs"})
659
                            if len(div1)<=0:
660
                                raise ParseException("subOrder", "Could not Parse suborders for Snapdeal")
661
                            subOrder = None
662
                            breakFlag = False
663
                            for strDiv in str(div1).split("<div class=\"seperator\"></div>"):
664
                                div = BeautifulSoup(strDiv)
665
                                divStr = str(div)
666
                                divStr = divStr.replace("\n","").replace("\t", "")
667
                                updateMap = {}
668
                                for line in divStr.split("<br />"):
669
                                    if "Suborder ID" in line:
670
                                        merchantSubOrderId = re.findall(r'\d+', line)[0]
671
                                        #break if suborder is inactive   
672
                                        subOrder =  self._isSubOrderActive(order, merchantSubOrderId)
673
                                        if subOrder is None:
674
                                            subOrders = self.parseSubOrder(subOrderElement, placedOn)
675
                                            self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict(subOrders)}}})
676
                                            print "Added new suborders to Order id - ", order['orderId']
677
                                            closed = False
678
                                            breakFlag = True
679
                                            break
680
                                        elif subOrder['closed']:
681
                                            breakFlag = True
682
                                            break
683
                                        else: 
684
                                            findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": merchantSubOrderId}
685
                                    elif "Status :" in line:
686
                                        detailedStatus = re.findall('>(.*?)</span>', line, re.IGNORECASE)[0]
687
                                        updateMap["subOrders.$.detailedStatus"] = detailedStatus
688
                                        status = self._getStatusFromDetailedStatus(detailedStatus) 
689
                                        closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
690
                                        if status is not None:
691
                                            updateMap["subOrders.$.status"] = status
692
                                        if detailedStatus == 'Closed For Vendor Reallocation':
693
                                            #if it is more than 6hours mark closed.
694
                                            closeAt = subOrder.get("closeAt") 
695
                                            if closeAt is None:
696
                                                closeAt = datetime.now() + timedelta(hours=6)
697
                                                updateMap["subOrders.$.closeAt"] = datetime.strftime(closeAt,"%Y-%m-%d %H:%M:%S")
698
                                            else:
699
                                                closeAt = datetime.strptime(closeAt,"%Y-%m-%d %H:%M:%S")
700
                                                if datetime.now() > closeAt:
701
                                                    closedStatus = True
702
                                        #Close if not applicable suborders are not closed
703
                                        if utils.fromTimeStamp(order['createdOnInt'] + 35*86400*1000) < datetime.now() and subOrder['cashBackStatus']==utils.CB_NA:
704
                                            closedStatus=True   
705
 
706
 
707
                                        if closedStatus:
708
                                            #if status is closed then change the paybackStatus accordingly
709
                                            updateMap["subOrders.$.closed"] = True
710
                                            if status == Store.ORDER_DELIVERED:
711
                                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
712
                                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
713
                                            elif status == Store.ORDER_CANCELLED:
714
                                                if subOrder.get("cashBackStatus") == Store.CB_PENDING:
715
                                                    updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
716
 
14861 amit.gupta 717
                                        else:
17394 amit.gupta 718
                                            closed = False
719
                                    elif "Est. Shipping Date" in line:
720
                                        estimatedShippingDate = line.split(":")[1].strip()
721
                                        updateMap["subOrders.$.estimatedShippingDate"] = estimatedShippingDate
722
                                    elif "Est. Delivery Date" in line:
723
                                        estimatedDeliveryDate = line.split(":")[1].strip()
724
                                        updateMap["subOrders.$.estimatedDeliveryDate"] = estimatedDeliveryDate
725
                                    elif "Courier Name" in line:
726
                                        courierName = line.split(":")[1].strip()
727
                                        updateMap["subOrders.$.courierName"] = courierName
728
                                    elif "Tracking No" in line:
729
                                        trackingNumber = line.split(":")[1].strip()
730
                                        updateMap["subOrders.$.trackingNumber"] = trackingNumber
731
 
732
                                if breakFlag:
733
                                    continue
734
 
735
                                bulk.find(findMap).update({'$set' : updateMap})
736
                            bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
737
                        result = bulk.execute()
738
                        tprint(result)
14398 amit.gupta 739
            except:
740
                traceback.print_exc()                
17394 amit.gupta 741
                tprint("Could not update " + str(order.orderId) + "For store " + self.getName())
742
                self.db.merchantOrder.update({"orderId":order.orderId}, {"$set":{"parseError":True}})
13576 amit.gupta 743
 
14854 amit.gupta 744
    def tryBParsing(self, order, soup):
745
        orderDetailContainerDivs = soup.body.find("div", {'class':'cardLayoutWrap'}).findAll('div', recursive=False)
746
        orderDetailDiv = orderDetailContainerDivs.pop(0)
747
        placedOn = orderDetailDiv.span.text.split(':')[1].strip()
748
 
749
        orderDetailContainerDivs.pop(0)
750
 
751
        subOrders = orderDetailContainerDivs
752
        bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
753
        closed = True
754
        for subOrderElement in subOrders:
755
            prodDivs = subOrderElement.findAll('div', recursive=False)
756
            merchantSubOrderId = prodDivs[0].text.split(':')[1].strip()
757
            subOrder = None
14861 amit.gupta 758
            subOrder =  self._isSubOrderActive(order, merchantSubOrderId)
759
            if subOrder is None:
14864 amit.gupta 760
                try:
14883 amit.gupta 761
                    subOrder = self.parseSubOrderB(subOrderElement, placedOn)
762
                    if subOrder is None:
763
                        continue
764
                    self.db.merchantOrder.update({"orderId":order['orderId']},{'$push':{"subOrders":{"$each":todict([subOrder])}}})
14864 amit.gupta 765
                    print "Added new suborders to Order id - ", order['orderId']
766
                    closed = False
767
                except:
768
                    pass
14861 amit.gupta 769
                continue
770
            elif subOrder['closed']:
771
                continue
772
            else: 
14864 amit.gupta 773
                prodDetailDiv = prodDivs[1].findAll('div', recursive=False)
774
                otherDiv = prodDetailDiv[1]
775
                trackBlock = subOrderElement.find('div',{'class':'trackingDetailsBlock'})
14861 amit.gupta 776
                findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": merchantSubOrderId}
777
                updateMap = {}
778
                detailedStatus = otherDiv.find('div',{'class':'orderStatus'}).span.text.strip()
16298 amit.gupta 779
 
15882 amit.gupta 780
                if 'A new order placed with a different seller' in str(trackBlock):
14861 amit.gupta 781
                    #if it is more than 6hours mark closed.
782
                    closeAt = subOrder.get("closeAt") 
783
                    if closeAt is None:
784
                        closeAt = datetime.now() + timedelta(hours=6)
785
                        updateMap["subOrders.$.closeAt"] = datetime.strftime(closeAt,"%Y-%m-%d %H:%M:%S")
16298 amit.gupta 786
                        bulk.find(findMap).update({'$set' : updateMap})
16301 amit.gupta 787
                        closed=False
16298 amit.gupta 788
                        continue
14854 amit.gupta 789
                    else:
14861 amit.gupta 790
                        closeAt = datetime.strptime(closeAt,"%Y-%m-%d %H:%M:%S")
791
                        if datetime.now() > closeAt:
16298 amit.gupta 792
                            detailedStatus = 'A new order placed with a different seller'
14861 amit.gupta 793
 
16298 amit.gupta 794
 
795
                status = self._getStatusFromDetailedStatus(detailedStatus) 
796
                closedStatus = status in [Store.ORDER_DELIVERED, Store.ORDER_CANCELLED]
797
                updateMap["subOrders.$.detailedStatus"] = detailedStatus
798
                if status is not None:
799
                    updateMap["subOrders.$.status"] = status
14861 amit.gupta 800
 
801
                if closedStatus:
802
                    #if status is closed then change the paybackStatus accordingly
803
                    updateMap["subOrders.$.closed"] = True
804
                    if status == Store.ORDER_DELIVERED:
805
                        if subOrder.get("cashBackStatus") == Store.CB_PENDING:
806
                            updateMap["subOrders.$.cashBackStatus"] = Store.CB_APPROVED
807
                    elif status == Store.ORDER_CANCELLED:
808
                        if subOrder.get("cashBackStatus") == Store.CB_PENDING:
809
                            updateMap["subOrders.$.cashBackStatus"] = Store.CB_CANCELLED
810
 
811
                else:
812
                    closed = False
14854 amit.gupta 813
 
14861 amit.gupta 814
                deliveryStatus = otherDiv.find('div',{'class':'orderDelivery'})
815
                if deliveryStatus is not None:
816
                    delString = deliveryStatus.text.strip()
817
                    arr = delString.split(':')    
818
                    if "On" in arr[0]:
819
                        updateMap['subOrders.$.deliveredOn'] = arr[1].strip()
820
                    elif "Exp. Delivery by" in arr[0]:
821
                        updateMap['subOrders.$.estimatedDeliveryDate'] = arr[1].strip()
15877 amit.gupta 822
                    elif "Est. delivery between" in arr[0]:
823
                        updateMap['subOrders.$.estimatedDeliveryDate'] = delString.split("between")[1].strip()
17237 amit.gupta 824
                    elif "Est. shipping between" in arr[0]:
825
                        updateMap['subOrders.$.estimatedShippingDate'] = delString.split("between")[1].strip()
14861 amit.gupta 826
                    else:
827
                        updateMap['subOrders.$.estimatedShippingDate'] = arr[1].strip()
828
                courierDet = subOrderElement.find('div', {'class':'courierDetail'})
829
                if courierDet is not None:
830
                    updateMap['subOrders.$.courierName'] = courierDet.span.text.strip()
831
                trackingDet = subOrderElement.find('div', {'class':'trackingNo'})
832
                if trackingDet is not None:
833
                    updateMap['subOrders.$.trackingUrl'] = trackingDet.span.a['href']
834
                    updateMap['subOrders.$.trackingNumber'] = trackingDet.span.a.text.strip()                    
14854 amit.gupta 835
            bulk.find(findMap).update({'$set' : updateMap})
836
        bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed,"parseError":False}})
837
        result = bulk.execute()
838
        tprint(result)
839
 
13576 amit.gupta 840
 
17234 amit.gupta 841
    def _saveToAffiliate(self, offers, status):
16946 amit.gupta 842
        collection = self.db.snapdealOrderAffiliateInfo1
843
        #mcollection = self.db.merchantOrder
14443 amit.gupta 844
        for offer in offers:
17667 amit.gupta 845
                offer = self.covertToObj(offer)
16946 amit.gupta 846
                if offer.orderId:
17048 amit.gupta 847
                    dict1 = todict(offer)
17166 amit.gupta 848
                    dict1["_id"] = dict1["orderId"] + "-" + dict1["productCode"]
17234 amit.gupta 849
                    dict1['status'] = status
17048 amit.gupta 850
                    collection.save(dict1)
16946 amit.gupta 851
#    def _saveToAffiliate(self, offers):
852
#        collection = self.db.snapdealOrderAffiliateInfo
853
#        mcollection = self.db.merchantOrder
854
#        for offer in offers:
855
#            offer = self.covertToObj(offer)
856
#            collection.update({"adId":offer.adId, "saleAmount":offer.saleAmount, "payOut":offer.payOut},{"$set":todict(offer)}, upsert=True)
857
#            mcollection.update({"subTagId":offer.subTagId, "storeId":self.store_id, "subOrders.missingAff":True}, {"$set":{"subOrders.$.missingAff":False}})
13569 amit.gupta 858
 
859
 
860
    def _getAllOffers(self, br, token):
861
        allOffers = []
862
        nextPage = 1  
863
        while True:
864
            data = getPostData(token, nextPage)
865
            response = br.open(POST_URL, data)
13680 amit.gupta 866
            rmap = json.loads(ungzipResponse(response))
13569 amit.gupta 867
            if rmap is not None:
868
                rmap = rmap['response']
14492 amit.gupta 869
                print rmap
13569 amit.gupta 870
                if rmap is not None and len(rmap['errors'])==0:
871
                    allOffers += rmap['data']['data']
872
            nextPage += 1
873
            if rmap['data']['pageCount']<nextPage:
874
                break
875
 
876
        return allOffers
877
 
16946 amit.gupta 878
#    def covertToObj(self,offer):
879
#        offerData = offer['Stat']
880
#        offer1 = AffiliateInfo(offerData['affiliate_info1'], self.store_id, offerData['conversion_status'], offerData['ad_id'], 
881
#                              offerData['datetime'], int(float(offerData['payout'])), offer['Offer']['name'], offerData['ip'], int(float(offerData['conversion_sale_amount'])))
882
#        offer1.saleTime = int(time.mktime(datetime.strptime(offer1.saleDate, "%Y-%m-%d %H:%M:%S").timetuple()))
883
#        return offer1
16975 amit.gupta 884
    def parseInfo(self,):
885
        from pyquery import PyQuery as pq
16985 amit.gupta 886
        orders = list(session.query(Orders).filter_by(store_id=self.store_id).filter_by(status='ORDER_CREATED').group_by(Orders.user_id).all())
16975 amit.gupta 887
        try:
888
            for order in orders:
889
                try:
890
                    doc = pq(order.rawhtml)
16985 amit.gupta 891
                    a1= " ".join(["" if not div.text else div.text.replace("\t","").replace("\n","").strip() for div in pq(doc('article')[-1])('div')]).strip()
892
                    a2 = ",".join(["" if not div.text else div.text.replace("\t","").replace("\n","").replace(" ", "") for div in pq(doc('article')[-2])('div')]).strip()
893
                    user_address = All_user_addresses()
894
                    user_address.address = a1
16975 amit.gupta 895
                    all = a2.split(",")
16985 amit.gupta 896
                    user_address.source = 'order'
897
                    user_address.user_id = order.user_id
898
                    #user_address. = all[3].split(":")[1]
899
                    #user_address. = all[2].split(":")[1]
900
                    #orderInfo.mobile = all[-1].split(":")[1]
16977 amit.gupta 901
                    adSplit = a1.split(",")
16985 amit.gupta 902
                    user_address.city = adSplit[-2].strip()
903
                    user_address.pincode = adSplit[-1].strip().split(" ")[0]
16991 amit.gupta 904
                    user_address.state = adSplit[-1].strip().split(" ")[1]
16975 amit.gupta 905
                    session.commit()
906
                except:
907
                    session.rollback()
908
                    continue
909
        finally:
910
            session.close()
16946 amit.gupta 911
 
13569 amit.gupta 912
    def covertToObj(self,offer):
17667 amit.gupta 913
 
914
        offer1 = AffiliateInfo(offer["affiliateSubId1"], 3, None, None, utils.toTimeStamp(datetime.strptime(offer["dateTime"], "%m/%d/%Y %H:%M:%S")),   
915
                               offer["commissionEarned"], None, None, offer["sale"])
916
        offer1.orderId = offer.get('orderCode') if offer.get('orderCode')  else None
917
        offer1.productCode = offer["product"]
918
        offer1.unitPrice = offer["price"]
919
        offer1.quantity = offer["quantity"]
920
        offer1.saleTime = offer["dateTime"] 
13569 amit.gupta 921
        return offer1
922
def getPostData(token, page = 1, limit= 20, startDate=None, endDate=None):
13680 amit.gupta 923
    endDate=date.today() + timedelta(days=1)
924
    startDate=endDate - timedelta(days=31)
13569 amit.gupta 925
 
926
    parameters = (
927
        ("page",str(page)),
928
        ("limit",str(limit)),
929
        ("fields[]","Stat.offer_id"),
930
        ("fields[]","Stat.datetime"),
931
        ("fields[]","Offer.name"),
932
        ("fields[]","Stat.conversion_status"),
933
        ("fields[]","Stat.conversion_sale_amount"),
934
        ("fields[]","Stat.payout"),
935
        ("fields[]","Stat.ip"),
936
        ("fields[]","Stat.ad_id"),
937
        ("fields[]","Stat.affiliate_info1"),
938
        ("sort[Stat.datetime]","desc"),
939
        ("filters[Stat.date][conditional]","BETWEEN"),
940
        ("filters[Stat.date][values][]",startDate.strftime('%Y-%m-%d')),
941
        ("filters[Stat.date][values][]",endDate.strftime('%Y-%m-%d')),
942
        ("data_start",startDate.strftime('%Y-%m-%d')),
943
        ("data_end",endDate.strftime('%Y-%m-%d')),
944
        ("Method","getConversions"),
945
        ("NetworkId","jasper"),
946
        ("SessionToken",token),
947
    )
948
    #Encode the parameters
949
    return urllib.urlencode(parameters)
950
 
16975 amit.gupta 951
 
13569 amit.gupta 952
def main():
14458 amit.gupta 953
    #print todict([1,2,"3"])
14402 amit.gupta 954
    store = getStore(3)
18163 amit.gupta 955
    store.scrapeStoreOrders()
956
    #store.parseOrderRawHtml(332222, "3232311", 2, readSSh("/home/amit/sample1.html"), "    https://m.snapdeal.com/purchaseMobileComplete?code=a8b3420d4c5bc248ea887df6c9b3a724&order=10478372453")
17855 amit.gupta 957
    #store.scrapeAffiliate()
17387 amit.gupta 958
    #https://m.snapdeal.com/purchaseMobileComplete?code=3fbc8a02a1c4d3c4e906f46886de0464&order=5808451506
959
    #https://m.snapdeal.com/purchaseMobileComplete?code=9f4dfa49ff08a16d04c5e4bf519506fc&order=9611672826
960
 
17394 amit.gupta 961
#    orders = list(session.query(OrdersRaw).filter_by(store_id=3).filter_by(status='ORDER_NOT_CREATED').all())
962
#    for o in orders:
963
#        result = store.parseOrderRawHtml(o.id, o.sub_tag, o.user_id, o.rawhtml, o.order_url)['result']
964
#        o.status = result
965
#    session.commit()
966
#    session.close() 
20308 amit.gupta 967
#    store.scrapeStoreOrders()
13662 amit.gupta 968
    #store._isSubOrderActive(8, "5970688907")
17237 amit.gupta 969
    #store.scrapeAffiliate(datetime(2015,4,1))
14758 amit.gupta 970
    #store.scrapeStoreOrders()
16997 amit.gupta 971
    #store.parseInfo()
13569 amit.gupta 972
 
17394 amit.gupta 973
class obj(object):
974
    def __init__(self, d):
975
        for a, b in d.items():
976
            if isinstance(b, (list, tuple)):
977
               setattr(self, a, [obj(x) if isinstance(x, dict) else x for x in b])
978
            else:
979
               setattr(self, a, obj(b) if isinstance(b, dict) else b)
980
 
19428 manas 981
 
13576 amit.gupta 982
def todict(obj, classkey=None):
983
    if isinstance(obj, dict):
984
        data = {}
985
        for (k, v) in obj.items():
986
            data[k] = todict(v, classkey)
987
        return data
988
    elif hasattr(obj, "_ast"):
989
        return todict(obj._ast())
990
    elif hasattr(obj, "__iter__"):
991
        return [todict(v, classkey) for v in obj]
992
    elif hasattr(obj, "__dict__"):
993
        data = dict([(key, todict(value, classkey)) 
994
            for key, value in obj.__dict__.iteritems() 
995
            if not callable(value) and not key.startswith('_')])
996
        if classkey is not None and hasattr(obj, "__class__"):
997
            data[classkey] = obj.__class__.__name__
998
        return data
999
    else:
1000
        return obj
14239 amit.gupta 1001
 
1002
if __name__ == '__main__':
1003
    main()