from os import path from flask import render_template, Blueprint, request, session, flash from flask import send_from_directory, redirect, url_for, current_app from werkzeug.utils import secure_filename from secrets import token_urlsafe from suchwow import wownero from suchwow import config from suchwow.models import Post, Comment from suchwow.utils.decorators import login_required, profile_required from suchwow.utils.helpers import allowed_file bp = Blueprint("post", "post") @bp.route("/posts/top") def top(): top_posts = {} posts = Post.select() for post in posts: transfers = [] incoming = wownero.Wallet().incoming_transfers(post.account_index) if "transfers" in incoming: for xfer in incoming["transfers"]: transfers.append(wownero.from_atomic(xfer["amount"])) total = sum(transfers) if total > 0: top_posts[float(total)] = post return render_template("post/top.html", posts=sorted(top_posts.items(), reverse=True)) @bp.route("/post/") def read(id): if Post.filter(id=id): wallet = wownero.Wallet() post = Post.get(id=id) comments = Comment.select().where(Comment.post==post.id) if wallet.connected: address = wallet.get_address(account=post.account_index) transfers = wallet.transfers(account=post.account_index) else: address = "?" transfers = "?" return render_template( "post/read.html", post=post, address=address, comments=comments, transfers=transfers ) else: flash("No meme there, brah") return redirect(url_for("index")) @bp.route("/post/create", methods=["GET", "POST"]) @login_required @profile_required def create(): if request.method == "POST": submitter = session["auth"]["preferred_username"] if submitter in config.BANNED_USERS: reason = config.BANNED_USERS[submitter] flash(f"You can't post for now: {reason}") return redirect("/") post_title = request.form.get("title") # check if the post request has the file part if "file" not in request.files: flash("You didn't upload a caliente meme, bro! You're fuckin up!") return redirect(request.url) file = request.files["file"] # if user does not select file, browser also # submit an empty part without filename if file.filename == "": flash("You didn't upload a caliente meme, bro! You're fuckin up!") return redirect(request.url) if post_title is "": flash("You didn't give your meme a spicy title, bro! You're fuckin up!") return redirect(request.url) if file and allowed_file(file.filename): filename = "{}-{}".format( token_urlsafe(12), secure_filename(file.filename) ) save_path_base = path.join(current_app.config["DATA_FOLDER"], "uploads") save_path = path.join(save_path_base, filename) file.save(save_path) try: wallet = wownero.Wallet() account_index = wallet.new_account() except: account_index = 0 post = Post( title=post_title, text=request.form.get("text", ""), submitter=submitter, image_name=filename, account_index=account_index, address_index=0 ) post.save() return redirect(url_for("post.read", id=post.id)) return render_template("post/create.html") @bp.route("/post//delete") @login_required def delete(id): filtered = Post.filter(id=id) user = session["auth"]["preferred_username"] if filtered: post = filtered.first() if user == post.submitter: post.delete_instance() flash("Deleted that shit, brah!") return redirect(url_for("index")) else: flash("You can't delete a meme you don't own, brah") return redirect(url_for("post.read", id=post.id)) else: flash("No meme there, brah") return redirect(url_for("index")) @bp.route("/uploads/") def uploaded_file(filename): file_path = path.join(current_app.config["DATA_FOLDER"], "uploads") return send_from_directory(file_path, filename)