"""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)