Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
14220 amit.gupta 1
'''
2
Created on Jan 15, 2015
3
 
4
@author: amit
5
'''
6
from BeautifulSoup import BeautifulSoup
7
from bson.binary import Binary
8
from datetime import datetime, date, timedelta
9
from dtr import main
10
from dtr.config import PythonPropertyReader
11
from dtr.dao import AffiliateInfo, Order, SubOrder
12
from dtr.main import getBrowserObject, ScrapeException, getStore, ParseException, \
13
    Store as MStore, ungzipResponse, tprint
14
from pprint import pprint
15
from pymongo import MongoClient
16
import json
17
import pymongo
18
import re
19
import traceback
20
import urllib
21
import urllib2
22
 
14222 amit.gupta 23
ORDERSTATUS  = {"PAYMENT_PENDING" : 0,
24
"PAYMENT_FAILED" : 1,
25
"COD_VERIFICATION_PENDING" : 2,
26
"SUBMITTED_FOR_PROCESSING" : 3,
27
"ACCEPTED" : 4,
28
"INVENTORY_LOW" : 5,
29
"REJECTED" : 6,
30
"BILLED" : 7,
31
"PAYMENT_FLAGGED" : 8,
32
"SHIPPED_FROM_WH" : 9,
33
"SHIPPED_TO_LOGST" : 10,
34
"PAYMENT_FLAGGED_DENIED" : 11,
35
"DELIVERY_SUCCESS" : 12,
36
"CANCEL_REQUEST_RECEIVED" : 13,
37
"CANCEL_REQUEST_CONFIRMED" : 14,
38
"CANCELLED_ON_CUSTOMER_REQUEST" : 15,
39
"SHIPPED_TO_DESTINATION_CITY" : 16,
40
"REACHED_DESTINATION_CITY" : 17,
41
"COD_VERIFICATION_FAILED" : 18,
42
"FAILED" : 19,
43
"RTO_IN_TRANSIT" : 20,
44
"RTO_RECEIVED_PRESTINE" : 21,
45
"DOA_PICKUP_REQUEST_RAISED" : 22,
46
"DOA_PICKUP_CONFIRMED" : 23,
47
"DOA_RETURN_IN_TRANSIT" : 24,
48
"DOA_RECEIVED_PRESTINE" : 25,
49
"DOA_CERT_INVALID" : 26,
50
"DOA_CERT_VALID" : 27,
51
"RTO_RESHIPPED" : 28,
52
"DOA_INVALID_RESHIPPED" : 29,
53
"DOA_VALID_RESHIPPED" : 30,
54
"RTO_REFUNDED" : 31,
55
"DOA_VALID_REFUNDED" : 32,
56
"DOA_INVALID_REFUNDED" : 33,
57
"CANCELLED_DUE_TO_LOW_INVENTORY" : 34,
58
"LOW_INV_PO_RAISED" : 35,
59
"LOW_INV_REVERSAL_IN_PROCESS" : 36,
60
"LOW_INV_NOT_AVAILABLE_AT_HOTSPOT" : 37,
61
"LOW_INV_PO_RAISED_TIMEOUT" : 38,
62
"LOW_INV_REVERSAL_TIMEOUT" : 39,
63
"FIRST_DELIVERY_ATTEMPT_MADE" : 40,
64
"CAPTURE_IN_PROCESS" : 41,
65
"DOA_REQUEST_RECEIVED" : 42,
66
"DOA_REQUEST_AUTHORIZED" : 43,
67
"DOA_PICKUP_DENIED" : 44,
68
"DOA_RECEIVED_DAMAGED" : 45,
69
"DOA_LOST_IN_TRANSIT" : 46,
70
"DOA_RESHIPPED_RCVD_DAMAGED" : 47,
71
"DOA_REFUNDED_RCVD_DAMAGED" : 48,
72
"DOA_RESHIPPED_LOST_IN_TRANSIT" : 49,
73
"DOA_REFUNDED_LOST_IN_TRANSIT" : 50,
74
"RTO_RECEIVED_DAMAGED" : 51,
75
"RTO_LOST_IN_TRANSIT" : 52,
76
"RTO_DAMAGED_RESHIPPED" : 53,
77
"RTO_DAMAGED_REFUNDED" : 54,
78
"RTO_LOST_IN_TRANSIT_RESHIPPED" : 55,
79
"RTO_LOST_IN_TRANSIT_REFUNDED" : 56,
80
"RTO_INVENTORY_REVERSED" : 57,
81
"RET_REQUEST_RECEIVED" : 58,
82
"RET_REQUEST_AUTHORIZED" : 59,
83
"RET_PICKUP_REQUEST_RAISED" : 60,
84
"RET_PICKUP_DENIED" : 61,
85
"RET_PICKUP_CONFIRMED" : 62,
86
"RET_RETURN_IN_TRANSIT" : 63,
87
"RET_RECEIVED_PRESTINE" : 64,
88
"RET_RECEIVED_DAMAGED" : 65,
89
"RET_LOST_IN_TRANSIT" : 66,
90
"RET_PRODUCT_USABLE" : 67,
91
"RET_PRODUCT_UNUSABLE" : 68,
92
"RET_PRODUCT_USABLE_RESHIPPED" : 69,
93
"RET_PRODUCT_USABLE_REFUNDED" : 70,
94
"RET_PRODUCT_UNUSABLE_RESHIPPED" : 71,
95
"RET_PRODUCT_UNUSABLE_REFUNDED" : 72,
96
"RET_RESHIPPED_RCVD_DAMAGED" : 73,
97
"RET_REFUNDED_RCVD_DAMAGED" : 74,
98
"RET_RESHIPPED_LOST_IN_TRANSIT" : 75,
99
"RET_REFUNDED_LOST_IN_TRANSIT" : 76,
100
"LOST_IN_TRANSIT" : 77,
101
"LOST_IN_TRANSIT_RESHIPPED" : 78,
102
"LOST_IN_TRANSIT_REFUNDED" : 79,
103
"DELIVERED_AT_STORE" : 80,
104
"RECEIVED_AT_STORE" : 81}
14220 amit.gupta 105
headers = { 
106
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
107
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
108
            'Accept-Language' : 'en-US,en;q=0.8',                     
109
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
110
        }
