-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathweb.py
129 lines (115 loc) · 4.05 KB
/
web.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from flask import Flask,render_template,g,redirect,request,session,url_for,abort,flash
import db
from datetime import datetime
import pytz
import exporter
import os
import json
app = Flask(__name__)
app.secret_key = os.environ['SESSION_SECRET']
# datetimeがnaive(実際はutc)で渡ってくるのでいいかんじに日本時間で整形する
tz_japan = pytz.timezone('Asia/Tokyo')
def format_datetime(value):
return pytz.utc.localize(value).astimezone(tz_japan).strftime('%Y-%m-%d %H:%M:%S')
app.jinja_env.filters['datetime'] = format_datetime
def get_db():
_db = getattr(g, 'db', None)
if _db is None:
g.db = db.Db()
return g.db
@app.teardown_appcontext
def close_db(error):
get_db().close_db()
def jsonifySnapshots(snapshots):
return json.dumps([dict(s) for s in snapshots],default=exporter.json_default)
@app.route('/')
def index():
user = None
dbdata = None
snapshots = None
json_snapshots = None
if 'user' in session:
user = session['user']
dbdata = get_db().get_user_by_mastodon_id(user['id'])
if dbdata is not None:
snapshots = get_db().get_snapshots_by_owner(dbdata['id'])
json_snapshots=jsonifySnapshots(snapshots)
waiting_count = get_db().count_waiting_snapshots()
return render_template(
'index.html',
user=user,
snapshots=snapshots,
waiting_count=waiting_count,
json_snapshots=json_snapshots
)
@app.route('/snapshot', methods=['POST'])
def save_snapshot():
if 'user' not in session:
abort(401)
user = get_db().get_user_by_mastodon_id(session['user']['id'])
if not(validate_snapshot_form()):
flash('なんか入力がミスってる', 'error')
return redirect(url_for('index'))
snap_type = request.form['snap_type']
exporter.reserve_snapshot(user['id'], snap_type)
flash('保存依頼を受け付けました。', 'info')
return redirect(url_for('index'))
@app.route('/api/snapshots')
def user_snapshots():
if 'user' not in session:
abort(401)
user = get_db().get_user_by_mastodon_id(session['user']['id'])
if user is None:
abort(404)
snapshots = get_db().get_snapshots_by_owner(user['id'])
return jsonifySnapshots(snapshots)
def validate_snapshot_form():
try:
snap_type = request.form['snap_type']
if snap_type not in [db.SNAPSHOT_TYPE_TOOT, db.SNAPSHOT_TYPE_FAV]:
return False
return True
except Exception as e:
app.logger.warning(e)
return False
@app.route('/snapshot/<int:snapshot_id>', methods=['GET'])
def download_snapshot(snapshot_id):
# validation
if 'user' not in session: # 誰っす
abort(401)
user = get_db().get_user_by_mastodon_id(session['user']['id'])
snapshot = get_db().get_snapshot(snapshot_id)
if snapshot is None: # ないっす
abort(404)
if snapshot['owner'] != user['id']: # あんたのじゃないっす
abort(401)
if snapshot['status'] != db.SNAPSHOT_STATUS_DONE: # まだっす
abort(404)
# ダウンロード用URL作成
url = exporter.generate_download_url(snapshot['bucket'], snapshot['key'])
return redirect(url)
# OAuth
CALLBACK_URL = os.environ['OAUTH_CALLBACK_URL']
SESSION_ACCESS_TOKEN = 'access_token'
SESSION_USER = 'user'
@app.route('/login')
def login():
mastodon = exporter.get_mastodon()
return redirect(mastodon.auth_request_url(redirect_uris=CALLBACK_URL,scopes=['read']))
@app.route('/callback')
def callback():
code = request.args.get('code','')
mastodon = exporter.get_mastodon()
access_token = mastodon.log_in(code=code,redirect_uri=CALLBACK_URL,scopes=['read'])
user = mastodon.account_verify_credentials()
# create session
session[SESSION_ACCESS_TOKEN] = access_token
session[SESSION_USER] = user
# create user db
get_db().add_or_create_user(access_token, user)
return redirect(url_for('index'))
@app.route('/logout')
def logout():
session.pop(SESSION_ACCESS_TOKEN, None)
session.pop(SESSION_USER, None)
return redirect(url_for('index'))