def put(self, user_id): """ユーザ情報の更新.""" admin = check_authorize_admin() user = ss.query(User).filter_by(id=user_id, group_id=admin.group_id).first() if user is None: abort(404) if 'email' in rq.form: query = ss.query(User).filter_by(email=rq.form['email']) if query.count() > 0: abort(409, 'そのメールアドレスは既に使われています') else: user.email = rq.form['email'] if 'first_name' in rq.form: user.first_name = rq.form['first_name'] if 'last_name' in rq.form: user.last_name = rq.form['last_name'] if 'gender' in rq.form: user.gender = rq.form['gender'] if 'password' in rq.form: user.password = rq.form['password'] if 'fitbit_id' in rq.form: user.fitbit_id = rq.form['fitbit_id'] if 'fitbit_access_token' in rq.form: user.fitbit_access_token = rq.form['fitbit_access_token'] if 'fitbit_refresh_token' in rq.form: user.fitbit_refresh_token = rq.form['fitbit_refresh_token'] if ss.dirty: ss.commit() # commit()後一度オブジェクトを参照しないとvars()で表示できない?? print('change', user.first_name) user = vars(user) del user['_sa_instance_state'] del user['password'] del user['token'] return jsonify(user)
def get(self, user_id): """ストレス値一覧の取得.""" admin = check_authorize_admin() user = ss.query(User).filter_by(id=user_id, group_id=admin.group_id).first() if user is None: abort(404) stress_data = [{ 'value': s.stress, 'date': s.date.isoformat() } for s in ss.query(Stress).filter_by(owner_id=user.id)] return jsonify(stress_data)
def get(self, user_id): """勤務時間一覧の取得.""" admin = check_authorize_admin() user = ss.query(User).filter_by(id=user_id, group_id=admin.group_id).first() if user is None: abort(404) records = [{ 'id': r.id, 'begin': r.begin, 'end': r.end } for r in (ss.query(AttendanceRecord).filter_by(owner_id=user.id))] return jsonify(records)
def put(self, group_name): """グループ情報の変更.""" admin = check_authorize_admin() group = ss.query(Group).filter_by(name=group_name).first() # URLのグループ if not group: abort(404) if not admin or admin.group_id != group.id: abort(403) if 'name' not in rq.form: abort(400) query = ss.query(Group).filter_by(name=rq.form['name']) if query.count() > 0: abort(409, 'そのグループ名は既に使われています') group.name = rq.form['name'] ss.commit() return jsonify(id=group.id, name=group.name)
def get(self): """自分のストレス値一覧の取得.""" user = check_authorize() stress_data = [{ 'value': s.stress, 'date': s.date.isoformat() } for s in ss.query(Stress).filter_by(owner_id=user.id)] return jsonify(stress_data)
def post(self): """新規グループと管理ユーザの追加.""" if set(rq.form) != { 'name', 'email', 'first_name', 'last_name', 'gender', 'password' }: abort(400) query = ss.query(Group).filter_by(name=rq.form['name']) if query.count() > 0: abort(409, 'そのグループ名は既に使われています') query = ss.query(User).filter_by(email=rq.form['email']) if query.count() > 0: abort(409, 'そのメールアドレスは既に使われています') # グループの作成 group = Group(name=rq.form['name']) ss.add(group) ss.commit() # 管理者ユーザの作成 admin = User( email=rq.form['email'], first_name=rq.form['first_name'], last_name=rq.form['last_name'], gender=rq.form['gender'], password=generate_password_hash(rq.form['password']), # user_idが決まらないとアクセストークンが作れないのでダミーを入れる token=Token.generate(0, 0), fitbit_id='', fitbit_access_token='', fitbit_refresh_token='', permission='admin', group_id=group.id) ss.add(admin) ss.commit() admin.token = Token.generate(admin.id, admin.group_id) ss.commit() # commit()後一度オブジェクトを参照しないとvars()で表示できない?? print('add', admin.first_name) admin = vars(admin) del admin['_sa_instance_state'] del admin['password'] return jsonify({ 'group': { 'id': group.id, 'name': group.name }, 'admin': admin, })
def delete(self, user_id): """ユーザの削除.""" admin = check_authorize_admin() user = ss.query(User).filter_by(id=user_id, group_id=admin.group_id).first() if user is None: abort(404) ss.delete(user) ss.commit() return jsonify(message='Good Bye!')
def get(self): """自分の勤務時間一覧の取得.""" user = check_authorize() records = [{ 'id': r.id, 'begin': r.begin, 'end': r.end } for r in (ss.query(AttendanceRecord).filter_by(owner_id=user.id))] return jsonify(records)
def delete(self, group_name): """グループの削除.""" admin = check_authorize_admin() group = ss.query(Group).filter_by(name=group_name).first() # URLのグループ if not group: abort(404) if not admin or admin.group_id != group.id: abort(403) ss.delete(group) ss.commit() return jsonify(message='Good Bye!')
def post(self): """サインイン.""" if set(rq.form) != {'group_name', 'email', 'password'}: abort(400) user = ss.query(User).filter_by(email=rq.form['email']).first() if user is None: abort(404) if not check_password_hash(user.password, rq.form['password']): abort(401) user = vars(user) del user['_sa_instance_state'] del user['password'] return jsonify(user)
def get(self, user_id): """ユーザ情報の取得.""" own = check_authorize() user = ss.query(User).filter_by(id=user_id, group_id=own.group_id).first() if user is None: abort(404) user = vars(user) del user['_sa_instance_state'] del user['password'] del user['token'] del user['fitbit_id'] del user['fitbit_access_token'] del user['fitbit_refresh_token'] return jsonify(user)
def get(self): """ユーザ一覧の取得.""" user = check_authorize() users = [] for u in ss.query(User).filter_by(group_id=user.group_id): u = vars(u) del u['_sa_instance_state'] del u['password'] del u['token'] del u['fitbit_id'] del u['fitbit_access_token'] del u['fitbit_refresh_token'] users.append(u) return jsonify(users)
def post(self): """退勤.""" user = check_authorize() latest_record = (ss.query(AttendanceRecord).filter_by( owner_id=user.id).order_by(AttendanceRecord.id.desc()).first()) if latest_record is None or latest_record.end is not None: abort(409, "既に退勤しています") latest_record.end = datetime.datetime.now() ss.commit() print('check out at %s' % latest_record.end) latest_record = vars(latest_record) del latest_record['_sa_instance_state'] del latest_record['owner_id'] return jsonify(latest_record)
def post(self): """出勤.""" user = check_authorize() latest_record = (ss.query(AttendanceRecord).filter_by( owner_id=user.id).order_by(AttendanceRecord.id.desc()).first()) if latest_record is not None and latest_record.end is None: abort(409, "既に出勤しています") record = AttendanceRecord(begin=datetime.datetime.now(), owner_id=user.id) ss.add(record) ss.commit() print('go to walk at %s' % record.begin) record = vars(record) del record['_sa_instance_state'] del record['owner_id'] return jsonify(record)
def check_authorize_admin(): """アクセストークンを調べて正しい管理ユーザか確認する.""" try: group_id, user_id, access_token = parse_authorize_header() except: abort(400, '正しいAuthorizationヘッダが必要です') # トークンの照合 admin = (ss.query(User).filter_by(id=user_id, group_id=group_id, token=access_token, permission='admin').first()) if not admin: abort(401, '認証に失敗しました') else: return admin
def check_authorize(): """アクセストークンを調べて正しいユーザか確認する.""" try: group_id, user_id, access_token = parse_authorize_header() except: abort(400, '正しいAuthorizationヘッダが必要です') # トークンの照合 user = (ss.query(User).filter_by(id=user_id, group_id=group_id, token=access_token).first() ) # 万一重複があった場合の処理が必要? if not user: abort(401, '認証に失敗しました') else: return user
def post(self): """ユーザの追加.""" admin = check_authorize_admin() if set(rq.form) != { 'email', 'first_name', 'last_name', 'gender', 'password' }: abort(400) query = ss.query(User).filter_by(email=rq.form['email']) if query.count() > 0: abort(409, 'そのメールアドレスは既に使われています') new_user = User( email=rq.form['email'], first_name=rq.form['first_name'], last_name=rq.form['last_name'], gender=rq.form['gender'], password=generate_password_hash(rq.form['password']), # user_idが決まらないとアクセストークンが作れないのでダミーを入れる token=Token.generate(0, 0), fitbit_id='', fitbit_access_token='', fitbit_refresh_token='', permission='user', group_id=admin.group_id) ss.add(new_user) ss.commit() new_user.token = Token.generate(new_user.id, new_user.group_id) ss.commit() # commit()後一度オブジェクトを参照しないとvars()で表示できない?? print('add', new_user.first_name) new_user = vars(new_user) del new_user['_sa_instance_state'] del new_user['password'] del new_user['fitbit_id'] del new_user['fitbit_access_token'] del new_user['fitbit_refresh_token'] del new_user['token'] return jsonify(new_user)
def get(self, group_name): """グループ情報の取得.""" group = ss.query(Group).filter(Group.name == group_name).first() if group is None: abort(404) return jsonify(id=group.id, name=group.name)
def get(self): """グループ一覧取得.""" groups = [{'id': g.id, 'name': g.name} for g in ss.query(Group)] return jsonify(groups)
##### コマンドライン引数の処理 ##### # 日付の指定によってクロールするデータの日付を変える parser = argparse.ArgumentParser() parser.add_argument('-y', '--year', type=int, help='年の指定') parser.add_argument('-m', '--month', type=int, help='月の指定') parser.add_argument('-d', '--day', type=int, help='日の指定') args = parser.parse_args() year = args.year if args.year else date.today().year month = args.month if args.month else date.today().month day = args.day if args.day else date.today().day crawl_date = date(year, month, day) ##### ユーザ毎にデータを収集してストレス値の計算 ##### for user in session.query(User): # fitbitアカウントが登録されていない場合と、既に同じ日にちのデータが # 取得されている場合はクロールしない if user.fitbit_access_token == '' or (session.query(Stress).filter_by( owner_id=user.id, date=crawl_date).first()): continue resource_url = f'https://api.fitbit.com/1/user/{user.fitbit_id}/activities/heart/date/{crawl_date.isoformat()}/1d/1sec/time/00:00/23:59.json' r = requests.get(resource_url, headers={ 'Authorization': 'Bearer ' + user.fitbit_access_token, }) if r.status_code == 200: print('success') data = r.json()['activities-heart-intraday']['dataset'] heart_rate = numpy.array([datum['value'] for datum in data]) try: