From 381afdef0c3a8c0f76eab067f09c8a820581ab8d Mon Sep 17 00:00:00 2001 From: DarKylX Date: Mon, 28 Sep 2026 14:15:13 +0300 Subject: [PATCH 1/2] =?UTF-8?q?feat(admin):=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20?= =?UTF-8?q?=D0=B8=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/expert-admin/README.md | 103 +++++++++++++ docs/expert-admin/all-experts.png | Bin 0 -> 78856 bytes docs/expert-admin/browser-acceptance.cjs | 159 ++++++++++++++++++++ docs/expert-admin/browser-results.json | 63 ++++++++ docs/expert-admin/search-and-program.png | Bin 0 -> 76859 bytes users/admin.py | 7 +- users/tests/test_expert_admin.py | 183 +++++++++++++++++++++++ 7 files changed, 514 insertions(+), 1 deletion(-) create mode 100644 docs/expert-admin/README.md create mode 100644 docs/expert-admin/all-experts.png create mode 100644 docs/expert-admin/browser-acceptance.cjs create mode 100644 docs/expert-admin/browser-results.json create mode 100644 docs/expert-admin/search-and-program.png create mode 100644 users/tests/test_expert_admin.py diff --git a/docs/expert-admin/README.md b/docs/expert-admin/README.md new file mode 100644 index 00000000..b4e2b4e7 --- /dev/null +++ b/docs/expert-admin/README.md @@ -0,0 +1,103 @@ +# DEV: поиск и фильтр программ для Experts + +Exact base: `11f1e66a85e266d57fc6b0f8c080ee8cd0683f19` (`origin/dev` после fetch). +Ветка: `feature/dev-expert-admin-search`; exact head указан в Draft PR. + +## Изменение + +В `users/admin.py`, `ExpertAdmin`, добавлены три стандартные настройки: + +```python +search_fields = ("user__first_name", "user__last_name", "user__email") +list_filter = ("user__partner_program_profiles__partner_program",) +list_select_related = ("user",) +``` + +`list_display = ("id", "user")` сохранён. Кастомного frontend, шаблона или +`SimpleListFilter` нет. Black также перенёс строки существующего выражения +`CustomUserAdmin.formfield_for_manytomany`; его поведение не изменено. + +**Search:** стандартный Django Admin `icontains` по трём полям. Отдельные слова +соединяются через AND, поля для каждого слова — через OR. Поэтому полное имя +ищется по нескольким полям без собственной нормализации/логики. Это не точное +сравнение ФИО: запрос «Иван Иванов» также может найти «Пётр Иванов», поскольку оба +слова входят в фамилию. Такое стандартное поведение явно покрыто тестом. + +**Filter:** `RelatedFieldListFilter` по legacy пути +`Expert.user → CustomUser.partner_program_profiles → PartnerProgramUserProfile.partner_program`. +Choices формируются из существующих PartnerProgram через их `__str__`, включая +программы без экспертов. Справа стандартные `FILTER`, `By partner program`, `All`. +Без выбранного значения остаются все Experts, в том числе без программы. Search и +program filter работают одновременно; `All` снимает программу, сохраняя search. + +**Duplicates:** явный `.distinct()` не добавлен. В установленном из lockfile Django +4.2.11 `ChangeList.get_queryset()` распознаёт reverse FK как потенциальный источник +дублей и использует коррелированный SQL `EXISTS`. Эксперт в двух программах +отображается один раз без фильтра и один раз в каждой программе. Тесты сравнивают +список ID и количество строк, а не множества, чтобы не скрыть дубли. + +Несуществующий числовой program ID даёт пустой список; нечисловой ID проходит +стандартную обработку Admin — redirect на `?e=1` без HTTP 500. + +**Performance:** `list_select_related = ("user",)` загружает строки и пользователей +одним SQL-запросом. Проверено на queryset changelist с фильтром и без фильтра: +получение всех строк и чтение `str(expert.user)` укладывается в один запрос. +У самого changelist остаются стандартные запросы counts, choices, session/permissions; +утверждение об одном запросе относится к строкам таблицы вместе с пользователями. + +Модели, schema, migrations, staff/superuser permissions и бизнес-правила не менялись. +Angular, React, Application/Team/Submission/current_application не затронуты. + +## Проверки + +Локальная среда: Python 3.11.15, Django 4.2.11, PostgreSQL 18.1 (UTF-8, ICU ru-RU), +Black 22.12.0. Отдельный временный кластер PostgreSQL на loopback, отдельные базы +для тестов и browser QA, `procollab.settings_ci`. DEV/PROD данные не использовались. + +- `python manage.py test users.tests.test_expert_admin --noinput --verbosity 2`: + **18 tests OK**, exit 0. +- `python manage.py test --noinput --verbosity 1 --keepdb` (режим существующего CI): + **919 tests OK**, 458.293 s, exit 0; test failures/errors 0. +- `python manage.py check`: **0 issues**, exit 0. +- `python manage.py makemigrations --check --dry-run`: **No changes detected**, exit 0. +- Black / Flake8 для `users/admin.py` и `users/tests/test_expert_admin.py`: exit 0. +- `git diff --check`: exit 0. + +Первый полный запуск без `--keepdb`: **919 tests OK**, 502.401 s, но **exit 1** +на teardown — оставшиеся 21 соединение помешали `DROP DATABASE`. Ошибок тестовых +сценариев не было. Повторный запуск использует существующий режим CI `--keepdb` +с отдельной очисткой изолированной локальной БД; test harness не изменён. + +18 тестов покрывают search по имени/фамилии/email/словам полного имени, регистр, +пустую выдачу, All, программы, отсутствие регистрации, двойную регистрацию, +search+filter, отсутствующий/невалидный ID, запросы user column, запрет доступа +для non-staff и staff без Expert permissions. + +## Browser QA + +Настоящий `/admin/users/expert/` с обычным входом superuser на изолированной +локальной PostgreSQL-базе. API/HTML не подменялись. Chrome 154.0.8037.57, 1440 px: +**17 assertions, 11 состояний выдачи, 0 JS errors / HTTP 500**, exit 0. +Проверены поиск по имени, фамилии, email, полному имени, отсутствие результата, +filter, search+filter, All, двойная регистрация и невалидный/несуществующий ID. + +- [Все эксперты: search и sidebar filter](all-experts.png). +- [Иванов + FinFor25-26](search-and-program.png). +- [Численные результаты](browser-results.json). +- [Browser script](browser-acceptance.cjs). + +Для воспроизведения нужен отдельный PostgreSQL, зависимости из lockfile и +`procollab.settings_ci`. После `manage.py migrate` на пустой QA-базе вызовите +`ExpertAdminTests.setUpTestData()` из `users.tests.test_expert_admin`, сохранив +PK программы и экспертов в `.cache/expert-admin-qa/fixtures.json` с ключами +`program`, `otherProgram`, `ivan`, `anna`, `otherIvanov`, `noProgram`. +Стандартный Django staticfiles runserver можно вызвать через +`call_command(Command(), "127.0.0.1:8340", use_reloader=False, insecure_serving=True)`; +`Command` импортируется из `django.contrib.staticfiles.management.commands.runserver`. +Это обходит только локальное ограничение Daphne runserver на `--insecure`; +настройки приложения, cookies, auth и permissions не менялись. +Запустите `node docs/expert-admin/browser-acceptance.cjs` из корня репозитория; +`PLAYWRIGHT_MODULE` и `CHROME_PATH` могут указывать на внешние Playwright/Chrome. +Login script использует только известную тестовую учётную запись из fixtures. + +Merge и deploy не выполнялись. diff --git a/docs/expert-admin/all-experts.png b/docs/expert-admin/all-experts.png new file mode 100644 index 0000000000000000000000000000000000000000..562ff3caccd2d649489753f232ab376bbf9f5604 GIT binary patch literal 78856 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 { + const browser = await chromium.launch({ + headless: true, + executablePath: process.env.CHROME_PATH, + }); + const page = await browser.newPage({ + viewport: { width: 1440, height: 1000 }, + }); + const errors = []; + page.on("pageerror", (error) => errors.push(error.message)); + page.on("response", (response) => { + if (response.status() >= 500) + errors.push(`${response.status()} ${response.url()}`); + }); + await page.goto(baseUrl); + await page.locator("#id_username").fill("admin@example.com"); + await page.locator("#id_password").fill("very_strong_password"); + await Promise.all([ + page.waitForNavigation(), + page.locator('input[type="submit"]').click(), + ]); + await page.locator("#searchbar").waitFor(); + check( + await page.locator("#searchbar").isVisible(), + true, + "standard search visible", + ); + check( + (await page.locator("#changelist-filter").innerText()).includes( + "By partner program", + ), + true, + "standard filter title", + ); + check( + await page.locator("#changelist-filter a").count(), + 4, + "All and three programs", + ); + + async function rows(scenario, expected) { + const ids = await page + .locator("#result_list input.action-select") + .evaluateAll((nodes) => + nodes.map((node) => Number(node.value)).sort((a, b) => a - b), + ); + check( + ids, + [...expected].sort((a, b) => a - b), + scenario, + ); + findings.push({ scenario, expertIds: ids, url: page.url() }); + } + async function search(query) { + await page.locator("#searchbar").fill(query); + await Promise.all([ + page.waitForNavigation(), + page.locator('#changelist-search input[type="submit"]').click(), + ]); + } + await rows("all", [ + fixture.ivan, + fixture.anna, + fixture.otherIvanov, + fixture.noProgram, + ]); + await page.screenshot({ path: `${output}/all-experts.png`, fullPage: true }); + for (const [query, expected] of [ + ["Анна", [fixture.anna]], + ["Иванов", [fixture.ivan, fixture.otherIvanov]], + ["иван@example.com", [fixture.ivan]], + ["Иван Иванов", [fixture.ivan, fixture.otherIvanov]], + ["Несуществующий", []], + ]) { + await search(query); + await rows(`search: ${query}`, expected); + } + await page.goto(baseUrl); + await Promise.all([ + page.waitForNavigation(), + page + .locator("#changelist-filter a") + .filter({ hasText: `PartnerProgram<${fixture.program}> - FinFor25-26` }) + .click(), + ]); + await rows("program", [fixture.ivan, fixture.anna]); + await search("Иванов"); + await rows("search + program", [fixture.ivan]); + check( + new URL(page.url()).searchParams.get(parameter), + String(fixture.program), + "search preserves filter", + ); + await page.screenshot({ + path: `${output}/search-and-program.png`, + fullPage: true, + }); + await Promise.all([ + page.waitForNavigation(), + page + .locator("#changelist-filter a") + .getByText("All", { exact: true }) + .click(), + ]); + await rows("All preserves search", [fixture.ivan, fixture.otherIvanov]); + await page.goto(`${baseUrl}?${parameter}=${fixture.otherProgram}`); + await rows("other program; dual registration appears once", [ + fixture.ivan, + fixture.otherIvanov, + ]); + await page.goto(`${baseUrl}?${parameter}=999999999`); + await rows("nonexistent program", []); + await page.goto(`${baseUrl}?${parameter}=not-a-number`); + check( + new URL(page.url()).searchParams.get("e"), + "1", + "invalid filter redirects to admin error marker", + ); + check(errors, [], "no runtime errors or HTTP 500"); + fs.writeFileSync( + `${output}/browser-results.json`, + JSON.stringify( + { + base: "11f1e66a85e266d57fc6b0f8c080ee8cd0683f19", + browser: await browser.version(), + assertions, + errors, + findings, + }, + null, + 2, + ) + "\n", + ); + console.log( + `PASS ${assertions} assertions, ${findings.length} result states, errors ${errors.length}`, + ); + await browser.close(); +})().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/docs/expert-admin/browser-results.json b/docs/expert-admin/browser-results.json new file mode 100644 index 00000000..2b5d0a19 --- /dev/null +++ b/docs/expert-admin/browser-results.json @@ -0,0 +1,63 @@ +{ + "base": "11f1e66a85e266d57fc6b0f8c080ee8cd0683f19", + "browser": "154.0.8037.57", + "assertions": 17, + "errors": [], + "findings": [ + { + "scenario": "all", + "expertIds": [1, 2, 3, 4], + "url": "http://127.0.0.1:8340/admin/users/expert/" + }, + { + "scenario": "search: Анна", + "expertIds": [2], + "url": "http://127.0.0.1:8340/admin/users/expert/?q=%D0%90%D0%BD%D0%BD%D0%B0" + }, + { + "scenario": "search: Иванов", + "expertIds": [1, 3], + "url": "http://127.0.0.1:8340/admin/users/expert/?q=%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2" + }, + { + "scenario": "search: иван@example.com", + "expertIds": [1], + "url": "http://127.0.0.1:8340/admin/users/expert/?q=%D0%B8%D0%B2%D0%B0%D0%BD%40example.com" + }, + { + "scenario": "search: Иван Иванов", + "expertIds": [1, 3], + "url": "http://127.0.0.1:8340/admin/users/expert/?q=%D0%98%D0%B2%D0%B0%D0%BD+%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2" + }, + { + "scenario": "search: Несуществующий", + "expertIds": [], + "url": "http://127.0.0.1:8340/admin/users/expert/?q=%D0%9D%D0%B5%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D1%8E%D1%89%D0%B8%D0%B9" + }, + { + "scenario": "program", + "expertIds": [1, 2], + "url": "http://127.0.0.1:8340/admin/users/expert/?user__partner_program_profiles__partner_program__id__exact=1" + }, + { + "scenario": "search + program", + "expertIds": [1], + "url": "http://127.0.0.1:8340/admin/users/expert/?q=%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2&user__partner_program_profiles__partner_program__id__exact=1" + }, + { + "scenario": "All preserves search", + "expertIds": [1, 3], + "url": "http://127.0.0.1:8340/admin/users/expert/?q=%D0%98%D0%B2%D0%B0%D0%BD%D0%BE%D0%B2" + }, + { + "scenario": "other program; dual registration appears once", + "expertIds": [1, 3], + "url": "http://127.0.0.1:8340/admin/users/expert/?user__partner_program_profiles__partner_program__id__exact=2" + }, + { + "scenario": "nonexistent program", + "expertIds": [], + "url": "http://127.0.0.1:8340/admin/users/expert/?user__partner_program_profiles__partner_program__id__exact=999999999" + } + ] +} diff --git a/docs/expert-admin/search-and-program.png b/docs/expert-admin/search-and-program.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7beb7160ba425e0fe8750f98c110fcbcc7a19d GIT binary patch literal 76859 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


