Subversion Repositories SmartDukaan

Rev

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