Subversion Repositories SmartDukaan

Rev

Rev 16987 | Rev 16994 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
14460 amit.gupta 1
'''
2
Created on Mar 10, 2015
3
 
4
@author: amit
5
'''
6
from datetime import date
7
from email import encoders
8
from email.mime.base import MIMEBase
9
from email.mime.multipart import MIMEMultipart
10
from email.mime.text import MIMEText
11
import MySQLdb
12
import datetime
13
import smtplib
14721 amit.gupta 14
import traceback
14460 amit.gupta 15
import xlwt
16
 
17
 
18
 
19
DB_HOST = "localhost"
20
DB_USER = "root"
21
DB_PASSWORD = "shop2020"
22
DB_NAME = "dtr"
23
TMP_FILE = "/tmp/usersegmentreport.xls"  
24
 
25
# KEY NAMES
26
SENDER = "cnc.center@shop2020.in"
27
PASSWORD = "5h0p2o2o"
28
SUBJECT = "DTR User Segmentation report for " + date.today().isoformat()
29
SMTP_SERVER = "smtp.gmail.com"
30
SMTP_PORT = 587    
31
 
32
 
33
SEGMENTATION_QUERY = """
34
select case  
35
when created >= date(now()) - interval 3 day and total > 0 then 'ABU'
36
when created <  date(now()) - interval 3 day and total > 0 then 'IBU'
37
when last_active >=  date(now()) - interval 3 day and total = 0 and date(last_active) <> date(ucreated) then 'ANBU'
38
when ucreated <  date(now()) - interval 3 day and total = 0 and last_active <  date(now()) - interval 3 day then 'INU'
39
when ucreated >=  date(now()) - interval 3 day and total = 0 and date(last_active) = date(ucreated) then 'FIU'
40
else 'OTH'
41
end
42
usersegment, final.*
15512 amit.gupta 43
from (select u.id, u.username, u.first_name, u.mobile_number, u.mobile_verified,u.usergroup_id, ug.groupbasis,
14460 amit.gupta 44
if(bp.user_id is null, 'FALSE', 'TRUE') as bpref,
14721 amit.gupta 45
if(pp.user_id is null, 'FALSE', 'TRUE') as ppref, u.created ucreated, ua.last_active, ow.created, if(ow.total is null, 0, ow.total) as total,
15924 amit.gupta 46
u.referrer,u.utm_campaign, u.utm_content, u.utm_term, u.utm_medium, u.utm_source, u.activated, r.id as retailer_id, r.status, d.versioncode
16987 amit.gupta 47
, uas.comment, aua.store_name, aua.city, aua.pincode,aua.state, aua.source
15924 amit.gupta 48
from users u left join useractive ua on ua.user_id=u.id 
49
left join usergroups ug on ug.id=u.usergroup_id 
14460 amit.gupta 50
left join (select distinct user_id from price_preferences) pp on pp.user_id=u.id
51
left join (select distinct user_id from brand_preferences) bp on bp.user_id=u.id 
15924 amit.gupta 52
left join (select *, count(*) as total from (select user_id, created from order_view where status in ('ORDER_CREATED', 'DETAIL_CREATED') union all (select user_id, created from flipkartorders where date(created) >'2015-03-22') order by created desc) as a1 group by user_id) as ow on ow.user_id = u.id
53
left join user_activity_status uas on uas.user_id=u.id  
15929 amit.gupta 54
left join (select * from (select * from all_user_addresses order by source) s group by user_id)aua on aua.user_id=u.id
15924 amit.gupta 55
left join (select * from (select user_id, versioncode from devices order by created desc) c group by user_id) d on d.user_id=u.id
15885 amit.gupta 56
left join retailerlinks rl on rl.user_id=u.id left join retailers r on r.id=rl.retailer_id where (lower(u.referrer) not like 'emp%' or u.utm_campaign is not null) and u.activated = 1) final;
14460 amit.gupta 57
"""
15666 amit.gupta 58
GROUP_SEGMENTATION_QUERY = """
59
select case  
60
when created >= date(now()) - interval 3 day and total > 0 then 'ABU'
61
when created <  date(now()) - interval 3 day and total > 0 then 'IBU'
62
when last_active >=  date(now()) - interval 3 day and total = 0 and date(last_active) <> date(ucreated) then 'ANBU'
63
when ucreated <  date(now()) - interval 3 day and total = 0 and last_active <  date(now()) - interval 3 day then 'INU'
64
when ucreated >=  date(now()) - interval 3 day and total = 0 and date(last_active) = date(ucreated) then 'FIU'
65
else 'OTH'
66
end
67
usersegment, final.*  
15714 amit.gupta 68
from (select min(u.id), max(u.id), u.username, u.first_name, u.mobile_number, u.usergroup_id, ug.groupbasis, count(*),
15712 amit.gupta 69
max(u.created) ucreated, min(u.created) minucreated, max(ua.last_active) last_active, max(ow.created) created, if(sum(ow.total) is null, 0, sum(ow.total)) as total
15666 amit.gupta 70
from users u left join useractive ua on ua.user_id=u.id left join usergroups ug on ug.id=u.usergroup_id 
71
left join (select *, count(*) as total from (select user_id, created from order_view where status in ('ORDER_CREATED', 'DETAIL_CREATED') 
72
            union all (select user_id, created from flipkartorders where date(created) >'2015-03-22') order by created desc) as a1 group by user_id) as ow 
73
on ow.user_id = u.id  
15885 amit.gupta 74
where (lower(u.referrer) not like 'emp%' or u.utm_campaign is not null) and u.activated=1 group by usergroup_id) final;
15666 amit.gupta 75
"""
14460 amit.gupta 76
 
