Skip to content

Commit c238dea

Browse files
Merge pull request #701 from akvo/feature/700-import-7-check-final-data-generation-and-mapping
Feature/700 import 7 check final data generation and mapping
2 parents 73f9e1d + b35c5f4 commit c238dea

19 files changed

+682
-64
lines changed

backend/assets/tests/empty.txt

Whitespace-only changes.

backend/assets/tests/invalid.xlsm

88.1 KB
Binary file not shown.
116 KB
Binary file not shown.

backend/assets/tests/valid.xlsm

116 KB
Binary file not shown.

backend/db/crud_case.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from sqlalchemy.orm import Session
2-
from sqlalchemy import and_, cast
2+
from sqlalchemy import and_, cast, or_
33
from sqlalchemy.dialects.postgresql import TEXT
44
from typing import Optional, List
55
from typing_extensions import TypedDict
@@ -265,9 +265,15 @@ def update_case(session: Session, id: int, payload: CaseBase) -> CaseDict:
265265
prev_segment = (
266266
session.query(Segment)
267267
.filter(
268-
and_(
269-
Segment.case == case.id,
270-
Segment.id == segment.id,
268+
or_(
269+
and_(
270+
Segment.case == case.id,
271+
Segment.id == segment.id,
272+
),
273+
and_(
274+
Segment.case == case.id,
275+
Segment.name == segment.name,
276+
),
271277
)
272278
)
273279
.first()

backend/models/case.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ class CaseDetailDict(TypedDict):
116116
status: int
117117
tags: Optional[List[int]] = []
118118
company: Optional[int] = None
119+
import_id: Optional[str] = None
119120

120121

121122
class Case(Base):
@@ -199,6 +200,12 @@ class Case(Base):
199200
passive_deletes=True,
200201
backref="company_cases",
201202
)
203+
case_imports = relationship(
204+
"CaseImport",
205+
cascade="all, delete",
206+
passive_deletes=True,
207+
backref="case_detail",
208+
)
202209

203210
def __init__(
204211
self,
@@ -343,6 +350,15 @@ def to_case_list(self) -> CaseListDict:
343350

344351
@property
345352
def to_case_detail(self) -> CaseDetailDict:
353+
# Get the most recent import_id if exists
354+
import_id = None
355+
if self.case_imports:
356+
# Sort by created_at and get the most recent one
357+
most_recent_import = max(
358+
self.case_imports, key=lambda x: x.created_at
359+
)
360+
import_id = str(most_recent_import.id)
361+
346362
return {
347363
"id": self.id,
348364
"name": self.name,
@@ -374,6 +390,7 @@ def to_case_detail(self) -> CaseDetailDict:
374390
"tags": [ct.tag for ct in self.case_tags],
375391
"company": self.company,
376392
"status": self.status,
393+
"import_id": import_id,
377394
}
378395

379396
@property

backend/routes/case_import.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"/case-import",
5555
response_model=CaseImportResponse,
5656
summary="Upload case spreadsheet file",
57+
name="case_import:upload_file",
5758
tags=ROUTE_TAG_NAME,
5859
)
5960
def case_import(
@@ -128,6 +129,7 @@ def case_import(
128129
"/case-import/segmentation-preview",
129130
response_model=SegmentationPreviewResponse,
130131
summary="Generate prefilled segmentation splits",
132+
name="case_import:segmentation_preview",
131133
tags=ROUTE_TAG_NAME,
132134
)
133135
def segmentation_preview(
@@ -187,6 +189,7 @@ def segmentation_preview(
187189
@case_import_route.post(
188190
"/case-import/generate-segment-values",
189191
summary="Generate segment values for case commodities",
192+
name="case_import:generate_segment_values",
190193
tags=ROUTE_TAG_NAME,
191194
)
192195
def generate_segment_values(

backend/tests/test_020_case.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ async def test_update_case(
403403
"segments": [],
404404
"tags": [1],
405405
"company": None,
406+
"import_id": None,
406407
}
407408

408409
@pytest.mark.asyncio
@@ -482,4 +483,5 @@ async def test_get_case_by_id_without_segments(
482483
"private": False,
483484
"tags": [1],
484485
"company": None,
486+
"import_id": None,
485487
}

backend/tests/test_051_segment_answer_continued.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ async def test_get_case_by_id_with_segments(
225225
"private": False,
226226
"tags": [2, 1],
227227
"company": None,
228+
"import_id": None,
228229
}
229230

230231
@pytest.mark.asyncio

backend/tests/test_1001_case_with_segments.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ async def test_update_case_with_segment(
281281
"private": False,
282282
"tags": [1],
283283
"company": 1,
284+
"import_id": None,
284285
}
285286

286287
@pytest.mark.asyncio

0 commit comments

Comments
 (0)