Rev 21265 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
from datetime import datetimefrom email import encodersfrom email.mime.base import MIMEBasefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom paramiko.client import SSHClientimport StringIOimport base64import gzipimport loggingimport osimport paramikoimport pymongoimport randomimport smtplibimport socketimport timeimport urllibimport urllib2import urlparsefrom Crypto.Hash import MD5from Crypto.Cipher import DESimport stringfrom dtr.utils.MailSender import Email#TODO Need to add messy stuff to conf.SENDER = "cnc.center@shop2020.in"PASSWORD = "5h0p2o2o"SMTP_SERVER = "smtp.gmail.com"SMTP_PORT = 587_password = 'dtr18Feb2015'_salt = '\xA9\x9B\xC8\x32\x56\x35\xE3\x03'_iterations = 19ALPHABET = string.ascii_uppercase + string.ascii_lowercase + \string.digits + '-_'ALPHABET_REVERSE = dict((c, i) for (i, c) in enumerate(ALPHABET))BASE = len(ALPHABET)SIGN_CHARACTER = '$'con=NoneconDtrData = NoneconCms = Noneheaders = {'User-agent':'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36','Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language' : 'en-US,en;q=0.8','Accept-Charset' : 'ISO-8859-1,utf-8;q=0.7,*;q=0.3','Connection':'keep-alive','Accept-Encoding' : 'gzip,deflate,sdch'}PROXY_MESH_LIVE = "us.proxymesh.com:31280"PROXY_MESH_GENERAL = "us-il.proxymesh.com:31280"PROXY_FLIPKART = "117.240.187.35:3128"PUSH_NOTIFICATION_URL='http://api.profittill.com/admin/users/push'DTR_API_BASIC_AUTH = base64.encodestring('%s:%s' % ("dtr", "dtr18Feb2015")).replace('\n', '')EMAIL_CRM_PUSH_URL = 'http://staging.profittill.com/feedbacks/crm_mail'statusMap = {1:'Active',2:'EOL',3:'In Process',4:'Exclusive'}SOURCE_MAP = {'AMAZON':1,'FLIPKART':2,'SNAPDEAL':3,'SAHOLIC':4, 'SHOPCLUES.COM':5,'PAYTM.COM':6, 'HOMESHOP18.COM':7}REVERSE_SOURCE_MAP = {1:"Amazon", 2:"Flipkart", 3:"Snapdeal", 4:"Spice", 5:"Shopclues", 6:"Paytm", 7:"HomeShop18"}CB_INIT = 'Waiting Confirmation'CB_PENDING = 'Pending'CB_CREDIT_IN_PROCESS = 'Credit in process'CB_CREDITED = 'Credited to wallet'CB_NA = 'Not Applicable'CB_APPROVED = 'Approved'CB_REJECTED = 'Rejected'CB_ONHOLD = 'On hold'CB_CANCELLED = 'Cancelled'ORDER_PLACED = 'Order Placed'ORDER_DELIVERED = 'Delivered'ORDER_SHIPPED = 'Shipped' #Lets see if we can make use of itORDER_CANCELLED = 'Cancelled'AFFILIATE_OFFER_API= {1:"https://www.spicesafar.com/FreeBapp/fetchOffersSM?deviceId=%s&retailerCode=%d"}AFFILIATE_OFFER_DESC_API = {1:"https://www.spicesafar.com/FreeBapp/individualOffersSM?deviceId=%s&offerId=%s&retailerCode=%d"}CREDIT_TYPE_ORDER = "Order"CREDIT_TYPE_APP = "App"CREDIT_TYPE_REFUND = "Refund"CREDIT_TYPE_OFFER = "Offer"CREDIT_TYPE_ADJUSTMENT = "Adjustment"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", \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", \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', \39:"USB Device",40:"Headphone", 41:"HDMI Cables"}CATEGORY_MAP = {3:'Mobiles',5:'Tablets',6:'Accessories'}REFUND_ADJUSTMENT_MAP={0:'Pending',1:'Approved',2:'Cancelled',3:'Credited'}SUB_CATEGORY_HEADER_RANKING = [32,12,7,13,15,8,11,36,40,21,16,23,27,24,41,25,29,17,26]DEAL_PRIORITY = [4, 2, 1, 5, 6, 7, 3] #Increasing order of source deal prioritydef get_mongo_connection(host='localhost', port=27017):global conif con is None:print "Establishing connection %s host and port %d" %(host,port)try:con = pymongo.MongoClient(host, port)except Exception, e:print ereturn Nonereturn condef get_mongo_connection_dtr_data(host='192.168.161.154', port=27017):global conDtrDataif conDtrData is None:print "Establishing connection %s host and port %d" %(host,port)try:conDtrData = pymongo.MongoClient(host, port)except Exception, e:print ereturn Nonereturn conDtrDatadef get_mongo_connection_cms(host, port=27017):global conCmsif conCms is None:print "Establishing connection %s host and port %d" %(host,port)try:conCms = pymongo.MongoClient(host, port)except Exception, e:print ereturn Nonereturn conCmsdef to_java_date(py_timestamp):try:java_date = int(time.mktime(py_timestamp.timetuple())) * 1000 + py_timestamp.microsecond / 1000return java_dateexcept:return Nonedef to_py_date(java_timestamp):try:date = datetime.fromtimestamp(java_timestamp / 1e3)except:return Nonereturn datedef getCashBack(skuId, source_id, category_id, mc, mongoHost):if mc.get("category_cash_back") is None or not bool(mc.get("category_cash_back")):populateCashBack(mc, mongoHost)itemCashBackMap = mc.get("item_cash_back")itemCashBack = itemCashBackMap.get(skuId)if itemCashBack is not None:return itemCashBackcashBackMap = mc.get("category_cash_back")sourceCashBack = cashBackMap.get(source_id)if sourceCashBack is not None and len(sourceCashBack) > 0:for cashBack in sourceCashBack:if cashBack.get(category_id) is None:continueelse:return cashBack.get(category_id)else:return {}def populateCashBack(mc, mongoHost):print "Populating cashback"cashBackMap = {}itemCashBackMap = {}cashBack = list(get_mongo_connection(host=mongoHost).Catalog.CategoryCashBack.find())for row in cashBack:temp_map = {}temp_list = []if cashBackMap.has_key(row['source_id']):arr = cashBackMap.get(row['source_id'])for val in arr:temp_list.append(val)temp_map[row['category_id']] = rowtemp_list.append(temp_map)cashBackMap[row['source_id']] = temp_listelse:temp_map[row['category_id']] = rowtemp_list.append(temp_map)cashBackMap[row['source_id']] = temp_listitemCashBack = list(get_mongo_connection(host=mongoHost).Catalog.ItemCashBack.find())for row in itemCashBack:if not itemCashBackMap.has_key(row['sku']):itemCashBackMap[row['sku']] = rowmc.set("item_cash_back", itemCashBackMap, 24 * 60 * 60)mc.set("category_cash_back", cashBackMap, 24 * 60 * 60)def ungzipResponse(r):headers = r.info()if headers.get('Content-Encoding')=='gzip':url_f = StringIO.StringIO(r.read())gz = gzip.GzipFile(fileobj=url_f)html = gz.read()gz.close()return htmlreturn r.read()def fetchResponseUsingProxy(url, headers=headers, livePricing=None, proxy=True, flipkart=False):if livePricing is None:PROXY_URL = PROXY_MESH_GENERALelif flipkart:PROXY_URL = PROXY_FLIPKARTelse:PROXY_URL = PROXY_MESH_LIVEif proxy:print PROXY_URLproxy = urllib2.ProxyHandler({'http': PROXY_URL})opener = urllib2.build_opener(proxy)urllib2.install_opener(opener)req = urllib2.Request(url,headers=headers)response = urllib2.urlopen(req)response_data = ungzipResponse(response)response.close()return response_datadef getCurrTimeStamp():return toTimeStamp(datetime.now())def toTimeStamp(dateTimeObj):return int(time.mktime(dateTimeObj.timetuple()))def fromTimeStamp(timestamp):return datetime.fromtimestamp(timestamp)def getNlcPoints(deal):if not(deal.get('minNlc') and deal.get('maxNlc')):print "Raising exception minNlc, maxNlc not found for %d"%(deal.get('_id'))raiseif deal.get('status') == 2:eolWeight = .60else:eolWeight = 1.0if deal.get('category_id') == 3:basePointPercentage = 5.0maxNlcPoints = 200elif deal.get('category_id') == 5:basePointPercentage = 8.0maxNlcPoints = 150else:basePointPercentage = 10.0maxNlcPoints = 150discFromMinNlc = float((deal.get('minNlc') - (deal.get('available_price'))))/(deal.get('available_price')) *100discFromMaxNlc = float((deal.get('maxNlc') - (deal.get('available_price'))))/(deal.get('available_price')) *100print discFromMinNlcprint discFromMaxNlcif discFromMinNlc > 0:nlcPoints = 100/basePointPercentage * discFromMinNlcelif discFromMinNlc < 0 and discFromMaxNlc > 0:nlcPoints = 0else:nlcPoints = 100/basePointPercentage * discFromMinNlcif (min(nlcPoints,maxNlcPoints)) > 0:nlcPoints = (min(nlcPoints,maxNlcPoints)) * eolWeightelse:nlcPoints = (min(nlcPoints,maxNlcPoints))return nlcPointsdef getLogger(filePath):lgr = logging.getLogger()lgr.setLevel(logging.DEBUG)fh = logging.FileHandler(filePath)fh.setLevel(logging.INFO)frmt = logging.Formatter('%(asctime)s - %(name)s - %(message)s')fh.setFormatter(frmt)lgr.addHandler(fh)return lgrdef removePriceFormatting(price_string):return price_string.strip().replace('Rs.', '').replace('Rs', '').replace(',', '').replace(' ', '').replace(' ', '').split('.')[0]def transformUrl(url,source_id):if source_id == 5:finalUrl = urlparse.urlparse(url)return finalUrl._replace(netloc=finalUrl.netloc.replace(finalUrl.hostname, 'm.shopclues.com')).geturl()elif source_id ==1:return urlelif source_id == 2:finalUrl = urlparse.urlparse(url)return finalUrl._replace(netloc=finalUrl.netloc.replace(finalUrl.hostname, socket.gethostbyname(finalUrl.hostname))).geturl()elif source_id == 7:productId = url.split('product:')[1].split('/')[0]finalUrl = 'http://m.homeshop18.com/product.mobi?productId='+str(productId)return finalUrldef find_between( s, first, last ):try:start = s.find( first ) + len( first )end = s.rfind( last, start )if start ==-1 or end ==-1:return ""return s[start:end]except ValueError:return ""if __name__ == '__main__':print transformUrl("http://www.flipkart.com/redmi-2/p/itme8ygtcfax6w39",2)def sendmail(email, message, title, *varargs):if email == "":returnmailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)mailServer.ehlo()mailServer.starttls()mailServer.ehlo()# Create the container (outer) email message.msg = MIMEMultipart()msg['Subject'] = titlemsg.preamble = titlehtml_msg = MIMEText(message, 'html')msg.attach(html_msg)#snapdeal more to be added herefor fileName in varargs:snapdeal = MIMEBase('application', 'vnd.ms-excel')snapdeal.set_payload(file(fileName).read())encoders.encode_base64(snapdeal)snapdeal.add_header('Content-Disposition', 'attachment;filename=' + fileName)msg.attach(snapdeal)MAILTO = emailmailServer.login(SENDER, PASSWORD)mailServer.sendmail(PASSWORD, MAILTO, msg.as_string())def readSSh(fileName):try:str1 = open(fileName).read()return str1except:ssh_client = SSHClient()str1 = ""ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.connect('dtr', 22, 'root', 'spic@2015dtr')sftp_client = ssh_client.open_sftp()try:if not os.path.exists(os.path.dirname(fileName)):os.makedirs(os.path.dirname(fileName))sftp_client.get(fileName, fileName)try:str1 = open(fileName).read()return str1finally:passexcept:"could not read"return str1def encryptMessage(plaintext_to_encrypt1):hasher = MD5.new()hasher.update(_password)hasher.update(_salt)result = hasher.digest()for i in range(1, _iterations):hasher = MD5.new()hasher.update(result)result = hasher.digest()padding = 8 - len(plaintext_to_encrypt1) % 8plaintext_to_encrypt1 += chr(padding) * paddingencoder = DES.new(result[:8], DES.MODE_CBC, result[8:16])encrypted = encoder.encrypt(plaintext_to_encrypt1)check1 = encrypted.encode('base64')return check1def decryptMessage(encryptedData):padding = 8 - len(encryptedData) % 8encryptedData += chr(padding) * paddinghasher = MD5.new()hasher.update(_password)hasher.update(_salt)result = hasher.digest()for i in range(1, _iterations):hasher = MD5.new()hasher.update(result)result = hasher.digest()encoder2 = DES.new(result[:8], DES.MODE_CBC, result[8:16])decodeString = encoder2.decrypt(encryptedData.decode('base64'))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 '_')def num_encode(n):if n < 0:return SIGN_CHARACTER + num_encode(-n)s = []while True:n, r = divmod(n, BASE)s.append(ALPHABET[r])if n == 0: breakreturn ''.join(reversed(s))def num_decode(s):if s[0] == SIGN_CHARACTER:return -num_decode(s[1:])n = 0for c in s:n = n * BASE + ALPHABET_REVERSE[c]return ndef todict(obj, classkey=None):if isinstance(obj, dict):data = {}for (k, v) in obj.items():data[k] = todict(v, classkey)return dataelif hasattr(obj, "_ast"):return todict(obj._ast())elif hasattr(obj, "__iter__"):return [todict(v, classkey) for v in obj]elif hasattr(obj, "__dict__"):data = dict([(key, todict(value, classkey))for key, value in obj.__dict__.iteritems()if not callable(value) and not key.startswith('_')])if classkey is not None and hasattr(obj, "__class__"):data[classkey] = obj.__class__.__name__return dataelse:return objdef getSkuData(storeId, identifier):if storeId in (1,2,4,5,6):skuData = get_mongo_connection().Catalog.MasterData.find_one({'identifier':identifier, 'source_id':storeId})elif storeId == 3:skuData = get_mongo_connection().Catalog.MasterData.find_one({'secondaryIdentifier':identifier, 'source_id':storeId})return skuDatadef sendCrmProjectMail(userId,disposition_description,disposition_comments):parameters = ("user_id", userId),("subject", disposition_description),("message",disposition_comments)parameters = urllib.urlencode(parameters)emailpushrequest = urllib2.Request(EMAIL_CRM_PUSH_URL, parameters, headers=headers)emailpushrequest.add_header("Authorization", "Basic %s" % DTR_API_BASIC_AUTH)connection = urllib2.urlopen(emailpushrequest)connection.close()def sendCrmProjectMailByDtr(customerFeedback):mailServer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)mailServer.ehlo()mailServer.starttls()mailServer.ehlo()title=customerFeedback.get('subject')msg = MIMEMultipart()msg['Subject'] = titlemsg.preamble = titlemessage="User Id : " + str(customerFeedback.get('user_id'))message1="Email : " + str(customerFeedback.get('email'))message2="Mobile Number : " + str(customerFeedback.get('mobile_number'))message3="Subject : " + str(customerFeedback.get('subject'))message4="Message : " + str(customerFeedback.get('message'))html_msg = MIMEText(message+"<br><br>"+message1+"<br><br>"+message2+"<br><br>"+message3+"<br><br>"+message4, 'html')msg.attach(html_msg)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']#MAILTO = ['rajender.singh@saholic.com']mailServer.login(SENDER, PASSWORD)try:mailServer.sendmail(SENDER, MAILTO, msg.as_string())except:m = Email('localhost')mFrom = "dtr@shop2020.in"m.setFrom(mFrom)for receipient in MAILTO:m.addRecipient(receipient)m.setSubject(title)m.send()returnfrom jsonfinder import jsonfinderimport requestsdef readSSh(fileName):try:str1 = open(fileName).read()return str1except:ssh_client = SSHClient()str1 = ""ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.connect('dtr', 22, 'root', 'spic@2015dtr')sftp_client = ssh_client.open_sftp()try:if not os.path.exists(os.path.dirname(fileName)):os.makedirs(os.path.dirname(fileName))sftp_client.get(fileName, fileName)try:str1 = open(fileName).read()return str1finally:passexcept:"could not read"return str1if __name__ == '__main__':content = readSSh("/home/amit/Downloads/flipkarthtml")print contentfor _, __, obj in jsonfinder(content, json_only=True):if (obj andisinstance(obj, list) andisinstance(obj[0], dict) and{'player_id', 'event_id', 'name'}.issubset(obj[0])):breakelse:raise ValueError('data not found')# Now you can use objprint(len(obj))print(obj[0])