Subversion Repositories SmartDukaan

Rev

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