diff --git a/alembic/env.py b/alembic/env.py index 61bb47b..8152f9e 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -17,9 +17,10 @@ fileConfig(config.config_file_name) # Read settings YAML file +import os # noqa: E402 from pathlib import Path # noqa: E402 + from yaml import safe_load # noqa: E402 -import os # noqa: E402 app_settings_path = os.getenv("SETTINGS_PATH", "settings.yaml") app_settings = safe_load(Path(app_settings_path).read_text()) diff --git a/alembic/versions/_2024_02_10_23_52_upgrade_empty_to_head.py b/alembic/versions/_2024_02_10_23_52_upgrade_empty_to_head.py index 4e1ea00..1ba5562 100644 --- a/alembic/versions/_2024_02_10_23_52_upgrade_empty_to_head.py +++ b/alembic/versions/_2024_02_10_23_52_upgrade_empty_to_head.py @@ -9,9 +9,9 @@ # ruff: noqa: E501 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = "8ff07476cbc4" diff --git a/alembic/versions/_2024_02_13_03_10_user_schedule_access_key.py b/alembic/versions/_2024_02_13_03_10_user_schedule_access_key.py index d0c1d46..0eeb171 100644 --- a/alembic/versions/_2024_02_13_03_10_user_schedule_access_key.py +++ b/alembic/versions/_2024_02_13_03_10_user_schedule_access_key.py @@ -9,9 +9,9 @@ # ruff: noqa: E501 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = "cba1388a6e8f" diff --git a/alembic/versions/_2024_02_13_05_37_music_room_sports_moodle_hidden.py b/alembic/versions/_2024_02_13_05_37_music_room_sports_moodle_hidden.py index d324e7c..68a4c96 100644 --- a/alembic/versions/_2024_02_13_05_37_music_room_sports_moodle_hidden.py +++ b/alembic/versions/_2024_02_13_05_37_music_room_sports_moodle_hidden.py @@ -9,9 +9,9 @@ # ruff: noqa: E501 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = "6f44af938cdf" diff --git a/alembic/versions/_2024_03_10_21_21_extract_predefined_data.py b/alembic/versions/_2024_03_10_21_21_extract_predefined_data.py index 5184cdf..3eb6ec5 100644 --- a/alembic/versions/_2024_03_10_21_21_extract_predefined_data.py +++ b/alembic/versions/_2024_03_10_21_21_extract_predefined_data.py @@ -9,9 +9,9 @@ # ruff: noqa: E501 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = "a5e80abc2e66" diff --git a/alembic/versions/_2024_09_13_16_39_moodle_authtoken.py b/alembic/versions/_2024_09_13_16_39_moodle_authtoken.py index ec822c8..e15e7ce 100644 --- a/alembic/versions/_2024_09_13_16_39_moodle_authtoken.py +++ b/alembic/versions/_2024_09_13_16_39_moodle_authtoken.py @@ -9,9 +9,9 @@ # ruff: noqa: E501 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = "65da8a75e495" diff --git a/alembic/versions/_2024_09_22_16_35_add_timezone_to_updated_at_and_created_.py b/alembic/versions/_2024_09_22_16_35_add_timezone_to_updated_at_and_created_.py index bc77f77..d6b32d3 100644 --- a/alembic/versions/_2024_09_22_16_35_add_timezone_to_updated_at_and_created_.py +++ b/alembic/versions/_2024_09_22_16_35_add_timezone_to_updated_at_and_created_.py @@ -9,10 +9,11 @@ # ruff: noqa: E501 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql +from alembic import op + # revision identifiers, used by Alembic. revision: str = "6b17213f3f14" down_revision: Union[str, None] = "65da8a75e495" diff --git a/pyproject.toml b/pyproject.toml index 5c3d167..3e97d8c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,4 +32,6 @@ lint.ignore = [ # wildcard imports are fine "F403", "F405", + "PLR" ] +lint.extend-select = ["I", "UP", "PL"] diff --git a/scripts/alembic_auto_migrations.py b/scripts/alembic_auto_migrations.py index b046642..d5d702a 100644 --- a/scripts/alembic_auto_migrations.py +++ b/scripts/alembic_auto_migrations.py @@ -1,5 +1,5 @@ -import sys import pathlib +import sys import alembic.config diff --git a/scripts/migrate_users_from_account_to_events.py b/scripts/migrate_users_from_account_to_events.py index 58451e8..b8b6910 100644 --- a/scripts/migrate_users_from_account_to_events.py +++ b/scripts/migrate_users_from_account_to_events.py @@ -42,7 +42,7 @@ async def main(): type_adapter = TypeAdapter(list[InputUser]) - with open(args.input_file, "r") as file: + with open(args.input_file) as file: data = file.read() users = type_adapter.validate_json(data) diff --git a/src/api/app.py b/src/api/app.py index 3f8bc14..1d29494 100644 --- a/src/api/app.py +++ b/src/api/app.py @@ -58,9 +58,10 @@ app.include_router(router_users) if settings.environment == Environment.DEVELOPMENT: - from src.logging_ import logger import logging + from src.logging_ import logger + logger.warn("Enable sqlalchemy logging") logging.basicConfig() logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) diff --git a/src/api/lifespan.py b/src/api/lifespan.py index de0e328..8d2e794 100644 --- a/src/api/lifespan.py +++ b/src/api/lifespan.py @@ -9,10 +9,10 @@ async def setup_repositories() -> SQLAlchemyStorage: - from src.modules.users.repository import user_repository from src.modules.event_groups.repository import event_group_repository - from src.modules.tags.repository import tag_repository from src.modules.innohassle_accounts import innohassle_accounts + from src.modules.tags.repository import tag_repository + from src.modules.users.repository import user_repository # ------------------- Repositories Dependencies ------------------- @@ -28,6 +28,7 @@ async def setup_repositories() -> SQLAlchemyStorage: def setup_predefined_data_from_file(): import json + from src.modules.predefined.storage import JsonPredefinedUsers from src.modules.predefined.utils import setup_predefined_data_from_object diff --git a/src/config.py b/src/config.py index a90201d..b9e19f2 100644 --- a/src/config.py +++ b/src/config.py @@ -3,7 +3,7 @@ import os from pathlib import Path -from src.config_schema import Settings, Environment +from src.config_schema import Environment, Settings settings_path = os.getenv("SETTINGS_PATH", "settings.yaml") settings: Settings = Settings.from_yaml(Path(settings_path)) diff --git a/src/config_schema.py b/src/config_schema.py index fe2dc5c..314f7fe 100644 --- a/src/config_schema.py +++ b/src/config_schema.py @@ -3,7 +3,7 @@ from typing import Optional import yaml -from pydantic import BaseModel, SecretStr, ConfigDict +from pydantic import BaseModel, ConfigDict, SecretStr class Environment(StrEnum): @@ -67,7 +67,7 @@ class Settings(SettingsEntityModel): @classmethod def from_yaml(cls, path: Path) -> "Settings": - with open(path, "r", encoding="utf-8") as f: + with open(path, encoding="utf-8") as f: yaml_config: dict = yaml.safe_load(f) yaml_config.pop("$schema", None) diff --git a/src/exceptions.py b/src/exceptions.py index 730ace0..ed76bd2 100644 --- a/src/exceptions.py +++ b/src/exceptions.py @@ -1,4 +1,4 @@ -from typing import ClassVar, Any +from typing import Any, ClassVar from fastapi import HTTPException from starlette import status diff --git a/src/logging_.py b/src/logging_.py index 1072e22..bac9452 100644 --- a/src/logging_.py +++ b/src/logging_.py @@ -4,7 +4,7 @@ import inspect import logging.config import os -from typing import Dict, Any +from typing import Any, Dict import fastapi.routing import yaml @@ -18,7 +18,7 @@ def filter(self, record: logging.LogRecord) -> bool: return True -with open("logging.yaml", "r") as f: +with open("logging.yaml") as f: config = yaml.safe_load(f) logging.config.dictConfig(config) diff --git a/src/modules/crud.py b/src/modules/crud.py index 51a8ebf..3331fb4 100644 --- a/src/modules/crud.py +++ b/src/modules/crud.py @@ -1,10 +1,10 @@ __all__ = ["AbstractCRUDRepository", "CRUDFactory"] -from abc import abstractmethod, ABCMeta -from typing import Type, TypeVar, Generic +from abc import ABCMeta, abstractmethod +from typing import Generic, Type, TypeVar from pydantic import BaseModel as PydanticModel -from sqlalchemy import or_, and_, ColumnElement +from sqlalchemy import ColumnElement, and_, or_ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.sql.base import ExecutableOption @@ -71,7 +71,8 @@ def CRUDFactory( UpdateScheme: Type[UpdateType] = None, get_options: tuple[ExecutableOption, ...] = (), ) -> AbstractCRUDRepository[CreateType, ViewType, UpdateType]: - from sqlalchemy import delete, insert, select, update as sql_update + from sqlalchemy import delete, insert, select + from sqlalchemy import update as sql_update from sqlalchemy.dialects.postgresql import insert as postgres_insert from sqlalchemy.inspection import inspect diff --git a/src/modules/event_groups/repository.py b/src/modules/event_groups/repository.py index 8db813a..c04a83f 100644 --- a/src/modules/event_groups/repository.py +++ b/src/modules/event_groups/repository.py @@ -1,20 +1,19 @@ __all__ = ["SqlEventGroupRepository", "event_group_repository"] -from typing import Optional, cast, Iterable +from typing import Iterable, Optional, cast -from sqlalchemy import select, update, delete +from sqlalchemy import delete, select, update from sqlalchemy.dialects.postgresql import insert from sqlalchemy.ext.asyncio import AsyncSession -from src.modules.crud import CRUDFactory, AbstractCRUDRepository -from src.modules.ownership import setup_ownership_method -from src.modules.ownership import OwnershipEnum +from src.modules.crud import AbstractCRUDRepository, CRUDFactory from src.modules.event_groups.schemas import ( - CreateEventGroupWithoutTags, - ViewEventGroup, CreateEventGroup, + CreateEventGroupWithoutTags, UpdateEventGroup, + ViewEventGroup, ) +from src.modules.ownership import OwnershipEnum, setup_ownership_method from src.storages.sql import SQLAlchemyStorage from src.storages.sql.models import EventGroup diff --git a/src/modules/event_groups/routes.py b/src/modules/event_groups/routes.py index 7042960..9715d75 100644 --- a/src/modules/event_groups/routes.py +++ b/src/modules/event_groups/routes.py @@ -2,8 +2,7 @@ import aiofiles import icalendar -from fastapi import APIRouter -from fastapi import UploadFile, HTTPException, Body +from fastapi import APIRouter, Body, HTTPException, UploadFile from sqlalchemy.exc import IntegrityError from starlette.responses import JSONResponse @@ -11,11 +10,11 @@ from src.exceptions import ( EventGroupNotFoundException, EventGroupWithMissingPath, - IncorrectCredentialsException, ForbiddenException, + IncorrectCredentialsException, ) from src.modules.event_groups.repository import event_group_repository -from src.modules.event_groups.schemas import ViewEventGroup, ListEventGroupsResponse, CreateEventGroup, UpdateEventGroup +from src.modules.event_groups.schemas import CreateEventGroup, ListEventGroupsResponse, UpdateEventGroup, ViewEventGroup from src.modules.parse.utils import locate_ics_by_path router = APIRouter(prefix="/event-groups", tags=["Event Groups"]) diff --git a/src/modules/event_groups/schemas.py b/src/modules/event_groups/schemas.py index ef42155..a175f94 100644 --- a/src/modules/event_groups/schemas.py +++ b/src/modules/event_groups/schemas.py @@ -7,11 +7,11 @@ ] import datetime -from typing import Optional, Iterable +from typing import Iterable, Optional -from pydantic import BaseModel, Field, ConfigDict, field_validator +from pydantic import BaseModel, ConfigDict, Field, field_validator -from src.modules.tags.schemas import ViewTag, CreateTag +from src.modules.tags.schemas import CreateTag, ViewTag class CreateEventGroupWithoutTags(BaseModel): diff --git a/src/modules/events/repository.py b/src/modules/events/repository.py index fb1c874..cef1e8d 100644 --- a/src/modules/events/repository.py +++ b/src/modules/events/repository.py @@ -7,12 +7,12 @@ from src.modules.crud import CRUDFactory from src.modules.events.schemas import ( + AddEventPatch, CreateEvent, UpdateEvent, + UpdateEventPatch, ViewEvent, - AddEventPatch, ViewEventPatch, - UpdateEventPatch, ) from src.storages.sql import SQLAlchemyStorage from src.storages.sql.models import Event, EventPatch diff --git a/src/modules/events/schemas.py b/src/modules/events/schemas.py index 9dc459d..12ce68d 100644 --- a/src/modules/events/schemas.py +++ b/src/modules/events/schemas.py @@ -4,7 +4,7 @@ from typing import Optional from icalendar import vRecur -from pydantic import BaseModel, Field, field_validator, ConfigDict +from pydantic import BaseModel, ConfigDict, Field, field_validator class CreateEvent(BaseModel): diff --git a/src/modules/ics/routes.py b/src/modules/ics/routes.py index 54a84d7..0969f95 100644 --- a/src/modules/ics/routes.py +++ b/src/modules/ics/routes.py @@ -1,19 +1,18 @@ from urllib.parse import unquote -from fastapi import APIRouter -from fastapi import HTTPException -from starlette.responses import FileResponse, StreamingResponse, Response +from fastapi import APIRouter, HTTPException +from starlette.responses import FileResponse, Response, StreamingResponse from src.api.dependencies import CURRENT_USER_ID_DEPENDENCY from src.config import settings -from src.exceptions import EventGroupNotFoundException, ObjectNotFound, ForbiddenException +from src.exceptions import EventGroupNotFoundException, ForbiddenException, ObjectNotFound from src.modules.event_groups.repository import event_group_repository from src.modules.ics.utils import ( generate_ics_from_url, + get_moodle_ics, get_personal_event_groups_ics, - get_personal_sport_ics, get_personal_music_room_ics, - get_moodle_ics, + get_personal_sport_ics, ) from src.modules.parse.utils import locate_ics_by_path from src.modules.users.linked import LinkedCalendarView diff --git a/src/modules/ics/utils.py b/src/modules/ics/utils.py index 8ee44bf..148d455 100644 --- a/src/modules/ics/utils.py +++ b/src/modules/ics/utils.py @@ -49,7 +49,7 @@ async def generate_ics_from_url(url: str, headers: dict = None) -> AsyncGenerato async def _generate_ics_from_multiple(user: ViewUser, *ics: Path) -> AsyncGenerator[bytes, None]: async def _async_read_schedule(ics_path: Path): - async with aiofiles.open(ics_path, "r") as f: + async with aiofiles.open(ics_path) as f: content = await f.read() _cal = icalendar.Calendar.from_ical(content) return _cal @@ -176,7 +176,7 @@ async def get_personal_sport_ics(user: ViewUser) -> bytes: def _training_to_vevent(training: Training) -> icalendar.Event: string_to_hash = str(training.extendedProps.id) hash_ = crc32(string_to_hash.encode("utf-8")) - uid = "sport-%x@innohassle.ru" % abs(hash_) + uid = f"sport-{abs(hash_):x}@innohassle.ru" vevent = icalendar.Event() vevent.add("uid", uid) diff --git a/src/modules/ownership.py b/src/modules/ownership.py index b9214f1..69f691a 100644 --- a/src/modules/ownership.py +++ b/src/modules/ownership.py @@ -2,7 +2,7 @@ from enum import StrEnum -from pydantic import BaseModel, field_validator, ConfigDict +from pydantic import BaseModel, ConfigDict, field_validator from sqlalchemy import delete from sqlalchemy.dialects.postgresql import insert from sqlalchemy.ext.asyncio import AsyncSession diff --git a/src/modules/parse/bootcamp.py b/src/modules/parse/bootcamp.py index 8f248e9..7f98c3d 100644 --- a/src/modules/parse/bootcamp.py +++ b/src/modules/parse/bootcamp.py @@ -1,10 +1,10 @@ import datetime import re from typing import Generator +from zlib import crc32 import icalendar -from pydantic import BaseModel, Field, ConfigDict, field_validator -from zlib import crc32 +from pydantic import BaseModel, ConfigDict, Field, field_validator from src.modules.parse.utils import get_color @@ -76,7 +76,7 @@ def get_uid(self) -> str: else: string_to_hash = str(("bootcamp", self.summary, self.location, self.dtstart)) hash_ = crc32(string_to_hash.encode("utf-8")) - return "%x#bootcamp@innohassle.ru" % abs(hash_) + return f"{abs(hash_):x}#bootcamp@innohassle.ru" def get_vevent(self) -> icalendar.Event: """ diff --git a/src/modules/parse/cleaning.py b/src/modules/parse/cleaning.py index 30df390..31b478f 100644 --- a/src/modules/parse/cleaning.py +++ b/src/modules/parse/cleaning.py @@ -92,7 +92,7 @@ def get_uid(self) -> str: string_to_hash = str(("cleaning", self.summary, self.location, self.date.isoformat())) hash_ = crc32(string_to_hash.encode("utf-8")) - return "%x#cleaning@innohassle.ru" % abs(hash_) + return f"{abs(hash_):x}#cleaning@innohassle.ru" def get_vevent(self) -> icalendar.Event: """ @@ -126,7 +126,7 @@ def get_uid(self) -> str: """ string_to_hash = str(("linen", self.summary, self.location)) hash_ = crc32(string_to_hash.encode("utf-8")) - return "%x#linen@innohassle.ru" % abs(hash_) + return f"{abs(hash_):x}#linen@innohassle.ru" def get_vevent(self) -> icalendar.Event: """ diff --git a/src/modules/parse/routes.py b/src/modules/parse/routes.py index fd774da..bd464a7 100644 --- a/src/modules/parse/routes.py +++ b/src/modules/parse/routes.py @@ -11,9 +11,9 @@ from src.exceptions import IncorrectCredentialsException from src.modules.event_groups.repository import event_group_repository from src.modules.event_groups.schemas import CreateEventGroup -from src.modules.parse.bootcamp import BootcampParserConfig, BootcampParser, AcademicGroup, BuddyGroup, Workshop -from src.modules.parse.cleaning import CleaningParserConfig, CleaningParser, CleaningEvent, LinenChangeEvent -from src.modules.parse.utils import sluggify, locate_ics_by_path, get_base_calendar +from src.modules.parse.bootcamp import AcademicGroup, BootcampParser, BootcampParserConfig, BuddyGroup, Workshop +from src.modules.parse.cleaning import CleaningEvent, CleaningParser, CleaningParserConfig, LinenChangeEvent +from src.modules.parse.utils import get_base_calendar, locate_ics_by_path, sluggify from src.modules.tags.schemas import CreateTag router = APIRouter(prefix="/parse", tags=["Parse"]) diff --git a/src/modules/predefined/storage.py b/src/modules/predefined/storage.py index 571cc74..ca68b6a 100644 --- a/src/modules/predefined/storage.py +++ b/src/modules/predefined/storage.py @@ -1,6 +1,6 @@ __all__ = ["JsonPredefinedUsers"] -from pydantic import BaseModel, Field, field_validator, TypeAdapter +from pydantic import BaseModel, Field, TypeAdapter, field_validator class JsonPredefinedUsers(BaseModel): diff --git a/src/modules/tags/repository.py b/src/modules/tags/repository.py index 8501c3d..6c9b950 100644 --- a/src/modules/tags/repository.py +++ b/src/modules/tags/repository.py @@ -5,11 +5,11 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload -from src.modules.crud import CRUDFactory, AbstractCRUDRepository +from src.modules.crud import AbstractCRUDRepository, CRUDFactory from src.modules.ownership import OwnershipEnum, setup_ownership_method -from src.modules.tags.schemas import CreateTag, ViewTag, UpdateTag +from src.modules.tags.schemas import CreateTag, UpdateTag, ViewTag from src.storages.sql import SQLAlchemyStorage -from src.storages.sql.models import Tag, EventGroup +from src.storages.sql.models import EventGroup, Tag CRUD: AbstractCRUDRepository[ CreateTag, diff --git a/src/modules/tags/routes.py b/src/modules/tags/routes.py index 51b5de0..f4bd42b 100644 --- a/src/modules/tags/routes.py +++ b/src/modules/tags/routes.py @@ -1,11 +1,10 @@ -from fastapi import APIRouter -from fastapi import Body +from fastapi import APIRouter, Body from pydantic import BaseModel from src.api.dependencies import VERIFY_PARSER_DEPENDENCY from src.exceptions import IncorrectCredentialsException from src.modules.tags.repository import tag_repository -from src.modules.tags.schemas import ViewTag, CreateTag +from src.modules.tags.schemas import CreateTag, ViewTag router = APIRouter(prefix="/tags", tags=["Tags"]) diff --git a/src/modules/tags/schemas.py b/src/modules/tags/schemas.py index 48ba0dd..36856b3 100644 --- a/src/modules/tags/schemas.py +++ b/src/modules/tags/schemas.py @@ -3,7 +3,7 @@ import json from typing import Optional -from pydantic import BaseModel, Json, ConfigDict, field_validator +from pydantic import BaseModel, ConfigDict, Json, field_validator class CreateTag(BaseModel, frozen=True): diff --git a/src/modules/tokens/repository.py b/src/modules/tokens/repository.py index cc4f153..d229a63 100644 --- a/src/modules/tokens/repository.py +++ b/src/modules/tokens/repository.py @@ -2,8 +2,7 @@ import time -from authlib.jose import JWTClaims -from authlib.jose import jwt, JoseError +from authlib.jose import JoseError, JWTClaims, jwt from pydantic import BaseModel from src.modules.innohassle_accounts import innohassle_accounts diff --git a/src/modules/users/repository.py b/src/modules/users/repository.py index 23c8cd2..769d9bd 100644 --- a/src/modules/users/repository.py +++ b/src/modules/users/repository.py @@ -4,17 +4,17 @@ import string from typing import Literal -from sqlalchemy import select, delete, update +from sqlalchemy import delete, select, update from sqlalchemy.dialects.postgresql import insert from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload from sqlalchemy.sql.expression import exists from src.exceptions import EventGroupNotFoundException -from src.modules.crud import CRUDFactory, AbstractCRUDRepository +from src.modules.crud import AbstractCRUDRepository, CRUDFactory from src.modules.users.linked import LinkedCalendarCreate, LinkedCalendarView -from src.modules.users.schemas import CreateUser, ViewUser, UpdateUser, ViewUserScheduleKey -from src.storages.sql.models import User, EventGroup, UserXFavoriteEventGroup, LinkedCalendar, UserScheduleKeys +from src.modules.users.schemas import CreateUser, UpdateUser, ViewUser, ViewUserScheduleKey +from src.storages.sql.models import EventGroup, LinkedCalendar, User, UserScheduleKeys, UserXFavoriteEventGroup from src.storages.sql.models.event_groups import UserXHiddenEventGroup from src.storages.sql.storage import SQLAlchemyStorage diff --git a/src/modules/users/routes.py b/src/modules/users/routes.py index be9259e..b412b8e 100644 --- a/src/modules/users/routes.py +++ b/src/modules/users/routes.py @@ -1,16 +1,14 @@ from typing import Literal -from fastapi import APIRouter -from fastapi import HTTPException +from fastapi import APIRouter, HTTPException from pydantic import BaseModel from sqlalchemy.exc import IntegrityError from src.api.dependencies import CURRENT_USER_ID_DEPENDENCY -from src.exceptions import IncorrectCredentialsException -from src.exceptions import ObjectNotFound, EventGroupNotFoundException +from src.exceptions import EventGroupNotFoundException, IncorrectCredentialsException, ObjectNotFound from src.modules.event_groups.repository import event_group_repository from src.modules.predefined.repository import predefined_repository -from src.modules.users.linked import LinkedCalendarView, LinkedCalendarCreate +from src.modules.users.linked import LinkedCalendarCreate, LinkedCalendarView from src.modules.users.repository import user_repository from src.modules.users.schemas import ViewUser, ViewUserScheduleKey diff --git a/src/modules/users/schemas.py b/src/modules/users/schemas.py index 7b0c923..c6cc43c 100644 --- a/src/modules/users/schemas.py +++ b/src/modules/users/schemas.py @@ -2,7 +2,7 @@ from typing import Optional -from pydantic import Field, BaseModel, field_validator, ConfigDict +from pydantic import BaseModel, ConfigDict, Field, field_validator from src.modules.users.linked import LinkedCalendarView diff --git a/src/storages/sql/models/__init__.py b/src/storages/sql/models/__init__.py index 7d569cd..690bca9 100644 --- a/src/storages/sql/models/__init__.py +++ b/src/storages/sql/models/__init__.py @@ -1,12 +1,10 @@ -from src.storages.sql.models.base import Base - import src.storages.sql.models.__mixin__ # noqa: F401, E402 - +from src.storages.sql.models.base import Base from src.storages.sql.models.event_groups import EventGroup, UserXFavoriteEventGroup from src.storages.sql.models.events import Event, EventPatch +from src.storages.sql.models.linked import LinkedCalendar from src.storages.sql.models.tags import Tag from src.storages.sql.models.users import User, UserScheduleKeys -from src.storages.sql.models.linked import LinkedCalendar __all__ = [ "Base", diff --git a/src/storages/sql/models/__mixin__.py b/src/storages/sql/models/__mixin__.py index 8835574..6764ae0 100644 --- a/src/storages/sql/models/__mixin__.py +++ b/src/storages/sql/models/__mixin__.py @@ -9,9 +9,9 @@ import datetime -from sqlalchemy import ForeignKey, String, Text, DateTime, func -from sqlalchemy.ext.associationproxy import association_proxy, AssociationProxy -from sqlalchemy.orm import DeclarativeBase, declared_attr, relationship, Mapped, mapped_column +from sqlalchemy import DateTime, ForeignKey, String, Text, func +from sqlalchemy.ext.associationproxy import AssociationProxy, association_proxy +from sqlalchemy.orm import DeclarativeBase, Mapped, declared_attr, mapped_column, relationship def TagsMixinFactory(tablename: str, Base: type[DeclarativeBase]): diff --git a/src/storages/sql/models/event_groups.py b/src/storages/sql/models/event_groups.py index 7e3a6ac..221fc98 100644 --- a/src/storages/sql/models/event_groups.py +++ b/src/storages/sql/models/event_groups.py @@ -1,19 +1,19 @@ __all__ = ["EventGroup", "UserXFavoriteEventGroup", "UserXHiddenEventGroup"] -from typing import Any, TYPE_CHECKING +from typing import TYPE_CHECKING, Any from sqlalchemy import JSON, ForeignKey, String from sqlalchemy.orm import Mapped, mapped_column, relationship +from src.storages.sql.models import Base from src.storages.sql.models.__mixin__ import ( - TagsMixinFactory, + DescriptionMixin, IdMixin, NameMixin, - DescriptionMixin, OwnershipsMixinFactory, + TagsMixinFactory, UpdateCreateDateTimeMixin, ) -from src.storages.sql.models import Base if TYPE_CHECKING: from src.storages.sql.models.events import Event diff --git a/src/storages/sql/models/events.py b/src/storages/sql/models/events.py index a2d3685..36b1b72 100644 --- a/src/storages/sql/models/events.py +++ b/src/storages/sql/models/events.py @@ -1,20 +1,19 @@ __all__ = ["Event", "EventPatch"] import datetime +from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey, Text, String +from sqlalchemy import ForeignKey, String, Text from sqlalchemy.orm import Mapped, mapped_column, relationship +from src.storages.sql.models import Base from src.storages.sql.models.__mixin__ import ( + DescriptionMixin, IdMixin, NameMixin, - DescriptionMixin, - UpdateCreateDateTimeMixin, OwnershipsMixinFactory, + UpdateCreateDateTimeMixin, ) -from src.storages.sql.models import Base - -from typing import TYPE_CHECKING if TYPE_CHECKING: from src.storages.sql.models.event_groups import EventGroup diff --git a/src/storages/sql/models/linked.py b/src/storages/sql/models/linked.py index 19df8b5..d500927 100644 --- a/src/storages/sql/models/linked.py +++ b/src/storages/sql/models/linked.py @@ -2,10 +2,10 @@ from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey, String, Boolean, UniqueConstraint -from sqlalchemy.orm import mapped_column, Mapped, relationship +from sqlalchemy import Boolean, ForeignKey, String, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship -from src.storages.sql.models.__mixin__ import IdMixin, NameMixin, DescriptionMixin +from src.storages.sql.models.__mixin__ import DescriptionMixin, IdMixin, NameMixin from src.storages.sql.models.base import Base if TYPE_CHECKING: diff --git a/src/storages/sql/models/tags.py b/src/storages/sql/models/tags.py index 52ccd5f..96c9264 100644 --- a/src/storages/sql/models/tags.py +++ b/src/storages/sql/models/tags.py @@ -5,8 +5,8 @@ from sqlalchemy import JSON, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column -from src.storages.sql.models.__mixin__ import IdMixin, NameMixin, OwnershipsMixinFactory, DescriptionMixin from src.storages.sql.models import Base +from src.storages.sql.models.__mixin__ import DescriptionMixin, IdMixin, NameMixin, OwnershipsMixinFactory class Tag(Base, IdMixin, NameMixin, DescriptionMixin, OwnershipsMixinFactory("tags", Base)): diff --git a/src/storages/sql/models/users.py b/src/storages/sql/models/users.py index be4deca..c2fec92 100644 --- a/src/storages/sql/models/users.py +++ b/src/storages/sql/models/users.py @@ -4,14 +4,13 @@ from sqlalchemy import ForeignKey, false from sqlalchemy.ext.associationproxy import association_proxy -from sqlalchemy.orm import relationship, mapped_column, Mapped +from sqlalchemy.orm import Mapped, mapped_column, relationship from src.storages.sql.models.__mixin__ import IdMixin from src.storages.sql.models.base import Base if TYPE_CHECKING: - from src.storages.sql.models.event_groups import UserXHiddenEventGroup - from src.storages.sql.models.event_groups import UserXFavoriteEventGroup + from src.storages.sql.models.event_groups import UserXFavoriteEventGroup, UserXHiddenEventGroup from src.storages.sql.models.linked import LinkedCalendar