示例#1
0
    def delReply(uid, rid):
        """
        刪除一個評論
        :param uid:
        :param rid:
        :return:
        """

        recode = None
        try:
            recode = dbsession.query(Reply).filter(
                and_(Reply.id == rid, Reply.u_id == uid)).one()
        except NoResultFound as e:
            raise e
        except Exception as e:
            dbsession.rollback()
            raise e

        if recode:
            try:
                recode.r_status = 1
                dbsession.merge(recode)
                dbsession.commit()

                ### 這個回復是回復的話題,  所有在此回復上的回復消息 都應該刪除
                if recode.r_reply_id == 0:
                    dbsession.query(Reply).filter(
                        Reply.r_reply_id == recode.id).update(
                            {Reply.r_status: 1})
                    dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                raise e
示例#2
0
    def getReplyByArticleId(aid, page=0, count=40):
        """
        獲取話題的評論
        :param aid:
        :return:
        """

        res = None
        try:
            query = dbsession.query(Reply, User.u_name, User.u_headurl).filter(
                and_(Reply.a_id == aid, User.id == Reply.u_id))
            query = query.limit(count).offset(count * page)
            res = query.all()
        except Exception as e:
            dbsession.rollback()
            raise e

        if not res:
            return []

        lst = []
        for it in res:
            recode = it[0].to_json()
            recode['uname'] = it[1]
            recode['uheadurl'] = it[2]

            #  type: 2
            #  類型為2, 描述為: 回復了帖子
            recode['type'] = 2
            recode['type_desc'] = u"評論了帖子"

            # 計算距當前時間多久
            recode['time'] = timeutil.Datetime2HowLong(str(it[0].r_time))

            # type: 3
            # 回復了用戶的評論
            if it[0].r_reply_id != 0:
                aritcleid = it[0].r_reply_id
                try:
                    query = dbsession.query(Reply, User.u_name).filter(
                        and_(Reply.id == aritcleid, User.id == Reply.u_id))
                    result = query.one()
                except Exception as e:
                    dbsession.rollback()
                    raise e

                recode['type'] = 3
                recode['type_desc'] = u"回復了"
                recode['reply_uname'] = result[1]

            lst.append(recode)

        return lst
示例#3
0
    def get_contest_detail_rank_users(id, page=0, count=20):
        """
        獲取單個比賽的排名數據:
        :param id:  比賽id
        :return:
        """

        res = None
        try:
            res = dbsession.query(
                ContestDetail.c_win_rate, ContestDetail.u_id,
                User.u_name).filter(
                    and_(ContestDetail.c_id == id,
                         ContestDetail.c_status != 1)).join(
                             User, User.id == ContestDetail.u_id).order_by(
                                 ContestDetail.c_win_rate.desc()).limit(
                                     count).offset(page * count).all()
        except Exception as e:
            dbsession.rollback()
            raise e

        lst = []
        if res:
            idx = 1
            for it in res:
                t = {}

                t['rate'] = it[0]  # 盈利率
                t['id'] = it[1]  # uid
                t['user'] = it[2]  # 用戶名
                t['rank'] = idx  # 排名
                lst.append(t)

                idx += 1
        return lst
示例#4
0
    def add_stock(uid, stock_code, stock_name):
        if uid == None or uid == '':
            logging.info("uid is None..")
            return

        if len(stock_code) == 0 or len(stock_name) == 0:
            logging.info("stock_code, stock_name 不合法..")
            return

        try:
            stock = dbsession.query(UserFavoriteStocks).filter_by(
                u_id=uid).filter_by(s_stock_code=stock_code).one()
        except NoResultFound as e:
            stock = None

        if stock is not None:
            return "exist"

        stock = UserFavoriteStocks()
        stock.u_id = uid
        stock.s_stock_code = stock_code
        stock.s_stock_name = stock_name

        dbsession.add(stock)
        dbsession.commit()
示例#5
0
    def quite_contest(uid, id):
        """
        用戶退出比賽
        :param uid:
        :param id:
        :return:
        """

        contest_detail = None
        try:
            contest_detail = dbsession.query(ContestDetail).filter(
                and_(ContestDetail.c_id == id,
                     ContestDetail.u_id == uid)).one()
        except NoResultFound as e:
            return

        except Exception as e:
            dbsession.rollback()
            raise e

        contest_detail.c_status = 1

        try:
            dbsession.merge(contest_detail)
            dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e
示例#6
0
    def update_user(user=None, **kwargs):
        """

        :param kwargs:
        :return:
        """

        user_obj = {}

        if isinstance(user, User):
            user_obj = user
            logging.debug("user is User instance.")
            print("user is User instance.")

        else:
            if 'id' in kwargs:
                user_obj = dbsession.query(User).filter_by(
                    id=kwargs['id']).one()

        for k, v in kwargs.items():
            if k == 'id':
                continue

            if v is not None:
                setattr(user_obj, k, v)
        try:
            logging.debug(user_obj)
            print(user_obj)

            dbsession.merge(user_obj)
            dbsession.commit()
        except Exception as e:
            logging.error(e)
            dbsession.rollback()
            raise e
示例#7
0
    def get_contest_user_info(uid, cid):
        """
        獲取用戶在某一場次比賽中的表現:
        :param uid:
        :param cid:
        :return:  json 串
        """

        info = None
        try:
            info = dbsession.query(
                ContestDetail, User.u_name, User.u_headurl).filter(
                    and_(ContestDetail.u_id == uid,
                         ContestDetail.c_id == cid)).join(
                             User, User.id == ContestDetail.u_id).one()
        except NoResultFound as e:
            return []
        except Exception as e:
            dbsession.rollback()
            raise e

        logging.debug(info)
        if info:
            tmp = info[0].to_json()
            tmp['uname'] = info[1]
            tmp['uheadurl'] = info[2]
            return tmp
        return []
示例#8
0
    def getArticleByUid(uid, page=0, count=40):
        """
        獲取用戶發表的
        :param uid:
        :return:
        """

        res = None
        try:
            res = dbsession.query(Article, User.u_name, User.u_headurl).join(User, Article.u_id == User.id)\
                .filter(Article.u_id==uid).order_by(desc(Article.a_pub_time)).limit(count).offset(page*count).all()
        except Exception as e:
            dbsession.rollback()
            raise e

        if not res:
            return []

        lst = []
        for it in res:
            tmp = it[0].to_json()
            tmp['uname'] = it[1]
            tmp['uheadurl'] = it[2]

            # 計算距當前時間多久
            tmp['time'] = timeutil.Datetime2HowLong(str(it[0].a_pub_time))

            lst.append(tmp)

        return lst
示例#9
0
    def get_contest_list(page=0, count=20):
        """
        獲取比賽列表:默認獲取的是未結束(關閉)的
        :param page:
        :param count:
        :return:
        """

        ret = None
        try:
            # ret = dbsession.query(Contest).all()
            # ret = dbsession.query(Contest).limit(count).offset(page * count).all()
            ret = dbsession.query(
                Contest, User.u_name).filter(Contest.u_id == User.id).order_by(
                    Contest.c_create_time).limit(count).offset(page *
                                                               count).all()
        except Exception as e:
            dbsession.rollback()
            raise e

        lst = []
        if ret:
            for it in ret:
                tmp = it[0].to_json()
                tmp['createuser'] = it[1]
                lst.append(tmp)

        return lst
示例#10
0
    def delArticle(uid, id):
        """
        刪除一個話題, 邏輯刪除
        :param uid:
        :param id:
        :return: None, throw exception if error
        """

        article = None
        try:
            article = dbsession.query(Article).filter(
                and_(Article.id == id, Article.u_id == uid)).one()
        except NoResultFound as e:
            return "話題找不到了。。。"
        except Exception as e:
            dbsession.rollback()
            raise e

        if not article:
            return "話題找不到了。。。"

        article.a_status = 2  # 關閉(邏輯刪除)
        try:
            dbsession.merge(article)
            dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e
