Skip to content

Commit dd8049f

Browse files
authored
Merge pull request #77 from geoadmin/feat-PB-1489-stagings
PB-1489: Skip non-prod datasets in bod_sync
2 parents dc05d69 + 265ff45 commit dd8049f

File tree

4 files changed

+76
-43
lines changed

4 files changed

+76
-43
lines changed

app/bod/management/commands/bod_sync.py

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,7 @@ def import_providers(self) -> None:
7979
processed = set()
8080

8181
for organization in BodContactOrganisation.objects.all():
82-
if organization.attribution is not None and len(
83-
organization.attribution.split('.')
84-
) != 2:
82+
if not organization.attribution or len(organization.attribution.split('.')) != 2:
8583
# Skip entries that are not a provider.
8684
# BodContactOrganisation (table 'contactorganisation') contains providers and
8785
# attributions. Providers are of the format "ch.<short_name>" and only include a
@@ -99,7 +97,7 @@ def import_providers(self) -> None:
9997
is_new_model = True
10098
provider = Provider.objects.create(
10199
_legacy_id=legacy_id,
102-
provider_id=organization.attribution, # type:ignore[misc]
100+
provider_id=organization.attribution,
103101
acronym_de="undefined",
104102
acronym_fr="undefined",
105103
acronym_en="undefined",
@@ -171,8 +169,8 @@ def import_attribution(self) -> None:
171169
processed.add(legacy_id)
172170

173171
# Get related provider
174-
provider: Provider | None
175-
if organization.attribution is not None:
172+
provider = None
173+
if organization.attribution:
176174
provider_of_attribution = ".".join(organization.attribution.split(".", 2)[:2])
177175
provider = Provider.objects.filter(provider_id=provider_of_attribution).first()
178176
if not provider:
@@ -256,7 +254,7 @@ def import_datasets(self) -> None:
256254
"""
257255

258256
processed = set()
259-
for bod_dataset in BodDataset.objects.all():
257+
for bod_dataset in BodDataset.objects.filter(staging='prod').all():
260258
# Keep track of processed BOD datasets for orphan removal
261259
legacy_id = bod_dataset.id
262260
processed.add(legacy_id)
@@ -273,24 +271,15 @@ def import_datasets(self) -> None:
273271
)
274272
continue
275273

276-
# Get related provider
277-
provider = Provider.objects.filter(id=attribution.provider_id).first()
278-
if not provider:
279-
# Skip as no matching provider
280-
self.print(
281-
f"skipping dataset '{bod_dataset.id_dataset}' as no matching provider was found"
282-
)
283-
continue
284-
285274
# Get or create dataset
286275
is_new_model = False
287276
dataset = Dataset.objects.filter(
288-
provider=provider, attribution=attribution, _legacy_id=legacy_id
277+
provider=attribution.provider, attribution=attribution, _legacy_id=legacy_id
289278
).first()
290279
if not dataset:
291280
is_new_model = True
292281
dataset = Dataset.objects.create(
293-
provider=provider,
282+
provider=attribution.provider,
294283
attribution=attribution,
295284
_legacy_id=legacy_id,
296285
dataset_id='undefined'

app/bod/migrations/0001_initial.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.0.9 on 2024-10-03 13:55
1+
# Generated by Django 5.0.12 on 2025-03-11 11:57
22

33
from django.conf import settings
44
from django.db import migrations
@@ -39,6 +39,7 @@ class Migration(migrations.Migration):
3939
('id', models.AutoField(primary_key=True, serialize=False, unique=True)),
4040
('id_dataset', models.TextField()),
4141
('fk_contactorganisation_id', models.IntegerField(blank=True, null=True)),
42+
('staging', models.TextField(blank=True, null=True)),
4243
],
4344
options={
4445
'db_table': 'dataset',

app/bod/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class BodDataset(models.Model):
2828
id = models.AutoField(unique=True, primary_key=True)
2929
id_dataset = models.TextField()
3030
fk_contactorganisation_id = models.IntegerField(blank=True, null=True)
31+
staging = models.TextField(blank=True, null=True)
3132

3233
class Meta:
3334
managed = settings.TESTING

app/tests/bod/test_bod_sync_command.py

Lines changed: 66 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ def fixture_bod_dataset(bod_contact_organisation):
4141
yield BodDataset.objects.create(
4242
id=170,
4343
id_dataset="ch.bafu.auen-vegetationskarten",
44-
fk_contactorganisation_id=bod_contact_organisation.pk_contactorganisation_id
44+
fk_contactorganisation_id=bod_contact_organisation.pk_contactorganisation_id,
45+
staging="prod"
4546
)
4647

4748

@@ -131,17 +132,22 @@ def test_command_imports_providers(bod_dataset):
131132
assert provider.acronym_rm == "UFAM"
132133

133134

134-
def test_command_imports_attributions(bod_contact_organisation, bod_dataset):
135-
out = StringIO()
136-
call_command(
137-
"bod_sync", providers=False, attributions=True, datasets=False, verbosity=2, stdout=out
138-
)
139-
assert "skipping attribution 'ch.bafu' as no matching provider was found" in out.getvalue()
140-
assert 'nothing to be done, already in sync' in out.getvalue()
141-
assert Provider.objects.count() == 0
142-
assert Attribution.objects.count() == 0
143-
assert Dataset.objects.count() == 0
135+
def test_command_skips_invalid_providers(bod_contact_organisation, bod_dataset):
136+
for attribution in ("somethingelse", "", None):
137+
bod_contact_organisation.attribution = attribution
138+
bod_contact_organisation.save()
139+
140+
out = StringIO()
141+
call_command(
142+
"bod_sync", providers=True, attributions=False, datasets=False, verbosity=2, stdout=out
143+
)
144+
assert "nothing to be done" in out.getvalue()
145+
assert Provider.objects.count() == 0
146+
assert Attribution.objects.count() == 0
147+
assert Dataset.objects.count() == 0
144148

149+
150+
def test_command_imports_attributions(bod_contact_organisation, bod_dataset):
145151
provider = Provider.objects.create(
146152
provider_id="ch.bafu",
147153
name_de="XXX",
@@ -152,6 +158,8 @@ def test_command_imports_attributions(bod_contact_organisation, bod_dataset):
152158
acronym_en="XXX",
153159
_legacy_id=bod_contact_organisation.pk_contactorganisation_id
154160
)
161+
162+
out = StringIO()
155163
call_command(
156164
"bod_sync", providers=False, attributions=True, datasets=False, verbosity=2, stdout=out
157165
)
@@ -175,20 +183,24 @@ def test_command_imports_attributions(bod_contact_organisation, bod_dataset):
175183
assert attribution.description_rm == "UFAM"
176184

177185

178-
def test_command_imports_datasets(bod_contact_organisation, bod_dataset):
179-
out = StringIO()
180-
call_command(
181-
"bod_sync", providers=False, attributions=False, datasets=True, verbosity=2, stdout=out
182-
)
183-
assert (
184-
"skipping dataset 'ch.bafu.auen-vegetationskarten' " +
185-
"as no matching attribution was found"
186-
) in out.getvalue()
187-
assert 'nothing to be done, already in sync' in out.getvalue()
188-
assert Provider.objects.count() == 0
189-
assert Attribution.objects.count() == 0
190-
assert Dataset.objects.count() == 0
186+
def test_command_skips_invalid_attributions(bod_contact_organisation, bod_dataset):
187+
for attribution in (bod_contact_organisation.attribution, "", None):
188+
bod_contact_organisation.attribution = attribution
189+
bod_contact_organisation.save()
190+
191+
out = StringIO()
192+
call_command(
193+
"bod_sync", providers=False, attributions=True, datasets=False, verbosity=2, stdout=out
194+
)
195+
assert (f"skipping attribution '{attribution}' as no matching provider was found"
196+
) in out.getvalue()
197+
assert 'nothing to be done, already in sync' in out.getvalue()
198+
assert Provider.objects.count() == 0
199+
assert Attribution.objects.count() == 0
200+
assert Dataset.objects.count() == 0
201+
191202

203+
def test_command_imports_datasets(bod_contact_organisation, bod_dataset):
192204
provider = Provider.objects.create(
193205
provider_id="ch.bafu",
194206
name_de="XXX",
@@ -210,6 +222,8 @@ def test_command_imports_datasets(bod_contact_organisation, bod_dataset):
210222
provider=provider,
211223
_legacy_id=bod_contact_organisation.pk_contactorganisation_id
212224
)
225+
226+
out = StringIO()
213227
call_command(
214228
"bod_sync", providers=False, attributions=False, datasets=True, verbosity=2, stdout=out
215229
)
@@ -224,6 +238,34 @@ def test_command_imports_datasets(bod_contact_organisation, bod_dataset):
224238
assert dataset.dataset_id == "ch.bafu.auen-vegetationskarten"
225239

226240

241+
def test_command_skips_invalid_datasets(bod_dataset):
242+
out = StringIO()
243+
call_command(
244+
"bod_sync", providers=False, attributions=False, datasets=True, verbosity=2, stdout=out
245+
)
246+
assert (
247+
"skipping dataset 'ch.bafu.auen-vegetationskarten' " +
248+
"as no matching attribution was found"
249+
) in out.getvalue()
250+
assert 'nothing to be done, already in sync' in out.getvalue()
251+
assert Provider.objects.count() == 0
252+
assert Attribution.objects.count() == 0
253+
assert Dataset.objects.count() == 0
254+
255+
256+
def test_command_skips_non_prod_datasets(bod_dataset):
257+
bod_dataset.staging = 'test'
258+
259+
out = StringIO()
260+
call_command(
261+
"bod_sync", providers=False, attributions=False, datasets=True, verbosity=2, stdout=out
262+
)
263+
assert 'nothing to be done, already in sync' in out.getvalue()
264+
assert Provider.objects.count() == 0
265+
assert Attribution.objects.count() == 0
266+
assert Dataset.objects.count() == 0
267+
268+
227269
def test_command_updates(bod_contact_organisation, bod_dataset):
228270
# Add objects that will be updated
229271
provider = Provider.objects.create(

0 commit comments

Comments
 (0)