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
Exemple #2
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
    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
Exemple #4
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
Exemple #5
0
    def add_contest(uid, title, desc, stime, etime, money, logo):
        """
        創建一個比賽:
        :param uid:
        :param title:  比賽標題
        :param desc:  描述
        :param stime:  開始時間:不能是當天或以前
        :param etime: 結束時間,不能小於開始時間
        :param money:  初始資金
        :param logo:  logo 圖片地址
        :return:
        """

        contest = Contest()
        contest.u_id = uid
        contest.c_title = title
        contest.c_explain = desc
        contest.c_start_date = stime
        contest.c_end_date = etime
        contest.c_logo_url = logo
        contest.c_default_capital = money * 10000

        try:
            dbsession.add(contest)
            dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e

        return contest
Exemple #6
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()
Exemple #7
0
    def add_user(user=None, **kwargs):

        if user is None:
            user = {}
            user.update(kwargs)

        dbsession.add(user)
        dbsession.commit()
    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, ""
    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
    def get_stock_list(uid, cid, page=1, lmt=100):
        """
        列出用戶的持股信息,默認100條
        return: a list,
        :param uid:
        :param cid:
        :param page:
        :param lmt:
        """
        if not all((uid, cid)):
            logging.error("uid err", uid)
            raise Exception("parameter err")

        sql = "select * from tb_user_contest_positions where user_id = %s and stock_count > 0 and contest_id=%d" \
              " order by updated_at desc" \
              " limit %d, %d" % (uid, cid, (page-1)*lmt, lmt)
        result = []
        try:
            query_res = dbsession.execute(sql)
            dbsession.commit()
            query_res = query_res.fetchall()
        except Exception as e:
            dbsession.rollback()
            logging.error(e)
            raise

        # table column
        headers = ("id", "created_at", "updated_at", "deleted_at", "uid",
                   "name", "code", "count", "price", "freeze", "cid")
        for item in query_res:
            dct = dict(zip(headers, item))

            tm = dct['created_at']
            dct['created_at'] = tm.strftime(
                "%Y-%m-%d %H:%M:%S") if tm else None
            tm = dct['updated_at']
            dct['updated_at'] = tm.strftime(
                "%Y-%m-%d %H:%M:%S") if tm else None
            tm = dct['deleted_at']
            dct['deleted_at'] = tm.strftime(
                "%Y-%m-%d %H:%M:%S") if tm else None

            dct['price'] = float(dct['price'])
            dct['freeze'] = float(dct['freeze'])

            result.append(dct)

        return result
Exemple #11
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
    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, "你已經點過贊了"
Exemple #13
0
    def addReplyReply(uid, aid, rid, content):
        """
        回復別人的回復消息
        :param uid:
        :param aid:
        :param rid:
        :return:
        """

        reply = Reply()
        reply.r_reply_id = rid
        reply.u_id = uid
        reply.a_id = aid
        reply.r_content = content
        try:
            dbsession.add(reply)
            dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e
Exemple #14
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
Exemple #15
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
Exemple #16
0
    def addReply(uid, aid, content):
        """
        添加一個回復
        :param uid:
        :param aid:
        :return:
        """

        reply = Reply()
        reply.u_id = uid
        reply.a_id = aid
        reply.r_content = content

        try:
            dbsession.add(reply)
            dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e

        return reply.id
Exemple #17
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))
    def addArticle(uid, title, content):
        """
        添加一個話題
        :param uid:
        :param title:
        :param content:
        :return:
        """

        article = Article()
        article.u_id = uid
        article.a_title = title
        article.a_content = content

        try:
            dbsession.add(article)
            dbsession.commit()
        except Exception as e:
            dbsession.rollback()
            raise e

        return article.id
    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()
Exemple #20
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()
Exemple #21
0
    def add_user(**kwargs):
        user = User()
        user.u_name = kwargs.get('u_name')
        user.u_passwd = kwargs.get('u_passwd')
        user.u_email = kwargs.get('u_email')
        user.u_sex = kwargs.get('u_sex')
        user.u_mobilephone = kwargs.get('u_mobilephone')

        dbsession.add(user)
        dbsession.commit()

        logging.debug('SVC_userinfo 注册用户:%s', user)
        # 处理用户资产信息
        user_money = user.u_money
        user_mv = 0
        uid = user.id

        sql = 'insert into tb_user_assets ' \
              'set user_id=%s, user_money=%.2f, user_mv=%.2f' \
              % (uid, user_money, user_mv)
        dbsession.execute(sql)
        dbsession.commit()

        return user
    def list_orders(uid, cid, type=None, page=1, count=40, finished=None):
        """
        获取订单列表.
        :param uid: 用户id
        :param cid: 比赛id (0为非比赛委托单)
        :param page:
        :param count:
        :param type:  交易类型
                TRADE_TYPE_NONE = iota
                TRADE_TYPE_BUY  # 买入
                TRADE_TYPE_SALE  # 卖出
        :return:
        """
        uid = (int)(uid)
        cid = (int)(cid)
        page = (int)(page)
        count = (int)(count)

        sql = 'select * from tb_orders where '
        where_cond = [
            'user_id=%d' % uid,
            'contest_id=%d' % cid,
        ]
        order_by = ' order by updated_at desc '
        limit_sql = ' limit %d, %d ' % ((page - 1) * count, count)

        if type is not None:
            # 交易类型过滤
            where_cond.append('trade_type=%d' % type)

        if finished == 'finished':
            where_cond.append('order_status!=0')

        elif finished == 'unfinished':
            where_cond.append('order_status=0')

        # 执行sql
        sql = sql + ' and '.join(where_cond) + \
                order_by + limit_sql
        logging.debug('sql: %s' % sql)

        raws = dbsession.execute(sql).fetchall()
        dbsession.commit()
        if not raws:
            dbsession.rollback()
            return []

        # table colume
        colums = ('id', 'submit_time', 'updated_at', 'deleted_at', 'uid',
                  'name', 'code', 'price', 'amount', 'transfer_fee',
                  'brokerage', 'volume', 'trade_type', 'type', 'status', 'cid')
        result = []
        for item in raws:
            dct = dict(zip(colums, item))

            tm = dct['submit_time']
            dct['submit_time'] = tm.strftime(
                "%Y-%m-%d %H:%M:%S") if tm else None
            tm = dct['updated_at']
            dct['updated_at'] = tm.strftime(
                "%Y-%m-%d %H:%M:%S") if tm else None
            tm = dct['deleted_at']
            dct['deleted_at'] = tm.strftime(
                "%Y-%m-%d %H:%M:%S") if tm else None

            dct['price'] = float(dct['price'])
            dct['brokerage'] = float(dct['brokerage'])
            dct['transfer_fee'] = float(dct['transfer_fee'])
            dct['volume'] = float(dct['volume'])

            result.append(dct)

        return result
    def revoke_order(uid, order_id, contest_id=0):
        """
        撤銷一個訂單:
        :param uid: 用戶id
        :param order_id:   訂單id號
        :param contest_id:   比赛id, 0表示非比赛(代码耦合了)
        :return:
        """

        if not isinstance(order_id, int):
            logging.error("id not a int object %s", id)
            raise Exception("參數錯誤")

        # recode = None
        # try:
        #     recode = dbsession.query(TradeRecode).filter_by(id=id).filter_by(u_id=uid).one()
        # except NoResultFound as e:
        #     logging.warning(e)
        #     dbsession.rollback()
        #     raise e
        #
        # except Exception as e:
        #     logging.error(e)
        #     dbsession.rollback()
        #     raise e
        #
        # ## 判斷用記錄的狀態是否對
        # if recode.t_status != 0:
        #     logging.error("記錄的狀態不對, 不能撤銷該訂單: %s" %(recode.to_json()) )
        #     raise Exception("記錄的狀態不對, 不能撤銷該訂單")
        #
        # user = None
        # ### 取出用戶的數據,檢測是否餘額是否足夠
        # try:
        #     user = dbsession.query(User).filter_by(id=uid).one()
        # except NoResultFound as e:   #  包括了NoResultFound異常, 用戶的數據都找不到了,還處理個毛綫
        #     logging.error(e)
        #     raise e
        # except Exception as e:
        #     dbsession.rollback()
        #     logging.error(e)
        #     raise e
        #
        # if recode.t_type == 1:    # 買入
        #     user.u_money = (float)(user.u_money) + (float)(recode.t_volume) + (float)(recode.t_charge)   # 用戶的錢返還回去
        # elif recode.t_type == 2:  # 賣出  退還凍結的手續費
        #     user.u_money = (float)(user.u_money) + (float)(recode.t_charge)
        #
        # recode.t_status = 2                             # 記錄狀態設置為撤單
        # try:
        #     dbsession.merge(recode)
        #     dbsession.merge(user)
        #     dbsession.commit()
        # except Exception as e:
        #     dbsession.rollback()
        #     logging.error(e)
        #     raise e

        # 检测订单数据
        sql = 'select * from tb_orders where user_id=%d and id=%d ' % (
            uid, order_id)
        try:
            result = dbsession.execute(sql).fetchall()
            dbsession.commit()
            if not result:
                raise Exception("订单数据不存在. order_id: %d, user_id: %d" %
                                (order_id, uid))
        except Exception as e:
            dbsession.rollback()
            logging.error("数据库错误:%s", e)
            raise

        # 拼接数据
        colums = ("id", "created_at", "updated_at", "deleted_at", "uid",
                  "name", "code", "price", "count", "transfer_fee",
                  "brokerage", "freeze_amount", "trade_type", "type", "status",
                  "contest_id")
        record = dict(zip(colums, result[0]))
        # 检查订单状态
        # enum:
        #   ORDER_STATUS_TBD = iota
        # 	ORDER_STATUS_FINISH
        # 	ORDER_STATUS_REVOKE
        if record['status'] != 0:
            raise Exception("撤销订单失败,订单状态不对.")

        # 构造请求,发送到交易服务器
        now = str(time.time())

        sign = ''.join(sorted(str(uid) + now + config.RPC_REQUEST_SALT))
        md5 = hashlib.md5()
        md5.update(sign.encode())
        sign = md5.hexdigest()
        request_body = {
            "method":
            "orderService.RevokeOrder",
            "params": [{
                "user_id": uid,
                "sign": sign,
                "order_id": order_id,
                "req_time": now,
                "contest_id": contest_id,
            }]
        }

        try:
            resp = requests.post(config.RPC_SERVICE_URL,
                                 json=request_body,
                                 headers={'Content-Type': 'application/json'})
        except Exception as e:
            raise

        if not resp.ok:
            raise Exception("请求失败, 请稍后再试!")

        content = resp.content.decode()
        content = json.loads(content)['result']
        if content['ret_code'] != 0:
            raise Exception(content['err_msg'])

        # 添加用户动态.
        data = {
            'uid': record['uid'],
            'order_id': record['id'],
            'code': record['code'],
            'name': record['name'],
            'contest_id': record['contest_id'],
            'type': record['type'],
        }
        try:
            SVC_Dongtai.add_dongtai_revoke(uid, json.dumps(data))
        except Exception as e:
            logging.error(e)
            raise e