Subversion Repositories SmartDukaan

Rev

Rev 16283 | Rev 16374 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
14811 amit.gupta 1
'''
2
Created on Apr 12, 2015
3
 
4
@author: amit
5
'''
6
from bs4 import BeautifulSoup
7
from dtr import main
16371 amit.gupta 8
from dtr.dao import Order, SubOrder
14811 amit.gupta 9
from dtr.main import getBrowserObject, getStore, ParseException, ungzipResponse, \
16371 amit.gupta 10
    Store as MStore, sourceMap, tprint, todict
16283 amit.gupta 11
from dtr.sources.amazon import readSSh
14811 amit.gupta 12
from dtr.utils.utils import fetchResponseUsingProxy
13
from pymongo.mongo_client import MongoClient
16371 amit.gupta 14
from datetime import datetime, timedelta
15
import json
16
import traceback
14811 amit.gupta 17
 
18
class Store(MStore):
19
    OrderStatusMap = {
16371 amit.gupta 20
                      main.Store.ORDER_PLACED : ['in process', 'ready to be shipped', 'order recieved', 'order received'],
16283 amit.gupta 21
                      main.Store.ORDER_DELIVERED : ['delivered'],
16371 amit.gupta 22
                      main.Store.ORDER_SHIPPED : ['in transit', 'shipped'],
23
                      main.Store.ORDER_CANCELLED : ['failed', 'payment failed']
14811 amit.gupta 24
 
25
                      }
26
    def __init__(self,store_id):
27
        client = MongoClient('mongodb://localhost:27017/')
28
        self.db = client.dtr
29
        super(Store, self).__init__(store_id)
30
 
31
    def saveOrder(self, merchantOrder):
32
        MStore.saveOrder(self, merchantOrder)
16371 amit.gupta 33
 
34
    def parseTrackingUrl(self, trackingUrl):
35
        subOrder = {}
36
        page = fetchResponseUsingProxy(trackingUrl)
37
        soup = BeautifulSoup(page)
38
        subOrder['detailedStatus'] = soup.h1.text
39
        subOrder['status'] = self._getStatusFromDetailedStatus(subOrder['detailedStatus'])
14811 amit.gupta 40
 
16371 amit.gupta 41
 
14811 amit.gupta 42
    def scrapeStoreOrders(self):
16371 amit.gupta 43
        orders = self.db.merchantOrder.find({"storeId":1, "closed":False, "subOrders":{"$elemMatch":{"closed":False, "trackingUrl":{"$exists":True}}}})
44
        for merchantOrder in orders:
45
            executeBulk = False
46
            try:
47
                bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
48
                closed = True
49
                map1 = {}
50
                for subOrder in merchantOrder.get("subOrders"):
51
                    if subOrder.get("closed"):
52
                        continue
53
                    elif subOrder.get("trackingUrl") is None:
54
                        closed = False
55
                        continue
56
                    executeBulk = True
57
                    findMap = {"orderId":merchantOrder.get("orderId"), "subOrders.merchantSubOrderId":subOrder.get("merchantSubOrderId")} 
58
                    trackingUrl = subOrder.get("trackingUrl")
59
                    if not map1.has_key(trackingUrl):
60
                        map1[trackingUrl] = self.parseTrackingUrl(trackingUrl)
61
                    newOrder = map1.get(trackingUrl)
62
                    updateMap = self.getUpdateMap(newOrder, subOrder.get('cashBackStatus'))
63
                    print findMap, "\n", updateMap
64
                    bulk.find(findMap).update({'$set' : updateMap})
65
                    closed = closed and newOrder['closed']
66
                if executeBulk:
67
                    bulk.find({"orderId":merchantOrder.get("orderId")}).update({"$set":{"closed":closed, "parseError":False}})
68
                    bulk.execute()
69
            except:
70
                tprint("Could not update " + str(merchantOrder['orderId']) + " For store " + self.getName())
71
                self.db.merchantOrder.update({"orderId":merchantOrder['orderId']}, {"$set":{"parseError":True}})
72
                traceback.print_exc()
14811 amit.gupta 73
 
16371 amit.gupta 74
    def getTrackingUrls(self, userId):
75
        missingOrderUrls = []
76
        #missingOrders = self._getMissingOrders({'userId':userId})
77
        #for missingOrder in missingOrders:
