-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathforum.py
144 lines (118 loc) · 4.67 KB
/
forum.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
from flask import (
Blueprint, render_template, g, redirect, url_for, flash, request
)
from CSTG2026.db import get_db
bp = Blueprint('forum', __name__, url_prefix='/forum')
sec_list = ['General', 'AI', 'Networks', 'Architecture', 'Cryptography']
@bp.route('/')
@bp.route('/index')
def index():
return render_template('forum/index.html')
@bp.route('/section/<sec_name>', methods=('GET', 'POST'))
def section(sec_name):
db = get_db()
if sec_name not in sec_list:
flash('Section not found', 'error')
return redirect(url_for('forum.index'))
sec_id = 0
with db.cursor() as cursor:
cursor.execute(
'SELECT * FROM section WHERE title = %s', (sec_name,)
)
sec_id = cursor.fetchone()[0]
if request.method == 'GET':
with db.cursor() as cursor:
cursor.execute(
'SELECT * FROM post WHERE sec_id = %s', (sec_id,)
)
posts = cursor.fetchall()
def get_name(usr_id):
cursor.execute(
'SELECT name FROM usr WHERE usr_id = %s', (usr_id,)
)
return cursor.fetchone()[0]
posts = [(p[0], p[1], p[2], p[3], get_name(p[4]), p[5], p[6]) for p in posts]
return render_template('forum/section.html', sec_name=sec_name, posts=posts)
title = request.form['title']
content = request.form['content']
pub_id = g.usr[0]
error = None
if not title:
error = 'Title is required.'
elif not content:
error = 'Content is required.'
if error is not None:
flash(error, 'error')
return redirect(url_for('forum.section', sec_name=sec_name))
with db.cursor() as cursor:
try:
cursor.execute(
'INSERT INTO post (title, content, sec_id, pub_id) VALUES (%s, %s, %s, %s)',
(title, content, sec_id, pub_id)
)
db.commit()
flash('Post published.', 'info')
return redirect(url_for('forum.section', sec_name=sec_name))
except Exception as e:
print(e)
flash('Unknown error.', 'error')
return redirect(url_for('forum.section', sec_name=sec_name))
@bp.route('/section/<sec_name>/post/<post_id>', methods=('GET', 'POST'))
def post(sec_name, post_id):
db = get_db()
if sec_name not in sec_list:
flash('Section not found', 'error')
return redirect(url_for('forum.index'))
sec_id = 0
post = None
with db.cursor() as cursor:
cursor.execute(
'SELECT * FROM section WHERE title = %s', (sec_name,)
)
sec_id = cursor.fetchone()[0]
cursor.execute(
'SELECT * FROM post WHERE post_id = %s', (post_id,)
)
post = cursor.fetchone()
if post[3] is None or post[3] != sec_id:
flash('Post not found', 'error')
return redirect(url_for('forum.section', sec_name=sec_name))
if request.method == 'GET':
with db.cursor() as cursor:
cursor.execute(
'SELECT * FROM reply WHERE post_id = %s', (post_id,)
)
replies = cursor.fetchall()
def get_name(usr_id):
cursor.execute(
'SELECT name FROM usr WHERE usr_id = %s', (usr_id,)
)
return cursor.fetchone()[0]
def get_avatar(usr_id):
cursor.execute(
'SELECT avatar_filename FROM usr WHERE usr_id = %s', (usr_id,)
)
return cursor.fetchone()[0]
post = (post[0], post[1], post[2], post[3], get_name(post[4]),
post[5], post[6], get_avatar(post[4]))
replies = [(r[0], r[1], r[2], get_name(r[3]), r[4], get_avatar(r[3])) for r in replies]
return render_template('forum/post.html',
sec_name=sec_name, post=post, replies=replies)
content = request.form['content']
pub_id = g.usr[0]
if not content:
flash('Content is required.', 'error')
return redirect(url_for('forum.post', sec_name=sec_name, post_id=post_id))
with db.cursor() as cursor:
cursor.execute(
'INSERT INTO reply (content, post_id, pub_id) VALUES (%s, %s, %s)',
(content, post_id, pub_id)
)
db.commit()
flash('Reply published.', 'info')
return redirect(url_for('forum.post', sec_name=sec_name, post_id=post_id))
@bp.before_request
def signin_required():
if g.usr is None:
flash('Please sign in first.', 'error')
return redirect(url_for('home.index'))