Subversion Repositories SmartDukaan

Rev

Rev 576 | Rev 594 | 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 shop2020.clients.HelperClient import HelperClient
from elixir import session
import datetime
from shop2020.thriftpy.utils.ttypes import Mail

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

def forgot_password(email):
    try:
        user = User.get_by(email=email)
        if user:
            mail = Mail()
            mail.to = []
            mail.to.append(email)
            mail.sender = ""
            mail.password = ""
            mail.data = "Your new password is " + user.password
            helper_client = HelperClient()
            helper_client.__start__()
            client = helper_client.get_client()
            client.sendMail(mail);
            return True
        else:
            return False
    except:
        return False
    
        
    

#=============================================================================
# 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))