Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 18 additions & 20 deletions django-backend/fecfiler/committee_accounts/utils/accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,9 @@ def logout_committee_sessions(committee_id):
sessions_to_delete.append(session.pk)

Session.objects.filter(pk__in=sessions_to_delete).delete()
logger.info(
f"""
logger.info(f"""
Successfully logged out {len(sessions_to_delete)} users from {committee_id}
"""
)
""")


def enable_committee_account(committee_id):
Expand Down Expand Up @@ -281,9 +279,9 @@ def augment_processed_committee_data(committee_data: dict):
committee_data.get("committee_type") in PRODUCTION_QUALIFIED_COMMITTEES
)

committee_data[
"eligible_report_types"
] = get_eligible_report_types_processed(committee_data)
committee_data["eligible_report_types"] = get_eligible_report_types_processed(
committee_data
)

add_candidate_office_state_if_needed(committee_data)

Expand All @@ -299,7 +297,7 @@ def add_candidate_office_state_if_needed(committee_data: dict):
}
candidate = query_fec_api_single(
f"{settings.PRODUCTION_OPEN_FEC_API}committee/{committee_id}/candidates/",
params
params,
)
if candidate:
committee_data["candidate_office"] = candidate.get("office", None)
Expand Down Expand Up @@ -363,9 +361,9 @@ def get_raw_committee_data(committee_id):
committee_data["filing_frequency"] = "Q"

committee_data = convert_raw_to_processed(committee_data)
committee_data[
"eligible_report_types"
] = get_eligible_report_types_raw(committee_data)
committee_data["eligible_report_types"] = get_eligible_report_types_raw(
committee_data
)

return committee_data

Expand Down Expand Up @@ -431,9 +429,9 @@ def get_test_committee_data(committee_id):
committee_data["filing_frequency"] = "Q"

committee_data = convert_raw_to_processed(committee_data)
committee_data[
"eligible_report_types"
] = get_eligible_report_types_raw(committee_data)
committee_data["eligible_report_types"] = get_eligible_report_types_raw(
committee_data
)

return committee_data

Expand Down Expand Up @@ -467,13 +465,13 @@ def get_mocked_committee_data(committee_id):

if committee is not None:
if committee.get("counts_as_processed"):
committee[
"eligible_report_types"
] = get_eligible_report_types_processed(committee)
committee["eligible_report_types"] = get_eligible_report_types_processed(
committee
)
else:
committee[
"eligible_report_types"
] = get_eligible_report_types_raw(committee)
committee["eligible_report_types"] = get_eligible_report_types_raw(
committee
)

return committee

