Subversion Repositories SmartDukaan

Rev

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