15666 amit.gupta 77
 
14460 amit.gupta 78
date_format = xlwt.XFStyle()
79
date_format.num_format_str = 'dd/mm/yyyy'
80
 
81
datetime_format = xlwt.XFStyle()
82
datetime_format.num_format_str = 'dd/mm/yyyy HH:MM AM/PM'
83
 
84
default_format = xlwt.XFStyle()
85
 
86
 
87
def getDbConnection():
88
    return MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
89
 
90
 
91
def generateSegmentationReport():
92
    selectSql = SEGMENTATION_QUERY
93
    conn = getDbConnection()
94
    try:
95
        # prepare a cursor object using cursor() method
96
        cursor = conn.cursor()
97
        # Execute the SQL command
98
        # Fetch source id.
99
        cursor.execute(selectSql)
100
        result = cursor.fetchall()
15930 amit.gupta 101
        workbook = xlwt.Workbook("ISO-8859-1")
14460 amit.gupta 102
        worksheet = workbook.add_sheet("Segmented User")
103
        boldStyle = xlwt.XFStyle()
104
        f = xlwt.Font()
105
        f.bold = True
106
        boldStyle.font = f
107
        column = 0
108
        row = 0
109
 
110
        worksheet.write(row, 0, 'User Segment', boldStyle)
111
        worksheet.write(row, 1, 'User Id', boldStyle)
112
        worksheet.write(row, 2, 'Username', boldStyle)
113
        worksheet.write(row, 3, 'Name', boldStyle)
114
        worksheet.write(row, 4, 'Mobile', boldStyle)
14544 amit.gupta 115
        worksheet.write(row, 5, 'Mobile Verified', boldStyle)
15507 amit.gupta 116
        worksheet.write(row, 6, 'UserGroupId', boldStyle)
15512 amit.gupta 117
        worksheet.write(row, 7, 'Group basis', boldStyle)
118
        worksheet.write(row, 8, 'Brand Preference', boldStyle)
119
        worksheet.write(row, 9, 'Pricing Preference', boldStyle)
120
        worksheet.write(row, 10, 'User Created On', boldStyle)
121
        worksheet.write(row, 11, 'User Last Active On', boldStyle)
122
        worksheet.write(row, 12, 'Order Last Created On', boldStyle)
123
        worksheet.write(row, 13, 'Total Orders', boldStyle)
124
        worksheet.write(row, 14, 'Referrer', boldStyle)
125
        worksheet.write(row, 15, 'Campaign', boldStyle)
126
        worksheet.write(row, 16, 'Content', boldStyle)
127
        worksheet.write(row, 17, 'Term', boldStyle)
128
        worksheet.write(row, 18, 'Medium', boldStyle)
129
        worksheet.write(row, 19, 'Utm Source', boldStyle)
130
        worksheet.write(row, 20, 'Activation Flag', boldStyle)
15637 amit.gupta 131
        worksheet.write(row, 21, 'Retailer Id', boldStyle)
132
        worksheet.write(row, 22, 'Retailer Status', boldStyle)
15924 amit.gupta 133
        worksheet.write(row, 23, 'Version Code', boldStyle)
