Rev 3032 | Rev 3206 | 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, IPMap,\Address, SocialHandle, UserState, InternalInfo, SocialService, Affiliate, Tracker, TrackLog,\MasterAffiliate, UserNote, UserWidgetItemfrom shop2020.thriftpy.model.v1.user.ttypes import UserContextException,\AuthenticationException, AccountStatus, Sexfrom elixir import sessionimport datetimefrom sqlalchemy import descdef initialize(dbname='user', db_hostname="localhost"):log_entry("initialize@DataAccessor", "Initializing data service")Dataservice.initialize(dbname, db_hostname)def create_anonymous_user(jsession_id, cart):user=User.get_by(jsession_id=jsession_id)if not user is None:return useruser = 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_id = cart.id#initialize userStateuser_state = UserState()user_state.is_email_verified = Falseuser_state.is_sms_verified = Falseuser_state.account_status = AccountStatus.ACTIVEuser_state.ip_list = []user_state.active_since = datetime.datetime.now()user_state.user = usersession.commit()cart.user_id = user.idsession.commit()return userdef get_user_by_id(user_id):return User.get_by(id=user_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, cart):if user_to_add.userId:raise UserContextException(109, "id is set, user cannot be created")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_id = cart.iduser.mobile_number = user_to_add.mobileNumberuser.source = user_to_add.sourceuser.source_start_time = to_py_date(user_to_add.sourceStartTime)#initialize userStateuser_state = UserState()user_state.is_email_verified = Falseuser_state.is_sms_verified = Falseuser_state.account_status = AccountStatus.ACTIVEuser_state.ip_list = []user_state.active_since = datetime.datetime.now()user_state.user = usersession.commit();#Now create the user phones. Mostly, this should only be a mobile numbercart.user_id = user.idsession.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.active_cart_id = user_to_update.activeCartIduser.mobile_number = user_to_update.mobileNumbersession.commit()return userdef delete_user(user_id):user = get_user_by_id(user_id)if not user:raise_user_exception(user_id)user.state.account_status = AccountStatus.DELETEDsession.commit()return Truedef get_user_state(user_id):userstate = UserState.get_by(user_id=user_id)return userstatedef get_internal_info(user_id):info = InternalInfo.get_by(user_id=user_id)return infodef 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_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 Truedef 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 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()def 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 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 = 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):return Affiliate.get_by(id = affiliate_id).tracklogsdef 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 get_social_service(service_id):service = SocialService.get_by(service_id)return servicedef 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 objectip_address = IPMap()ip_address.ip = ip_addressip_address.timestamp = to_py_date(time_stamp)ip_address.user_state = user.statesession.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_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 handlesocial_handle = SocialHandle()social_handle.service = servicesocial_handle.user = usersocial_handle.handle = handleelse:social_handle.handle = handlesession.commit()return Truedef forgot_password(email, password):try:user = User.get_by(email=email)if user:user.password = passwordsession.commit()return Trueelse:return Falseexcept:return False'''def forgot_password(email):try:user = User.get_by(email=email)if user:new_password = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(8))mail = Mail()mail.to = []mail.to.append(email)mail.sender = ""mail.password = ""mail.data = "Your new password is " + user.passwordhelper_client = HelperClient()helper_client.__start__()client = helper_client.get_client()client.sendMail(mail);return Trueelse:return Falseexcept:return False'''def 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).join(UserState)if start_date != -1:query = query.filter(UserState.active_since >= to_py_date(start_date))if end_date != -1:query = query.filter(UserState.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))'''My Notes methods'''def get_user_notes(user_id, entity_id):return UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).all()def put_user_note(user_id, entity_id, slide, note):user_notes = UserNote.query.filter_by(user_id = user_id).filter_by(entity_id = entity_id).filter_by(slide = slide).all()if user_notes is None or len(user_notes) == 0:user_note = UserNote()user_note.user_id = user_iduser_note.entity_id = entity_iduser_note.slide = slideuser_note.note = noteelse:user_note = user_notes.pop()user_note.note = notesession.commit()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 close_session():if session.is_active:print "session is active. closing it."session.close()