39 lines
1.5 KiB
Python
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) |