Subversion Repositories SmartDukaan

Rev

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