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

175 lines
6.4 KiB
Python

with open('core/views.py', 'r') as f:
lines = f.readlines()
new_lines = []
skip = False
for i, line in enumerate(lines):
if 'def voter_advanced_search(request):' in line:
new_lines.append(line)
# Reconstruct the whole function
new_lines.append(' """
')
new_lines.append(' Advanced search for voters with multiple filters.
')
new_lines.append(' """
')
new_lines.append(' selected_tenant_id = request.session.get("tenant_id")
')
new_lines.append(' if not selected_tenant_id:
')
new_lines.append(' messages.warning(request, "Please select a campaign first.")
')
new_lines.append(' return redirect("index")
')
new_lines.append(' tenant = get_object_or_404(Tenant, id=selected_tenant_id)
')
new_lines.append(' voters = Voter.objects.filter(tenant=tenant, is_inactive=False).order_by("last_name", "first_name")
')
new_lines.append(' form = AdvancedVoterSearchForm(request.GET)
')
new_lines.append(' if form.is_valid():
')
new_lines.append(' data = form.cleaned_data
')
new_lines.append(' if data.get("first_name"):
')
new_lines.append(' voters = voters.filter(first_name__icontains=data["first_name"])
')
new_lines.append(' if data.get("last_name"):
')
new_lines.append(' voters = voters.filter(last_name__icontains=data["last_name"])
')
new_lines.append(' if data.get("address"):
')
new_lines.append(' voters = voters.filter(Q(address__icontains=data["address"]) | Q(address_street__icontains=data["address"]))
')
new_lines.append(' if data.get("voter_id"):
')
new_lines.append(' voters = voters.filter(voter_id__iexact=data["voter_id"])
')
new_lines.append(' if data.get("birth_month"):
')
new_lines.append(' voters = voters.filter(birthdate__month=data["birth_month"])
')
new_lines.append(' if data.get("city"):
')
new_lines.append(' voters = voters.filter(city__icontains=data["city"])
')
new_lines.append(' if data.get("zip_code"):
')
new_lines.append(' voters = voters.filter(zip_code__icontains=data["zip_code"])
')
new_lines.append(' if data.get("neighborhood"):
')
new_lines.append(' voters = voters.filter(neighborhood__icontains=data["neighborhood"])
')
new_lines.append(' if data.get("district"):
')
new_lines.append(' voters = voters.filter(district=data["district"])
')
new_lines.append(' if data.get("precinct"):
')
new_lines.append(' voters = voters.filter(precinct=data["precinct"])
')
new_lines.append(' if data.get("email"):
')
new_lines.append(' voters = voters.filter(email__icontains=data["email"])
')
new_lines.append(' if data.get("phone"):
')
new_lines.append(' voters = voters.filter(get_phone_search_filters(data["phone"]))
')
new_lines.append(' if data.get("phone_type"):
')
new_lines.append(' voters = voters.filter(phone_type=data["phone_type"])
')
new_lines.append(' if data.get("is_targeted"):
')
new_lines.append(' voters = voters.filter(is_targeted=(data["is_targeted"] == "True"))
')
new_lines.append(' if data.get("target_door_visit"):
')
new_lines.append(' voters = voters.filter(target_door_visit=(data["target_door_visit"] == "True"))
')
new_lines.append(' if data.get("door_visit"):
')
new_lines.append(' voters = voters.filter(door_visit=(data["door_visit"] == "True"))
')
new_lines.append(' if data.get("voted"):
')
new_lines.append(' voters = voters.filter(voted=(data["voted"] == "True"))
')
new_lines.append(' if data.get("candidate_support"):
')
new_lines.append(' voters = voters.filter(candidate_support=data["candidate_support"])
')
new_lines.append(' if data.get("yard_sign"):
')
new_lines.append(' voters = voters.filter(yard_sign=data["yard_sign"])
')
new_lines.append(' if data.get("window_sticker"):
')
new_lines.append(' voters = voters.filter(window_sticker=data["window_sticker"])
')
new_lines.append(' if data.get("call_queue_status"):
')
new_lines.append(' voters = voters.filter(call_queue_status=data["call_queue_status"])
')
new_lines.append(' # Add donation amount filters
')
new_lines.append(' min_total_donation = data.get("min_total_donation")
')
new_lines.append(' max_total_donation = data.get("max_total_donation")
')
new_lines.append(' if min_total_donation is not None or max_total_donation is not None:
')
new_lines.append(' voters = voters.annotate(total_donation_amount=Coalesce(Sum("donations__amount"), Value(0), output_field=DecimalField()))
')
new_lines.append(' if min_total_donation is not None:
')
new_lines.append(' voters = voters.filter(total_donation_amount__gte=min_total_donation)
')
new_lines.append(' if max_total_donation is not None:
')
new_lines.append(' voters = voters.filter(total_donation_amount__lte=max_total_donation)
')
new_lines.append(' paginator = Paginator(voters, 50)
')
new_lines.append(' page_number = request.GET.get("page")
')
new_lines.append(' voters_page = paginator.get_page(page_number)
')
new_lines.append(' context = {
')
new_lines.append(' "form": form,
')
new_lines.append(' "voters": voters_page,
')
new_lines.append(' "selected_tenant": tenant,
')
new_lines.append(' "call_form": ScheduledCallForm(tenant=tenant),
')
new_lines.append(' }
')
new_lines.append(' return render(request, "core/voter_advanced_search.html", context)
')
new_lines.append(' skip = True
')
elif skip:
if line.startswith('@role_required') or line.startswith('def export_voters_csv'):
skip = False
new_lines.append('\n')
new_lines.append(line)
else:
new_lines.append(line)
with open('core/views.py', 'w') as f:
f.writelines(new_lines)