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)