Skip to content

Commit

Permalink
Merge pull request #603 from fecgov/feature/1034
Browse files Browse the repository at this point in the history
Feature/1034 propogate when only contact is edited
  • Loading branch information
mjtravers authored Nov 20, 2023
2 parents af146a4 + 796a6f3 commit c8c3fd4
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 15 deletions.
26 changes: 26 additions & 0 deletions django-backend/fecfiler/contacts/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,3 +274,29 @@ def test_restore(self):
response = DeletedContactsViewSet.as_view({"post": "restore"})(request)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, ["a5061946-0000-0000-82f6-f1782c333d70"])

def test_update(self):
contact = Contact.objects.create(
type=Contact.ContactType.INDIVIDUAL,
last_name="Last",
first_name="First",
committee_account_id="735db943-9446-462a-9be0-c820baadb622",
)
request = self.factory.put(
f"/api/v1/contacts/{str(contact.id)}/",
{
"first_name": "Other",
"last_name": "other",
"street_1": "1",
"city": "here",
"zip": "1",
"state": "MD",
"country": "USA",
"type": "IND",
},
"application/json",
)
force_authenticate(request, self.user)
response = ContactViewSet.as_view({"put": "update"})(request, pk=contact.id)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data["first_name"], "Other")
15 changes: 12 additions & 3 deletions django-backend/fecfiler/contacts/views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import logging
import re
from urllib.parse import urlencode

from django.db import transaction
import requests
from django.db.models import CharField, Q, Value, Count
from django.db.models.functions import Concat, Lower, Coalesce
from django.http import HttpResponseBadRequest, JsonResponse
from fecfiler.committee_accounts.views import CommitteeOwnedViewSet
from fecfiler.transactions.views import propagate_contact
from fecfiler.settings import (
FEC_API_CANDIDATE_LOOKUP_ENDPOINT,
FEC_API_COMMITTEE_LOOKUP_ENDPOINT,
Expand Down Expand Up @@ -219,6 +220,11 @@ def get_contact_id(self, request):
)
return Response(match.id if match else "")

def update(self, request, *args, **kwargs):
with transaction.atomic():
propagate_contact(None, self.get_object())
return super().update(request, *args, **kwargs)

def get_int_param_value(
self, request, param_name: str, default_param_value: int, max_param_value: int
):
Expand Down Expand Up @@ -246,7 +252,9 @@ def get_max_results(self, request):


class DeletedContactsViewSet(
CommitteeOwnedViewSet, mixins.ListModelMixin, GenericViewSet,
CommitteeOwnedViewSet,
mixins.ListModelMixin,
GenericViewSet,
):
serializer_class = ContactSerializer

Expand Down Expand Up @@ -277,7 +285,8 @@ def restore(self, request):
contacts = self.queryset.filter(id__in=ids_to_restore)
if len(ids_to_restore) != contacts.count():
return Response(
"Contact Ids are invalid", status=status.HTTP_400_BAD_REQUEST,
"Contact Ids are invalid",
status=status.HTTP_400_BAD_REQUEST,
)
for contact in contacts:
contact.deleted = None
Expand Down
25 changes: 13 additions & 12 deletions django-backend/fecfiler/transactions/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,22 +214,13 @@ def get_previous(

def propagate_contacts(self, transaction):
contact_1 = Contact.objects.get(id=transaction.contact_1_id)
self.propagate_contact(transaction, contact_1)
propagate_contact(transaction, contact_1)
contact_2 = Contact.objects.filter(id=transaction.contact_2_id).first()
if contact_2:
self.propagate_contact(transaction, contact_2)
propagate_contact(transaction, contact_2)
contact_3 = Contact.objects.filter(id=transaction.contact_3_id).first()
if contact_3:
self.propagate_contact(transaction, contact_3)

def propagate_contact(self, transaction, contact):
subsequent_transactions = Transaction.objects.filter(
~Q(id=transaction.id),
Q(Q(contact_1=contact) | Q(contact_2=contact) | Q(contact_3=contact)),
)
for subsequent_transaction in subsequent_transactions:
subsequent_transaction.get_schedule().update_with_contact(contact)
subsequent_transaction.save()
propagate_contact(transaction, contact_3)

def save_transaction(self, transaction_data, request):
children = transaction_data.pop("children", [])
Expand Down Expand Up @@ -301,3 +292,13 @@ def get_save_hook(transaction: Transaction):
Schedule.D: schedule_d_save_hook,
}
return hooks.get(schedule_name, noop)


def propagate_contact(transaction, contact):
other_transactions = Transaction.objects.filter(
~Q(id=getattr(transaction, "id", None)),
Q(Q(contact_1=contact) | Q(contact_2=contact) | Q(contact_3=contact)),
)
for other_transaction in other_transactions:
other_transaction.get_schedule().update_with_contact(contact)
other_transaction.save()

0 comments on commit c8c3fd4

Please sign in to comment.