Rev 7884 | Rev 11499 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
'''Created on 28-Apr-2010@author: ashish'''from shop2020.model.v1.user.impl import Dataservicefrom shop2020.utils.Utils import log_entry, to_py_datefrom shop2020.thriftpy.model.v1.user.ttypes import WidgetType as WTypefrom shop2020.model.v1.user.impl.Dataservice import User, UserCommunication, \Address, Affiliate, Tracker, TrackLog,\MasterAffiliate, UserWidgetItem, FacebookUser, UserSourcefrom shop2020.thriftpy.model.v1.user.ttypes import UserContextException,\AuthenticationException, Sexfrom elixir import sessionimport datetimefrom sqlalchemy import descfrom sqlalchemy import selectfrom shop2020.model.v1.user.impl.CartDataAccessors import create_cartfrom sqlalchemy.sql import and_def initialize(dbname='user', db_hostname="localhost"):log_entry("initialize@DataAccessor", "Initializing data service")Dataservice.initialize(dbname, db_hostname)def create_anonymous_user(jsession_id):user=User.get_by(jsession_id=jsession_id)#user=User.query.with_lockmode("update").filter_by(jsession_id=jsession_id)if not user is None:return usercart = create_cart()user = User()anonymous_str = "anonymous"user.email = jsession_id + "@anonymous.com"user.password = anonymous_struser.name = anonymous_struser.communication_email = jsession_id + "@anonymous.com"user.jsession_id = jsession_iduser.is_anonymous = Trueuser.sex = Sex.WONT_SAYuser.active_cart = cartuser.trust_level = 0user.active_since = datetime.datetime.now()session.commit()return userdef get_user_by_id(user_id):return User.get_by(id=user_id)def get_user_by_cart_id(cart_id):return User.get_by(active_cart_id=cart_id)def get_user_by_mobile_number(mobile_number):return User.get_by(mobile_number=mobile_number)def get_user_by_email(email):return User.get_by(email=email)def create_user(user_to_add):user = User.get_by(email=user_to_add.email)if user:if user.password == user_to_add.password:return userelse:raise UserContextException(109, "User already exists with this email id.")cart = create_cart()user = User()user.email = user_to_add.emailuser.password = user_to_add.passworduser.name = user_to_add.nameuser.communication_email = user_to_add.communicationEmailuser.jsession_id = user_to_add.jsessionIduser.is_anonymous = Falseuser.sex = user_to_add.sexuser.date_of_birth = user_to_add.dateOfBirthuser.active_cart = cartuser.mobile_number = user_to_add.mobileNumberuser.source = user_to_add.sourceuser.source_start_time = to_py_date(user_to_add.sourceStartTime)user.trust_level = 0user.active_since = datetime.datetime.now()us = UserSource()us.user = userus.source_id = 1if user_to_add.sourceId:us.source_id = user_to_add.sourceIdif user_to_add.isFacebookUser:fuser = FacebookUser()fuser.facebook_access_token = user_to_add.facebookAccessTokenfuser.facebook_id = user_to_add.facebookIdfuser.user = usersession.commit()return user#===============================================================================# Need to provide the update apis here for relevant fields in PrimaryInfo.#===============================================================================def update_user(user_to_update):if not user_to_update.userId:raise UserContextException(110, "user does not exist")user = get_user_by_id(user_to_update.userId)user.email = user_to_update.emailuser.password = user_to_update.passworduser.name = user_to_update.nameuser.communication_email = user_to_update.communicationEmailuser.jsession_id = user_to_update.jsessionIduser.is_anonymous = user_to_update.isAnonymoususer.sex = user_to_update.sexuser.date_of_birth = user_to_update.dateOfBirthuser.mobile_number = user_to_update.mobileNumberif user_to_update.isFacebookUser:if user.fbusers and user.fbusers[0]:fuser = user.fbusers[0]else:fuser = FacebookUser()if user_to_update.facebookAccessToken is not None:fuser.facebook_access_token = user_to_update.facebookAccessTokenif user_to_update.facebookId is not None:fuser.facebook_id = user_to_update.facebookIdfuser.user = usersession.commit()return userdef authenticate_user(user_handle, password):user = User.get_by(email=user_handle)if not user:raise AuthenticationException("This email address is not registered.", 102)if user.password == get_db_password(password):return userelse:raise AuthenticationException("Wrong username or password", 102)def user_exists(email):try:user = User.get_by(email=email)if user:return Trueelse:return Falseexcept:return Falsedef add_address_for_user(address, user_id, set_default):user = get_user_by_id(user_id)if not user:raise_user_exception(user_id)if not address:raise UserContextException(103,"Address cannot be null")address_to_add = Address()address_to_add.line_1 = address.line1address_to_add.line_2 = address.line2address_to_add.landmark = address.landmarkaddress_to_add.city = address.cityaddress_to_add.country = address.countryaddress_to_add.state = address.stateaddress_to_add.pin = address.pinaddress_to_add.type = address.typeaddress_to_add.name = address.nameaddress_to_add.phone = address.phoneaddress_to_add.added_on = to_py_date(address.addedOn)address_to_add.enabled = Trueaddress_to_add.user = usersession.commit()if set_default is True:user.default_address_id = address_to_add.id#set default address if nothing is defaultif user.default_address_id is None:user.default_address_id = address_to_add.idsession.commit()return address_to_add.iddef remove_address_for_user(user_id, address_id):address = get_address(address_id)if not address:raise UserContextException(103, "Address not found")if address.user.id != user_id:raise UserContextException(104, "This address belongs to some other user")address.enabled = Falsesession.commit()return Truedef set_user_as_logged_in(user_id, time_stamp):user = User.get_by(id=user_id)if not user:raise_user_exception(user_id)if not time_stamp:user.last_login = datetime.datetime.now()else:user.last_login = to_py_date(time_stamp)session.commit()return Truedef set_user_as_logged_out(user_id, time_stamp):user = User.get_by(id=user_id)if not user:raise_user_exception(user_id)if not time_stamp:user.last_logout = datetime.datetime.now()else:user.last_logout = to_py_date(time_stamp)session.commit()return Truedef set_default_address(user_id, address_id):user = get_user_by_id(user_id)address = Address.get_by(id=address_id)if not user:raise_user_exception(user_id)if not address:raise UserContextException(103, "Address not found")if address.user.id != user.id:raise UserContextException(104, "This address belongs to some other user")user.default_address_id = address_idsession.commit()def update_password(user_id, old_password, new_password):user = get_user_by_id(user_id)if not user:raise_user_exception(user_id)if user.password != old_password:return Falseif check_for_valid_password(new_password):user.password = get_db_password(new_password)session.commit()return Trueelse:return Falsedef create_user_communication(user_id, email, communication_type, order_id, awb, product, subject, message):user_communication = UserCommunication()user_communication.user_id = user_iduser_communication.communication_type = communication_typeif order_id > 0:user_communication.order_id = order_iduser_communication.airwaybill_no = awbuser_communication.reply_to = emailuser_communication.product_name = productuser_communication.subject = subjectuser_communication.message = messageuser_communication.communication_timestamp = datetime.datetime.now()session.commit()return Truedef get_user_communication_by_id(user_communication_id):return UserCommunication.get_by(id = user_communication_id)def get_user_communication_by_user(user_communication_user_id):return UserCommunication.query.filter_by(user_id = user_communication_user_id).order_by(-UserCommunication.id).all()def get_all_user_communications():return UserCommunication.query.order_by(-UserCommunication.id).all()def remove_user_communication(commId):UserCommunication.query.filter_by(id=commId).delete()session.commit()def create_master_affiliate(name, added_on):master_affiliate = MasterAffiliate()master_affiliate.name = namemaster_affiliate.added_on = to_py_date(added_on)session.commit()return master_affiliatedef get_all_master_affiliates():return MasterAffiliate.query.all()def get_master_affiliate_by_id(id):return MasterAffiliate.get_by(id = id)def get_master_affiliate_by_name(name):return MasterAffiliate.get_by(name = name)def create_affiliate(name, url, master_affiliate_id, added_on):affiliate = Affiliate()affiliate.name = nameif url is not None:affiliate.url = urlaffiliate.master_affiliate_id = master_affiliate_idaffiliate.added_on = to_py_date(added_on)session.commit()return affiliatedef get_affiliate_by_id(id):return Affiliate.get_by(id = id)def get_affiliate_by_name(name):return Affiliate.get_by(name = name)def get_affiliates_by_master_affiliate(master_affiliate_id):return MasterAffiliate.get_by(id = master_affiliate_id).affiliatesdef get_tracker_by_id(id):return Tracker.get_by(id = id)def add_track_log(affiliate_id, user_id, event, url, data, added_on):track_log = TrackLog()track_log.affiliate_id = affiliate_idif user_id:track_log.user_id = user_idtrack_log.event_id = eventif url:track_log.url = urlif data:track_log.data = datatrack_log.added_on = to_py_date(added_on)session.commit()return track_log.iddef get_track_log_by_id(id):return TrackLog.get_by(id = id)def get_track_logs_by_affiliate(affiliate_id, start_date, end_date):query = TrackLog.queryif affiliate_id:query = query.filter(TrackLog.affiliate_id == affiliate_id)if start_date:query = query.filter(TrackLog.added_on >= to_py_date(start_date))if end_date:query = query.filter(TrackLog.added_on <= to_py_date(end_date))return query.all()def get_track_logs_by_user(user_id):return TrackLog.query.filter(TrackLog.user_id == user_id).all()def get_track_logs(affiliate_id, user_id, event, url):query = TrackLog.queryif affiliate_id:query = query.filter(TrackLog.affiliate_id == affiliate_id)if user_id:query = query.filter(TrackLog.user_id == user_id)if event:query = query.filter(TrackLog.event == event)if url:query = query.filter(TrackLog.url == url)return query.all()def get_address(address_id):address = Address.get_by(id=address_id)return addressdef forgot_password(email, password):try:user = User.get_by(email=email)if user:user.password = passwordsession.commit()return Trueelse:return Falseexcept:return Falsedef get_all_addresses_for_user(userId):return Address.query.filter_by(user_id = userId, enabled=True).all()def get_default_address_id(userId):user = get_user_by_id(userId);if user.default_address_id is None:return 0return user.default_address_iddef get_default_pincode(user_id):user = get_user_by_id(user_id)if not user:raise_user_exception(user_id)default_address_id = user.default_address_idif default_address_id:address = Address.get_by(id=default_address_id)default_pincode = address.pinelse:default_pincode = '110001'return default_pincodedef get_user_count(user_type):if user_type is None:return User.query.count()else:return User.query.filter_by(is_anonymous = user_type).count()def get_users(user_type, start_date, end_date):query = session.query(User)if start_date != -1:query = query.filter(User.active_since >= to_py_date(start_date))if end_date != -1:query = query.filter(User.active_since <= to_py_date(end_date))if user_type is not None:query = query.filter(User.is_anonymous == user_type)return query.all()#=============================================================================# Helper functions#============================================================================='''This function returns the password as stored in the db'''def get_db_password(password):return passworddef check_for_valid_password(password):if not password:raise UserContextException(105,"password cannot be null")return True#------------------------------------------------------------------------------#===============================================================================# raises the UserContextException#===============================================================================def raise_user_exception(user_id):raise UserContextException(101, "no such user in system %d" %(user_id))def get_my_research_items(userId):query = UserWidgetItem.query.filter_by(userId=userId)query = query.filter_by(widgetId=WType.MY_RESEARCH)query = query.order_by(desc(UserWidgetItem.addedOn))widgetItems = query.all()return [widgetItem.itemId for widgetItem in widgetItems]def get_browse_history_items(userId):query = UserWidgetItem.query.filter_by(userId=userId)query = query.filter_by(widgetId=WType.BROWSE_HISTORY)query = query.order_by(desc(UserWidgetItem.addedOn)).limit(10)widgetItems = query.all()return [widgetItem.itemId for widgetItem in widgetItems]def update_my_research(userId, itemId):isNew = Falsequery = UserWidgetItem.query.filter_by(userId=userId)query = query.filter_by(widgetId=WType.MY_RESEARCH)query = query.filter_by(itemId=itemId)widgetItem = query.first()if not widgetItem:isNew = TruewidgetItem = UserWidgetItem()widgetItem.userId = userIdwidgetItem.widgetId = WType.MY_RESEARCHwidgetItem.itemId = itemIdwidgetItem.addedOn = datetime.datetime.now()session.commit()return isNewdef update_browse_history(userId, itemId):query = UserWidgetItem.query.filter_by(userId=userId)query = query.filter_by(widgetId=WType.BROWSE_HISTORY)query = query.filter_by(itemId=itemId)widgetItem = query.first()if not widgetItem:widgetItem = UserWidgetItem()widgetItem.userId = userIdwidgetItem.widgetId = WType.BROWSE_HISTORYwidgetItem.itemId = itemIdwidgetItem.addedOn = datetime.datetime.now()session.commit()def delete_item_from_my_research(userId, itemId):query = UserWidgetItem.query.filter_by(userId=userId)query = query.filter_by(widgetId=WType.MY_RESEARCH)query = query.filter_by(itemId=itemId)widgetItem = query.first()if widgetItem:widgetItem.delete()session.commit()else:print "Not item in my research to delete with itemId" + itemIddef increase_trust_level(userId, trustLevelDelta):user = User.query.filter_by(id = userId).with_lockmode('update').first()user.trust_level += trustLevelDeltasession.commit()def get_trust_level(userId):user = User.query.filter_by(id = userId).first()return user.trust_leveldef get_user_emails(start_date, end_date):emails = select([User.table.c.communication_email], and_(User.table.c.active_since >= start_date, User.table.c.active_since <= end_date, User.table.c.is_anonymous==0)).execute()email_addresses = []for email in emails:email_addresses.append(str(email[0]))return email_addressesdef close_session():if session.is_active:print "session is active. closing it."session.close()def is_alive():try:session.query(User.id).limit(1).one()return Trueexcept:return False