async def patch_user(request: web.Request, body) -> web.Response:
    user_id = id_validator(request.match_info['user_id'], 'user')
    user_table = get_model_by_name('user')
    user_exists = await request.app['pg'].fetchval(
        select([exists().where(user_table.c.user_id == user_id)]))

    if not user_exists:
        raise web.HTTPNotFound(body=json.dumps(
            {'error': f'User with id={user_id} not found'}),
                               content_type='application/json')

    if request.auth_user['user_id'] != user_id:
        raise web.HTTPForbidden(body=json.dumps(
            {'error': 'Access denied for requested resource'}),
                                content_type='application/json')

    if not body:
        return web.Response(status=200,
                            content_type='application/json',
                            body=json.dumps({}))

    user = await request.app['pg'].fetchrow(user_table.update().where(
        user_table.c.user_id == user_id).values(**body).returning(
            literal_column('*')))

    result = row_to_dict(user_table, user)

    return web.Response(status=200,
                        content_type='application/json',
                        body=json.dumps(result))
Exemple #2
0
    def get_user_secret(cls, user_id):
        '''user_idに紐づくuser情報(すべて)取得
        '''
        with session_scope() as session:
            row = session.query(cls).filter(cls.user_id == user_id).first()

            return row_to_dict(row)
Exemple #3
0
    def get_all_by_t_id(cls, thread_id):
        with session_scope() as session:
            rows = session.query(cls).filter(cls.thread_id == thread_id).all()

            result = [row_to_dict(row) for row in rows]

            return result
Exemple #4
0
    def get_all(cls):
        with session_scope() as session:
            rows = session.query(cls).all()

            result = [row_to_dict(row) for row in rows]

            return result
async def get_all_users(request: web.Request) -> web.Response:
    user_table = get_model_by_name('user')
    users = await request.app['pg'].fetch(user_table.select())
    result = [row_to_dict(user_table, user) for user in users]

    return web.Response(status=200,
                        content_type='application/json',
                        body=json.dumps(result))
Exemple #6
0
    def get(cls, flip_id):
        with session_scope() as session:
            rows = session.query(cls).filter(cls.flip_id == flip_id).first()

            if not rows:
                return None

            return row_to_dict(rows)
Exemple #7
0
    def get_by_login_token(cls, login_token):
        '''仮登録ユーザをlogin_tokenから取得
        '''
        with session_scope() as session:
            # prov_user = session.
            row = session.query(cls).filter(
                cls.login_token == login_token).first()

            if not row:
                return None

            return row_to_dict(row)
    def get_by_title(cls, title):
        with session_scope() as session:
            rows = session.query(
                cls
            ).join(
                Category, cls.category_id == Category.category_id
            ).filter(
                cls.title.like(title + '%')
            )

            result = [row_to_dict(row) for row in rows]

            return result
Exemple #9
0
    def get(cls, email):
        '''仮登録ユーザの最新のカラムを取得
        Args:
            email:  学番メール
        Returns:
            dict:
                ProvisionalUser:    仮登録ユーザ情報
        '''
        with session_scope() as session:
            # prov_user = session.
            rows = session.query(cls).filter(cls.email == email).order_by(
                cls.provisional_user_id.desc()).first()

            return row_to_dict(rows)
async def get_user(request: web.Request) -> web.Response:
    user_id = id_validator(request.match_info['user_id'], 'user')
    user_table = get_model_by_name('user')
    user_exists = await request.app['pg'].fetchval(
        select([exists().where(user_table.c.user_id == user_id)]))

    if not user_exists:
        raise web.HTTPNotFound(body=json.dumps(
            {'error': f'User with id={user_id} not found'}),
                               content_type='application/json')

    user = await request.app['pg'].fetchrow(
        user_table.select().where(user_table.c.user_id == user_id))

    return web.Response(status=200,
                        content_type='application/json',
                        body=json.dumps(row_to_dict(user_table, user)))
    def post(cls, title, category_id, params=None):
        # length_check
        if len(title) > 40:
            raise Exception('over title length')

        with session_scope() as session:
            if not params:
                data = cls(
                    title=title,
                    category_id=category_id,
                    create_at=datetime.now(JST).strftime(
                        '%Y-%m-%d %H:%M:%S.%f'
                    ),
                    update_at=datetime.now(JST).strftime(
                        '%Y-%m-%d %H:%M:%S.%f'
                    ),
                )
            else:
                if not params.get('create_at'):
                    params.update({
                        'create_at':
                        datetime.now(JST).strftime('%Y-%m-%d %H:%M:%S.%f')
                        }
                    )

                if not params.get('update_at'):
                    params.update({
                        'update_at':
                            datetime.now(JST).strftime('%Y-%m-%d %H:%M:%S.%f')
                        }
                    )

                data = cls(
                    title=title,
                    category_id=category_id,
                    **params
                )
            session.add(data)
            session.flush()

            # threadのspeed計算処理
            cls._update_speed(session=session)

            return row_to_dict(data)
    def get(cls, thread_id):
        '''threadとthread_idに紐づくcomment取得
        '''
        from app.models.comment import Comment

        with session_scope() as session:
            # thread取得
            t_rows = session.query(cls).filter(
                cls.thread_id == thread_id
            ).first()

            if not t_rows:
                return None

            # thread_idに紐づくcommentリスト取得
            comments = Comment.get_all_by_t_id(thread_id)

            result = {
                'thread': row_to_dict(t_rows),
                'comments': comments,
            }

            return result
    def all(cls):
        with session_scope() as session:
            rows = session.query(cls).all()

            return [row_to_dict(row) for row in rows]
    def get_all_by_c_id(cls, category_id, sort_id, paging):
        '''category_idに紐づくthreadリスト取得
        '''
        with session_scope() as session:
            query = session.query(
                cls
            ).join(
                Category, Thread.category_id == Category.category_id
            ).filter(
                Category.category_id == category_id
            )

            # sort
            if sort_id == current_config().get('ID_ASC'):
                # ID昇順
                pass
            elif sort_id == current_config().get('ID_DESC'):
                # ID降順
                query = query.order_by(cls.thread_id.desc())
            elif sort_id == current_config().get('SPEED_DESC'):
                # 人気高い順
                query = query.order_by(cls.speed.desc())
            elif sort_id == current_config().get('SPEED_ASC'):
                # 人気低い順
                query = query.order_by(cls.speed.asc())
            elif sort_id == current_config().get('NUM_COMMENT_DESC'):
                # コメント数多い順
                query = query.order_by(cls.thread_id.desc())
            elif sort_id == current_config().get('NUM_COMMENT_ASC'):
                # コメント数少ない順
                query = query.order_by(cls.thread_id.asc())

            # paging
            # ex)
            # 1. offset=0, limit=10
            # 2. offset=10, limit=20

            # pagingバリデーション
            if paging <= 0:
                paging = 1

            offset = (paging - 1) * 10
            limit = 10

            query_range = query.offset(offset).limit(limit)

            rows = query_range.all()

            # threadが取得できなかった場合
            # 1. threadが1つ以上取得できる場合,最後のpagingのthreadリストを返却
            # 2. threadが0の場合,[]を返却
            if not rows:
                # category_idに紐づくすべてのthread取得
                rows = query.all()

                # それでもthreadが取得できない場合
                if not rows:
                    return []

                result = []

                count = len(rows)

                # threadリストを逆順にしてpaging区切りのthreadをまとめて返却
                for row in list(reversed(rows)):
                    if count == 0 or count % 10 == 0:
                        break

                    result.append(row_to_dict(row))

                    count = count - 1

                return result

            result = [row_to_dict(row) for row in rows]

            return result