Subversion Repositories SmartDukaan

Rev

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