Subversion Repositories SmartDukaan

Rev

Rev 19651 | Rev 19886 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
16561 amit.gupta 1
from datetime import datetime
17233 amit.gupta 2
from email import encoders
3
from email.mime.base import MIMEBase
4
from email.mime.multipart import MIMEMultipart
5
from email.mime.text import MIMEText
16561 amit.gupta 6
from paramiko.client import SSHClient
14843 amit.gupta 7
import StringIO
8
import base64
9
import gzip
16561 amit.gupta 10
import logging
11
import os
12
import paramiko
14843 amit.gupta 13
import pymongo
16561 amit.gupta 14
import random
17233 amit.gupta 15
import smtplib
16561 amit.gupta 16
import socket
13572 kshitij.so 17
import time
14843 amit.gupta 18
import urllib
14736 kshitij.so 19
import urllib2
15906 kshitij.so 20
import urlparse
18092 manas 21
from Crypto.Hash import MD5
22
from Crypto.Cipher import DES
23
import string
18923 manas 24
from dtr.utils.MailSender import Email
14705 kshitij.so 25
#TODO Need to add messy stuff to conf.
17233 amit.gupta 26
 
27
 
28
SENDER = "cnc.center@shop2020.in"
29
PASSWORD = "5h0p2o2o"
30
SMTP_SERVER = "smtp.gmail.com"
31
SMTP_PORT = 587    
32
 
18092 manas 33
_password = 'dtr18Feb2015'
34
_salt = '\xA9\x9B\xC8\x32\x56\x35\xE3\x03'
35
_iterations = 19
17233 amit.gupta 36
 
18092 manas 37
ALPHABET = string.ascii_uppercase + string.ascii_lowercase + \
38
           string.digits + '-_'
39
ALPHABET_REVERSE = dict((c, i) for (i, c) in enumerate(ALPHABET))
40
BASE = len(ALPHABET)
41
SIGN_CHARACTER = '$'
17233 amit.gupta 42
 
14708 kshitij.so 43
con=None
18257 manas 44
conDtrData = None
19247 kshitij.so 45
conCms = None
14736 kshitij.so 46
headers = { 
47
            'User-agent':'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36',
48
            'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',      
49
            'Accept-Language' : 'en-US,en;q=0.8',                     
50
            'Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
51
            'Connection':'keep-alive',
52
            'Accept-Encoding' : 'gzip,deflate,sdch'
53
        }
17340 kshitij.so 54
PROXY_MESH_LIVE = "ch.proxymesh.com:31280"
18153 kshitij.so 55
PROXY_MESH_GENERAL = "de.proxymesh.com:31280"
17273 kshitij.so 56
PROXY_FLIPKART = "117.240.187.35:3128"
15152 kshitij.so 57
 
14843 amit.gupta 58
PUSH_NOTIFICATION_URL='http://api.profittill.com/admin/users/push'
59
DTR_API_BASIC_AUTH = base64.encodestring('%s:%s' % ("dtr", "dtr18Feb2015")).replace('\n', '')
18871 manas 60
EMAIL_CRM_PUSH_URL = 'http://staging.profittill.com/feedbacks/crm_mail'
16371 amit.gupta 61
statusMap = {1:'Active',2:'EOL',3:'In Process',4:'Exclusive'}
17041 manish.sha 62
SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5,'PAYTM.COM':6, 'HOMESHOP18.COM':7}
19514 manas 63
REVERSE_SOURCE_MAP = {1:"Amazon", 2:"Flipkart", 3:"Snapdeal", 4:"Spice", 5:"Shopclues", 6:"Paytm", 7:"HomeShop18"}
14747 kshitij.so 64
 
16398 amit.gupta 65
CB_INIT = 'Waiting Confirmation'
66
CB_PENDING = 'Pending'
67
CB_CREDIT_IN_PROCESS = 'Credit in process'
68
CB_CREDITED = 'Credited to wallet'
69
CB_NA = 'Not Applicable'
70
CB_APPROVED = 'Approved'
71
CB_REJECTED = 'Rejected'
72
CB_ONHOLD = 'On hold'
73
CB_CANCELLED = 'Cancelled'
74
 
