Browse Source

basic admin interface done

master
Johannnes Bürst 5 years ago
parent
commit
6dbd4ca229
4 changed files with 92 additions and 43 deletions
  1. +41
    -16
      calender/calender.py
  2. +2
    -2
      calender/schema.sql
  3. +30
    -24
      calender/templates/calender/index.html
  4. +19
    -1
      calender/templates/calender/update.html

+ 41
- 16
calender/calender.py View File



from flask import ( from flask import (
Blueprint, render_template, Blueprint, render_template,
flash, request, url_for, redirect, abort, g, send_from_directory, current_app)
flash, request, url_for, redirect, abort, send_from_directory, current_app)
from werkzeug.utils import secure_filename from werkzeug.utils import secure_filename


from calender.auth import login_required from calender.auth import login_required
from calender.db import get_db from calender.db import get_db


bp = Blueprint('calender', __name__) bp = Blueprint('calender', __name__)
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webm', 'mp4', 'bmp'}


#Todo admin interface for managing submit, comments, submission date

# Todo admin interface for managing submit, comments, submission date


@bp.route('/') @bp.route('/')
def index(): def index():
db = get_db() db = get_db()
posts = db.execute( posts = db.execute(
'SELECT p.id, title, body, created, author_id, username, nickname, file'
' FROM post p JOIN user u ON p.author_id = u.id'
'SELECT p.id, title, body, created, nickname, file, chosen, type'
' FROM post p'
' ORDER BY created DESC' ' ORDER BY created DESC'
).fetchall() ).fetchall()
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
return render_template('calender/index.html', posts=posts) return render_template('calender/index.html', posts=posts)




@bp.route('/create', methods=('GET', 'POST'))
@bp.route('/admin')
@login_required @login_required
def admin():
db = get_db()
posts = db.execute(
'SELECT p.id, title, body, created, nickname, file, chosen, type'
' FROM post p'
' ORDER BY created DESC'
).fetchall()
# noinspection PyUnresolvedReferences
return render_template('calender/admin.html', posts=posts)


@bp.route('/create', methods=('GET', 'POST'))
# @login_required
def create(): def create():
if request.method == 'POST': if request.method == 'POST':
title = request.form['title'] title = request.form['title']
flash(error) flash(error)
else: else:
if file and allowed_file(file.filename): if file and allowed_file(file.filename):
file_type = check_file_type(file.filename)
filename = secure_filename(file.filename) filename = secure_filename(file.filename)
file.save(os.path.join(current_app.config['UPLOAD_FOLDER'], filename)) file.save(os.path.join(current_app.config['UPLOAD_FOLDER'], filename))

db = get_db() db = get_db()
db.execute( db.execute(
'INSERT INTO post (title, body, author_id, nickname, file)'
' VALUES (?, ?, ?, ?, ?)',
(title, body, g.user['id'], nickname, url_for('calender.uploaded_file',
filename=filename))
'INSERT INTO post (title, body, nickname, file, chosen, type)'
' VALUES (?, ?, ?, ?, ?, ?)',
(title, body, nickname, url_for('calender.uploaded_file',
filename=filename), False, file_type)
) )
db.commit() db.commit()
# return redirect(url_for('calender.uploaded_file',filename=filename)) # return redirect(url_for('calender.uploaded_file',filename=filename))


def get_post(id, check_author=True): def get_post(id, check_author=True):
post = get_db().execute( post = get_db().execute(
'SELECT p.id, title, body, created, author_id, username, nickname, file'
' FROM post p JOIN user u ON p.author_id = u.id'
'SELECT p.id, title, body, created, nickname, file, chosen, type'
' FROM post p'
' WHERE p.id = ?', ' WHERE p.id = ?',
(id,) (id,)
).fetchone() ).fetchone()
if post is None: if post is None:
abort(404, "Post id {0} doesn't exist.".format(id)) abort(404, "Post id {0} doesn't exist.".format(id))


if check_author and post['author_id'] != g.user['id']:
abort(403)
# if check_author and post['author_id'] != g.user['id']:
# abort(403)


return post return post




if request.method == 'POST': if request.method == 'POST':
title = request.form['title'] title = request.form['title']
nickname = request.form['nickname']
body = request.form['body'] body = request.form['body']
chosen = request.form['chosen']
error = None error = None


if not title: if not title:
else: else:
db = get_db() db = get_db()
db.execute( db.execute(
'UPDATE post SET title = ?, body = ?'
'UPDATE post SET title = ?, body = ?, nickname = ?, chosen = ?'
' WHERE id = ?', ' WHERE id = ?',
(title, body, id)
(title, body, nickname, chosen, id)
) )
db.commit() db.commit()
return redirect(url_for('calender.index')) return redirect(url_for('calender.index'))
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS




def check_file_type(filename):
if filename.rsplit('.', 1)[1].lower() in ['webm', 'mp4']:
return 'video'
else:
return 'image'


@bp.route('/uploads/<filename>') @bp.route('/uploads/<filename>')
def uploaded_file(filename): def uploaded_file(filename):
return send_from_directory(current_app.config['UPLOAD_FOLDER'], return send_from_directory(current_app.config['UPLOAD_FOLDER'],

+ 2
- 2
calender/schema.sql View File



CREATE TABLE post ( CREATE TABLE post (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
author_id INTEGER NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
title TEXT NOT NULL, title TEXT NOT NULL,
nickname TEXT NOT NULL, nickname TEXT NOT NULL,
body TEXT NOT NULL, body TEXT NOT NULL,
file TEXT NOT NULL, file TEXT NOT NULL,
FOREIGN KEY (author_id) REFERENCES user (id)
chosen INTEGER NOT NULL ,
type TEXT NOT NULL
); );

+ 30
- 24
calender/templates/calender/index.html View File

<div> <div>
<h6>Submit your meme for the next day now! Feel free to create and submit your own creations. </h6> <h6>Submit your meme for the next day now! Feel free to create and submit your own creations. </h6>
<br> <br>
{% if g.user %}
<a class="action" href="{{ url_for('calender.create') }}">
<button>Submit a Meme</button>
</a>
{% endif %}
<a class="action" href="{{ url_for('calender.create') }}">
<button>Submit a Meme</button>
</a>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="container w3-center"> <div class="container w3-center">
{% for post in posts %} {% for post in posts %}
<div class="item">
<article class="post">
<header>
<div>
<h1>{{ post['title'] }}</h1>
<h2>{{ post['nickname'] }}</h2>
<div class="about">by {{ post['username'] }}
on {{ post['created'].strftime('%Y-%m-%d') }}</div>
</div>
{% if g.user['id'] == post['author_id'] %}
<a class="action" href="{{ url_for('calender.update', id=post['id']) }}">Edit</a>
{% if post['chosen'] == 1 %}
<div class="item">
<article class="post">
<header>
<div>
<h1>{{ post['title'] }}</h1>
<h2>{{ post['nickname'] }}</h2>
<div class="about">by {{ post['username'] }}
on {{ post['created'].strftime('%Y-%m-%d') }}</div>
</div>
</header>
{% if post['type'] == 'image' %}
<img class="file" src="{{ post['file'] }}">
{% endif %} {% endif %}
</header>
<img class="file" src="{{ post['file'] }}">
<p class="body">{{ post['body'] }}</p>
</article>
{% if not loop.last %}
<hr>
{% endif %}
</div>
{% if post['type'] == 'video' %}
<video class="file" preload="none" controls="" width="500">
<source src="{{ post['file'] }}">
</video>
{% endif %}
<p class="body">{{ post['body'] }}</p>
</article>
{% if not loop.last %}
<hr>
{% endif %}
</div>
{% endif %}
{% endfor %} {% endfor %}
</div> </div>
{% endblock %} {% endblock %}

+ 19
- 1
calender/templates/calender/update.html View File

{% endblock %} {% endblock %}


{% block content %} {% block content %}
<form method="post">
<form method=post enctype=multipart/form-data>
<label for="title">Title</label> <label for="title">Title</label>
<input name="title" id="title" <input name="title" id="title"
value="{{ request.form['title'] or post['title'] }}" required> value="{{ request.form['title'] or post['title'] }}" required>
<label for="nickname">Nickname</label>
<input name="nickname" id="nickname" value="{{ request.form['nickname'] or post['nickname'] }}" required>
<label for="body">Body</label> <label for="body">Body</label>
<textarea name="body" id="body">{{ request.form['body'] or post['body'] }}</textarea> <textarea name="body" id="body">{{ request.form['body'] or post['body'] }}</textarea>
<label for="file">Body</label>
{% if post['type'] == 'image' %}
<img class="file" src="{{ post['file'] }}">
{% endif %}
{% if post['type'] == 'video' %}
<video class="file" preload="none" controls="" width="500">
<source src="{{ post['file'] }}">
</video>
{% endif %}
<div>
<p>Choose a mp4, webm, gif , png or jpg file.(max 25MB)</p>
<input type="file" placeholder="meme" name="file" id="file"
value="{{ request.form['file'] or post['file'] }}">
</div>
<label for="chosen">Chosen</label><br>
<input id="chosen" name="chosen" value="{{ request.form['chosen'] or post['chosen'] }}">
<input type="submit" value="Save"> <input type="submit" value="Save">
</form> </form>
<hr> <hr>

Loading…
Cancel
Save