From 33bf7d5264dabb3214e79727a49ab74fbf439e5f Mon Sep 17 00:00:00 2001 From: user86 Date: Tue, 6 Oct 2020 19:22:32 +0530 Subject: [PATCH] Added pdf/txt support and quiz template --- app.py | 48 +++++++++++++++++++++++++++++++++---------- info.txt | 1 + pdf/test.pdf | Bin 0 -> 35281 bytes pdf/test.txt | 1 - requirements.txt | 1 + templates/index.html | 10 ++++----- templates/quiz.html | 23 +++++++++++++++++++++ 7 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 info.txt create mode 100644 pdf/test.pdf delete mode 100644 pdf/test.txt create mode 100644 templates/quiz.html diff --git a/app.py b/app.py index e6e41a1..fa98df7 100644 --- a/app.py +++ b/app.py @@ -1,30 +1,56 @@ -from flask import Flask, render_template +import os +from flask import Flask, render_template, redirect, url_for from flask.globals import request from werkzeug.utils import secure_filename +from PyPDF2 import PdfFileReader + +# Constants +UPLOAD_FOLDER = './pdf/' + # Init an app object app = Flask(__name__) - -UPLOAD_PATH = './pdf/' +app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER @app.route('/') def index(): """ The landing page for the app """ - return render_template('index.html') # render foe template from ./templates + return render_template('index.html') -@app.route('/upload', methods=['GET', 'POST']) -def file_upload(): +@app.route('/quiz', methods=['GET', 'POST']) +def quiz(): + UPLOAD_STATUS = False if request.method == 'POST': try: uploaded_file = request.files['file'] - uploaded_file.save( - UPLOAD_PATH + secure_filename(uploaded_file.filename)) - uploaded = True - return render_template('index.html', uploaded=uploaded) + # Make directory to store uploaded files + if not os.path.isdir('./pdf'): + os.mkdir('./pdf') + # Save uploaded file + uploaded_file.save(os.path.join( + app.config['UPLOAD_FOLDER'], secure_filename(uploaded_file.filename))) + UPLOAD_STATUS = True + + # Identify file type and other stuff + uploaded_content = None + file_exten = uploaded_file.filename.rsplit('.', 1)[1].lower() + if file_exten == 'pdf': + # TODO: Move PDF2Text conversion to another file + print('PDF detected') + with open(os.path.join( + app.config['UPLOAD_FOLDER'], secure_filename(uploaded_file.filename)), 'rb') as pdf_file: + pdf_reader = PdfFileReader(pdf_file) + uploaded_content = pdf_reader.getPage(0).extractText() + print(uploaded_content) + else: + # Read text file and store contents + pass + except Exception as e: - return 'failed to upload file' + print(e) + return render_template('quiz.html', uploaded=UPLOAD_STATUS, pdftext=uploaded_content) if __name__ == "__main__": diff --git a/info.txt b/info.txt new file mode 100644 index 0000000..5639b0b --- /dev/null +++ b/info.txt @@ -0,0 +1 @@ +I have worked as a backend developer for creating REST API based based systems and worked with front-end integration for MEAN stack apps. For developing apps with a decoupled architecture. I have focused on security and performance to improve response time. I am well versed in Python, NodeJS and related tools like redis for building and maintaining a scalable architecture. I also have deployed production ready apps used by hundreds of people using AWS EC2, S3 and other cloud based tools. I frequently contribute to open source and support open source tools by creating issues, PRs for tools that I use frequently to try and give back to the community. \ No newline at end of file diff --git a/pdf/test.pdf b/pdf/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a16ab9d6be3b9750b813609b022b36ec1085eb36 GIT binary patch literal 35281 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%0Dcf?zKIfc>eq?>G}%1 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 literal 0 HcmV?d00001 diff --git a/pdf/test.txt b/pdf/test.txt deleted file mode 100644 index af27ff4..0000000 --- a/pdf/test.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test file. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 2f1c9d6..2f1f862 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ itsdangerous==1.1.0 Jinja2==2.11.2 MarkupSafe==1.1.1 pkg-resources==0.0.0 +PyPDF2==1.26.0 Werkzeug==1.0.1 diff --git a/templates/index.html b/templates/index.html index fae04c3..a7916ae 100644 --- a/templates/index.html +++ b/templates/index.html @@ -4,15 +4,13 @@ - Document + Home - {% if uploaded == true %} -

Your file was uploaded successfully

- {% endif %} -
- + + +
diff --git a/templates/quiz.html b/templates/quiz.html new file mode 100644 index 0000000..5f728c9 --- /dev/null +++ b/templates/quiz.html @@ -0,0 +1,23 @@ + + + + + + + Your quiz will appear here + + + + {% if uploaded == true %} +

Your file was uploaded successfully

+

Your quiz will appear here

+ Contents of your file +
+
+ {{ pdftext }} + {% else %} +

Could not upload file

+ {% endif %} + + + \ No newline at end of file