16399 amit.gupta 75
ORDER_PLACED = 'Order Placed'
76
ORDER_DELIVERED = 'Delivered'
77
ORDER_SHIPPED = 'Shipped' #Lets see if we can make use of it
78
ORDER_CANCELLED = 'Cancelled'
16398 amit.gupta 79
 
16538 kshitij.so 80
AFFILIATE_OFFER_API= {1:"https://www.spicesafar.com/FreeBapp/fetchOffersSM?deviceId=%s&retailerCode=%d"}
81
AFFILIATE_OFFER_DESC_API = {1:"https://www.spicesafar.com/FreeBapp/individualOffersSM?deviceId=%s&offerId=%s&retailerCode=%d"}
16736 amit.gupta 82
CREDIT_TYPE_ORDER = "Order"
83
CREDIT_TYPE_APP = "App"
19451 manas 84
CREDIT_TYPE_REFUND = "Refund"
85
CREDIT_TYPE_OFFER = "Offer"
86
CREDIT_TYPE_ADJUSTMENT = "Adjustment"
17873 kshitij.so 87
SUB_CATEGORY_MAP = {7:'Memory Card',8:'Cable',9:'USB Lights',10:"Screen Magnifier",11:"Car Charger",12:"Power Bank",13:"Pendrive",14:"Combo",15:"Charger",16:"Bluetooth Headset",17:"Speaker", \
18648 kshitij.so 88
                    18:"Adapter",19:"Cases",20:"Screen Guard",21:"Earphone",22:"Card Reader",23:"Mobile Holder",24:"AUX Cable",25:"OTG Cable",26:"Selfie Stick",27:"Back Cover",28:"Tempered Glass",29:"Battery", \
19528 kshitij.so 89
                    30:"Usb Hub",31:"Portable Music Player",32:"Smart Watch",33:'Flip Cover',34:'Connector',35:'TV Remote',36:'Bumper Case'}
16399 amit.gupta 90
 
19247 kshitij.so 91
CATEGORY_MAP = {3:'Mobiles',5:'Tablets',6:'Accessories'}
19482 manas 92
REFUND_ADJUSTMENT_MAP={0:'Pending',1:'Approved',2:'Cancelled',3:'Credited'}
19247 kshitij.so 93
 
19654 kshitij.so 94
SUB_CATEGORY_HEADER_RANKING = [26,13,15,24,35,11,36,7,29,23,28,8,21,12,25,27,20,32,31,16,34,10,17,9,22,33]
95
 
14705 kshitij.so 96
def get_mongo_connection(host='localhost', port=27017):
97
    global con
98
    if con is None:
99
        print "Establishing connection %s host and port %d" %(host,port)
100
        try:
101
            con = pymongo.MongoClient(host, port)
102
        except Exception, e:
103
            print e
104
            return None
105
    return con
106
 
18257 manas 107
def get_mongo_connection_dtr_data(host='45.33.50.227', port=27017):
108
    global conDtrData
109
    if conDtrData is None:
110
        print "Establishing connection %s host and port %d" %(host,port)
111
        try:
112
            conDtrData = pymongo.MongoClient(host, port)
113
        except Exception, e:
114
            print e
115
            return None
116
    return conDtrData
117
 
19247 kshitij.so 118
def get_mongo_connection_cms(host, port=27017):
119
    global conCms
120
    if conCms is None:
121
        print "Establishing connection %s host and port %d" %(host,port)
122
        try:
123
            conCms = pymongo.MongoClient(host, port)
124
        except Exception, e:
125
            print e
126
            return None
127
    return conCms
128
 
13572 kshitij.so 129
def to_java_date(py_timestamp):
130
    try:
131
        java_date =  int(time.mktime(py_timestamp.timetuple())) * 1000 + py_timestamp.microsecond / 1000
