Subversion Repositories SmartDukaan

Rev

Rev 15930 | Rev 16988 | 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)
14460 amit.gupta 139
 
140
        for r in result:
141
            row += 1
142
            column = 0
143
            for data in r :
144
                worksheet.write(row, column, int(data) if type(data) is float else data, datetime_format if type(data) is datetime.datetime else default_format)
145
                column += 1
146
        workbook.save(TMP_FILE)
15666 amit.gupta 147
        generateGroupSegmentationReport(workbook)
15637 amit.gupta 148
        sendmail(["rajneesh.arora@saholic.com"], "", TMP_FILE, SUBJECT)
15666 amit.gupta 149
        #sendmail([], "", TMP_FILE, SUBJECT)
14460 amit.gupta 150
    except:
14721 amit.gupta 151
        traceback.print_exc()
14460 amit.gupta 152
        print "Could not create report"
153
 
15666 amit.gupta 154
def generateGroupSegmentationReport(workbook):
155
    selectSql = GROUP_SEGMENTATION_QUERY
156
    conn = getDbConnection()
157
    try:
158
        # prepare a cursor object using cursor() method
159
        cursor = conn.cursor()
160
        # Execute the SQL command
161
        # Fetch source id.
162
        cursor.execute(selectSql)
163
        result = cursor.fetchall()
164
        worksheet = workbook.add_sheet("Segmented User Group")
165
        boldStyle = xlwt.XFStyle()
166
        f = xlwt.Font()
167
        f.bold = True
168
        boldStyle.font = f
169
        column = 0
170
        row = 0
171
        worksheet.write(row, 0, 'User Segment', boldStyle)
15714 amit.gupta 172
        worksheet.write(row, 1, 'First Id', boldStyle)
15715 amit.gupta 173
        worksheet.write(row, 2, 'Last Id', boldStyle)
174
        worksheet.write(row, 3, 'Username', boldStyle)
175
        worksheet.write(row, 4, 'Name', boldStyle)
176
        worksheet.write(row, 5, 'Mobile', boldStyle)
177
        worksheet.write(row, 6, 'UserGroupId', boldStyle)
178
        worksheet.write(row, 7, 'Group basis', boldStyle)
179
        worksheet.write(row, 8, 'Users Count', boldStyle)
180
        worksheet.write(row, 9, 'User last created', boldStyle)
181
        worksheet.write(row, 10, 'User first created', boldStyle)
182
        worksheet.write(row, 11, 'User Last Active On', boldStyle)
183
        worksheet.write(row, 12, 'Order Last Created On', boldStyle)
184
        worksheet.write(row, 13, 'Total Orders', boldStyle)
15666 amit.gupta 185
        for r in result:
186
            row += 1
187
            column = 0
188
            for data in r :
189
                worksheet.write(row, column, int(data) if type(data) is float else data, datetime_format if type(data) is datetime.datetime else default_format)
190
                column += 1
191
        workbook.save(TMP_FILE)
192
    except:
193
        traceback.print_exc()
194
        print "Could not create report"
195
 
14460 amit.gupta 196
def sendmail(email, message, fileName, title):
197
    if email == "":
198
        return
199
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
200
    mailServer.ehlo()
201
    mailServer.starttls()
202
    mailServer.ehlo()
203
 
204
    # Create the container (outer) email message.
205
    msg = MIMEMultipart()
206
    msg['Subject'] = title
207
    msg.preamble = title
208
    html_msg = MIMEText(message, 'html')
209
    msg.attach(html_msg)
210
 
211
    fileMsg = MIMEBase('application', 'vnd.ms-excel')
212
    fileMsg.set_payload(file(TMP_FILE).read())
213
    encoders.encode_base64(fileMsg)
214
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
215
    msg.attach(fileMsg)
216
 
217
 
218
    email.append('amit.gupta@shop2020.in')
219
    MAILTO = email 
220
    mailServer.login(SENDER, PASSWORD)
221
    mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())
222
 
223
def main():
224
    generateSegmentationReport()
225
 
226
if __name__ == '__main__':
227
    main()