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, }
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')
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')
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()
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 })
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')
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 })
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