Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: gunicorn main:app --log-file -
28 changes: 28 additions & 0 deletions app/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_migrate import Migrate
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from config import Config

app = Flask(__name__, template_folder='templates')
app.config.from_object(Config)
db = SQLAlchemy(app)
bootstrap = Bootstrap(app)
migrate = Migrate(app, db)
Base = declarative_base()

engine = create_engine(Config.SQLALCHEMY_DATABASE_URI)
metadata = MetaData(bind=engine)
Base.metadata = metadata
ReflectedModels = dict()
metadata.reflect()
for tablename, tableobj in metadata.tables.items():
ReflectedModels[tablename] = type(str(tablename), (Base,), {'__table__' : tableobj })
print("Reflecting {0}".format(tablename))
Session = sessionmaker(bind=engine)
session = Session()

from app import routes, models
Binary file added app/__pycache__/__init__.cpython-38.pyc
Binary file not shown.
Binary file added app/__pycache__/graphs.cpython-38.pyc
Binary file not shown.
Binary file added app/__pycache__/models.cpython-38.pyc
Binary file not shown.
Binary file added app/__pycache__/routes.cpython-38.pyc
Binary file not shown.
29 changes: 29 additions & 0 deletions app/graphs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import plotly
import plotly.graph_objs as go
import chart_studio.plotly as py

import pandas as pd
import numpy as np
import json

def create_plot(pie_results, bar_results):

keys = [i[0] for i in pie_results]
values = [i[1] for i in pie_results]
pie_chart = go.Figure(data=[go.Pie(labels=keys, values=values)])
graphpieJSON = json.dumps(pie_chart, cls=plotly.utils.PlotlyJSONEncoder)

x_values = [i[0] for i in bar_results]
y_values = [i[1] for i in bar_results]
df = pd.DataFrame({'x': x_values, 'y': y_values})
bar_chart = [
go.Bar(
x=df['x'], # assign x as the dataframe column 'x'
y=df['y'],
name="Names frequency"
)
]
graphbarJSON = json.dumps(bar_chart, cls=plotly.utils.PlotlyJSONEncoder)


return graphpieJSON, graphbarJSON
53 changes: 53 additions & 0 deletions app/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, IntegerField, BooleanField
from wtforms.validators import DataRequired

class SubjectForm(FlaskForm):
"""
Form for admin to add or edit a subject
"""
subject_name = StringField('subject_name', validators=[DataRequired()])
submit = SubmitField('Submit')

class StudentForm(FlaskForm):
"""
Form for admin to add or edit a subject
"""
student_name = StringField('student_name', validators=[DataRequired()])
student_surname = StringField('student_surname', validators=[DataRequired()])
student_course = IntegerField('student_course', validators=[DataRequired()])
student_studybook = IntegerField('student_studybook', validators=[DataRequired()])
submit = SubmitField('Submit')

class LabForm(FlaskForm):
"""
Form for admin to add or edit a subject
"""
lab_number = IntegerField('lab_number', validators=[DataRequired()])
subject_id = IntegerField('subject_id', validators=[DataRequired()])
submit = SubmitField('Submit')

class LabResultForm(FlaskForm):
"""
Form for admin to add or edit a subject
"""
lab_id = IntegerField('lab_id', validators=[DataRequired()])
student_id = IntegerField('student_id', validators=[DataRequired()])
is_passed = BooleanField('is_passed')
submit = SubmitField('Submit')

class SkillForm(FlaskForm):
"""
Form for admin to add or edit a subject
"""
subject_id = IntegerField('subject_id', validators=[DataRequired()])
skill_grade = StringField('skill_grade', validators=[DataRequired()])
submit = SubmitField('Submit')

class StudentSkillForm(FlaskForm):
"""
Form for admin to add or edit a subject
"""
student_id = StringField('student_id', validators=[DataRequired()])
skill_id = StringField('skill_id', validators=[DataRequired()])
submit = SubmitField('Submit')
183 changes: 183 additions & 0 deletions app/routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
from flask import abort, flash, redirect, render_template, url_for
from app import app

from functools import wraps
from .models import SubjectForm, LabForm, LabResultForm, StudentForm, SkillForm, StudentSkillForm
from . import session
from . import ReflectedModels, db
from .graphs import create_plot
import sqlalchemy

def table_view(fn):
@wraps(fn)
def view(*args, **kwargs):
table_name = kwargs['table_name']
if not table_name:
return abort(404)
if table_name not in ReflectedModels:
return abort(404)
table_instances = session.query(ReflectedModels[table_name])
table_fields = ReflectedModels[table_name].__table__.columns.keys()
if "%s_id" % table_name in table_fields:
table_instances = table_instances.order_by("%s_id" % table_name).all()
else:
table_instances = table_instances.all()
# return render_template('%s/%ss.html' % (table_name, table_name),
# title="%ss" % table_name, **{'%ss' % table_name: instances})
return render_template('table_instances.html', table_name=table_name,
table_instances=table_instances, table_fields=table_fields)
return view

