contentmatcher/upload.py

86 lines
3.2 KiB
Python

import tempfile
import os
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for
)
from werkzeug.utils import secure_filename
from auth import login_required
from config import CONFIG
from create_db import User, Card, get_session, get_engine
import nextcloud_client
import magic
bp = Blueprint('upload', __name__, url_prefix='/upload')
nc = nextcloud_client.Client('https://obzorje.kompot.si')
nc.login(CONFIG['NC_USER'],CONFIG['NC_PASSWORD'])
@bp.route("/", methods=["GET", "POST"])
def index():
username = session["username"]
return render_template("upload.html", username=username)
@bp.route('/uploader', methods = ('GET', 'POST'))
def upload_file():
user_id = session["user_id"]
username = session["username"]
if request.method == 'POST':
#@TODO ta forloop bi lahko flashal postopoma
for upload in request.files.getlist("file"):
filename = secure_filename(upload.filename)
# Is there really a file?
if not filename:
flash('There is no file. Try again?')
return render_template("upload.html", username=username)
#prevent duplicate filenames
Session = get_session()
with Session() as dbsession:
filename_exists = dbsession.query(Card).filter(Card.title == filename).first() != None
dbsession.close()
get_engine().dispose()
if filename_exists:
flash("Filename already in database, please rename if you want to upload: " + filename, 'error')
continue
script_path = os.path.dirname(os.path.abspath(__file__)) #where are we
temp_path = os.path.join(script_path, "temp") #where is the temp file
# a lot of stuff can wrong here and nobody may know
with tempfile.NamedTemporaryFile(dir=temp_path, delete=False) as fp:
fp.write(upload.stream.read())
path = fp.name
fp.close()
if magic.from_file(path, mime=True) == "application/pdf":
nc.put_file("/GIA CLOUD/" + filename, path)
#get public link
public_link = nc.share_file_with_link("/GIA CLOUD/" + filename).get_link()+"/download/"+filename
#add card
card = Card(title=filename, interest_rate=-1.0, owner_id=user_id, item_location=public_link, last_review=None, share_id=0)
flash(f"{filename} uploaded successfully")
Session = get_session()
with Session() as dbsession:
dbsession.add(card)
dbsession.commit()
dbsession.close()
get_engine().dispose()
else:
flash("Please insert a PDF file, support for other formats comming soon...")
#return render_template("upload.html", user_id=user_id, username=username)
os.remove(path)
return render_template("upload.html", user_id=user_id, username=username)