Subversion Repositories SmartDukaan

Rev

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