feat: post reader
This commit is contained in:
parent
4a216d7a81
commit
9de9871b40
8 changed files with 109 additions and 20 deletions
|
@ -2,7 +2,7 @@ from os import path as os_path
|
|||
|
||||
from config import Config
|
||||
from flask import Blueprint, flash, redirect, render_template, request
|
||||
from utils.misc import get_posts
|
||||
from utils.misc import get_posts, post_filename
|
||||
from werkzeug import Response
|
||||
|
||||
name = __name__.split(".")[-1]
|
||||
|
@ -36,7 +36,7 @@ def new_post() -> Response:
|
|||
|
||||
# creating the post
|
||||
with open(
|
||||
f"{Config.data_dir}/{filename}.txt",
|
||||
post_filename(filename),
|
||||
"w",
|
||||
encoding="utf-8",
|
||||
) as f:
|
||||
|
|
|
@ -1,11 +1,36 @@
|
|||
from config import Config
|
||||
from flask import Blueprint, render_template
|
||||
from flask import Blueprint, flash, redirect, render_template
|
||||
from utils.misc import delete_post, get_post, post_filename
|
||||
from werkzeug import Response
|
||||
|
||||
name = __name__.split(".")[-1]
|
||||
router = Blueprint(name, __name__)
|
||||
|
||||
|
||||
@router.route(f"/{name}")
|
||||
def read() -> str:
|
||||
@router.route(f"/{name}/<int:file>")
|
||||
def read(file: int) -> str:
|
||||
"""read page"""
|
||||
return render_template("read.html", config=Config, page_name=name)
|
||||
filename = post_filename(file)
|
||||
content = get_post(filename)
|
||||
|
||||
return render_template(
|
||||
"read.html",
|
||||
config=Config,
|
||||
read_page=True,
|
||||
page_name=name,
|
||||
name=f"{file}.txt",
|
||||
file=content,
|
||||
)
|
||||
|
||||
|
||||
@router.route(f"/{name}/<int:file>", methods=["POST"])
|
||||
def remove_post(file: int) -> Response:
|
||||
"""remove a post"""
|
||||
if Config.is_logged():
|
||||
filename = post_filename(file)
|
||||
if delete_post(filename):
|
||||
flash(f"{filename} deleted.")
|
||||
else:
|
||||
flash(f"{filename} doesn't exists")
|
||||
|
||||
return redirect("/")
|
||||
|
|
|
@ -25,7 +25,7 @@ span#login-form {
|
|||
}
|
||||
|
||||
/* button stylised as text */
|
||||
span#login-form button {
|
||||
span button {
|
||||
margin-left: 0.4em;
|
||||
background: none;
|
||||
border: none;
|
||||
|
@ -81,3 +81,8 @@ ul {
|
|||
li {
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
|
||||
/* Edit button */
|
||||
summary {
|
||||
display: inline;
|
||||
}
|
||||
|
|
|
@ -9,5 +9,29 @@
|
|||
d="M5 21a7 7 0 1 1 14 0M16 7a4 4 0 1 1-8 0 4 4 0 0 1 8 0Z"
|
||||
/></svg
|
||||
></a>
|
||||
{% endif %} {% if read_page and config.is_logged() and file %}
|
||||
<details>
|
||||
<summary>
|
||||
<svg width="30px" fill="none" viewBox="0 0 24 24">
|
||||
<path
|
||||
stroke="#000"
|
||||
d="M3.8 12.963 2 18l4.8-.63L18.11 6.58a2.612 2.612 0 0 0-3.601-3.785L3.8 12.963z"
|
||||
/>
|
||||
</svg>
|
||||
</summary>
|
||||
{% include "post.html" %}
|
||||
</details>
|
||||
|
||||
<span
|
||||
><form method="post">
|
||||
<button type="submit">
|
||||
<svg width="30px" fill="none" viewBox="0 0 24 24">
|
||||
<path
|
||||
stroke="#000"
|
||||
d="m18 6-.8 12.013c-.071 1.052-.106 1.578-.333 1.977a2 2 0 0 1-.866.81c-.413.2-.94.2-1.995.2H9.994c-1.055 0-1.582 0-1.995-.2a2 2 0 0 1-.866-.81c-.227-.399-.262-.925-.332-1.977L6 6M4 6h16m-4 0-.27-.812c-.263-.787-.394-1.18-.637-1.471a2 2 0 0 0-.803-.578C13.938 3 13.524 3 12.694 3h-1.388c-.829 0-1.244 0-1.596.139a2 2 0 0 0-.803.578c-.243.29-.374.684-.636 1.471L8 6m6 4v7m-4-7v7"
|
||||
/>
|
||||
</svg>
|
||||
</button></form
|
||||
></span>
|
||||
{% endif %}
|
||||
</header>
|
||||
|
|
|
@ -6,7 +6,9 @@
|
|||
{% include "header.html" %}
|
||||
|
||||
<body>
|
||||
{% include "post.html" %}
|
||||
{% if config.is_logged() %}
|
||||
<aside>{% include "post.html" %}</aside>
|
||||
{% endif %}
|
||||
|
||||
<main>
|
||||
<p>{{ "".join(get_flashed_messages()) | safe }}</p>
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
{% if config.is_logged() %}
|
||||
<aside>
|
||||
<form action="/" method="post">
|
||||
<textarea name="p"></textarea>
|
||||
<form action="/" method="post">
|
||||
<textarea name="p">{{ file }}</textarea>
|
||||
<br />
|
||||
<button type="submit">send</button>
|
||||
</form>
|
||||
</aside>
|
||||
</form>
|
||||
{% endif %}
|
||||
|
|
|
@ -6,11 +6,17 @@
|
|||
{% include "header.html" %}
|
||||
<body>
|
||||
<main>
|
||||
<!-- TODO: show a specific post -->
|
||||
{% if file %}
|
||||
<h3>{{ name }}</h3>
|
||||
|
||||
<!-- TODO: button to edit the post if logged -->
|
||||
|
||||
<!-- TODO: button to delete the post if logged -->
|
||||
<p>{{ file }}</p>
|
||||
{% else %}
|
||||
<p>{{ name }} doesn't exists</p>
|
||||
{% endif %}
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<a href="/">back to index</a>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,10 +1,39 @@
|
|||
from os import listdir
|
||||
from os import path as os_path
|
||||
from os import remove as os_remove
|
||||
|
||||
from config import Config
|
||||
|
||||
|
||||
def get_posts():
|
||||
def post_filename(number: int):
|
||||
"""get filename of post"""
|
||||
return f"{Config.data_dir}/{number}.txt"
|
||||
|
||||
|
||||
def get_posts() -> list[str]:
|
||||
"""get posts list"""
|
||||
return [
|
||||
os_path.join(Config.data_dir, basename) for basename in listdir(Config.data_dir)
|
||||
]
|
||||
|
||||
|
||||
def get_post(filename: str) -> str | None:
|
||||
"""get a post"""
|
||||
try:
|
||||
open(filename)
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
else:
|
||||
with open(filename, "r") as reader:
|
||||
return reader.read()
|
||||
|
||||
|
||||
def delete_post(filename: str) -> bool:
|
||||
"""delete a post"""
|
||||
try:
|
||||
open(filename)
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
else:
|
||||
os_remove(filename)
|
||||
return True
|
||||
|
|
Loading…
Reference in a new issue