132
        return java_date
133
    except:
14705 kshitij.so 134
        return None
16631 manish.sha 135
 
136
def to_py_date(java_timestamp):
16658 manish.sha 137
    try:
16660 manish.sha 138
        date = datetime.fromtimestamp(java_timestamp / 1e3)
16658 manish.sha 139
    except:
140
        return None
141
 
16631 manish.sha 142
    return date
14705 kshitij.so 143
 
144
def getCashBack(skuId, source_id, category_id, mc, mongoHost):
17605 kshitij.so 145
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14705 kshitij.so 146
        populateCashBack(mc, mongoHost)
147
    itemCashBackMap = mc.get("item_cash_back")
148
    itemCashBack = itemCashBackMap.get(skuId)
149
    if itemCashBack is not None:
150
        return itemCashBack
151
    cashBackMap = mc.get("category_cash_back")
152
    sourceCashBack = cashBackMap.get(source_id)
153
    if sourceCashBack is not None and len(sourceCashBack) > 0:
154
        for cashBack in sourceCashBack:
155
            if cashBack.get(category_id) is None:
156
                continue
157
            else:
158
                return cashBack.get(category_id)
159
    else:
160
        return {}
161
 
162
def populateCashBack(mc, mongoHost):
163
    print "Populating cashback"
164
    cashBackMap = {}
165
    itemCashBackMap = {}
166
    cashBack = list(get_mongo_connection(host=mongoHost).Catalog.CategoryCashBack.find())
167
    for row in cashBack:
168
        temp_map = {}
169
        temp_list = []
170
        if cashBackMap.has_key(row['source_id']):
171
            arr = cashBackMap.get(row['source_id'])
172
            for val in arr:
173
                temp_list.append(val)
174
            temp_map[row['category_id']] = row
175
            temp_list.append(temp_map)
176
            cashBackMap[row['source_id']] = temp_list 
177
        else:
178
            temp_map[row['category_id']] = row
179
            temp_list.append(temp_map)
180
            cashBackMap[row['source_id']] = temp_list
181
    itemCashBack = list(get_mongo_connection(host=mongoHost).Catalog.ItemCashBack.find())
182
    for row in itemCashBack:
183
        if not itemCashBackMap.has_key(row['skuId']):
184
            itemCashBackMap[row['skuId']] = row
185
    mc.set("item_cash_back", itemCashBackMap, 24 * 60 * 60)
186
    mc.set("category_cash_back", cashBackMap, 24 * 60 * 60)
187
 
14736 kshitij.so 188
def ungzipResponse(r):
189
    headers = r.info()
190
    if headers.get('Content-Encoding')=='gzip':
191
        url_f = StringIO.StringIO(r.read())
192
        gz = gzip.GzipFile(fileobj=url_f)
193
        html = gz.read()
194
        gz.close()
195
        return html
196
    return r.read()
197
 
198
 
17267 kshitij.so 199
def fetchResponseUsingProxy(url, headers=headers, livePricing=None, proxy=True, flipkart=False):
17041 manish.sha 200
    if livePricing is None:
201
        PROXY_URL = PROXY_MESH_GENERAL
17267 kshitij.so 202
    elif flipkart:
203
        PROXY_URL = PROXY_FLIPKART
17041 manish.sha 204
    else:
205
        PROXY_URL = PROXY_MESH_LIVE
206
    if proxy:
207
        print PROXY_URL
208
        proxy = urllib2.ProxyHandler({'http': PROXY_URL})
209
        opener = urllib2.build_opener(proxy)
210
        urllib2.install_opener(opener)
14736 kshitij.so 211
    req = urllib2.Request(url,headers=headers)
212
    response = urllib2.urlopen(req)
213
    response_data = ungzipResponse(response)
214
    response.close()
215
    return response_data
216
 
14948 amit.gupta 217
def getCurrTimeStamp():
218
    return toTimeStamp(datetime.now())
219
 
