Subversion Repositories SmartDukaan

Rev

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