コード例 #1
0
ファイル: main.py プロジェクト: p-t-a-p-1/fastapi-todo-app
async def insert_task(request: Request,
                      content: str = Form(...),
                      deadline: str = Form(...),
                      credentials: HTTPBasicCredentials = Depends(security)):
    """
    タスクを追加してJsonで追加したタスク情報を返す
    deadlineは %Y-%m-%d_%H:%M:%S (e.g. 2020-06-18_12:30:00)
    """
    # 認証
    username = basic_auth(credentials)
    # ユーザー情報を取得
    user = db.session.query(UserTable).filter(
        UserTable.username == username).first()

    # タスクを追加
    task = TaskTable(user.id, content,
                     datetime.strptime(deadline, '%Y-%m-%d_%H:%M:%S'))

    db.session.add(task)
    db.session.commit()

    # 新しく追加したタスクを取得
    new_task = db.session.query(TaskTable).all()[-1]
    db.session.close()

    # 新規タスクをJsonで返す
    return {
        'id': new_task.id,
        'content': new_task.content,
        'deadline': new_task.deadline.strftime('%Y-%m-%d_%H:%M:%S'),
        'published': new_task.date.strftime('%Y-%m-%d_%H:%M:%S'),
        'done': new_task.done,
    }
コード例 #2
0
ファイル: main.py プロジェクト: p-t-a-p-1/fastapi-todo-app
async def add_task(request: Request,
                   credentials: HTTPBasicCredentials = Depends(security)):
    # 認証
    username = basic_auth(credentials)
    # ユーザー情報を取得
    user = db.session.query(UserTable).filter(
        UserTable.username == username).first()

    # フォームからきたデータ取得
    data = await request.form()
    print(data)
    year = int(data['year'])
    month = int(data['month'])
    day = int(data['day'])
    hour = int(data['hour'])
    minute = int(data['minute'])

    deadline = datetime(year=year,
                        month=month,
                        day=day,
                        hour=hour,
                        minute=minute)

    # 新しくタスクを作成しDBコミット
    task = TaskTable(user.id, data['content'], deadline)
    db.session.add(task)
    db.session.commit()
    db.session.close()

    return RedirectResponse('/admin')
コード例 #3
0
ファイル: main.py プロジェクト: p-t-a-p-1/fastapi-todo-app
async def done(request: Request,
               credentials: HTTPBasicCredentials = Depends(security)):
    # 認証
    username = basic_auth(credentials)

    # ユーザー情報
    user = db.session.query(UserTable).filter(
        UserTable.username == username).first()

    # ログインユーザーのタスクを取得
    user_all_tasks = db.session.query(TaskTable).filter(
        TaskTable.user_id == user.id).all()

    # フォームで受け取ったタスクの終了判定を見て内容を変更する
    data = await request.form()
    # リストとして取得
    t_dones = data.getlist('done[]')

    for task in user_all_tasks:
        if str(task.id) in t_dones:
            task.done = True
        print(task)

    # update
    db.session.commit()
    db.session.close()

    # 管理者トップへリダイレクト
    return RedirectResponse('/admin')
コード例 #4
0
 def setUp(self):
     """Set-up for the BasicAuthTestCase."""
     self.app = app
     app.config["DEBUG"] = False
     self.mock = Mock(return_value=True)
     self.basic_auth = basic_auth(self.mock)
     self.database_url = TEST_DATABASE_URL
     setup_db(self.app, self.database_url)
     user = User.query.filter_by(username="******").first()
     if user is None:
         user = User(
             username="******",
             password_hash=generate_password_hash("supersecret"),
         )
         user.insert()
