示例#1
0
 def __init__(self, dbengine, redis_connection_pool):
     """
     Constructor
     :param dbengine: engine with database
     :param redis_connection_pool: redis connection pool
     """
     self._log = logging.getLogger(self.__class__.__name__)
     self.dbEngine = dbengine
     self.redisConnectionPool = redis_connection_pool
     self.sessionCache = SessionCache(self.redisConnectionPool)
     self.messageCache = MessageCache(self.redisConnectionPool)
示例#2
0
 def __init__(self, dbengine, redis_connection_pool):
     """
     Constructor
     :param dbengine: engine with database
     :param redis_connection_pool: redis connection pool
     """
     self._log = logging.getLogger(self.__class__.__name__)
     self.dbEngine = dbengine
     self.redisConnectionPool = redis_connection_pool
     self.sessionCache = SessionCache(self.redisConnectionPool)
     self.messageCache = MessageCache(self.redisConnectionPool)
示例#3
0
class DatabaseHandler(object):
    """
    Class to handle with database
    """
    def __init__(self, dbengine, redis_connection_pool):
        """
        Constructor
        :param dbengine: engine with database
        :param redis_connection_pool: redis connection pool
        """
        self._log = logging.getLogger(self.__class__.__name__)
        self.dbEngine = dbengine
        self.redisConnectionPool = redis_connection_pool
        self.sessionCache = SessionCache(self.redisConnectionPool)
        self.messageCache = MessageCache(self.redisConnectionPool)

    def register_user(self, login, password):
        """
        Register user
        :param login: login
        :param password: passsword
        :return: user identifier
        """
        user = User(login, validator.password_to_hash(password))
        session = self._get_db_session()
        session.add(user)
        try:
            session.commit()
            return user.id
        except (sqlalchemy.exc.IntegrityError,
                sqlalchemy.exc.OperationalError) as err:
            raise error.Exists(
                errorMsg="User {} is already exists.".format(login))
        finally:
            session.close()

    def get_user(self, login, password):
        """
        Get user by login and password
        :param login: user login
        :param password: user password
        :return: User object
        """
        session = self._get_db_session()
        enc_password = validator.password_to_hash(password)
        try:
            user = session.query(User).filter(
                and_(User.login.like(login),
                     User.password.like(enc_password))).one()
            return user
        except sqlalchemy.orm.exc.NoResultFound:
            raise error.IncorrectNameError
        finally:
            session.close()

    def get_user_by_id(self, userid):
        """
        Get user by identifier
        :param userid: user identifier
        :return: user object
        """
        session = self._get_db_session()
        user = session.query(User).get(userid)
        session.close()
        return user

    def get_user_by_cookie(self, cookie):
        """
        Get user by cookie
        :param cookie: HTTP cookie
        :return: user object
        """
        try:
            userId = self.get_authorized_user_id(cookie)
            return self.get_user_by_id(userId)
        except sessioncache.Unauthorized as err:
            return None

    def set_session(self, userid):
        """
        Set HTTP session
        :param userid: user identifier
        :return: cookie
        """
        return self.sessionCache.set_session(userid)

    def close_session(self, cookie):
        """
        Log out
        :param cookie: http cookie
        :return:
        """
        self.sessionCache.close_session(cookie)

    def get_authorized_user_id(self, cookie):
        """
        Get authorized user identifier
        :param cookie: HTTP cookie
        :return: user identifier
        """
        return self.sessionCache.get_authorized_user_id(cookie)

    def store_msg(self, msg, userid, login):
        """
        Store message from user
        :param msg: message
        :param userid: user identifier
        :return: message object
        """
        session = self._get_db_session()
        forbiddenWordList = [
            item.word for item in session.query(ForbiddenWord).all()
        ]

        def replace(match):
            word = match.group()
            if word.lower() in forbiddenWordList:
                return '*' * len(word)
            else:
                return word

        msg = re.sub(r'\b\w*\b', replace, msg, flags=re.I | re.U)
        message = Message(msg, userid)
        session.add(message)
        session.commit()
        self.messageCache.add_message(message.id, msg, login,
                                      message.get_str_time())
        session.close()
        return message

    def remove_msg(self, messageid):
        """
        Remove message
        :param messageid: message identifier
        :return:
        """
        self.messageCache.delete_message(messageid)

    def get_message_list(self):
        """
        Get message list
        :return:
        """
        return self.messageCache.get_message_list()

    def get_user_top_list(self):
        """
        Get the most active users
        :return:
        """
        session = self._get_db_session()
        res = session.query(User.login).join(Message).group_by(
            User.id).order_by(
                sqlalchemy.desc(sqlalchemy.func.count(Message.id))).limit(5)
        session.close()
        return [item[0] for item in res]

    def _get_db_session(self):
        """
        Get database session
        :return: database session
        """
        Session = sessionmaker(bind=self.dbEngine)
        return Session()
