Subversion Repositories SmartDukaan

Rev

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