78
        #    missingOrderUrls.append(ORDER_REDIRECT_URL%(missingOrder['merchantOrderId']))
79
        orders = self._getActiveOrders({'userId':userId, "subOrders.trackingUrl":{"$exists":False} })
80
        for order in orders:
81
            "https://paytm.com/shop/orderdetail/%s?actions=1&channel=web&version=2"%("")
82
            return missingOrderUrls
83
 
84
    def trackOrdersForUser(self, userId, url, rawHtml):
85
        ordermap = json.loads(rawHtml).get("order")
86
        for item in ordermap.get("items"):
87
            pass
88
 
16283 amit.gupta 89
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
16371 amit.gupta 90
        resp = {}
91
        #orderSuccessUrl = "https://paytm.com/shop/orderdetail/1155961075?actions=1&channel=web&version=2"
92
        ordermap = json.loads(rawHtml).get("order")
93
        if not ordermap.get("need_shipping"):
94
            resp['result'] = 'PAYTM_RECHARGE_ORDER'
95
            return resp
96
        order = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
97
        order.deliveryCharges = ordermap.get("shipping_charges") - ordermap.get("shipping_discount")
98
        order.merchantOrderId = str(ordermap.get("id"))  
99
        order.discountApplied = ordermap.get("discount_amount")
100
        order.paidAmount = ordermap.get("grandtotal")
101
        order.placedOn = ordermap.get("date") + " "+ ordermap.get("time") 
102
        order.requireDetail = False
103
        order.status = 'success'
104
        order.totalAmount = ordermap.get("subtotal")
105
        subOrders = []
106
        order.subOrders = subOrders
107
        for item in ordermap.get("items"):
108
            product = item.get("product")
109
            shareUrl = product.get("seourl").replace("catalog.paytm.com/v1", "paytm.com/shop")
110
            paytmcashback = 0
111
            for s in item.get("promo_text").split(): 
112
                if s.isdigit():
113
                    paytmcashback = int(s)
114
                    break
115
            amountPaid = item.get("subtotal") - paytmcashback 
116
            detailedStatus = item.get("status_text")
117
            status = self._getStatusFromDetailedStatus(detailedStatus)
118
            subOrder = SubOrder(item.get("title"), item.get("product").get(""), ordermap.get("date"), amountPaid, status, item.get("quantity"))
119
            subOrder.imgUrl = product.get("thumbnail")
120
            subOrder.productUrl = shareUrl
121
            subOrder.productCode = product.get("url").split("?")[0].split("/")[-1]
122
            subOrder.merchantSubOrderId = str(item.get("id"))
123
            if status == MStore.ORDER_PLACED: 
124
                subOrder.estimatedDeliveryDate = datetime.strftime(getISTDate(item.get("status_flow")[1].get("date")), "%d %b") 
125
                subOrder.estimatedShippingDate = datetime.strftime(getISTDate(item.get("status_flow")[2].get("date")), "%d %b")
126
            else:
127
                subOrder.closed = False
128
            subOrders.append(subOrder)
129
        self.populateDerivedFields(order)
130
        if self._saveToOrder(todict(order)):
131
            resp['result'] = 'ORDER_CREATED'
132
        else:
133
            resp['result'] = 'ORDER_ALREADY_CREATED_IGNORED'
14811 amit.gupta 134
 
16371 amit.gupta 135
        return resp
136
 
137
    def _getStatusFromDetailedStatus(self, detailedStatus):
138
        for key, value in Store.OrderStatusMap.iteritems():
139
            if detailedStatus.lower() in value:
140
                return key
141
        print "Detailed Status-", detailedStatus,  "need to be mapped for Store-", self.store_id
142
        return None
143
def getISTDate(tzString):
144
    tzDate = datetime.strptime(tzString, "%Y-%m-%dT%H:%M:%S.%fZ") 
145
    tzDate = tzDate + timedelta(0,19800)
146
    return tzDate
147
 
14811 amit.gupta 148
def main():
149
    store = getStore(6)
16283 amit.gupta 150
    #store.scrapeStoreOrders()
16371 amit.gupta 151
    store.parseOrderRawHtml(312119, 'SUB1', 14, readSSh("/home/amit/paytm.json"), "someurl")
14811 amit.gupta 152
 
153
if __name__ == '__main__':
154
    main()