Subversion Repositories SmartDukaan

Rev

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