Expand Down
70 changes: 38 additions & 32 deletions django-backend/fecfiler/reports/form_3/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.db import transaction
from django.db.transaction import atomic
from fecfiler.settings import FLAG__ENABLE_UNASSIGNED_TRANSACTIONS
from fecfiler.reports.models import Report, ReportTransaction
from fecfiler.reports.form_3.models import Form3
from fecfiler.reports.serializers import (
Expand Down Expand Up @@ -62,45 +63,50 @@ def save(self, **kwargs):
return super().save(**kwargs)

def update(self, instance, validated_data):
prior_coverage_through_date = instance.coverage_through_date
prior_coverage_from_date = instance.coverage_from_date
with atomic():
prior_coverage_through_date = instance.coverage_through_date
prior_coverage_from_date = instance.coverage_from_date

transactions_outside_coverage_dates = ReportTransaction.objects.filter(
~Q(transaction__memo_code=True),
self.get_transaction_date_outside_coverage_dates_clause(),
transaction__deleted=None,
report_id=instance.id,
).count()
transactions_outside_coverage_dates = ReportTransaction.objects.filter(
~Q(transaction__memo_code=True),
self.get_transaction_date_outside_coverage_dates_clause(),
transaction__deleted=None,
report_id=instance.id,
)
if transactions_outside_coverage_dates.exists():
if FLAG__ENABLE_UNASSIGNED_TRANSACTIONS:
transactions_outside_coverage_dates.delete()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice clean and simple

if instance.can_unamend:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good catch!!

instance.can_unamend = False
else:
raise COVERAGE_DATES_EXCLUDE_EXISTING_TRANSACTIONS

if transactions_outside_coverage_dates > 0:
raise COVERAGE_DATES_EXCLUDE_EXISTING_TRANSACTIONS
if self.overlaps_other_f3_report(
instance.id,
instance.committee_account.id,
validated_data,
):
raise COVERAGE_DATE_REPORT_CODE_COLLISION

if self.overlaps_other_f3_report(
instance.id,
instance.committee_account.id,
validated_data,
):
raise COVERAGE_DATE_REPORT_CODE_COLLISION
form = getattr(instance, self.related_form_attr)

form = getattr(instance, self.related_form_attr)
for attr, value in validated_data.items():
if attr != "id":
setattr(form, attr, value)

for attr, value in validated_data.items():
if attr != "id":
setattr(form, attr, value)
form.save()

form.save()
updated = super().update(instance, validated_data)

updated = super().update(instance, validated_data)

coverage_from_changed = prior_coverage_from_date != updated.coverage_from_date
coverage_through_changed = (
prior_coverage_through_date != updated.coverage_through_date
)
coverage_from_changed = prior_coverage_from_date != updated.coverage_from_date
coverage_through_changed = (
prior_coverage_through_date != updated.coverage_through_date
)

if coverage_from_changed or coverage_through_changed:
Report.mark_calculations_dirty(Report.objects.filter(id=updated.id))
if coverage_from_changed or coverage_through_changed:
Report.mark_calculations_dirty(Report.objects.filter(id=updated.id))

return updated
return updated

def get_transaction_date_outside_coverage_dates_clause(self):
"""Returns a clause that checks if the transaction date is outside
Expand Down Expand Up @@ -407,7 +413,7 @@ class Form3Serializer(BaseForm3Serializer):
)

def create(self, validated_data: dict):
with transaction.atomic():
with atomic():
form_3_data = get_model_data(validated_data, Form3)
report_data = get_model_data(validated_data, Report)
form_3 = Form3.objects.create(**form_3_data)
Expand Down
21 changes: 14 additions & 7 deletions django-backend/fecfiler/reports/form_3/tests/test_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@
from ..serializers import (
Form3Serializer,
COVERAGE_DATE_REPORT_CODE_COLLISION,
COVERAGE_DATES_EXCLUDE_EXISTING_TRANSACTIONS,
)

from fecfiler.user.models import User
from fecfiler.reports.models import Report
from fecfiler.reports.models import Report, ReportTransaction
from rest_framework.request import Request, HttpRequest
from fecfiler.reports.tests.utils import create_form3
from fecfiler.transactions.tests.utils import create_schedule_a
Expand Down Expand Up @@ -170,18 +169,19 @@ def test_update_coverage_to_overlapping_dates(self):

def test_update_coverage_to_exclude_transaction(self):
report_a = create_form3(self.committee, "2024-01-01", "2024-03-31")
create_schedule_a(
transaction = create_schedule_a(
"INDIVIDUAL_RECEIPT", self.committee, None, "2024-03-31", 250, report=report_a
)

self.assertEqual(ReportTransaction.objects.filter(report=report_a).count(), 1)

serializer = Form3Serializer(
data=self.valid_f3_report,
context={"request": self.mock_request},
)
serializer.is_valid()
self.assertRaises(
type(COVERAGE_DATES_EXCLUDE_EXISTING_TRANSACTIONS),
serializer.update,
self.assertTrue(serializer.is_valid())

serializer.update(
report_a,
{
"coverage_from_date": datetime.strptime("2024-01-01", "%Y-%m-%d").date(),
Expand All @@ -191,6 +191,13 @@ def test_update_coverage_to_exclude_transaction(self):
},
)

self.assertFalse(
ReportTransaction.objects.filter(
report=report_a, transaction=transaction
).exists()
)
self.assertEqual(ReportTransaction.objects.filter(report=report_a).count(), 0)

def test_update_coverage_to_exclude_memo_transaction(self):
report_a = create_form3(self.committee, "2024-01-01", "2024-03-31")
create_schedule_a(
Expand Down
4 changes: 4 additions & 0 deletions django-backend/fecfiler/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,10 @@ def get_logging_processors():
env.get_credential("FLAG__ENABLE_EMAIL", "False")
)

FLAG__ENABLE_UNASSIGNED_TRANSACTIONS = get_boolean_from_string(
env.get_credential("FLAG__ENABLE_UNASSIGNED_TRANSACTIONS", "False")
)

PRODUCTION_OPEN_FEC_API = env.get_credential("PRODUCTION_OPEN_FEC_API")
PRODUCTION_OPEN_FEC_API_KEY = env.get_credential("PRODUCTION_OPEN_FEC_API_KEY")

Expand Down
Loading