Subversion Repositories SmartDukaan

Rev

Rev 3837 | 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)
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()