-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.py
87 lines (65 loc) · 2.29 KB
/
server.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
from flask import Flask, abort, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
import plotly.io
from logic import (
add_feed,
delete_feed,
fetch_update_stats,
item_list,
overview,
feed_list,
record_visit,
toggle_feed_downrank,
)
from stats_plot import plot_update_stats_figure
from models import Base
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///rss_feeds.db"
db = SQLAlchemy(app)
with app.app_context():
Base.metadata.create_all(bind=db.engine)
@app.template_filter("format_date")
def format_date(value, format="%d %B %Y, %I:%M %p"):
if value is None:
return None
return value.strftime(format)
@app.route("/")
def page_overview():
props = overview(db.session)
return render_template("overview.html", **props)
@app.route("/list")
def page_item_list():
offset = request.args.get("offset", default=0, type=int)
specific_feed_id = request.args.get("feed", default=None, type=int)
props = item_list(db.session, offset, specific_feed_id)
return render_template("index.html", **props)
@app.route("/feeds", methods=["GET", "POST"])
def page_manage_feeds():
if request.method == "POST":
if "delete" in request.form:
delete_feed(db.session, int(request.form["delete"]))
elif "downrank" in request.form:
toggle_feed_downrank(db.session, int(request.form["downrank"]))
else:
add_feed(db.session, request.form["url"])
return redirect(url_for("page_manage_feeds"))
return render_template("feeds.html", **feed_list(db.session))
@app.route("/visit", methods=["POST"])
def visit_item():
item_id = request.args.get("id", type=int)
if not item_id:
abort(400)
record_visit(db.session, item_id)
return ""
@app.route("/stats")
def graph_update_stats():
timeframe = request.args.get("window", default="week", type=str)
data = fetch_update_stats(db.session, timeframe)
fig = plot_update_stats_figure(data)
fig_html = plotly.io.to_html(fig, full_html=False, default_height="80vh")
return render_template("stats.html", figure=fig_html)
@app.route("/static/<path:path>")
def send_static(path):
return app.send_static_file(path)
if __name__ == "__main__":
app.run(debug=True)