Subversion Repositories SmartDukaan

Rev

Rev 14104 | Rev 14110 | 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)
14105 kshitij.so 125
 
126
        print deal['_id']
127
        print deal['fav_weight']
128
        print deal['brand_weight']
129
        print deal['asp_weight']
130
        print deal['persPoints']
131
 
132
        print "==================="
14047 kshitij.so 133
 
134
 
135
    sorted_deals = sorted(all_category_deals, key = lambda x: (x['persPoints'],x['totalPoints'],x['bestSellerPoints'], x['nlcPoints'], x['rank']),reverse=True)
136
    p = []
137
    for x in sorted_deals:
138
        s_info = __SkuInfo(x['_id'], x['skuBundleId'], x['category_id'],x['mrp'],x['available_price'],x['source_id'],x['rank'],x['maxNlc'], \
139
                           x['minNlc'], x['schemeAmount'],x['minDiscount'],x['maxDiscount'],x['discountType'],x['dp'],x['nlcPoints'],x['bestSellerPoints'], \
14105 kshitij.so 140
                           x['totalPoints'],x['in_stock'],x['maxprice'],x['showDeal'],x['persPoints'],x['fav_weight'],x['brand_weight'],x['asp_weight'])
14047 kshitij.so 141
        p.append(s_info)
142
 
143
 
144
    wbk = xlwt.Workbook()
145
    sheet = wbk.add_sheet('User Deals')
146
    xstr = lambda s: s or ""
147
    heading_xf = xlwt.easyxf('font: bold on; align: wrap off, vert centre, horiz center')
148
 
149
    excel_integer_format = '0'
150
    integer_style = xlwt.XFStyle()
151
    integer_style.num_format_str = excel_integer_format
152
 
153
    sheet.write(0, 0, "Item ID", heading_xf)
154
    sheet.write(0, 1, "Catalog Item Id", heading_xf)
155
    sheet.write(0, 2, "Category", heading_xf)
156
    sheet.write(0, 3, "Brand", heading_xf)
157
    sheet.write(0, 4, "Product Name", heading_xf)
158
    sheet.write(0, 5, "Item Status", heading_xf)
159
    sheet.write(0, 6, "Stock Status", heading_xf)
160
    sheet.write(0, 7, "MarketPlace", heading_xf)
161
    sheet.write(0, 8, "MarketPlace Identifier", heading_xf)
162
    sheet.write(0, 9, "MarketPlace Secondary Identifier", heading_xf)
163
    sheet.write(0, 10, "Product Name (Marketplace)", heading_xf)
164
    sheet.write(0, 11, "Url", heading_xf)
165
    sheet.write(0, 12, "Price", heading_xf)
166
    sheet.write(0, 13, "Mrp", heading_xf)
167
    sheet.write(0, 14, "DP", heading_xf)
168
    sheet.write(0, 15, "Scheme Amount", heading_xf)
169
    sheet.write(0, 16, "Discount Type", heading_xf)
170
    sheet.write(0, 17, "Min Discount", heading_xf)
171
    sheet.write(0, 18, "Max Discount", heading_xf)
172
    sheet.write(0, 19, "Max Nlc", heading_xf)
173
    sheet.write(0, 20, "Min Nlc", heading_xf)
174
    sheet.write(0, 21, "Max Price", heading_xf)
175
    sheet.write(0, 22, "Rank", heading_xf)
176
    sheet.write(0, 23, "Nlc Points", heading_xf)
177
    sheet.write(0, 24, "Best Seller Points", heading_xf)
178
    sheet.write(0, 25, "Total Points", heading_xf)
179
    sheet.write(0, 26, "Pers Points", heading_xf)
180
    sheet.write(0, 27, "Show Deals", heading_xf)
14100 kshitij.so 181
    sheet.write(0, 28, "Fav Weight", heading_xf)
182
    sheet.write(0, 29, "Brand Weight", heading_xf)
183
    sheet.write(0, 30, "Asp Weight", heading_xf)