示例#11
0
    def getArticleById(id):
        """
        獲取文章數據
        :param id:
        :return:
        """

        article = None
        try:
            query = dbsession.query(Article, User.u_name,
                                    User.u_headurl).filter(
                                        and_(Article.id == id,
                                             Article.u_id == User.id))
            article = query.one()
        except NoResultFound as e:
            raise e
        except Exception as e:
            dbsession.rollback()
            raise e

        if article:
            retdata = article[0].to_json()
            retdata['uname'] = article[1]
            retdata['uheadurl'] = article[2]

            # 計算距當前時間多久
            retdata['time'] = timeutil.Datetime2HowLong(
                str(article[0].a_pub_time))

            return retdata

        return None
示例#12
0
    def getNewestReply(page=0, count=40):
        """
        獲取最新的回復消息
        :param page:
        :param count:
        :return: 返回dict, 包括回復相關的所有數據和話題標題,話題作者
        """

        res = None
        try:
            res = dbsession.query(Reply, Article, User.u_name, User.u_headurl).join(Article, Article.id==Reply.a_id)\
                .filter(User.id == Reply.u_id) \
                .order_by(desc(Reply.r_time)).limit(count).offset(page*count) \
                .all()
        except Exception as e:
            dbsession.rollback()
            raise e

        if not res:
            return []

        lst = []
        for it in res:
            tmp = it[0].to_json()
            tmp.update(it[1].to_json())
            tmp['uname'] = it[2]
            tmp['uheadurl'] = it[3]

            # 計算距當前時間多久
            tmp['time'] = timeutil.Datetime2HowLong(str(it[0].r_time))

            lst.append(tmp)

        return lst
示例#13
0
    def upcountArticle(aid, uid):
        """
        給文章點贊, 如果電讚了得  就取消點讚
        :param id:
        :param uid:
        :return:
        """

        recode = None
        try:
            recode = dbsession.query(ArticleUpcounts).filter(
                and_(ArticleUpcounts.a_id == aid,
                     ArticleUpcounts.u_id == uid)).one()
        except NoResultFound as e:
            pass
        except Exception as e:
            dbsession.rollback()
            raise e

        if not recode:
            recode = ArticleUpcounts()
            recode.u_id = uid
            recode.a_id = aid
            try:
                dbsession.add(recode)
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                raise e

            try:
                dbsession.query(Article).filter(Article.id == aid).update(
                    {Article.a_upcounts: Article.a_upcounts + 1})
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                raise e

        else:
            try:
                dbsession.delete(recode)
                dbsession.commit()
                dbsession.query(Article).filter(Article.id == aid).update(
                    {Article.a_upcounts: Article.a_upcounts - 1})
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
示例#14
0
    def upcountReply(uid, rid):
        """
                給評論點贊, 如果電讚了得  就取消點讚
                :param id:
                :param uid:
                :return:
                """

        recode = None
        try:
            recode = dbsession.query(ReplyUpcounts).filter(
                and_(ReplyUpcounts.r_id == rid,
                     ReplyUpcounts.u_id == uid)).one()
        except NoResultFound as e:
            pass
        except Exception as e:
            dbsession.rollback()
            raise e

        if not recode:
            recode = ReplyUpcounts()
            recode.u_id = uid
            recode.r_id = rid
            try:
                dbsession.add(recode)
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                raise e

            try:
                dbsession.query(Reply).filter(Reply.id == rid).update(
                    {Reply.r_upcounts: Reply.r_upcounts + 1})
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                raise e

        else:
            try:
                dbsession.delete(recode)
                dbsession.commit()
                dbsession.query(Reply).filter(Reply.id == rid).update(
                    {Reply.r_upcounts: Reply.r_upcounts - 1})
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
    def sale_stock(uid, stock_code, stock_name, stock_count):
        """
        賣出
        :param uid:
        :param stock_code:
        :param stock_name:
        :param stock_count:
        :return: if success return True,"" ortherwise return False, "errmsg"  or raise the exceptions
        """
        if not all([uid, stock_code, stock_name, stock_count]):
            logging.error("參數錯誤:", uid, stock_code, stock_name, stock_count)
            raise Exception("參數錯誤!")

        if not all( [isinstance(uid, str),  isinstance(stock_code, str),
                    isinstance(stock_name, str), isinstance(stock_count, int)]):
            logging.error("參數錯誤:", uid, stock_code, stock_name, stock_count)
            raise Exception("參數錯誤!")

        # 查詢是否已經購買此股
        stock = None
        try:
            stock = dbsession.query(UserStock).filter_by(u_id=uid).filter_by(s_stock_code=stock_code).one()
        except NoResultFound as e:
            dbsession.rollback()
            logging.error(e)

        if stock == None:
            logging.info("用戶沒有持有持有該股票:", uid, stock_code)
            return False, "沒有持有持有該股票"

        ### 剛好清倉
        if stock.s_stock_count == stock_count:
            try:
                dbsession.delete(stock)
                dbsession.commit()
            except Exception as e:
                logging.error(e)
                dbsession.rollback()
                raise e
        ## 數據有錯誤
        elif stock.s_stock_count < stock_count:
            logging.info("用戶未持有這麽多股份:", uid, stock_code, stock_count)
            return False, "未持有這麽多股份"

        #正常買出
        else:
            stock.s_stock_count -= stock_count
            try:
                dbsession.merge(stock)
                dbsession.commit()
            except Exception as e:
                logging.error(e)
                dbsession.rollback()
                raise e

        return True, ""
