Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
14047 kshitij.so 1
from elixir import *
2
import pymongo
3
from dtr.storage.MemCache import MemCache
4
import xlwt
5
from dtr.storage import DataService
6
from dtr.storage.DataService import brand_preferences, user_actions, price_preferences
7
from email.mime.multipart import MIMEMultipart
8
import email.encoders
9
import smtplib
10
from datetime import datetime
11
 
12
mc = MemCache()
13
con =None
14
DataService.initialize(db_hostname='localhost')
15
 
16
class __SkuInfo:
17
 
18
    def __init__(self, _id, skuBundleId, category_id, mrp, available_price, source_id, rank, maxNlc, minNlc, schemeAmount, minDiscount, \
14100 kshitij.so 19
                 maxDiscount, discountType, dp, nlcPoints, bestSellerPoints, totalPoints,in_stock,maxprice,showDeal,persPoints, \
20
                 fav_weight,brand_weight,asp_weight):
14047 kshitij.so 21
        self._id = _id
22
        self.skuBundleId = skuBundleId
23
        self.category_id = category_id
24
        self.mrp = mrp
25
        self.available_price = available_price
26
        self.source_id = source_id
27
        self.rank = rank
28
        self.maxNlc = maxNlc
29
        self.minNlc = minNlc
30
        self.schemeAmount = schemeAmount
31
        self.minDiscount = minDiscount
32
        self.maxDiscount = maxDiscount
33
        self.discountType = discountType
34
        self.dp = dp
35
        self.nlcPoints = nlcPoints
36
        self.bestSellerPoints = bestSellerPoints
37
        self.totalPoints = totalPoints
38
        self.in_stock = in_stock
39
        self.maxprice = maxprice
40
        self.showDeal = showDeal
41
        self.persPoints = persPoints
14100 kshitij.so 42
        self.fav_weight = fav_weight
43
        self.brand_weight = brand_weight
44
        self.asp_weight = asp_weight
45
 
14047 kshitij.so 46
 
47
def get_mongo_connection(host='localhost', port=27017):
48
    global con
49
    if con is None:
50
        print "Establishing connection %s host and port %d" %(host,port)
51
        try:
52
            con = pymongo.MongoClient(host, port)
53
        except Exception, e:
54
            print e
55
            return None
56
    return con
57
 
58
 
14103 kshitij.so 59
def generateSheet(user_id):
60
    "Generating user specific deals for ",user_id
61
    userId = int(user_id)
14047 kshitij.so 62
    outer_query = []
63
    outer_query.append({"showDeal":1})
64
    query = {}
65
    query['$gt'] = 0
66
    outer_query.append({'totalPoints':query})
67
    brandPrefMap = {}
68
    pricePrefMap = {}
69
    actionsMap = {}
70
    brand_p = session.query(price_preferences).filter_by(user_id=userId).all()
71
    for x in brand_p:
72
        pricePrefMap[x.category_id] = [x.min_price,x.max_price]
73
    for x in session.query(brand_preferences).filter_by(user_id=userId).all():
74
        temp_map = {}
75
        if brandPrefMap.has_key((x.brand).strip().upper()):
76
            val = brandPrefMap.get((x.brand).strip().upper())
77
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
78
            val.append(temp_map)
79
        else:
80
            temp = []
81
            temp_map[x.category_id] = 1 if x.status == 'show' else 0
82
            temp.append(temp_map)
83
            brandPrefMap[(x.brand).strip().upper()] = temp
84
 
85
    for x in session.query(user_actions).filter_by(user_id=userId).all():
86
        actionsMap[x.store_product_id] = 1 if x.action == 'like' else 0
87
    all_deals = list(get_mongo_connection().Catalog.Deals.find({"$and":outer_query}).sort([('totalPoints',pymongo.DESCENDING),('bestSellerPoints',pymongo.DESCENDING),('nlcPoints',pymongo.DESCENDING),('rank',pymongo.DESCENDING)]))
88
    all_category_deals = []
89
    for deal in all_deals:
90
        if actionsMap.get(deal['_id']) == 0:
91
            fav_weight =.25
92
        elif actionsMap.get(deal['_id']) == 1:
93
            fav_weight = 1.5
94
        else:
95
            fav_weight = 1
96
 
97
        if brandPrefMap.get(deal['brand'].strip().upper()) is not None:
98
            brand_weight = 1