@app.route('/table/<table_name>', methods=['GET', 'POST'])
@table_view
# @login_required
def list_tables(table_name):
"""
List all table instances
"""
return table_name

def add_table_instance_decorator(fn):
@wraps(fn)
def view(*args, **kwargs):
table_name = kwargs['table_name']
if not table_name:
return abort(404)
if table_name not in ReflectedModels:
return abort(404)
# check_admin()
add_instance = True
form = globals()["".join([i[0].upper() + i[1:] for i in table_name.split("_")]) + "Form"]()
table_fields = ReflectedModels[table_name].__table__.columns.keys()
if form.validate_on_submit():
max_id = session.query(ReflectedModels[table_name]).order_by(getattr(ReflectedModels[table_name], table_name + '_id').desc()).first()
fields = {i: form[i].data for i in table_fields if i != (table_name + '_id')}
fields[table_name + '_id'] = getattr(max_id, table_name + '_id') + 1
try:
table_instance = ReflectedModels[table_name](**fields)
# add department to the database
session.add(table_instance)
session.commit()
flash('You have successfully added a new table_instance.')
except Exception as e:
# in case department name already exists
print(e)
session.rollback()
flash("Error: Can't create instance (check existence of instances with selected id or correctness of other fields)")

# redirect to departments page
return redirect(url_for('list_tables', table_name=table_name))

# load department template
return render_template('table_instance.html', action="Add",
add_instance=add_instance, form=form,
table_name=table_name)
return view

@app.route('/table/<table_name>/add', methods=['GET', 'POST'])
@add_table_instance_decorator
# @login_required
def add_table_instance(table_name):
"""
Add a table_instance to the database
"""
return table_name

def edit_table_instance_decorator(fn):
@wraps(fn)
def view(*args, **kwargs):
table_name = kwargs['table_name']
instance_id = kwargs['id']
if not table_name or not instance_id:
return abort(404)
if table_name not in ReflectedModels:
return abort(404)
# check_admin()
add_instance = False
try:
table_fields = ReflectedModels[table_name].__table__.columns.keys()
table_instance = session.query(ReflectedModels[table_name]).filter_by(**{table_name+'_id': instance_id}).first()
if not table_instance:
abort(404)
form = globals()["".join([i[0].upper() + i[1:] for i in table_name.split("_")]) + "Form"]
form = form(obj=table_instance)
except:
abort(404)
if form.validate_on_submit():
try:
for table_field in table_fields:
if table_field != (table_name + '_id'):
setattr(table_instance, table_field, form[table_field].data)
session.commit()
flash('You have successfully edited the table_instance.')
except Exception as e:
# in case department name already exists
print(e)
session.rollback()
flash("Error: Can't edit instance (check existence of instances with selected id or correctness of other fields)")
# redirect to the departments page
return redirect(url_for('list_tables', table_name=table_name))

for table_field in table_fields:
if table_field != (table_name + '_id'):
setattr(form, table_field, getattr(table_instance, table_field))

return render_template('table_instance.html', action="Edit",
add_instance=add_instance, form=form,
table_name=table_name)
return view

@app.route('/table/<table_name>/edit/<int:id>', methods=['GET', 'POST'])
@edit_table_instance_decorator
# @login_required
def edit_table_instance(table_name, id):
"""
Edit a table_instance to the database
"""
return table_name

def delete_table_instance_decorator(fn):
@wraps(fn)
def view(*args, **kwargs):
table_name = kwargs['table_name']
instance_id = kwargs['id']
if not table_name or not instance_id:
return abort(404)
if table_name not in ReflectedModels:
return abort(404)
# check_admin()
add_instance = False
table_fields = ReflectedModels[table_name].__table__.columns.keys()
table_instance = session.query(ReflectedModels[table_name]).filter_by(**{table_name+'_id': instance_id}).first()
if not table_instance:
abort(404)
session.delete(table_instance)
session.commit()
flash('You have successfully deleted the table_instance.')
return redirect(url_for('list_tables', table_name=table_name))
return view

@app.route('/table/<table_name>/delete/<int:id>', methods=['GET', 'POST'])
@delete_table_instance_decorator
# @login_required
def delete_table_instance(table_name, id):
"""
Delete a table_instance to the database
"""
return table_name

@app.route('/')
@app.route('/index')
def home_page():
sql_cmd_graph1 = sqlalchemy.text(''' select student.student_name, count(lab_result.lab_id)
from student, lab_result
where student.student_id = lab_result.student_id
group by student.student_name''')
results_graph1 = session.execute(sql_cmd_graph1).fetchall()
sql_cmd_graph2 = sqlalchemy.text(''' select subject.subject_name, count(lab.lab_id)
from lab, subject
where lab.subject_id = subject.subject_id
group by subject.subject_name''')
results_graph2 = session.execute(sql_cmd_graph2).fetchall()
graphsPie, graphsBar = create_plot(results_graph1, results_graph2)
return render_template('index.html', plot1=graphsPie, plot2=graphsBar)
Loading