示例#16
0
    def upcountArticleOnly(aid, uid):
        """
        給文章點贊:只點贊,不存在重複點贊
        :param aid:
        :param uid:
        :return: success:return true,""
                    fail: return  false,"失敗原因"
        :exception: exception returned if sql err
        """
        recode = None
        try:
            recode = dbsession.query(ArticleUpcounts).filter(
                and_(ArticleUpcounts.a_id == aid,
                     ArticleUpcounts.u_id == uid)).one()
        except NoResultFound as e:
            pass
        except Exception as e:
            dbsession.rollback()
            raise e

        if not recode:
            recode = ArticleUpcounts()
            recode.u_id = uid
            recode.a_id = aid
            try:
                dbsession.add(recode)
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                raise e

            try:
                dbsession.query(Article).filter(Article.id == aid).update(
                    {Article.a_upcounts: Article.a_upcounts + 1})
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                raise e

            return True, ""

        else:
            return False, "你已經點過贊了"
示例#17
0
 def get_user_bymobile(mobile):
     if not isinstance(mobile, str):
         raise TypeError("name 类型错误", mobile)
     try:
         user = dbsession.query(User).filter_by(u_mobilephone=mobile).one()
     except Exception as e:
         logging.error(e)
         dbsession.rollback()
         raise e
     return user
示例#18
0
    def get_user_byemail(email):
        if not isinstance(email, str):
            raise TypeError("name 类型错误", email)

        try:
            user = dbsession.query(User).filter_by(u_email=email).one()
        except Exception as e:
            logging.error(e)
            dbsession.rollback()
            raise e
        return user
