Subversion Repositories SmartDukaan

Rev

Rev 15755 | Rev 15758 | 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,
15637 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   
15512 amit.gupta 47
from users u left join useractive ua on ua.user_id=u.id left join usergroups ug on ug.id=u.usergroup_id 
14460 amit.gupta 48
left join (select distinct user_id from price_preferences) pp on pp.user_id=u.id
49
left join (select distinct user_id from brand_preferences) bp on bp.user_id=u.id 
15649 amit.gupta 50
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  
15756 amit.gupta 51
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 lower(u.referrer) is null) and u.activated = 1) final;
14460 amit.gupta 52
"""
53
 
15666 amit.gupta 54
GROUP_SEGMENTATION_QUERY = """
55
select case  
56
when created >= date(now()) - interval 3 day and total > 0 then 'ABU'
57
when created <  date(now()) - interval 3 day and total > 0 then 'IBU'
58
when last_active >=  date(now()) - interval 3 day and total = 0 and date(last_active) <> date(ucreated) then 'ANBU'
59
when ucreated <  date(now()) - interval 3 day and total = 0 and last_active <  date(now()) - interval 3 day then 'INU'
60
when ucreated >=  date(now()) - interval 3 day and total = 0 and date(last_active) = date(ucreated) then 'FIU'
61
else 'OTH'
62
end
63
usersegment, final.*  
15714 amit.gupta 64
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 65
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 66
from users u left join useractive ua on ua.user_id=u.id left join usergroups ug on ug.id=u.usergroup_id 
67
left join (select *, count(*) as total from (select user_id, created from order_view where status in ('ORDER_CREATED', 'DETAIL_CREATED') 
68
            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 
69
on ow.user_id = u.id  
15756 amit.gupta 70
where (lower(u.referrer) not like 'emp%' or lower(u.referrer) is null) and u.activated=1 group by usergroup_id) final;
15666 amit.gupta 71
"""
14460 amit.gupta 72
 
15666 amit.gupta 73
 
14460 amit.gupta 74
date_format = xlwt.XFStyle()
75
date_format.num_format_str = 'dd/mm/yyyy'
76
 
77
datetime_format = xlwt.XFStyle()
78
datetime_format.num_format_str = 'dd/mm/yyyy HH:MM AM/PM'
79
 
80
default_format = xlwt.XFStyle()
81
 
82
 
83
def getDbConnection():
84
    return MySQLdb.connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME)
85
 
86
 
87
def generateSegmentationReport():
88
    selectSql = SEGMENTATION_QUERY
89
    conn = getDbConnection()
90
    try:
91
        # prepare a cursor object using cursor() method
92
        cursor = conn.cursor()
93
        # Execute the SQL command
94
        # Fetch source id.
95
        cursor.execute(selectSql)
96
        result = cursor.fetchall()
97
        workbook = xlwt.Workbook()
98
        worksheet = workbook.add_sheet("Segmented User")
99
        boldStyle = xlwt.XFStyle()
100
        f = xlwt.Font()
101
        f.bold = True
102
        boldStyle.font = f
103
        column = 0
104
        row = 0
105
 
106
        worksheet.write(row, 0, 'User Segment', boldStyle)
107
        worksheet.write(row, 1, 'User Id', boldStyle)
108
        worksheet.write(row, 2, 'Username', boldStyle)
109
        worksheet.write(row, 3, 'Name', boldStyle)
110
        worksheet.write(row, 4, 'Mobile', boldStyle)
14544 amit.gupta 111
        worksheet.write(row, 5, 'Mobile Verified', boldStyle)
15507 amit.gupta 112
        worksheet.write(row, 6, 'UserGroupId', boldStyle)
15512 amit.gupta 113
        worksheet.write(row, 7, 'Group basis', boldStyle)
114
        worksheet.write(row, 8, 'Brand Preference', boldStyle)
115
        worksheet.write(row, 9, 'Pricing Preference', boldStyle)
116
        worksheet.write(row, 10, 'User Created On', boldStyle)
117
        worksheet.write(row, 11, 'User Last Active On', boldStyle)
118
        worksheet.write(row, 12, 'Order Last Created On', boldStyle)
119
        worksheet.write(row, 13, 'Total Orders', boldStyle)
120
        worksheet.write(row, 14, 'Referrer', boldStyle)
121
        worksheet.write(row, 15, 'Campaign', boldStyle)
122
        worksheet.write(row, 16, 'Content', boldStyle)
123
        worksheet.write(row, 17, 'Term', boldStyle)
124
        worksheet.write(row, 18, 'Medium', boldStyle)
125
        worksheet.write(row, 19, 'Utm Source', boldStyle)
126
        worksheet.write(row, 20, 'Activation Flag', boldStyle)
15637 amit.gupta 127
        worksheet.write(row, 21, 'Retailer Id', boldStyle)
128
        worksheet.write(row, 22, 'Retailer Status', boldStyle)
14460 amit.gupta 129
 
130
        for r in result:
131
            row += 1
132
            column = 0
133
            for data in r :
134
                worksheet.write(row, column, int(data) if type(data) is float else data, datetime_format if type(data) is datetime.datetime else default_format)
135
                column += 1
136
        workbook.save(TMP_FILE)
15666 amit.gupta 137
        generateGroupSegmentationReport(workbook)
15637 amit.gupta 138
        sendmail(["rajneesh.arora@saholic.com"], "", TMP_FILE, SUBJECT)
15666 amit.gupta 139
        #sendmail([], "", TMP_FILE, SUBJECT)
14460 amit.gupta 140
    except:
14721 amit.gupta 141
        traceback.print_exc()
14460 amit.gupta 142
        print "Could not create report"
143
 
15666 amit.gupta 144
def generateGroupSegmentationReport(workbook):
145
    selectSql = GROUP_SEGMENTATION_QUERY
146
    conn = getDbConnection()
147
    try:
148
        # prepare a cursor object using cursor() method
149
        cursor = conn.cursor()
150
        # Execute the SQL command
151
        # Fetch source id.
152
        cursor.execute(selectSql)
153
        result = cursor.fetchall()
154
        worksheet = workbook.add_sheet("Segmented User Group")
155
        boldStyle = xlwt.XFStyle()
156
        f = xlwt.Font()
157
        f.bold = True
158
        boldStyle.font = f
159
        column = 0
160
        row = 0
161
        worksheet.write(row, 0, 'User Segment', boldStyle)
15714 amit.gupta 162
        worksheet.write(row, 1, 'First Id', boldStyle)
15715 amit.gupta 163
        worksheet.write(row, 2, 'Last Id', boldStyle)
164
        worksheet.write(row, 3, 'Username', boldStyle)
165
        worksheet.write(row, 4, 'Name', boldStyle)
166
        worksheet.write(row, 5, 'Mobile', boldStyle)
167
        worksheet.write(row, 6, 'UserGroupId', boldStyle)
168
        worksheet.write(row, 7, 'Group basis', boldStyle)
169
        worksheet.write(row, 8, 'Users Count', boldStyle)
170
        worksheet.write(row, 9, 'User last created', boldStyle)
171
        worksheet.write(row, 10, 'User first created', boldStyle)
172
        worksheet.write(row, 11, 'User Last Active On', boldStyle)
173
        worksheet.write(row, 12, 'Order Last Created On', boldStyle)
174
        worksheet.write(row, 13, 'Total Orders', boldStyle)
15666 amit.gupta 175
        for r in result:
176
            row += 1
177
            column = 0
178
            for data in r :
179
                worksheet.write(row, column, int(data) if type(data) is float else data, datetime_format if type(data) is datetime.datetime else default_format)
180
                column += 1
181
        workbook.save(TMP_FILE)
182
    except:
183
        traceback.print_exc()
184
        print "Could not create report"
185
 
14460 amit.gupta 186
def sendmail(email, message, fileName, title):
187
    if email == "":
188
        return
189
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
190
    mailServer.ehlo()
191
    mailServer.starttls()
192
    mailServer.ehlo()
193
 
194
    # Create the container (outer) email message.
195
    msg = MIMEMultipart()
196
    msg['Subject'] = title
197
    msg.preamble = title
198
    html_msg = MIMEText(message, 'html')
199
    msg.attach(html_msg)
200
 
201
    fileMsg = MIMEBase('application', 'vnd.ms-excel')
202
    fileMsg.set_payload(file(TMP_FILE).read())
203
    encoders.encode_base64(fileMsg)
204
    fileMsg.add_header('Content-Disposition', 'attachment;filename=' + fileName)
205
    msg.attach(fileMsg)
206
 
207
 
208
    email.append('amit.gupta@shop2020.in')
209
    MAILTO = email 
210
    mailServer.login(SENDER, PASSWORD)
211
    mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())
212
 
213
def main():
214
    generateSegmentationReport()
215
 
216
if __name__ == '__main__':
217
    main()