xsv&CXTF6%?_j74&FbaU0+?9p51LX;7c^@fb{ol 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 literal 0 HcmV?d00001 diff --git a/users/admin.py b/users/admin.py index ff993c4f..a7b3936a 100644 --- a/users/admin.py +++ b/users/admin.py @@ -193,7 +193,9 @@ class CustomUserAdmin(admin.ModelAdmin): def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "user_permissions": - kwargs["queryset"] = Permission.objects.select_related("content_type").order_by( + kwargs["queryset"] = Permission.objects.select_related( + "content_type" + ).order_by( "content_type__app_label", "content_type__model", "codename", @@ -429,6 +431,9 @@ class UserLinkAdmin(admin.ModelAdmin): @admin.register(Expert) class ExpertAdmin(admin.ModelAdmin): list_display = ("id", "user") + search_fields = ("user__first_name", "user__last_name", "user__email") + list_filter = ("user__partner_program_profiles__partner_program",) + list_select_related = ("user",) @admin.register(UserEducation) diff --git a/users/tests/test_expert_admin.py b/users/tests/test_expert_admin.py new file mode 100644 index 00000000..eeade0b6 --- /dev/null +++ b/users/tests/test_expert_admin.py @@ -0,0 +1,183 @@ +from django.contrib.admin.filters import RelatedFieldListFilter +from django.test import TestCase +from django.urls import reverse +from django.utils import translation + +from users.models import CustomUser + +from .helpers import ( + add_user_to_program, + build_partner_program, + build_superuser, + build_user, +) + + +class ExpertAdminTests(TestCase): + program_parameter = "user__partner_program_profiles__partner_program__id__exact" + + @classmethod + def setUpTestData(cls): + cls.admin_user = build_superuser() + cls.program = build_partner_program(name="FinFor25-26", tag="finfor") + cls.other_program = build_partner_program(name="Другая программа", tag="other") + cls.empty_program = build_partner_program(name="Без экспертов", tag="empty") + cls.ivan = build_user( + email="иван@example.com", + first_name="Иван", + last_name="Иванов", + user_type=CustomUser.EXPERT, + ) + cls.anna = build_user( + email="anna@example.com", + first_name="Анна", + last_name="Смирнова", + user_type=CustomUser.EXPERT, + ) + cls.other_ivanov = build_user( + email="petr@example.com", + first_name="Пётр", + last_name="Иванов", + user_type=CustomUser.EXPERT, + ) + cls.no_program = build_user( + email="no-program@example.com", + first_name="Ольга", + last_name="Петрова", + user_type=CustomUser.EXPERT, + ) + cls.member = build_user(email="member@example.com") + add_user_to_program(cls.ivan, cls.program) + add_user_to_program(cls.ivan, cls.other_program) + add_user_to_program(cls.anna, cls.program) + add_user_to_program(cls.other_ivanov, cls.other_program) + add_user_to_program(cls.member, cls.program) + + def setUp(self): + self.client.force_login(self.admin_user) + self.url = reverse("admin:users_expert_changelist") + + def changelist(self, params=None): + response = self.client.get(self.url, params or {}) + self.assertEqual(response.status_code, 200) + return response + + def assert_experts(self, response, users): + # Keep a list: set equality would hide duplicate rows from a reverse JOIN. + result = list(response.context["cl"].result_list) + self.assertCountEqual( + [expert.user_id for expert in result], [user.pk for user in users] + ) + self.assertEqual(response.context["cl"].result_count, len(users)) + + def test_changelist_has_standard_search_and_program_choices(self): + with translation.override("en"): + response = self.changelist() + self.assertContains(response, 'id="searchbar"') + self.assertContains(response, 'id="changelist-filter"') + self.assertContains(response, "By partner program") + changelist = response.context["cl"] + program_filter = changelist.filter_specs[0] + self.assertIsInstance(program_filter, RelatedFieldListFilter) + choices = list(program_filter.choices(changelist)) + self.assertEqual(choices[0]["display"], "All") + self.assertTrue(choices[0]["selected"]) + self.assertCountEqual( + [choice["display"] for choice in choices[1:]], + [str(self.program), str(self.other_program), str(self.empty_program)], + ) + + def test_search_first_name(self): + self.assert_experts(self.changelist({"q": "Анна"}), [self.anna]) + + def test_search_last_name(self): + self.assert_experts( + self.changelist({"q": "Иванов"}), [self.ivan, self.other_ivanov] + ) + + def test_search_email(self): + self.assert_experts(self.changelist({"q": "иван@example.com"}), [self.ivan]) + + def test_search_full_name_matches_terms_across_fields(self): + # Standard admin search ANDs words across all fields, not exact full names. + self.assert_experts( + self.changelist({"q": "Иван Иванов"}), [self.ivan, self.other_ivanov] + ) + self.assert_experts(self.changelist({"q": "Анна Смирнова"}), [self.anna]) + self.assert_experts(self.changelist({"q": "Анна Иванов"}), []) + + def test_search_is_case_insensitive(self): + self.assert_experts(self.changelist({"q": "АННА СМИРНОВА"}), [self.anna]) + + def test_unknown_search_is_empty(self): + self.assert_experts(self.changelist({"q": "Несуществующий"}), []) + + def test_without_filter_all_experts_appear_once_including_without_program(self): + self.assert_experts( + self.changelist(), [self.ivan, self.anna, self.other_ivanov, self.no_program] + ) + + def test_program_filter_excludes_other_program_and_unregistered_experts(self): + self.assert_experts( + self.changelist({self.program_parameter: self.program.pk}), + [self.ivan, self.anna], + ) + + def test_expert_registered_in_two_programs_appears_once_in_each(self): + for program, expected in ( + (self.program, [self.ivan, self.anna]), + (self.other_program, [self.ivan, self.other_ivanov]), + ): + with self.subTest(program=program.pk): + self.assert_experts( + self.changelist({self.program_parameter: program.pk}), expected + ) + + def test_program_without_experts_returns_empty_results(self): + self.assert_experts( + self.changelist({self.program_parameter: self.empty_program.pk}), [] + ) + + def test_search_and_program_filter_are_combined(self): + self.assert_experts( + self.changelist({self.program_parameter: self.program.pk, "q": "Иванов"}), + [self.ivan], + ) + + def test_all_clears_only_program_filter_and_keeps_search(self): + response = self.changelist( + {self.program_parameter: self.program.pk, "q": "Иванов"} + ) + changelist = response.context["cl"] + all_choice = next(iter(changelist.filter_specs[0].choices(changelist))) + response = self.client.get(self.url + all_choice["query_string"]) + self.assertEqual(response.status_code, 200) + self.assert_experts(response, [self.ivan, self.other_ivanov]) + + def test_nonexistent_program_is_empty(self): + self.assert_experts(self.changelist({self.program_parameter: 999999999}), []) + + def test_invalid_program_uses_standard_admin_redirect_without_server_error(self): + response = self.client.get(self.url, {self.program_parameter: "not-a-number"}) + self.assertRedirects(response, self.url + "?e=1") + + def test_user_column_does_not_query_once_per_expert(self): + for params in ({}, {self.program_parameter: self.program.pk}): + with self.subTest(params=params): + changelist = self.changelist(params).context["cl"] + # Clone to discard the render cache; rows and their users need one query. + with self.assertNumQueries(1): + rows = list(changelist.result_list.all()) + labels = [str(expert.user) for expert in rows] + self.assertTrue(labels) + + def test_non_staff_cannot_access_changelist(self): + self.client.force_login(self.ivan) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 302) + self.assertIn(reverse("admin:login"), response.url) + + def test_staff_without_expert_permission_cannot_access_changelist(self): + staff = build_user(email="staff@example.com", is_staff=True) + self.client.force_login(staff) + self.assertEqual(self.client.get(self.url).status_code, 403) From f7285d20cf8e8deafa266efd04859ca12b75bc17 Mon Sep 17 00:00:00 2001 From: DarKylX Date: Mon, 28 Sep 2026 15:07:13 +0300 Subject: [PATCH 2/2] =?UTF-8?q?test(admin):=20=D1=80=D0=B0=D0=B7=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D1=82=D1=8C=20ASCII=20=D0=B8=20PostgreSQL=20?= =?UTF-8?q?Unicode=20search?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/expert-admin/README.md | 31 ++++++++++++++++++++++++++++++- users/tests/test_expert_admin.py | 12 +++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/docs/expert-admin/README.md b/docs/expert-admin/README.md index b4e2b4e7..5fdebbb0 100644 --- a/docs/expert-admin/README.md +++ b/docs/expert-admin/README.md @@ -23,6 +23,17 @@ list_select_related = ("user",) сравнение ФИО: запрос «Иван Иванов» также может найти «Пётр Иванов», поскольку оба слова входят в фамилию. Такое стандартное поведение явно покрыто тестом. +Регистронезависимость зависит от базы данных, а не от дополнительной логики Admin: + +- **PostgreSQL:** поиск кириллицы без учёта регистра проверяется отдельным тестом + `test_search_cyrillic_is_case_insensitive_on_postgresql` в Backend PostgreSQL CI. +- **SQLite CI:** portable-проверка использует ASCII email — `anna@example.com` / + `ANNA@EXAMPLE.COM`. SQLite LIKE не обеспечивает полноценную регистронезависимость + Unicode/кириллицы; кириллический тест явно пропускается при + `connection.vendor != "postgresql"`. + +Production `ExpertAdmin`, `search_fields` и workflows этой доработкой не меняются. + **Filter:** `RelatedFieldListFilter` по legacy пути `Expert.user → CustomUser.partner_program_profiles → PartnerProgramUserProfile.partner_program`. Choices формируются из существующих PartnerProgram через их `__str__`, включая @@ -48,7 +59,7 @@ program filter работают одновременно; `All` снимает Модели, schema, migrations, staff/superuser permissions и бизнес-правила не менялись. Angular, React, Application/Team/Submission/current_application не затронуты. -## Проверки +## Первоначальные проверки (head `381afde`) Локальная среда: Python 3.11.15, Django 4.2.11, PostgreSQL 18.1 (UTF-8, ICU ru-RU), Black 22.12.0. Отдельный временный кластер PostgreSQL на loopback, отдельные базы @@ -73,6 +84,24 @@ Black 22.12.0. Отдельный временный кластер PostgreSQL search+filter, отсутствующий/невалидный ID, запросы user column, запрет доступа для non-staff и staff без Expert permissions. +## Проверки после разделения SQLite / PostgreSQL + +В наборе 19 admin-тестов: + +| БД | Targeted `users.tests.test_expert_admin` | Case-insensitive | +| --- | --- | --- | +| PostgreSQL | 19 выполнены, 0 skipped, exit 0 | ASCII email и кириллица | +| SQLite | 18 выполнены, 1 skipped, exit 0 | ASCII email; кириллица явно skipped | + +Обычный SQLite suite запускается с `DJANGO_SETTINGS_MODULE=procollab.settings`, +`DEBUG=True`: `python manage.py test --noinput --verbosity 2`, как в обычном CI. +Полный PostgreSQL suite: `DJANGO_SETTINGS_MODULE=procollab.settings_ci`, +`python manage.py test --noinput --verbosity 1 --keepdb`, как в Backend PostgreSQL CI. +Проверки используют разные локальные рабочие копии/БД, без изменения workflows +или настроек приложения. Django check, Black, Flake8 и diff-check проходят. +Итоги полных прогонов и обоих GitHub CI на актуальном exact head зафиксированы +в [PR #758](https://github.com/PROCOLLAB-github/api/pull/758). + ## Browser QA Настоящий `/admin/users/expert/` с обычным входом superuser на изолированной diff --git a/users/tests/test_expert_admin.py b/users/tests/test_expert_admin.py index eeade0b6..4fc0656e 100644 --- a/users/tests/test_expert_admin.py +++ b/users/tests/test_expert_admin.py @@ -1,4 +1,5 @@ from django.contrib.admin.filters import RelatedFieldListFilter +from django.db import connection from django.test import TestCase from django.urls import reverse from django.utils import translation @@ -106,7 +107,16 @@ def test_search_full_name_matches_terms_across_fields(self): self.assert_experts(self.changelist({"q": "Анна Смирнова"}), [self.anna]) self.assert_experts(self.changelist({"q": "Анна Иванов"}), []) - def test_search_is_case_insensitive(self): + def test_search_ascii_email_is_case_insensitive(self): + self.assert_experts(self.changelist({"q": "ANNA@EXAMPLE.COM"}), [self.anna]) + + def test_search_cyrillic_is_case_insensitive_on_postgresql(self): + # SQLite LIKE не обеспечивает полноценную регистронезависимость Unicode/кириллицы. + # Поведение production PostgreSQL проверяется в Backend PostgreSQL CI. + if connection.vendor != "postgresql": + self.skipTest( + "Регистронезависимость кириллицы проверяется только на PostgreSQL" + ) self.assert_experts(self.changelist({"q": "АННА СМИРНОВА"}), [self.anna]) def test_unknown_search_is_empty(self):