Subversion Repositories SmartDukaan

Rev

Rev 3517 | Go to most recent revision | Details | Compare with Previous | 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
 
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)
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
 
3837 vikas 120
        firstSourceId = getSourceId(isPaidFirstSource, firstSource)
121
        sessionSourceId = getSourceId(isPaidSessionSource, sessionSource)
3517 vikas 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
 
3837 vikas 147
        results.append((dateDelta, catalogId, firstSourceId, sessionSourceId, view, addToCart, addToResearch, 
3517 vikas 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()