locations: недостающие модули области доступа + гейт reports

Делает HEAD целостным: коммит 5366799 уже импортировал эти файлы, но они
не были добавлены в git (свежий checkout падал с ImportError, а migrate не
создавал таблицу GroupLocationAccess).

- core/location_access.py: область данных (accessible_pharmacies/locations,
  scoped_queryset/employees, has_all_locations) — fail-closed
- apps/locations/models/access.py + миграция 0014: GroupLocationAccess,
  право locations.view_all_locations
- core/tests_location_access.py: 15 сценариев scoping
- apps/reports/*: снятие лишнего гейта has_all_locations с IT-отчёта отдела
  (руководитель не обязан иметь доступ ко всей сети) + тест
- apps/rro/tests: чужая аптека теперь 404 (единая область доступа), а не
  «200 с урезанными панелями» — под новую модель

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-09-21 22:59:47 +03:00
parent 536679925a
commit fa323d657c
9 changed files with 335 additions and 37 deletions
+5 -11
View File
@@ -183,18 +183,12 @@ class CashRegisterPortalTests(TestCase):
session = self.client.session
session['2fa_verified'] = True
session.save()
# Чужая аптека вне области доступа: карточка недоступна целиком (404),
# операционные данные (РРО и т.п.) не утекают.
resp = self.client.get(f'/pharmacies/{self.pharmacy.pk}/', HTTP_HX_REQUEST='true')
self.assertEqual(resp.status_code, 200)
self.assertNotContains(resp, 'FN-PORTAL-1')
self.assertNotContains(resp, 'ph-panel-rro')
self.assertFalse(resp.context['can_view_ops'])
self.assertEqual(resp.context['staff'], [])
self.assertEqual(resp.context['equipment'], [])
self.assertEqual(resp.context['internet_contracts'], [])
self.assertEqual(resp.context['utility_readings'], [])
self.assertNotContains(resp, 'ph-panel-equipment')
self.assertNotContains(resp, 'ph-panel-internet')
self.assertNotContains(resp, 'ph-panel-utilities')
self.assertEqual(resp.status_code, 404)
self.assertNotContains(resp, 'FN-PORTAL-1', status_code=404)
self.assertNotContains(resp, 'ph-panel-rro', status_code=404)
class ManagerRroScopeTests(TestCase):