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