Subversion Repositories SmartDukaan

Rev

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