implement admin functionality(panel+check on login), added requirements.txt

This commit is contained in:
hornet 2024-10-14 16:57:34 +05:00
parent e3a4c716d4
commit 40cb71715b
5 changed files with 78 additions and 11 deletions

51
app.py
View file

@ -13,7 +13,6 @@ db = client.flask_db
posts_collection = db.posts_collection posts_collection = db.posts_collection
users_collection = db.users_collection users_collection = db.users_collection
#app routes #app routes
@app.route('/', methods=['GET']) @app.route('/', methods=['GET'])
def index(): def index():
@ -43,12 +42,17 @@ def post():
content = request.form['content'] content = request.form['content']
image = request.files['image'] image = request.files['image']
timestamp = datetime.now() timestamp = datetime.now()
if 'user_id' not in session:
username = 'Anonymous'
else:
username = session['username']
#insert the post into MongoDB #insert the post into MongoDB
post_data = { post_data = {
'board_name': board_name, 'board_name': board_name,
'content': content, 'content': content,
'timestamp': timestamp 'timestamp': timestamp,
'username' : username
} }
if image: if image:
@ -78,28 +82,59 @@ def login_post():
user = users_collection.find_one({'username': username}) user = users_collection.find_one({'username': username})
if user and check_password_hash(user['password'], password): if user and check_password_hash(user['password'], password):
session['user_id'] = str(user['_id']) session['user_id'] = str(user['_id'])
session['username'] = username
return redirect(url_for('index')) return redirect(url_for('index'))
elif user == 'admin' and check_password_hash(user['password'], password):
session['user_id'] = str(user['_id'])
session['username'] = username
return redirect(url_for('admin'))
else: else:
return redirect(url_for('login')) return redirect(url_for('login'))
@app.route('/register', methods=['GET']) @app.route('/register', methods=['GET'])
def register(): def register():
return render_template('register.html') regalert = request.args.get('regalert', '')
return render_template('register.html', regalert=regalert)
@app.route('/register', methods=['POST']) @app.route('/register', methods=['POST'])
def register_post(): def register_post():
username = request.form['username'] username = request.form['username']
password = request.form['password'] password = request.form['password']
hashed_password = generate_password_hash(password, method='pbkdf2:sha256') hashed_password = generate_password_hash(password, method='pbkdf2:sha256')
regalert = ''
#insert the user into MongoDB if users_collection.find_one({'username': username}):
users_collection.insert_one({ regalert = 'username already exists!'
'username': username, return redirect(url_for('register', regalert=regalert))
'password': hashed_password else:
}) # Insert the user into MongoDB
users_collection.insert_one({
'username': username,
'password': hashed_password
})
return redirect(url_for('login')) return redirect(url_for('login'))
@app.route('/admin', methods=['GET'])
def admin():
admin_user = users_collection.find_one({'username': 'admin'})
success = request.args.get('success', '')
if admin_user or session['user_id'] != str(admin_user['_id']):
return render_template('admin.html', success=success)
else:
return url_for('index')
@app.route('/deletepost', methods=['POST'])
def deletepost():
admin_user = users_collection.find_one({'username': 'admin'})
if not admin_user or session['user_id'] != str(admin_user['_id']):
return redirect(url_for('index'))
else:
post_id = request.form['post_id']
posts_collection.delete_one({'_id': ObjectId(post_id)})
success = 'post deleted!'
return redirect(url_for('admin', success=success))
@app.route('/logout') @app.route('/logout')
def logout(): def logout():
session.pop('user_id', None) session.pop('user_id', None)

4
requirements.txt Normal file
View file

@ -0,0 +1,4 @@
FlasK
pymongo
bson
werkzeug

21
templates/admin.html Normal file
View file

@ -0,0 +1,21 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>admin panel</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<div>
<h2>admin panel</h2>
<div>
<h4>delete post</h4>
<h4 style="color: yellow;">{{ success }}</h4>
<form action="{{ url_for('deletepost') }}" method="post">
<input type="text" name="post_id" placeholder="post id">
<button type="submit">delete</button>
</form>
</div>
</div>
</body>
</html>

View file

@ -7,7 +7,13 @@
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head> </head>
<body> <body>
{% block content %} <div class="navbar">
<a>logged in as {{ session.username }}</a>
<a href="{{ url_for('index') }}">home</a>
<a href="{{ url_for('logout') }}">logout</a>
<a href="{{ url_for('admin') }}">admin</a>
</div>
{% block content %}
<div class="link-container"> <div class="link-container">
<h2>{{ header }}</h2> <h2>{{ header }}</h2>
<form action="{{ url_for('post') }}" method="post" enctype="multipart/form-data"> <form action="{{ url_for('post') }}" method="post" enctype="multipart/form-data">
@ -16,14 +22,14 @@
<input type="file" name="image"> <input type="file" name="image">
<button type="submit">Post</button> <button type="submit">Post</button>
</form> </form>
<div class="posts"> <div class="posts">
{% for post in posts %} {% for post in posts %}
<div class="post"> <div class="post">
{% if post.image %} {% if post.image %}
<img src="{{ url_for('image', post_id=post._id) }}" alt="Post Image"> <img src="{{ url_for('image', post_id=post._id) }}" alt="Post Image">
{% endif %} {% endif %}
<p>{{ post.content }}</p> <p>{{ post.content }}</p>
<small>{{ post.timestamp }}</small> <small>{{ post.username }} {{ post.timestamp }} {{ post._id }}</small>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>

View file

@ -7,6 +7,7 @@
<body> <body>
<div class="link-container"> <div class="link-container">
<h1>register</h1> <h1>register</h1>
<h4>{{ regalert }}</h4>
<form action="{{ url_for('register_post') }}" method="post"> <form action="{{ url_for('register_post') }}" method="post">
<label for="username">username:</label> <label for="username">username:</label>
<input type="text" id="username" name="username" required> <input type="text" id="username" name="username" required>