Subversion Repositories SmartDukaan

Rev

Rev 19528 | Rev 19654 | 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
 
14705 kshitij.so 94
def get_mongo_connection(host='localhost', port=27017):
95
    global con
96
    if con is None:
97
        print "Establishing connection %s host and port %d" %(host,port)
98
        try:
99
            con = pymongo.MongoClient(host, port)
100
        except Exception, e:
101
            print e
102
            return None
103
    return con
104
 
18257 manas 105
def get_mongo_connection_dtr_data(host='45.33.50.227', port=27017):
106
    global conDtrData
107
    if conDtrData is None:
108
        print "Establishing connection %s host and port %d" %(host,port)
109
        try:
110
            conDtrData = pymongo.MongoClient(host, port)
111
        except Exception, e:
112
            print e
113
            return None
114
    return conDtrData
115
 
19247 kshitij.so 116
def get_mongo_connection_cms(host, port=27017):
117
    global conCms
118
    if conCms is None:
119
        print "Establishing connection %s host and port %d" %(host,port)
120
        try:
121
            conCms = pymongo.MongoClient(host, port)
122
        except Exception, e:
123
            print e
124
            return None
125
    return conCms
126
 
13572 kshitij.so 127
def to_java_date(py_timestamp):
128
    try:
129
        java_date =  int(time.mktime(py_timestamp.timetuple())) * 1000 + py_timestamp.microsecond / 1000
130
        return java_date
131
    except:
14705 kshitij.so 132
        return None
16631 manish.sha 133
 
134
def to_py_date(java_timestamp):
16658 manish.sha 135
    try:
16660 manish.sha 136
        date = datetime.fromtimestamp(java_timestamp / 1e3)
16658 manish.sha 137
    except:
138
        return None
139
 
16631 manish.sha 140
    return date
14705 kshitij.so 141
 
142
def getCashBack(skuId, source_id, category_id, mc, mongoHost):
17605 kshitij.so 143
    if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):
14705 kshitij.so 144
        populateCashBack(mc, mongoHost)
145
    itemCashBackMap = mc.get("item_cash_back")
146
    itemCashBack = itemCashBackMap.get(skuId)
147
    if itemCashBack is not None:
148
        return itemCashBack
149
    cashBackMap = mc.get("category_cash_back")
150
    sourceCashBack = cashBackMap.get(source_id)
151
    if sourceCashBack is not None and len(sourceCashBack) > 0:
152
        for cashBack in sourceCashBack:
153
            if cashBack.get(category_id) is None:
154
                continue
155
            else:
156
                return cashBack.get(category_id)
157
    else:
158
        return {}
159
 
160
def populateCashBack(mc, mongoHost):
161
    print "Populating cashback"
162
    cashBackMap = {}
163
    itemCashBackMap = {}
164
    cashBack = list(get_mongo_connection(host=mongoHost).Catalog.CategoryCashBack.find())
165
    for row in cashBack:
166
        temp_map = {}
167
        temp_list = []
168
        if cashBackMap.has_key(row['source_id']):
169
            arr = cashBackMap.get(row['source_id'])
170
            for val in arr:
171
                temp_list.append(val)
172
            temp_map[row['category_id']] = row
173
            temp_list.append(temp_map)
174
            cashBackMap[row['source_id']] = temp_list 
175
        else:
176
            temp_map[row['category_id']] = row
177
            temp_list.append(temp_map)
178
            cashBackMap[row['source_id']] = temp_list
179
    itemCashBack = list(get_mongo_connection(host=mongoHost).Catalog.ItemCashBack.find())
180
    for row in itemCashBack:
181
        if not itemCashBackMap.has_key(row['skuId']):
182
            itemCashBackMap[row['skuId']] = row
183
    mc.set("item_cash_back", itemCashBackMap, 24 * 60 * 60)
184
    mc.set("category_cash_back", cashBackMap, 24 * 60 * 60)
185
 
14736 kshitij.so 186
def ungzipResponse(r):
187
    headers = r.info()
188
    if headers.get('Content-Encoding')=='gzip':
189
        url_f = StringIO.StringIO(r.read())
190
        gz = gzip.GzipFile(fileobj=url_f)
191
        html = gz.read()
