]> git.gir.st - subscriptionfeed.git/blob - app/reddit/__init__.py
tweak reddit template
[subscriptionfeed.git] / app / reddit / __init__.py
1 import re
2 import sqlite3
3 from flask_login import current_user, login_required
4 from flask import Blueprint, render_template, request, redirect, flash
5
6 from ..common.common import *
7
8 frontend = Blueprint('reddit', __name__,
9 template_folder='templates',
10 static_folder='static',
11 static_url_path='/static/rd')
12
13 @frontend.route('/feed/subreddits')
14 @frontend.route('/r/<subreddit>')
15 def reddit(subreddit=None):
16 token = getattr(current_user, 'token', 'guest')
17 count = int(request.args.get('count', 0))
18 before = request.args.get('before')
19 after = request.args.get('after')
20
21 subreddits = [subreddit] if subreddit else get_subreddits(token)
22
23 try:
24 videos, before, after = fetch_reddit(subreddits, [], count, before, after)
25 except RedditException as e:
26 return f"error retrieving reddit data: {e}", 502 # TODO: better
27
28 # TODO: for /feed/reddit: pin/hide videos
29
30 title = f"/r/{subreddit}" if subreddit else "my subreddits"
31 return render_template('reddit.html.j2', title=title, rows=videos,
32 subreddits=subreddits, before=before, after=after, count=count)
33
34 @frontend.route('/manage/subreddits')
35 # disabled for guest user: @login_required
36 def subscription_manager():
37 token = getattr(current_user, 'token', 'guest')
38 subreddits = get_subreddits(token)
39 return render_template('subreddit_manager.html.j2', subreddits=subreddits)
40
41 @frontend.route('/feed/subreddits', methods=['POST'])
42 @login_required
43 def feed_post():
44 token = current_user.token
45
46 action = next(request.form.keys(), None)
47 if action in ['pin', 'unpin', 'hide']:
48 post_id = request.form.get(action)
49 display = {
50 'pin': 'pinned',
51 'unpin': None,
52 'hide': 'hidden',
53 }[action]
54 with sqlite3.connect(cf['global']['database']) as conn:
55 c = conn.cursor()
56 c.execute("""
57 INSERT OR REPLACE INTO flags (user, post_id, display)
58 VALUES (?, ?, ?)
59 """, (token, post_id, display))
60 else:
61 flash("unsupported action", "error")
62 return redirect(request.url, code=303)
63
64 @frontend.route('/manage/subreddits', methods=['POST'])
65 @login_required
66 def manage_subscriptions():
67 token = current_user.token
68 if 'subscribe' in request.form:
69 subreddit = request.form.get("subscribe")
70 match = re.search(r"(?:(?:https?://)?(?:old.|www.|\w\w.)?reddit.com)?(?:/?r/)?([-+_0-9A-Za-z]{2,21})", subreddit)
71 if match:
72 subreddit = match.group(1)
73 else:
74 flash("invalid subreddit", "error")
75 return redirect(request.url, code=303)
76 with sqlite3.connect(cf['global']['database']) as conn:
77 c = conn.cursor()
78 c.execute("""
79 INSERT OR IGNORE INTO subreddits (user, subreddit)
80 VALUES (?, ?)
81 """, (token, subreddit))
82
83 elif 'unsubscribe' in request.form:
84 subreddit = request.form.get("unsubscribe")
85 with sqlite3.connect(cf['global']['database']) as conn:
86 c = conn.cursor()
87 c.execute("""
88 DELETE FROM subreddits
89 WHERE user = ? AND subreddit = ?
90 """, (token, subreddit))
91 # TODO: sql-error-handling, report success
92
93 else:
94 flash("unsupported action", "error")
95
96 return redirect(request.url, code=303)
97
98 def get_subreddits(token):
99 with sqlite3.connect(cf['global']['database']) as conn:
100 c = conn.cursor()
101 c.execute("""
102 SELECT subreddit
103 FROM subreddits
104 WHERE user = ?
105 ORDER BY subreddit COLLATE NOCASE ASC
106 """, (token,))
107 subreddits = [sr for (sr,) in c.fetchall()]
108 return subreddits
109
110 @frontend.app_template_filter('trim3')
111 def trim3(n):
112 if round(n, 1) >= 10_000:
113 return "%.0fk" % (n/1000)
114 elif n >= 1_000:
115 return "%.1fk" % (n/1000)
116 else:
117 return "%d" % n
Imprint / Impressum