Subversion Repositories SmartDukaan

Rev

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