192
        gz.close()
193
        return html
194
    return r.read()
195
 
196
 
17267 kshitij.so 197
def fetchResponseUsingProxy(url, headers=headers, livePricing=None, proxy=True, flipkart=False):
17041 manish.sha 198
    if livePricing is None:
199
        PROXY_URL = PROXY_MESH_GENERAL
17267 kshitij.so 200
    elif flipkart:
201
        PROXY_URL = PROXY_FLIPKART
17041 manish.sha 202
    else:
203
        PROXY_URL = PROXY_MESH_LIVE
204
    if proxy:
205
        print PROXY_URL
206
        proxy = urllib2.ProxyHandler({'http': PROXY_URL})
207
        opener = urllib2.build_opener(proxy)
208
        urllib2.install_opener(opener)
14736 kshitij.so 209
    req = urllib2.Request(url,headers=headers)
210
    response = urllib2.urlopen(req)
211
    response_data = ungzipResponse(response)
212
    response.close()
213
    return response_data
214
 
14948 amit.gupta 215
def getCurrTimeStamp():
216
    return toTimeStamp(datetime.now())
217
 
218
def toTimeStamp(dateTimeObj):
219
    return int(time.mktime(dateTimeObj.timetuple()))
14987 amit.gupta 220
def fromTimeStamp(timestamp):
15166 amit.gupta 221
    return datetime.fromtimestamp(timestamp)
222
 
16499 kshitij.so 223
def getNlcPoints(deal):
224
    if not(deal.get('minNlc') and deal.get('maxNlc')):
225
        print "Raising exception minNlc, maxNlc not found for %d"%(deal.get('_id'))
15182 kshitij.so 226
        raise
16499 kshitij.so 227
    if deal.get('status') == 2:
15182 kshitij.so 228
        eolWeight = .60
229
    else:
230
        eolWeight = 1.0
16499 kshitij.so 231
    if deal.get('category_id') == 3:
15182 kshitij.so 232
        basePointPercentage = 5.0
233
        maxNlcPoints = 200
16499 kshitij.so 234
    elif deal.get('category_id') == 5:
15182 kshitij.so 235
        basePointPercentage = 8.0
236
        maxNlcPoints = 150
237
    else:
238
        basePointPercentage = 10.0
239
        maxNlcPoints = 150
16499 kshitij.so 240
    discFromMinNlc = float((deal.get('minNlc') - (deal.get('available_price'))))/(deal.get('available_price')) *100
241
    discFromMaxNlc = float((deal.get('maxNlc') - (deal.get('available_price'))))/(deal.get('available_price')) *100
15182 kshitij.so 242
    print discFromMinNlc
243
    print discFromMaxNlc
244
    if discFromMinNlc > 0:
245
        nlcPoints = 100/basePointPercentage * discFromMinNlc
246
    elif discFromMinNlc < 0 and discFromMaxNlc > 0:
247
        nlcPoints = 0
248
    else:
249
        nlcPoints = 100/basePointPercentage * discFromMinNlc
250
    if (min(nlcPoints,maxNlcPoints)) > 0:
251
        nlcPoints = (min(nlcPoints,maxNlcPoints)) * eolWeight
252
    else:
253
        nlcPoints = (min(nlcPoints,maxNlcPoints))
254
 
255
    return nlcPoints
256
 
15166 amit.gupta 257
def getLogger(filePath):
258
    lgr = logging.getLogger()
259
    lgr.setLevel(logging.DEBUG)
260
    fh = logging.FileHandler(filePath)
261
    fh.setLevel(logging.INFO)
262
    frmt = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
263
    fh.setFormatter(frmt)
264
    lgr.addHandler(fh)
265
    return lgr
15868 kshitij.so 266
 
267
def removePriceFormatting(price_string):
268
    return price_string.strip().replace('Rs.', '').replace('Rs', '').replace(',', '').replace(' ', '').replace('&nbsp;', '').split('.')[0]
15906 kshitij.so 269
 
15950 kshitij.so 270
def transformUrl(url,source_id):
15906 kshitij.so 271
    if source_id == 5:
272
        finalUrl = urlparse.urlparse(url)