111
SAHOLIC_ORDER_URL=PythonPropertyReader.getConfig('SAHOLIC_ORDER_URL')
112
class Store(MStore):
113
    '''
114
    This is to map order statuses of our system to order statuses of snapdeal.
115
    And our statuses will change accordingly.
116
 
117
    '''
118
    OrderStatusMap = {
119
                      MStore.ORDER_PLACED : [2,3,4,5,6,7,8,13],
120
                      MStore.ORDER_DELIVERED : [12],
121
                      MStore.ORDER_SHIPPED : [9,10,16,17,20,21,81,80],
122
                      MStore.ORDER_CANCELLED : [6,11,14,15,18,19,31,28,53,54,55,56]
123
                      }
124
 
125
 
126
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
127
        paymentId = int(re.findall(r'=(.*)?','http://www.saholic.com/pay-success?paymentId=1528903')[0])
128
        orderRequest = urllib2.Request(SAHOLIC_ORDER_URL %(paymentId), headers=headers)
129
        try:
130
            response = urllib2.urlopen(orderRequest).read()
131
            response = json.loads(response)['response']
132
            payment = response['payment']
133
            orders = response['orders']
134
            items = response['items']
135
            orders[0]
136
            merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
137
            merchantOrder.merchantOrderId = payment['merchantTxnId']
138
            merchantOrder.createdOn = datetime.strftime(datetime.fromtimestamp(orders[0]['created_timestamp']/1000),"%d %B %Y")
139
            merchantOrder.paidAmount = payment['amount']
140
 
141
            subOrders = []
142
            for o in orders:
143
                lineitem = o['lineitems'][0]
144
 
145
                item = items[lineitem['id']]
146
                brand = lineitem.get('brand')
147
                modelNumber = lineitem.get('model_number')
148
                modelName = lineitem.get('model_name')
149
                color = lineitem.get('color')
150
                productTitle = brand + (" " + modelName if modelName else "") + (" "  + modelNumber if modelNumber is not None else "") + ("(" + color +")" if color else "")
151
 
152
                subOrder = SubOrder(productTitle, None, merchantOrder.createdOn, o['total_amount']- o['gvAmount'])
153
 
154
                subOrder.merchantSubOrderId = o['id']
155
                subOrder.estimatedDeliveryDate = datetime.strftime(datetime.fromtimestamp(o['promised_delivery_time']/1000),"%d %B %Y")