220
def toTimeStamp(dateTimeObj):
221
    return int(time.mktime(dateTimeObj.timetuple()))
14987 amit.gupta 222
def fromTimeStamp(timestamp):
15166 amit.gupta 223
    return datetime.fromtimestamp(timestamp)
224
 
16499 kshitij.so 225
def getNlcPoints(deal):
226
    if not(deal.get('minNlc') and deal.get('maxNlc')):
227
        print "Raising exception minNlc, maxNlc not found for %d"%(deal.get('_id'))
15182 kshitij.so 228
        raise
16499 kshitij.so 229
    if deal.get('status') == 2:
15182 kshitij.so 230
        eolWeight = .60
231
    else:
232
        eolWeight = 1.0
16499 kshitij.so 233
    if deal.get('category_id') == 3:
15182 kshitij.so 234
        basePointPercentage = 5.0
235
        maxNlcPoints = 200
16499 kshitij.so 236
    elif deal.get('category_id') == 5:
15182 kshitij.so 237
        basePointPercentage = 8.0
238
        maxNlcPoints = 150
239
    else:
240
        basePointPercentage = 10.0
241
        maxNlcPoints = 150
16499 kshitij.so 242
    discFromMinNlc = float((deal.get('minNlc') - (deal.get('available_price'))))/(deal.get('available_price')) *100
243
    discFromMaxNlc = float((deal.get('maxNlc') - (deal.get('available_price'))))/(deal.get('available_price')) *100
15182 kshitij.so 244
    print discFromMinNlc
245
    print discFromMaxNlc
246
    if discFromMinNlc > 0:
247
        nlcPoints = 100/basePointPercentage * discFromMinNlc
248
    elif discFromMinNlc < 0 and discFromMaxNlc > 0:
249
        nlcPoints = 0
250
    else:
251
        nlcPoints = 100/basePointPercentage * discFromMinNlc
252
    if (min(nlcPoints,maxNlcPoints)) > 0:
253
        nlcPoints = (min(nlcPoints,maxNlcPoints)) * eolWeight
254
    else:
255
        nlcPoints = (min(nlcPoints,maxNlcPoints))
256
 
257
    return nlcPoints
258
 
15166 amit.gupta 259
def getLogger(filePath):
260
    lgr = logging.getLogger()
261
    lgr.setLevel(logging.DEBUG)
262
    fh = logging.FileHandler(filePath)
263
    fh.setLevel(logging.INFO)
264
    frmt = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
265
    fh.setFormatter(frmt)
266
    lgr.addHandler(fh)
267
    return lgr
15868 kshitij.so 268
 
269
def removePriceFormatting(price_string):
270
    return price_string.strip().replace('Rs.', '').replace('Rs', '').replace(',', '').replace(' ', '').replace('&nbsp;', '').split('.')[0]
15906 kshitij.so 271
 
15950 kshitij.so 272
def transformUrl(url,source_id):
15906 kshitij.so 273
    if source_id == 5:
274
        finalUrl = urlparse.urlparse(url)
275
        return finalUrl._replace(netloc=finalUrl.netloc.replace(finalUrl.hostname, 'm.shopclues.com')).geturl()
15950 kshitij.so 276
    elif source_id ==1:
277
        return url
278
    elif source_id == 2:
279
        finalUrl = urlparse.urlparse(url)
280
        return finalUrl._replace(netloc=finalUrl.netloc.replace(finalUrl.hostname, socket.gethostbyname(finalUrl.hostname))).geturl()
17013 manish.sha 281
    elif source_id == 7:
282
        productId = url.split('product:')[1].split('/')[0]
283
        finalUrl = 'http://m.homeshop18.com/product.mobi?productId='+str(productId)
284
        return finalUrl
15906 kshitij.so 285
 
286
 
16421 amit.gupta 287
 
288
 
289
def find_between( s, first, last ):
290
    try:
291
        start = s.find( first ) + len( first )
292
        end = s.rfind( last, start )
293
        if start ==-1 or end ==-1:
294
            return ""
295
        return s[start:end]
296
    except ValueError:
297
        return ""
15950 kshitij.so 298
 
15906 kshitij.so 299
if __name__ == '__main__':
15950 kshitij.so 300
    print transformUrl("http://www.flipkart.com/redmi-2/p/itme8ygtcfax6w39",2)
17233 amit.gupta 301
 
302
def sendmail(email, message, title, *varargs):
303
    if email == "":
304
        return
305
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
306
    mailServer.ehlo()
307
    mailServer.starttls()
308
    mailServer.ehlo()
15906 kshitij.so 309
 
17233 amit.gupta 310
    # Create the container (outer) email message.
311
    msg = MIMEMultipart()
312
    msg['Subject'] = title
313
    msg.preamble = title
314
    html_msg = MIMEText(message, 'html')
315
    msg.attach(html_msg)
15906 kshitij.so 316
 
17233 amit.gupta 317
    #snapdeal more to be added here
318
    for fileName in varargs:
319
        snapdeal = MIMEBase('application', 'vnd.ms-excel')
320
        snapdeal.set_payload(file(fileName).read())
321
        encoders.encode_base64(snapdeal)
322
        snapdeal.add_header('Content-Disposition', 'attachment;filename=' + fileName)
323
        msg.attach(snapdeal)
324
 
325
 
326
    MAILTO = email 
327
    mailServer.login(SENDER, PASSWORD)
328
    mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())
329
 
330
 
16561 amit.gupta 331
def readSSh(fileName):
332
    try:
333
        str1 = open(fileName).read()
334
        return str1
335
    except:
336
        ssh_client = SSHClient()
337
        str1 = ""
338
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
339
        ssh_client.connect('dtr', 22, 'root', 'ecip$dtrMay2014')
340
        sftp_client = ssh_client.open_sftp()
341
        try:
342
            if not os.path.exists(os.path.dirname(fileName)):
343
                os.makedirs(os.path.dirname(fileName))
344
            sftp_client.get(fileName, fileName)
345
            try:
346
                str1 = open(fileName).read()
347
                return str1
348
            finally:
349
                pass
350
        except:
351
            "could not read"
352
        return str1
18134 kshitij.so 353
 
18092 manas 354
def encryptMessage(plaintext_to_encrypt1):
355
    hasher = MD5.new()
356
    hasher.update(_password)
357
    hasher.update(_salt)
358
    result = hasher.digest()
359
    for i in range(1, _iterations):
360
        hasher = MD5.new()
361
        hasher.update(result)
362
        result = hasher.digest()
363
 
364
    padding = 8 - len(plaintext_to_encrypt1) % 8
365
    plaintext_to_encrypt1 += chr(padding) * padding
366
    encoder = DES.new(result[:8], DES.MODE_CBC, result[8:16])
367
    encrypted = encoder.encrypt(plaintext_to_encrypt1)
368
 
369
    check1 =  encrypted.encode('base64')
370
    return check1
371
 
372
def decryptMessage(encryptedData):
373
    padding = 8 - len(encryptedData) % 8
374
    encryptedData += chr(padding) * padding
375
    hasher = MD5.new()
376
    hasher.update(_password)
377
    hasher.update(_salt)
378
    result = hasher.digest()
379
    for i in range(1, _iterations):
380
        hasher = MD5.new()
381
        hasher.update(result)
382
        result = hasher.digest()
383
 
384
    encoder2 = DES.new(result[:8], DES.MODE_CBC, result[8:16])
385
    decodeString =  encoder2.decrypt(encryptedData.decode('base64'))
18094 manas 386
    return ''.join(e for e in decodeString if e.isalnum() or e is '/' or e is ':' or e is ',' or e is '.' or e is '=' or e is '?' or e is '_')
18092 manas 387
 
388
def num_encode(n):
389
    if n < 0:
390
        return SIGN_CHARACTER + num_encode(-n)
391
    s = []
392
    while True:
393
        n, r = divmod(n, BASE)
394
        s.append(ALPHABET[r])
395
        if n == 0: break
396
    return ''.join(reversed(s))
397
 
398
def num_decode(s):
399
    if s[0] == SIGN_CHARACTER:
400
        return -num_decode(s[1:])
401
    n = 0
402
    for c in s:
403
        n = n * BASE + ALPHABET_REVERSE[c]
404
    return n    
18156 amit.gupta 405
 
406
def todict(obj, classkey=None):
407
    if isinstance(obj, dict):
408
        data = {}
409
        for (k, v) in obj.items():
410
            data[k] = todict(v, classkey)
411
        return data
412
    elif hasattr(obj, "_ast"):
413
        return todict(obj._ast())
414
    elif hasattr(obj, "__iter__"):
415
        return [todict(v, classkey) for v in obj]
416
    elif hasattr(obj, "__dict__"):
417
        data = dict([(key, todict(value, classkey)) 
418
            for key, value in obj.__dict__.iteritems() 
419
            if not callable(value) and not key.startswith('_')])
420
        if classkey is not None and hasattr(obj, "__class__"):
421
            data[classkey] = obj.__class__.__name__
422
        return data
423
    else:
18440 amit.gupta 424
        return obj
425
 
426
def getSkuData(storeId, identifier):
427
    if storeId in (1,2,4,5,6):
428
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier, 'source_id':storeId})
429
    elif storeId == 3:
430
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier, 'source_id':storeId})
431
    return skuData
18630 manas 432
 
18636 manas 433
def sendCrmProjectMail(userId,disposition_description,disposition_comments):
434
    parameters = ("user_id", userId),("subject", disposition_description),("message",disposition_comments)
435
    parameters = urllib.urlencode(parameters)
18667 manas 436
    emailpushrequest = urllib2.Request(EMAIL_CRM_PUSH_URL, parameters, headers=headers)
437
    emailpushrequest.add_header("Authorization", "Basic %s" % DTR_API_BASIC_AUTH)
18860 manas 438
    connection = urllib2.urlopen(emailpushrequest)
439
    connection.close()
18709 manas 440
 
18923 manas 441
def sendCrmProjectMailByDtr(customerFeedback):
442
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
443
    mailServer.ehlo()
444
    mailServer.starttls()
445
    mailServer.ehlo()
446
    title=customerFeedback.get('subject')    
447
    msg = MIMEMultipart()
448
    msg['Subject'] = title
449
    msg.preamble = title
18925 manas 450
    message="User Id : " + str(customerFeedback.get('user_id'))
451
    message1="Email : " + str(customerFeedback.get('email'))
18923 manas 452
    message2="Mobile Number : " + str(customerFeedback.get('mobile_number'))
453
    message3="Subject : " + str(customerFeedback.get('subject'))
454
    message4="Message : " + str(customerFeedback.get('message'))
18925 manas 455
    html_msg = MIMEText(message+"<br><br>"+message1+"<br><br>"+message2+"<br><br>"+message3+"<br><br>"+message4, 'html')
18924 manas 456
    msg.attach(html_msg)
18927 manas 457
 
458
    MAILTO = ['rajneesh.arora@shop2020.in','amit.sirohi@shop2020.in','shailesh.kumar@shop2020.in','sandeep.sachdeva@shop2020.in','manas.kapoor@shop2020.in','chaitnaya.vats@shop2020.in','amit.gupta@shop2020.in']
459
    #MAILTO = ['manas.kapoor@saholic.com']
18923 manas 460
    mailServer.login(SENDER, PASSWORD)
461
    try:
462
        mailServer.sendmail(SENDER, MAILTO, msg.as_string())
463
    except:
464
        m = Email('localhost')
465
        mFrom = "dtr@shop2020.in"
466
        m.setFrom(mFrom)
467
        for receipient in MAILTO:
468
            m.addRecipient(receipient)
469
        m.setSubject(title)
470
        m.send()
471
    return