Subversion Repositories SmartDukaan

Rev

Rev 567 | Rev 581 | 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 Dataservice
from shop2020.utils.Utils import log_entry, to_py_date, to_java_date
from shop2020.model.v1.user.impl.Dataservice import User, IPMap,\
    Address, SocialHandle, UserState, InternalInfo, SocialService
from shop2020.thriftpy.model.v1.user.ttypes import UserContextException,\
    AuthenticationException, AccountStatus, Sex
from elixir import session
import datetime

def initialize():
    log_entry("initialize@DataAccessor", "Initializing data service")
    Dataservice.initialize()

def create_anonymous_user(jsession_id, cart):
    user=User.get_by(jsession_id=jsession_id)
    if not user is None:
        return user
    user = User()
    anonymous_str = "anonymous"
    user.email = jsession_id + "@anonymous.com"
    user.password = anonymous_str
    user.name = anonymous_str
    user.communication_email = jsession_id + "@anonymous.com"
    user.jsession_id = jsession_id
    user.is_anonymous = True
    user.sex = Sex.WONT_SAY
    user.active_cart_id = cart.id
    #initialize userState
    user_state = UserState()
    user_state.is_email_verified = False
    user_state.is_sms_verified = False
    user_state.account_status = AccountStatus.ACTIVE
    user_state.ip_list = []
    user_state.active_since = datetime.datetime.now()    
    user_state.user = user
    session.commit()

    cart.user_id = user.id    
    session.commit()
    
    return user

def get_user_by_id(user_id):
    return User.get_by(id=user_id)

def create_user(user_to_add, cart):
    if user_to_add.userId:
        raise UserContextException(109, "id is set, user cannot be created")
    user = User()
    user.email = user_to_add.email
    user.password = user_to_add.password
    user.name = user_to_add.name
    user.communication_email = user_to_add.communicationEmail
    user.jsession_id = user_to_add.jsessionId
    user.is_anonymous = False
    user.sex = user_to_add.sex
    user.date_of_birth = user_to_add.dateOfBirth
    user.active_cart_id = cart.id
    user.mobile_number = user_to_add.mobileNumber

    #initialize userState
    user_state = UserState()
    user_state.is_email_verified = False
    user_state.is_sms_verified = False
    user_state.account_status = AccountStatus.ACTIVE
    user_state.ip_list = []
    user_state.active_since = datetime.datetime.now()
    user_state.user = user
    session.commit()
    
    #Now create the user phones. Mostly, this should only be a mobile number

    cart.user_id = user.id    
    session.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.id:
        raise UserContextException(110, "user does not exist")
    session.add(user_to_update)    
    session.commit()
    return user_to_update

def delete_user(user_id):
    user = get_user_by_id(user_id)
    
    if not user:
        raise_user_exception(user_id)
        
    user.state.account_status = AccountStatus.DELETED
    session.commit()
    return True
    
def get_user_state(user_id):
    return UserState.get_by(user_id=user_id)

def get_internal_info(user_id):
    return InternalInfo.get_by(user_id=user_id)

def 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 user
    else:
        raise AuthenticationException("Wrong username or password", 102)

def user_exists(email):
    try:
        user = User.get_by(email=email)
        if user:
            return True
        else:
            return False
    except:
        return False

def 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.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.name = address.name
    address_to_add.phone = address.phone
    address_to_add.added_on = to_py_date(address.addedOn)
    address_to_add.enabled = True
    address_to_add.user = user
    session.commit()
    
    if set_default is True:
        user.default_address_id = address_to_add.id
    #set default address if nothing is default    
    if user.default_address_id is None:
        user.default_address_id = address_to_add.id
            
    session.commit()
    
    return address_to_add.id
    
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.user.id != user_id:
        raise UserContextException(104, "This address belongs to some other user")
    
    address.enabled = False
    session.commit()
    return True

def set_user_as_logged_in(user_id, time_stamp):
    user_state = UserState.get_by(user_id=user_id)
    #user = get_user_by_id(user_id)
    
    if not user_state:
        raise_user_exception(user_id)
    
    if not time_stamp:
        user_state.last_login = datetime.datetime.now()
    else:
        user_state.last_login = to_py_date(time_stamp)
    session.commit()
    return True
    
def set_user_as_logged_out(user_id, time_stamp):
    user_state = UserState.get_by(user_id=user_id)
    
    if not user_state:
        raise_user_exception(user_id)
    
    if not time_stamp:
        user_state.last_logout = datetime.datetime.now()
    else:
        user_state.last_logout = to_py_date(time_stamp)
    session.commit()
    return True

def 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_id 
    session.commit()
    
def update_password(user_id, password):
    user = get_user_by_id(user_id)
    
    if not user:
        raise_user_exception(user_id)
    
    if check_for_valid_password(password):
        user.password = get_db_password(password)
        session.commit()
        return True
    else:
        return False
    
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 add_ip_address_for_user(ip_address, time_stamp, user_id):
    user = get_user_by_id(user_id)
    if not user:
        raise_user_exception(user_id)
    #user exists create an IP address object
    ip_address = IPMap()
    ip_address.ip = ip_address
    ip_address.timestamp = to_py_date(time_stamp)
    ip_address.user_state = user.state
    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_user_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(user=user).one()
    if not social_handle:
        #create a new handle
        social_handle = SocialHandle()
        social_handle.service = service
        social_handle.user = user
        social_handle.handle = handle
    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))