示例#4
0
class DatabaseHandler(object):
    """
    Class to handle with database
    """

    def __init__(self, dbengine, redis_connection_pool):
        """
        Constructor
        :param dbengine: engine with database
        :param redis_connection_pool: redis connection pool
        """
        self._log = logging.getLogger(self.__class__.__name__)
        self.dbEngine = dbengine
        self.redisConnectionPool = redis_connection_pool
        self.sessionCache = SessionCache(self.redisConnectionPool)
        self.messageCache = MessageCache(self.redisConnectionPool)

    def register_user(self, login, password):
        """
        Register user
        :param login: login
        :param password: passsword
        :return: user identifier
        """
        user = User(login, validator.password_to_hash(password))
        session = self._get_db_session()
        session.add(user)
        try:
            session.commit()
            return user.id
        except (sqlalchemy.exc.IntegrityError, sqlalchemy.exc.OperationalError) as err:
            raise error.Exists(errorMsg="User {} is already exists.".format(login))
        finally:
            session.close()

    def get_user(self, login, password):
        """
        Get user by login and password
        :param login: user login
        :param password: user password
        :return: User object
        """
        session = self._get_db_session()
        enc_password = validator.password_to_hash(password)
        try:
            user = session.query(User).filter(and_(User.login.like(login),
                                                                   User.password.like(enc_password))).one()
            return user
        except sqlalchemy.orm.exc.NoResultFound:
            raise error.IncorrectNameError
        finally:
            session.close()

    def get_user_by_id(self, userid):
        """
        Get user by identifier
        :param userid: user identifier
        :return: user object
        """
        session = self._get_db_session()
        user = session.query(User).get(userid)
        session.close()
        return user

    def get_user_by_cookie(self, cookie):
        """
        Get user by cookie
        :param cookie: HTTP cookie
        :return: user object
        """
        try:
            userId = self.get_authorized_user_id(cookie)
            return self.get_user_by_id(userId)
        except sessioncache.Unauthorized as err:
            return None

    def set_session(self, userid):
        """
        Set HTTP session
        :param userid: user identifier
        :return: cookie
        """
        return self.sessionCache.set_session(userid)

    def close_session(self, cookie):
        """
        Log out
        :param cookie: http cookie
        :return:
        """
        self.sessionCache.close_session(cookie)

    def get_authorized_user_id(self, cookie):
        """
        Get authorized user identifier
        :param cookie: HTTP cookie
        :return: user identifier
        """
        return self.sessionCache.get_authorized_user_id(cookie)

    def store_msg(self, msg, userid, login):
        """
        Store message from user
        :param msg: message
        :param userid: user identifier
        :return: message object
        """
        session = self._get_db_session()
        forbiddenWordList = [item.word for item in session.query(ForbiddenWord).all()]

        def replace(match):
            word = match.group()
            if word.lower() in forbiddenWordList:
                return '*' * len(word)
            else:
                return word

        msg = re.sub(r'\b\w*\b', replace, msg, flags=re.I|re.U)
        message = Message(msg, userid)
        session.add(message)
        session.commit()
        self.messageCache.add_message(message.id, msg, login, message.get_str_time())
        session.close()
        return message

    def remove_msg(self, messageid):
        """
        Remove message
        :param messageid: message identifier
        :return:
        """
        self.messageCache.delete_message(messageid)

    def get_message_list(self):
        """
        Get message list
        :return:
        """
        return self.messageCache.get_message_list()

    def get_user_top_list(self):
        """
        Get the most active users
        :return:
        """
        session = self._get_db_session()
        res = session.query(User.login).join(Message).group_by(User.id).order_by(sqlalchemy.desc(sqlalchemy.func.count(Message.id))).limit(5)
        session.close()
        return [item[0] for item in res]

    def _get_db_session(self):
        """
        Get database session
        :return: database session
        """
        Session = sessionmaker(bind=self.dbEngine)
        return Session()