示例#19
0
    def join_contest(uid, id):
        """
        用戶參加比賽:根據id獲取比賽的相關信息,例如初始資金,將數據填入tb_contest_detail中
        :param uid:
        :param id:
        :return:
        """
        test = None
        user_contest_detail = None
        try:
            test = dbsession.query(Contest).filter_by(id=id).one()
        except Exception as e:
            dbsession.rollback()
            raise e

        try:
            user_contest_detail = dbsession.query(ContestDetail).filter(
                and_(ContestDetail.u_id == uid,
                     ContestDetail.c_id == test.id)).one()
        except NoResultFound as e:
            pass
        except Exception as e:
            dbsession.rollback()
            raise e

        # 已經存在數據,説明已經加入比賽
        if user_contest_detail:
            raise Exception("已經加入該比賽!")

        user_contest_detail = ContestDetail()
        user_contest_detail.c_join_time = datetime.now()
        user_contest_detail.c_money = test.c_default_capital  # 初始資金
        user_contest_detail.c_id = test.id
        user_contest_detail.u_id = uid

        try:
            dbsession.add(user_contest_detail)
            dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e
    def add_stock(uid, stock_code, stock_name, stock_count, stock_price):
        """
        no return val
        raise 參數錯誤異常
        :param uid:
        :param stock_code:
        :param stock_name:
        :param stock_count:
        :param stock_price:  成本價
        :return:
        """

        if not all([uid, stock_code, stock_name, stock_count, stock_price]):
            logging.error("參數錯誤:", uid, stock_code, stock_name, stock_count, stock_price)
            raise Exception("參數錯誤!")

        ### 查詢是否已經買過該股票,是:添加持股數,否添加紀錄
        stock = None
        try:
            stock = dbsession.query(UserStock).filter_by(u_id=uid).filter_by(s_stock_code=stock_code).one()
        except NoResultFound as e:
            dbsession.rollback()
            logging.error(e)

        # 沒記錄,沒買過
        if stock is None:
            stock = UserStock()
            stock.u_id = uid
            stock.s_stock_price = stock_price
            stock.s_stock_code = stock_code
            stock.s_stock_name = stock_name
            stock.s_stock_count = stock_count

            try:
                dbsession.add(stock)
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                logging.error(e)
                raise e

        else:
            price = ((float)(stock.s_stock_price) * stock.s_stock_count + stock_price*stock_count) / (stock.s_stock_count+stock_count)
            stock.s_stock_count += stock_count
            stock.s_stock_price = price

            try:
                dbsession.merge(stock)
                dbsession.commit()
            except Exception as e:
                dbsession.rollback()
                logging.error(e)
                raise e
示例#21
0
    def checkUpcount(uid, aid):
        """
        檢查是否是點過讚了
        :param uid:
        :param aid:
        :return:  True  or False
        """

        recode = None
        try:
            dbsession.query(ArticleUpcounts).filter(
                and_(ArticleUpcounts.a_id == aid,
                     ArticleUpcounts.u_id == uid)).one()
        except NoResultFound as e:
            return False
        # except Exception as e:
        #     raise e

        if recode:
            return True
        return False  # 沒有點過
示例#22
0
    def get_user_byid(id):
        """

        :param id:  用户id
        :return: 用户对象
        """
        user = None
        try:
            user = dbsession.query(User).get(id)
        except Exception as e:
            logging.error(e)
            dbsession.rollback()
            raise e
        return user
示例#23
0
    def get_stocks(uid, lmt=100):
        if not isinstance(uid, str) or not isinstance(lmt, int):
            logging.error("參數類型錯誤:", uid, lmt)
            raise TypeError("參數類型錯誤")

        ret = dbsession.query(UserFavoriteStocks).filter_by(
            u_id=uid).limit(lmt).all()

        res = []
        for it in ret:
            res.append(it.to_json())

        # test
        sz = len(res)
        logging.debug("get_stocks: ret.length: %d" % sz)
        return res
示例#24
0
    def delete_user(arg):

        user = None
        try:
            if isinstance(arg, int):
                user = dbsession.query(User).filter(User.id == arg).one()

            if user is not None:
                dbsession.delete(user)
                dbsession.commit()
            else:
                logging.error("delete_user:user obj is not a User instance.")
        except Exception as e:
            logging.error(e)
            dbsession.rollback()
            raise e
示例#25
0
    def del_stock(uid, stock_code):
        if uid is None or uid == '':
            logging.error("uid 不合法:", uid)
            raise Exception("Parameter error.")

        if stock_code is None or stock_code == '':
            logging.error("stock_code 不合法:", stock_code)
            raise Exception("Parameter error.")

        try:
            stock = dbsession.query(UserFavoriteStocks).filter_by(
                u_id=uid).filter_by(s_stock_code=stock_code).one()
        # 找不到數據會抛出NoResultFound異常,補貨,不做處理,正常執行下面流程
        except NoResultFound as e:
            stock = None

        if (stock is not None):
            dbsession.delete(stock)
            dbsession.commit()
        else:
            logging.error("stock:%s不存在" % (stock_code))
示例#26
0
    def close_contest(id):
        """
        關閉比賽, 結束比薩不在這裏處理,在每天的收盤后會有定時任務處理!
        :param id:
        :return:
        """

        test = None
        try:
            test = dbsession.query(Contest).filter(
                and_(Contest.id == id, Contest.c_status != 3,
                     Contest.c_status != 2)).one()

            if test:
                test.c_status = 3  # 關閉

                dbsession.merge(test)
                dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e
