Files
ACORE/apps/locations/views.py
T
lokses 897ffc99c9 locations: право редактирования аптеки, формы и дислокация
Отдельное право на редактирование карточки аптеки, формы, пресеты колонок
дислокации и правки видимости карточки.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 18:03:32 +03:00

132 lines
4.7 KiB
Python

"""Views портала для локаций / аптек."""
from __future__ import annotations
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseForbidden
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST
from core.utils.htmx import render_page
from .forms import PortalPharmacyEditForm
from .models import Pharmacy, pharmacy_card_flags, user_can_edit_pharmacy
def _pharmacy_detail_context(request, pharmacy, *, form=None, edit_mode=False,
form_message=None, form_error=None):
"""Контекст карточки аптеки (общий для GET/POST)."""
from apps.employees.models import Employee
from apps.it_manager.models import Equipment, InternetContract
from apps.rro.models import CashRegister
from apps.utilities.models import UtilityReading
flags = pharmacy_card_flags(request.user, pharmacy)
staff = []
if flags['can_view_staff']:
staff = list(
Employee.objects.filter(user_pharmacy=pharmacy, is_active=True)
.select_related('post').order_by('last_name', 'first_name')
)
equipment = []
if flags['can_view_equipment']:
equipment = list(
Equipment.objects.filter(location=pharmacy)
.select_related(
'equipment_model__equipment_type', 'equipment_model__brand',
'status', 'assigned_to',
)
.order_by('equipment_model__equipment_type__name', 'equipment_model__name')
)
internet_contracts = []
if flags['can_view_internet']:
internet_contracts = list(
InternetContract.objects.filter(location=pharmacy)
.select_related('provider', 'service_type', 'connection_type', 'status')
.order_by('-start_date')
)
cash_registers = []
if flags['can_view_rro']:
cash_registers = list(
CashRegister.objects.filter(pharmacy=pharmacy)
.select_related('vendor', 'status')
.order_by('-is_primary', 'kind', 'fiscal_number')
)
utility_readings = []
if flags['can_view_utilities']:
from apps.utilities.helpers import attach_reading_display
utility_readings = list(
UtilityReading.objects.filter(pharmacy=pharmacy)
.select_related('utility_type', 'submitted_by')
.order_by('-reading_date')[:50]
)
attach_reading_display(utility_readings)
can_edit = flags['can_edit']
if edit_mode and can_edit and form is None:
form = PortalPharmacyEditForm(instance=pharmacy)
return {
'pharmacy': pharmacy,
'staff': staff,
'staff_count': len(staff),
'phones': list(pharmacy.phones.filter(is_active=True)),
'equipment': equipment,
'internet_contracts': internet_contracts,
'cash_registers': cash_registers,
'utility_readings': utility_readings,
**flags,
'can_view_ops': any(flags[f'can_view_{s}'] for s in (
'staff', 'equipment', 'internet', 'rro', 'utilities', 'documents',
)),
'pharmacy_edit_mode': bool(edit_mode and can_edit),
'pharmacy_edit_form': form if (edit_mode and can_edit) else None,
'pharmacy_form_message': form_message,
'pharmacy_form_error': form_error,
}
@login_required
@require_POST
def pharmacy_update_view(request, pk):
pharmacy = get_object_or_404(
Pharmacy.objects.select_related(
'organization', 'location_region', 'head_pharmacist__post',
'responsible_manager', 'curator',
).prefetch_related('phones'),
pk=pk,
)
if not user_can_edit_pharmacy(request.user, pharmacy):
return HttpResponseForbidden()
form = PortalPharmacyEditForm(request.POST, instance=pharmacy)
if form.is_valid():
pharmacy = form.save(commit=False)
pharmacy._history_user = request.user
pharmacy.location_type = 'pharmacy'
pharmacy.save()
form.save_m2m()
pharmacy.refresh_from_db()
context = _pharmacy_detail_context(
request, pharmacy,
form_message='Изменения сохранены.',
)
return render_page(request, 'pharmacy-detail.html', context)
errors = []
for field, msgs in form.errors.items():
label = form.fields[field].label if field in form.fields else field
for msg in msgs:
errors.append(f'{label}: {msg}' if field != '__all__' else msg)
context = _pharmacy_detail_context(
request, pharmacy,
form=form, edit_mode=True,
form_error=' '.join(errors) or 'Не удалось сохранить.',
)
return render_page(request, 'pharmacy-detail.html', context)