1
0
Fork 0
mirror of https://codeberg.org/Mo8it/AdvLabDB.git synced 2024-12-04 22:40:30 +00:00

Compare commits

...

7 commits

Author SHA1 Message Date
9bc1a334be Separate nginx container 2022-09-10 18:35:57 +02:00
3f8a5e0b4f Make run.py executable 2022-09-10 18:26:56 +02:00
13012d6a97 Warn instead of exception 2022-09-10 18:26:46 +02:00
c78491f61c Add database_import docs to import.html 2022-09-10 18:26:31 +02:00
253c91986e Move example_database_import.txt 2022-09-10 18:25:59 +02:00
0c56aa8b18 Move DB.drawio 2022-09-10 18:25:46 +02:00
21fe2ead60 Update numpy 2022-09-10 15:16:24 +02:00
12 changed files with 315 additions and 170 deletions

View file

@ -1274,7 +1274,6 @@ class ImportView(SecureAdminBaseView):
file = FileField(
label="Import file",
validators=[FileRequired(), FileAllowed(["txt"], "Only txt files are allowed!")],
description="The import file has to be a text file (with .txt at the end) encoded in UTF-8. It has to strictly follow the required format.",
)
submit = SubmitField(
label="Upload and import",

View file

@ -201,16 +201,19 @@ def importFromFile(filePath: Path):
else:
# Check if columns that should not change match
if dbStudent.first_name != first_name:
raise DataBaseImportException(
f"First name {dbStudent.first_name} in the database does not match with the first name {first_name} provided in the import file for the student number {student_number}. In case the name is changed, please change it manually using the web interface first."
flash(
f'First name "{dbStudent.first_name}" in the database does not match with the first name "{first_name}" provided in the import file for the student number {student_number}.',
"warning",
)
if dbStudent.last_name != last_name:
raise DataBaseImportException(
f"Last name {dbStudent.last_name} in the database does not match with the last name {last_name} provided in the import file for the student number {student_number}. In case the name is changed, please change it manually using the web interface first."
flash(
f'Last name "{dbStudent.last_name}" in the database does not match with the last name "{last_name}" provided in the import file for the student number {student_number}.',
"warning",
)
if dbStudent.uni_email != uni_email:
raise DataBaseImportException(
f"University email {dbStudent.uni_email} in the database does not match with the university email {last_name} provided in the import file for the student number {student_number}. In case the email is changed, please change it manually using the web interface first."
flash(
f'University email "{dbStudent.uni_email}" in the database does not match with the university email "{last_name}" provided in the import file for the student number {student_number}.',
"warning",
)
dbStudent.contact_email = contact_email

View file

@ -17,10 +17,232 @@
{{ form.file.label }}
{{ form.file }}
{{ form.submit }}
<br>
<br>
{{ form.file.description }}
</form>
<hr>
<h3>Help</h3>
<p>
The import file has to be a text file (with <code>.txt</code> at the end) encoded in UTF-8. It has to <strong>strictly</strong> follow the required format.
</p>
<p>
You can take a look at the file
<a
href="{{ url_for('static', filename='example_database_import.txt') }}"
target="_blank"
rel="noopener noreferrer"
>
example_database_import.txt
</a>
for an example.
</p>
<h4>Required manipulation using the web interface</h4>
<p>
The following tables can not be imported from a file and have to be manipulated using the web interface.
</p>
<ul>
<li>
Semester
</li>
<li>
Program
</li>
<li>
Part
</li>
<li>
User
</li>
<li>
Assistant
</li>
<li>
Experiment
</li>
<li>
Semester Experiment
</li>
</ul>
<h4>Optional values</h4>
<p>
If an attribute is optional/nullable and has no value, then <code>NULL</code> (uppercase) has to be written.
</p>
<h4>How to understand the tables in the next section</h4>
<h5>ID</h5>
<p>
None of the mentioned ids in the import file is meant as a database id. The ids here only refer to the imported instances. The id in the database is assigned automatically.
</p>
<p>
Here is the format of a table in the "Tables" section:
</p>
<h5>Table</h5>
<ul>
<li>
id &#8594; 0 / 1 / 2 / ... (starts with 0 and has step
1)
</li>
<li>
attribute &#8594; example1 / example2 / ... (explanation)
</li>
<li>
...
</li>
</ul>
<p>
The type of attributes can be seen in the drawio file
<a
href="{{ url_for('static', filename='DB.drawio') }}"
>
DB.drawio
</a> which can be opened using
<a
href="https://www.diagrams.net/"
target="_blank"
rel="noopener noreferrer"
>
diagrams.net
</a>. Some attributes have constraints marked also in the drawio file.
</p>
<h4>Tables</h4>
<h5>Semester (only one!)</h5>
<ul>
<li>
label &#8594; WS / SS
</li>
<li>
year &#8594; 22 / 23 / ...
</li>
</ul>
<h5>Part</h5>
<ul>
<li>
id
</li>
<li>
number &#8594; 1 / 2 / ...
</li>
<li>
program_label &#8594; BS / MS / BE / ... (for bachelor of science, master of science, bachelor of education, etc.)
</li>
</ul>
<h5>Student</h5>
<ul>
<li>
<code>student_number</code>
</li>
<li>
<code>first_name</code>
</li>
<li>
<code>last_name</code>
</li>
<li>
<code>uni_email</code>
</li>
<li>
<code><em>contact_email</em></code> (optional)
</li>
<li>
<code><em>bachelor_thesis</em></code> (optional)
</li>
<li>
<code><em>bachelor_thesis_work_group</em></code> (optional)
</li>
<li>
<code><em>note</em></code> (optional)
</li>
</ul>
<div style="font-size: 90%;">
Notes:
<ul>
<li>
If <code>student_number</code> is found in the database but <code>first_name</code>, <code>last_name</code> or <code>uni_email</code> do not match, a warning is given during the import. Pay attention to warnings!
</li>
<li>
<code>bachelor_thesis</code> and <code>bachelor_thesis_work_group</code> are only updated in the database if they are not <code>NULL</code>. This prevents overriding values written using the web interface.
</li>
<li>
If <code>note</code> is not <code>NULL</code> then it is appended to the note in the database if the student already exists in the database. It will not overwrite existing notes.
</li>
</ul>
</div>
<h5>Group</h5>
<ul>
<li>
<code>id</code>
</li>
<li>
<code>number</code> &#8594; 1 / 2 / ...
</li>
<li>
<code>program_label</code>
</li>
</ul>
<h5>PartStudent</h5>
<ul>
<li>
<code>student_number</code>
</li>
<li>
<code>part_id</code>
</li>
<li>
<code>group_id</code>
</li>
</ul>
<h5>Experiment</h5>
<ul>
<li>
<code>id</code>
</li>
<li>
<code>number</code> &#8594; 1 / 2 / ...
</li>
<li>
<code>program_label</code>
</li>
</ul>
<h5>GroupExperiment</h5>
<ul>
<li>
<code>id</code>
</li>
<li>
<code>experiment_id</code>
</li>
<li>
<code>group_id</code>
</li>
</ul>
<h5>Appointment</h5>
<ul>
<li>
<code>date</code> &#8594; 12.09.2022
</li>
<li>
<code>special</code> &#8594; 1 / 0
</li>
<li>
<code>group_experiment_id</code>
</li>
<li>
<code>assistant_email</code>
</li>
</ul>
{{ footer|safe }}
{% endblock body %}

View file

@ -1,77 +0,0 @@
= Database import
The import file has to be a text file (with `.txt` at the end) encoded in UTF-8. It has to *strictly* follow the required format.
You can take a look at the file link:example_database_import.txt[] for an example.
== Required manipulation on the web interface
The following tables can not be imported from a file and have to be manipulated on the web interface.
* Semester
* Program
* Part
* User
* Assistant
* Experiment
* Semester Experiment
== Optional values
If an attribute is optional/nullable and it has no value, then `NULL` (uppercase) has to be written.
== How to understand this document
=== ID
None of the mentioned ids in this document is meant as database id. The ids here only refer to the imported instances. The id in the database is assigned automatically.
=== Table
* id -> 0 / 1 / 2 / ... (starts with 0 and has step 1)
* attribute -> example1 / example2 / ... (explanation)
* ...
The type of the attributes can be seen in the drawio file link:DB.drawio[] which can be opened using https://www.diagrams.net/[diagrams.net]. Some attributes have constraints marked also in the drawio file.
== Tables
=== Semester (only one!)
* label -> WS / SS
* year -> 21 / 22 / ...
=== Part
* id
* number -> 1 / 2 / ...
* program_label -> BS / MS / BE / ... (for bachelor of science, master of science, bachelor of education, etc.)
=== Student
* student_number
* first_name
* last_name
* uni_email
* _contact_email_ (optional)
* _bachelor_thesis_ (optional)
* _bachelor_thesis_work_group_ (optional)
* _note_ (optional)
=== Group
* id
* number -> 1 / 2 / ...
* program_label
=== Part Student
* student_number
* part_id
* group_id
=== Experiment
* id
* number -> 1 / 2 / ...
* program_label
=== Group Experiment
* id
* experiment_id
* group_id
=== Appointment
* date -> 21.08.2022
* special -> 1 / 0
* group_experiment_id
* assistant_email

View file

@ -16,13 +16,13 @@ ADVLABDB_VOLUMES_DIR = VOLUMES_DIR / "advlabdb"
ADVLABDB_REPO_DIR = ADVLABDB_VOLUMES_DIR / "repo"
ADVLABDB_LOGS_DIR = ADVLABDB_VOLUMES_DIR / "logs"
ADVLABDB_DATA_DIR = ADVLABDB_VOLUMES_DIR / "data"
# Nginx
NGINX_CONF_D_DIR = ADVLABDB_VOLUMES_DIR / "nginx/conf.d"
# Traefik
TRAEFIK_VOLUMES_DIR = VOLUMES_DIR / "traefik"
TRAEFIK_ETC_DIR = TRAEFIK_VOLUMES_DIR / "etc"
TRAEFIK_LOGS_DIR = TRAEFIK_VOLUMES_DIR / "logs"
TRAEFIK_CERTS_DIR = TRAEFIK_VOLUMES_DIR / "certs"
# Nginx
NGINX_CONF_D_DIR = VOLUMES_DIR / "nginx/conf.d"
# Systemd
SYSTEMD_USER_DIR = Path.home() / ".config/systemd/user"
@ -37,11 +37,6 @@ parser.add_argument(
action="store_true",
help="Do not deploy the Traefik container.",
)
parser.add_argument(
"--skip-nginx",
action="store_true",
help="Do not deploy the Nginx container.",
)
parser.add_argument(
"-n",
"--network",
@ -127,14 +122,13 @@ def check_requirements():
if not settings_file.is_file():
sys.exit(f"{settings_file} missing!")
if not NGINX_CONF_D_DIR.is_dir():
sys.exit(f"{NGINX_CONF_D_DIR} missing!")
if not args.skip_traefik:
if not TRAEFIK_ETC_DIR.is_dir():
sys.exit(f"{TRAEFIK_ETC_DIR} missing!")
if not args.skip_nginx:
if not NGINX_CONF_D_DIR.is_dir():
sys.exit(f"{NGINX_CONF_D_DIR} missing!")
if run(f"podman network exists {args.network}").returncode != 0:
if args.skip_traefik:
sys.exit(f"Skipped Traefik's deployment although Traefik's network {args.network} does not exist!")
@ -147,6 +141,16 @@ def check_requirements():
)
def create_nginx_container():
create_container(
"advlabdb-nginx",
f"""--network {args.network} \
-v {NGINX_CONF_D_DIR}:/etc/nginx/conf.d:Z,ro \
--label "io.containers.autoupdate=registry" \
docker.io/library/nginx:alpine""",
)
def create_traefik_container():
if args.verbose:
print(f"Making sure that the logs directory {TRAEFIK_LOGS_DIR} exists.")
@ -169,16 +173,6 @@ def create_traefik_container():
)
def create_nginx_container():
create_container(
"nginx",
f"""--network {args.network} \
-v {NGINX_CONF_D_DIR}:/etc/nginx/conf.d:Z,ro \
--label "io.containers.autoupdate=registry" \
docker.io/library/nginx:alpine""",
)
# Needed for main and create_advlabdb_container
advlabdb_container_args = f"""--network {args.network} \
-e ADVLABDB_DATA_DIR=/volumes/data \
@ -276,8 +270,10 @@ def main():
# Create Nginx container if needed
if not args.skip_nginx and run("systemctl --user is-enabled container-nginx").returncode != 0:
if run("systemctl --user is-enabled container-advlabdb-nginx").returncode != 0:
create_nginx_container()
else:
run("systemctl --user restart container-advlabdb-nginx")
print("\nDone!\n")

View file

@ -12,4 +12,4 @@ http:
advlabdb:
loadBalancer:
servers:
- url: http://nginx
- url: http://advlabdb-nginx

60
poetry.lock generated
View file

@ -333,7 +333,7 @@ setuptools_scm = ">=4,<7"
[[package]]
name = "numpy"
version = "1.23.2"
version = "1.23.3"
description = "NumPy is the fundamental package for array computing with Python."
category = "main"
optional = false
@ -507,7 +507,7 @@ email = ["email-validator"]
[metadata]
lock-version = "1.1"
python-versions = "^3.10"
content-hash = "2bd5c0327743828b360ef2098365f979ad8c1a734d0011cccfe0b9f94a046da8"
content-hash = "7727fb4275266074afb431bd624d0e94b3896c220f736108b4b593a9207edf53"
[metadata.files]
alembic = [
@ -798,34 +798,34 @@ matplotlib = [
{file = "matplotlib-3.5.3.tar.gz", hash = "sha256:339cac48b80ddbc8bfd05daae0a3a73414651a8596904c2a881cfd1edb65f26c"},
]
numpy = [
{file = "numpy-1.23.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e603ca1fb47b913942f3e660a15e55a9ebca906857edfea476ae5f0fe9b457d5"},
{file = "numpy-1.23.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:633679a472934b1c20a12ed0c9a6c9eb167fbb4cb89031939bfd03dd9dbc62b8"},
{file = "numpy-1.23.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17e5226674f6ea79e14e3b91bfbc153fdf3ac13f5cc54ee7bc8fdbe820a32da0"},
{file = "numpy-1.23.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdc02c0235b261925102b1bd586579b7158e9d0d07ecb61148a1799214a4afd5"},
{file = "numpy-1.23.2-cp310-cp310-win32.whl", hash = "sha256:df28dda02c9328e122661f399f7655cdcbcf22ea42daa3650a26bce08a187450"},
{file = "numpy-1.23.2-cp310-cp310-win_amd64.whl", hash = "sha256:8ebf7e194b89bc66b78475bd3624d92980fca4e5bb86dda08d677d786fefc414"},
{file = "numpy-1.23.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dc76bca1ca98f4b122114435f83f1fcf3c0fe48e4e6f660e07996abf2f53903c"},
{file = "numpy-1.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ecfdd68d334a6b97472ed032b5b37a30d8217c097acfff15e8452c710e775524"},
{file = "numpy-1.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5593f67e66dea4e237f5af998d31a43e447786b2154ba1ad833676c788f37cde"},
{file = "numpy-1.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac987b35df8c2a2eab495ee206658117e9ce867acf3ccb376a19e83070e69418"},
{file = "numpy-1.23.2-cp311-cp311-win32.whl", hash = "sha256:d98addfd3c8728ee8b2c49126f3c44c703e2b005d4a95998e2167af176a9e722"},
{file = "numpy-1.23.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ecb818231afe5f0f568c81f12ce50f2b828ff2b27487520d85eb44c71313b9e"},
{file = "numpy-1.23.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:909c56c4d4341ec8315291a105169d8aae732cfb4c250fbc375a1efb7a844f8f"},
{file = "numpy-1.23.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8247f01c4721479e482cc2f9f7d973f3f47810cbc8c65e38fd1bbd3141cc9842"},
{file = "numpy-1.23.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8b97a8a87cadcd3f94659b4ef6ec056261fa1e1c3317f4193ac231d4df70215"},
{file = "numpy-1.23.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd5b7ccae24e3d8501ee5563e82febc1771e73bd268eef82a1e8d2b4d556ae66"},
{file = "numpy-1.23.2-cp38-cp38-win32.whl", hash = "sha256:9b83d48e464f393d46e8dd8171687394d39bc5abfe2978896b77dc2604e8635d"},
{file = "numpy-1.23.2-cp38-cp38-win_amd64.whl", hash = "sha256:dec198619b7dbd6db58603cd256e092bcadef22a796f778bf87f8592b468441d"},
{file = "numpy-1.23.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4f41f5bf20d9a521f8cab3a34557cd77b6f205ab2116651f12959714494268b0"},
{file = "numpy-1.23.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:806cc25d5c43e240db709875e947076b2826f47c2c340a5a2f36da5bb10c58d6"},
{file = "numpy-1.23.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f9d84a24889ebb4c641a9b99e54adb8cab50972f0166a3abc14c3b93163f074"},
{file = "numpy-1.23.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c403c81bb8ffb1c993d0165a11493fd4bf1353d258f6997b3ee288b0a48fce77"},
{file = "numpy-1.23.2-cp39-cp39-win32.whl", hash = "sha256:cf8c6aed12a935abf2e290860af8e77b26a042eb7f2582ff83dc7ed5f963340c"},
{file = "numpy-1.23.2-cp39-cp39-win_amd64.whl", hash = "sha256:5e28cd64624dc2354a349152599e55308eb6ca95a13ce6a7d5679ebff2962913"},
{file = "numpy-1.23.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:806970e69106556d1dd200e26647e9bee5e2b3f1814f9da104a943e8d548ca38"},
{file = "numpy-1.23.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bd879d3ca4b6f39b7770829f73278b7c5e248c91d538aab1e506c628353e47f"},
{file = "numpy-1.23.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:be6b350dfbc7f708d9d853663772a9310783ea58f6035eec649fb9c4371b5389"},
{file = "numpy-1.23.2.tar.gz", hash = "sha256:b78d00e48261fbbd04aa0d7427cf78d18401ee0abd89c7559bbf422e5b1c7d01"},
{file = "numpy-1.23.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9f707b5bb73bf277d812ded9896f9512a43edff72712f31667d0a8c2f8e71ee"},
{file = "numpy-1.23.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffcf105ecdd9396e05a8e58e81faaaf34d3f9875f137c7372450baa5d77c9a54"},
{file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ea3f98a0ffce3f8f57675eb9119f3f4edb81888b6874bc1953f91e0b1d4f440"},
{file = "numpy-1.23.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004f0efcb2fe1c0bd6ae1fcfc69cc8b6bf2407e0f18be308612007a0762b4089"},
{file = "numpy-1.23.3-cp310-cp310-win32.whl", hash = "sha256:98dcbc02e39b1658dc4b4508442a560fe3ca5ca0d989f0df062534e5ca3a5c1a"},
{file = "numpy-1.23.3-cp310-cp310-win_amd64.whl", hash = "sha256:39a664e3d26ea854211867d20ebcc8023257c1800ae89773cbba9f9e97bae036"},
{file = "numpy-1.23.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1f27b5322ac4067e67c8f9378b41c746d8feac8bdd0e0ffede5324667b8a075c"},
{file = "numpy-1.23.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ad3ec9a748a8943e6eb4358201f7e1c12ede35f510b1a2221b70af4bb64295c"},
{file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdc9febce3e68b697d931941b263c59e0c74e8f18861f4064c1f712562903411"},
{file = "numpy-1.23.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:301c00cf5e60e08e04d842fc47df641d4a181e651c7135c50dc2762ffe293dbd"},
{file = "numpy-1.23.3-cp311-cp311-win32.whl", hash = "sha256:7cd1328e5bdf0dee621912f5833648e2daca72e3839ec1d6695e91089625f0b4"},
{file = "numpy-1.23.3-cp311-cp311-win_amd64.whl", hash = "sha256:8355fc10fd33a5a70981a5b8a0de51d10af3688d7a9e4a34fcc8fa0d7467bb7f"},
{file = "numpy-1.23.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc6e8da415f359b578b00bcfb1d08411c96e9a97f9e6c7adada554a0812a6cc6"},
{file = "numpy-1.23.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:22d43376ee0acd547f3149b9ec12eec2f0ca4a6ab2f61753c5b29bb3e795ac4d"},
{file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a64403f634e5ffdcd85e0b12c08f04b3080d3e840aef118721021f9b48fc1460"},
{file = "numpy-1.23.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd9d3abe5774404becdb0748178b48a218f1d8c44e0375475732211ea47c67e"},
{file = "numpy-1.23.3-cp38-cp38-win32.whl", hash = "sha256:f8c02ec3c4c4fcb718fdf89a6c6f709b14949408e8cf2a2be5bfa9c49548fd85"},
{file = "numpy-1.23.3-cp38-cp38-win_amd64.whl", hash = "sha256:e868b0389c5ccfc092031a861d4e158ea164d8b7fdbb10e3b5689b4fc6498df6"},
{file = "numpy-1.23.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09f6b7bdffe57fc61d869a22f506049825d707b288039d30f26a0d0d8ea05164"},
{file = "numpy-1.23.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c79d7cf86d049d0c5089231a5bcd31edb03555bd93d81a16870aa98c6cfb79d"},
{file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5d5420053bbb3dd64c30e58f9363d7a9c27444c3648e61460c1237f9ec3fa14"},
{file = "numpy-1.23.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5422d6a1ea9b15577a9432e26608c73a78faf0b9039437b075cf322c92e98e7"},
{file = "numpy-1.23.3-cp39-cp39-win32.whl", hash = "sha256:c1ba66c48b19cc9c2975c0d354f24058888cdc674bebadceb3cdc9ec403fb5d1"},
{file = "numpy-1.23.3-cp39-cp39-win_amd64.whl", hash = "sha256:78a63d2df1d947bd9d1b11d35564c2f9e4b57898aae4626638056ec1a231c40c"},
{file = "numpy-1.23.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:17c0e467ade9bda685d5ac7f5fa729d8d3e76b23195471adae2d6a6941bd2c18"},
{file = "numpy-1.23.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91b8d6768a75247026e951dce3b2aac79dc7e78622fc148329135ba189813584"},
{file = "numpy-1.23.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:94c15ca4e52671a59219146ff584488907b1f9b3fc232622b47e2cf832e94fb8"},
{file = "numpy-1.23.3.tar.gz", hash = "sha256:51bf49c0cd1d52be0a240aa66f3458afc4b95d8993d2d04f0d91fa60c10af6cd"},
]
packaging = [
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},

View file

@ -20,7 +20,7 @@ flask-wtf = ">=1.0.1"
gunicorn = ">=20.1.0"
markupsafe = ">=2.1.1"
matplotlib = ">=3.5.3"
numpy = ">=1.23.2"
numpy = ">=1.23.3"
[tool.poetry.dev-dependencies]

View file

@ -260,35 +260,35 @@ matplotlib==3.5.3 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:dacddf5bfcec60e3f26ec5c0ae3d0274853a258b6c3fc5ef2f06a8eb23e042be \
--hash=sha256:f3840c280ebc87a48488a46f760ea1c0c0c83fcf7abbe2e6baf99d033fd35fd8 \
--hash=sha256:f814504e459c68118bf2246a530ed953ebd18213dc20e3da524174d84ed010b2
numpy==1.23.2 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:17e5226674f6ea79e14e3b91bfbc153fdf3ac13f5cc54ee7bc8fdbe820a32da0 \
--hash=sha256:2bd879d3ca4b6f39b7770829f73278b7c5e248c91d538aab1e506c628353e47f \
--hash=sha256:4f41f5bf20d9a521f8cab3a34557cd77b6f205ab2116651f12959714494268b0 \
--hash=sha256:5593f67e66dea4e237f5af998d31a43e447786b2154ba1ad833676c788f37cde \
--hash=sha256:5e28cd64624dc2354a349152599e55308eb6ca95a13ce6a7d5679ebff2962913 \
--hash=sha256:633679a472934b1c20a12ed0c9a6c9eb167fbb4cb89031939bfd03dd9dbc62b8 \
--hash=sha256:806970e69106556d1dd200e26647e9bee5e2b3f1814f9da104a943e8d548ca38 \
--hash=sha256:806cc25d5c43e240db709875e947076b2826f47c2c340a5a2f36da5bb10c58d6 \
--hash=sha256:8247f01c4721479e482cc2f9f7d973f3f47810cbc8c65e38fd1bbd3141cc9842 \
--hash=sha256:8ebf7e194b89bc66b78475bd3624d92980fca4e5bb86dda08d677d786fefc414 \
--hash=sha256:8ecb818231afe5f0f568c81f12ce50f2b828ff2b27487520d85eb44c71313b9e \
--hash=sha256:8f9d84a24889ebb4c641a9b99e54adb8cab50972f0166a3abc14c3b93163f074 \
--hash=sha256:909c56c4d4341ec8315291a105169d8aae732cfb4c250fbc375a1efb7a844f8f \
--hash=sha256:9b83d48e464f393d46e8dd8171687394d39bc5abfe2978896b77dc2604e8635d \
--hash=sha256:ac987b35df8c2a2eab495ee206658117e9ce867acf3ccb376a19e83070e69418 \
--hash=sha256:b78d00e48261fbbd04aa0d7427cf78d18401ee0abd89c7559bbf422e5b1c7d01 \
--hash=sha256:b8b97a8a87cadcd3f94659b4ef6ec056261fa1e1c3317f4193ac231d4df70215 \
--hash=sha256:bd5b7ccae24e3d8501ee5563e82febc1771e73bd268eef82a1e8d2b4d556ae66 \
--hash=sha256:bdc02c0235b261925102b1bd586579b7158e9d0d07ecb61148a1799214a4afd5 \
--hash=sha256:be6b350dfbc7f708d9d853663772a9310783ea58f6035eec649fb9c4371b5389 \
--hash=sha256:c403c81bb8ffb1c993d0165a11493fd4bf1353d258f6997b3ee288b0a48fce77 \
--hash=sha256:cf8c6aed12a935abf2e290860af8e77b26a042eb7f2582ff83dc7ed5f963340c \
--hash=sha256:d98addfd3c8728ee8b2c49126f3c44c703e2b005d4a95998e2167af176a9e722 \
--hash=sha256:dc76bca1ca98f4b122114435f83f1fcf3c0fe48e4e6f660e07996abf2f53903c \
--hash=sha256:dec198619b7dbd6db58603cd256e092bcadef22a796f778bf87f8592b468441d \
--hash=sha256:df28dda02c9328e122661f399f7655cdcbcf22ea42daa3650a26bce08a187450 \
--hash=sha256:e603ca1fb47b913942f3e660a15e55a9ebca906857edfea476ae5f0fe9b457d5 \
--hash=sha256:ecfdd68d334a6b97472ed032b5b37a30d8217c097acfff15e8452c710e775524
numpy==1.23.3 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:004f0efcb2fe1c0bd6ae1fcfc69cc8b6bf2407e0f18be308612007a0762b4089 \
--hash=sha256:09f6b7bdffe57fc61d869a22f506049825d707b288039d30f26a0d0d8ea05164 \
--hash=sha256:0ea3f98a0ffce3f8f57675eb9119f3f4edb81888b6874bc1953f91e0b1d4f440 \
--hash=sha256:17c0e467ade9bda685d5ac7f5fa729d8d3e76b23195471adae2d6a6941bd2c18 \
--hash=sha256:1f27b5322ac4067e67c8f9378b41c746d8feac8bdd0e0ffede5324667b8a075c \
--hash=sha256:22d43376ee0acd547f3149b9ec12eec2f0ca4a6ab2f61753c5b29bb3e795ac4d \
--hash=sha256:2ad3ec9a748a8943e6eb4358201f7e1c12ede35f510b1a2221b70af4bb64295c \
--hash=sha256:301c00cf5e60e08e04d842fc47df641d4a181e651c7135c50dc2762ffe293dbd \
--hash=sha256:39a664e3d26ea854211867d20ebcc8023257c1800ae89773cbba9f9e97bae036 \
--hash=sha256:51bf49c0cd1d52be0a240aa66f3458afc4b95d8993d2d04f0d91fa60c10af6cd \
--hash=sha256:78a63d2df1d947bd9d1b11d35564c2f9e4b57898aae4626638056ec1a231c40c \
--hash=sha256:7cd1328e5bdf0dee621912f5833648e2daca72e3839ec1d6695e91089625f0b4 \
--hash=sha256:8355fc10fd33a5a70981a5b8a0de51d10af3688d7a9e4a34fcc8fa0d7467bb7f \
--hash=sha256:8c79d7cf86d049d0c5089231a5bcd31edb03555bd93d81a16870aa98c6cfb79d \
--hash=sha256:91b8d6768a75247026e951dce3b2aac79dc7e78622fc148329135ba189813584 \
--hash=sha256:94c15ca4e52671a59219146ff584488907b1f9b3fc232622b47e2cf832e94fb8 \
--hash=sha256:98dcbc02e39b1658dc4b4508442a560fe3ca5ca0d989f0df062534e5ca3a5c1a \
--hash=sha256:a64403f634e5ffdcd85e0b12c08f04b3080d3e840aef118721021f9b48fc1460 \
--hash=sha256:bc6e8da415f359b578b00bcfb1d08411c96e9a97f9e6c7adada554a0812a6cc6 \
--hash=sha256:bdc9febce3e68b697d931941b263c59e0c74e8f18861f4064c1f712562903411 \
--hash=sha256:c1ba66c48b19cc9c2975c0d354f24058888cdc674bebadceb3cdc9ec403fb5d1 \
--hash=sha256:c9f707b5bb73bf277d812ded9896f9512a43edff72712f31667d0a8c2f8e71ee \
--hash=sha256:d5422d6a1ea9b15577a9432e26608c73a78faf0b9039437b075cf322c92e98e7 \
--hash=sha256:e5d5420053bbb3dd64c30e58f9363d7a9c27444c3648e61460c1237f9ec3fa14 \
--hash=sha256:e868b0389c5ccfc092031a861d4e158ea164d8b7fdbb10e3b5689b4fc6498df6 \
--hash=sha256:efd9d3abe5774404becdb0748178b48a218f1d8c44e0375475732211ea47c67e \
--hash=sha256:f8c02ec3c4c4fcb718fdf89a6c6f709b14949408e8cf2a2be5bfa9c49548fd85 \
--hash=sha256:ffcf105ecdd9396e05a8e58e81faaaf34d3f9875f137c7372450baa5d77c9a54
packaging==21.3 ; python_version >= "3.10" and python_version < "4.0" \
--hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \
--hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522

2
run.py Normal file → Executable file
View file

@ -1,3 +1,5 @@
#!/usr/bin/env python3
from advlabdb import create_app
if __name__ == "__main__":