Subversion Repositories SmartDukaan

Rev

Rev 14221 | Go to most recent revision | Details | 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
 
23
headers = { 
24
           'User-agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
25
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
26
            'Accept-Language' : 'en-US,en;q=0.8',                     
27
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'
28
        }
29
SAHOLIC_ORDER_URL=PythonPropertyReader.getConfig('SAHOLIC_ORDER_URL')
30
class Store(MStore):
31
    '''
32
    This is to map order statuses of our system to order statuses of snapdeal.
33
    And our statuses will change accordingly.
34
 
35
    '''
36
    OrderStatusMap = {
37
                      MStore.ORDER_PLACED : [2,3,4,5,6,7,8,13],
38
                      MStore.ORDER_DELIVERED : [12],
39
                      MStore.ORDER_SHIPPED : [9,10,16,17,20,21,81,80],
40
                      MStore.ORDER_CANCELLED : [6,11,14,15,18,19,31,28,53,54,55,56]
41
                      }
42
 
43
 
44
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
45
        paymentId = int(re.findall(r'=(.*)?','http://www.saholic.com/pay-success?paymentId=1528903')[0])
46
        orderRequest = urllib2.Request(SAHOLIC_ORDER_URL %(paymentId), headers=headers)
47
        try:
48
            response = urllib2.urlopen(orderRequest).read()
49
            response = json.loads(response)['response']
50
            payment = response['payment']
51
            orders = response['orders']
52
            items = response['items']
53
            orders[0]
54
            merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
55
            merchantOrder.merchantOrderId = payment['merchantTxnId']
56
            merchantOrder.createdOn = datetime.strftime(datetime.fromtimestamp(orders[0]['created_timestamp']/1000),"%d %B %Y")
57
            merchantOrder.paidAmount = payment['amount']
58
 
59
            subOrders = []
60
            for o in orders:
61
                lineitem = o['lineitems'][0]
62
 
63
                item = items[lineitem['id']]
64
                brand = lineitem.get('brand')
65
                modelNumber = lineitem.get('model_number')
66
                modelName = lineitem.get('model_name')
67
                color = lineitem.get('color')
68
                productTitle = brand + (" " + modelName if modelName else "") + (" "  + modelNumber if modelNumber is not None else "") + ("(" + color +")" if color else "")
69
 
70
                subOrder = SubOrder(productTitle, None, merchantOrder.createdOn, o['total_amount']- o['gvAmount'])
71
 
72
                subOrder.merchantSubOrderId = o['id']
73
                subOrder.estimatedDeliveryDate = datetime.strftime(datetime.fromtimestamp(o['promised_delivery_time']/1000),"%d %B %Y")
74
                subOrder.imgUrl = item['imgUrl'] 
75
                subOrder.productUrl = item['url']
76
                subOrders.append(subOrder)
77
 
78
            merchantOrder.subOrders = subOrders
79
            self._saveToOrder(merchantOrder)
80
        except:
81
            tprint("Could not fetch saholic id for user : " + str(userId))
82
 
83
 
84
    def _getStatusFromDetailedStatus(self, detailedStatus):
85
        for key, value in Store.OrderStatusMap.iteritems():
86
            if detailedStatus in value:
87
                return key
88
            print "Detailed Status need to be mapped"
89
        raise ParseException("_getStatusFromDetailedStatus", "Found new order status" + detailedStatus)
90
 
91
 
92
    def scrapeStoreOrders(self,):
93
        pass
94
 
95
    def _saveToAffiliate(self, offers):
96
        if offers is None or len(offers)==0:
97
            print "no affiliate have been pushed"
98
            return
99
        collection = self.db.snapdealOrderAffiliateInfo
100
        try:
101
            collection.insert(offers,continue_on_error=True)
102
        except pymongo.errors.DuplicateKeyError as e:
103
            print e.details
104
 
105
 
106
    def covertToObj(self,offer):
107
        offerData = offer['Stat']
108
        offer1 = AffiliateInfo(offerData['affiliate_info1'], self.store_id, offerData['conversion_status'], offerData['ad_id'], 
109
                              offerData['datetime'], offerData['payout'], offer['Offer']['name'], offerData['ip'], offerData['conversion_sale_amount'])
110
 
111
        return offer1
112
def getPostData(token, page = 1, limit= 20, startDate=None, endDate=None):
113
    endDate=date.today() + timedelta(days=1)
114
    startDate=endDate - timedelta(days=31)
115
 
116
    parameters = (
117
        ("page",str(page)),
118
        ("limit",str(limit)),
119
        ("fields[]","Stat.offer_id"),
120
        ("fields[]","Stat.datetime"),
121
        ("fields[]","Offer.name"),
122
        ("fields[]","Stat.conversion_status"),
123
        ("fields[]","Stat.conversion_sale_amount"),
124
        ("fields[]","Stat.payout"),
125
        ("fields[]","Stat.ip"),
126
        ("fields[]","Stat.ad_id"),
127
        ("fields[]","Stat.affiliate_info1"),
128
        ("sort[Stat.datetime]","desc"),
129
        ("filters[Stat.date][conditional]","BETWEEN"),
130
        ("filters[Stat.date][values][]",startDate.strftime('%Y-%m-%d')),
131
        ("filters[Stat.date][values][]",endDate.strftime('%Y-%m-%d')),
132
        ("data_start",startDate.strftime('%Y-%m-%d')),
133
        ("data_end",endDate.strftime('%Y-%m-%d')),
134
        ("Method","getConversions"),
135
        ("NetworkId","jasper"),
136
        ("SessionToken",token),
137
    )
138
    #Encode the parameters
139
    return urllib.urlencode(parameters)
140
 
141
def main():
142
 
143
    store = getStore(3)
144
    #store.scrapeStoreOrders()
145
    #store._isSubOrderActive(8, "5970688907")
146
    #store.scrapeAffiliate()
147
    store.parseOrderRawHtml(12345, "subtagId", 122323,  "html", 'http://www.saholic.com/pay-success?paymentId=1528903')
148
 
149
 
150
if __name__ == '__main__':
151
    main()
152
 
153
def todict(obj, classkey=None):
154
    if isinstance(obj, dict):
155
        data = {}
156
        for (k, v) in obj.items():
157
            data[k] = todict(v, classkey)
158
        return data
159
    elif hasattr(obj, "_ast"):
160
        return todict(obj._ast())
161
    elif hasattr(obj, "__iter__"):
162
        return [todict(v, classkey) for v in obj]
163
    elif hasattr(obj, "__dict__"):
164
        data = dict([(key, todict(value, classkey)) 
165
            for key, value in obj.__dict__.iteritems() 
166
            if not callable(value) and not key.startswith('_')])
167
        if classkey is not None and hasattr(obj, "__class__"):
168
            data[classkey] = obj.__class__.__name__
169
        return data
170
    else:
171
        return obj