Subversion Repositories SmartDukaan

Rev

Rev 3837 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
 
28
def getSourceId(source):
29
    if sourceIdMap.has_key(source) :
30
        return sourceIdMap[source] 
31
 
32
    # Prepare SQL query to insert new source into db.
33
    insertSql = "insert into source(url) values (%s)"
34
    selectSql = "select id from source where url = %s"
35
    conn = getDbConnection()
36
    try:
37
      # prepare a cursor object using cursor() method
38
      cursor = conn.cursor()
39
      # Execute the SQL command
40
      cursor.execute(insertSql, (source))
41
 
42
      # Fetch source id.
43
      cursor.execute(selectSql, (source))
44
      result = cursor.fetchone()
45
      sourceIdMap[source] = result[0]
46
    except Exception as e:
47
      print "Error: unable to fetch data"
48
      print e
49
 
50
    return sourceIdMap[source]
51
 
52
def loadSourceIdMap():
53
    conn = getDbConnection()
54
 
55
    # Prepare SQL query to load source mapping from db.
56
    sql = "select id, url from source"
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:
65
        sourceIdMap[row[1]] = row[0]
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 (
86
              date_id, catalog_item_id, is_first_source_paid, first_source_id, is_session_source_paid, session_source_id, 
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) 
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, %s, %s)
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)
109
    loadSourceIdMap()
110
 
111
    productActivities = json.loads(jsonString)
112
    results = []
113
    dateDelta = (date - datetime.datetime(2010,12,31)).days
114
    for activity in productActivities:
115
        isPaidFirstSource = 0 if not activity.has_key('isPaidFirstSource') else 1 if activity['isPaidFirstSource'] == 'true' else 0
116
        firstSource = str(activity['firstSource']) if activity.has_key('firstSource') else ""
117
        isPaidSessionSource = 0 if not activity.has_key('isPaidSessionSource') else 1 if activity['isPaidSessionSource'] == 'true' else 0
118
        sessionSource = str(activity['sessionSource']) if activity.has_key('sessionSource') else ""
119
 
120
        firstSourceId = getSourceId(firstSource)
121
        sessionSourceId = getSourceId(sessionSource)
122
 
123
        catalogId = int(activity['catalogId'])
124
 
125
        view = int(activity['view']) if activity.has_key('view') else 0
126
        addToCart = int(activity['addToCart']) if activity.has_key('addToCart') else 0
127
        addToResearch = int(activity['addToResearch']) if activity.has_key('addToResearch') else 0
128
        deleteFromCart = int(activity['deleteFromCart']) if activity.has_key('deleteFromCart') else 0
129
        deleteFromResearch = int(activity['deleteFromResearch']) if activity.has_key('deleteFromResearch') else 0
130
        shippingAccess = int(activity['shippingAccess']) if activity.has_key('shippingAccess') else 0
131
        paymentSuccess = int(activity['paymentSuccess']) if activity.has_key('paymentSuccess') else 0
132
        orderCreation = int(activity['orderCreation']) if activity.has_key('orderCreation') else 0
133
        paymentFailure = int(activity['paymentFailure']) if activity.has_key('paymentFailure') else 0
134
        proceedToPay = int(activity['proceedToPay']) if activity.has_key('proceedToPay') else 0
135
 
136
        uniqueView = int(activity['uniqueView']) if activity.has_key('uniqueView') else 0
137
        uniqueAddToCart = int(activity['uniqueAddToCart']) if activity.has_key('uniqueAddToCart') else 0
138
        uniqueAddToResearch = int(activity['uniqueAddToResearch']) if activity.has_key('uniqueAddToResearch') else 0
139
        uniqueDeleteFromCart = int(activity['uniqueDeleteFromCart']) if activity.has_key('uniqueDeleteFromCart') else 0
140
        uniqueDeleteFromResearch = int(activity['uniqueDeleteFromResearch']) if activity.has_key('uniqueDeleteFromResearch') else 0
141
        uniqueShippingAccess = int(activity['uniqueShippingAccess']) if activity.has_key('uniqueShippingAccess') else 0
142
        uniquePaymentSuccess = int(activity['uniquePaymentSuccess']) if activity.has_key('uniquePaymentSuccess') else 0
143
        uniqueOrderCreation = int(activity['uniqueOrderCreation']) if activity.has_key('uniqueOrderCreation') else 0
144
        uniquePaymentFailure = int(activity['uniquePaymentFailure']) if activity.has_key('uniquePaymentFailure') else 0
145
        uniqueProceedToPay = int(activity['uniqueProceedToPay']) if activity.has_key('uniqueProceedToPay') else 0
146
 
147
        results.append((dateDelta, catalogId, isPaidFirstSource, firstSourceId, isPaidSessionSource, sessionSourceId, view, addToCart, addToResearch, 
148
                        deleteFromCart, deleteFromResearch, shippingAccess, paymentSuccess, orderCreation, paymentFailure, proceedToPay, 
149
                        uniqueView, uniqueAddToCart, uniqueAddToResearch, uniqueDeleteFromCart, uniqueDeleteFromResearch, 
150
                        uniqueShippingAccess, uniquePaymentSuccess, uniqueOrderCreation, uniquePaymentFailure, uniqueProceedToPay))
151
 
152
    pushResultsToDb(results)
153
 
154
def main():
155
  if len(sys.argv) > 2:
156
    print "Usage : ProductActivityLoader.py [date-yyyyMMdd]"
157
    return
158
  if len(sys.argv) > 1:
159
    datestr = sys.argv[1]
160
    date = datetime.datetime.strptime(datestr, '%Y%m%d')
161
  else:
162
    date = datetime.datetime.today() - datetime.timedelta(1)
163
  start(date)
164
 
165
if __name__ == '__main__':
166
    main()