99
            for brandInfo in brandPrefMap.get(deal['brand'].strip().upper()):
100
                if brandInfo.get(deal['category_id']) is not None:
101
                    if brandInfo.get(deal['category_id']) == 1:
14054 kshitij.so 102
                        brand_weight = 2.0
14047 kshitij.so 103
        else:
104
            brand_weight = 1
105
 
106
        if pricePrefMap.get(deal['category_id']) is not None:
107
 
108
            if deal['available_price'] >= pricePrefMap.get(deal['category_id'])[0] and deal['available_price'] <= pricePrefMap.get(deal['category_id'])[1]:
109
                asp_weight = 1.5
110
            elif  deal['available_price'] >= pricePrefMap.get(deal['category_id'])[0] - 0.5 * pricePrefMap.get(deal['category_id'])[0] and deal['available_price'] <= pricePrefMap.get(deal['category_id'])[1] + 0.5 * pricePrefMap.get(deal['category_id'])[1]:
111
                asp_weight = 1.2
112
            else:
113
                asp_weight = 1
114
        else:
115
            asp_weight = 1
116
 
117
        persPoints = deal['totalPoints'] * fav_weight * brand_weight * asp_weight
14100 kshitij.so 118
 
119
        deal['fav_weight'] = fav_weight
120
        deal['brand_weight'] = brand_weight
121
        deal['asp_weight'] = asp_weight
14047 kshitij.so 122
        deal['persPoints'] = persPoints
123
 
124
        all_category_deals.append(deal)
125
 
126
 