示例#27
0
    def getArticleNewestHot(latest_day=7, page=0, count=20):
        """
        獲取熱門的文章:依據latest day 進行排序,查看數量最多的
        :param latest_day 時間區間,7表示最近一周的熱門話題
        :return:
        """

        res = None
        try:
            dt = datetime.today() - dttm.timedelta(latest_day)
            query = dbsession.query(
                Article, User.u_name,
                User.u_headurl).filter(User.id == Article.u_id).filter(
                    Article.a_pub_time > dt).order_by(
                        desc(Article.a_interviews)).order_by(
                            desc(Article.a_pub_time)).limit(count).offset(
                                page * count)
            res = query.all()
        except Exception as e:
            raise e

        if not res:
            return []

        lst = []
        for it in res:
            recode = it[0].to_json()  # Article recode
            recode['uname'] = it[1]  # user name
            recode['uheadurl'] = it[2]

            # 計算距當前時間多久
            recode['time'] = timeutil.Datetime2HowLong(str(it[0].a_pub_time))

            recode['type'] = 1
            recode['type_desc'] = u"發表了帖子"

            lst.append(recode)

        return lst
示例#28
0
    def getNewestArticles(page=0, count=20):
        """
        按最新排序獲取,分頁
        :param page:
        :param count:
        :return:
        """

        res = None
        try:
            query = dbsession.query(
                Article, User.u_name,
                User.u_headurl).filter(User.id == Article.u_id).order_by(
                    desc(Article.a_pub_time)).limit(count).offset(page * count)
            res = query.all()
        except Exception as e:
            dbsession.rollback()
            raise e

        if not res:
            return []

        lst = []
        for it in res:
            recode = it[0].to_json()
            recode['uname'] = it[1]
            recode['uheadurl'] = it[2]

            # 計算距當前時間多久
            recode['time'] = timeutil.Datetime2HowLong(str(it[0].a_pub_time))

            # 類型: 默認這裏讀出來的都是 文章, 文章默認是使用1 type
            #  描述為:發表了帖子
            recode['type'] = 1
            recode['type_desc'] = u"發表了帖子"

            lst.append(recode)

        return lst
示例#29
0
    def get_user_contest_list(uid, all=False):
        """
        獲取用戶參加的比賽
        :param uid:
        :param all: 是否是已完成的  False:未結束的,  True 全部的
        :return:
        """

        res = None
        try:
            query = dbsession.query(Contest, ContestDetail, User.u_name)\
                .join(ContestDetail, Contest.id==ContestDetail.c_id)\
                .filter(ContestDetail.u_id==uid)\
                .join(User, User.id==Contest.u_id)
            # query = dbsession.query(ContestDetail, Contest, User.u_name).join(User, User.id==ContestDetail.u_id).filter(Contest.id==ContestDetail.c_id).filter(ContestDetail.u_id==uid)
            if not all:
                query = query.filter(
                    or_(Contest.c_status == 1, Contest.c_status == 0))
            res = query.order_by(Contest.c_create_time).all()

            # print(query)
        except Exception as e:
            dbsession.rollback()
            raise e

        if not res:
            return []

        lst = []
        for it in res:
            contest_dct = it[0].to_json()
            contest_detail_dct = it[1].to_json()
            dct = contest_dct
            dct.update(contest_detail_dct)
            dct['createuser'] = it[2]
            lst.append(dct)

        return lst
示例#30
0
    def check_user_in_contest(uid, id):
        """
        判斷用戶是否在比賽裏面
        :param uid:
        :param id:
        :return:   0 可加入, 1已加入, 2:已退出
        """

        contest_detail = None
        try:
            contest_detail = dbsession.query(ContestDetail).filter_by(
                c_id=id).filter_by(u_id=uid).one()
        except NoResultFound as e:
            return False
        except Exception as e:
            raise e

        if not contest_detail:
            return 0

        if contest_detail.c_status == 0:  # 已加入
            return 1
        elif contest_detail.c_status == 1:  # 已退出
            return 2