Subversion Repositories SmartDukaan

Rev

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