Subversion Repositories SmartDukaan

Rev

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