134
        worksheet.write(row, 24, 'Install', boldStyle)
135
        worksheet.write(row, 25, 'Store', boldStyle)
136
        worksheet.write(row, 26, 'City', boldStyle)
137
        worksheet.write(row, 27, 'Pincode', boldStyle)
138
        worksheet.write(row, 28, 'State', boldStyle)
16988 amit.gupta 139
        worksheet.write(row, 29, 'Source', boldStyle)
14460 amit.gupta 140
 
141
        for r in result:
142
            row += 1
143
            column = 0
144
            for data in r :
145
                worksheet.write(row, column, int(data) if type(data) is float else data, datetime_format if type(data) is datetime.datetime else default_format)
146
                column += 1
147
        workbook.save(TMP_FILE)
15666 amit.gupta 148
        generateGroupSegmentationReport(workbook)
15637 amit.gupta 149
        sendmail(["rajneesh.arora@saholic.com"], "", TMP_FILE, SUBJECT)
15666 amit.gupta 150
        #sendmail([], "", TMP_FILE, SUBJECT)
14460 amit.gupta 151
    except:
14721 amit.gupta 152
        traceback.print_exc()
14460 amit.gupta 153
        print "Could not create report"
154
 
15666 amit.gupta 155
def generateGroupSegmentationReport(workbook):
156
    selectSql = GROUP_SEGMENTATION_QUERY
157
    conn = getDbConnection()
158
    try:
159
        # prepare a cursor object using cursor() method
160
        cursor = conn.cursor()
161
        # Execute the SQL command
162
        # Fetch source id.
163
        cursor.execute(selectSql)
164
        result = cursor.fetchall()
165
        worksheet = workbook.add_sheet("Segmented User Group")
166
        boldStyle = xlwt.XFStyle()
167
        f = xlwt.Font()
168
        f.bold = True
169
        boldStyle.font = f
170
        column = 0
171
        row = 0
172
        worksheet.write(row, 0, 'User Segment', boldStyle)
15714 amit.gupta 173
        worksheet.write(row, 1, 'First Id', boldStyle)
15715 amit.gupta 174
        worksheet.write(row, 2, 'Last Id', boldStyle)
175
        worksheet.write(row, 3, 'Username', boldStyle)
176
        worksheet.write(row, 4, 'Name', boldStyle)
177
        worksheet.write(row, 5, 'Mobile', boldStyle)
178
        worksheet.write(row, 6, 'UserGroupId', boldStyle)
179
        worksheet.write(row, 7, 'Group basis', boldStyle)
180
        worksheet.write(row, 8, 'Users Count', boldStyle)
181
        worksheet.write(row, 9, 'User last created', boldStyle)
182
        worksheet.write(row, 10, 'User first created', boldStyle)
183
        worksheet.write(row, 11, 'User Last Active On', boldStyle)
184
        worksheet.write(row, 12, 'Order Last Created On', boldStyle)
185
        worksheet.write(row, 13, 'Total Orders', boldStyle)
15666 amit.gupta 186
        for r in result:
187
            row += 1
188
            column = 0
189
            for data in r :
190
                worksheet.write(row, column, int(data) if type(data) is float else data, datetime_format if type(data) is datetime.datetime else default_format)
191
                column += 1
192
        workbook.save(TMP_FILE)
193
    except:
194
        traceback.print_exc()
195
        print "Could not create report"
196
 
14460 amit.gupta 197
def sendmail(email, message, fileName, title):
198
    if email == "":
199
        return
200
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
201
    mailServer.ehlo()
202
    mailServer.starttls()
203
    mailServer.ehlo()
204
 
205
    # Create the container (outer) email message.
206
    msg = MIMEMultipart()
207
    msg['Subject'] = title
208
    msg.preamble = title
209
    html_msg = MIMEText(message, 'html')
210
    msg.attach(html_msg)
211
 
212
    fileMsg = MIMEBase('application', 'vnd.ms-excel')
213
    fileMsg.set_payload(file(TMP_FILE).read())
214
    encoders.encode_base64(fileMsg)
215
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
216
    msg.attach(fileMsg)
217
 
218
 
219
    email.append('amit.gupta@shop2020.in')
220
    MAILTO = email 
221
    mailServer.login(SENDER, PASSWORD)
222
    mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())
223
 
224
def main():
225
    generateSegmentationReport()
226
 
227
if __name__ == '__main__':
228
    main()