273
        return finalUrl._replace(netloc=finalUrl.netloc.replace(finalUrl.hostname, 'm.shopclues.com')).geturl()
15950 kshitij.so 274
    elif source_id ==1:
275
        return url
276
    elif source_id == 2:
277
        finalUrl = urlparse.urlparse(url)
278
        return finalUrl._replace(netloc=finalUrl.netloc.replace(finalUrl.hostname, socket.gethostbyname(finalUrl.hostname))).geturl()
17013 manish.sha 279
    elif source_id == 7:
280
        productId = url.split('product:')[1].split('/')[0]
281
        finalUrl = 'http://m.homeshop18.com/product.mobi?productId='+str(productId)
282
        return finalUrl
15906 kshitij.so 283
 
284
 
16421 amit.gupta 285
 
286
 
287
def find_between( s, first, last ):
288
    try:
289
        start = s.find( first ) + len( first )
290
        end = s.rfind( last, start )
291
        if start ==-1 or end ==-1:
292
            return ""
293
        return s[start:end]
294
    except ValueError:
295
        return ""
15950 kshitij.so 296
 
15906 kshitij.so 297
if __name__ == '__main__':
15950 kshitij.so 298
    print transformUrl("http://www.flipkart.com/redmi-2/p/itme8ygtcfax6w39",2)
17233 amit.gupta 299
 
300
def sendmail(email, message, title, *varargs):
301
    if email == "":
302
        return
303
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
304
    mailServer.ehlo()
305
    mailServer.starttls()
306
    mailServer.ehlo()
15906 kshitij.so 307
 
17233 amit.gupta 308
    # Create the container (outer) email message.
309
    msg = MIMEMultipart()
310
    msg['Subject'] = title
311
    msg.preamble = title
312
    html_msg = MIMEText(message, 'html')
313
    msg.attach(html_msg)
15906 kshitij.so 314
 
17233 amit.gupta 315
    #snapdeal more to be added here
316
    for fileName in varargs:
317
        snapdeal = MIMEBase('application', 'vnd.ms-excel')
318
        snapdeal.set_payload(file(fileName).read())
319
        encoders.encode_base64(snapdeal)
320
        snapdeal.add_header('Content-Disposition', 'attachment;filename=' + fileName)
321
        msg.attach(snapdeal)
322
 
323
 
324
    MAILTO = email 
325
    mailServer.login(SENDER, PASSWORD)
326
    mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())
327
 
328
 
16561 amit.gupta 329
def readSSh(fileName):
330
    try:
331
        str1 = open(fileName).read()
332
        return str1
333
    except:
334
        ssh_client = SSHClient()
335
        str1 = ""
336
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
337
        ssh_client.connect('dtr', 22, 'root', 'ecip$dtrMay2014')
338
        sftp_client = ssh_client.open_sftp()
339
        try:
340
            if not os.path.exists(os.path.dirname(fileName)):
341
                os.makedirs(os.path.dirname(fileName))
342
            sftp_client.get(fileName, fileName)
343
            try:
344
                str1 = open(fileName).read()
345
                return str1
346
            finally:
347
                pass
348
        except:
349
            "could not read"
350
        return str1
18134 kshitij.so 351
 
18092 manas 352
def encryptMessage(plaintext_to_encrypt1):
353
    hasher = MD5.new()
354
    hasher.update(_password)
355
    hasher.update(_salt)
356
    result = hasher.digest()
357
    for i in range(1, _iterations):
358
        hasher = MD5.new()
359
        hasher.update(result)
360
        result = hasher.digest()
361
 
362
    padding = 8 - len(plaintext_to_encrypt1) % 8
363
    plaintext_to_encrypt1 += chr(padding) * padding
364
    encoder = DES.new(result[:8], DES.MODE_CBC, result[8:16])
365
    encrypted = encoder.encrypt(plaintext_to_encrypt1)
366
 
367
    check1 =  encrypted.encode('base64')
368
    return check1
369
 
370
def decryptMessage(encryptedData):
371
    padding = 8 - len(encryptedData) % 8
372
    encryptedData += chr(padding) * padding
373
    hasher = MD5.new()
374
    hasher.update(_password)
375
    hasher.update(_salt)
376
    result = hasher.digest()