コード例 #5
0
ファイル: main.py プロジェクト: p-t-a-p-1/fastapi-todo-app
def read_detail(request: Request,
                username,
                year,
                month,
                day,
                credentials: HTTPBasicCredentials = Depends(security)):
    """
    URLのパターンは引数で取得できる
    Args:
        request (Request): URLでのリクエスト
        username (str): ユーザー名
        year (int): 年
        month (int): 月
        day (int): 日
    """

    # 認証okか
    username_tmp = basic_auth(credentials)

    # 他のユーザーが来た場合は弾く
    if username_tmp != username:
        return RedirectResponse('/')

    # ログインユーザー
    user = db.session.query(UserTable).filter(
        UserTable.username == username).first()
    # ログインユーザーの全タスクを取得
    user_all_tasks = db.session.query(TaskTable).filter(
        TaskTable.user_id == user.id).all()
    db.session.close()

    # 該当の日付と一致するものだけリストにする
    # 月と日は0埋め
    theday = '{}{}{}'.format(year, month.zfill(2), day.zfill(2))
    tasks = [
        t for t in user_all_tasks if t.deadline.strftime('%Y%m%d') == theday
    ]

    return templates.TemplateResponse(
        'detail.html', {
            'request': request,
            'username': username,
            'tasks': tasks,
            'year': year,
            'month': month,
            'day': day
        })
コード例 #6
0
ファイル: main.py プロジェクト: p-t-a-p-1/fastapi-todo-app
def delete_task(request: Request,
                task_id,
                credentials: HTTPBasicCredentials = Depends(security)):
    # 認証
    username = basic_auth(credentials)
    # ユーザー情報を取得
    user = db.session.query(UserTable).filter(
        UserTable.username == username).first()
    # 該当タスクを取得
    task = db.session.query(TaskTable).filter(TaskTable.id == task_id).first()

    # もしユーザーIDが異なれば削除せずリダイレクト
    if task.user_id != user.id:
        return RedirectResponse('/admin')

    # 削除してDBコミット
    db.session.delete(task)
    db.session.commit()
    db.session.close()

    return RedirectResponse('/admin')
コード例 #7
0
ファイル: main.py プロジェクト: p-t-a-p-1/fastapi-todo-app
def admin(request: Request,
          credentials: HTTPBasicCredentials = Depends(security)):

    # Basic認証で受け取った情報
    username = basic_auth(credentials)

    today = datetime.now()
    # 1週間後の日付
    next_w = today + timedelta(days=7)

    # DBからユーザー名が一致する情報を取得
    user = db.session.query(UserTable).filter(
        UserTable.username == username).first()
    tasks = db.session.query(TaskTable).filter(
        TaskTable.user_id == user.id).all() if user is not None else []
    db.session.close()

    # カレンダーをHTML形式で取得
    # 予定がある日付をdictのキーとして渡す
    cal = MyCalendar(username,
                     {t.deadline.strftime('%Y%m%d'): t.done
                      for t in tasks})
    # カレンダーをHTMLで取得
    cal = cal.formatyear(today.year, 4)

    # 直近のタスクのリスト
    tasks = [task for task in tasks if today <= task.deadline]
    # 直近の予定リンク
    links = [
        t.deadline.strftime('/todo/' + username + '/%Y/%m/%d') for t in tasks
    ]

    return templates.TemplateResponse(
        'admin.html', {
            'request': request,
            'user': user,
            'tasks': tasks,
            'links': links,
            'calendar': cal
        })
コード例 #8
0
ファイル: main.py プロジェクト: p-t-a-p-1/fastapi-todo-app
def get(request: Request,
        credentials: HTTPBasicCredentials = Depends(security)):
    # 認証
    username = basic_auth(credentials)

    # ユーザー情報を取得
    user = db.session.query(UserTable).filter(
        UserTable.username == username).first()
    # タスクを取得
    tasks = db.session.query(TaskTable).filter(
        TaskTable.user_id == user.id).all()

    db.session.close()

    tasks = [{
        'id': task.id,
        'content': task.content,
        'deadline': task.deadline.strftime('%Y-%m-%d %H:%M:%S'),
        'publishd': task.date.strftime('%Y-%m-%d %H:%M:%S'),
        'done': task.done,
    } for task in tasks]

    return tasks