Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

'''
Created on 28-Apr-2010

@author: ashish
'''
from shop2020.model.v1.user.impl import Dataservice
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
from shop2020.model.v1.user.impl.Dataservice import User, PrimaryInfo, IPMap,\
    Address, SocialService, SocialHandle, State, InternalInfo
from shop2020.thriftpy.model.v1.user.ttypes import UserContextException,\
    AuthenticationException, AccountStatus
from elixir import session
import datetime

def 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.firstName
        
        if  user_context.primaryInfo.middleName:
            primary_info.middle_name = user_context.primaryInfo.middleName
        
        if  user_context.primaryInfo.lastName:
            primary_info.last_name = user_context.primaryInfo.lastName
            
        if  user_context.primaryInfo.title:
            primary_info.title = user_context.primaryInfo.title
            
        if  user_context.primaryInfo.pictureUrl:
            primary_info.picture_id = user_context.primaryInfo.pictureUrl
        
        if  user_context.primaryInfo.email:
            primary_info.email = user_context.primaryInfo.email
            
        if  user_context.primaryInfo.userHandle:
            primary_info.user_handle = user_context.primaryInfo.userHandle
            
        if  user_context.primaryInfo.password:
            primary_info.password = user_context.primaryInfo.password
            
        if  user_context.primaryInfo.occupation:
            primary_info.occupation = user_context.primaryInfo.occupation
            
        if  user_context.primaryInfo.hintQuestion:
            primary_info.hint_question = user_context.primaryInfo.hintQuestion
        
        if  user_context.primaryInfo.hintAnswer:
            primary_info.hint_answer = user_context.primaryInfo.hintAnswer
        
        if  user_context.primaryInfo.shipmentOption:
            primary_info.shipment_option = user_context.primaryInfo.shipmentOption
            
        if  user_context.primaryInfo.firstName:
            primary_info.first_name = user_context.primaryInfo.firstName

        primary_info.user = user_context_to_add 
    
    if user_context.sessionId:
        user_context_to_add.session_id = user_context.sessionId
         
    primary_info = PrimaryInfo()
    internal_info = InternalInfo()
    user_state = State()
    
    #initialize internal info 
    
    internal_info.geo_zone = 0
    internal_info.shipment_zone = 0
    internal_info.tax_zone = 0
    internal_info.rank_score = 0.0
    internal_info.user = user_context_to_add
    
    #initialize userState
    user_state.is_email_verified = False
    user_state.is_sms_verified = False
    user_state.is_logged_in = False
    user_state.account_status = AccountStatus.ACTIVE
    user_state.is_enrolled = False
    user_state.last_login_timestamp = 0
    user_state.last_logout = 0
    user_state.ip_list = {}
    user_state.active_since = datetime.datetime.now()
    user_state.current_shopping_cart = user_context.userState.shoppingCartHandle
    user_state.user = user_context_to_add
    
    session.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):
    pass

def 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.user
    else:
        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.state

def 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_info

def 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_info

def 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.user
    else:
        raise AuthenticationException("Wrong username or password", 102)
    
def get_address(address_id):
    address = Address.get_by(id=address_id)
    return address

def get_social_service(service_id):
    service = SocialService.get_by(service_id)
    return service
    
def authenticate_user(user_handle, password):
    try:
        get_context(user_handle, password)
    except:
        return False
    return True

def user_exists(email):
    user = get_context_by_email_or_handle(email, True)
    if user:
        return True
    else:
        return False

def 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 object
    ip_address = IPMap()
    ip_address.ip = ip_address
    ip_address.timestamp = to_py_date(time_stamp)
    ip_address.user_info = user.state
    session.commit()
    return True

def 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.line1
    address_to_add.line_2 = address.line2
    address_to_add.landmark = address.landmark
    address_to_add.city = address.city
    address_to_add.country = address.country
    address_to_add.state = address.state
    address_to_add.pin = address.pin
    address_to_add.type = address.type
    address_to_add.added_on = to_py_date(address.addedOn)
    address_to_add.enabled = True
    address_to_add.primary_info = user.primary_info
    session.commit()
    return True

def 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 address
    address.enabled = False
    session.commit()
    return True

def 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 = True
    if not time_stamp:
        user.state.last_login_timestamp = datetime.datetime.now()
    user.state.last_login_timestamp = to_py_date(time_stamp)
    session.commit()
    return True
    
def 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 = True
    
    if not time_stamp:
        user.state.last_logout = datetime.datetime.now()
    user.state.last_logout = to_py_date(time_stamp)
    session.commit()
    return True

def 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_update
        session.commit()
        return True
    else:
        return False
    
def 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.DELETED
    session.commit()
    return True
    
def 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 service
    
def 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 handle
        social_handle = SocialHandle()
        social_handle.service = service
        social_handle.primary_info = user.primary_info
        social_handle.handle = handle
        session.commit()
    else:
        social_handle.handle = handle
        session.commit()
    return True
#=============================================================================
# Helper functions 
#=============================================================================

'''
This function returns the password as stored in the db
'''    
def get_db_password(password):
    return password

def 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))