@role_required(['admin', 'campaign_manager', 'campaign_staff', 'system_admin', 'campaign_admin'], permission='core.view_voter') def voter_advanced_search(request): """ Advanced search for voters with multiple filters. """ selected_tenant_id = request.session.get("tenant_id") if not selected_tenant_id: messages.warning(request, "Please select a campaign first.") return redirect("index") tenant = get_object_or_404(Tenant, id=selected_tenant_id) voters, form = get_filtered_voter_queryset(request, tenant) paginator = Paginator(voters, 50) page_number = request.GET.get('page') voters_page = paginator.get_page(page_number) context = { 'form': form, 'voters': voters_page, 'selected_tenant': tenant, 'call_form': ScheduledCallForm(tenant=tenant), 'can_edit_voter': can_edit_voter(request.user, tenant), } # Pre-calculate markers for the map to avoid overhead in templates map_data = [] # For performance, only map voters on the current page for voter in voters_page: if voter.latitude and voter.longitude: map_data.append({ 'lat': float(voter.latitude), 'lng': float(voter.longitude), 'voters': f"{voter.first_name} {voter.last_name}", 'address': voter.address }) context['map_data_json'] = json.dumps(map_data) return render(request, 'core/voter_advanced_search.html', context)