From 3db3f20fb22ea2acb458fce0d04f6fa3ebb99c44 Mon Sep 17 00:00:00 2001 From: Mo8it Date: Thu, 18 Mar 2021 14:53:55 +0100 Subject: [PATCH] Init commit --- .gitignore | 2 + DB.drawio | 1 + advlabdb/__init__.py | 10 ++ advlabdb/models.py | 137 ++++++++++++++++++++++++++ advlabdb/routes.py | 5 + poetry.lock | 225 +++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 17 ++++ run.py | 4 + testDB.py | 85 ++++++++++++++++ 9 files changed, 486 insertions(+) create mode 100644 .gitignore create mode 100644 DB.drawio create mode 100644 advlabdb/__init__.py create mode 100644 advlabdb/models.py create mode 100644 advlabdb/routes.py create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 run.py create mode 100644 testDB.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7dce56b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +advLab.db +*.pyc diff --git a/DB.drawio b/DB.drawio new file mode 100644 index 0000000..4acdbcd --- /dev/null +++ b/DB.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/advlabdb/__init__.py b/advlabdb/__init__.py new file mode 100644 index 0000000..bd5b34c --- /dev/null +++ b/advlabdb/__init__.py @@ -0,0 +1,10 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy + +app = Flask(__name__) +app.config["SECRET_KEY"] = "dev" +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///../advLab.db" +db = SQLAlchemy(app) + +from advlabdb import routes +from advlabdb import models diff --git a/advlabdb/models.py b/advlabdb/models.py new file mode 100644 index 0000000..0ad489e --- /dev/null +++ b/advlabdb/models.py @@ -0,0 +1,137 @@ +""" +See the file DB.drawio for the design of the database. It can be opened in the internet browser with the website: +https://app.diagrams.net + +For more information about the implementation, see the part to Models in the documentation of Flask-SQLAlchemy: +https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/ +""" + +# Importing the database instance +from advlabdb import db + + +class Student(db.Model): + id = db.Column(db.Integer, primary_key=True) + student_number = db.Column(db.Integer, nullable=False, unique=True) + first_name = db.Column(db.String(100), nullable=False) + last_name = db.Column(db.String(100), nullable=False) + email = db.Column(db.String(200), nullable=False, unique=True) + bachelor_thesis = db.Column(db.String, nullable=True) + bachelor_thesis_work_group = db.Column(db.String, nullable=True) + note = db.Column(db.Text, nullable=True) + part_students = db.relationship("PartStudent", backref="student", lazy=True) + + +class PartStudent(db.Model): + # A student doing a specific part + id = db.Column(db.Integer, primary_key=True) + final_part_mark = db.Column(db.Integer, nullable=True) + student_id = db.Column(db.Integer, db.ForeignKey("student.id"), nullable=False) + part_id = db.Column(db.Integer, db.ForeignKey("part.id"), nullable=False) + group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=True) + experiment_marks = db.relationship("ExperimentMark", backref="part_student", lazy=True) + + +class Group(db.Model): + id = db.Column(db.Integer, primary_key=True) + number = db.Column(db.Integer, nullable=False) + part_students = db.relationship("PartStudent", backref="group", lazy=True) + group_experiments = db.relationship("GroupExperiment", backref="group", lazy=True) + + +class GroupExperiment(db.Model): + # An experiment specified to a group + id = db.Column(db.Integer, primary_key=True) + part_experiment_id = db.Column(db.Integer, db.ForeignKey("part_experiment.id"), nullable=False) + group_id = db.Column(db.Integer, db.ForeignKey("group.id"), nullable=False) + appointments = db.relationship("Appointment", backref="group_experiment", lazy=True) + experiment_marks = db.relationship("ExperimentMark", backref="group_experiment", lazy=True) + + +class Experiment(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(200), nullable=False) + description = db.Column(db.Text, nullable=True) + room = db.Column(db.String(100), nullable=False) + building = db.Column(db.String(100), nullable=False) + responsibility = db.Column(db.String(200), nullable=True) + duration_in_days = db.Column(db.Integer, nullable=False) + deprecated = db.Column(db.Boolean, nullable=False, default=False) # To not be deleted! + oral_weighting = db.Column(db.Float, nullable=False) + protocol_weighting = db.Column(db.Float, nullable=False) + final_weighting = db.Column(db.Float, nullable=False) + part_experiments = db.relationship("PartExperiment", backref="experiment", lazy=True) + + +# Helper table for the many to many relationship between Assistant and PartExperiment +experiment_assistant = db.Table("experiment_assistant", + db.Column("part_experiment_id", db.Integer, db.ForeignKey("part_experiment.id"), + primary_key=True), + db.Column("assistant_id", db.Integer, db.ForeignKey("assistant.id"), + primary_key=True)) + + +class PartExperiment(db.Model): + # An experiment in a specific part + id = db.Column(db.Integer, primary_key=True) + number = db.Column(db.Integer, nullable=False) + experiment_id = db.Column(db.Integer, db.ForeignKey("experiment.id"), nullable=False) + part_id = db.Column(db.Integer, db.ForeignKey("part.id"), nullable=False) + assistants = db.relationship("Assistant", secondary=experiment_assistant, lazy=True, + backref=db.backref("part_experiments", lazy=True)) + group_experiments = db.relationship("GroupExperiment", backref="part_experiment", lazy=True) + + +class Assistant(db.Model): + id = db.Column(db.Integer, primary_key=True) + first_name = db.Column(db.String(100), nullable=False) + last_name = db.Column(db.String(100), nullable=False) + email = db.Column(db.String(200), nullable=False) + phone_number = db.Column(db.String(50), nullable=True) + mobile_phone_number = db.Column(db.String(50), nullable=True) + room = db.Column(db.String(100), nullable=True) + building = db.Column(db.String(100), nullable=True) + user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False) + appointments = db.relationship("Appointment", backref="assistant", lazy=True) + experiment_marks = db.relationship("ExperimentMark", backref="assistant", lazy=True) + + +class Appointment(db.Model): + id = db.Column(db.Integer, primary_key=True) + date = db.Column(db.DateTime, nullable=False) # To be specified with the python package "datetime" + special = db.Column(db.Boolean, nullable=False) # In the break or not + group_experiment_id = db.Column(db.Integer, db.ForeignKey("group_experiment.id"), nullable=False) + assistant_id = db.Column(db.Integer, db.ForeignKey("assistant.id"), nullable=False) + + +class Part(db.Model): + id = db.Column(db.Integer, primary_key=True) + label = db.Column(db.String(100), nullable=False) # A/1, A/2, B/1, B/2 + semester_id = db.Column(db.Integer, db.ForeignKey("semester.id"), nullable=False) + part_experiments = db.relationship("PartExperiment", backref="part", lazy=True) + part_students = db.relationship("PartStudent", backref="part", lazy=True) + + +class Semester(db.Model): + id = db.Column(db.Integer, primary_key=True) + label = db.Column(db.String(100), nullable=False) # WS2122 for example + parts = db.relationship("Part", backref="semester", lazy=True) + + +class ExperimentMark(db.Model): + # A mark for a student after a specific experiment + id = db.Column(db.Integer, primary_key=True) + oral_mark = db.Column(db.Integer, nullable=True) + protocol_mark = db.Column(db.Integer, nullable=True) + part_student_id = db.Column(db.Integer, db.ForeignKey("part_student.id"), nullable=False) + group_experiment_id = db.Column(db.Integer, db.ForeignKey("group_experiment.id"), nullable=False) + assistant_id = db.Column(db.Integer, db.ForeignKey("assistant.id"), + nullable=True) # The assistant who gives the mark + + +class User(db.Model): + id = db.Column(db.Integer, primary_key=True) + email = db.Column(db.String(200), nullable=False, unique=True) + password_hash = db.Column(db.String, nullable=False) + is_admin = db.Column(db.Boolean, nullable=False, default=False) + assistant = db.relationship("Assistant", backref="user", lazy=True, uselist=False) diff --git a/advlabdb/routes.py b/advlabdb/routes.py new file mode 100644 index 0000000..1237ced --- /dev/null +++ b/advlabdb/routes.py @@ -0,0 +1,5 @@ +from advlabdb import app + +@app.route("/") +def index(): + return "Welcome on AdvLabDB!" \ No newline at end of file diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..832f276 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,225 @@ +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "flask" +version = "1.1.2" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +click = ">=5.1" +itsdangerous = ">=0.24" +Jinja2 = ">=2.10.1" +Werkzeug = ">=0.15" + +[package.extras] +dev = ["pytest", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] +docs = ["sphinx", "pallets-sphinx-themes", "sphinxcontrib-log-cabinet", "sphinx-issues"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flask-sqlalchemy" +version = "2.4.4" +description = "Adds SQLAlchemy support to your Flask application." +category = "main" +optional = false +python-versions = ">= 2.7, != 3.0.*, != 3.1.*, != 3.2.*, != 3.3.*" + +[package.dependencies] +Flask = ">=0.10" +SQLAlchemy = ">=0.8.0" + +[[package]] +name = "itsdangerous" +version = "1.1.0" +description = "Various helpers to pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "jinja2" +version = "2.11.3" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + +[[package]] +name = "sqlalchemy" +version = "1.3.23" +description = "Database Abstraction Library" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +mssql = ["pyodbc"] +mssql_pymssql = ["pymssql"] +mssql_pyodbc = ["pyodbc"] +mysql = ["mysqlclient"] +oracle = ["cx-oracle"] +postgresql = ["psycopg2"] +postgresql_pg8000 = ["pg8000 (<1.16.6)"] +postgresql_psycopg2binary = ["psycopg2-binary"] +postgresql_psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql (<1)", "pymysql"] + +[[package]] +name = "werkzeug" +version = "1.0.1" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["pytest", "pytest-timeout", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinx-issues"] +watchdog = ["watchdog"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.9" +content-hash = "6bef6d6f4639eb91713858a87c48769c41232753299fd7b5846e7b18f3950ddd" + +[metadata.files] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +flask = [ + {file = "Flask-1.1.2-py2.py3-none-any.whl", hash = "sha256:8a4fdd8936eba2512e9c85df320a37e694c93945b33ef33c89946a340a238557"}, + {file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"}, +] +flask-sqlalchemy = [ + {file = "Flask-SQLAlchemy-2.4.4.tar.gz", hash = "sha256:bfc7150eaf809b1c283879302f04c42791136060c6eeb12c0c6674fb1291fae5"}, + {file = "Flask_SQLAlchemy-2.4.4-py2.py3-none-any.whl", hash = "sha256:05b31d2034dd3f2a685cbbae4cfc4ed906b2a733cff7964ada450fd5e462b84e"}, +] +itsdangerous = [ + {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, + {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, +] +jinja2 = [ + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, + {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, +] +sqlalchemy = [ + {file = "SQLAlchemy-1.3.23-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:fd3b96f8c705af8e938eaa99cbd8fd1450f632d38cad55e7367c33b263bf98ec"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:29cccc9606750fe10c5d0e8bd847f17a97f3850b8682aef1f56f5d5e1a5a64b1"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:927ce09e49bff3104459e1451ce82983b0a3062437a07d883a4c66f0b344c9b5"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-win32.whl", hash = "sha256:b4b0e44d586cd64b65b507fa116a3814a1a53d55dce4836d7c1a6eb2823ff8d1"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-win_amd64.whl", hash = "sha256:6b8b8c80c7f384f06825612dd078e4a31f0185e8f1f6b8c19e188ff246334205"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9e9c25522933e569e8b53ccc644dc993cab87e922fb7e142894653880fdd419d"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:a0e306e9bb76fd93b29ae3a5155298e4c1b504c7cbc620c09c20858d32d16234"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:6c9e6cc9237de5660bcddea63f332428bb83c8e2015c26777281f7ffbd2efb84"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:94f667d86be82dd4cb17d08de0c3622e77ca865320e0b95eae6153faa7b4ecaf"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:751934967f5336a3e26fc5993ccad1e4fee982029f9317eb6153bc0bc3d2d2da"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:63677d0c08524af4c5893c18dbe42141de7178001360b3de0b86217502ed3601"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-win32.whl", hash = "sha256:ddfb511e76d016c3a160910642d57f4587dc542ce5ee823b0d415134790eeeb9"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-win_amd64.whl", hash = "sha256:040bdfc1d76a9074717a3f43455685f781c581f94472b010cd6c4754754e1862"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:d1a85dfc5dee741bf49cb9b6b6b8d2725a268e4992507cf151cba26b17d97c37"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:639940bbe1108ac667dcffc79925db2966826c270112e9159439ab6bb14f8d80"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e8a1750b44ad6422ace82bf3466638f1aa0862dbb9689690d5f2f48cce3476c8"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e5bb3463df697279e5459a7316ad5a60b04b0107f9392e88674d0ece70e9cf70"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-win32.whl", hash = "sha256:e273367f4076bd7b9a8dc2e771978ef2bfd6b82526e80775a7db52bff8ca01dd"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-win_amd64.whl", hash = "sha256:ac2244e64485c3778f012951fdc869969a736cd61375fde6096d08850d8be729"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:23927c3981d1ec6b4ea71eb99d28424b874d9c696a21e5fbd9fa322718be3708"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d90010304abb4102123d10cbad2cdf2c25a9f2e66a50974199b24b468509bad5"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a8bfc1e1afe523e94974132d7230b82ca7fa2511aedde1f537ec54db0399541a"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:269990b3ab53cb035d662dcde51df0943c1417bdab707dc4a7e4114a710504b4"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-win32.whl", hash = "sha256:fdd2ed7395df8ac2dbb10cefc44737b66c6a5cd7755c92524733d7a443e5b7e2"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-win_amd64.whl", hash = "sha256:6a939a868fdaa4b504e8b9d4a61f21aac11e3fecc8a8214455e144939e3d2aea"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24f9569e82a009a09ce2d263559acb3466eba2617203170e4a0af91e75b4f075"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2578dbdbe4dbb0e5126fb37ffcd9793a25dcad769a95f171a2161030bea850ff"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1fe5d8d39118c2b018c215c37b73fd6893c3e1d4895be745ca8ff6eb83333ed3"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:c7dc052432cd5d060d7437e217dd33c97025287f99a69a50e2dc1478dd610d64"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-win32.whl", hash = "sha256:ecce8c021894a77d89808222b1ff9687ad84db54d18e4bd0500ca766737faaf6"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:37b83bf81b4b85dda273aaaed5f35ea20ad80606f672d94d2218afc565fb0173"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:8be835aac18ec85351385e17b8665bd4d63083a7160a017bef3d640e8e65cadb"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6ec1044908414013ebfe363450c22f14698803ce97fbb47e53284d55c5165848"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:eab063a70cca4a587c28824e18be41d8ecc4457f8f15b2933584c6c6cccd30f0"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:baeb451ee23e264de3f577fee5283c73d9bbaa8cb921d0305c0bbf700094b65b"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-win32.whl", hash = "sha256:94208867f34e60f54a33a37f1c117251be91a47e3bfdb9ab8a7847f20886ad06"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:f4d972139d5000105fcda9539a76452039434013570d6059993120dc2a65e447"}, + {file = "SQLAlchemy-1.3.23.tar.gz", hash = "sha256:6fca33672578666f657c131552c4ef8979c1606e494f78cd5199742dfb26918b"}, +] +werkzeug = [ + {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, + {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d119f57 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "advlabdb" +version = "0.1.0" +description = "DB for the advanced physics lab on JGU-Mainz." +authors = ["Mohamad Bitar "] + +[tool.poetry.dependencies] +python = "^3.9" +Flask = "^1.1.2" +Flask-SQLAlchemy = "^2.4.4" +SQLAlchemy = "<1.4" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/run.py b/run.py new file mode 100644 index 0000000..15f4385 --- /dev/null +++ b/run.py @@ -0,0 +1,4 @@ +from advlabdb import app + +if __name__ == "__main__": + app.run(debug=True) diff --git a/testDB.py b/testDB.py new file mode 100644 index 0000000..530a9cd --- /dev/null +++ b/testDB.py @@ -0,0 +1,85 @@ +from advlabdb import * +from advlabdb.models import * +from datetime import datetime + +db.drop_all() +db.create_all() + +student1 = Student(student_number=123, first_name="Mo", last_name="Bit", email="m@test.com") +student2 = Student(student_number=1232, first_name="Mo2", last_name="Bit", email="m2@test.com") +student3 = Student(student_number=1233, first_name="Mo3", last_name="Bit3", email="m3@test.com") + +db.session.add(student1) +db.session.add(student2) +db.session.add(student3) + +sem = Semester(label="SS2021") + +db.session.add(sem) + +parta1 = Part(label="A/1", semester=sem) +partb2 = Part(label="B/2", semester=sem) + +db.session.add(parta1) +db.session.add(partb2) + +g1 = Group(number=1) +g2 = Group(number=2) + +db.session.add(g1) +db.session.add(g2) + +ps1 = PartStudent(student=student1, part=parta1, group=g1) +ps2 = PartStudent(student=student2, part=parta1, group=g1) +ps3 = PartStudent(student=student3, part=partb2, group=g2) + +db.session.add(ps1) +db.session.add(ps2) +db.session.add(ps3) + +ex1 = Experiment(name="exp", room="123", building="phy", responsibility="none", duration_in_days=2, oral_weighting=0.5, protocol_weighting=0.5, final_weighting=1) + +ex2 = Experiment(name="exp2", room="123", building="phy", responsibility="none", duration_in_days=2, oral_weighting=0.5, protocol_weighting=0.5, final_weighting=1) + +db.session.add(ex1) +db.session.add(ex2) + +px1 = PartExperiment(number=1, experiment=ex1, part=parta1) +px2 = PartExperiment(number=2, experiment=ex2, part=partb2) + +db.session.add(px1) +db.session.add(px2) + +gx1 = GroupExperiment(part_experiment=px1, group=g1) +gx2 = GroupExperiment(part_experiment=px2, group=g2) + +db.session.add(gx1) +db.session.add(gx2) + +us1 = User(email="test@test.com", password_hash="h1") +us2 = User(email="test2@test.com", password_hash="h2") + +db.session.add(us1) +db.session.add(us2) + +as1 = Assistant(first_name="As1", last_name="l", email="test@test.com", phone_number="012333212", mobile_phone_number="012334123", user=us1) +as2 = Assistant(first_name="As2", last_name="l", email="test2@test.com", user=us1) + +db.session.add(as1) +db.session.add(as2) + +ap1 = Appointment(date=datetime(2021, 3, 21), special=True, group_experiment=gx1, assistant=as1) +ap2 = Appointment(date=datetime(2021, 3, 22), special=True, group_experiment=gx2, assistant=as2) + +db.session.add(ap1) +db.session.add(ap2) + +em1 = ExperimentMark(oral_mark=11, protocol_mark=14, part_student=ps1, group_experiment=gx1, assistant=as1) +em2 = ExperimentMark(oral_mark=12, protocol_mark=14, part_student=ps2, group_experiment=gx1, assistant=as1) +em3 = ExperimentMark(oral_mark=13, protocol_mark=14, part_student=ps3, group_experiment=gx2, assistant=as2) + +db.session.add(em1) +db.session.add(em2) +db.session.add(em3) + +db.session.commit()