Skip to content

Commit b82d9e3

Browse files
authored
Merge pull request #799 from etchegom/refactor/isdsresource
[refactor] DS resource annotations
2 parents 7a3b6b7 + 77e906d commit b82d9e3

9 files changed

Lines changed: 51 additions & 22 deletions

File tree

recoco/apps/projects/static/projects/js/action_pusher.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function action_pusher_app() {
55

66
db: new MiniSearch({
77
fields: ['title', 'subtitle', 'tags'], // fields to index for full-text search
8-
storeFields: ['title', 'subtitle', 'url', 'url_embeded', 'is_dsresource'], //
8+
storeFields: ['title', 'subtitle', 'url', 'url_embeded', 'has_dsresource'], //
99
}),
1010

1111
push_type: 'single',
@@ -120,7 +120,7 @@ function action_pusher_app() {
120120
tags: t.tags,
121121
url: t.web_url,
122122
url_embeded: t.embeded_url,
123-
is_dsresource: t.is_dsresource,
123+
has_dsresource: t.has_dsresource,
124124
category: t.category,
125125
};
126126

recoco/apps/projects/templates/projects/project/fragments/action_pusher/resource_search.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ <h5 class="modal-title">Prévisualisation de la ressource</h5>
8585
x-text="resource.category.name"></span>
8686
</li>
8787
</template>
88-
<li x-show="resource.is_dsresource">
88+
<li x-show="resource.has_dsresource">
8989
<span class="fr-badge fr-badge--sm text-transform-none">
9090
<img height="8px"
9191
width="18px"

recoco/apps/resources/models.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from django.contrib.sites.managers import CurrentSiteManager
1616
from django.contrib.sites.models import Site
1717
from django.db import models
18+
from django.db.models import BooleanField, Case, Count, When
1819
from django.db.models.functions import Lower
1920
from django.db.models.signals import post_migrate
2021
from django.dispatch import receiver
@@ -117,6 +118,15 @@ def limit_area(self, departments):
117118
models.Q(departments__in=departments) | models.Q(departments=None)
118119
).distinct()
119120

121+
def with_ds_annotations(self):
122+
return self.annotate(count_dsresource=Count("dsresource")).annotate(
123+
has_dsresource=Case(
124+
When(count_dsresource__gt=0, then=True),
125+
default=False,
126+
output_field=BooleanField(),
127+
)
128+
)
129+
120130

121131
class ResourceManager(models.Manager):
122132
def get_queryset(self):
@@ -177,10 +187,6 @@ class Resource(CloneMixin, models.Model):
177187
def public(self):
178188
return self.status >= self.TO_REVIEW
179189

180-
@property
181-
def is_dsresource(self):
182-
return self.dsresource_set.exists()
183-
184190
created_on = models.DateTimeField(
185191
default=timezone.now, verbose_name="date de création"
186192
)

recoco/apps/resources/rest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def get_queryset(self):
3232
qs = models.Resource.on_site
3333
if not has_perm(self.request.user, "sites.manage_resources", self.request.site):
3434
qs = qs.filter(status__gt=models.Resource.TO_REVIEW)
35+
qs = qs.with_ds_annotations().select_related("created_by", "category")
3536
return qs.order_by("-created_on", "-updated_on")
3637

3738
serializer_class = ResourceSerializer

recoco/apps/resources/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,18 @@ class Meta:
3939
"updated_on",
4040
"web_url",
4141
"embeded_url",
42-
"is_dsresource",
42+
"has_dsresource",
4343
"category",
4444
]
4545
read_only_fields = [
4646
"created_on",
4747
"updated_on",
4848
"created_by",
49-
"is_dsresource",
5049
]
5150

5251
web_url = serializers.URLField(source="get_absolute_url", read_only=True)
5352
embeded_url = serializers.URLField(source="get_embeded_url", read_only=True)
5453
tags = TagListSerializerField()
5554
created_by = ResourceCreatorSerializer(read_only=True, many=False)
5655
category = CategorySerializer(read_only=True)
56+
has_dsresource = serializers.BooleanField(read_only=True, default=False)