156
                subOrder.imgUrl = item['imgUrl'] 
14221 amit.gupta 157
                subOrder.productUrl = "http://m.saholic.com/" + item['url']
14222 amit.gupta 158
                subOrder.detailedStatus = o['statusDescription']
14220 amit.gupta 159
                subOrders.append(subOrder)
160
 
161
            merchantOrder.subOrders = subOrders
162
            self._saveToOrder(merchantOrder)
163
        except:
164
            tprint("Could not fetch saholic id for user : " + str(userId))
165
 
166
 
167
    def _getStatusFromDetailedStatus(self, detailedStatus):
168
        for key, value in Store.OrderStatusMap.iteritems():
169
            if detailedStatus in value:
170
                return key
171
            print "Detailed Status need to be mapped"
172
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
173
 
174
 
175
    def scrapeStoreOrders(self,):
176
        pass
177
 
178
    def _saveToAffiliate(self, offers):
179
        if offers is None or len(offers)==0:
180
            print "no affiliate have been pushed"
181
            return
182
        collection = self.db.snapdealOrderAffiliateInfo
183
        try:
184
            collection.insert(offers,continue_on_error=True)
185
        except pymongo.errors.DuplicateKeyError as e:
186
            print e.details
187
 
188
 
189
    def covertToObj(self,offer):
190
        offerData = offer['Stat']
191
        offer1 = AffiliateInfo(offerData['affiliate_info1'], self.store_id, offerData['conversion_status'], offerData['ad_id'], 
192
                              offerData['datetime'], offerData['payout'], offer['Offer']['name'], offerData['ip'], offerData['conversion_sale_amount'])
193
 
194
        return offer1
195
def getPostData(token, page = 1, limit= 20, startDate=None, endDate=None):
196
    endDate=date.today() + timedelta(days=1)
197
    startDate=endDate - timedelta(days=31)
198
 
199
    parameters = (
200
        ("page",str(page)),
201
        ("limit",str(limit)),
202
        ("fields[]","Stat.offer_id"),
203
        ("fields[]","Stat.datetime"),
204
        ("fields[]","Offer.name"),
205
        ("fields[]","Stat.conversion_status"),
206
        ("fields[]","Stat.conversion_sale_amount"),
207
        ("fields[]","Stat.payout"),
208
        ("fields[]","Stat.ip"),
209
        ("fields[]","Stat.ad_id"),
210
        ("fields[]","Stat.affiliate_info1"),
211
        ("sort[Stat.datetime]","desc"),
212
        ("filters[Stat.date][conditional]","BETWEEN"),
213
        ("filters[Stat.date][values][]",startDate.strftime('%Y-%m-%d')),
214
        ("filters[Stat.date][values][]",endDate.strftime('%Y-%m-%d')),
215
        ("data_start",startDate.strftime('%Y-%m-%d')),
216
        ("data_end",endDate.strftime('%Y-%m-%d')),
217
        ("Method","getConversions"),
218
        ("NetworkId","jasper"),
219
        ("SessionToken",token),
220
    )
221
    #Encode the parameters
222
    return urllib.urlencode(parameters)
223
 
224
def main():
225
 
226
    store = getStore(3)
227
    #store.scrapeStoreOrders()
228
    #store._isSubOrderActive(8, "5970688907")
229
    #store.scrapeAffiliate()
230
    store.parseOrderRawHtml(12345, "subtagId", 122323,  "html", 'http://www.saholic.com/pay-success?paymentId=1528903')
231
 
232
 
233
if __name__ == '__main__':
234
    main()
235
 
236
def todict(obj, classkey=None):
237
    if isinstance(obj, dict):
238
        data = {}
239
        for (k, v) in obj.items():
240
            data[k] = todict(v, classkey)
241
        return data
242
    elif hasattr(obj, "_ast"):
243
        return todict(obj._ast())
244
    elif hasattr(obj, "__iter__"):
245
        return [todict(v, classkey) for v in obj]
246
    elif hasattr(obj, "__dict__"):
247
        data = dict([(key, todict(value, classkey)) 
248
            for key, value in obj.__dict__.iteritems() 
249
            if not callable(value) and not key.startswith('_')])
250
        if classkey is not None and hasattr(obj, "__class__"):
251
            data[classkey] = obj.__class__.__name__
252
        return data
253
    else:
254
        return obj