Subversion Repositories SmartDukaan

Rev

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