Skip to content

Commit 41251c9

Browse files
committed
feat(eap): Add diff and version tracking for pdf export
- Update logic for the diff and latest eaps
1 parent 0dc85f3 commit 41251c9

4 files changed

Lines changed: 129 additions & 26 deletions

File tree

api/migrations/0229_alter_export_export_type.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,26 @@
44

55

66
class Migration(migrations.Migration):
7-
87
dependencies = [
9-
('api', '0228_alter_export_export_type'),
8+
("api", "0228_alter_export_export_type"),
109
]
1110

1211
operations = [
1312
migrations.AlterField(
14-
model_name='export',
15-
name='export_type',
16-
field=models.CharField(choices=[('dref-applications', 'DREF Application'), ('dref-operational-updates', 'DREF Operational Update'), ('dref-final-reports', 'DREF Final Report'), ('old-dref-final-reports', 'Old DREF Final Report'), ('per', 'Per'), ('simplified', 'Simplified EAP'), ('full', 'Full EAP')], max_length=255, verbose_name='Export Type'),
13+
model_name="export",
14+
name="export_type",
15+
field=models.CharField(
16+
choices=[
17+
("dref-applications", "DREF Application"),
18+
("dref-operational-updates", "DREF Operational Update"),
19+
("dref-final-reports", "DREF Final Report"),
20+
("old-dref-final-reports", "Old DREF Final Report"),
21+
("per", "Per"),
22+
("simplified", "Simplified EAP"),
23+
("full", "Full EAP"),
24+
],
25+
max_length=255,
26+
verbose_name="Export Type",
27+
),
1728
),
1829
]

api/serializers.py

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2559,12 +2559,25 @@ def validate_pdf_file(self, pdf_file):
25592559
validate_file_type(pdf_file)
25602560
return pdf_file
25612561

2562+
def get_latest(self, model: type[SimplifiedEAP | FullEAP], eap_registration_id: int, version: int | None = None):
2563+
"""
2564+
Get the latest version of the EAP (Simplified or Full) based on the eap_registration_id and optional version.
2565+
if version is provided, it fetches that specific version, otherwise it fetches the latest version.
2566+
"""
2567+
filters = {
2568+
"eap_registration__id": eap_registration_id,
2569+
}
2570+
if version:
2571+
filters["version"] = version
2572+
2573+
return model.objects.filter(**filters).order_by("-version").first()
2574+
25622575
def create(self, validated_data):
25632576
language = django_get_language()
25642577
export_id = validated_data.get("export_id")
25652578
export_type = validated_data.get("export_type")
25662579
country_id = validated_data.get("per_country")
2567-
version = validated_data.get("version", None)
2580+
version = validated_data.pop("version", None)
25682581
if export_type == Export.ExportType.DREF:
25692582
title = Dref.objects.filter(id=export_id).first().title
25702583
elif export_type == Export.ExportType.OPS_UPDATE:
@@ -2575,20 +2588,20 @@ def create(self, validated_data):
25752588
overview = Overview.objects.filter(id=export_id).first()
25762589
title = f"{overview.country.name}-preparedness-{overview.get_phase_display()}"
25772590
elif export_type == Export.ExportType.SIMPLIFIED_EAP:
2578-
if version:
2579-
simplified_eap = (
2580-
SimplifiedEAP.objects.filter(eap_registration__id=export_id, version=version).order_by("-version").first()
2581-
)
2582-
else:
2583-
simplified_eap = SimplifiedEAP.objects.filter(eap_registration__id=export_id).order_by("-version").first()
2591+
simplified_eap = self.get_latest(
2592+
model=SimplifiedEAP,
2593+
eap_registration_id=export_id,
2594+
version=version,
2595+
)
25842596
title = (
25852597
f"{simplified_eap.eap_registration.national_society.name}-{simplified_eap.eap_registration.disaster_type.name}"
25862598
)
25872599
elif export_type == Export.ExportType.FULL_EAP:
2588-
if version:
2589-
full_eap = FullEAP.objects.filter(eap_registration__id=export_id, version=version).order_by("-version").first()
2590-
else:
2591-
full_eap = FullEAP.objects.filter(eap_registration__id=export_id).order_by("-version").first()
2600+
full_eap = self.get_latest(
2601+
model=FullEAP,
2602+
eap_registration_id=export_id,
2603+
version=version,
2604+
)
25922605
title = f"{full_eap.eap_registration.national_society.name}-{full_eap.eap_registration.disaster_type.name}"
25932606
else:
25942607
title = "Export"
@@ -2597,17 +2610,17 @@ def create(self, validated_data):
25972610
if export_type == Export.ExportType.PER:
25982611
validated_data["url"] = f"{settings.GO_WEB_INTERNAL_URL}/countries/{country_id}/{export_type}/{export_id}/export/"
25992612

