From b0965a0aed578f2002a58237ca46f4f152ac27f4 Mon Sep 17 00:00:00 2001 From: Daniel Grams Date: Fri, 12 Feb 2021 15:43:40 +0100 Subject: [PATCH] Add isort #109 --- .github/workflows/lint.yml | 1 + .isort.cfg | 4 + .pre-commit-config.yaml | 5 + .vscode/settings.json | 16 ++- migrations/env.py | 4 +- migrations/versions/00daa8c472ba_.py | 4 +- migrations/versions/021f602d9965_.py | 3 +- migrations/versions/091deace5f08_.py | 5 +- migrations/versions/0a282a331e35_.py | 4 +- migrations/versions/1fb9f679defb_.py | 4 +- migrations/versions/27da3ceea723_.py | 3 +- migrations/versions/31b60d93351d_.py | 4 +- migrations/versions/35a6577b6af8_.py | 4 +- migrations/versions/3c5b34fd1156_.py | 7 +- migrations/versions/41512b20e07c_.py | 4 +- migrations/versions/4e913af88c33_.py | 4 +- migrations/versions/50337ecd23db_.py | 4 +- migrations/versions/51c47c7f0bdb_.py | 3 +- migrations/versions/5c8457f2eac1_.py | 3 +- migrations/versions/62e071b0da50_.py | 4 +- migrations/versions/67216b6cf293_.py | 4 +- migrations/versions/699c4f6a7fe8_.py | 4 +- migrations/versions/6b7016f73688_.py | 5 +- migrations/versions/6be822396123_.py | 5 +- migrations/versions/75c07cb9cfe3_.py | 3 +- migrations/versions/7afc40e11791_.py | 4 +- migrations/versions/7b105c6e08bf_.py | 4 +- migrations/versions/8f4df40a36f3_.py | 4 +- migrations/versions/92f37474ad62_.py | 3 +- migrations/versions/975c22ae802b_.py | 4 +- migrations/versions/a0a248667cd8_.py | 6 +- migrations/versions/a336ac384c64_.py | 4 +- migrations/versions/a75bd9c8ad3a_.py | 5 +- migrations/versions/a8c662c46047_.py | 4 +- migrations/versions/abf0f671ba27_.py | 3 +- migrations/versions/b128cc637447_.py | 4 +- migrations/versions/b1a6e7630185_.py | 4 +- migrations/versions/b1c05324cc13_.py | 4 +- migrations/versions/bbad7e33a780_.py | 3 +- migrations/versions/cce1284874fa_.py | 4 +- migrations/versions/da63ba1d58b1_.py | 4 +- migrations/versions/dcd0b71650b0_.py | 4 +- migrations/versions/dddeceadde74_.py | 5 +- migrations/versions/e33f225323f3_.py | 4 +- migrations/versions/ed6bb2084bbd_.py | 3 +- migrations/versions/f1bc3fa623c7_.py | 5 +- migrations/versions/f71c86333bfb_.py | 4 +- migrations/versions/fd7794ece0b3_.py | 4 +- project/__init__.py | 43 ++++---- project/access.py | 7 +- project/api/__init__.py | 25 ++--- project/api/dump/resources.py | 5 +- project/api/dump/schemas.py | 13 +-- project/api/event/resources.py | 25 ++--- project/api/event/schemas.py | 43 ++++---- project/api/event_category/resources.py | 5 +- project/api/event_category/schemas.py | 5 +- project/api/event_date/resources.py | 11 ++- project/api/event_date/schemas.py | 5 +- project/api/event_reference/resources.py | 5 +- project/api/event_reference/schemas.py | 5 +- project/api/fields.py | 3 +- project/api/location/schemas.py | 5 +- project/api/organization/resources.py | 99 ++++++++++--------- project/api/organization/schemas.py | 5 +- project/api/organizer/resources.py | 23 ++--- project/api/organizer/schemas.py | 19 ++-- project/api/place/resources.py | 23 ++--- project/api/place/schemas.py | 13 +-- project/api/resources.py | 4 +- project/api/schemas.py | 3 +- project/cli/dump.py | 46 ++++----- project/cli/event.py | 1 + project/cli/user.py | 1 + project/dateutils.py | 5 +- project/dbtypes.py | 2 +- project/forms/admin.py | 5 +- project/forms/admin_unit.py | 10 +- project/forms/admin_unit_member.py | 1 + project/forms/common.py | 9 +- project/forms/event.py | 27 ++--- project/forms/event_date.py | 8 +- project/forms/event_place.py | 11 +-- project/forms/event_suggestion.py | 19 ++-- project/forms/oauth2_client.py | 16 +-- project/forms/oauth2_token.py | 2 +- project/forms/organizer.py | 10 +- project/forms/planing.py | 5 +- project/forms/reference.py | 1 + project/forms/reference_request.py | 1 + project/forms/security.py | 7 +- project/forms/widgets.py | 12 ++- project/i10n.py | 5 +- project/init_data.py | 7 +- project/jinja_filters.py | 5 +- project/jsonld.py | 4 +- project/models.py | 58 +++++------ project/oauth2.py | 12 +-- project/services/admin_unit.py | 7 +- project/services/event.py | 19 ++-- project/services/event_search.py | 7 +- project/services/event_suggestion.py | 5 +- project/services/image.py | 3 +- project/services/oauth2_client.py | 4 +- project/services/organizer.py | 3 +- project/services/place.py | 3 +- project/services/reference.py | 5 +- project/services/user.py | 3 +- project/utils.py | 7 +- project/views/admin.py | 19 ++-- project/views/admin_unit.py | 11 +-- project/views/admin_unit_member.py | 23 ++--- project/views/admin_unit_member_invitation.py | 33 ++++--- project/views/api.py | 7 +- project/views/dump.py | 3 +- project/views/event.py | 60 +++++------ project/views/event_date.py | 12 ++- project/views/event_place.py | 17 ++-- project/views/event_suggestion.py | 14 ++- project/views/image.py | 12 ++- project/views/manage.py | 54 +++++----- project/views/oauth.py | 5 +- project/views/oauth2_client.py | 27 ++--- project/views/oauth2_token.py | 15 ++- project/views/organizer.py | 17 ++-- project/views/planing.py | 5 +- project/views/reference.py | 30 +++--- project/views/reference_request.py | 39 ++++---- project/views/reference_request_review.py | 21 ++-- project/views/root.py | 10 +- project/views/user.py | 5 +- project/views/utils.py | 9 +- project/views/widget.py | 60 +++++------ requirements.txt | 1 + tests/api/test___init__.py | 3 +- tests/api/test_event.py | 4 +- tests/api/test_fields.py | 3 +- tests/conftest.py | 6 +- tests/form.py | 1 + tests/seeder.py | 14 +-- tests/services/test_event.py | 2 +- tests/test___init__.py | 3 +- tests/test_access.py | 7 +- tests/test_dateutils.py | 1 + tests/test_jsonld.py | 7 +- tests/utils.py | 5 +- tests/views/test_admin_unit.py | 2 +- tests/views/test_event_suggestion.py | 4 +- tests/views/test_image.py | 4 +- tests/views/test_reference_request_review.py | 2 +- tests/views/test_root.py | 1 + tests/views/test_widget.py | 8 +- 152 files changed, 799 insertions(+), 741 deletions(-) create mode 100644 .isort.cfg diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a1b4ae0..51d4a27 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,5 +8,6 @@ jobs: steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 + - uses: jamescurtin/isort-action@master - uses: psf/black@stable - uses: TrueBrain/actions-flake8@v1.4.1 \ No newline at end of file diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..b048a40 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,4 @@ +[settings] +profile = black +multi_line_output = 3 +skip = env \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 65d80a7..309ed3c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,9 @@ repos: + - repo: https://github.com/pycqa/isort + rev: 5.6.3 + hooks: + - id: isort + name: isort (python) - repo: https://github.com/psf/black rev: stable hooks: diff --git a/.vscode/settings.json b/.vscode/settings.json index eb199a5..4aa5d94 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,13 +1,23 @@ { - "python.pythonPath": "/Users/daniel/Projects/gsevpt/env/bin/python3", + "editor.formatOnSave": true, + "python.pythonPath": "./env/bin/python3", "python.formatting.provider": "black", + "python.sortImports.args": [ + "-sp .isort.cfg" + ], "python.linting.enabled": true, "python.linting.pylintEnabled": false, "python.linting.flake8Enabled": true, "python.testing.pytestArgs": [ - "tests", "--capture=sys" + "tests", + "--capture=sys" ], "python.testing.unittestEnabled": false, "python.testing.nosetestsEnabled": false, - "python.testing.pytestEnabled": true + "python.testing.pytestEnabled": true, + "[python]": { + "editor.codeActionsOnSave": { + "source.organizeImports": true + } + } } \ No newline at end of file diff --git a/migrations/env.py b/migrations/env.py index 4ae1a24..22c2ca7 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -3,10 +3,8 @@ from __future__ import with_statement import logging from logging.config import fileConfig -from sqlalchemy import engine_from_config -from sqlalchemy import pool - from alembic import context +from sqlalchemy import engine_from_config, pool # this is the Alembic Config object, which provides # access to the values within the .ini file in use. diff --git a/migrations/versions/00daa8c472ba_.py b/migrations/versions/00daa8c472ba_.py index 900bbac..c403cec 100644 --- a/migrations/versions/00daa8c472ba_.py +++ b/migrations/versions/00daa8c472ba_.py @@ -5,11 +5,11 @@ Revises: 50337ecd23db Create Date: 2020-10-27 20:58:57.392619 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "00daa8c472ba" diff --git a/migrations/versions/021f602d9965_.py b/migrations/versions/021f602d9965_.py index 48bdae2..5780c03 100644 --- a/migrations/versions/021f602d9965_.py +++ b/migrations/versions/021f602d9965_.py @@ -5,9 +5,10 @@ Revises: 92f37474ad62 Create Date: 2020-10-22 17:59:27.823624 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils +from alembic import op + from project import dbtypes from project.models import EventRejectionReason, EventReviewStatus diff --git a/migrations/versions/091deace5f08_.py b/migrations/versions/091deace5f08_.py index 3eee5eb..7e08304 100644 --- a/migrations/versions/091deace5f08_.py +++ b/migrations/versions/091deace5f08_.py @@ -5,11 +5,10 @@ Revises: 6b7016f73688 Create Date: 2020-10-02 09:29:12.932229 """ -from alembic import op import sqlalchemy as sa -from sqlalchemy.sql import text +from alembic import op from geoalchemy2.types import Geometry - +from sqlalchemy.sql import text # revision identifiers, used by Alembic. revision = "091deace5f08" diff --git a/migrations/versions/0a282a331e35_.py b/migrations/versions/0a282a331e35_.py index 0b05fb9..96d8176 100644 --- a/migrations/versions/0a282a331e35_.py +++ b/migrations/versions/0a282a331e35_.py @@ -5,11 +5,11 @@ Revises: da63ba1d58b1 Create Date: 2020-10-18 11:55:12.315808 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "0a282a331e35" diff --git a/migrations/versions/1fb9f679defb_.py b/migrations/versions/1fb9f679defb_.py index 1cabf11..2aa9cf5 100644 --- a/migrations/versions/1fb9f679defb_.py +++ b/migrations/versions/1fb9f679defb_.py @@ -5,11 +5,11 @@ Revises: b1a6e7630185 Create Date: 2021-02-07 17:54:44.257540 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "1fb9f679defb" diff --git a/migrations/versions/27da3ceea723_.py b/migrations/versions/27da3ceea723_.py index 4428dfd..9e8ec06 100644 --- a/migrations/versions/27da3ceea723_.py +++ b/migrations/versions/27da3ceea723_.py @@ -5,10 +5,9 @@ Revises: 00daa8c472ba Create Date: 2020-11-08 16:14:01.866196 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils - +from alembic import op # revision identifiers, used by Alembic. revision = "27da3ceea723" diff --git a/migrations/versions/31b60d93351d_.py b/migrations/versions/31b60d93351d_.py index 10f7754..167b0b6 100644 --- a/migrations/versions/31b60d93351d_.py +++ b/migrations/versions/31b60d93351d_.py @@ -5,11 +5,11 @@ Revises: 3c5b34fd1156 Create Date: 2020-12-12 13:48:34.244288 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "31b60d93351d" diff --git a/migrations/versions/35a6577b6af8_.py b/migrations/versions/35a6577b6af8_.py index 89886f9..4191f2a 100644 --- a/migrations/versions/35a6577b6af8_.py +++ b/migrations/versions/35a6577b6af8_.py @@ -5,11 +5,11 @@ Revises: a0a248667cd8 Create Date: 2021-01-25 10:37:41.116909 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "35a6577b6af8" diff --git a/migrations/versions/3c5b34fd1156_.py b/migrations/versions/3c5b34fd1156_.py index 354a191..75176e3 100644 --- a/migrations/versions/3c5b34fd1156_.py +++ b/migrations/versions/3c5b34fd1156_.py @@ -5,13 +5,14 @@ Revises: 27da3ceea723 Create Date: 2020-11-08 19:11:32.132404 """ -from alembic import op import sqlalchemy as sa -from sqlalchemy import orm import sqlalchemy_utils -from project import dbtypes +from alembic import op +from sqlalchemy import orm from sqlalchemy.ext.declarative import declarative_base +from project import dbtypes + # revision identifiers, used by Alembic. revision = "3c5b34fd1156" down_revision = "27da3ceea723" diff --git a/migrations/versions/41512b20e07c_.py b/migrations/versions/41512b20e07c_.py index 3e7ecd4..fe37fd6 100644 --- a/migrations/versions/41512b20e07c_.py +++ b/migrations/versions/41512b20e07c_.py @@ -5,11 +5,11 @@ Revises: fd7794ece0b3 Create Date: 2020-07-17 19:54:25.703175 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "41512b20e07c" diff --git a/migrations/versions/4e913af88c33_.py b/migrations/versions/4e913af88c33_.py index df4dea5..073b7ae 100644 --- a/migrations/versions/4e913af88c33_.py +++ b/migrations/versions/4e913af88c33_.py @@ -5,11 +5,11 @@ Revises: 67216b6cf293 Create Date: 2020-09-18 15:04:03.359403 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "4e913af88c33" diff --git a/migrations/versions/50337ecd23db_.py b/migrations/versions/50337ecd23db_.py index f7879ca..f19187a 100644 --- a/migrations/versions/50337ecd23db_.py +++ b/migrations/versions/50337ecd23db_.py @@ -5,11 +5,11 @@ Revises: 6be822396123 Create Date: 2020-10-27 20:31:42.566357 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "50337ecd23db" diff --git a/migrations/versions/51c47c7f0bdb_.py b/migrations/versions/51c47c7f0bdb_.py index 326a588..1480f8f 100644 --- a/migrations/versions/51c47c7f0bdb_.py +++ b/migrations/versions/51c47c7f0bdb_.py @@ -5,9 +5,8 @@ Revises: 7afc40e11791 Create Date: 2020-09-29 15:38:44.033998 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "51c47c7f0bdb" diff --git a/migrations/versions/5c8457f2eac1_.py b/migrations/versions/5c8457f2eac1_.py index ef5b2f7..7245a31 100644 --- a/migrations/versions/5c8457f2eac1_.py +++ b/migrations/versions/5c8457f2eac1_.py @@ -5,9 +5,8 @@ Revises: ed6bb2084bbd Create Date: 2020-07-13 19:01:04.770613 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "5c8457f2eac1" diff --git a/migrations/versions/62e071b0da50_.py b/migrations/versions/62e071b0da50_.py index e447b1c..ca5a7c4 100644 --- a/migrations/versions/62e071b0da50_.py +++ b/migrations/versions/62e071b0da50_.py @@ -5,11 +5,11 @@ Revises: dcd0b71650b0 Create Date: 2020-07-30 13:13:44.694716 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "62e071b0da50" diff --git a/migrations/versions/67216b6cf293_.py b/migrations/versions/67216b6cf293_.py index fbb69d1..a451f2f 100644 --- a/migrations/versions/67216b6cf293_.py +++ b/migrations/versions/67216b6cf293_.py @@ -5,12 +5,12 @@ Revises: a336ac384c64 Create Date: 2020-08-01 15:43:11.377833 """ -from alembic import op import sqlalchemy as sa +from alembic import op + from project import dbtypes from project.models import EventRejectionReason, EventReviewStatus - # revision identifiers, used by Alembic. revision = "67216b6cf293" down_revision = "a336ac384c64" diff --git a/migrations/versions/699c4f6a7fe8_.py b/migrations/versions/699c4f6a7fe8_.py index b75cde8..1e31e09 100644 --- a/migrations/versions/699c4f6a7fe8_.py +++ b/migrations/versions/699c4f6a7fe8_.py @@ -5,11 +5,11 @@ Revises: b1c05324cc13 Create Date: 2020-07-28 16:29:41.403957 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "699c4f6a7fe8" diff --git a/migrations/versions/6b7016f73688_.py b/migrations/versions/6b7016f73688_.py index d56fb86..74035ab 100644 --- a/migrations/versions/6b7016f73688_.py +++ b/migrations/versions/6b7016f73688_.py @@ -5,12 +5,13 @@ Revises: a75bd9c8ad3a Create Date: 2020-10-01 11:09:16.765736 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op from sqlalchemy.dialects import postgresql +from project import dbtypes + # revision identifiers, used by Alembic. revision = "6b7016f73688" down_revision = "a75bd9c8ad3a" diff --git a/migrations/versions/6be822396123_.py b/migrations/versions/6be822396123_.py index 083745f..4f93fba 100644 --- a/migrations/versions/6be822396123_.py +++ b/migrations/versions/6be822396123_.py @@ -5,12 +5,13 @@ Revises: 021f602d9965 Create Date: 2020-10-23 15:51:36.330825 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op from sqlalchemy.dialects import postgresql +from project import dbtypes + # revision identifiers, used by Alembic. revision = "6be822396123" down_revision = "021f602d9965" diff --git a/migrations/versions/75c07cb9cfe3_.py b/migrations/versions/75c07cb9cfe3_.py index 279dc5e..16d48d7 100644 --- a/migrations/versions/75c07cb9cfe3_.py +++ b/migrations/versions/75c07cb9cfe3_.py @@ -5,10 +5,9 @@ Revises: abf0f671ba27 Create Date: 2020-07-07 10:11:08.217831 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils - +from alembic import op # revision identifiers, used by Alembic. revision = "75c07cb9cfe3" diff --git a/migrations/versions/7afc40e11791_.py b/migrations/versions/7afc40e11791_.py index 6d951b2..6d26a8f 100644 --- a/migrations/versions/7afc40e11791_.py +++ b/migrations/versions/7afc40e11791_.py @@ -5,12 +5,12 @@ Revises: a8c662c46047 Create Date: 2020-09-28 10:38:46.424791 """ -from alembic import op import sqlalchemy as sa +from alembic import op + from project import dbtypes from project.models import FeaturedEventRejectionReason, FeaturedEventReviewStatus - # revision identifiers, used by Alembic. revision = "7afc40e11791" down_revision = "a8c662c46047" diff --git a/migrations/versions/7b105c6e08bf_.py b/migrations/versions/7b105c6e08bf_.py index 469c281..25cabf6 100644 --- a/migrations/versions/7b105c6e08bf_.py +++ b/migrations/versions/7b105c6e08bf_.py @@ -5,11 +5,11 @@ Revises: dddeceadde74 Create Date: 2020-12-30 17:38:19.511314 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "7b105c6e08bf" diff --git a/migrations/versions/8f4df40a36f3_.py b/migrations/versions/8f4df40a36f3_.py index 4316eb7..21f102b 100644 --- a/migrations/versions/8f4df40a36f3_.py +++ b/migrations/versions/8f4df40a36f3_.py @@ -5,11 +5,11 @@ Revises: f71c86333bfb Create Date: 2020-09-24 18:53:02.861732 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "8f4df40a36f3" diff --git a/migrations/versions/92f37474ad62_.py b/migrations/versions/92f37474ad62_.py index 4c11377..063bc57 100644 --- a/migrations/versions/92f37474ad62_.py +++ b/migrations/versions/92f37474ad62_.py @@ -5,9 +5,8 @@ Revises: 0a282a331e35 Create Date: 2020-10-18 13:06:47.639083 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "92f37474ad62" diff --git a/migrations/versions/975c22ae802b_.py b/migrations/versions/975c22ae802b_.py index 8114754..3ddd39d 100644 --- a/migrations/versions/975c22ae802b_.py +++ b/migrations/versions/975c22ae802b_.py @@ -5,11 +5,11 @@ Revises: 5c8457f2eac1 Create Date: 2020-07-17 11:27:53.084732 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "975c22ae802b" diff --git a/migrations/versions/a0a248667cd8_.py b/migrations/versions/a0a248667cd8_.py index 30e1e80..6981e59 100644 --- a/migrations/versions/a0a248667cd8_.py +++ b/migrations/versions/a0a248667cd8_.py @@ -5,12 +5,12 @@ Revises: e33f225323f3 Create Date: 2021-01-18 15:02:58.354511 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes -from project.models import EventTargetGroupOrigin, EventAttendanceMode +from alembic import op +from project import dbtypes +from project.models import EventAttendanceMode, EventTargetGroupOrigin # revision identifiers, used by Alembic. revision = "a0a248667cd8" diff --git a/migrations/versions/a336ac384c64_.py b/migrations/versions/a336ac384c64_.py index 6f3413e..3108290 100644 --- a/migrations/versions/a336ac384c64_.py +++ b/migrations/versions/a336ac384c64_.py @@ -5,11 +5,11 @@ Revises: 62e071b0da50 Create Date: 2020-07-31 16:30:19.185088 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "a336ac384c64" diff --git a/migrations/versions/a75bd9c8ad3a_.py b/migrations/versions/a75bd9c8ad3a_.py index ce11bca..fb41c0a 100644 --- a/migrations/versions/a75bd9c8ad3a_.py +++ b/migrations/versions/a75bd9c8ad3a_.py @@ -5,10 +5,11 @@ Revises: 51c47c7f0bdb Create Date: 2020-09-29 16:53:02.520125 """ -from alembic import op import sqlalchemy as sa -from project import dbtypes +from alembic import op from sqlalchemy.dialects import postgresql + +from project import dbtypes from project.models import ( EventReferenceRequestRejectionReason, EventReferenceRequestReviewStatus, diff --git a/migrations/versions/a8c662c46047_.py b/migrations/versions/a8c662c46047_.py index 670324e..5b8eb5b 100644 --- a/migrations/versions/a8c662c46047_.py +++ b/migrations/versions/a8c662c46047_.py @@ -5,11 +5,11 @@ Revises: 8f4df40a36f3 Create Date: 2020-09-25 11:26:03.139800 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "a8c662c46047" diff --git a/migrations/versions/abf0f671ba27_.py b/migrations/versions/abf0f671ba27_.py index 7d464db..1633b22 100644 --- a/migrations/versions/abf0f671ba27_.py +++ b/migrations/versions/abf0f671ba27_.py @@ -5,10 +5,9 @@ Revises: bbad7e33a780 Create Date: 2020-06-30 21:09:35.692876 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils - +from alembic import op # revision identifiers, used by Alembic. revision = "abf0f671ba27" diff --git a/migrations/versions/b128cc637447_.py b/migrations/versions/b128cc637447_.py index 3f0ad95..305155e 100644 --- a/migrations/versions/b128cc637447_.py +++ b/migrations/versions/b128cc637447_.py @@ -5,11 +5,11 @@ Revises: 41512b20e07c Create Date: 2020-07-26 15:20:17.685921 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "b128cc637447" diff --git a/migrations/versions/b1a6e7630185_.py b/migrations/versions/b1a6e7630185_.py index 2c136f8..88da59b 100644 --- a/migrations/versions/b1a6e7630185_.py +++ b/migrations/versions/b1a6e7630185_.py @@ -5,11 +5,11 @@ Revises: 35a6577b6af8 Create Date: 2021-01-25 11:38:36.483434 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "b1a6e7630185" diff --git a/migrations/versions/b1c05324cc13_.py b/migrations/versions/b1c05324cc13_.py index b6e12ba..70612c2 100644 --- a/migrations/versions/b1c05324cc13_.py +++ b/migrations/versions/b1c05324cc13_.py @@ -5,11 +5,11 @@ Revises: cce1284874fa Create Date: 2020-07-26 16:08:39.066127 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "b1c05324cc13" diff --git a/migrations/versions/bbad7e33a780_.py b/migrations/versions/bbad7e33a780_.py index 661c020..32393ad 100644 --- a/migrations/versions/bbad7e33a780_.py +++ b/migrations/versions/bbad7e33a780_.py @@ -5,9 +5,8 @@ Revises: Create Date: 2020-06-24 21:17:25.548159 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "bbad7e33a780" diff --git a/migrations/versions/cce1284874fa_.py b/migrations/versions/cce1284874fa_.py index b4b6a5d..5fcebce 100644 --- a/migrations/versions/cce1284874fa_.py +++ b/migrations/versions/cce1284874fa_.py @@ -5,11 +5,11 @@ Revises: b128cc637447 Create Date: 2020-07-26 15:48:47.723256 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "cce1284874fa" diff --git a/migrations/versions/da63ba1d58b1_.py b/migrations/versions/da63ba1d58b1_.py index c9c816e..c3e1246 100644 --- a/migrations/versions/da63ba1d58b1_.py +++ b/migrations/versions/da63ba1d58b1_.py @@ -5,11 +5,11 @@ Revises: 091deace5f08 Create Date: 2020-10-04 17:06:54.502012 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "da63ba1d58b1" diff --git a/migrations/versions/dcd0b71650b0_.py b/migrations/versions/dcd0b71650b0_.py index 811c074..ddf1852 100644 --- a/migrations/versions/dcd0b71650b0_.py +++ b/migrations/versions/dcd0b71650b0_.py @@ -5,11 +5,11 @@ Revises: 699c4f6a7fe8 Create Date: 2020-07-28 17:10:49.606513 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "dcd0b71650b0" diff --git a/migrations/versions/dddeceadde74_.py b/migrations/versions/dddeceadde74_.py index 441cad6..8aed2f4 100644 --- a/migrations/versions/dddeceadde74_.py +++ b/migrations/versions/dddeceadde74_.py @@ -5,12 +5,13 @@ Revises: 31b60d93351d Create Date: 2020-12-30 16:44:29.013647 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op from sqlalchemy.dialects import postgresql +from project import dbtypes + # revision identifiers, used by Alembic. revision = "dddeceadde74" down_revision = "31b60d93351d" diff --git a/migrations/versions/e33f225323f3_.py b/migrations/versions/e33f225323f3_.py index 3f00ee5..3691fe9 100644 --- a/migrations/versions/e33f225323f3_.py +++ b/migrations/versions/e33f225323f3_.py @@ -5,11 +5,11 @@ Revises: 7b105c6e08bf Create Date: 2020-12-30 17:59:47.917389 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "e33f225323f3" diff --git a/migrations/versions/ed6bb2084bbd_.py b/migrations/versions/ed6bb2084bbd_.py index c9b639e..c90faae 100644 --- a/migrations/versions/ed6bb2084bbd_.py +++ b/migrations/versions/ed6bb2084bbd_.py @@ -5,9 +5,8 @@ Revises: f1bc3fa623c7 Create Date: 2020-07-08 08:53:44.373606 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "ed6bb2084bbd" diff --git a/migrations/versions/f1bc3fa623c7_.py b/migrations/versions/f1bc3fa623c7_.py index 4a609c6..f63035e 100644 --- a/migrations/versions/f1bc3fa623c7_.py +++ b/migrations/versions/f1bc3fa623c7_.py @@ -5,10 +5,11 @@ Revises: 75c07cb9cfe3 Create Date: 2020-07-07 15:49:58.653888 """ -from alembic import op import sqlalchemy as sa +from alembic import op + from project import dbtypes -from project.models import EventTargetGroupOrigin, EventAttendanceMode, EventStatus +from project.models import EventAttendanceMode, EventStatus, EventTargetGroupOrigin # revision identifiers, used by Alembic. revision = "f1bc3fa623c7" diff --git a/migrations/versions/f71c86333bfb_.py b/migrations/versions/f71c86333bfb_.py index e5470e9..466d096 100644 --- a/migrations/versions/f71c86333bfb_.py +++ b/migrations/versions/f71c86333bfb_.py @@ -5,11 +5,11 @@ Revises: 4e913af88c33 Create Date: 2020-09-18 15:27:37.608869 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "f71c86333bfb" diff --git a/migrations/versions/fd7794ece0b3_.py b/migrations/versions/fd7794ece0b3_.py index 97be003..9f8ce6e 100644 --- a/migrations/versions/fd7794ece0b3_.py +++ b/migrations/versions/fd7794ece0b3_.py @@ -5,11 +5,11 @@ Revises: 975c22ae802b Create Date: 2020-07-17 19:51:08.457429 """ -from alembic import op import sqlalchemy as sa import sqlalchemy_utils -from project import dbtypes +from alembic import op +from project import dbtypes # revision identifiers, used by Alembic. revision = "fd7794ece0b3" diff --git a/project/__init__.py b/project/__init__.py index 991878c..7a92135 100644 --- a/project/__init__.py +++ b/project/__init__.py @@ -1,17 +1,16 @@ import os -from flask import Flask, url_for, redirect, request, jsonify -from flask_sqlalchemy import SQLAlchemy -from flask_security import ( - Security, - SQLAlchemySessionUserDatastore, -) + +from flask import Flask, jsonify, redirect, request, url_for from flask_babelex import Babel from flask_cors import CORS -from flask_qrcode import QRcode +from flask_gzip import Gzip from flask_mail import Mail, email_dispatched from flask_migrate import Migrate -from flask_gzip import Gzip +from flask_qrcode import QRcode +from flask_security import Security, SQLAlchemySessionUserDatastore +from flask_sqlalchemy import SQLAlchemy from webargs import flaskparser + from project.custom_session_interface import CustomSessionInterface # Create app @@ -97,10 +96,11 @@ from project.jsonld import DateTimeEncoder app.json_encoder = DateTimeEncoder -# Setup Flask-Security -from project.models import User, Role from project.forms.security import ExtendedRegisterForm +# Setup Flask-Security +from project.models import Role, User + user_datastore = SQLAlchemySessionUserDatastore(db.session, User, Role) security = Security(app, user_datastore, register_form=ExtendedRegisterForm) app.session_interface = CustomSessionInterface() @@ -112,9 +112,14 @@ config_oauth(app) # Init misc modules -from project import i10n -from project import jinja_filters -from project import init_data +# API Resources +import project.api +import project.cli.dump + +# Command line +import project.cli.event +import project.cli.user +from project import i10n, init_data, jinja_filters # Routes from project.views import ( @@ -123,17 +128,17 @@ from project.views import ( admin_unit_member, admin_unit_member_invitation, api, + dump, event, event_date, event_place, event_suggestion, - dump, image, manage, - organizer, oauth, oauth2_client, oauth2_token, + organizer, planing, reference, reference_request, @@ -143,13 +148,5 @@ from project.views import ( widget, ) -# API Resources -import project.api - -# Command line -import project.cli.event -import project.cli.dump -import project.cli.user - if __name__ == "__main__": # pragma: no cover app.run() diff --git a/project/access.py b/project/access.py index a116324..a4e3f27 100644 --- a/project/access.py +++ b/project/access.py @@ -1,12 +1,13 @@ from flask import abort from flask_login import login_user +from flask_principal import Permission from flask_security import current_user from flask_security.utils import FsPermNeed -from flask_principal import Permission -from project.models import AdminUnitMember, AdminUnit -from project.services.admin_unit import get_member_for_admin_unit_by_user_id from sqlalchemy import and_ +from project.models import AdminUnit, AdminUnitMember +from project.services.admin_unit import get_member_for_admin_unit_by_user_id + def has_current_user_permission(permission): user_perm = Permission(FsPermNeed(permission)) diff --git a/project/api/__init__.py b/project/api/__init__.py index 7662634..ded6489 100644 --- a/project/api/__init__.py +++ b/project/api/__init__.py @@ -1,16 +1,17 @@ -from flask_restful import Api -from sqlalchemy.exc import IntegrityError -from psycopg2.errorcodes import UNIQUE_VIOLATION, CHECK_VIOLATION -from werkzeug.exceptions import HTTPException, UnprocessableEntity -from marshmallow import ValidationError -from project.utils import get_localized_scope -from project import app -from flask_marshmallow import Marshmallow from apispec import APISpec -from apispec.ext.marshmallow import MarshmallowPlugin -from flask_apispec.extension import FlaskApiSpec -from flask import url_for from apispec.exceptions import DuplicateComponentNameError +from apispec.ext.marshmallow import MarshmallowPlugin +from flask import url_for +from flask_apispec.extension import FlaskApiSpec +from flask_marshmallow import Marshmallow +from flask_restful import Api +from marshmallow import ValidationError +from psycopg2.errorcodes import CHECK_VIOLATION, UNIQUE_VIOLATION +from sqlalchemy.exc import IntegrityError +from werkzeug.exceptions import HTTPException, UnprocessableEntity + +from project import app +from project.utils import get_localized_scope class RestApi(Api): @@ -165,11 +166,11 @@ def add_oauth2_scheme_with_transport(insecure: bool): marshmallow_plugin.converter.add_attribute_function(enum_to_properties) +import project.api.dump.resources import project.api.event.resources import project.api.event_category.resources import project.api.event_date.resources import project.api.event_reference.resources -import project.api.dump.resources import project.api.organization.resources import project.api.organizer.resources import project.api.place.resources diff --git a/project/api/dump/resources.py b/project/api/dump/resources.py index 7e5d284..c98db94 100644 --- a/project/api/dump/resources.py +++ b/project/api/dump/resources.py @@ -1,8 +1,9 @@ +from flask_apispec import doc, marshal_with + from project.api import add_api_resource -from flask_apispec import marshal_with, doc +from project.api.dump.schemas import DumpResponseSchema from project.api.resources import BaseResource from project.api.schemas import NoneSchema -from project.api.dump.schemas import DumpResponseSchema class DumpResource(BaseResource): diff --git a/project/api/dump/schemas.py b/project/api/dump/schemas.py index 649e802..facdb78 100644 --- a/project/api/dump/schemas.py +++ b/project/api/dump/schemas.py @@ -1,13 +1,14 @@ -from project.api import marshmallow from marshmallow import fields + +from project.api import marshmallow from project.api.event.schemas import EventDumpSchema -from project.api.place.schemas import PlaceDumpSchema -from project.api.location.schemas import LocationDumpSchema from project.api.event_category.schemas import EventCategoryDumpSchema -from project.api.organizer.schemas import OrganizerDumpSchema -from project.api.image.schemas import ImageDumpSchema -from project.api.organization.schemas import OrganizationDumpSchema from project.api.event_reference.schemas import EventReferenceDumpSchema +from project.api.image.schemas import ImageDumpSchema +from project.api.location.schemas import LocationDumpSchema +from project.api.organization.schemas import OrganizationDumpSchema +from project.api.organizer.schemas import OrganizerDumpSchema +from project.api.place.schemas import PlaceDumpSchema class DumpResponseSchema(marshmallow.Schema): diff --git a/project/api/event/resources.py b/project/api/event/resources.py index 152071f..518e17e 100644 --- a/project/api/event/resources.py +++ b/project/api/event/resources.py @@ -1,32 +1,33 @@ -from project.api import add_api_resource +from authlib.integrations.flask_oauth2 import current_token from flask import make_response -from flask_apispec import marshal_with, doc, use_kwargs -from project.api.resources import BaseResource +from flask_apispec import doc, marshal_with, use_kwargs +from sqlalchemy.orm import lazyload, load_only + +from project import db +from project.access import access_or_401, login_api_user_or_401 +from project.api import add_api_resource from project.api.event.schemas import ( - EventSchema, EventListRequestSchema, EventListResponseSchema, + EventPatchRequestSchema, + EventPostRequestSchema, + EventSchema, EventSearchRequestSchema, EventSearchResponseSchema, - EventPostRequestSchema, - EventPatchRequestSchema, ) from project.api.event_date.schemas import ( EventDateListRequestSchema, EventDateListResponseSchema, ) +from project.api.resources import BaseResource from project.models import Event, EventDate +from project.oauth2 import require_oauth from project.services.event import ( - get_events_query, get_event_with_details_or_404, + get_events_query, update_event, ) from project.services.event_search import EventSearchParams -from sqlalchemy.orm import lazyload, load_only -from project.oauth2 import require_oauth -from authlib.integrations.flask_oauth2 import current_token -from project import db -from project.access import access_or_401, login_api_user_or_401 from project.views.event import send_referenced_event_changed_mails diff --git a/project/api/event/schemas.py b/project/api/event/schemas.py index 70a6e97..66f9357 100644 --- a/project/api/event/schemas.py +++ b/project/api/event/schemas.py @@ -1,34 +1,35 @@ -from project.api import marshmallow -from marshmallow import fields, validate, ValidationError +from dateutil.rrule import rrulestr +from marshmallow import ValidationError, fields, validate from marshmallow_enum import EnumField -from project.models import ( - Event, - EventStatus, - EventTargetGroupOrigin, - EventAttendanceMode, -) -from project.api.schemas import ( - SQLAlchemyBaseSchema, - IdSchemaMixin, - TrackableSchemaMixin, - PaginationRequestSchema, - PaginationResponseSchema, + +from project.api import marshmallow +from project.api.event_category.schemas import ( + EventCategoryIdSchema, + EventCategoryRefSchema, + EventCategoryWriteIdSchema, ) +from project.api.fields import CustomDateTimeField +from project.api.image.schemas import ImageSchema from project.api.organization.schemas import OrganizationRefSchema from project.api.organizer.schemas import OrganizerRefSchema, OrganizerWriteIdSchema -from project.api.image.schemas import ImageSchema from project.api.place.schemas import ( PlaceRefSchema, PlaceSearchItemSchema, PlaceWriteIdSchema, ) -from project.api.event_category.schemas import ( - EventCategoryRefSchema, - EventCategoryIdSchema, - EventCategoryWriteIdSchema, +from project.api.schemas import ( + IdSchemaMixin, + PaginationRequestSchema, + PaginationResponseSchema, + SQLAlchemyBaseSchema, + TrackableSchemaMixin, +) +from project.models import ( + Event, + EventAttendanceMode, + EventStatus, + EventTargetGroupOrigin, ) -from project.api.fields import CustomDateTimeField -from dateutil.rrule import rrulestr class EventModelSchema(SQLAlchemyBaseSchema): diff --git a/project/api/event_category/resources.py b/project/api/event_category/resources.py index d0ca029..f5e035b 100644 --- a/project/api/event_category/resources.py +++ b/project/api/event_category/resources.py @@ -1,10 +1,11 @@ +from flask_apispec import doc, marshal_with, use_kwargs + from project.api import add_api_resource -from flask_apispec import marshal_with, doc, use_kwargs -from project.api.resources import BaseResource from project.api.event_category.schemas import ( EventCategoryListRequestSchema, EventCategoryListResponseSchema, ) +from project.api.resources import BaseResource from project.models import EventCategory diff --git a/project/api/event_category/schemas.py b/project/api/event_category/schemas.py index faebdc5..0bf21ed 100644 --- a/project/api/event_category/schemas.py +++ b/project/api/event_category/schemas.py @@ -1,13 +1,14 @@ from marshmallow import fields + from project.api import marshmallow -from project.models import EventCategory from project.api.schemas import ( - SQLAlchemyBaseSchema, IdSchemaMixin, PaginationRequestSchema, PaginationResponseSchema, + SQLAlchemyBaseSchema, WriteIdSchemaMixin, ) +from project.models import EventCategory class EventCategoryModelSchema(SQLAlchemyBaseSchema): diff --git a/project/api/event_date/resources.py b/project/api/event_date/resources.py index 1f809e3..419ecc4 100644 --- a/project/api/event_date/resources.py +++ b/project/api/event_date/resources.py @@ -1,17 +1,18 @@ +from flask_apispec import doc, marshal_with, use_kwargs +from sqlalchemy.orm import defaultload, lazyload + from project.api import add_api_resource -from flask_apispec import marshal_with, doc, use_kwargs -from project.api.resources import BaseResource from project.api.event_date.schemas import ( - EventDateSchema, EventDateListRequestSchema, EventDateListResponseSchema, + EventDateSchema, EventDateSearchRequestSchema, EventDateSearchResponseSchema, ) -from project.models import EventDate, Event +from project.api.resources import BaseResource +from project.models import Event, EventDate from project.services.event import get_event_dates_query from project.services.event_search import EventSearchParams -from sqlalchemy.orm import defaultload, lazyload class EventDateListResource(BaseResource): diff --git a/project/api/event_date/schemas.py b/project/api/event_date/schemas.py index 8d283ab..70841e6 100644 --- a/project/api/event_date/schemas.py +++ b/project/api/event_date/schemas.py @@ -1,12 +1,13 @@ -from project.api import marshmallow from marshmallow import fields -from project.models import EventDate + +from project.api import marshmallow from project.api.event.schemas import ( EventRefSchema, EventSearchItemSchema, EventSearchRequestSchema, ) from project.api.schemas import PaginationRequestSchema, PaginationResponseSchema +from project.models import EventDate class EventDateSchema(marshmallow.SQLAlchemySchema): diff --git a/project/api/event_reference/resources.py b/project/api/event_reference/resources.py index adc5d79..84531a1 100644 --- a/project/api/event_reference/resources.py +++ b/project/api/event_reference/resources.py @@ -1,7 +1,8 @@ +from flask_apispec import doc, marshal_with + from project.api import add_api_resource -from flask_apispec import marshal_with, doc -from project.api.resources import BaseResource from project.api.event_reference.schemas import EventReferenceSchema +from project.api.resources import BaseResource from project.models import EventReference diff --git a/project/api/event_reference/schemas.py b/project/api/event_reference/schemas.py index df3200c..0be4320 100644 --- a/project/api/event_reference/schemas.py +++ b/project/api/event_reference/schemas.py @@ -1,9 +1,10 @@ from marshmallow import fields + from project.api import marshmallow -from project.models import EventReference -from project.api.schemas import PaginationRequestSchema, PaginationResponseSchema from project.api.event.schemas import EventRefSchema from project.api.organization.schemas import OrganizationRefSchema +from project.api.schemas import PaginationRequestSchema, PaginationResponseSchema +from project.models import EventReference class EventReferenceIdSchema(marshmallow.SQLAlchemySchema): diff --git a/project/api/fields.py b/project/api/fields.py index 2d54149..56b9d6e 100644 --- a/project/api/fields.py +++ b/project/api/fields.py @@ -1,4 +1,5 @@ -from marshmallow import fields, ValidationError +from marshmallow import ValidationError, fields + from project.dateutils import berlin_tz diff --git a/project/api/location/schemas.py b/project/api/location/schemas.py index f4155f4..ce841d9 100644 --- a/project/api/location/schemas.py +++ b/project/api/location/schemas.py @@ -1,8 +1,9 @@ -from marshmallow import validate, validates_schema, ValidationError +from marshmallow import ValidationError, validate, validates_schema + from project.api import marshmallow -from project.models import Location from project.api.fields import NumericStr from project.api.schemas import SQLAlchemyBaseSchema +from project.models import Location class LocationModelSchema(SQLAlchemyBaseSchema): diff --git a/project/api/organization/resources.py b/project/api/organization/resources.py index c8ce1bd..22b9262 100644 --- a/project/api/organization/resources.py +++ b/project/api/organization/resources.py @@ -1,59 +1,60 @@ -from project.api import add_api_resource -from flask_apispec import marshal_with, doc, use_kwargs -from project.api.resources import BaseResource -from project.api.organization.schemas import ( - OrganizationSchema, - OrganizationListRequestSchema, - OrganizationListResponseSchema, -) -from project.models import AdminUnit, Event -from project.api.event_date.schemas import ( - EventDateSearchRequestSchema, - EventDateSearchResponseSchema, -) -from project.api.event.schemas import ( - EventSearchRequestSchema, - EventSearchResponseSchema, - EventListRequestSchema, - EventListResponseSchema, - EventPostRequestSchema, - EventIdSchema, -) -from project.api.organizer.schemas import ( - OrganizerListRequestSchema, - OrganizerListResponseSchema, - OrganizerIdSchema, - OrganizerPostRequestSchema, -) -from project.api.event_reference.schemas import ( - EventReferenceListRequestSchema, - EventReferenceListResponseSchema, -) -from project.services.reference import ( - get_reference_incoming_query, - get_reference_outgoing_query, -) -from project.api.place.schemas import ( - PlaceListRequestSchema, - PlaceListResponseSchema, - PlaceIdSchema, - PlacePostRequestSchema, -) -from project.services.event import get_event_dates_query, get_events_query, insert_event -from project.services.event_search import EventSearchParams -from project.services.admin_unit import ( - get_admin_unit_query, - get_organizer_query, - get_place_query, -) -from project.oauth2 import require_oauth from authlib.integrations.flask_oauth2 import current_token +from flask_apispec import doc, marshal_with, use_kwargs + from project import db from project.access import ( access_or_401, get_admin_unit_for_manage_or_404, login_api_user_or_401, ) +from project.api import add_api_resource +from project.api.event.schemas import ( + EventIdSchema, + EventListRequestSchema, + EventListResponseSchema, + EventPostRequestSchema, + EventSearchRequestSchema, + EventSearchResponseSchema, +) +from project.api.event_date.schemas import ( + EventDateSearchRequestSchema, + EventDateSearchResponseSchema, +) +from project.api.event_reference.schemas import ( + EventReferenceListRequestSchema, + EventReferenceListResponseSchema, +) +from project.api.organization.schemas import ( + OrganizationListRequestSchema, + OrganizationListResponseSchema, + OrganizationSchema, +) +from project.api.organizer.schemas import ( + OrganizerIdSchema, + OrganizerListRequestSchema, + OrganizerListResponseSchema, + OrganizerPostRequestSchema, +) +from project.api.place.schemas import ( + PlaceIdSchema, + PlaceListRequestSchema, + PlaceListResponseSchema, + PlacePostRequestSchema, +) +from project.api.resources import BaseResource +from project.models import AdminUnit, Event +from project.oauth2 import require_oauth +from project.services.admin_unit import ( + get_admin_unit_query, + get_organizer_query, + get_place_query, +) +from project.services.event import get_event_dates_query, get_events_query, insert_event +from project.services.event_search import EventSearchParams +from project.services.reference import ( + get_reference_incoming_query, + get_reference_outgoing_query, +) class OrganizationResource(BaseResource): diff --git a/project/api/organization/schemas.py b/project/api/organization/schemas.py index 0878df9..1fa2d99 100644 --- a/project/api/organization/schemas.py +++ b/project/api/organization/schemas.py @@ -1,9 +1,10 @@ from marshmallow import fields + from project.api import marshmallow -from project.models import AdminUnit -from project.api.location.schemas import LocationSchema from project.api.image.schemas import ImageSchema +from project.api.location.schemas import LocationSchema from project.api.schemas import PaginationRequestSchema, PaginationResponseSchema +from project.models import AdminUnit class OrganizationIdSchema(marshmallow.SQLAlchemySchema): diff --git a/project/api/organizer/resources.py b/project/api/organizer/resources.py index 152d0da..454aadc 100644 --- a/project/api/organizer/resources.py +++ b/project/api/organizer/resources.py @@ -1,17 +1,18 @@ -from project.api import add_api_resource -from flask import make_response -from flask_apispec import marshal_with, doc, use_kwargs -from project.api.resources import BaseResource -from project.api.organizer.schemas import ( - OrganizerSchema, - OrganizerPostRequestSchema, - OrganizerPatchRequestSchema, -) -from project.models import EventOrganizer -from project.oauth2 import require_oauth from authlib.integrations.flask_oauth2 import current_token +from flask import make_response +from flask_apispec import doc, marshal_with, use_kwargs + from project import db from project.access import access_or_401, login_api_user_or_401 +from project.api import add_api_resource +from project.api.organizer.schemas import ( + OrganizerPatchRequestSchema, + OrganizerPostRequestSchema, + OrganizerSchema, +) +from project.api.resources import BaseResource +from project.models import EventOrganizer +from project.oauth2 import require_oauth class OrganizerResource(BaseResource): diff --git a/project/api/organizer/schemas.py b/project/api/organizer/schemas.py index f45984d..0daf2eb 100644 --- a/project/api/organizer/schemas.py +++ b/project/api/organizer/schemas.py @@ -1,21 +1,22 @@ from marshmallow import fields, validate + from project.api import marshmallow -from project.models import EventOrganizer -from project.api.location.schemas import ( - LocationSchema, - LocationPostRequestSchema, - LocationPatchRequestSchema, -) from project.api.image.schemas import ImageSchema +from project.api.location.schemas import ( + LocationPatchRequestSchema, + LocationPostRequestSchema, + LocationSchema, +) from project.api.organization.schemas import OrganizationRefSchema from project.api.schemas import ( - SQLAlchemyBaseSchema, IdSchemaMixin, - WriteIdSchemaMixin, - TrackableSchemaMixin, PaginationRequestSchema, PaginationResponseSchema, + SQLAlchemyBaseSchema, + TrackableSchemaMixin, + WriteIdSchemaMixin, ) +from project.models import EventOrganizer class OrganizerModelSchema(SQLAlchemyBaseSchema): diff --git a/project/api/place/resources.py b/project/api/place/resources.py index 0a46bcf..316240f 100644 --- a/project/api/place/resources.py +++ b/project/api/place/resources.py @@ -1,17 +1,18 @@ -from project.api import add_api_resource -from flask import make_response -from flask_apispec import marshal_with, doc, use_kwargs -from project.api.resources import BaseResource -from project.api.place.schemas import ( - PlaceSchema, - PlacePostRequestSchema, - PlacePatchRequestSchema, -) -from project.models import EventPlace -from project.oauth2 import require_oauth from authlib.integrations.flask_oauth2 import current_token +from flask import make_response +from flask_apispec import doc, marshal_with, use_kwargs + from project import db from project.access import access_or_401, login_api_user_or_401 +from project.api import add_api_resource +from project.api.place.schemas import ( + PlacePatchRequestSchema, + PlacePostRequestSchema, + PlaceSchema, +) +from project.api.resources import BaseResource +from project.models import EventPlace +from project.oauth2 import require_oauth class PlaceResource(BaseResource): diff --git a/project/api/place/schemas.py b/project/api/place/schemas.py index 0ab9418..0dc9763 100644 --- a/project/api/place/schemas.py +++ b/project/api/place/schemas.py @@ -1,22 +1,23 @@ from marshmallow import fields, validate + from project.api import marshmallow -from project.models import EventPlace from project.api.image.schemas import ImageSchema from project.api.location.schemas import ( + LocationPatchRequestSchema, + LocationPostRequestSchema, LocationSchema, LocationSearchItemSchema, - LocationPostRequestSchema, - LocationPatchRequestSchema, ) from project.api.organization.schemas import OrganizationRefSchema from project.api.schemas import ( - SQLAlchemyBaseSchema, IdSchemaMixin, - WriteIdSchemaMixin, - TrackableSchemaMixin, PaginationRequestSchema, PaginationResponseSchema, + SQLAlchemyBaseSchema, + TrackableSchemaMixin, + WriteIdSchemaMixin, ) +from project.models import EventPlace class PlaceModelSchema(SQLAlchemyBaseSchema): diff --git a/project/api/resources.py b/project/api/resources.py index 9bb584a..df9f756 100644 --- a/project/api/resources.py +++ b/project/api/resources.py @@ -1,7 +1,9 @@ +from functools import wraps + from flask import request from flask_apispec import marshal_with from flask_apispec.views import MethodResource -from functools import wraps + from project import db from project.api.schemas import ErrorResponseSchema, UnprocessableEntityResponseSchema diff --git a/project/api/schemas.py b/project/api/schemas.py index f3c56de..7dc14f0 100644 --- a/project/api/schemas.py +++ b/project/api/schemas.py @@ -1,5 +1,6 @@ +from marshmallow import fields, missing, validate + from project.api import marshmallow -from marshmallow import fields, validate, missing class SQLAlchemyBaseSchema(marshmallow.SQLAlchemySchema): diff --git a/project/cli/dump.py b/project/cli/dump.py index 62e5070..8a285ad 100644 --- a/project/cli/dump.py +++ b/project/cli/dump.py @@ -1,28 +1,30 @@ -import click -from flask.cli import AppGroup -from project import app, dump_path -from project.models import ( - Event, - EventPlace, - EventReference, - Location, - EventCategory, - EventOrganizer, - Image, - AdminUnit, -) -from sqlalchemy.orm import joinedload import json -from project.api.event.schemas import EventDumpSchema -from project.api.place.schemas import PlaceDumpSchema -from project.api.location.schemas import LocationDumpSchema -from project.api.event_category.schemas import EventCategoryDumpSchema -from project.api.organizer.schemas import OrganizerDumpSchema -from project.api.image.schemas import ImageDumpSchema -from project.api.organization.schemas import OrganizationDumpSchema -from project.api.event_reference.schemas import EventReferenceDumpSchema import os import shutil + +import click +from flask.cli import AppGroup +from sqlalchemy.orm import joinedload + +from project import app, dump_path +from project.api.event.schemas import EventDumpSchema +from project.api.event_category.schemas import EventCategoryDumpSchema +from project.api.event_reference.schemas import EventReferenceDumpSchema +from project.api.image.schemas import ImageDumpSchema +from project.api.location.schemas import LocationDumpSchema +from project.api.organization.schemas import OrganizationDumpSchema +from project.api.organizer.schemas import OrganizerDumpSchema +from project.api.place.schemas import PlaceDumpSchema +from project.models import ( + AdminUnit, + Event, + EventCategory, + EventOrganizer, + EventPlace, + EventReference, + Image, + Location, +) from project.utils import make_dir dump_cli = AppGroup("dump") diff --git a/project/cli/event.py b/project/cli/event.py index 5e52b4a..255cec7 100644 --- a/project/cli/event.py +++ b/project/cli/event.py @@ -1,5 +1,6 @@ import click from flask.cli import AppGroup + from project import app, db from project.services.event import ( get_recurring_events, diff --git a/project/cli/user.py b/project/cli/user.py index cd2681d..b496ce5 100644 --- a/project/cli/user.py +++ b/project/cli/user.py @@ -1,5 +1,6 @@ import click from flask.cli import AppGroup + from project import app, db from project.services.user import add_admin_roles_to_user diff --git a/project/dateutils.py b/project/dateutils.py index 6baf2f3..fffa463 100644 --- a/project/dateutils.py +++ b/project/dateutils.py @@ -1,7 +1,8 @@ -import pytz -from dateutil.rrule import rrulestr from datetime import datetime + +import pytz from dateutil.relativedelta import relativedelta +from dateutil.rrule import rrulestr berlin_tz = pytz.timezone("Europe/Berlin") now = datetime.now(tz=berlin_tz) diff --git a/project/dbtypes.py b/project/dbtypes.py index 311aa72..ea1e443 100644 --- a/project/dbtypes.py +++ b/project/dbtypes.py @@ -1,5 +1,5 @@ -from sqlalchemy.types import TypeDecorator from sqlalchemy import Integer +from sqlalchemy.types import TypeDecorator class IntegerEnum(TypeDecorator): diff --git a/project/forms/admin.py b/project/forms/admin.py index bef93ad..234326d 100644 --- a/project/forms/admin.py +++ b/project/forms/admin.py @@ -1,7 +1,8 @@ -from flask_wtf import FlaskForm from flask_babelex import lazy_gettext -from wtforms import TextAreaField, SubmitField, BooleanField +from flask_wtf import FlaskForm +from wtforms import BooleanField, SubmitField, TextAreaField from wtforms.validators import Optional + from project.forms.widgets import MultiCheckboxField diff --git a/project/forms/admin_unit.py b/project/forms/admin_unit.py index 50ac6e5..73feac3 100644 --- a/project/forms/admin_unit.py +++ b/project/forms/admin_unit.py @@ -1,16 +1,12 @@ from flask_babelex import lazy_gettext from flask_wtf import FlaskForm -from wtforms import ( - StringField, - SubmitField, - DecimalField, - FormField, -) +from wtforms import DecimalField, FormField, StringField, SubmitField from wtforms.fields.html5 import EmailField, TelField, URLField from wtforms.validators import DataRequired, Optional, Regexp from wtforms.widgets.html5 import ColorInput -from project.models import Location, Image + from project.forms.common import Base64ImageForm +from project.models import Image, Location class AdminUnitLocationForm(FlaskForm): diff --git a/project/forms/admin_unit_member.py b/project/forms/admin_unit_member.py index e13e7d8..7797ba9 100644 --- a/project/forms/admin_unit_member.py +++ b/project/forms/admin_unit_member.py @@ -3,6 +3,7 @@ from flask_wtf import FlaskForm from wtforms import SubmitField from wtforms.fields.html5 import EmailField from wtforms.validators import DataRequired + from project.forms.widgets import MultiCheckboxField diff --git a/project/forms/common.py b/project/forms/common.py index 6a8ea78..17ff7c2 100644 --- a/project/forms/common.py +++ b/project/forms/common.py @@ -1,11 +1,12 @@ +import base64 +import re + from flask import url_for from flask_babelex import lazy_gettext from flask_wtf import FlaskForm -from wtforms import StringField, HiddenField -from wtforms.validators import Optional from markupsafe import Markup -import re -import base64 +from wtforms import HiddenField, StringField +from wtforms.validators import Optional class BaseImageForm(FlaskForm): diff --git a/project/forms/event.py b/project/forms/event.py index d26c523..05c54bb 100644 --- a/project/forms/event.py +++ b/project/forms/event.py @@ -1,31 +1,32 @@ +from dateutil.relativedelta import relativedelta from flask import request -from flask_babelex import lazy_gettext, gettext +from flask_babelex import gettext, lazy_gettext from flask_wtf import FlaskForm from wtforms import ( - SelectMultipleField, + BooleanField, + FormField, + IntegerField, RadioField, + SelectField, + SelectMultipleField, StringField, SubmitField, TextAreaField, - SelectField, - BooleanField, - IntegerField, - FormField, ) from wtforms.fields.html5 import EmailField, URLField from wtforms.validators import DataRequired, Optional + +from project.forms.common import Base64ImageForm, event_rating_choices +from project.forms.widgets import CustomDateField, CustomDateTimeField from project.models import ( - EventPlace, - EventTargetGroupOrigin, EventAttendanceMode, - EventStatus, - Location, EventOrganizer, + EventPlace, + EventStatus, + EventTargetGroupOrigin, Image, + Location, ) -from project.forms.common import event_rating_choices, Base64ImageForm -from project.forms.widgets import CustomDateTimeField, CustomDateField -from dateutil.relativedelta import relativedelta class EventPlaceLocationForm(FlaskForm): diff --git a/project/forms/event_date.py b/project/forms/event_date.py index ab790c9..36a6893 100644 --- a/project/forms/event_date.py +++ b/project/forms/event_date.py @@ -1,13 +1,9 @@ from flask import request from flask_babelex import lazy_gettext from flask_wtf import FlaskForm -from wtforms import ( - HiddenField, - StringField, - SubmitField, - SelectField, -) +from wtforms import HiddenField, SelectField, StringField, SubmitField from wtforms.validators import Optional + from project.forms.common import distance_choices from project.forms.widgets import CustomDateField diff --git a/project/forms/event_place.py b/project/forms/event_place.py index c2f3684..fea06f3 100644 --- a/project/forms/event_place.py +++ b/project/forms/event_place.py @@ -1,16 +1,11 @@ from flask_babelex import lazy_gettext from flask_wtf import FlaskForm -from wtforms import ( - DecimalField, - StringField, - SubmitField, - TextAreaField, - FormField, -) +from wtforms import DecimalField, FormField, StringField, SubmitField, TextAreaField from wtforms.fields.html5 import URLField from wtforms.validators import DataRequired, Optional -from project.models import Location, Image + from project.forms.common import Base64ImageForm +from project.models import Image, Location class EventPlaceLocationForm(FlaskForm): diff --git a/project/forms/event_suggestion.py b/project/forms/event_suggestion.py index 7406ba0..e02bf45 100644 --- a/project/forms/event_suggestion.py +++ b/project/forms/event_suggestion.py @@ -1,23 +1,24 @@ from flask_babelex import lazy_gettext from flask_wtf import FlaskForm from wtforms import ( + BooleanField, + SelectField, SelectMultipleField, StringField, SubmitField, - SelectField, - BooleanField, ) from wtforms.fields.html5 import EmailField, TelField from wtforms.validators import DataRequired, Optional -from project.models import ( - EventRejectionReason, - Image, - EventTargetGroupOrigin, - EventAttendanceMode, -) + from project.forms.common import get_accept_tos_markup -from project.forms.widgets import TagSelectField from project.forms.event import SharedEventForm +from project.forms.widgets import TagSelectField +from project.models import ( + EventAttendanceMode, + EventRejectionReason, + EventTargetGroupOrigin, + Image, +) class CreateEventSuggestionForm(SharedEventForm): diff --git a/project/forms/oauth2_client.py b/project/forms/oauth2_client.py index 8f4cec5..2f3f265 100644 --- a/project/forms/oauth2_client.py +++ b/project/forms/oauth2_client.py @@ -1,12 +1,14 @@ -from flask_wtf import FlaskForm -from flask_babelex import lazy_gettext -from wtforms import StringField, TextAreaField, SubmitField, SelectField -from wtforms.validators import Optional, DataRequired -from project.forms.widgets import MultiCheckboxField -from project.api import scopes -from project.utils import split_by_crlf import os +from flask_babelex import lazy_gettext +from flask_wtf import FlaskForm +from wtforms import SelectField, StringField, SubmitField, TextAreaField +from wtforms.validators import DataRequired, Optional + +from project.api import scopes +from project.forms.widgets import MultiCheckboxField +from project.utils import split_by_crlf + class BaseOAuth2ClientForm(FlaskForm): client_name = StringField(lazy_gettext("Client name"), validators=[DataRequired()]) diff --git a/project/forms/oauth2_token.py b/project/forms/oauth2_token.py index 5562294..2becec7 100644 --- a/project/forms/oauth2_token.py +++ b/project/forms/oauth2_token.py @@ -1,5 +1,5 @@ -from flask_wtf import FlaskForm from flask_babelex import lazy_gettext +from flask_wtf import FlaskForm from wtforms import SubmitField diff --git a/project/forms/organizer.py b/project/forms/organizer.py index 96bc4c3..23ed23a 100644 --- a/project/forms/organizer.py +++ b/project/forms/organizer.py @@ -1,15 +1,11 @@ from flask_babelex import lazy_gettext from flask_wtf import FlaskForm -from wtforms import ( - StringField, - SubmitField, - DecimalField, - FormField, -) +from wtforms import DecimalField, FormField, StringField, SubmitField from wtforms.fields.html5 import EmailField, TelField, URLField from wtforms.validators import DataRequired, Optional -from project.models import Location, Image + from project.forms.common import Base64ImageForm +from project.models import Image, Location class OrganizerLocationForm(FlaskForm): diff --git a/project/forms/planing.py b/project/forms/planing.py index c40821c..aff65c8 100644 --- a/project/forms/planing.py +++ b/project/forms/planing.py @@ -1,8 +1,9 @@ from flask_babelex import lazy_gettext from flask_wtf import FlaskForm -from wtforms import HiddenField, StringField, SubmitField, SelectField +from wtforms import HiddenField, SelectField, StringField, SubmitField from wtforms.validators import Optional -from project.forms.common import weekday_choices, distance_choices + +from project.forms.common import distance_choices, weekday_choices from project.forms.widgets import CustomDateField, MultiCheckboxField diff --git a/project/forms/reference.py b/project/forms/reference.py index 9b9e966..835f35f 100644 --- a/project/forms/reference.py +++ b/project/forms/reference.py @@ -2,6 +2,7 @@ from flask_babelex import lazy_gettext from flask_wtf import FlaskForm from wtforms import SelectField, StringField, SubmitField from wtforms.validators import DataRequired + from project.forms.common import event_rating_choices diff --git a/project/forms/reference_request.py b/project/forms/reference_request.py index 18d1a5b..161d5d5 100644 --- a/project/forms/reference_request.py +++ b/project/forms/reference_request.py @@ -2,6 +2,7 @@ from flask_babelex import lazy_gettext from flask_wtf import FlaskForm from wtforms import SelectField, StringField, SubmitField from wtforms.validators import DataRequired + from project.forms.common import event_rating_choices from project.models import ( EventReferenceRequestRejectionReason, diff --git a/project/forms/security.py b/project/forms/security.py index a665240..acc870e 100644 --- a/project/forms/security.py +++ b/project/forms/security.py @@ -1,9 +1,10 @@ -from flask_security.forms import RegisterForm, EqualTo, get_form_field_label +from flask_babelex import lazy_gettext +from flask_security.forms import EqualTo, RegisterForm, get_form_field_label +from flask_wtf import FlaskForm from wtforms import BooleanField, PasswordField, SubmitField from wtforms.validators import DataRequired + from project.forms.common import get_accept_tos_markup -from flask_wtf import FlaskForm -from flask_babelex import lazy_gettext class ExtendedRegisterForm(RegisterForm): diff --git a/project/forms/widgets.py b/project/forms/widgets.py index daef2bc..9e01060 100644 --- a/project/forms/widgets.py +++ b/project/forms/widgets.py @@ -1,9 +1,11 @@ -from wtforms import DateTimeField, SelectMultipleField, SelectField -from wtforms.widgets import html_params, ListWidget, CheckboxInput -from markupsafe import Markup -from wtforms.validators import StopValidation from datetime import datetime -from flask_babelex import to_user_timezone, gettext + +from flask_babelex import gettext, to_user_timezone +from markupsafe import Markup +from wtforms import DateTimeField, SelectField, SelectMultipleField +from wtforms.validators import StopValidation +from wtforms.widgets import CheckboxInput, ListWidget, html_params + from project.dateutils import berlin_tz diff --git a/project/i10n.py b/project/i10n.py index 92ddd7f..ea33c68 100644 --- a/project/i10n.py +++ b/project/i10n.py @@ -1,6 +1,7 @@ -from project import app, babel -from flask_babelex import gettext from flask import request +from flask_babelex import gettext + +from project import app, babel @babel.localeselector diff --git a/project/init_data.py b/project/init_data.py index 020ff27..4361ee3 100644 --- a/project/init_data.py +++ b/project/init_data.py @@ -1,10 +1,11 @@ +import os + from project import app, db from project.api import add_oauth2_scheme_with_transport -from project.services.user import upsert_user_role +from project.models import Location from project.services.admin_unit import upsert_admin_unit_member_role from project.services.event import upsert_event_category -from project.models import Location -import os +from project.services.user import upsert_user_role @app.before_first_request diff --git a/project/jinja_filters.py b/project/jinja_filters.py index 258462a..523f803 100644 --- a/project/jinja_filters.py +++ b/project/jinja_filters.py @@ -1,11 +1,12 @@ +import os +from urllib.parse import quote_plus + from project import app from project.utils import ( get_event_category_name, get_localized_enum_name, get_localized_scope, ) -from urllib.parse import quote_plus -import os def env_override(value, key): diff --git a/project/jsonld.py b/project/jsonld.py index 6950e3c..3e9ff4f 100644 --- a/project/jsonld.py +++ b/project/jsonld.py @@ -1,8 +1,10 @@ import datetime from json import JSONEncoder + from flask import url_for -from project.models import EventAttendanceMode, EventStatus + from project.dateutils import berlin_tz +from project.models import EventAttendanceMode, EventStatus class DateTimeEncoder(JSONEncoder): diff --git a/project/models.py b/project/models.py index 2b136a8..68ea973 100644 --- a/project/models.py +++ b/project/models.py @@ -1,37 +1,39 @@ -from project import db -from project.utils import make_check_violation -from sqlalchemy.ext.declarative import declared_attr -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import relationship, backref, deferred, object_session -from sqlalchemy.schema import CheckConstraint -from sqlalchemy.event import listens_for -from sqlalchemy import ( - UniqueConstraint, - Boolean, - DateTime, - Column, - Integer, - String, - ForeignKey, - Unicode, - UnicodeText, - Numeric, -) -from sqlalchemy_utils import ColorType -from flask_security import UserMixin, RoleMixin, current_user -from flask_dance.consumer.storage.sqla import OAuthConsumerMixin -from enum import IntEnum import datetime -from project.dbtypes import IntegerEnum -from geoalchemy2 import Geometry -from sqlalchemy import and_ +import time +from enum import IntEnum + from authlib.integrations.sqla_oauth2 import ( - OAuth2ClientMixin, OAuth2AuthorizationCodeMixin, + OAuth2ClientMixin, OAuth2TokenMixin, ) -import time from dateutil.relativedelta import relativedelta +from flask_dance.consumer.storage.sqla import OAuthConsumerMixin +from flask_security import RoleMixin, UserMixin, current_user +from geoalchemy2 import Geometry +from sqlalchemy import ( + Boolean, + Column, + DateTime, + ForeignKey, + Integer, + Numeric, + String, + Unicode, + UnicodeText, + UniqueConstraint, + and_, +) +from sqlalchemy.event import listens_for +from sqlalchemy.ext.declarative import declared_attr +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import backref, deferred, object_session, relationship +from sqlalchemy.schema import CheckConstraint +from sqlalchemy_utils import ColorType + +from project import db +from project.dbtypes import IntegerEnum +from project.utils import make_check_violation # Base diff --git a/project/oauth2.py b/project/oauth2.py index 1739a0c..ce0870e 100644 --- a/project/oauth2.py +++ b/project/oauth2.py @@ -1,17 +1,15 @@ -from authlib.integrations.flask_oauth2 import ( - AuthorizationServer, - ResourceProtector, -) +from authlib.integrations.flask_oauth2 import AuthorizationServer, ResourceProtector from authlib.integrations.sqla_oauth2 import ( - create_query_client_func, - create_save_token_func, create_bearer_token_validator, + create_query_client_func, create_query_token_func, + create_save_token_func, ) from authlib.oauth2.rfc6749 import grants from authlib.oauth2.rfc7636 import CodeChallenge + from project import db -from project.models import User, OAuth2Client, OAuth2AuthorizationCode, OAuth2Token +from project.models import OAuth2AuthorizationCode, OAuth2Client, OAuth2Token, User class AuthorizationCodeGrant(grants.AuthorizationCodeGrant): diff --git a/project/services/admin_unit.py b/project/services/admin_unit.py index 88e7f17..844e0b2 100644 --- a/project/services/admin_unit.py +++ b/project/services/admin_unit.py @@ -1,16 +1,17 @@ +from sqlalchemy import and_, func, or_ + from project import db from project.models import ( AdminUnit, AdminUnitMember, - AdminUnitMemberRole, AdminUnitMemberInvitation, + AdminUnitMemberRole, EventOrganizer, EventPlace, Location, ) -from project.services.location import assign_location_values from project.services.image import upsert_image_with_data -from sqlalchemy import func, and_, or_ +from project.services.location import assign_location_values def insert_admin_unit_for_user(admin_unit, user): diff --git a/project/services/event.py b/project/services/event.py index 05ebb2e..c344efc 100644 --- a/project/services/event.py +++ b/project/services/event.py @@ -1,24 +1,21 @@ +from dateutil.relativedelta import relativedelta +from sqlalchemy import and_, func, or_ +from sqlalchemy.orm import contains_eager, defaultload, joinedload +from sqlalchemy.sql import extract + from project import db +from project.dateutils import date_add_time, dates_from_recurrence_rule, today from project.models import ( AdminUnit, - EventCategory, Event, + EventCategory, EventDate, EventOrganizer, - EventReference, EventPlace, + EventReference, Image, Location, ) -from project.dateutils import ( - dates_from_recurrence_rule, - today, - date_add_time, -) -from sqlalchemy import and_, or_, func -from sqlalchemy.sql import extract -from sqlalchemy.orm import joinedload, contains_eager, defaultload -from dateutil.relativedelta import relativedelta def get_event_category(category_name): diff --git a/project/services/event_search.py b/project/services/event_search.py index d5afca4..93b0ba3 100644 --- a/project/services/event_search.py +++ b/project/services/event_search.py @@ -1,11 +1,12 @@ +from dateutil.relativedelta import relativedelta +from flask import request + from project.dateutils import ( - today, date_set_end_of_day, form_input_from_date, form_input_to_date, + today, ) -from dateutil.relativedelta import relativedelta -from flask import request class EventSearchParams(object): diff --git a/project/services/event_suggestion.py b/project/services/event_suggestion.py index 72b3c9e..f5ca42e 100644 --- a/project/services/event_suggestion.py +++ b/project/services/event_suggestion.py @@ -1,8 +1,9 @@ -from project import db -from project.models import EventReviewStatus, EventSuggestion from sqlalchemy import and_ from sqlalchemy.orm import load_only +from project import db +from project.models import EventReviewStatus, EventSuggestion + def insert_event_suggestion(event_suggestion): event_suggestion.review_status = EventReviewStatus.inbox diff --git a/project/services/image.py b/project/services/image.py index ffe795f..75b3ce5 100644 --- a/project/services/image.py +++ b/project/services/image.py @@ -1,6 +1,7 @@ -from project.models import Image import base64 +from project.models import Image + def upsert_image_with_data(image, data, encoding_format="image/jpeg"): if image is None: diff --git a/project/services/oauth2_client.py b/project/services/oauth2_client.py index 539a781..1d3e568 100644 --- a/project/services/oauth2_client.py +++ b/project/services/oauth2_client.py @@ -1,7 +1,9 @@ -from project.models import OAuth2Client import time + from werkzeug.security import gen_salt +from project.models import OAuth2Client + def complete_oauth2_client(oauth2_client: OAuth2Client) -> None: if not oauth2_client.id: diff --git a/project/services/organizer.py b/project/services/organizer.py index 854aea2..7248584 100644 --- a/project/services/organizer.py +++ b/project/services/organizer.py @@ -1,6 +1,7 @@ +from sqlalchemy import and_ + from project import db from project.models import EventOrganizer, Location -from sqlalchemy import and_ def get_event_organizer(admin_unit_id, name): diff --git a/project/services/place.py b/project/services/place.py index a394d58..84b7d69 100644 --- a/project/services/place.py +++ b/project/services/place.py @@ -1,6 +1,7 @@ +from sqlalchemy.sql import and_, func + from project import db from project.models import EventPlace, Location -from sqlalchemy.sql import and_, func def upsert_event_place(admin_unit_id, name): diff --git a/project/services/reference.py b/project/services/reference.py index 9b74b00..e754fa5 100644 --- a/project/services/reference.py +++ b/project/services/reference.py @@ -1,3 +1,6 @@ +from sqlalchemy import and_ +from sqlalchemy.orm import load_only + from project import db from project.models import ( Event, @@ -5,8 +8,6 @@ from project.models import ( EventReferenceRequest, EventReferenceRequestReviewStatus, ) -from sqlalchemy import and_ -from sqlalchemy.orm import load_only def create_event_reference_for_request(request): diff --git a/project/services/user.py b/project/services/user.py index 38af892..62b91ab 100644 --- a/project/services/user.py +++ b/project/services/user.py @@ -1,6 +1,7 @@ -from project import user_datastore from flask_security import hash_password +from project import user_datastore + def create_user(email, password): return user_datastore.create_user(email=email, password=hash_password(password)) diff --git a/project/utils.py b/project/utils.py index a28c5c7..a3bb965 100644 --- a/project/utils.py +++ b/project/utils.py @@ -1,8 +1,9 @@ -from flask_babelex import lazy_gettext -import pathlib import os +import pathlib + +from flask_babelex import lazy_gettext +from psycopg2.errorcodes import CHECK_VIOLATION, UNIQUE_VIOLATION from sqlalchemy.exc import IntegrityError -from psycopg2.errorcodes import UNIQUE_VIOLATION, CHECK_VIOLATION def get_event_category_name(category): diff --git a/project/views/admin.py b/project/views/admin.py index 76f2ed3..26f3d66 100644 --- a/project/views/admin.py +++ b/project/views/admin.py @@ -1,19 +1,16 @@ -from project import app, db -from project.models import AdminUnit, User, Role -from flask import render_template, flash, url_for, redirect +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import roles_required -from project.forms.admin import AdminSettingsForm, UpdateUserForm, UpdateAdminUnitForm -from project.services.admin import upsert_settings -from project.services.user import set_roles_for_user -from project.views.utils import ( - flash_errors, - handleSqlError, - get_pagination_urls, -) from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.sql import func +from project import app, db +from project.forms.admin import AdminSettingsForm, UpdateAdminUnitForm, UpdateUserForm +from project.models import AdminUnit, Role, User +from project.services.admin import upsert_settings +from project.services.user import set_roles_for_user +from project.views.utils import flash_errors, get_pagination_urls, handleSqlError + @app.route("/admin") @roles_required("admin") diff --git a/project/views/admin_unit.py b/project/views/admin_unit.py index c85eadf..26d3c44 100644 --- a/project/views/admin_unit.py +++ b/project/views/admin_unit.py @@ -1,17 +1,14 @@ -from project import app, db -from flask import url_for, render_template, redirect, flash +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import auth_required, current_user from sqlalchemy.exc import SQLAlchemyError + +from project import app, db from project.access import get_admin_unit_for_manage_or_404, has_access from project.forms.admin_unit import CreateAdminUnitForm, UpdateAdminUnitForm -from project.views.utils import ( - handleSqlError, - permission_missing, - flash_errors, -) from project.models import AdminUnit, Location from project.services.admin_unit import insert_admin_unit_for_user +from project.views.utils import flash_errors, handleSqlError, permission_missing def update_admin_unit_with_form(admin_unit, form): diff --git a/project/views/admin_unit_member.py b/project/views/admin_unit_member.py index b65ca31..9a14695 100644 --- a/project/views/admin_unit_member.py +++ b/project/views/admin_unit_member.py @@ -1,21 +1,22 @@ -from project import app, db -from flask import url_for, render_template, redirect, flash +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import auth_required -from project.models import AdminUnitMember, AdminUnitMemberRole +from sqlalchemy.exc import SQLAlchemyError + +from project import app, db +from project.access import has_access from project.forms.admin_unit_member import ( DeleteAdminUnitMemberForm, UpdateAdminUnitMemberForm, ) -from project.views.utils import ( - permission_missing, - handleSqlError, - flash_errors, - non_match_for_deletion, -) -from project.access import has_access +from project.models import AdminUnitMember, AdminUnitMemberRole from project.services.admin_unit import add_roles_to_admin_unit_member -from sqlalchemy.exc import SQLAlchemyError +from project.views.utils import ( + flash_errors, + handleSqlError, + non_match_for_deletion, + permission_missing, +) @app.route("/manage/member//update", methods=("GET", "POST")) diff --git a/project/views/admin_unit_member_invitation.py b/project/views/admin_unit_member_invitation.py index ba3bf33..fe991f0 100644 --- a/project/views/admin_unit_member_invitation.py +++ b/project/views/admin_unit_member_invitation.py @@ -1,24 +1,25 @@ -from project import app, db -from flask import url_for, render_template, redirect, flash +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import auth_required, current_user -from project.models import AdminUnitMemberInvitation, AdminUnitMemberRole -from project.forms.admin_unit_member import ( - NegotiateAdminUnitMemberInvitationForm, - InviteAdminUnitMemberForm, - DeleteAdminUnitInvitationForm, -) -from project.views.utils import ( - permission_missing, - send_mail, - handleSqlError, - flash_errors, - non_match_for_deletion, -) +from sqlalchemy.exc import SQLAlchemyError + +from project import app, db from project.access import get_admin_unit_for_manage_or_404, has_access +from project.forms.admin_unit_member import ( + DeleteAdminUnitInvitationForm, + InviteAdminUnitMemberForm, + NegotiateAdminUnitMemberInvitationForm, +) +from project.models import AdminUnitMemberInvitation, AdminUnitMemberRole from project.services.admin_unit import add_user_to_admin_unit_with_roles from project.services.user import find_user_by_email -from sqlalchemy.exc import SQLAlchemyError +from project.views.utils import ( + flash_errors, + handleSqlError, + non_match_for_deletion, + permission_missing, + send_mail, +) @app.route("/invitations/", methods=("GET", "POST")) diff --git a/project/views/api.py b/project/views/api.py index 1741e3e..d655f30 100644 --- a/project/views/api.py +++ b/project/views/api.py @@ -1,8 +1,9 @@ -from project import app -from project.models import EventDate, Event -from project.dateutils import today from flask import jsonify + +from project import app +from project.dateutils import today from project.jsonld import get_sd_for_event_date +from project.models import Event, EventDate from project.services.event import get_event_dates_query from project.services.event_search import EventSearchParams diff --git a/project/views/dump.py b/project/views/dump.py index b87bb47..9eed8a4 100644 --- a/project/views/dump.py +++ b/project/views/dump.py @@ -1,6 +1,7 @@ -from project import app, dump_path from flask import send_from_directory +from project import app, dump_path + @app.route("/dump/") def dump_files(path): diff --git a/project/views/event.py b/project/views/event.py index 751293a..a5c01bf 100644 --- a/project/views/event.py +++ b/project/views/event.py @@ -1,47 +1,49 @@ -from project import app, db -from project.models import ( - Event, - EventDate, - EventReviewStatus, - AdminUnit, - EventOrganizer, - EventCategory, - EventSuggestion, - EventReference, - AdminUnitMember, - User, -) -from flask import render_template, flash, url_for, redirect, request, jsonify +from datetime import datetime + +from flask import flash, jsonify, redirect, render_template, request, url_for from flask_babelex import gettext +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm import lazyload +from sqlalchemy.sql import and_, func + +from project import app, db from project.access import ( - has_access, access_or_401, can_reference_event, can_request_event_reference, + has_access, has_admin_unit_member_permission, ) from project.dateutils import today -from datetime import datetime -from project.forms.event import CreateEventForm, UpdateEventForm, DeleteEventForm -from project.views.utils import ( - flash_errors, - handleSqlError, - flash_message, - send_mail, - non_match_for_deletion, +from project.forms.event import CreateEventForm, DeleteEventForm, UpdateEventForm +from project.models import ( + AdminUnit, + AdminUnitMember, + Event, + EventCategory, + EventDate, + EventOrganizer, + EventReference, + EventReviewStatus, + EventSuggestion, + User, ) -from project.utils import get_event_category_name from project.services.event import ( - upsert_event_category, + get_event_with_details_or_404, insert_event, update_event, - get_event_with_details_or_404, + upsert_event_category, ) from project.services.place import get_event_places -from sqlalchemy.sql import func, and_ -from sqlalchemy.exc import SQLAlchemyError -from sqlalchemy.orm import lazyload +from project.utils import get_event_category_name from project.views.event_suggestion import send_event_suggestion_review_status_mail +from project.views.utils import ( + flash_errors, + flash_message, + handleSqlError, + non_match_for_deletion, + send_mail, +) @app.route("/event/") diff --git a/project/views/event_date.py b/project/views/event_date.py index 822e5fc..0d59c86 100644 --- a/project/views/event_date.py +++ b/project/views/event_date.py @@ -1,12 +1,14 @@ -from project import app -from flask import render_template, url_for, redirect, request -from project.views.utils import flash_errors, track_analytics import json -from project.jsonld import get_sd_for_event_date, DateTimeEncoder + +from flask import redirect, render_template, request, url_for + +from project import app +from project.forms.event_date import FindEventDateForm +from project.jsonld import DateTimeEncoder, get_sd_for_event_date from project.services.event import get_event_date_with_details_or_404 from project.services.event_search import EventSearchParams -from project.forms.event_date import FindEventDateForm from project.views.event import get_event_category_choices, get_menu_user_rights +from project.views.utils import flash_errors, track_analytics def prepare_event_date_form(form): diff --git a/project/views/event_place.py b/project/views/event_place.py index 9359b5b..71ab7c7 100644 --- a/project/views/event_place.py +++ b/project/views/event_place.py @@ -1,20 +1,17 @@ -from project import app, db -from project.models import EventPlace, Location -from flask import render_template, flash, url_for, redirect +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import auth_required +from sqlalchemy.exc import SQLAlchemyError + +from project import app, db from project.access import access_or_401, get_admin_unit_for_manage_or_404 from project.forms.event_place import ( - UpdateEventPlaceForm, CreateEventPlaceForm, DeleteEventPlaceForm, + UpdateEventPlaceForm, ) -from project.views.utils import ( - flash_errors, - handleSqlError, - non_match_for_deletion, -) -from sqlalchemy.exc import SQLAlchemyError +from project.models import EventPlace, Location +from project.views.utils import flash_errors, handleSqlError, non_match_for_deletion @app.route("/manage/admin_unit//places/create", methods=("GET", "POST")) diff --git a/project/views/event_suggestion.py b/project/views/event_suggestion.py index c2b7bf2..94f5ad4 100644 --- a/project/views/event_suggestion.py +++ b/project/views/event_suggestion.py @@ -1,14 +1,12 @@ -from project import app, db -from project.models import ( - EventSuggestion, - EventReviewStatus, -) -from flask import render_template, flash, url_for, redirect +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext +from sqlalchemy.exc import SQLAlchemyError + +from project import app, db from project.access import access_or_401 from project.forms.event_suggestion import RejectEventSuggestionForm -from project.views.utils import flash_errors, send_mail, handleSqlError -from sqlalchemy.exc import SQLAlchemyError +from project.models import EventReviewStatus, EventSuggestion +from project.views.utils import flash_errors, handleSqlError, send_mail @app.route("/event_suggestion//review") diff --git a/project/views/image.py b/project/views/image.py index 486f523..57a30b9 100644 --- a/project/views/image.py +++ b/project/views/image.py @@ -1,10 +1,12 @@ +import os +from io import BytesIO + +import PIL +from flask import request, send_file +from sqlalchemy.orm import load_only + from project import app, img_path from project.models import Image -from sqlalchemy.orm import load_only -import PIL -from io import BytesIO -import os -from flask import send_file, request from project.utils import make_dir diff --git a/project/views/manage.py b/project/views/manage.py index 27aa96c..ce3bbe0 100644 --- a/project/views/manage.py +++ b/project/views/manage.py @@ -1,43 +1,37 @@ +from flask import flash, make_response, redirect, render_template, request, url_for +from flask_babelex import gettext +from flask_security import auth_required, current_user +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.sql import desc, func + from project import app, db +from project.access import ( + get_admin_unit_for_manage, + get_admin_unit_for_manage_or_404, + get_admin_units_for_manage, + has_access, +) +from project.forms.admin_unit import UpdateAdminUnitWidgetForm +from project.forms.event import FindEventForm +from project.forms.event_place import FindEventPlaceForm from project.models import ( AdminUnitMember, AdminUnitMemberInvitation, - EventPlace, EventOrganizer, - User, + EventPlace, EventSuggestion, + User, ) -from flask import ( - render_template, - flash, - url_for, - redirect, - request, - make_response, -) -from flask_babelex import gettext -from flask_security import auth_required, current_user -from project.access import ( - has_access, - get_admin_unit_for_manage, - get_admin_units_for_manage, - get_admin_unit_for_manage_or_404, -) -from sqlalchemy.sql import desc, func -from sqlalchemy.exc import SQLAlchemyError -from project.views.utils import ( - get_pagination_urls, - permission_missing, - handleSqlError, - flash_errors, -) -from project.forms.event_place import FindEventPlaceForm -from project.forms.event import FindEventForm -from project.forms.admin_unit import UpdateAdminUnitWidgetForm -from project.services.event_search import EventSearchParams from project.services.event import get_events_query +from project.services.event_search import EventSearchParams from project.services.event_suggestion import get_event_reviews_query from project.views.event import get_event_category_choices +from project.views.utils import ( + flash_errors, + get_pagination_urls, + handleSqlError, + permission_missing, +) @app.route("/manage") diff --git a/project/views/oauth.py b/project/views/oauth.py index 17ab000..50b4441 100644 --- a/project/views/oauth.py +++ b/project/views/oauth.py @@ -1,8 +1,9 @@ from authlib.oauth2 import OAuth2Error +from flask import redirect, render_template, request, url_for +from flask_security import current_user + from project import app from project.api import scopes -from flask_security import current_user -from flask import redirect, request, url_for, render_template from project.forms.security import AuthorizeForm from project.oauth2 import authorization diff --git a/project/views/oauth2_client.py b/project/views/oauth2_client.py index d415566..7cc3a35 100644 --- a/project/views/oauth2_client.py +++ b/project/views/oauth2_client.py @@ -1,22 +1,23 @@ -from project import app, db -from flask import render_template, redirect, flash, url_for +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext -from flask_security import permissions_required, current_user -from project.models import OAuth2Client -from project.views.utils import ( - get_pagination_urls, - handleSqlError, - flash_errors, - non_match_for_deletion, -) +from flask_security import current_user, permissions_required +from sqlalchemy.exc import SQLAlchemyError + +from project import app, db +from project.access import owner_access_or_401 from project.forms.oauth2_client import ( CreateOAuth2ClientForm, - UpdateOAuth2ClientForm, DeleteOAuth2ClientForm, + UpdateOAuth2ClientForm, ) +from project.models import OAuth2Client from project.services.oauth2_client import complete_oauth2_client -from sqlalchemy.exc import SQLAlchemyError -from project.access import owner_access_or_401 +from project.views.utils import ( + flash_errors, + get_pagination_urls, + handleSqlError, + non_match_for_deletion, +) @app.route("/oauth2_client/create", methods=("GET", "POST")) diff --git a/project/views/oauth2_token.py b/project/views/oauth2_token.py index 6825c3d..d4b2f69 100644 --- a/project/views/oauth2_token.py +++ b/project/views/oauth2_token.py @@ -1,16 +1,13 @@ -from project import app, db -from flask import render_template, redirect, flash, url_for +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import current_user -from project.models import OAuth2Token -from project.views.utils import ( - get_pagination_urls, - handleSqlError, - flash_errors, -) -from project.forms.oauth2_token import RevokeOAuth2TokenForm from sqlalchemy.exc import SQLAlchemyError + +from project import app, db from project.access import owner_access_or_401 +from project.forms.oauth2_token import RevokeOAuth2TokenForm +from project.models import OAuth2Token +from project.views.utils import flash_errors, get_pagination_urls, handleSqlError @app.route("/oauth2_token//revoke", methods=("GET", "POST")) diff --git a/project/views/organizer.py b/project/views/organizer.py index 586c27e..0b18caa 100644 --- a/project/views/organizer.py +++ b/project/views/organizer.py @@ -1,20 +1,17 @@ -from project import app, db -from project.models import EventOrganizer -from flask import render_template, flash, url_for, redirect +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import auth_required +from sqlalchemy.exc import SQLAlchemyError + +from project import app, db from project.access import access_or_401, get_admin_unit_for_manage_or_404 from project.forms.organizer import ( CreateOrganizerForm, - UpdateOrganizerForm, DeleteOrganizerForm, + UpdateOrganizerForm, ) -from project.views.utils import ( - flash_errors, - handleSqlError, - non_match_for_deletion, -) -from sqlalchemy.exc import SQLAlchemyError +from project.models import EventOrganizer +from project.views.utils import flash_errors, handleSqlError, non_match_for_deletion @app.route("/manage/admin_unit//organizers/create", methods=("GET", "POST")) diff --git a/project/views/planing.py b/project/views/planing.py index 59558f2..69a56b0 100644 --- a/project/views/planing.py +++ b/project/views/planing.py @@ -1,7 +1,8 @@ -from project import app from flask import render_template, request -from project.services.event_search import EventSearchParams + +from project import app from project.forms.planing import PlaningForm +from project.services.event_search import EventSearchParams from project.views.event import get_event_category_choices diff --git a/project/views/reference.py b/project/views/reference.py index c90c54e..bc80a61 100644 --- a/project/views/reference.py +++ b/project/views/reference.py @@ -1,31 +1,33 @@ +from flask import abort, flash, redirect, render_template, url_for +from flask_babelex import gettext +from flask_security import auth_required +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.sql import desc + from project import app, db -from project.views.utils import ( - get_pagination_urls, - flash_errors, - handleSqlError, - non_match_for_deletion, -) from project.access import ( + access_or_401, + can_reference_event, get_admin_unit_for_manage_or_404, get_admin_units_for_event_reference, has_access, ) from project.forms.reference import ( CreateEventReferenceForm, - UpdateEventReferenceForm, DeleteReferenceForm, + UpdateEventReferenceForm, ) +from project.models import Event, EventReference from project.services.reference import ( get_reference_incoming_query, get_reference_outgoing_query, ) -from flask import render_template, flash, redirect, url_for, abort -from flask_babelex import gettext -from flask_security import auth_required -from project.models import EventReference, Event -from project.access import access_or_401, can_reference_event -from sqlalchemy.exc import SQLAlchemyError -from sqlalchemy.sql import desc +from project.views.utils import ( + flash_errors, + get_pagination_urls, + handleSqlError, + non_match_for_deletion, +) @app.route("/reference/") diff --git a/project/views/reference_request.py b/project/views/reference_request.py index e586f91..5502a1e 100644 --- a/project/views/reference_request.py +++ b/project/views/reference_request.py @@ -1,30 +1,31 @@ -from project import app, db -from project.views.utils import ( - get_pagination_urls, - flash_errors, - handleSqlError, - send_mail, -) -from project.forms.reference_request import CreateEventReferenceRequestForm -from flask import render_template, flash, redirect, url_for +from flask import flash, redirect, render_template, url_for from flask_babelex import gettext from flask_security import auth_required -from project.models import ( - EventReferenceRequest, - Event, - AdminUnitMember, - User, - EventReferenceRequestReviewStatus, -) +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.sql import desc + +from project import app, db from project.access import ( access_or_401, get_admin_unit_for_manage_or_404, - has_admin_unit_member_permission, get_admin_units_for_event_reference_request, + has_admin_unit_member_permission, +) +from project.forms.reference_request import CreateEventReferenceRequestForm +from project.models import ( + AdminUnitMember, + Event, + EventReferenceRequest, + EventReferenceRequestReviewStatus, + User, ) -from sqlalchemy.exc import SQLAlchemyError -from sqlalchemy.sql import desc from project.services.reference import get_reference_requests_incoming_query +from project.views.utils import ( + flash_errors, + get_pagination_urls, + handleSqlError, + send_mail, +) @app.route("/manage/admin_unit//reference_requests/incoming") diff --git a/project/views/reference_request_review.py b/project/views/reference_request_review.py index 318cc75..e76e145 100644 --- a/project/views/reference_request_review.py +++ b/project/views/reference_request_review.py @@ -1,23 +1,20 @@ +from flask import abort, flash, redirect, render_template, url_for +from flask_babelex import gettext +from sqlalchemy.exc import SQLAlchemyError + from project import app, db +from project.access import access_or_401, has_access, has_admin_unit_member_permission +from project.dateutils import today +from project.forms.reference_request import ReferenceRequestReviewForm from project.models import ( + AdminUnitMember, EventDate, EventReferenceRequest, EventReferenceRequestReviewStatus, - AdminUnitMember, User, ) -from flask import render_template, flash, url_for, redirect, abort -from flask_babelex import gettext -from project.access import ( - has_access, - access_or_401, - has_admin_unit_member_permission, -) -from project.dateutils import today -from project.forms.reference_request import ReferenceRequestReviewForm -from project.views.utils import flash_errors, send_mail, handleSqlError from project.services.reference import create_event_reference_for_request -from sqlalchemy.exc import SQLAlchemyError +from project.views.utils import flash_errors, handleSqlError, send_mail @app.route("/reference_request//review", methods=("GET", "POST")) diff --git a/project/views/root.py b/project/views/root.py index 1738ca2..2f3a695 100644 --- a/project/views/root.py +++ b/project/views/root.py @@ -1,10 +1,12 @@ +import os.path + +from flask import redirect, render_template, request, url_for +from flask_babelex import gettext +from markupsafe import Markup + from project import app, dump_path from project.services.admin import upsert_settings from project.views.utils import track_analytics -from flask import url_for, render_template, request, redirect -from flask_babelex import gettext -from markupsafe import Markup -import os.path @app.route("/") diff --git a/project/views/user.py b/project/views/user.py index ec6efdf..3ab006f 100644 --- a/project/views/user.py +++ b/project/views/user.py @@ -1,8 +1,9 @@ -from project import app -from project.models import AdminUnitMember, AdminUnitMemberInvitation from flask import render_template from flask_security import auth_required, current_user +from project import app +from project.models import AdminUnitMember, AdminUnitMemberInvitation + @app.route("/profile") @auth_required() diff --git a/project/views/utils.py b/project/views/utils.py index 4d24c06..59be1e7 100644 --- a/project/views/utils.py +++ b/project/views/utils.py @@ -1,10 +1,11 @@ -from project.models import Analytics -from project import db, mail +from flask import Markup, flash, redirect, render_template, request, url_for from flask_babelex import gettext -from flask import request, url_for, render_template, flash, redirect, Markup from flask_mail import Message -from sqlalchemy.exc import SQLAlchemyError from psycopg2.errorcodes import UNIQUE_VIOLATION +from sqlalchemy.exc import SQLAlchemyError + +from project import db, mail +from project.models import Analytics def track_analytics(key, value1, value2): diff --git a/project/views/widget.py b/project/views/widget.py index 347bfe5..0b619a7 100644 --- a/project/views/widget.py +++ b/project/views/widget.py @@ -1,38 +1,40 @@ -from project import app, db -from project.models import ( - User, - AdminUnit, - EventOrganizer, - EventSuggestion, - EventReviewStatus, - AdminUnitMember, -) -from flask import render_template, request, flash, redirect, url_for, abort +import json + +from flask import abort, flash, redirect, render_template, request, url_for from flask_babelex import gettext from flask_security import current_user -from sqlalchemy.sql import func from sqlalchemy.exc import SQLAlchemyError -from project.services.event_suggestion import insert_event_suggestion -from project.services.event import ( - get_event_dates_query, - get_event_date_with_details_or_404, -) -from project.services.event_search import EventSearchParams -from project.services.place import get_event_places -from project.views.utils import ( - get_pagination_urls, - flash_errors, - flash_message, - send_mail, - handleSqlError, -) -import json -from project.jsonld import DateTimeEncoder, get_sd_for_event_date +from sqlalchemy.sql import func + +from project import app, db +from project.access import has_admin_unit_member_permission from project.forms.event_date import FindEventDateForm from project.forms.event_suggestion import CreateEventSuggestionForm -from project.views.event_date import prepare_event_date_form +from project.jsonld import DateTimeEncoder, get_sd_for_event_date +from project.models import ( + AdminUnit, + AdminUnitMember, + EventOrganizer, + EventReviewStatus, + EventSuggestion, + User, +) +from project.services.event import ( + get_event_date_with_details_or_404, + get_event_dates_query, +) +from project.services.event_search import EventSearchParams +from project.services.event_suggestion import insert_event_suggestion +from project.services.place import get_event_places from project.views.event import get_event_category_choices -from project.access import has_admin_unit_member_permission +from project.views.event_date import prepare_event_date_form +from project.views.utils import ( + flash_errors, + flash_message, + get_pagination_urls, + handleSqlError, + send_mail, +) @app.route("//widget/eventdates") diff --git a/requirements.txt b/requirements.txt index 514bf1b..3385b02 100644 --- a/requirements.txt +++ b/requirements.txt @@ -50,6 +50,7 @@ identify==1.5.10 idna==2.10 importlib-metadata==3.1.1 iniconfig==1.1.1 +isort==5.7.0 itsdangerous==1.1.0 Jinja2==2.11.3 jsonschema==3.2.0 diff --git a/tests/api/test___init__.py b/tests/api/test___init__.py index dd83f51..ffcf8ec 100644 --- a/tests/api/test___init__.py +++ b/tests/api/test___init__.py @@ -1,4 +1,5 @@ import pytest + from project.api import RestApi @@ -46,8 +47,8 @@ def test_handle_error_httpException(app): def test_handle_error_unprocessableEntity(app): - from werkzeug.exceptions import UnprocessableEntity from marshmallow import ValidationError + from werkzeug.exceptions import UnprocessableEntity args = {"name": ["Required"]} validation_error = ValidationError(args) diff --git a/tests/api/test_event.py b/tests/api/test_event.py index d42db07..8d01e35 100644 --- a/tests/api/test_event.py +++ b/tests/api/test_event.py @@ -83,13 +83,13 @@ def test_put(client, seeder, utils, app): utils.assert_response_no_content(response) with app.app_context(): + from project.dateutils import create_berlin_date from project.models import ( Event, + EventAttendanceMode, EventStatus, EventTargetGroupOrigin, - EventAttendanceMode, ) - from project.dateutils import create_berlin_date event = Event.query.get(event_id) assert event.name == "Neuer Name" diff --git a/tests/api/test_fields.py b/tests/api/test_fields.py index 297251f..5549f6e 100644 --- a/tests/api/test_fields.py +++ b/tests/api/test_fields.py @@ -33,9 +33,10 @@ def test_numeric_str_serialize(client, seeder, utils): ], ) def test_numeric_str_deserialize(latitude, longitude, valid): - from project.api.location.schemas import LocationPostRequestSchema from marshmallow import ValidationError + from project.api.location.schemas import LocationPostRequestSchema + data = { "latitude": latitude, "longitude": longitude, diff --git a/tests/conftest.py b/tests/conftest.py index 5a2cb77..a5f8a3e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,9 @@ -import pytest import os -from .utils import UtilActions + +import pytest + from .seeder import Seeder +from .utils import UtilActions def pytest_generate_tests(metafunc): diff --git a/tests/form.py b/tests/form.py index 2f2d1b5..72208c3 100644 --- a/tests/form.py +++ b/tests/form.py @@ -1,4 +1,5 @@ import urllib.parse + from werkzeug.datastructures import MultiDict diff --git a/tests/seeder.py b/tests/seeder.py index 66b680d..be2402f 100644 --- a/tests/seeder.py +++ b/tests/seeder.py @@ -22,9 +22,9 @@ class Seeder(object): self, email="test@test.de", password="MeinPasswortIstDasBeste", admin=False ): from project.services.user import ( - find_user_by_email, - create_user, add_admin_roles_to_user, + create_user, + find_user_by_email, ) with self._app.app_context(): @@ -43,8 +43,8 @@ class Seeder(object): def create_admin_unit(self, user_id, name="Meine Crew"): from project.models import AdminUnit - from project.services.user import get_user from project.services.admin_unit import insert_admin_unit_for_user + from project.services.user import get_user with self._app.app_context(): user = get_user(user_id) @@ -59,11 +59,11 @@ class Seeder(object): return admin_unit_id def create_admin_unit_member(self, admin_unit_id, role_names): - from project.services.user import get_user from project.services.admin_unit import ( - get_admin_unit_by_id, add_user_to_admin_unit_with_roles, + get_admin_unit_by_id, ) + from project.services.user import get_user with self._app.app_context(): user_id = self.create_user() @@ -173,9 +173,9 @@ class Seeder(object): return category.id def create_event(self, admin_unit_id, recurrence_rule=None): + from project.dateutils import now from project.models import Event from project.services.event import insert_event, upsert_event_category - from project.dateutils import now with self._app.app_context(): event = Event() @@ -212,10 +212,10 @@ class Seeder(object): return image_id def create_event_suggestion(self, admin_unit_id, free_text=False): + from project.dateutils import now from project.models import EventSuggestion from project.services.event import upsert_event_category from project.services.event_suggestion import insert_event_suggestion - from project.dateutils import now with self._app.app_context(): suggestion = EventSuggestion() diff --git a/tests/services/test_event.py b/tests/services/test_event.py index aee5c15..85444db 100644 --- a/tests/services/test_event.py +++ b/tests/services/test_event.py @@ -3,8 +3,8 @@ def test_update_event_dates_with_recurrence_rule(client, seeder, utils, app): event_id = seeder.create_event(admin_unit_id) with app.app_context(): - from project.models import Event from project.dateutils import create_berlin_date + from project.models import Event from project.services.event import update_event_dates_with_recurrence_rule event = Event.query.get(event_id) diff --git a/tests/test___init__.py b/tests/test___init__.py index ac8b929..41b4202 100644 --- a/tests/test___init__.py +++ b/tests/test___init__.py @@ -10,7 +10,8 @@ def test_mail_server(): def test_migrations(app, seeder): - from flask_migrate import upgrade, downgrade + from flask_migrate import downgrade, upgrade + from project import db from project.init_data import create_initial_data diff --git a/tests/test_access.py b/tests/test_access.py index 5588386..b378f66 100644 --- a/tests/test_access.py +++ b/tests/test_access.py @@ -2,8 +2,8 @@ def test_has_admin_unit_member_role(client, app, db, seeder): owner_id, admin_unit_id, member_id = seeder.setup_base_event_verifier() with app.app_context(): - from project.models import AdminUnitMember from project.access import has_admin_unit_member_role + from project.models import AdminUnitMember member = AdminUnitMember.query.get(member_id) assert has_admin_unit_member_role(member, "admin") is False @@ -14,10 +14,11 @@ def test_has_current_user_member_role_for_admin_unit(client, app, db, seeder): with app.test_request_context(): with app.app_context(): - from project.models import AdminUnitMember - from project.access import has_current_user_member_role_for_admin_unit from flask_login import login_user + from project.access import has_current_user_member_role_for_admin_unit + from project.models import AdminUnitMember + member = AdminUnitMember.query.get(member_id) login_user(member.user) diff --git a/tests/test_dateutils.py b/tests/test_dateutils.py index 1b3ed34..acaa347 100644 --- a/tests/test_dateutils.py +++ b/tests/test_dateutils.py @@ -55,6 +55,7 @@ def test_calculate_occurrences_count(): def get_calculate_occurrences(rrule_str, start=0): from datetime import datetime + from project.dateutils import calculate_occurrences start_date = datetime(2030, 1, 1) diff --git a/tests/test_jsonld.py b/tests/test_jsonld.py index be7aa17..6f5a392 100644 --- a/tests/test_jsonld.py +++ b/tests/test_jsonld.py @@ -41,10 +41,11 @@ def test_get_sd_for_place(client, app, db, utils, seeder): place_id = seeder.upsert_default_event_place(admin_unit_id) with app.app_context(): - from project.jsonld import get_sd_for_place - from project.models import EventPlace, Location, Image from math import isclose + from project.jsonld import get_sd_for_place + from project.models import EventPlace, Image, Location + place = EventPlace.query.get(place_id) place.url = "http://www.goslar.de" @@ -101,10 +102,10 @@ def test_get_sd_for_event_date(client, app, db, seeder, utils): event_id = seeder.create_event(admin_unit_id) with app.app_context(): + from project.dateutils import create_berlin_date from project.jsonld import get_sd_for_event_date from project.models import Event, Image from project.services.event import update_event - from project.dateutils import create_berlin_date event = Event.query.get(event_id) event.start = create_berlin_date(2030, 12, 31, 14, 30) diff --git a/tests/utils.py b/tests/utils.py index 274b11f..ae9e22e 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,8 +1,9 @@ import re +from urllib.parse import parse_qs, urlsplit + +from bs4 import BeautifulSoup from flask import g, url_for from sqlalchemy.exc import IntegrityError -from bs4 import BeautifulSoup -from urllib.parse import urlsplit, parse_qs class UtilActions(object): diff --git a/tests/views/test_admin_unit.py b/tests/views/test_admin_unit.py index a37b18a..cb749eb 100644 --- a/tests/views/test_admin_unit.py +++ b/tests/views/test_admin_unit.py @@ -27,9 +27,9 @@ def test_create(client, app, utils, seeder): assert response.status_code == 302 with app.app_context(): + from project.access import has_current_user_member_role_for_admin_unit from project.services.admin_unit import get_admin_unit_by_name from project.services.organizer import get_event_organizer - from project.access import has_current_user_member_role_for_admin_unit admin_unit = get_admin_unit_by_name("Meine Crew") assert admin_unit is not None diff --git a/tests/views/test_event_suggestion.py b/tests/views/test_event_suggestion.py index 4b40f02..ee2f5ee 100644 --- a/tests/views/test_event_suggestion.py +++ b/tests/views/test_event_suggestion.py @@ -33,7 +33,7 @@ def test_reject(client, app, utils, seeder, mocker, db, db_error, is_verified): if is_verified: with app.app_context(): - from project.models import EventSuggestion, EventReviewStatus + from project.models import EventReviewStatus, EventSuggestion suggestion = EventSuggestion.query.get(event_suggestion_id) suggestion.review_status = EventReviewStatus.verified @@ -69,7 +69,7 @@ def test_reject(client, app, utils, seeder, mocker, db, db_error, is_verified): utils.assert_send_mail_called(mail_mock, "vorname@nachname.de") with app.app_context(): - from project.models import EventSuggestion, EventReviewStatus + from project.models import EventReviewStatus, EventSuggestion suggestion = EventSuggestion.query.get(event_suggestion_id) assert suggestion.review_status == EventReviewStatus.rejected diff --git a/tests/views/test_image.py b/tests/views/test_image.py index 359f569..6189742 100644 --- a/tests/views/test_image.py +++ b/tests/views/test_image.py @@ -1,5 +1,7 @@ -import pytest import shutil + +import pytest + from project import img_path diff --git a/tests/views/test_reference_request_review.py b/tests/views/test_reference_request_review.py index 4dab7d1..9d8b7ae 100644 --- a/tests/views/test_reference_request_review.py +++ b/tests/views/test_reference_request_review.py @@ -56,9 +56,9 @@ def test_review_verify(client, seeder, utils, app, mocker, db, db_error, is_veri with app.app_context(): from project.models import ( + EventReference, EventReferenceRequest, EventReferenceRequestReviewStatus, - EventReference, ) reference_request = EventReferenceRequest.query.get(reference_request_id) diff --git a/tests/views/test_root.py b/tests/views/test_root.py index be4ac73..bfeb4a5 100644 --- a/tests/views/test_root.py +++ b/tests/views/test_root.py @@ -1,4 +1,5 @@ import os + from project import dump_path diff --git a/tests/views/test_widget.py b/tests/views/test_widget.py index 39865b5..78a995c 100644 --- a/tests/views/test_widget.py +++ b/tests/views/test_widget.py @@ -42,9 +42,10 @@ def test_event_date(client, seeder, utils, app, db): au_short_name = "meinecrew" with app.app_context(): - from project.models import AdminUnit from colour import Color + from project.models import AdminUnit + admin_unit = AdminUnit.query.get(admin_unit_id) admin_unit.widget_font = "Arial" admin_unit.widget_background_color = Color("#F5F5F5") @@ -137,10 +138,7 @@ def test_event_suggestion_create_for_admin_unit( return with app.app_context(): - from project.models import ( - EventSuggestion, - EventReviewStatus, - ) + from project.models import EventReviewStatus, EventSuggestion suggestion = ( EventSuggestion.query.filter(EventSuggestion.admin_unit_id == admin_unit_id)