Skip to content

Commit 9fbf7d2

Browse files
Merge pull request #2069 from betagouv/feat/2059-duplicate-ds-matching
La duplication de ressource fait suivre le lien avec DS
2 parents 796d7a6 + 56700e6 commit 9fbf7d2

2 files changed

Lines changed: 82 additions & 3 deletions

File tree

recoco/apps/resources/tests/test_views.py

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from reversion.models import Version
2424

2525
from recoco.apps.addressbook.models import Contact
26-
from recoco.apps.demarches_simplifiees.models import DSResource
26+
from recoco.apps.demarches_simplifiees import models as ds_models
2727
from recoco.apps.geomatics import models as geomatics
2828
from recoco.apps.hitcount.models import Hit, HitCount
2929
from recoco.apps.projects import models as projects_models
@@ -364,6 +364,69 @@ def test_duplication_creates_new_resource(request, client, current_site):
364364
assert list(new_resource.sites.all()) == [current_site]
365365

366366

367+
@pytest.mark.django_db
368+
def test_duplication_creates_new_ds_resource_mapping(request, client, current_site):
369+
old_resource = Recipe(
370+
models.Resource,
371+
status=models.Resource.PUBLISHED,
372+
sites=[current_site],
373+
title="A Nice title",
374+
created_by=baker.make(User),
375+
category=baker.make(resources_models.Category),
376+
).make()
377+
dep = Recipe(geomatics.Department).make()
378+
ds_resource = Recipe(
379+
ds_models.DSResource,
380+
name="initial_name",
381+
schema='{"field": "this is a json"}',
382+
resource=old_resource,
383+
).make()
384+
ds_resource.departments.set([dep])
385+
ds_mapping = Recipe(
386+
ds_models.DSMapping,
387+
ds_resource=ds_resource,
388+
site=current_site,
389+
mapping='{"other": "json file"}',
390+
).make()
391+
url = reverse("resources-resource-duplicate", args=[old_resource.id])
392+
393+
with login(client, groups=["example_com_advisor"]):
394+
response = client.post(url, follow=True)
395+
assert response.status_code == 200
396+
last_url, status_code = response.redirect_chain[-1]
397+
assert status_code == 302
398+
399+
assert models.Resource.objects.count() == 2
400+
401+
new_resource = models.Resource.objects.exclude(id=old_resource.id).first()
402+
403+
assert (
404+
last_url
405+
== f"{reverse('resources-resource-update', args=[new_resource.id])}?is_duplicate=true"
406+
)
407+
408+
assert ds_models.DSResource.objects.filter(resource=new_resource).count() == 1
409+
new_ds_resource = ds_models.DSResource.objects.filter(
410+
resource=new_resource
411+
).first()
412+
assert new_ds_resource is not None
413+
assert new_ds_resource.schema == ds_resource.schema
414+
assert ds_resource.name in new_ds_resource.name
415+
assert set(new_ds_resource.departments.all()) == set(
416+
ds_resource.departments.all()
417+
)
418+
419+
assert (
420+
ds_models.DSMapping.objects.filter(ds_resource=new_ds_resource).count() == 1
421+
)
422+
new_mapping = ds_models.DSMapping.objects.filter(
423+
ds_resource=new_ds_resource
424+
).first()
425+
assert new_mapping.mapping == ds_mapping.mapping
426+
assert new_mapping.site == ds_mapping.site
427+
assert new_mapping.ds_resource == new_ds_resource
428+
429+
367430
@pytest.mark.django_db
368431
def test_duplication_needs_permission(request, client, current_site):
369432
old_resource = Recipe(
@@ -476,7 +539,7 @@ def test_resource_detail_ds_prefill_button(request, client):
476539
status=models.Resource.PUBLISHED,
477540
).make()
478541
Recipe(
479-
DSResource,
542+
ds_models.DSResource,
480543
resource=resource,
481544
schema={"number": 42},
482545
).make()
@@ -1173,7 +1236,7 @@ def test_embedded_resource_detail_ds_prefill_button(request, client):
11731236
status=models.Resource.PUBLISHED,
11741237
).make()
11751238
Recipe(
1176-
DSResource,
1239+
ds_models.DSResource,
11771240
resource=resource,
11781241
schema={"number": 42},
11791242
).make()

recoco/apps/resources/views.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from reversion_compare.views import HistoryCompareDetailView
3838

3939
from recoco.apps.addressbook import models as addressbook_models
40+
from recoco.apps.demarches_simplifiees.models import DSMapping, DSResource
4041
from recoco.apps.geomatics import models as geomatics_models
4142
from recoco.apps.hitcount.models import HitCount
4243
from recoco.apps.projects import models as projects
@@ -306,6 +307,21 @@ def post(self, request, *args, **kwargs):
306307
new_resource.sites.set([current_site])
307308
new_resource.tags.set(resource_to_copy.tags.all())
308309

310+
for old_ds_resource in resource_to_copy.dsresource_set.all():
311+
new_ds_resource = DSResource.objects.create(
312+
name=old_ds_resource.name + str(timezone.now()),
313+
schema=old_ds_resource.schema,
314+
resource=new_resource,
315+
)
316+
new_ds_resource.departments.set(old_ds_resource.departments.all())
317+
for old_mapping in old_ds_resource.ds_mappings.all():
318+
DSMapping.objects.create(
319+
ds_resource=new_ds_resource,
320+
site=old_mapping.site,
321+
enabled=old_mapping.enabled,
322+
mapping=old_mapping.mapping,
323+
)
324+
309325
url = reverse("resources-resource-update", args=[new_resource.id])
310326
return redirect(f"{url}?is_duplicate=true")
311327

0 commit comments

Comments
 (0)