2600-
if export_type in [
2613+
elif export_type in [
26012614
Export.ExportType.SIMPLIFIED_EAP,
26022615
Export.ExportType.FULL_EAP,
26032616
]:
26042617
validated_data["url"] = f"{settings.GO_WEB_INTERNAL_URL}/eap/{export_id}/{export_type}/export/"
26052618
# NOTE: EAP exports with diff view only for EAPs exports
2619+
if version:
2620+
validated_data["url"] += f"?version={version}"
26062621
diff = validated_data.pop("diff")
26072622
if diff:
2608-
validated_data["url"] += "?diff=true"
2609-
if version:
2610-
validated_data["url"] += f"&version={version}" if diff else f"?version={version}"
2623+
validated_data["url"] += "&diff=true" if version else "?diff=true"
26112624

26122625
else:
26132626
validated_data["url"] = f"{settings.GO_WEB_INTERNAL_URL}/{export_type}/{export_id}/export/"

api/tasks.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,6 @@ def generate_url(url, export_id, user, title, language):
122122
file_name = f'SIMPLIFIED EAP {title} ({datetime.now().strftime("%Y-%m-%d %H-%M-%S")}).pdf'
123123
elif export.export_type == Export.ExportType.FULL_EAP:
124124
file_name = f'FULL EAP {title} ({datetime.now().strftime("%Y-%m-%d %H-%M-%S")}).pdf'
125-
elif export.export_type == Export.ExportType.EAP_REGISTRATION:
126-
file_name = f'EAP REGISTRATION {title} ({datetime.now().strftime("%Y-%m-%d %H-%M-%S")}).pdf'
127125
else:
128126
file_name = f'DREF {title} ({datetime.now().strftime("%Y-%m-%d %H-%M-%S")}).pdf'
129127
file = ContentFile(

eap/test_views.py

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,10 +1666,41 @@ def test_simplified_eap_export(self, mock_generate_url):
16661666
django_get_language(),
16671667
)
16681668

1669+
# Test Export Snapshot
1670+
1671+
# create a new snapshot
1672+
simplfied_eap_snapshot = self.simplified_eap.generate_snapshot()
1673+
assert simplfied_eap_snapshot.version == 2, "Snapshot version should be 2"
1674+
1675+
data = {
1676+
"export_type": Export.ExportType.SIMPLIFIED_EAP,
1677+
"export_id": self.eap_registration.id,
1678+
"version": 2,
1679+
}
1680+
1681+
with self.capture_on_commit_callbacks(execute=True):
1682+
response = self.client.post(self.url, data, format="json")
1683+
self.assert_201(response)
1684+
self.assertIsNotNone(response.data["id"], response.data)
1685+
1686+
expected_url = (
1687+
f"{settings.GO_WEB_INTERNAL_URL}/eap/{self.eap_registration.id}/{Export.ExportType.SIMPLIFIED_EAP}/export/?version=2"
1688+
)
1689+
self.assertEqual(response.data["url"], expected_url)
1690+
16691691
@mock.patch("api.serializers.generate_url.delay")
16701692
def test_full_eap_export(self, mock_generate_url):
1671-
self.full_eap = FullEAPFactory.create(
1672-
eap_registration=self.eap_registration,
1693+
eap_registration = EAPRegistrationFactory.create(
1694+
eap_type=EAPType.FULL_EAP,
1695+
country=self.country,
1696+
national_society=self.national_society,
1697+
disaster_type=self.disaster_type,
1698+
created_by=self.user,
1699+
modified_by=self.user,
1700+
)
1701+
1702+
FullEAPFactory.create(
1703+
eap_registration=eap_registration,
16731704
created_by=self.user,
16741705
modified_by=self.user,
16751706
budget_file=EAPFileFactory._create_file(
@@ -1679,7 +1710,7 @@ def test_full_eap_export(self, mock_generate_url):
16791710
)
16801711
data = {
16811712
"export_type": Export.ExportType.FULL_EAP,
1682-
"export_id": self.eap_registration.id,
1713+
"export_id": eap_registration.id,
16831714
"is_pga": False,
16841715
}
16851716

@@ -1689,7 +1720,7 @@ def test_full_eap_export(self, mock_generate_url):
16891720
response = self.client.post(self.url, data, format="json")
16901721
self.assert_201(response)
16911722
self.assertIsNotNone(response.data["id"], response.data)
1692-
expected_url = f"{settings.GO_WEB_INTERNAL_URL}/eap/{self.eap_registration.id}/{Export.ExportType.FULL_EAP}/export/"
1723+
expected_url = f"{settings.GO_WEB_INTERNAL_URL}/eap/{eap_registration.id}/{Export.ExportType.FULL_EAP}/export/"
16931724
self.assertEqual(response.data["url"], expected_url)
16941725
self.assertEqual(response.data["status"], Export.ExportStatus.PENDING)
16951726

@@ -1703,6 +1734,56 @@ def test_full_eap_export(self, mock_generate_url):
17031734
django_get_language(),
17041735
)
17051736

1737+
@mock.patch("api.serializers.generate_url.delay")
1738+
def test_diff_export_eap(self, mock_generate_url):
1739+
eap_registration = EAPRegistrationFactory.create(
1740+
eap_type=EAPType.SIMPLIFIED_EAP,
1741+
country=self.country,
1742+
national_society=self.national_society,
1743+
disaster_type=self.disaster_type,
1744+
created_by=self.user,
1745+
modified_by=self.user,
1746+
)
1747+
1748+
SimplifiedEAPFactory.create(
1749+
eap_registration=eap_registration,
1750+
created_by=self.user,
1751+
modified_by=self.user,
1752+
budget_file=EAPFileFactory._create_file(
1753+
created_by=self.user,
1754+
modified_by=self.user,
1755+
),
1756+
)
1757+
1758+
self.authenticate(self.user)
1759+
data = {
1760+
"export_type": Export.ExportType.SIMPLIFIED_EAP,
1761+
"export_id": eap_registration.id,
1762+
"diff": True,
1763+
}
1764+
1765+
self.authenticate(self.user)
1766+
1767+
with self.capture_on_commit_callbacks(execute=True):
1768+
response = self.client.post(self.url, data, format="json")
1769+
self.assert_201(response)
1770+
self.assertIsNotNone(response.data["id"], response.data)
1771+
1772+
expected_url = (
1773+
f"{settings.GO_WEB_INTERNAL_URL}/eap/{eap_registration.id}/{Export.ExportType.SIMPLIFIED_EAP}/export/?diff=true"
1774+
)
1775+
self.assertEqual(response.data["url"], expected_url)
1776+
1777+
self.assertEqual(mock_generate_url.called, True)
1778+
title = f"{self.national_society.name}-{self.disaster_type.name}"
1779+
mock_generate_url.assert_called_once_with(
1780+
expected_url,
1781+
response.data["id"],
1782+
self.user.id,
1783+
title,
1784+
django_get_language(),
1785+
)
1786+
17061787

17071788
class EAPFullTestCase(APITestCase):
17081789
def setUp(self):

0 commit comments

Comments
 (0)