127
    sorted_deals = sorted(all_category_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
128
    p = []
129
    for x in sorted_deals:
130
        s_info = __SkuInfo(x['_id'], x['skuBundleId'], x['category_id'],x['mrp'],x['available_price'],x['source_id'],x['rank'],x['maxNlc'], \
131
                           x['minNlc'], x['schemeAmount'],x['minDiscount'],x['maxDiscount'],x['discountType'],x['dp'],x['nlcPoints'],x['bestSellerPoints'], \
14100 kshitij.so 132
                           x['totalPoints'],x['in_stock'],x['maxprice'],x['showDeal'],x['persPoints'],deal['fav_weight'],deal['brand_weight'],deal['asp_weight'])
14047 kshitij.so 133
        p.append(s_info)
134
 
135
 
136
    wbk = xlwt.Workbook()
137
    sheet = wbk.add_sheet('User Deals')
138
    xstr = lambda s: s or ""
139
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
140
 
141
    excel_integer_format = '0'
142
    integer_style = xlwt.XFStyle()
143
    integer_style.num_format_str = excel_integer_format
144
 
145
    sheet.write(0, 0, "Item ID", heading_xf)
146
    sheet.write(0, 1, "Catalog Item Id", heading_xf)
147
    sheet.write(0, 2, "Category", heading_xf)
148
    sheet.write(0, 3, "Brand", heading_xf)
149
    sheet.write(0, 4, "Product Name", heading_xf)
150
    sheet.write(0, 5, "Item Status", heading_xf)
151
    sheet.write(0, 6, "Stock Status", heading_xf)
152
    sheet.write(0, 7, "MarketPlace", heading_xf)
153
    sheet.write(0, 8, "MarketPlace Identifier", heading_xf)
154
    sheet.write(0, 9, "MarketPlace Secondary Identifier", heading_xf)
155
    sheet.write(0, 10, "Product Name (Marketplace)", heading_xf)
156
    sheet.write(0, 11, "Url", heading_xf)
157
    sheet.write(0, 12, "Price", heading_xf)
158
    sheet.write(0, 13, "Mrp", heading_xf)
159
    sheet.write(0, 14, "DP", heading_xf)
160
    sheet.write(0, 15, "Scheme Amount", heading_xf)
161
    sheet.write(0, 16, "Discount Type", heading_xf)
162
    sheet.write(0, 17, "Min Discount", heading_xf)
163
    sheet.write(0, 18, "Max Discount", heading_xf)
164
    sheet.write(0, 19, "Max Nlc", heading_xf)
165
    sheet.write(0, 20, "Min Nlc", heading_xf)
166
    sheet.write(0, 21, "Max Price", heading_xf)
167
    sheet.write(0, 22, "Rank", heading_xf)
168
    sheet.write(0, 23, "Nlc Points", heading_xf)
169
    sheet.write(0, 24, "Best Seller Points", heading_xf)
170
    sheet.write(0, 25, "Total Points", heading_xf)
171
    sheet.write(0, 26, "Pers Points", heading_xf)
172
    sheet.write(0, 27, "Show Deals", heading_xf)
14100 kshitij.so 173
    sheet.write(0, 28, "Fav Weight", heading_xf)
174
    sheet.write(0, 29, "Brand Weight", heading_xf)
175
    sheet.write(0, 30, "Asp Weight", heading_xf)
14047 kshitij.so 176
 
177
    it = 1
178
    for x in p:
179
        y = list(get_mongo_connection().Catalog.MasterData.find({'_id':x._id}))
180
        sheet.write(it, 0, x._id)
181
        sheet.write(it, 1, x.skuBundleId)
182
        if x.category_id == 3:
183
            category = 'Mobiles'
184
        else:
185
            category = 'Tablets'
186
        sheet.write(it, 2, category)
187
        sheet.write(it, 3, y[0]['brand'])
188
        sheet.write(it, 4, y[0]['product_name'])
189
        if y[0]['status'] ==1:
190
            sheet.write(it, 5, 'Active')
191
        else:
192
            sheet.write(it, 5, 'EOL')
193
        if y[0]['in_stock'] ==1:
194
            sheet.write(it, 6, 'In Stock')
195
        else:
196
            sheet.write(it, 6, 'Out Of Stock')
197
        sheet.write(it, 7, y[0]['source'])
198
        sheet.write(it, 8, y[0]['identifier'])
199
        sheet.write(it, 9, y[0]['secondaryIdentifier'])
200
        sheet.write(it, 10, y[0]['source_product_name'])
201
        sheet.write(it, 11, y[0]['url'])
202
        sheet.write(it, 12, y[0]['available_price'])
203
        sheet.write(it, 13, x.mrp)
204
        sheet.write(it, 14, x.dp)
205
        sheet.write(it, 15, x.schemeAmount)
206
        sheet.write(it, 16, x.discountType)
207
        sheet.write(it, 17, x.minDiscount)
208
        sheet.write(it, 18, x.maxDiscount)
209
        sheet.write(it, 19, x.maxNlc)
210
        sheet.write(it, 20, x.minNlc)
211
        sheet.write(it, 21, x.maxprice)
212
        sheet.write(it, 22, x.rank)
213
        sheet.write(it, 23, x.nlcPoints)
214
        sheet.write(it, 24, x.bestSellerPoints)
215
        sheet.write(it, 25, x.totalPoints)
216
        sheet.write(it, 26, x.persPoints)
217
        sheet.write(it, 27, x.showDeal)
14100 kshitij.so 218
        sheet.write(it, 28, x.fav_weight)
219
        sheet.write(it, 29, x.brand_weight)
220
        sheet.write(it, 30, x.asp_weight)
14047 kshitij.so 221
        it+=1
222
    filename = "/tmp/deal-data-user-specific"+str(datetime.now())+".xls" 
223
    wbk.save(filename)
224
    smtpServer = smtplib.SMTP('localhost')
225
    #smtpServer.set_debuglevel(1)
226
    sender = 'dtr@shop2020.in'
14101 kshitij.so 227
    if userId==27:
228
        recipients = ['kshitij.sood@saholic.com']
229
    else:
230
        recipients = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com']
14047 kshitij.so 231
    msg = MIMEMultipart()
232
    msg['Subject'] = "DTR Deals data (UserOnly) UserId - "+str(userId)+"" + ' - ' + str(datetime.now())
233
    msg['From'] = sender
234
    msg['To'] = ",".join(recipients)
235
    fileMsg = email.mime.base.MIMEBase('application','vnd.ms-excel')
236
    fileMsg.set_payload(file(filename).read())
237
    email.encoders.encode_base64(fileMsg)
14048 kshitij.so 238
    fileMsg.add_header('Content-Disposition','attachment;filename=User_Deal_Sheet_Dtr.xls')
14047 kshitij.so 239
    msg.attach(fileMsg)
240
    try:
241
        smtpServer.sendmail(sender, recipients, msg.as_string())
242
        print "Successfully sent email"
243
    except:
244
        print "Error: unable to send email."
245
 
246
 
247
 
248
def main():
249
    generateSheet(1)
250
 
251
if __name__=='__main__':
252
    main()