| 3517 |
vikas |
1 |
#!/usr/bin/python
|
|
|
2 |
|
|
|
3 |
"""
|
|
|
4 |
|
|
|
5 |
This script gets product activities by source for a date from google app engine and dumps it in pentaho bi database.
|
|
|
6 |
|
|
|
7 |
"""
|
|
|
8 |
|
|
|
9 |
import json
|
|
|
10 |
import urllib2
|
|
|
11 |
import MySQLdb
|
|
|
12 |
import datetime
|
|
|
13 |
import sys
|
|
|
14 |
|
|
|
15 |
DB_HOST = "localhost"
|
|
|
16 |
DB_USER = "root"
|
|
|
17 |
DB_PASSWORD = "shop2020"
|
|
|
18 |
DB_NAME = "sales"
|
|
|
19 |
|
|
|
20 |
sourceIdMap = {}
|
|
|
21 |
|
|
|
22 |
def getDbConnection():
|
|
|
23 |
return MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
|
|
|
24 |
|
|
|
25 |
def closeConnection(conn):
|
|
|
26 |
conn.close()
|
|
|
27 |
|
| 3837 |
vikas |
28 |
def getSourceId(is_paid, source):
|
|
|
29 |
if sourceIdMap.has_key((is_paid, source)) :
|
|
|
30 |
return sourceIdMap[(is_paid, source)]
|
| 3517 |
vikas |
31 |
|
|
|
32 |
# Prepare SQL query to insert new source into db.
|
| 3837 |
vikas |
33 |
insertSql = "insert into source(is_paid, url) values (%s, %s)"
|
|
|
34 |
selectSql = "select id from source where is_paid = %s and url = %s"
|
| 3517 |
vikas |
35 |
conn = getDbConnection()
|
|
|
36 |
try:
|
|
|
37 |
# prepare a cursor object using cursor() method
|
|
|
38 |
cursor = conn.cursor()
|
|
|
39 |
# Execute the SQL command
|
| 3837 |
vikas |
40 |
cursor.execute(insertSql, (is_paid, source))
|
| 3517 |
vikas |
41 |
|
|
|
42 |
# Fetch source id.
|
| 3837 |
vikas |
43 |
cursor.execute(selectSql, (is_paid, source))
|
| 3517 |
vikas |
44 |
result = cursor.fetchone()
|
| 3837 |
vikas |
45 |
sourceIdMap[(is_paid, source)] = result[0]
|
| 3517 |
vikas |
46 |
except Exception as e:
|
|
|
47 |
print "Error: unable to fetch data"
|
|
|
48 |
print e
|
|
|
49 |
|
| 3837 |
vikas |
50 |
return sourceIdMap[(is_paid, source)]
|
| 3517 |
vikas |
51 |
|
|
|
52 |
def loadSourceIdMap():
|
|
|
53 |
conn = getDbConnection()
|
|
|
54 |
|
|
|
55 |
# Prepare SQL query to load source mapping from db.
|
| 3837 |
vikas |
56 |
sql = "select id, is_paid, url from source"
|
| 3517 |
vikas |
57 |
try:
|
|
|
58 |
# prepare a cursor object using cursor() method
|
|
|
59 |
cursor = conn.cursor()
|
|
|
60 |
# Execute the SQL command
|
|
|
61 |
cursor.execute(sql)
|
|
|
62 |
# Fetch all the rows in a list of lists.
|
|
|
63 |
results = cursor.fetchall()
|
|
|
64 |
for row in results:
|
| 3837 |
vikas |
65 |
sourceIdMap[(row[1], row[2])] = row[0]
|
| 3517 |
vikas |
66 |
cursor.close()
|
|
|
67 |
except Exception as e:
|
|
|
68 |
print "Error: unable to fetch data"
|
|
|
69 |
print e
|
|
|
70 |
|
|
|
71 |
closeConnection(conn)
|
|
|
72 |
|
|
|
73 |
def pushResultsToDb(results):
|
|
|
74 |
conn = getDbConnection()
|
|
|
75 |
|
|
|
76 |
try:
|
|
|
77 |
# prepare a cursor object using cursor() method
|
|
|
78 |
cursor = conn.cursor()
|
|
|
79 |
|
|
|
80 |
# Clean db for the date
|
|
|
81 |
if len(results) > 0: cursor.execute("delete from productactivity where date_id = %s", results[0][0])
|
|
|
82 |
|
|
|
83 |
cursor.executemany (
|
|
|
84 |
"""
|
|
|
85 |
insert into productactivity (
|
| 3837 |
vikas |
86 |
date_id, catalog_item_id, first_source_id, session_source_id,
|
| 3517 |
vikas |
87 |
view, add_to_cart, add_to_research, delete_from_cart, delete_from_research, shipping_access,
|
|
|
88 |
payment_success, order_creation, payment_failure, proceed_to_pay, unique_view, unique_add_to_cart,
|
|
|
89 |
unique_add_to_research, unique_delete_from_cart, unique_delete_from_research, unique_shipping_access,
|
|
|
90 |
unique_payment_success, unique_order_creation, unique_payment_failure, unique_proceed_to_pay)
|
| 3837 |
vikas |
91 |
values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
| 3517 |
vikas |
92 |
""", results)
|
|
|
93 |
conn.commit()
|
|
|
94 |
results = []
|
|
|
95 |
cursor.close()
|
|
|
96 |
except Exception as e:
|
|
|
97 |
print "Error: unable to insert row"
|
|
|
98 |
print e
|
|
|
99 |
|
|
|
100 |
closeConnection(conn)
|
|
|
101 |
|
|
|
102 |
def downloadProductActivity(date):
|
|
|
103 |
url = urllib2.urlopen('http://saholic-datastore.appspot.com/jsp/export-product-activity-with-source.jsp?date=' + date.strftime("%Y%m%d"))
|
|
|
104 |
return url.read()
|
|
|
105 |
|
|
|
106 |
|
|
|
107 |
def start(date):
|
|
|
108 |
jsonString = downloadProductActivity(date)
|
| 5081 |
anupam.sin |
109 |
print jsonString
|
| 3517 |
vikas |
110 |
loadSourceIdMap()
|
|
|
111 |
|
|
|
112 |
productActivities = json.loads(jsonString)
|
|
|
113 |
results = []
|
|
|
114 |
dateDelta = (date - datetime.datetime(2010,12,31)).days
|
|
|
115 |
for activity in productActivities:
|
|
|
116 |
isPaidFirstSource = 0 if not activity.has_key('isPaidFirstSource') else 1 if activity['isPaidFirstSource'] == 'true' else 0
|
| 5081 |
anupam.sin |
117 |
try :
|
|
|
118 |
firstSource = str(activity['firstSource']) if activity.has_key('firstSource') else ""
|
|
|
119 |
except Exception as e:
|
|
|
120 |
firstSource = ""
|
| 3517 |
vikas |
121 |
isPaidSessionSource = 0 if not activity.has_key('isPaidSessionSource') else 1 if activity['isPaidSessionSource'] == 'true' else 0
|
| 5081 |
anupam.sin |
122 |
try :
|
|
|
123 |
sessionSource = str(activity['sessionSource']) if activity.has_key('sessionSource') else ""
|
|
|
124 |
except Exception as e:
|
|
|
125 |
sessionSource = ""
|
| 3837 |
vikas |
126 |
firstSourceId = getSourceId(isPaidFirstSource, firstSource)
|
|
|
127 |
sessionSourceId = getSourceId(isPaidSessionSource, sessionSource)
|
| 3517 |
vikas |
128 |
|
|
|
129 |
catalogId = int(activity['catalogId'])
|
|
|
130 |
|
|
|
131 |
view = int(activity['view']) if activity.has_key('view') else 0
|
|
|
132 |
addToCart = int(activity['addToCart']) if activity.has_key('addToCart') else 0
|
|
|
133 |
addToResearch = int(activity['addToResearch']) if activity.has_key('addToResearch') else 0
|
|
|
134 |
deleteFromCart = int(activity['deleteFromCart']) if activity.has_key('deleteFromCart') else 0
|
|
|
135 |
deleteFromResearch = int(activity['deleteFromResearch']) if activity.has_key('deleteFromResearch') else 0
|
|
|
136 |
shippingAccess = int(activity['shippingAccess']) if activity.has_key('shippingAccess') else 0
|
|
|
137 |
paymentSuccess = int(activity['paymentSuccess']) if activity.has_key('paymentSuccess') else 0
|
|
|
138 |
orderCreation = int(activity['orderCreation']) if activity.has_key('orderCreation') else 0
|
|
|
139 |
paymentFailure = int(activity['paymentFailure']) if activity.has_key('paymentFailure') else 0
|
|
|
140 |
proceedToPay = int(activity['proceedToPay']) if activity.has_key('proceedToPay') else 0
|
|
|
141 |
|
|
|
142 |
uniqueView = int(activity['uniqueView']) if activity.has_key('uniqueView') else 0
|
|
|
143 |
uniqueAddToCart = int(activity['uniqueAddToCart']) if activity.has_key('uniqueAddToCart') else 0
|
|
|
144 |
uniqueAddToResearch = int(activity['uniqueAddToResearch']) if activity.has_key('uniqueAddToResearch') else 0
|
|
|
145 |
uniqueDeleteFromCart = int(activity['uniqueDeleteFromCart']) if activity.has_key('uniqueDeleteFromCart') else 0
|
|
|
146 |
uniqueDeleteFromResearch = int(activity['uniqueDeleteFromResearch']) if activity.has_key('uniqueDeleteFromResearch') else 0
|
|
|
147 |
uniqueShippingAccess = int(activity['uniqueShippingAccess']) if activity.has_key('uniqueShippingAccess') else 0
|
|
|
148 |
uniquePaymentSuccess = int(activity['uniquePaymentSuccess']) if activity.has_key('uniquePaymentSuccess') else 0
|
|
|
149 |
uniqueOrderCreation = int(activity['uniqueOrderCreation']) if activity.has_key('uniqueOrderCreation') else 0
|
|
|
150 |
uniquePaymentFailure = int(activity['uniquePaymentFailure']) if activity.has_key('uniquePaymentFailure') else 0
|
|
|
151 |
uniqueProceedToPay = int(activity['uniqueProceedToPay']) if activity.has_key('uniqueProceedToPay') else 0
|
|
|
152 |
|
| 3837 |
vikas |
153 |
results.append((dateDelta, catalogId, firstSourceId, sessionSourceId, view, addToCart, addToResearch,
|
| 3517 |
vikas |
154 |
deleteFromCart, deleteFromResearch, shippingAccess, paymentSuccess, orderCreation, paymentFailure, proceedToPay,
|
|
|
155 |
uniqueView, uniqueAddToCart, uniqueAddToResearch, uniqueDeleteFromCart, uniqueDeleteFromResearch,
|
|
|
156 |
uniqueShippingAccess, uniquePaymentSuccess, uniqueOrderCreation, uniquePaymentFailure, uniqueProceedToPay))
|
|
|
157 |
|
|
|
158 |
pushResultsToDb(results)
|
|
|
159 |
|
|
|
160 |
def main():
|
|
|
161 |
if len(sys.argv) > 2:
|
|
|
162 |
print "Usage : ProductActivityLoader.py [date-yyyyMMdd]"
|
|
|
163 |
return
|
|
|
164 |
if len(sys.argv) > 1:
|
|
|
165 |
datestr = sys.argv[1]
|
|
|
166 |
date = datetime.datetime.strptime(datestr, '%Y%m%d')
|
|
|
167 |
else:
|
|
|
168 |
date = datetime.datetime.today() - datetime.timedelta(1)
|
| 5081 |
anupam.sin |
169 |
print date
|
| 3517 |
vikas |
170 |
start(date)
|
|
|
171 |
|
|
|
172 |
if __name__ == '__main__':
|
|
|
173 |
main()
|