Skip to content

Commit fab8065

Browse files
authored
Merge pull request #1661 from opengisch/default_value_data_loss_fix
Fix data loss scenario when applying a feature addition delta on a layer with attributes having valid default values set to apply on update
2 parents 61a78e4 + 3c5f5dd commit fab8065

5 files changed

Lines changed: 875 additions & 12 deletions

File tree

docker-app/qfieldcloud/core/tests/test_delta.py

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ def setUp(self):
7474
)
7575
self.project1.save()
7676

77+
self.project3 = Project.objects.create(
78+
name="project3",
79+
is_public=False,
80+
owner=self.org1,
81+
)
82+
self.project3.save()
83+
7784
OrganizationMember.objects.create(
7885
organization=self.org1,
7986
member=self.user2,
@@ -170,6 +177,57 @@ def upload_project_files(self, project) -> Project:
170177

171178
raise Exception("Projectfile never set on project")
172179

180+
def upload_project3_files(self, project) -> Project:
181+
for project_file in [
182+
"testdata.gpkg",
183+
"project3.qgs",
184+
]:
185+
file_path = testdata_path(f"delta/{project_file}")
186+
response = self.client.post(
187+
f"/api/v1/files/{project.id}/{project_file}/",
188+
{"file": open(file_path, "rb")},
189+
format="multipart",
190+
)
191+
self.assertTrue(
192+
status.is_success(response.status_code),
193+
f"Failed to upload file '{project_file}'",
194+
)
195+
196+
# wait until the project file check are ready
197+
for i in range(30):
198+
updated_project = Project.objects.get(id=project.id)
199+
if updated_project.has_the_qgis_file:
200+
return updated_project
201+
202+
time.sleep(1)
203+
204+
raise Exception("Projectfile never set on project")
205+
206+
def test_push_apply_delta_file_add_feature_default_value(self):
207+
self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token1.key)
208+
209+
project = self.upload_project3_files(self.project3)
210+
211+
self.upload_and_check_deltas(
212+
project=project,
213+
delta_filename="singlelayer_singledelta_add_feature_default_value.json",
214+
token=self.token1.key,
215+
final_values=[
216+
[
217+
"c8c421cd-e39c-40a0-97d8-a319c245ba14",
218+
"STATUS_APPLIED",
219+
self.user1.username,
220+
]
221+
],
222+
)
223+
224+
gdf = self.read_gpkg_layer(project, "testdata.gpkg", "polygons")
225+
226+
f = gdf.iloc[2]
227+
self.assertEqual(1, f["int"])
228+
self.assertEqual(1.0, f["dbl"])
229+
self.assertEqual("correct!", f["str"])
230+
173231
def test_push_apply_delta_file(self):
174232
self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token1.key)
175233
project = self.upload_project_files(self.project1)
@@ -1273,7 +1331,7 @@ def check_deltas_by_file_id(
12731331
self.assertEqual(payload[idx]["created_by"], created_by)
12741332

12751333
job = Job.objects.filter(
1276-
project=self.project1,
1334+
project=project,
12771335
type=Job.Type.DELTA_APPLY,
12781336
).latest("updated_at")
12791337

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"deltas": [
3+
{
4+
"uuid": "c8c421cd-e39c-40a0-97d8-a319c245ba14",
5+
"clientId": "cd517e24-a520-4021-8850-e5af70e3a612",
6+
"exportId": "f70c7286-fcec-4dbe-85b5-63d4735dac47",
7+
"localPk": "1",
8+
"sourcePk": "1",
9+
"localLayerId": "polygons_e12da475_70fc_439d_b679_71afabb3ebef",
10+
"sourceLayerId": "polygons_e12da475_70fc_439d_b679_71afabb3ebef",
11+
"method": "create",
12+
"new": {
13+
"geometry": "POLYGON((1 1, 2 1, 2 2, 1 2, 1 1))'",
14+
"attributes": {
15+
"dbl": 1.0,
16+
"int": 1,
17+
"str": "correct!"
18+
}
19+
}
20+
}
21+
],
22+
"files": [],
23+
"id": "469e13a0-5a97-40cd-b39d-fa0368339caa",
24+
"project": "e02d02cc-af1b-414c-a14c-e2ed5dfee52f",
25+
"version": "1.0"
26+
}

0 commit comments

Comments
 (0)