Blame | 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_date, to_java_datefrom shop2020.model.v1.user.impl.Dataservice import User, PrimaryInfo, IPMap,\Address, SocialService, SocialHandle, State, InternalInfofrom shop2020.thriftpy.model.v1.user.ttypes import UserContextException,\AuthenticationException, AccountStatusfrom elixir import sessionimport datetimedef initialize():log_entry("initialize@DataAccessor", "Initializing data service")Dataservice.initialize()def create_context(user_context):if user_context.id:raise UserContextException(109, "id is set, user cannot be created")user_context_to_add = User()if user_context.primaryInfo:primary_info = PrimaryInfo()if user_context.primaryInfo.firstName:primary_info.first_name = user_context.primaryInfo.firstNameif user_context.primaryInfo.middleName:primary_info.middle_name = user_context.primaryInfo.middleNameif user_context.primaryInfo.lastName:primary_info.last_name = user_context.primaryInfo.lastNameif user_context.primaryInfo.title:primary_info.title = user_context.primaryInfo.titleif user_context.primaryInfo.pictureUrl:primary_info.picture_id = user_context.primaryInfo.pictureUrlif user_context.primaryInfo.email:primary_info.email = user_context.primaryInfo.emailif user_context.primaryInfo.userHandle:primary_info.user_handle = user_context.primaryInfo.userHandleif user_context.primaryInfo.password:primary_info.password = user_context.primaryInfo.passwordif user_context.primaryInfo.occupation:primary_info.occupation = user_context.primaryInfo.occupationif user_context.primaryInfo.hintQuestion:primary_info.hint_question = user_context.primaryInfo.hintQuestionif user_context.primaryInfo.hintAnswer:primary_info.hint_answer = user_context.primaryInfo.hintAnswerif user_context.primaryInfo.shipmentOption:primary_info.shipment_option = user_context.primaryInfo.shipmentOptionif user_context.primaryInfo.firstName:primary_info.first_name = user_context.primaryInfo.firstNameprimary_info.user = user_context_to_addif user_context.sessionId:user_context_to_add.session_id = user_context.sessionIdprimary_info = PrimaryInfo()internal_info = InternalInfo()user_state = State()#initialize internal infointernal_info.geo_zone = 0internal_info.shipment_zone = 0internal_info.tax_zone = 0internal_info.rank_score = 0.0internal_info.user = user_context_to_add#initialize userStateuser_state.is_email_verified = Falseuser_state.is_sms_verified = Falseuser_state.is_logged_in = Falseuser_state.account_status = AccountStatus.ACTIVEuser_state.is_enrolled = Falseuser_state.last_login_timestamp = 0user_state.last_logout = 0user_state.ip_list = {}user_state.active_since = datetime.datetime.now()user_state.current_shopping_cart = user_context.userState.shoppingCartHandleuser_state.user = user_context_to_addsession.commit()#===============================================================================# All the validation rules prioir to adding a user to system go here#===============================================================================def validate_context_to_add(user_context):return True#===============================================================================# Need to provide the update apis here for relevant fields in PrimaryInfo.#===============================================================================def update_context(user_context):passdef get_context_by_id(user_id):return User.get_by(id=user_id)def get_context_by_session_id(session_id):return User.get_by(session_id=session_id)def get_context_by_email_or_handle(email_or_handle, is_email):if is_email:primary_info = PrimaryInfo.get_by(email=email_or_handle)else:primary_info = PrimaryInfo.get_by(user_handle=email_or_handle)if primary_info:return primary_info.userelse:raise UserContextException(101, "no such user in system")def get_state(user_id, is_session_id):if is_session_id:user = get_context_by_session_id(user_id)else:user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)return user.statedef get_primary_info(user_id, is_session_id):if is_session_id:user = get_context_by_session_id(user_id)else:user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)return user.primary_infodef get_internal_info(user_id, is_session_id):if is_session_id:user = get_context_by_session_id(user_id)else:user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)return user.internal_infodef get_context(user_handle, password):primary_info = PrimaryInfo.get_by(email=user_handle)if not primary_info:raise AuthenticationException("Wrong username", 102)db_password = get_db_password(password)if primary_info.password == db_password:return primary_info.userelse:raise AuthenticationException("Wrong username or password", 102)def get_address(address_id):address = Address.get_by(id=address_id)return addressdef get_social_service(service_id):service = SocialService.get_by(service_id)return servicedef authenticate_user(user_handle, password):try:get_context(user_handle, password)except:return Falsereturn Truedef user_exists(email):user = get_context_by_email_or_handle(email, True)if user:return Trueelse:return Falsedef add_ip_address_for_user(ip_address, time_stamp, user_id):user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)#user exists create an ipaddress objectip_address = IPMap()ip_address.ip = ip_addressip_address.timestamp = to_py_date(time_stamp)ip_address.user_info = user.statesession.commit()return Truedef add_address_for_user(address, user_id, time_stamp):user = get_context_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.added_on = to_py_date(address.addedOn)address_to_add.enabled = Trueaddress_to_add.primary_info = user.primary_infosession.commit()return Truedef remove_address_for_user(user_id, address_id):address = get_address(address_id)if not address:raise UserContextException(103,"Address not found")if address.primary_info.user.id != user_id:raise UserContextException(104,"This address belongs to some other user")#so far so good. Now diable the addressaddress.enabled = Falsesession.commit()return Truedef set_user_as_logged_in(user_id, time_stamp):user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)user.state.is_logged_in = Trueif not time_stamp:user.state.last_login_timestamp = datetime.datetime.now()user.state.last_login_timestamp = to_py_date(time_stamp)session.commit()return Truedef set_user_as_logged_out(user_id,time_stamp):user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)user.state.is_logged_in = Trueif not time_stamp:user.state.last_logout = datetime.datetime.now()user.state.last_logout = to_py_date(time_stamp)session.commit()return Truedef update_password(user_id, password):user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)if check_for_valid_password(password):password_to_update = get_db_password(password)user.primary_info.password = password_to_updatesession.commit()return Trueelse:return Falsedef delete_user(user_id, is_session_id):if is_session_id:user = get_context_by_session_id(user_id)else:user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)user.state.account_status = AccountStatus.DELETEDsession.commit()return Truedef get_social_service_by_name(service_name):service = SocialService.get_by(name=service_name)if not service:raise UserContextException(106, "No such social service exists")return servicedef add_social_handle(user_id, social_service, handle):user = get_context_by_id(user_id)if not user:raise_user_exception(user_id)service = get_social_service_by_name(social_service)#get if use already has this service.social_handle = SocialHandle.filter(service=service).filter(primary_info=user.primary_info).one()if not social_handle:#create a new handlesocial_handle = SocialHandle()social_handle.service = servicesocial_handle.primary_info = user.primary_infosocial_handle.handle = handlesession.commit()else:social_handle.handle = handlesession.commit()return True#=============================================================================# 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))