37769-vm/core/views_new.py
2026-05-30 08:01:02 +00:00

39 lines
1.5 KiB
Python

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