14047 kshitij.so 184
 
185
    it = 1
186
    for x in p:
187
        y = list(get_mongo_connection().Catalog.MasterData.find({'_id':x._id}))
188
        sheet.write(it, 0, x._id)
189
        sheet.write(it, 1, x.skuBundleId)
190
        if x.category_id == 3:
191
            category = 'Mobiles'
192
        else:
193
            category = 'Tablets'
194
        sheet.write(it, 2, category)
195
        sheet.write(it, 3, y[0]['brand'])
196
        sheet.write(it, 4, y[0]['product_name'])
197
        if y[0]['status'] ==1:
198
            sheet.write(it, 5, 'Active')
199
        else:
200
            sheet.write(it, 5, 'EOL')
201
        if y[0]['in_stock'] ==1:
202
            sheet.write(it, 6, 'In Stock')
203
        else:
204
            sheet.write(it, 6, 'Out Of Stock')
205
        sheet.write(it, 7, y[0]['source'])
206
        sheet.write(it, 8, y[0]['identifier'])
207
        sheet.write(it, 9, y[0]['secondaryIdentifier'])
208
        sheet.write(it, 10, y[0]['source_product_name'])
209
        sheet.write(it, 11, y[0]['url'])
210
        sheet.write(it, 12, y[0]['available_price'])
211
        sheet.write(it, 13, x.mrp)
212
        sheet.write(it, 14, x.dp)
213
        sheet.write(it, 15, x.schemeAmount)
214
        sheet.write(it, 16, x.discountType)
215
        sheet.write(it, 17, x.minDiscount)
216
        sheet.write(it, 18, x.maxDiscount)
217
        sheet.write(it, 19, x.maxNlc)
218
        sheet.write(it, 20, x.minNlc)
219
        sheet.write(it, 21, x.maxprice)
220
        sheet.write(it, 22, x.rank)
221
        sheet.write(it, 23, x.nlcPoints)
222
        sheet.write(it, 24, x.bestSellerPoints)
223
        sheet.write(it, 25, x.totalPoints)
224
        sheet.write(it, 26, x.persPoints)
225
        sheet.write(it, 27, x.showDeal)
14100 kshitij.so 226
        sheet.write(it, 28, x.fav_weight)
227
        sheet.write(it, 29, x.brand_weight)
228
        sheet.write(it, 30, x.asp_weight)
14047 kshitij.so 229
        it+=1
230
    filename = "/tmp/deal-data-user-specific"+str(datetime.now())+".xls" 
231
    wbk.save(filename)
232
    smtpServer = smtplib.SMTP('localhost')
233
    #smtpServer.set_debuglevel(1)
234
    sender = 'dtr@shop2020.in'
14101 kshitij.so 235
    if userId==27:
236
        recipients = ['kshitij.sood@saholic.com']
237
    else:
238
        recipients = ['rajneesh.arora@saholic.com','kshitij.sood@saholic.com']
14047 kshitij.so 239
    msg = MIMEMultipart()
240
    msg['Subject'] = "DTR Deals data (UserOnly) UserId - "+str(userId)+"" + ' - ' + str(datetime.now())
241
    msg['From'] = sender
242
    msg['To'] = ",".join(recipients)
243
    fileMsg = email.mime.base.MIMEBase('application','vnd.ms-excel')
244
    fileMsg.set_payload(file(filename).read())
245
    email.encoders.encode_base64(fileMsg)
14048 kshitij.so 246
    fileMsg.add_header('Content-Disposition','attachment;filename=User_Deal_Sheet_Dtr.xls')
14047 kshitij.so 247
    msg.attach(fileMsg)
248
    try:
249
        smtpServer.sendmail(sender, recipients, msg.as_string())
250
        print "Successfully sent email"
251
    except:
252
        print "Error: unable to send email."
253
 
254
 
255
 
256
def main():
14105 kshitij.so 257
    generateSheet(8)
14047 kshitij.so 258
 
259
if __name__=='__main__':
260
    main()