diff --git a/pyproject.toml b/pyproject.toml index 61b43cf..42fa167 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -95,18 +95,25 @@ select = [ "TCH" ] -ignore = ["D100", "D103", "T201", "D104"] +ignore = ["D100", "D103", "T201", "D104", "COM819", "D212"] fixable = ["ALL"] unfixable = [] [tool.ruff.format] -quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" docstring-code-format = false +[tool.ruff.lint."flake8-quotes"] +inline-quotes = "single" + +[tool.ruff.lint.per-file-ignores] +"__init__.py" = ["F401"] +"settings*" = ["E501", "F405"] + [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] "settings*" = ["E501", "F405"] + diff --git a/src/admin_user/admin.py b/src/admin_user/admin.py index 820bccb..0a20948 100644 --- a/src/admin_user/admin.py +++ b/src/admin_user/admin.py @@ -6,7 +6,8 @@ @admin.register(Administrator) class AdministratorAdmin(UserAdmin): - """Admin panel for the Admin model in the Django admin area. + """ + Admin panel for the Admin model in the Django admin area. Changes made: - 'USERNAME_FIELD from the User model is used for creating a user.' @@ -16,19 +17,19 @@ class AdministratorAdmin(UserAdmin): add_fieldsets = ( (None, { - "fields": ( + 'fields': ( Administrator.USERNAME_FIELD, *Administrator.REQUIRED_FIELDS, - "password1", - "password2", - "is_staff", - "is_superuser", + 'password1', + 'password2', + 'is_staff', + 'is_superuser', ), }), ) - list_display = ("username", "email") - search_fields = ("username", "email") - list_filter = ("is_staff",) - list_display_links = ("username",) - search_help_text = "Поиск по почте или имени пользователя." + list_display = ('username', 'email',) + search_fields = ('username', 'email',) + list_filter = ('is_staff',) + list_display_links = ('username',) + search_help_text = 'Поиск по почте или имени пользователя.' diff --git a/src/admin_user/apps.py b/src/admin_user/apps.py index 996d5cb..bf55d7d 100644 --- a/src/admin_user/apps.py +++ b/src/admin_user/apps.py @@ -4,5 +4,5 @@ class AdminUserConfig(AppConfig): """Django config for admin_user app.""" - default_auto_field = "django.db.models.BigAutoField" - name = "admin_user" + default_auto_field = 'django.db.models.BigAutoField' + name = 'admin_user' diff --git a/src/admin_user/models.py b/src/admin_user/models.py index e117801..ca0e53f 100644 --- a/src/admin_user/models.py +++ b/src/admin_user/models.py @@ -9,27 +9,28 @@ class Administrator(AbstractUser): """Custom Administrator model.""" - first_name = models.CharField("Имя", max_length=DEFAULT_NAME_LENGTH) - last_name = models.CharField("Фамилия", max_length=DEFAULT_NAME_LENGTH) - phone = PhoneNumberField("Номер телефона", help_text="Формат +7XXXXXXXXXX") - USERNAME_FIELD = "email" - REQUIRED_FIELDS = ("username", "first_name", "last_name", "phone") + first_name = models.CharField('Имя', max_length=DEFAULT_NAME_LENGTH) + last_name = models.CharField('Фамилия', max_length=DEFAULT_NAME_LENGTH) + phone = PhoneNumberField('Номер телефона', help_text='Формат +7XXXXXXXXXX') + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = ('username', 'first_name', 'last_name', 'phone') email = models.EmailField( - "E-mail адрес", + 'E-mail адрес', max_length=EMAIL_LENGTH, unique=True, ) class Meta: - """Set verbose name and verbose name plural. + """ + Set verbose name and verbose name plural. Defaults to ordering by id. """ - ordering = ("id",) - verbose_name = "Администратор" - verbose_name_plural = "Администраторы" + ordering = ('id',) + verbose_name = 'Администратор' + verbose_name_plural = 'Администраторы' def __str__(self) -> str: """Return a string representation of User object.""" diff --git a/src/bot/apps.py b/src/bot/apps.py index 5a62727..69d333f 100644 --- a/src/bot/apps.py +++ b/src/bot/apps.py @@ -5,8 +5,8 @@ class BotConfig(AppConfig): """Configuration class for the bot application.""" - default_auto_field = "django.db.models.BigAutoField" - name = "bot" + default_auto_field = 'django.db.models.BigAutoField' + name = 'bot' def stop_bot(self, **kwargs): """Stop application.""" @@ -15,14 +15,14 @@ def stop_bot(self, **kwargs): def ready(self) -> None: """Perform actions when the application is ready.""" import os - + # TODO: временное решение, необходимо продумать улучшение. - if os.environ.get("DJANGO_MIGRATE", False): - if os.environ.get("RUN_MAIN", None) != "true": + if os.environ.get('DJANGO_MIGRATE', False): + if os.environ.get('RUN_MAIN', None) != 'true': from bot.bot_interface import Bot self.bot = Bot() asgi_shutdown.connect(self.stop_bot) - self.bot.start() \ No newline at end of file + self.bot.start() diff --git a/src/bot/handlers.py b/src/bot/handlers.py index c96a79b..fc0d85d 100644 --- a/src/bot/handlers.py +++ b/src/bot/handlers.py @@ -8,8 +8,8 @@ async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message( chat_id=update.effective_chat.id, text=( - "Привет, я бот онлайн школы GoodStart.\n\n" - "Здесь ты найдёшь лучших преподавателей." + 'Привет, я бот онлайн школы GoodStart.\n\n' + 'Здесь ты найдёшь лучших преподавателей.' ), ) @@ -23,5 +23,5 @@ async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE): ) -start_handler = CommandHandler("start", start) +start_handler = CommandHandler('start', start) echo_handler = MessageHandler(filters.TEXT & (~filters.COMMAND), echo) diff --git a/src/core/asgi_dev.py b/src/core/asgi_dev.py index e7084f4..e3deb97 100644 --- a/src/core/asgi_dev.py +++ b/src/core/asgi_dev.py @@ -3,8 +3,8 @@ from django.core.asgi import get_asgi_application os.environ.setdefault( - "DJANGO_SETTINGS_MODULE", - "core.config.settings_dev", + 'DJANGO_SETTINGS_MODULE', + 'core.config.settings_dev', ) # настройки для разработки application = get_asgi_application() diff --git a/src/core/asgi_prod.py b/src/core/asgi_prod.py index 9273e1f..ef55687 100644 --- a/src/core/asgi_prod.py +++ b/src/core/asgi_prod.py @@ -3,8 +3,8 @@ from django.core.asgi import get_asgi_application os.environ.setdefault( - "DJANGO_SETTINGS_MODULE", - "core.config.settings_prod", + 'DJANGO_SETTINGS_MODULE', + 'core.config.settings_prod', ) # настройки для сервера application = get_asgi_application() diff --git a/src/core/config/settings_base.py b/src/core/config/settings_base.py index a88501f..ae7fc8a 100644 --- a/src/core/config/settings_base.py +++ b/src/core/config/settings_base.py @@ -9,93 +9,93 @@ BASE_DIR = Path(__file__).resolve().parent.parent.parent ROOT_DIR = BASE_DIR.parent -environ.Env.read_env(os.path.join(ROOT_DIR, ".env")) +environ.Env.read_env(os.path.join(ROOT_DIR, '.env')) -STATIC_ROOT = os.path.join(ROOT_DIR, "static/") +STATIC_ROOT = os.path.join(ROOT_DIR, 'static/') -DEFAULT = "some_default_key" +DEFAULT = 'some_default_key' -SECRET_KEY = env.str("SECRET_KEY", default=DEFAULT) +SECRET_KEY = env.str('SECRET_KEY', default=DEFAULT) -TELEGRAM_TOKEN = env("TELEGRAM_TOKEN") +TELEGRAM_TOKEN = env('TELEGRAM_TOKEN') -ALLOWED_HOSTS = ["*"] +ALLOWED_HOSTS = ['*'] DEFAULT_APPS = [ - "django.contrib.admin", - "django.contrib.auth", - "django.contrib.contenttypes", - "django.contrib.sessions", - "django.contrib.messages", - "django.contrib.staticfiles", + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', ] LOCAL_APPS = [ - "bot.apps.BotConfig", - "potential_user.apps.PotentialUserConfig", - "admin_user.apps.AdminUserConfig", - "schooling.apps.SchoolingConfig", + 'bot.apps.BotConfig', + 'potential_user.apps.PotentialUserConfig', + 'admin_user.apps.AdminUserConfig', + 'schooling.apps.SchoolingConfig', ] -EXTERNAL_APPS = ["phonenumber_field",] +EXTERNAL_APPS = ['phonenumber_field',] INSTALLED_APPS = DEFAULT_APPS + EXTERNAL_APPS + LOCAL_APPS MIDDLEWARE = [ - "django.middleware.security.SecurityMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", - "django.middleware.csrf.CsrfViewMiddleware", - "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.middleware.clickjacking.XFrameOptionsMiddleware", + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -ROOT_URLCONF = "core.urls" +ROOT_URLCONF = 'core.urls' TEMPLATES = [ { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [], - "APP_DIRS": True, - "OPTIONS": { - "context_processors": [ - "django.template.context_processors.debug", - "django.template.context_processors.request", - "django.contrib.auth.context_processors.auth", - "django.contrib.messages.context_processors.messages", + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', ], }, }, ] -WSGI_APPLICATION = "core.wsgi.application" +WSGI_APPLICATION = 'core.wsgi.application' -AUTH_USER_MODEL = "admin_user.Administrator" +AUTH_USER_MODEL = 'admin_user.Administrator' AUTH_PASSWORD_VALIDATORS = [ { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { - "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { - "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] -LANGUAGE_CODE = "ru-RU" +LANGUAGE_CODE = 'ru-RU' -TIME_ZONE = "UTC" +TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True -STATIC_URL = "static/" +STATIC_URL = 'static/' -DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/src/core/config/settings_for_dev.py b/src/core/config/settings_for_dev.py index 3d68257..5717c3b 100644 --- a/src/core/config/settings_for_dev.py +++ b/src/core/config/settings_for_dev.py @@ -5,15 +5,15 @@ DEBUG = True DATABASES = { - "default": { - "ENGINE": env.str( - "POSTGRES_ENGINE", - default="django.db.backends.postgresql", + 'default': { + 'ENGINE': env.str( + 'POSTGRES_ENGINE', + default='django.db.backends.postgresql', ), - "NAME": env.str("POSTGRES_NAME", default="postgres"), - "USER": env.str("POSTGRES_USER", default="postgres"), - "PASSWORD": env.str("POSTGRES_PASSWORD", default="postgres"), - "HOST": env.str("POSTGRES_HOST", default="localhost"), - "PORT": env.str("POSTGRES_PORT", default="5432"), + 'NAME': env.str('POSTGRES_NAME', default='postgres'), + 'USER': env.str('POSTGRES_USER', default='postgres'), + 'PASSWORD': env.str('POSTGRES_PASSWORD', default='postgres'), + 'HOST': env.str('POSTGRES_HOST', default='localhost'), + 'PORT': env.str('POSTGRES_PORT', default='5432'), }, } diff --git a/src/core/config/settings_for_prod.py b/src/core/config/settings_for_prod.py index 8befadc..80db377 100644 --- a/src/core/config/settings_for_prod.py +++ b/src/core/config/settings_for_prod.py @@ -5,15 +5,15 @@ DEBUG = False DATABASES = { - "default": { - "ENGINE": env.str( - "POSTGRES_ENGINE", - default="django.db.backends.postgresql", + 'default': { + 'ENGINE': env.str( + 'POSTGRES_ENGINE', + default='django.db.backends.postgresql', ), - "NAME": env.str("POSTGRES_NAME", default="postgres"), - "USER": env.str("POSTGRES_USER", default="postgres"), - "PASSWORD": env.str("POSTGRES_PASSWORD", default="postgres"), - "HOST": env.str("POSTGRES_HOST", default="localhost"), - "PORT": env.str("POSTGRES_PORT", default="5432"), + 'NAME': env.str('POSTGRES_NAME', default='postgres'), + 'USER': env.str('POSTGRES_USER', default='postgres'), + 'PASSWORD': env.str('POSTGRES_PASSWORD', default='postgres'), + 'HOST': env.str('POSTGRES_HOST', default='localhost'), + 'PORT': env.str('POSTGRES_PORT', default='5432'), }, } diff --git a/src/core/config/settings_for_tests.py b/src/core/config/settings_for_tests.py index 1e0779c..8b8e301 100644 --- a/src/core/config/settings_for_tests.py +++ b/src/core/config/settings_for_tests.py @@ -5,8 +5,8 @@ DEBUG = False DATABASES = { - "default": { - "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR / "db.sqlite3", + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', }, } diff --git a/src/core/logging/logger.py b/src/core/logging/logger.py index f016e2e..6593cc0 100644 --- a/src/core/logging/logger.py +++ b/src/core/logging/logger.py @@ -5,7 +5,7 @@ def inner(*args, **kwargs): try: return f(*args, **kwargs) except Exception as e: - error_message = f"Произошла ошибка: {e}" + error_message = f'Произошла ошибка: {e}' print(error_message) raise e diff --git a/src/core/settings.py b/src/core/settings.py index 235edb4..5b631e2 100644 --- a/src/core/settings.py +++ b/src/core/settings.py @@ -9,86 +9,86 @@ BASE_DIR = Path(__file__).resolve().parent.parent -environ.Env.read_env(os.path.join(BASE_DIR, ".env")) +environ.Env.read_env(os.path.join(BASE_DIR, '.env')) -SECRET_KEY = env("SECRET_KEY") +SECRET_KEY = env('SECRET_KEY') -DEBUG = env("DEBUG") +DEBUG = env('DEBUG') -ALLOWED_HOSTS = env("ALLOWED_HOSTS").split() +ALLOWED_HOSTS = env('ALLOWED_HOSTS').split() INSTALLED_APPS = [ - "django.contrib.admin", - "django.contrib.auth", - "django.contrib.contenttypes", - "django.contrib.sessions", - "django.contrib.messages", - "django.contrib.staticfiles", - "bot.apps.BotConfig", + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'bot.apps.BotConfig', ] MIDDLEWARE = [ - "django.middleware.security.SecurityMiddleware", - "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", - "django.middleware.csrf.CsrfViewMiddleware", - "django.contrib.auth.middleware.AuthenticationMiddleware", - "django.contrib.messages.middleware.MessageMiddleware", - "django.middleware.clickjacking.XFrameOptionsMiddleware", + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -ROOT_URLCONF = "core.urls" +ROOT_URLCONF = 'core.urls' TEMPLATES = [ { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [], - "APP_DIRS": True, - "OPTIONS": { - "context_processors": [ - "django.template.context_processors.debug", - "django.template.context_processors.request", - "django.contrib.auth.context_processors.auth", - "django.contrib.messages.context_processors.messages", + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', ], }, }, ] -WSGI_APPLICATION = "core.wsgi.application" +WSGI_APPLICATION = 'core.wsgi.application' DATABASES = { - "default": { - "ENGINE": "django.db.backends.sqlite3", - "NAME": BASE_DIR / "db.sqlite3", + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', }, } AUTH_PASSWORD_VALIDATORS = [ { - "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { - "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { - "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { - "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] -LANGUAGE_CODE = "ru-RU" +LANGUAGE_CODE = 'ru-RU' -TIME_ZONE = "UTC" +TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True -STATIC_URL = "static/" +STATIC_URL = 'static/' -DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -TELEGRAM_TOKEN = env("TELEGRAM_TOKEN") +TELEGRAM_TOKEN = env('TELEGRAM_TOKEN') diff --git a/src/core/urls.py b/src/core/urls.py index 083932c..dfc7362 100644 --- a/src/core/urls.py +++ b/src/core/urls.py @@ -2,5 +2,5 @@ from django.urls import path urlpatterns = [ - path("admin/", admin.site.urls), + path('admin/', admin.site.urls), ] diff --git a/src/core/wsgi.py b/src/core/wsgi.py index 4892961..f7ff4d6 100644 --- a/src/core/wsgi.py +++ b/src/core/wsgi.py @@ -2,6 +2,6 @@ from django.core.wsgi import get_wsgi_application -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings") +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings') application = get_wsgi_application() diff --git a/src/manage.py b/src/manage.py index 204ae93..4b4d034 100644 --- a/src/manage.py +++ b/src/manage.py @@ -8,8 +8,8 @@ def main(): """Run administrative tasks.""" os.environ.setdefault( - "DJANGO_SETTINGS_MODULE", - "core.config.settings_for_dev", + 'DJANGO_SETTINGS_MODULE', + 'core.config.settings_for_dev', ) # настройки для разработки try: from django.core.management import execute_from_command_line @@ -22,5 +22,5 @@ def main(): execute_from_command_line(sys.argv) -if __name__ == "__main__": +if __name__ == '__main__': main() diff --git a/src/potential_user/apps.py b/src/potential_user/apps.py index 3114266..2c84873 100644 --- a/src/potential_user/apps.py +++ b/src/potential_user/apps.py @@ -4,6 +4,6 @@ class PotentialUserConfig(AppConfig): """Config of PotentialUserApp.""" - default_auto_field = "django.db.models.BigAutoField" - name = "potential_user" - verbose_name = "Заявки на регистрацию" + default_auto_field = 'django.db.models.BigAutoField' + name = 'potential_user' + verbose_name = 'Заявки на регистрацию' diff --git a/src/potential_user/models.py b/src/potential_user/models.py index 63ff607..3348b7d 100644 --- a/src/potential_user/models.py +++ b/src/potential_user/models.py @@ -6,11 +6,11 @@ class ApplicationForm(models.Model): """Модель регистрации пользователей. Роль устанавливает администратор.""" ROLE_CHOICES = ( - ("teacher", "Преподаватель"), - ("student", "Учащийся"), + ('teacher', 'Преподаватель'), + ('student', 'Учащийся'), ) - telegram_id = models.IntegerField("Telegram ID", unique=True) + telegram_id = models.IntegerField('Telegram ID', unique=True) role = models.CharField(choices=ROLE_CHOICES, max_length=20) name = models.CharField(max_length=20) surname = models.CharField(max_length=20) @@ -21,9 +21,9 @@ class ApplicationForm(models.Model): class Meta: """Meta class of ApplicationForm.""" - verbose_name = "Заявка" - verbose_name_plural = "Заявки" + verbose_name = 'Заявка' + verbose_name_plural = 'Заявки' def __str__(self): """Return a string representation.""" - return f"{self.name} {self.surname} {self.role}" + return f'{self.name} {self.surname} {self.role}' diff --git a/src/schooling/apps.py b/src/schooling/apps.py index af05dc3..06850b9 100644 --- a/src/schooling/apps.py +++ b/src/schooling/apps.py @@ -4,5 +4,5 @@ class SchoolingConfig(AppConfig): """Config of schooling app for interactions with learning entities.""" - default_auto_field = "django.db.models.BigAutoField" - name = "schooling" + default_auto_field = 'django.db.models.BigAutoField' + name = 'schooling'