flask-htmx-board1/app.py
Simple_Not 25e5430b4c
All checks were successful
continuous-integration/drone/push Build is passing
re ans-post
2024-01-30 00:02:38 +10:00

163 lines
4.8 KiB
Python

from flask import Flask, render_template, request
from flask_assets import Bundle, Environment
from arango import ArangoClient
from minio import Minio
import socket, os
app = Flask(__name__)
assets = Environment(app)
css = Bundle("src/*.css", output="dist/main.css")
# https://unpkg.com/htmx.org
#js = Bundle("src/*.js", output="dist/main.js")
assets.register("css", css)
#assets.register("js", js)
css.build()
#js.build()
docker_short_id = socket.gethostname()
arango_client = ArangoClient(hosts='https://arango.guaranteedstruggle.host')
db = arango_client.db('board1', username='root', password='stolendick527')
# предполагается что меняться список будет весьма редко, поэтому подхватываем при лишь при перезапуске
boards0 = db.collection('boards')
print(boards0)
board_list = [ k['_key'] for k in boards0]
@app.route('/liveness')
def healthx():
return "<h1><center>Liveness check completed</center><h1>"
@app.route('/readiness')
def healthz():
#### TODU return arango check
return "<h1><center>Readiness check completed</center><h1>"
@app.route("/")
def homepage():
return render_template("main-page.html", host_id=docker_short_id, boards=board_list)
@app.route('/db_posts')
@app.route("/db_posts/<target_post_id>")
def page_posts_from_db(target_post_id=None):
postos = db.collection('posts')
postos = [ p for p in postos]
postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
if not target_post_id:
target_post_id = postos[0]['_key']
return render_template("interactive-posts.html", host_id=docker_short_id, postos=postos, target_post_id=target_post_id)
@app.route("/answer_post/<target_post_id>", methods=['POST'])
def answer_post(target_post_id):
postos = db.collection('posts')
postos = [ p for p in postos]
postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
if not target_post_id:
target_post_id = postos[0]['_key']
return render_template("answer-post.html", target_post_id=target_post_id)
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'mp4', 'webm', 'webp'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/post_to_another_post/<post_key>', methods=['POST'])
def post_to_post(post_key):
#### TODO resize pics https://stackoverflow.com/questions/53337318/how-can-i-resize-image-with-pil-on-upload-and-serve-them-with-flask-cloudy
#### TODO allow only imgs, videos, and gifs
if 'file' in request.files:
minioClient = Minio( "static.guaranteedstruggle.host" )
bucket_name = "thread-pics"
files = request.files.getlist("file")
for file in files:
size = os.fstat(file.fileno()).st_size
#### работает ли??
if allowed_file(file.filename):
minioClient.put_object(
bucket_name, file.filename, file, size
)
else:
print(f'somebody tried to put this inside minio: {file.filename} size: {size}')
postos = db.collection('posts')
data = request.form['send_this_text']
metadata = postos.insert({
'texto': data,
'parent_post': f'{post_key}',
'images': []
}, overwrite_mode='update')
metadata = db.collection('post_parents').insert({
'_from': f'posts/{post_key}',
'_to': f'posts/{metadata["_key"]}'
}, overwrite_mode='update')
cursor = db.aql.execute(
"""FOR ppp IN posts
LET children = (FOR v IN 1..9999 OUTBOUND ppp post_parents RETURN v)
UPDATE ppp WITH { children_num : COUNT_DISTINCT( children[*]._key ) } IN posts"""
)
cursor = db.aql.execute(
"""FOR ppp IN posts
LET children = (FOR v IN 1 OUTBOUND ppp post_parents RETURN v)
UPDATE ppp WITH { answers_num : COUNT_DISTINCT( children[*]._key ) } IN posts"""
)
cursor = db.aql.execute(
"""FOR ppp IN posts
LET children0 = (FOR v IN 1 OUTBOUND ppp post_parents RETURN v)
LET children = (FOR c IN children0
SORT c._key DESC
RETURN c)
UPDATE ppp WITH { answers_list : [ children[*]._key, children[*].answers_num, children[*].children_num ] } IN posts"""
)
postos = db.collection('posts')
postos = sorted(postos, key=lambda posto: int(posto['_key']), reverse=False)
return render_template("i-posts.html", host_id=docker_short_id, postos=postos)
#### TODO websockets
#### TODO kafka
#### TODO shards
#### TODO grpc
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')