377
    for i in range(1, _iterations):
378
        hasher = MD5.new()
379
        hasher.update(result)
380
        result = hasher.digest()
381
 
382
    encoder2 = DES.new(result[:8], DES.MODE_CBC, result[8:16])
383
    decodeString =  encoder2.decrypt(encryptedData.decode('base64'))
18094 manas 384
    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 385
 
386
def num_encode(n):
387
    if n < 0:
388
        return SIGN_CHARACTER + num_encode(-n)
389
    s = []
390
    while True:
391
        n, r = divmod(n, BASE)
392
        s.append(ALPHABET[r])
393
        if n == 0: break
394
    return ''.join(reversed(s))
395
 
396
def num_decode(s):
397
    if s[0] == SIGN_CHARACTER:
398
        return -num_decode(s[1:])
399
    n = 0
400
    for c in s:
401
        n = n * BASE + ALPHABET_REVERSE[c]
402
    return n    
18156 amit.gupta 403
 
404
def todict(obj, classkey=None):
405
    if isinstance(obj, dict):
406
        data = {}
407
        for (k, v) in obj.items():
408
            data[k] = todict(v, classkey)
409
        return data
410
    elif hasattr(obj, "_ast"):
411
        return todict(obj._ast())
412
    elif hasattr(obj, "__iter__"):
413
        return [todict(v, classkey) for v in obj]
414
    elif hasattr(obj, "__dict__"):
415
        data = dict([(key, todict(value, classkey)) 
416
            for key, value in obj.__dict__.iteritems() 
417
            if not callable(value) and not key.startswith('_')])
418
        if classkey is not None and hasattr(obj, "__class__"):
419
            data[classkey] = obj.__class__.__name__
420
        return data
421
    else:
18440 amit.gupta 422
        return obj
423
 
424
def getSkuData(storeId, identifier):
425
    if storeId in (1,2,4,5,6):
426
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier, 'source_id':storeId})
427
    elif storeId == 3:
428
        skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier, 'source_id':storeId})
429
    return skuData
18630 manas 430
 
18636 manas 431
def sendCrmProjectMail(userId,disposition_description,disposition_comments):
432
    parameters = ("user_id", userId),("subject", disposition_description),("message",disposition_comments)
433
    parameters = urllib.urlencode(parameters)
18667 manas 434
    emailpushrequest = urllib2.Request(EMAIL_CRM_PUSH_URL, parameters, headers=headers)
435
    emailpushrequest.add_header("Authorization", "Basic %s" % DTR_API_BASIC_AUTH)
18860 manas 436
    connection = urllib2.urlopen(emailpushrequest)
437
    connection.close()
18709 manas 438
 
18923 manas 439
def sendCrmProjectMailByDtr(customerFeedback):
440
    mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
441
    mailServer.ehlo()
442
    mailServer.starttls()
443
    mailServer.ehlo()
444
    title=customerFeedback.get('subject')    
445
    msg = MIMEMultipart()
446
    msg['Subject'] = title
447
    msg.preamble = title
18925 manas 448
    message="User Id : " + str(customerFeedback.get('user_id'))
449
    message1="Email : " + str(customerFeedback.get('email'))
18923 manas 450
    message2="Mobile Number : " + str(customerFeedback.get('mobile_number'))
451
    message3="Subject : " + str(customerFeedback.get('subject'))
452
    message4="Message : " + str(customerFeedback.get('message'))
18925 manas 453
    html_msg = MIMEText(message+"<br><br>"+message1+"<br><br>"+message2+"<br><br>"+message3+"<br><br>"+message4, 'html')
18924 manas 454
    msg.attach(html_msg)
18927 manas 455
 
456
    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']
457
    #MAILTO = ['manas.kapoor@saholic.com']
18923 manas 458
    mailServer.login(SENDER, PASSWORD)
459
    try:
460
        mailServer.sendmail(SENDER, MAILTO, msg.as_string())
461
    except:
462
        m = Email('localhost')
463
        mFrom = "dtr@shop2020.in"
464
        m.setFrom(mFrom)
465
        for receipient in MAILTO:
466
            m.addRecipient(receipient)
467
        m.setSubject(title)
468
        m.send()
469
    return