From e6975f21ce9449dd835d118e61f4b8567ef8b8f0 Mon Sep 17 00:00:00 2001 From: DeadSpoon Date: Wed, 15 Jan 2020 03:24:54 +0200 Subject: [PATCH] Add files via upload --- Procfile | 1 + app.py | 132 ++++++++++++++++++++++++++++++++++++++++++++ documents.py | 113 +++++++++++++++++++++++++++++++++++++ execute_sql_file.py | 9 +++ fields.py | 104 ++++++++++++++++++++++++++++++++++ flask_app.py | 4 ++ local_run.py | 6 ++ requirements.txt | 37 +++++++++++++ runtime.txt | 1 + templates.py | 113 +++++++++++++++++++++++++++++++++++++ users.py | 104 ++++++++++++++++++++++++++++++++++ 11 files changed, 624 insertions(+) create mode 100644 Procfile create mode 100644 app.py create mode 100644 documents.py create mode 100644 execute_sql_file.py create mode 100644 fields.py create mode 100644 flask_app.py create mode 100644 local_run.py create mode 100644 requirements.txt create mode 100644 runtime.txt create mode 100644 templates.py create mode 100644 users.py diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..93f040b --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn app:app --log-file - \ No newline at end of file diff --git a/app.py b/app.py new file mode 100644 index 0000000..7725eed --- /dev/null +++ b/app.py @@ -0,0 +1,132 @@ +import plotly +import plotly.plotly as py +import plotly.graph_objs as go +import json +import hashlib +from flask import Flask, render_template, request, redirect, url_for +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String, Date, ForeignKey +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func +from dao.orm.model import * +from dao.credentials import * +from dao.db import PostgresDb +from forms.dashboard_form import DashboardForm +from forms.users_form import * +from flask_app import * +from execute_sql_file import * + + +Base = declarative_base() + +app = Flask(__name__) + +from users import * +from documents import * +from templates import * +from fields import * + +@app.route('/', methods=['GET', 'POST']) +def root(): + return render_template('index.html') + + +# @app.route('/search', methods=['GET', 'POST']) +# def search(): +# search_form = SearchForm() +# +# if request.method == 'GET': +# return render_template('search.html', form=search_form, result=None) +# else: +# return render_template('search.html', form=search_form, result=search_form.get_result()) + + +@app.route("/dashboard", methods=['GET', 'POST']) +def dashboard(): + db = PostgresDb() + + form = DashboardForm() + + username = form.username.data + + template_fields = user_template_field_count(username) + + templates = [] + field_counts = [] + + for (temp, field_count) in template_fields.items(): + templates.append(temp.template_name) + field_counts.append(field_count) + + bar = go.Bar( + x=templates, + y=field_counts + ) + + dates = user_document_upload_date(username) + + x = [] + y = [] + + for (date, document_count) in dates.items(): + x.append(date) + y.append(document_count) + + scatter = go.Scatter( + x=x, + y=y, + ) + + data = [bar, scatter] + + ids = [0, 1] + names = ["Template field count", "Field and templates count for each user"] + graph_json = json.dumps(data, cls=plotly.utils.PlotlyJSONEncoder) + return render_template('dashboard.html', form=form, form_name="Username", action="dashboard", username=username, + graphJSON=graph_json, ids=ids, names=names) + + +def user_template_field_count(username): + db = PostgresDb() + + if not username: + template_fields = db.sqlalchemy_session.query(Templates, Fields).join(Fields).all() + temp = db.sqlalchemy_session.query(Templates).all() + else: + template_fields = db.sqlalchemy_session.query(Templates, Fields).join(Users).filter( + Users.username == username).join(Fields).all() + temp = db.sqlalchemy_session.query(Templates).join(Users).filter(Users.username == username).all() + + templates = {} + + for t in temp: + templates[t] = 0 + + for (template, field_count) in template_fields: + key = template + templates[key] += 1 + + return templates + + +def user_document_upload_date(username): + db = PostgresDb() + + if not username: + documents = db.sqlalchemy_session.query(Documents).all() + else: + documents = db.sqlalchemy_session.query(Documents).join(Users, Users.user_id == Documents.user_id).filter( + Users.username == username).all() + + documents_upload_date = {} + + for document in documents: + key = document.document_upload_date + if key in documents_upload_date: + documents_upload_date[key] += 1 + else: + documents_upload_date[key] = 1 + + return documents_upload_date diff --git a/documents.py b/documents.py new file mode 100644 index 0000000..0e0c74d --- /dev/null +++ b/documents.py @@ -0,0 +1,113 @@ +import datetime +import hashlib +import uuid + +from flask import * +from sqlalchemy.exc import DatabaseError + +from flask_app import * + +from dao.db import * +from dao.orm.model import * +from forms.documents_form import * + + +@app.route('/documents', methods=['GET']) +def documents(): + db = PostgresDb() + + result = db.sqlalchemy_session.query(Documents).all() + return render_template('documents.html', documents=result) + + +@app.route('/new_document', methods=['GET', 'POST']) +def new_document(): + form = DocumentsForm() + if request.method == 'POST': + if not form.validate(): + return render_template('documents_form.html', form=form, form_name="New document", action="new_document", + method='POST') + else: + name = form.document_name.data + user_id = form.user_id.data + + document = Documents( + user_id=user_id, + document_name=name, + document_file_path='/{}/{}_{}.doc'.format(user_id, name, uuid.uuid1()), + document_upload_date=datetime.date.today() + ) + + db = PostgresDb() + db.sqlalchemy_session.add(document) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/documents') + + return redirect('/documents') + + return render_template('documents_form.html', form=form, form_name="New document", action="new_document") + + +@app.route('/edit_document', methods=['GET', 'POST']) +def edit_document(): + form = DocumentsForm() + + if request.method == 'GET': + + document_id = request.args.get('document_id') + db = PostgresDb() + document = db.sqlalchemy_session.query(Documents).filter(Documents.document_id == document_id).one() + + form.user_id.data = document.user_id + form.document_name.data = document.document_name + + return render_template('documents_form.html', form=form, form_name="Edit document", + action="edit_document?document_id=" + request.args.get('document_id')) + else: + if not form.validate(): + return render_template('documents_form.html', form=form, form_name="Edit document", + action="edit_document?document_id=" + request.args.get('document_id')) + else: + db = PostgresDb() + + document = db.sqlalchemy_session.query(Documents).filter(Documents.document_id == request.args.get('document_id')).one() + + name = form.document_name.data + user_id = form.user_id.data + + document.user_id = user_id, + document.document_name = name, + document.document_file_path = '/{}/{}_{}.doc'.format(user_id, name, uuid.uuid1()), + document.document_upload_date = datetime.date.today() + + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/documents') + + return redirect('/documents') + + +@app.route('/delete_document', methods=['POST']) +def delete_document(): + document_id = request.form['document_id'] + + db = PostgresDb() + + result = db.sqlalchemy_session.query(Documents).filter(Documents.document_id == document_id).one() + + db.sqlalchemy_session.delete(result) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/documents') + + return redirect('/documents') diff --git a/execute_sql_file.py b/execute_sql_file.py new file mode 100644 index 0000000..49b91c5 --- /dev/null +++ b/execute_sql_file.py @@ -0,0 +1,9 @@ +from dao.db import PostgresDb + + +def execute_sql(path): + with open(path) as fp: + db = PostgresDb() + engine = db.sqlalchemy_engine + text = fp.read() + engine.execute(text) diff --git a/fields.py b/fields.py new file mode 100644 index 0000000..d998d51 --- /dev/null +++ b/fields.py @@ -0,0 +1,104 @@ +import datetime +import hashlib +import uuid + +from flask import * +from sqlalchemy.exc import DatabaseError + +from flask_app import * + +from dao.db import * +from dao.orm.model import * +from forms.fields_form import * + + +@app.route('/fields', methods=['GET']) +def fields(): + db = PostgresDb() + + result = db.sqlalchemy_session.query(Fields).all() + return render_template('fields.html', fields=result) + + +@app.route('/new_field', methods=['GET', 'POST']) +def new_field(): + form = FieldsForm() + if request.method == 'POST': + if not form.validate(): + return render_template('fields_form.html', form=form, form_name="New field", action="new_field", + method='POST') + else: + field = Fields( + template_id=form.template_id.data, + field_name=form.field_name.data, + field_content=form.field_content.data, + ) + + db = PostgresDb() + db.sqlalchemy_session.add(field) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/fields') + + return redirect('/fields') + + return render_template('fields_form.html', form=form, form_name="New field", action="new_field") + + +@app.route('/edit_field', methods=['GET', 'POST']) +def edit_field(): + form = FieldsForm() + + if request.method == 'GET': + + field_id = request.args.get('field_id') + db = PostgresDb() + field = db.sqlalchemy_session.query(Fields).filter(Fields.field_id == field_id).one() + + form.template_id.data = field.template_id + form.field_name.data = field.field_name + form.field_content.data = field.field_content + + return render_template('fields_form.html', form=form, form_name="Edit field", action="edit_field?field_id=" + request.args.get('field_id')) + else: + if not form.validate(): + return render_template('fields_form.html', form=form, form_name="Edit field", action="edit_field?field_id=" + request.args.get('field_id')) + else: + db = PostgresDb() + + field = db.sqlalchemy_session.query(Fields).filter(Fields.field_id == request.args.get('field_id')).one() + + field.template_id = form.template_id.data + field.field_name = form.field_name.data + field.field_content = form.field_content.data + + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/fields') + + return redirect('/fields') + + +@app.route('/delete_field', methods=['POST']) +def delete_field(): + field_id = request.form['field_id'] + + db = PostgresDb() + + result = db.sqlalchemy_session.query(Fields).filter(Fields.field_id == field_id).one() + + db.sqlalchemy_session.delete(result) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/fields') + + return redirect('/fields') diff --git a/flask_app.py b/flask_app.py new file mode 100644 index 0000000..e821598 --- /dev/null +++ b/flask_app.py @@ -0,0 +1,4 @@ +from flask import Flask + +app = Flask(__name__) +app.secret_key = 'development key' \ No newline at end of file diff --git a/local_run.py b/local_run.py new file mode 100644 index 0000000..b06cff2 --- /dev/null +++ b/local_run.py @@ -0,0 +1,6 @@ +from app import * + + +if __name__ == '__main__': + app.debug = True + app.run() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..91c6bf1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,37 @@ +psycopg2-binary +wtforms +sqlalchemy +certifi==2018.4.16 +chardet==3.0.4 +Click==7.0 +cycler==0.10.0 +decorator==4.3.0 +Django==2.0.5 +doxypypy==0.8.8.6 +Flask==1.0.2 +Flask-WTF==0.14.2 +idna==2.6 +ipython-genutils==0.2.0 +itsdangerous==1.1.0 +Jinja2==2.10 +jsonschema==2.6.0 +jupyter-core==4.4.0 +kiwisolver==1.0.1 +MarkupSafe==1.1.1 +matplotlib==3.0.2 +nbformat==4.4.0 +numpy==1.16.1 +pandas==0.24.1 +Pillow==5.4.1 +plotly==2.5.1 +pyparsing==2.3.1 +python-dateutil==2.8.0 +pytz==2018.4 +PyYAML==3.13 +requests==2.18.4 +six==1.11.0 +traitlets==4.3.2 +urllib3==1.22 +Werkzeug==0.15.1 +wordcloud==1.5.0 +gunicorn==19.9.0 \ No newline at end of file diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..881a2db --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.7.0 diff --git a/templates.py b/templates.py new file mode 100644 index 0000000..d27fb22 --- /dev/null +++ b/templates.py @@ -0,0 +1,113 @@ +import datetime +import hashlib +import uuid + +from flask import * +from sqlalchemy.exc import DatabaseError + +from flask_app import * + +from dao.db import * +from dao.orm.model import * +from forms.templates_form import * + + +@app.route('/templates', methods=['GET']) +def templates(): + db = PostgresDb() + + result = db.sqlalchemy_session.query(Templates).all() + return render_template('templates.html', templates=result) + + +@app.route('/new_template', methods=['GET', 'POST']) +def new_template(): + form = TemplatesForm() + if request.method == 'POST': + if not form.validate(): + return render_template('templates_form.html', form=form, form_name="New template", action="new_template", + method='POST') + else: + name = form.template_name.data + user_id = form.user_id.data + + template = Templates( + user_id=user_id, + template_name=name, + template_file_path='/{}/{}_{}.doc'.format(user_id, name, uuid.uuid1()), + template_upload_date=datetime.date.today() + ) + + db = PostgresDb() + db.sqlalchemy_session.add(template) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/templates') + + return redirect('/templates') + + return render_template('templates_form.html', form=form, form_name="New template", action="new_template") + + +@app.route('/edit_template', methods=['GET', 'POST']) +def edit_template(): + form = TemplatesForm() + + if request.method == 'GET': + + template_id = request.args.get('template_id') + db = PostgresDb() + template = db.sqlalchemy_session.query(Templates).filter(Templates.template_id == template_id).one() + + form.user_id.data = template.user_id + form.template_name.data = template.template_name + + return render_template('templates_form.html', form=form, form_name="Edit template", + action="edit_template?template_id=" + request.args.get('template_id')) + else: + if not form.validate(): + return render_template('templates_form.html', form=form, form_name="Edit template", + action="edit_template?template_id=" + request.args.get('template_id')) + else: + db = PostgresDb() + + template = db.sqlalchemy_session.query(Templates).filter(Templates.template_id == request.args.get('template_id')).one() + + name = form.template_name.data + user_id = form.user_id.data + + template.user_id = user_id, + template.template_name = name, + template.template_file_path = '/{}/{}_{}.doc'.format(user_id, name, uuid.uuid1()), + template.template_upload_date = datetime.date.today() + + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/templates') + + return redirect('/templates') + + +@app.route('/delete_template', methods=['POST']) +def delete_template(): + template_id = request.form['template_id'] + + db = PostgresDb() + + result = db.sqlalchemy_session.query(Templates).filter(Templates.template_id == template_id).one() + + db.sqlalchemy_session.delete(result) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/templates') + + return redirect('/templates') diff --git a/users.py b/users.py new file mode 100644 index 0000000..8a2cd86 --- /dev/null +++ b/users.py @@ -0,0 +1,104 @@ +import hashlib + +from flask import * +from sqlalchemy.exc import DatabaseError + +from flask_app import * + +from dao.db import * +from dao.orm.model import * +from forms.users_form import * + + +@app.route('/users', methods=['GET']) +def users(): + db = PostgresDb() + + result = db.sqlalchemy_session.query(Users).all() + return render_template('users.html', users=result) + + +@app.route('/new_user', methods=['GET', 'POST']) +def new_user(): + form = UsersForm() + if request.method == 'POST': + if not form.validate(): + return render_template('users_form.html', form=form, form_name="New user", action="new_user", + method='POST') + else: + user = Users( + username=form.username.data, + email=form.email.data, + password_hash=hashlib.sha256(form.password.data.encode('utf-8')).hexdigest(), + ) + + db = PostgresDb() + db.sqlalchemy_session.add(user) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/users') + + return redirect('/users') + + return render_template('users_form.html', form=form, form_name="New user", action="new_user") + + +@app.route('/edit_user', methods=['GET', 'POST']) +def edit_user(): + form = UsersForm() + + if request.method == 'GET': + + user_id = request.args.get('user_id') + db = PostgresDb() + user = db.sqlalchemy_session.query(Users).filter(Users.user_id == user_id).one() + + form.username.data = user.username + form.email.data = user.email + form.password.data = '' + + return render_template('users_form.html', form=form, form_name="Edit user", + action="edit_user?user_id=" + request.args.get('user_id')) + else: + if not form.validate(): + return render_template('users_form.html', form=form, form_name="Edit user", + action="edit_user?user_id=" + request.args.get('user_id')) + else: + db = PostgresDb() + + user = db.sqlalchemy_session.query(Users).filter(Users.user_id == request.args.get('user_id')).one() + + user.username = form.username.data + user.email = form.email.data + user.password_hash = hashlib.sha256(form.password.data.encode('utf-8')).hexdigest() + + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/users') + + return redirect('/users') + + +@app.route('/delete_user', methods=['POST']) +def delete_user(): + user_id = request.form['user_id'] + + db = PostgresDb() + + result = db.sqlalchemy_session.query(Users).filter(Users.user_id == user_id).one() + + db.sqlalchemy_session.delete(result) + try: + db.sqlalchemy_session.commit() + except DatabaseError as e: + db.sqlalchemy_session.rollback() + print(e) + return redirect('/users') + + return redirect('/users')