コード例 #1
0
 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)
コード例 #2
0
ファイル: stress.py プロジェクト: swkoubou/gestion-api
 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)
コード例 #3
0
 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)
コード例 #4
0
 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)
コード例 #5
0
ファイル: stress.py プロジェクト: swkoubou/gestion-api
 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)
コード例 #6
0
 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,
     })
コード例 #7
0
 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!')
コード例 #8
0
 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)
コード例 #9
0
 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!')
コード例 #10
0
 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)
コード例 #11
0
 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)
コード例 #12
0
 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)
コード例 #13
0
 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)
コード例 #14
0
 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)
コード例 #15
0
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
コード例 #16
0
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
コード例 #17
0
 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)
コード例 #18
0
 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)
コード例 #19
0
 def get(self):
     """グループ一覧取得."""
     groups = [{'id': g.id, 'name': g.name} for g in ss.query(Group)]
     return jsonify(groups)
コード例 #20
0
##### コマンドライン引数の処理 #####
# 日付の指定によってクロールするデータの日付を変える
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: