Subversion Repositories SmartDukaan

Rev

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