Subversion Repositories SmartDukaan

Rev

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