Rev 20244 | Blame | Compare with Previous | Last modification | View Log | RSS feed
'''Created on 14-Jul-2010@author: ashish'''from elixir import *from email import encodersfrom email.mime.base import MIMEBasefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom shop2020.clients.CatalogClient import CatalogClientfrom shop2020.clients.TransactionClient import TransactionClientfrom shop2020.helpers.impl import DataServicefrom shop2020.helpers.impl.DataService import Message, UserEmail, EntitiesShared, \Report, ReportRoleAuthority, CatalogDashboardUser, UserEmailArchive, QuickLink, \AgentWarehouseMapping, UserSms, UserSmsInfo, UserSmsArchive, DealerAuth, Campaignsfrom shop2020.helpers.impl.model.Agent import Agentfrom shop2020.helpers.impl.model.DashboardUser import DashboardUserfrom shop2020.thriftpy.utils.ttypes import HelperServiceException, Mail, \Message as Msg, SmsStatus, SmsType, SmsDeliveryStatusfrom shop2020.utils.Utils import log_entry, to_py_date, to_java_datefrom sqlalchemy.orm import queryfrom sqlalchemy.orm.exc import NoResultFound, MultipleResultsFoundfrom sqlalchemy.sql import funcfrom sqlalchemy.sql.expression import and_, or_, desc, not_, distinct, cast, \betweenfrom string import Templateimport datetimeimport osimport smtplibdef initialize(dbname='helper', db_hostname="localhost"):log_entry("initialize@DataAccessor", "Initializing data service")DataService.initialize(dbname, db_hostname)def save_user_email_for_sending(email_to, email_from, subject, body, source, email_type, cc, bcc, sourceId):## Do not send mail to users except source Website.if sourceId != 1:return 0user_email = UserEmail()user_email.emailTo = ';'.join(email_to)user_email.emailFrom = email_fromuser_email.subject = subjectuser_email.body = bodyuser_email.source = sourceuser_email.emailType = email_typeuser_email.status = Falseuser_email.timestamp = datetime.datetime.now()if cc:user_email.cc = ';'.join(cc)if bcc:user_email.bcc = ';'.join(bcc)session.commit()return user_email.iddef get_emails_to_be_sent():print "get_emails_to_be_sent"return UserEmail.query.filter(UserEmail.status == 0).all()def mark_email_as_sent(email_id):UserEmail.query.filter(UserEmail.status==1).delete()query = 'INSERT INTO ' + str(UserEmailArchive.table) + ' (select * from ' + str(UserEmail.table) + ' where id = ' + str(email_id) + ')'session.execute(query, mapper=UserEmailArchive)email = UserEmail.get_by(id = email_id)if email:email.status=1session.commit()def sendMail(mail):if not mail:raise HelperServiceException(101, "mail not present")#msg = MIMEMultipart()#mail = Mail()if mail.sender:mail.data = "This mail is sent by " + mail.sender + "\n" + mail.datamsg = MIMEText(mail.data)msg['To'] = ', '.join( mail.to )if mail.sender:msg['From'] = mail.senderelse:msg['From'] = "help@saholic.com"msg['Subject'] = mail.subject#msg.attach(mail.data)#handle attachments in mailif mail.attachments:for attach in mail.attachments:part = MIMEBase('application', 'octet-stream')part.set_payload(open(attach, 'rb').read())encoders.encode_base64(part)part.add_header('Content-Disposition','attachment; filename="%s"' % os.path.basename(attach))msg.attach(part)for to in mail.to:mail.sender = "help@shop2020.in"mail.password = "5h0p2o2o"mailServer = smtplib.SMTP("smtp.gmail.com", 587)mailServer.ehlo()mailServer.starttls()mailServer.ehlo()mailServer.login(mail.sender, mail.password)mailServer.sendmail(mail.password, to, msg.as_string())# Should be mailServer.quit(), but that crashes...mailServer.close()def sendText(text):passdef addMessage(message):msg = Message.get_by(message_id=message.id)if msg:raise HelperServiceException(101, "Message is already present. Please try updation api instead")msg = Message();msg.message_id = message.idmsg.message = message.messagesession.commit()def getMessage(message_id):msg = Message.get_by(id=message_id)message = Msg()message.id = msg.message_idmessage.message = msg.messagereturn messagedef updateMessage(id, message):msg = Message.get_by(message_id=id)if msg:msg.message = messagesession.commit()else:raise HelperServiceException(101, "message could not be found with id %d" %(id))def getSubstitutedMessage(id, params):#get the message firstmsg = Message.get_by(message_id=id)if not msg:raise HelperServiceException(101, "message could not be found with id %d" %(id))if params:s = Template(msg.message)s = s.safe_substitute(params)return selse:return msg.messagedef add_user(username, password, warehouseId):user = DashboardUser()user.username = usernameuser.password = passworduser.warehouseId = warehouseIduser.addedOn = datetime.datetime.now()user.status = 0try:session.commit()return Trueexcept:raise HelperServiceException(101, "Some error while adding user")return Falsedef delete_user(username):user = DashboardUser.get_by(username=username)if user is None:return Falseuser.delete()session.commit()return Truedef authenticate_dashboard_user(username, password):user = DashboardUser.get_by(username=username, password=password)if user is None:raise HelperServiceException(101, "No dashboard user found")user.loggedOn = datetime.datetime.now()session.commit()return user.to_thrift_object()def update_password(username, oldPassword, newPassword):user = DashboardUser.get_by(username=username)if user is None:return Falseif user.password == oldPassword:user.password = newPasswordsession.commit()return Truereturn Falsedef get_reports(role):query = session.query(Report).join(ReportRoleAuthority)if role==-1:query.filter()else:query = query.filter(ReportRoleAuthority.role == role)reports = query.all()return reportsdef share_entities(entityIds, email):if entityIds:entityIdsStr = ''email_body = get_email_body_for_product_sharing(entityIds)save_user_email_for_sending(email, '', 'Check out Saholic.com', email_body, '', 'MOBILE_SHARE')for entityId in entityIds:entityIdsStr += str(entityId)entities_to_be_shared = EntitiesShared()entities_to_be_shared.entityIds = entityIdsStrentities_to_be_shared.email = emailentities_to_be_shared.isEmailed = Falsesession.commit()def get_email_body_for_product_sharing(entityIds):catalog_client = CatalogClient().get_client()emailBody = '<html><body><p>Check out following products on Saholic:</p><ul>\n'for entityId in entityIds:list_items = catalog_client.getItemsByCatalogId(entityId)url = 'http://www.saholic.com/entity/%s' % (entityId)item = list_items[0]name = item.brand + ' 'name += item.modelName + ' ' if item.modelName is not None else ''name += item.modelNumber if item.modelNumber is not None else ''emailBody += '<li><a href="%s">%s</a></li>' % (url, name)emailBody += '</ul></body></html>'return emailBodydef save_quick_link(url, text):quickLink = QuickLink()quickLink.url = urlquickLink.text = textsession.commit()def get_quick_links():return QuickLink.query.all()def update_quicklink(id, url, text):quicklink = QuickLink.get_by(id = id)quicklink.url = urlquicklink.text = textsession.commit()def update_password_for_agent(agentEmailId, password):agent = Agent.get_by(emailId = agentEmailId)agent.password = passwordsession.commit()def get_emails_for_notifications_sent(start_datetime, end_datetime):query = UserEmailArchive.query.filter(UserEmailArchive.emailType == 'ProductNotification')query = query.filter(UserEmailArchive.timestamp >= start_datetime)query = query.filter(UserEmailArchive.timestamp <= end_datetime)return query.all()def get_order_confirmation_mail(order_id):email = UserEmailArchive.get_by(emailType = 'TransactionInfo', source = order_id)#Start:- Added by Manish Sharma for resolving Exception for getting order delivery and confirmation mail on 27-Jun-2013if email:return email.bodyelse:return ''#End:- Added by Manish Sharma for resolving Exception for getting order delivery and confirmation mail on 27-Jun-2013def get_order_delivery_mail(order_id):email = UserEmailArchive.get_by(emailType = 'DeliverySuccess', source = order_id)#Start:- Added by Manish Sharma for resolving Exception for getting order delivery and confirmation mail on 27-Jun-2013if email:return email.bodyelse:tclient = TransactionClient().get_client()order = tclient.getOrder(order_id)if order.logisticsTransactionId:email = UserEmailArchive.get_by(emailType = 'DeliverySuccess', source = order.logisticsTransactionId)if email:return email.bodyelse:return ''#End:- Added by Manish Sharma for resolving Exception for getting order delivery and confirmation mail on 27-Jun-2013def get_warehouseIds_for_agent(agent_emailId):agent = Agent.get_by(emailId = agent_emailId)agent_warehouse_mappings = AgentWarehouseMapping.query.filter(AgentWarehouseMapping.agentId == agent.id).all()warehouseIds = []for mapping in agent_warehouse_mappings:try:warehouseIds.append(mapping.warehouseId)except:raise HelperServiceException(108, "Exception while getting warehouseIds for Agent")return warehouseIdsdef save_user_sms_for_sending(userId, mobileNo, text, type):userSms = UserSms()userSms.user_id = userIduserSms.createdTimestamp = datetime.datetime.now()userSms.mobileNumber = mobileNouserSms.attempts = 0userSms.smsText = textuserSms.type = SmsType._VALUES_TO_NAMES[type]userSms.status = SmsStatus._VALUES_TO_NAMES[0]userSms.deliveryStatus = SmsDeliveryStatus._VALUES_TO_NAMES[0]session.commit()return userSms.iddef get_sms_to_be_sent():print "get_sms_to_be_sent"return UserSms.query.filter(UserSms.deliveryStatus== SmsDeliveryStatus._VALUES_TO_NAMES[SmsDeliveryStatus.NOT_SENT]).all()def mark_sms_as_sent(smsId, status, responseId, responseText):sms = UserSms.get_by(id=smsId)if sms:sms.attempts = sms.attempts+1sms.status = SmsStatus._VALUES_TO_NAMES[status]sms.responseId = responseIdsms.responseText = responseTextsession.commit()query = 'INSERT INTO ' + str(UserSmsArchive.table) + ' (select * from ' + str(UserSms.table) + ' where id = ' + str(smsId) + ')'session.execute(query, mapper=UserSmsArchive)if sms:sms.delete()session.commit()def mark_sms_as_retry(smsId, status, responseId, responseText):sms = UserSms.get_by(id=smsId)if sms:if sms.attempts<3:sms.attempts = sms.attempts+1sms.status = SmsStatus._VALUES_TO_NAMES[status]sms.responseId = responseIdsms.responseText = responseTextsession.commit()return Trueelse:return Falseelse:return Falsedef add_user_sms_info(userSms_Info):userSmsInfo = UserSmsInfo()userSmsInfo.userId = userSms_Info.userIduserSmsInfo.mobileNo = userSms_Info.mobileNouserSmsInfo.createdTimestamp = to_py_date(userSms_Info.createdTimestamp)userSmsInfo.updateTimestamp = to_py_date(userSms_Info.updateTimestamp)userSmsInfo.dailyCount = 0userSmsInfo.weeklyCount = 0userSmsInfo.dndStatus = FalseuserSmsInfo.smsSubscribed = Truesession.commit()def update_user_sms_info(userSms_Info):userSmsInfo = UserSmsInfo.query.filter(UserSmsInfo.userId == userSms_Info.userId).first()if userSmsInfo:userSmsInfo.mobileNo = userSms_Info.mobileNouserSmsInfo.dndStatus = userSms_Info.dndStatususerSmsInfo.smsSubscribed = userSms_Info.smsSubscribeduserSmsInfo.dailyCount = userSms_Info.dailyCountuserSmsInfo.weeklyCount = userSms_Info.weeklyCountuserSmsInfo.updateTimestamp = datetime.datetime.now()session.commit()return Trueelse:return Falsedef get_user_sms_info(userId):return UserSmsInfo.query.filter(UserSmsInfo.userId == userId).first()def get_all_users_sms_info(dndStatus, smsSubscribed):print 'get all users sms infos'return UserSmsInfo.query.filter(UserSmsInfo.dndStatus == dndStatus).filter(UserSmsInfo.smsSubscribed == smsSubscribed).all()def list_sms_to_get_delivery_info():print 'get all message waiting for delivery status'return UserSms.query.filter(or_(UserSms.deliveryStatus== SmsDeliveryStatus._VALUES_TO_NAMES[SmsDeliveryStatus.SENT_TO_OPERATOR], UserSms.deliveryStatus== SmsDeliveryStatus._VALUES_TO_NAMES[SmsDeliveryStatus.SUBMITTED_TO_SMSC])).all()def mark_messages_as_sent_to_operator(userSmsList):for userSms in userSmsList:sms = UserSms.get_by(id=userSms.id)if sms:sms.deliveryStatus = SmsDeliveryStatus._VALUES_TO_NAMES[userSms.deliveryStatus]sms.attempts = userSms.attemptssms.responseId = userSms.responseIdsms.responseText = userSms.responseTextsession.commit()return Truedef mark_messages_as_submitted_to_smsc(userSmsList):for userSms in userSmsList:sms = UserSms.get_by(id=userSms.id)if sms:sms.deliveryStatus = SmsDeliveryStatus._VALUES_TO_NAMES[userSms.deliveryStatus]sms.responseText = userSms.responseTextsession.commit()query = 'INSERT INTO ' + str(UserSmsArchive.table) + ' (select * from ' + str(UserSms.table) + ' where id = ' + str(sms.id) + ')'session.execute(query, mapper=UserSmsArchive)if sms:sms.delete()session.commit()return Truedef mark_messages_as_sent(userSmsList):UserSms.query.filter(UserSms.status==SmsStatus._VALUES_TO_NAMES[SmsStatus.DELIVERED]).delete()for userSms in userSmsList:sms = UserSms.get_by(id=userSms.id)if sms:sms.deliveryStatus = SmsDeliveryStatus._VALUES_TO_NAMES[userSms.deliveryStatus]sms.responseText = userSms.responseTextsms.status = SmsStatus._VALUES_TO_NAMES[userSms.status]query = 'INSERT INTO ' + str(UserSmsArchive.table) + ' (select * from ' + str(UserSms.table) + ' where id = ' + str(sms.id) + ')'session.execute(query, mapper=UserSmsArchive)sms.status = SmsStatus._VALUES_TO_NAMES[SmsStatus.DELIVERED]session.commit()return Truedef mark_messages_as_retry(userSmsList):for userSms in userSmsList:sms = UserSms.get_by(id=userSms.id)if sms:sms.deliveryStatus = SmsDeliveryStatus._VALUES_TO_NAMES[userSms.deliveryStatus]sms.responseText = userSms.responseTextsms.status = SmsStatus._VALUES_TO_NAMES[userSms.status]session.commit()query = 'INSERT INTO ' + str(UserSmsArchive.table) + ' (select * from ' + str(UserSms.table) + ' where id = ' + str(sms.id) + ')'session.execute(query, mapper=UserSmsArchive)if userSms.attempts < 3:new_sms_id= save_user_sms_for_sending(userSms.user_id, userSms.mobileNumber, userSms.smsText, userSms.type)new_sms = UserSms.get_by(id=new_sms_id)new_sms.status = SmsStatus._VALUES_TO_NAMES[0]new_sms.attempts = userSms.attemptsnew_sms.deliveryStatus = SmsDeliveryStatus._VALUES_TO_NAMES[0]session.commit()if sms:sms.delete()session.commit()return Truedef authorise_dealer(tDealerAuth):tDealerAuth.isActive = Falseif tDealerAuth.username:dealerAuth = DealerAuth.get_by(username=tDealerAuth.username)if dealerAuth:if tDealerAuth.password == dealerAuth.password and dealerAuth.isActive == True:tDealerAuth.role = dealerAuth.roleif tDealerAuth.lastLocation and dealerAuth.lattitude and dealerAuth.longitude:dealerAuth.lattitude, dealerAuth.longitude, tDealerAuth.lastLocation.lattitude,tDealerAuth.lastLocation.longitude = tDealerAuth.lastLocation.lattitude,tDealerAuth.lastLocation.longitude, dealerAuth.lattitude, dealerAuth.longitudeif dealerAuth.lastLoggedIn is not None:tDealerAuth.lastLoggedIn = to_java_date(dealerAuth.lastLoggedIn)else:tDealerAuth.lastLoggedIn = NonedealerAuth.lastLoggedIn = datetime.datetime.now()tDealerAuth.isActive = Truesession.commit()tDealerAuth.password = Nonereturn tDealerAuthdef addCampaignNotification(userEmail,campaignType):try:exist = Campaigns.get_by(userEmail=userEmail,campaignType=campaignType)if exist is not None:return "You are already registered."else:c = Campaigns()c.userEmail = userEmailc.campaignType = campaignTypesession.commit()return "Email registered successfully."except Exception as e:print ereturn "OOPS!!!Please try again."def close_session():if session.is_active:print "session is active. closing it."session.close()def is_alive():try:return Trueexcept:return False