recoco/apps/resources/templates/resources/resource/details.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
</div>
144144
{% endif %}
145145
<!-- Demarches Simplifiées callout integration -->
146-
{% if resource.is_dsresource %}
146+
{% if resource.has_dsresource %}
147147
<div class="fr-callout fr-my-4w fr-pb-3w fr-pr-3w fr-pt-2w fr-pl-5v ">
148148
<img height="31px"
149149
width="32px"
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
11
import pytest
22
from model_bakery import baker
33

4+
from recoco.apps.resources.models import Resource
5+
46

57
@pytest.mark.django_db
6-
def test_is_dsresource():
7-
resource = baker.make("resources.Resource")
8-
assert resource.is_dsresource is False
8+
def test_with_ds_annotations():
9+
baker.make("resources.Resource")
10+
assert Resource.objects.count() == 1
11+
12+
resource = Resource.objects.with_ds_annotations().first()
13+
assert resource.count_dsresource == 0
14+
assert resource.has_dsresource is False
15+
916
baker.make("demarches_simplifiees.DSResource", resource=resource)
10-
assert resource.is_dsresource is True
17+
18+
resource = Resource.objects.with_ds_annotations().first()
19+
assert resource.count_dsresource == 1
20+
assert resource.has_dsresource is True

recoco/apps/resources/views.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from django.contrib.syndication.views import Feed
2323
from django.db import transaction
2424
from django.db.models import Q
25+
from django.db.models.query import QuerySet
2526
from django.http import HttpResponseRedirect
2627
from django.shortcuts import get_object_or_404, redirect, render
2728
from django.template import TemplateDoesNotExist
@@ -242,6 +243,9 @@ def get_context_data(self, **kwargs):
242243

243244
return context
244245

246+
def get_queryset(self) -> QuerySet[models.Resource]:
247+
return super().get_queryset().with_ds_annotations()
248+
245249

246250
class EmbededResourceDetailView(BaseResourceDetailView):
247251
model = models.Resource

recoco/apps/tasks/forms.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -114,17 +114,21 @@ class CreateActionWithResourceForm(CreateActionBaseForm):
114114
forms.ModelChoiceField(
115115
queryset=resources_models.Resource.objects.exclude(
116116
status=resources_models.Resource.DRAFT
117-
)
117+
).with_ds_annotations()
118118
),
119119
)
120120

121121
def clean_resource(self):
122122
resource = self.cleaned_data["resource"]
123123

124124
try:
125-
resource = resources_models.Resource.on_site.exclude(
126-
status=resources_models.Resource.DRAFT
127-
).get(pk=resource.pk)
125+
resource = (
126+
resources_models.Resource.on_site.exclude(
127+
status=resources_models.Resource.DRAFT
128+
)
129+
.with_ds_annotations()
130+
.get(pk=resource.pk)
131+
)
128132
except resources_models.Resource.DoesNotExist:
129133
self.add_error("resource_unknown", "Cette ressource n'existe pas")
130134
raise
@@ -140,16 +144,20 @@ class CreateActionsFromResourcesForm(CreateActionBaseForm):
140144
resources = forms.ModelMultipleChoiceField(
141145
queryset=resources_models.Resource.objects.exclude(
142146
status=resources_models.Resource.DRAFT
143-
),
147+
).with_ds_annotations(),
144148
required=True,
145149
)
146150

147151
def clean_resources(self):
148152
resources = self.cleaned_data["resources"]
149153

150-
resources = resources_models.Resource.on_site.exclude(
151-
status=resources_models.Resource.DRAFT
152-
).filter(pk__in=[resource.pk for resource in resources.all()])
154+
resources = (
155+
resources_models.Resource.on_site.exclude(
156+
status=resources_models.Resource.DRAFT
157+
)
158+
.with_ds_annotations()
159+
.filter(pk__in=[resource.pk for resource in resources.all()])
160+
)
153161

154162
if resources.count() == 0:
155163
self.add_error("no_valid_resource", "Aucune ressource")

0 commit comments

Comments
 (0)